From 514e6af7a6a1791e0e6e32b0c7ccb2da9127c026 Mon Sep 17 00:00:00 2001 From: FaolanMalcadh Date: Thu, 25 Jun 2020 20:50:16 +0000 Subject: [PATCH 01/31] Translate categories_pt-BR.yml via GitLocalize --- src/main/resources/languages/categories_pt-BR.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/languages/categories_pt-BR.yml b/src/main/resources/languages/categories_pt-BR.yml index c974e0b87..c50ef575a 100644 --- a/src/main/resources/languages/categories_pt-BR.yml +++ b/src/main/resources/languages/categories_pt-BR.yml @@ -23,3 +23,4 @@ slimefun: easter: Páscoa (abril) birthday: Aniversário do TheBusyBiscuit (26 de outubro) halloween: Halloween (31 de outubro) + androids: Robôs e programação From 2cc97398d004193952c69662229deff49d85fa2c Mon Sep 17 00:00:00 2001 From: krazybeat Date: Thu, 25 Jun 2020 20:50:17 +0000 Subject: [PATCH 02/31] Translate researches_pt-BR.yml via GitLocalize --- .../resources/languages/researches_pt-BR.yml | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/resources/languages/researches_pt-BR.yml b/src/main/resources/languages/researches_pt-BR.yml index 3d9018b80..1333f704b 100644 --- a/src/main/resources/languages/researches_pt-BR.yml +++ b/src/main/resources/languages/researches_pt-BR.yml @@ -124,11 +124,14 @@ slimefun: block_placer: Colocador de Blocos scroll_of_dimensional_teleposition: Mudando as Coisas special_bows: Robin Hood + tome_of_knowledge_sharing: Compartilhando com amigos flask_of_knowledge: Armazenamento de XP hardened_glass: Suportar Explosões golden_apple_juice: Poção Dourada cooler: Bebidas Portáteis + ancient_altar: Altar Ancião wither_proof_obsidian: Obsidiana à Prova de Wither + ancient_runes: Runas Elementais special_runes: Runas Roxas infernal_bonemeal: Farinha de Osso Infernal rainbow_blocks: Blocos Coloridos @@ -166,12 +169,14 @@ slimefun: energized_gps_transmitter: Transmissor de Nível Superior energy_regulator: Redes de Energia 101 butcher_androids: Androids Açougueiro + organic_food: Comida Orgânica auto_breeder: Alimentação Automatizada advanced_android: Androids Avançados advanced_butcher_android: Androids Avançados - Açougueiro advanced_fisherman_android: Androids Avançados - Pescador animal_growth_accelerator: Manipulação do Crescimento Animal xp_collector: Coletor de XP + organic_fertilizer: Fertilizante Orgânico crop_growth_accelerator: Acelerador de Crescimento de Sementes better_crop_growth_accelerator: Acelerador de Crescimento de Sementes Atualizado reactor_essentials: Fundamentos do Reator @@ -181,6 +186,7 @@ slimefun: cargo_nodes: Configuração de Carga electric_ingot_machines: Fabricação de Barras Elétricas high_tier_electric_ingot_machines: Fabricação de Barras Super Rápida + automated_crafting_chamber: Criação Automatizada better_food_fabricator: Fabricação de Alimentos Atualizada reactor_access_port: Interação do Reator fluid_pump: Bomba de Fluido @@ -224,9 +230,9 @@ slimefun: electric_press: Prensa Elétrica magnesium_generator: Gerador de Magnésio kelp_cookie: Alga Marinha Saborosa - tome_of_knowledge_sharing: Compartilhando com amigos - ancient_altar: Altar Ancião - ancient_runes: Runas Elementais - organic_food: Comida Orgânica - organic_fertilizer: Fertilizante Orgânico - automated_crafting_chamber: Criação Automatizada + makeshift_smeltery: Fundição Improvisada + tree_growth_accelerator: Árvores mais rápidas + industrial_miner: Mineração Industrial + advanced_industrial_miner: Melhor mineração + magical_zombie_pills: Deszombificação + auto_brewer: Cervejaria Industrial From def404378d5a5d00bf9334e428c8f5e8b48b04a3 Mon Sep 17 00:00:00 2001 From: FaolanMalcadh Date: Thu, 25 Jun 2020 20:50:18 +0000 Subject: [PATCH 03/31] Translate researches_pt-BR.yml via GitLocalize From 1520e71107a3835ef01f3ffb4ebcfd6a2fd0880c Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Thu, 25 Jun 2020 22:51:56 +0200 Subject: [PATCH 04/31] Updated translators --- .../slimefun4/core/services/localization/Translators.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/localization/Translators.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/localization/Translators.java index e9afa3edb..c508ad619 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/localization/Translators.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/localization/Translators.java @@ -154,6 +154,8 @@ public class Translators { addTranslator("G4stavoM1ster", SupportedLanguage.PORTUGUESE_BRAZIL, true); addTranslator("yurinogueira", SupportedLanguage.PORTUGUESE_BRAZIL, true); addTranslator("Sakanas", SupportedLanguage.PORTUGUESE_BRAZIL, true); + addTranslator("krazybeat", SupportedLanguage.PORTUGUESE_BRAZIL, true); + addTranslator("FaolanMalcadh", SupportedLanguage.PORTUGUESE_BRAZIL, true); } private void addTranslator(String name, SupportedLanguage lang, boolean lock) { From 526c2e5228d72cb5732244c4bf0628916ced833c Mon Sep 17 00:00:00 2001 From: Scott Gomez Andoy Date: Thu, 25 Jun 2020 23:36:17 +0000 Subject: [PATCH 05/31] Translate recipes_tl.yml via GitLocalize --- src/main/resources/languages/recipes_tl.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/resources/languages/recipes_tl.yml b/src/main/resources/languages/recipes_tl.yml index 77fc3aa2f..4ca058aef 100644 --- a/src/main/resources/languages/recipes_tl.yml +++ b/src/main/resources/languages/recipes_tl.yml @@ -156,3 +156,8 @@ minecraft: lore: - I-craft ang item na ito tulad ng ipinakita - gamit ang Stonecutter. + smithing: + name: Smithing Table Recipe + lore: + - I-craft ang item na ito tulad ng ipinakita + - gamit ang Smithing Table. From 682dcf118938f0859f660373d3b586d188744579 Mon Sep 17 00:00:00 2001 From: Nameless Date: Fri, 26 Jun 2020 04:57:58 +0000 Subject: [PATCH 06/31] Translate recipes_zh-CN.yml via GitLocalize --- .../resources/languages/recipes_zh-CN.yml | 253 +++++++++--------- 1 file changed, 129 insertions(+), 124 deletions(-) diff --git a/src/main/resources/languages/recipes_zh-CN.yml b/src/main/resources/languages/recipes_zh-CN.yml index 10722e330..c996980ec 100644 --- a/src/main/resources/languages/recipes_zh-CN.yml +++ b/src/main/resources/languages/recipes_zh-CN.yml @@ -1,145 +1,107 @@ --- -minecraft: - blasting: - lore: - - 在高炉中燃烧 - - 以合成你想要的物品 - name: 高炉合成表 - campfire: - lore: - - 在营火上燃烧 - - 以合成你想要的物品 - name: 营火合成表 - furnace: - lore: - - 在熔炉中燃烧 - - 以合成你想要的物品 - name: 熔炉合成表 - shaped: - lore: - - 如合成表所示 - - 在普通的工作台中合成 - - 摆放顺序很重要. - name: 有序合成 - shapeless: - lore: - - 如合成表所示 - - 在普通的工作台中合成. - - 摆放顺序不重要. - name: 无序合成 - smoking: - lore: - - 在烟熏炉中燃烧 - - 以合成你想要的物品 - name: 烟熏炉合成表 - stonecutting: - lore: - - 如合成表所示 - - 使用切石机合成 - name: 切石机合成表 slimefun: - ancient_altar: + multiblock: + name: 多方块结构 lore: - - 如合成表所示 - - 使用古代祭坛合成 - - 查看古代祭坛页面获得更多信息 - name: 古代祭坛 (Ancient Altar) - armor_forge: - lore: - - 如合成表所示 - - 用盔甲锻造台合成 - name: 盔甲锻造台 (Armor Forge) - compressor: - lore: - - 如合成表所示 - - 在压缩机中合成 - name: 压缩机 (Compressor) + - 按照展示的结构用方块建造. + - 它不能被合成. enhanced_crafting_table: + name: 增强型工作台 (Enhanced Crafting Table) lore: - 如合成表所示 - 在增强型工作台中合成. - 一个普通的工作台远远不够! - name: 增强型工作台 (Enhanced Crafting Table) - food_composter: + armor_forge: + name: 盔甲锻造台 (Armor Forge) lore: - 如合成表所示 - - 在食品堆肥器中制作 - name: 食品堆肥器 (Food Composter) - food_fabricator: - lore: - - 如合成表所示合成 - - 使用食品加工机 - name: 食品加工机 (Food Fabricator) - freezer: - lore: - - 如合成表所示 - - 在冰箱中合成 - name: 冰箱 (Freezer) - geo_miner: - lore: - - 这个物品可以用 - - GEO 矿机采集 - name: GEO 矿机 (GEO Miner) - gold_pan: - lore: - - 使用淘金盘 - - 获得此物品 - name: 淘金盘 (Gold Pan) + - 用盔甲锻造台合成 grind_stone: + name: 磨石 (Grind Stone) lore: - 如合成表所示 - 使用磨石制作 - name: 磨石 (Grind Stone) - heated_pressure_chamber: - lore: - - 如合成表所示 - - 用加热压力舱合成 - name: 加热压力舱 (Heated Pressure Chamber) - juicer: - lore: - - 如合成表所示 - - 在榨汁机中制作果汁 - name: 榨汁机 (Juicer) - magic_workbench: - lore: - - 如合成表所示 - - 在魔法工作台中合成 - name: 魔法工作台 (Magic Workbench) - mob_drop: - lore: - - 击杀指定的生物 - - 以获得该物品 - name: 击杀生物掉落 - multiblock: - lore: - - 按照展示的结构用方块建造. - - 它不能被合成. - name: 多方块结构 - nuclear_reactor: - lore: - - 这个物品是核反应堆 - - 运行时产生的副产物 - name: 核反应堆 (Nuclear Reactor) - ore_crusher: - lore: - - 如合成表所示 - - 在碎矿机中合成 - name: 矿石粉碎机 (Ore Crusher) - ore_washer: - lore: - - 如合成表所示 - - 在洗矿机中合成 - name: 洗矿机 (Ore Washer) - pressure_chamber: - lore: - - 如合成表所示 - - 在压力舱中合成 - name: 压力舱 (Pressure Chamber) smeltery: + name: 冶炼机 (Smeltery) lore: - 如合成表所示 - 用冶炼机合成 - name: 冶炼机 (Smeltery) + ore_crusher: + name: 矿石粉碎机 (Ore Crusher) + lore: + - 如合成表所示 + - 在碎矿机中合成 + mob_drop: + name: 击杀生物掉落 + lore: + - 击杀指定的生物 + - 以获得该物品 + gold_pan: + name: 淘金盘 (Gold Pan) + lore: + - 使用淘金盘 + - 获得此物品 + compressor: + name: 压缩机 (Compressor) + lore: + - 如合成表所示 + - 在压缩机中合成 + pressure_chamber: + name: 压力舱 (Pressure Chamber) + lore: + - 如合成表所示 + - 在压力舱中合成 + ore_washer: + name: 洗矿机 (Ore Washer) + lore: + - 如合成表所示 + - 在洗矿机中合成 + juicer: + name: 榨汁机 (Juicer) + lore: + - 如合成表所示 + - 在榨汁机中制作果汁 + magic_workbench: + name: 魔法工作台 (Magic Workbench) + lore: + - 如合成表所示 + - 在魔法工作台中合成 + ancient_altar: + name: 古代祭坛 (Ancient Altar) + lore: + - 如合成表所示 + - 使用古代祭坛合成 + - 查看古代祭坛页面获得更多信息 + heated_pressure_chamber: + name: 加热压力舱 (Heated Pressure Chamber) + lore: + - 如合成表所示 + - 用加热压力舱合成 + food_fabricator: + name: 食品加工机 (Food Fabricator) + lore: + - 如合成表所示合成 + - 使用食品加工机 + food_composter: + name: 食品堆肥器 (Food Composter) + lore: + - 如合成表所示 + - 在食品堆肥器中制作 + freezer: + name: 冰箱 (Freezer) + lore: + - 如合成表所示 + - 在冰箱中合成 + geo_miner: + name: GEO 矿机 (GEO Miner) + lore: + - 这个物品可以用 + - GEO 矿机采集 + nuclear_reactor: + name: 核反应堆 (Nuclear Reactor) + lore: + - 这个物品是核反应堆 + - 运行时产生的副产物 oil_pump: name: 油泵 (Oil Pump) lore: @@ -156,3 +118,46 @@ slimefun: lore: - 如合成表所示 - 用炼油机合成 +minecraft: + shaped: + name: 有序合成 + lore: + - 如合成表所示 + - 在普通的工作台中合成 + - 摆放顺序很重要. + shapeless: + name: 无序合成 + lore: + - 如合成表所示 + - 在普通的工作台中合成. + - 摆放顺序不重要. + furnace: + name: 熔炉合成表 + lore: + - 在熔炉中燃烧 + - 以合成你想要的物品 + blasting: + name: 高炉合成表 + lore: + - 在高炉中燃烧 + - 以合成你想要的物品 + smoking: + name: 烟熏炉合成表 + lore: + - 在烟熏炉中燃烧 + - 以合成你想要的物品 + campfire: + name: 营火合成表 + lore: + - 在营火上燃烧 + - 以合成你想要的物品 + stonecutting: + name: 切石机合成表 + lore: + - 如合成表所示 + - 使用切石机合成 + smithing: + name: 锻造台 + lore: + - 如所示配方 + - 在锻造台中合成 From e358289c4b2af1958ff4445e946ffaf38b6b02d7 Mon Sep 17 00:00:00 2001 From: SoSeDiK Date: Fri, 26 Jun 2020 08:38:32 +0000 Subject: [PATCH 07/31] Translate messages_ru.yml via GitLocalize --- src/main/resources/languages/messages_ru.yml | 533 ++++++++++--------- 1 file changed, 269 insertions(+), 264 deletions(-) diff --git a/src/main/resources/languages/messages_ru.yml b/src/main/resources/languages/messages_ru.yml index ac987a0e4..4b17e07f9 100644 --- a/src/main/resources/languages/messages_ru.yml +++ b/src/main/resources/languages/messages_ru.yml @@ -1,249 +1,139 @@ --- -android: - scripts: - already-uploaded: "&4Этот скрипт уже был загружен." - editor: Редактор скриптов - enter-name: - - - - "&eПожалуйста, введите название для Вашего скрипта" - instructions: - ATTACK_ANIMALS: "&4Атаковать &c(скот)" - ATTACK_ANIMALS_ADULT: "&4Атаковать &c(скот &7[взрослый]&c)" - ATTACK_MOBS: "&4Атаковать &c(враждебные мобы)" - ATTACK_MOBS_ANIMALS: "&4Атаковать &c(враждебные мобы и скот)" - CATCH_FISH: "&bВыловить рыбу" - CHOP_TREE: "&cСрубить и пересадить" - DIG_DOWN: "&bКопнуть вниз" - DIG_FORWARD: "&bКопнуть вперёд" - DIG_UP: "&bКопнуть вверх" - FARM_DOWN: "&bСобрать урожай и пересадить &7(блок снизу)" - FARM_EXOTIC_DOWN: "&bПродвинутая сборка урожая и пересадка &7(блок снизу)" - FARM_EXOTIC_FORWARD: "&bПродвинутая сборка урожая и пересадка" - FARM_FORWARD: "&bСобрать урожай и пересадить" - GO_DOWN: "&7Двинуться вниз" - GO_FORWARD: "&7Двинуться вперёд" - GO_UP: "&7Двинуться вверх" - INTERFACE_FUEL: "&cВосполнить топливо из хранилища спереди" - INTERFACE_ITEMS: "&9Сложить хранимые предметы в хранилище спереди" - MOVE_AND_DIG_DOWN: "&bДвинуться и копнуть вниз" - MOVE_AND_DIG_FORWARD: "&bДвинуться и копнуть вперёд" - MOVE_AND_DIG_UP: "&bДвинуться и копнуть вверх" - REPEAT: "&9Повторить скрипт" - START: "&2Начать работу скрипта" - TURN_LEFT: "&7Повернуться налево" - TURN_RIGHT: "&7Повернуться направо" - WAIT: "&eПодождать 0.5с" - rating: - already: "&4Вы уже оценили этот скрипт!" - own: "&4Вы не можете оценить свой скрипт!" - uploaded: - - "&bЗагрузка…" - - "&aВаш скрипт успешно загружен!" - started: "&7Ваш Андроид возобновил работу своего скрипта" - stopped: "&7Ваш Андроид приостановил выполнение своего скрипта" -anvil: - not-working: "&4Вы не можете использовать Slimefun предметы в наковальне!" -backpack: - already-open: "&cИзвините, этот рюкзак уже открыт в другом месте!" - no-stack: "&cВы не можете складывать рюкзаки вместе" commands: + help: Вывести это меню помощи cheat: Войти в режим выдачи предметов give: Выдать Slimefun предметы guide: Получить руководство Slimefun - help: Вывести это меню помощи + timings: Вывести информацию о нагрузке сервера + teleporter: Просмотреть контрольные точки других игроков + versions: Вывести список установленных дополнений + search: Поиск предметов по заданному запросу open_guide: Открыть руководство Slimefun + stats: Вывести статистику игрока research: description: Выдать или сбросить исследования игрока reset: "&cВы сбросили исследования для игрока %player%" reset-target: "&cВаши исследования были сброшены" - search: Поиск предметов по заданному запросу - stats: Вывести статистику игрока - teleporter: Просмотреть контрольные точки других игроков - timings: Вывести информацию о нагрузке сервера - versions: Вывести список установленных дополнений backpack: description: Заполучить копию существующего рюкзака invalid-id: "&4Идентификатор должен быть неотрицательным числом!" player-never-joined: "&4Игрок с таким ником не найден!" backpack-does-not-exist: "&4Указанный рюкзак не существует!" restored-backpack-given: "&aРюкзак был восстановлен и добавлен в Ваш инвентарь!" -gps: - deathpoint: "&4Точка смерти &7%date%" - geo: - scan-required: "&4Требуется геосканирование! &cПроанализируйте чанк при помощи - GPS-геосканера для начала!" - insufficient-complexity: - - "&4Недостаточная общая сила сигнала GPS сети: &c%complexity%" - - "&4а) Ваша GPS сеть пока что не подключена" - - "&4б) У Вашей GPS сети недостаточная сила сигнала" - waypoint: - added: "&aКонтрольная точка успешно добавлена" - max: "&4Вы достигли максимального количества контрольных точек" - new: "&eПожалуйста, введите название новой контрольной точки в чат. &7(можно использовать - цветовые коды!)" guide: - back: - guide: Вернуться к руководству Slimefun - settings: Вернуться к настройкам - title: Назад + search: + message: "&bЧто бы Вы хотели найти?" + name: "&7Поиск…" + tooltip: "&bНажмите для поиска предмета" + inventory: 'Поиск: %item%' + lore: + - "&bЧто бы Вы хотели найти?" + - "&7Введите поисковый запрос в чат" cheat: no-multiblocks: "&4Вы не можете выдать себе постройку, она должна быть построена в мире!" - credits: - commit: Коммит - commits: Коммитов - profile-link: Нажмите, чтобы посетить GitHub профиль - roles: - developer: "&6Разработчик" - resourcepack: "&cТекстурщик" - translator: "&9Локализатор" - wiki: "&3Редактор Вики" languages: + updated: "&aВаш язык успешно установлен на: &b%lang%" + translations: + name: "&aЧего-то не хватает?" + lore: Нажмите, чтобы добавить свой перевод select: Нажмите для выбора этого языка select-default: Нажмите для выбора языка по умолчанию selected-language: 'Сейчас выбрано:' - translations: - lore: Нажмите, чтобы добавить свой перевод - name: "&aЧего-то не хватает?" - updated: "&aВаш язык успешно установлен на: &b%lang%" + title: + main: Руководство Slimefun + settings: Информация и настройки + languages: Выберите Ваш предпочитаемый язык + credits: Авторы Slimefun4 + wiki: Slimefun4 Вики + addons: Дополнения к Slimefun4 + bugs: Отчёты об ошибках + source: Исходный код + credits: + commit: Коммит + commits: Коммитов + roles: + developer: "&6Разработчик" + wiki: "&3Редактор Вики" + resourcepack: "&cТекстурщик" + translator: "&9Локализатор" + profile-link: Нажмите, чтобы посетить GitHub профиль + pages: + previous: Предыдущая страница + next: Следующая страница + tooltips: + open-category: Нажмите, чтобы открыть + versions-notice: Это очень важно, когда Вы сообщаете об ошибках! + wiki: Просмотреть этот предмет на официальной Slimefun Вики + recipes: + machine: Рецепты, доступные в этой машине + miner: Ресурсы, добываемые этим шахтёром + generator: Доступные виды топлива + gold-pan: Ресурсы, которые Вы можете получить + back: + title: Назад + guide: Вернуться к руководству Slimefun + settings: Вернуться к настройкам locked: ЗАБЛОКИРОВАНО locked-category: - Для начала Вы должны - разблокировать все предметы - из следующих категорий - pages: - next: Следующая страница - previous: Предыдущая страница - search: - inventory: 'Поиск: %item%' - lore: - - "&bЧто бы Вы хотели найти?" - - "&7Введите поисковый запрос в чат" - message: "&bЧто бы Вы хотели найти?" - name: "&7Поиск…" - tooltip: "&bНажмите для поиска предмета" - title: - addons: Дополнения к Slimefun4 - bugs: Отчёты об ошибках - credits: Авторы Slimefun4 - languages: Выберите Ваш предпочитаемый язык - main: Руководство Slimefun - settings: Информация и настройки - source: Исходный код - wiki: Slimefun4 Вики - tooltips: - open-category: Нажмите, чтобы открыть - recipes: - generator: Доступные виды топлива - gold-pan: Ресурсы, которые Вы можете получить - machine: Рецепты, доступные в этой машине - miner: Ресурсы, добываемые этим шахтёром - versions-notice: Это очень важно, когда Вы сообщаете об ошибках! - wiki: Просмотреть этот предмет на официальной Slimefun Вики -inventory: - no-access: "&4У Вас нет доступа к этому блоку" -languages: - af: Бурский - ar: Арабский - be: Белорусский - bg: Болгарский - cs: Чешский - da: Датский - de: Немецкий - default: По умолчанию - el: Греческий - en: Английский - es: Испанский - fa: Персидский - fi: Финский - fr: Французский - he: Иврит - hr: Хорватский - hu: Венгерский - id: Индонезийский - it: Итальянский - ja: Японский - ko: Корейский - lv: Латышский - mk: Македонский - ms: Малайский - nl: Нидерландский - 'no': Норвержский - pl: Польский - pt: Португальский (Португалия) - pt-BR: Португальский (Бразилия) - ro: Румынский - ru: Русский - sk: Словацкий - sr: Сербский - sv: Шведский - th: Тайский - tr: Турецкий - uk: Украинский - vi: Вьетнамский - zh-CN: Китайский (Китай) - zh-TW: Китайский (Тайвань) -machines: - ANCIENT_ALTAR: - not-enough-pedestals: "&4Алтарь не окружён необходимым количеством пьедесталов - &c(%pedestals% / 8)" - unknown-catalyst: "&4Неизвестный катализатор! &cИспользуйте правильный рецепт!" - unknown-recipe: "&4Неизвестный рецепт! &cИспользуйте правильный рецепт!" - ANCIENT_PEDESTAL: - obstructed: "&4Что-то мешает! &cУбедитесь, что над пьедесталом ничего нет!" - CARGO_NODES: - must-be-placed: "&4Может быть прикреплён только к сундуку или машине!" - ELEVATOR: - click-to-teleport: "&eНажмите &7для перемещения на этот этаж:" - current-floor: "&eВаш текущий этаж:" - enter-name: "&7Пожалуйста, введите название для этажа в чат. &r(можно использовать - цветовые коды!)" - named: "&2Этаж успешно переименован: &r%floor%" - no-destinations: "&4Этажи не найдены" - pick-a-floor: "&3- Выберите пункт назначения -" - full-inventory: "&eК сожалению, инвентарь уже заполнен!" - GPS_CONTROL_PANEL: - title: Панель управления GPS - transmitters: Просмотр передатчиков - waypoints: Просмотр контрольных точек - HOLOGRAM_PROJECTOR: - enter-text: "&7Пожалуйста, введите желаемый текст для голограммы в чат. &r(можно - использовать цветовые коды!)" - inventory-title: Редактирование голограммы - ignition-chamber-no-flint: "&cАвтоматическая камера зажигания не смогла зажечь блок - из-за отсутствия огнива." - in-use: "&cИнвентарь этого блока уже открыт другим игроком." - pattern-not-found: "&eК сожалению, не удалось распознать этот рецепт. Пожалуйста, - разложите предметы в верной последовательности в раздатчик." - TELEPORTER: - cancelled: "&4Телепортация отменена!" - gui: - time: Расчётное время - title: Ваши контрольные точки - tooltip: Нажмите для телепортации - invulnerability: "&b&lВы получили 30 секунд неуязвимости!" - teleported: "&3Телепортировано!" - teleporting: "&3Телепортация…" - unknown-material: "&eК сожалению, не удалось распознать предмет в раздатчике. Пожалуйста, - перепроверьте все предметы." - wrong-item: "&eК сожалению, не удалось распознать предмет, которым Вы кликнули. - Проверьте рецепты и посмотрите, какие предметы Вы можете использовать." - INDUSTRIAL_MINER: - no-fuel: "&cВаш промышленный шахтёр исчерпал всё топливо! Поместите топливо в - сундук выше." - piston-facing: "&cПоршни промышленного шахтёра должны быть направлены вверх!" - piston-space: "&cПоршни должны иметь воздух над ними!" - destroyed: "&cПохоже, что промышленный шахтёр был сломан." - already-running: "&cВаш промышленный шахтёр уже работает!" - full-chest: "&cСундук Вашего промышленного шахтёра переполнен!" - no-permission: "&4У Вас нет прав, чтобы использовать промышленного шахтёра здесь!" - finished: "&eВаш промышленный шахтёр закончил работу! Добыто руд: %ores%!" messages: - cannot-place: "&cВы не можете поставить этот блок здесь!" - diet-cookie: "&eВы ощущаете невероятное облегчение…" + not-researched: "&4Вам не хватает знаний, чтобы понять это" + not-enough-xp: "&4У Вас недостаточно опыта, чтобы исследовать это" + unlocked: '&bВы исследовали &7"%research%"' + only-players: "&4Эта команда предназначена только для игроков" + unknown-player: "&4Неизвестный игрок: &c%player%" + no-permission: "&4У Вас недостаточно прав, чтобы сделать это" + usage: "&4Использование: &c%usage%" + not-online: "&4%player% &cсейчас не в игре!" + not-valid-item: "&4%item% &cне является допустимым предметом!" + not-valid-amount: "&4%amount% &cне является допустимым числом: количество должно + быть больше нуля!" + given-item: '&bВам выдали &a%amount% &7"%item%&7"' + give-item: '&bВы выдали игроку %player% &a%amount% &7"%item%&7"' + not-valid-research: "&4%research% &cне является допустимым исследованием!" + give-research: '&bВы выдали игроку %player% исследование &7"%research%&7"' + hungry: "&cВы слишком голодны для этого!" + mode-change: "&b%device% | Режим изменён на: &9%mode%" disabled-in-world: "&4&lДанный предмет отключен в этом мире" disabled-item: "&4&lЭтот предмет был отключен! Где Вы вообще его взяли?" + no-tome-yourself: "&cВы не можете использовать &4том обмена знаниями &cна себе…" + multimeter: "&bНакопленное электричество: &3%stored% &b/ &3%capacity%" + talisman: + anvil: "&a&oВаш талисман сохранил инструмент от поломки" + miner: "&a&oВаш талисман удвоил Ваш дроп" + hunter: "&a&oВаш талисман удвоил Ваш дроп" + lava: "&a&oВаш талисман спас Вас от лавового сжигания до смерти" + water: "&a&oВаш талисман спас Вас от утопления" + angel: "&a&oВаш талисман смягчил урон от падения" + fire: "&a&oВаш талисман спас Вас от сгорания до смерти" + magician: "&a&oВаш талисман прибавил Вам дополнительное зачарование" + traveller: "&a&oВаш талисман повысил Вашу скорость" + warrior: "&a&oВаш талисман повысил Вашу силу на некоторое время" + knight: "&a&oВаш талисман выдал Вам 5 секунд регенерации" + whirlwind: "&a&oВаш талисман отразил снаряд" + wizard: "&a&oТалисман повысил уровень зачарования «Удача», но мог также ухудшить + другие зачарования" + soulbound-rune: + fail: "&cВы можете привязать к себе только один предмет за раз." + success: "&aВы успешно привязали этот предмет к себе! Он останется при Вас после + смерти." + research: + start: "&7Древние духи шепчут загадочные слова в Ваше ухо!" + progress: "&7Вы начинаете задаваться вопросом о &b%research% &e(%progress%)" fire-extinguish: "&7Вы погасили себя" + cannot-place: "&cВы не можете поставить этот блок здесь!" + no-pvp: "&cВы не можете вступать в PvP здесь!" + radiation: "&4Вы подвергались смертельной радиации! &cИзбавьтесь от всех радиоактивных + предметов или наденьте костюм химзащиты!" + opening-guide: "&bОткрытие руководства, это может занять некоторое время…" + opening-backpack: "&bОткрытие рюкзака, это может занять некоторое время…" + no-iron-golem-heal: "&cЭтот предмет не является железным слитком. Его нельзя использовать + для починки железных големов!" + link-prompt: "&eНажмите сюда:" + diet-cookie: "&eВы ощущаете невероятное облегчение…" fortune-cookie: - "&7Помогите! Я в плену на фабрике печений с предсказаниями!" - "&7Уже завтра ты умрёшь… от любезного Крипера" @@ -257,56 +147,171 @@ messages: - "&742. Ответ – 42." - "&7Бед не ждите в этот день – Walshy гонит грусти тень." - "&7Никогда не копайте под себя!" - give-item: '&bВы выдали игроку %player% &a%amount% &7"%item%&7"' - given-item: '&bВам выдали &a%amount% &7"%item%&7"' - give-research: '&bВы выдали игроку %player% исследование &7"%research%&7"' - hungry: "&cВы слишком голодны для этого!" - link-prompt: "&eНажмите сюда:" - mode-change: "&b%device% | Режим изменён на: &9%mode%" - multimeter: "&bНакопленное электричество: &3%stored% &b/ &3%capacity%" - no-iron-golem-heal: "&cЭтот предмет не является железным слитком. Его нельзя использовать - для починки железных големов!" - no-permission: "&4У Вас недостаточно прав, чтобы сделать это" - no-pvp: "&cВы не можете вступать в PvP здесь!" - not-enough-xp: "&4У Вас недостаточно опыта, чтобы исследовать это" - no-tome-yourself: "&cВы не можете использовать &4том обмена знаниями &cна себе…" - not-online: "&4%player% &cсейчас не в игре!" - not-researched: "&4Вам не хватает знаний, чтобы понять это" - not-valid-amount: "&4%amount% &cне является допустимым числом: количество должно - быть больше нуля!" - not-valid-item: "&4%item% &cне является допустимым предметом!" - not-valid-research: "&4%research% &cне является допустимым исследованием!" - only-players: "&4Эта команда предназначена только для игроков" - opening-backpack: "&bОткрытие рюкзака, это может занять некоторое время…" - opening-guide: "&bОткрытие руководства, это может занять некоторое время…" - radiation: "&4Вы подвергались смертельной радиации! &cИзбавьтесь от всех радиоактивных - предметов или наденьте костюм химзащиты!" - research: - progress: "&7Вы начинаете задаваться вопросом о &b%research% &e(%progress%)" - start: "&7Древние духи шепчут загадочные слова в Ваше ухо!" - soulbound-rune: - fail: "&cВы можете привязать к себе только один предмет за раз." - success: "&aВы успешно привязали этот предмет к себе! Он останется при Вас после - смерти." - talisman: - angel: "&a&oВаш талисман смягчил урон от падения" - anvil: "&a&oВаш талисман сохранил инструмент от поломки" - fire: "&a&oВаш талисман спас Вас от сгорания до смерти" - hunter: "&a&oВаш талисман удвоил Ваш дроп" - knight: "&a&oВаш талисман выдал Вам 5 секунд регенерации" - lava: "&a&oВаш талисман спас Вас от лавового сжигания до смерти" - magician: "&a&oВаш талисман прибавил Вам дополнительное зачарование" - miner: "&a&oВаш талисман удвоил Ваш дроп" - traveller: "&a&oВаш талисман повысил Вашу скорость" - warrior: "&a&oВаш талисман повысил Вашу силу на некоторое время" - water: "&a&oВаш талисман спас Вас от утопления" - whirlwind: "&a&oВаш талисман отразил снаряд" - wizard: "&a&oТалисман повысил уровень зачарования «Удача», но мог также ухудшить - другие зачарования" - unknown-player: "&4Неизвестный игрок: &c%player%" - unlocked: '&bВы исследовали &7"%research%"' - usage: "&4Использование: &c%usage%" -miner: - no-ores: "&eК сожалению, не удалось найти какую-либо руду поблизости!" + - "&7Это всего лишь царапина!" + - "&7Всегда смотрите на светлую сторону жизни!" + - "&7Вы съели странное печенье, до жути напоминающее бисквит" + - "&7Неоновые таблички просто ШИК!" +machines: + pattern-not-found: "&eК сожалению, не удалось распознать этот рецепт. Пожалуйста, + разложите предметы в верной последовательности в раздатчик." + unknown-material: "&eК сожалению, не удалось распознать предмет в раздатчике. Пожалуйста, + перепроверьте все предметы." + wrong-item: "&eК сожалению, не удалось распознать предмет, которым Вы кликнули. + Проверьте рецепты и посмотрите, какие предметы Вы можете использовать." + full-inventory: "&eК сожалению, инвентарь уже заполнен!" + in-use: "&cИнвентарь этого блока уже открыт другим игроком." + ignition-chamber-no-flint: "&cАвтоматическая камера зажигания не смогла зажечь блок + из-за отсутствия огнива." + ANCIENT_ALTAR: + not-enough-pedestals: "&4Алтарь не окружён необходимым количеством пьедесталов + &c(%pedestals% / 8)" + unknown-catalyst: "&4Неизвестный катализатор! &cИспользуйте правильный рецепт!" + unknown-recipe: "&4Неизвестный рецепт! &cИспользуйте правильный рецепт!" + ANCIENT_PEDESTAL: + obstructed: "&4Что-то мешает! &cУбедитесь, что над пьедесталом ничего нет!" + HOLOGRAM_PROJECTOR: + enter-text: "&7Пожалуйста, введите желаемый текст для голограммы в чат. &r(можно + использовать цветовые коды!)" + inventory-title: Редактирование голограммы + ELEVATOR: + no-destinations: "&4Этажи не найдены" + pick-a-floor: "&3- Выберите пункт назначения -" + current-floor: "&eВаш текущий этаж:" + click-to-teleport: "&eНажмите &7для перемещения на этот этаж:" + enter-name: "&7Пожалуйста, введите название для этажа в чат. &r(можно использовать + цветовые коды!)" + named: "&2Этаж успешно переименован: &r%floor%" + TELEPORTER: + teleporting: "&3Телепортация…" + teleported: "&3Телепортировано!" + cancelled: "&4Телепортация отменена!" + invulnerability: "&b&lВы получили 30 секунд неуязвимости!" + gui: + title: Ваши контрольные точки + tooltip: Нажмите для телепортации + time: Расчётное время + CARGO_NODES: + must-be-placed: "&4Может быть прикреплён только к сундуку или машине!" + GPS_CONTROL_PANEL: + title: Панель управления GPS + transmitters: Просмотр передатчиков + waypoints: Просмотр контрольных точек + INDUSTRIAL_MINER: + no-fuel: "&cВаш промышленный шахтёр исчерпал всё топливо! Поместите топливо в + сундук выше." + piston-facing: "&cПоршни промышленного шахтёра должны быть направлены вверх!" + piston-space: "&cПоршни должны иметь воздух над ними!" + destroyed: "&cПохоже, что промышленный шахтёр был сломан." + already-running: "&cВаш промышленный шахтёр уже работает!" + full-chest: "&cСундук Вашего промышленного шахтёра переполнен!" + no-permission: "&4У Вас нет прав, чтобы использовать промышленного шахтёра здесь!" + finished: "&eВаш промышленный шахтёр закончил работу! Добыто руд: %ores%!" +anvil: + not-working: "&4Вы не можете использовать Slimefun предметы в наковальне!" +backpack: + already-open: "&cИзвините, этот рюкзак уже открыт в другом месте!" + no-stack: "&cВы не можете складывать рюкзаки вместе" workbench: not-enhanced: "&4Вы не можете использовать Slimefun предметы в обычном верстаке" +gps: + deathpoint: "&4Точка смерти &7%date%" + waypoint: + new: "&eПожалуйста, введите название новой контрольной точки в чат. &7(можно использовать + цветовые коды!)" + added: "&aКонтрольная точка успешно добавлена" + max: "&4Вы достигли максимального количества контрольных точек" + insufficient-complexity: + - "&4Недостаточная общая сила сигнала GPS сети: &c%complexity%" + - "&4а) Ваша GPS сеть пока что не подключена" + - "&4б) У Вашей GPS сети недостаточная сила сигнала" + geo: + scan-required: "&4Требуется геосканирование! &cПроанализируйте чанк при помощи + GPS-геосканера для начала!" +inventory: + no-access: "&4У Вас нет доступа к этому блоку" +android: + started: "&7Ваш Андроид возобновил работу своего скрипта" + stopped: "&7Ваш Андроид приостановил выполнение своего скрипта" + scripts: + already-uploaded: "&4Этот скрипт уже был загружен." + instructions: + START: "&2Начать работу скрипта" + REPEAT: "&9Повторить скрипт" + WAIT: "&eПодождать 0.5с" + GO_FORWARD: "&7Двинуться вперёд" + GO_UP: "&7Двинуться вверх" + GO_DOWN: "&7Двинуться вниз" + TURN_LEFT: "&7Повернуться налево" + TURN_RIGHT: "&7Повернуться направо" + DIG_UP: "&bКопнуть вверх" + DIG_FORWARD: "&bКопнуть вперёд" + DIG_DOWN: "&bКопнуть вниз" + MOVE_AND_DIG_UP: "&bДвинуться и копнуть вверх" + MOVE_AND_DIG_FORWARD: "&bДвинуться и копнуть вперёд" + MOVE_AND_DIG_DOWN: "&bДвинуться и копнуть вниз" + ATTACK_MOBS_ANIMALS: "&4Атаковать &c(враждебные мобы и скот)" + ATTACK_MOBS: "&4Атаковать &c(враждебные мобы)" + ATTACK_ANIMALS: "&4Атаковать &c(скот)" + ATTACK_ANIMALS_ADULT: "&4Атаковать &c(скот &7[взрослый]&c)" + CHOP_TREE: "&cСрубить и пересадить" + CATCH_FISH: "&bВыловить рыбу" + FARM_FORWARD: "&bСобрать урожай и пересадить" + FARM_DOWN: "&bСобрать урожай и пересадить &7(блок снизу)" + FARM_EXOTIC_FORWARD: "&bПродвинутая сборка урожая и пересадка" + FARM_EXOTIC_DOWN: "&bПродвинутая сборка урожая и пересадка &7(блок снизу)" + INTERFACE_ITEMS: "&9Сложить хранимые предметы в хранилище спереди" + INTERFACE_FUEL: "&cВосполнить топливо из хранилища спереди" + enter-name: + - + - "&eПожалуйста, введите название для Вашего скрипта" + uploaded: + - "&bЗагрузка…" + - "&aВаш скрипт успешно загружен!" + rating: + own: "&4Вы не можете оценить свой скрипт!" + already: "&4Вы уже оценили этот скрипт!" + editor: Редактор скриптов +languages: + default: По умолчанию + en: Английский + de: Немецкий + fr: Французский + it: Итальянский + es: Испанский + pl: Польский + sv: Шведский + nl: Нидерландский + cs: Чешский + hu: Венгерский + lv: Латышский + ru: Русский + sk: Словацкий + zh-TW: Китайский (Тайвань) + vi: Вьетнамский + id: Индонезийский + zh-CN: Китайский (Китай) + el: Греческий + he: Иврит + ar: Арабский + af: Бурский + da: Датский + fi: Финский + uk: Украинский + ms: Малайский + 'no': Норвержский + ja: Японский + fa: Персидский + th: Тайский + ro: Румынский + pt: Португальский (Португалия) + pt-BR: Португальский (Бразилия) + bg: Болгарский + ko: Корейский + tr: Турецкий + hr: Хорватский + mk: Македонский + sr: Сербский + be: Белорусский + tl: Тагальский +miner: + no-ores: "&eК сожалению, не удалось найти какую-либо руду поблизости!" From 1b159091a0f20ba2ffd90066769b7fdc3c3da43d Mon Sep 17 00:00:00 2001 From: SoSeDiK Date: Fri, 26 Jun 2020 08:38:41 +0000 Subject: [PATCH 08/31] Translate researches_ru.yml via GitLocalize --- .../resources/languages/researches_ru.yml | 436 +++++++++--------- 1 file changed, 219 insertions(+), 217 deletions(-) diff --git a/src/main/resources/languages/researches_ru.yml b/src/main/resources/languages/researches_ru.yml index 83ccb2228..c73215fa2 100644 --- a/src/main/resources/languages/researches_ru.yml +++ b/src/main/resources/languages/researches_ru.yml @@ -1,236 +1,238 @@ --- slimefun: - 24k_gold_block: "«Эльдорадо»" - advanced_android: Продвинутые Андроиды - advanced_butcher_android: Продвинутый Андроид-мясник - advanced_circuit_board: Печатная плата - advanced_electric_smeltery: Модернизированная электрическая плавильня - advanced_farmer_android: Продвинутый Андроид-фермер - advanced_fisherman_android: Продвинутый Андроид-рыбак - advanced_output_node: Продвинутый грузовой узел - alloys: Продвинутые сплавы - ancient_altar: Древний алтарь - ancient_runes: Стихийные руны - android_interfaces: Андроид-интерфейсы - android_memory_core: Ядро памяти - angel_talisman: Талисман ангела - animal_growth_accelerator: Ускоритель роста животных - anvil_talisman: Талисман кузнеца - armored_jetboots: Бронированные реактивные ботинки - armored_jetpack: Бронированный реактивный ранец + walking_sticks: Мои любимые трости + portable_crafter: Портативный крафтер + fortune_cookie: Печенье судьбы + portable_dustbin: Портативный мусорный ящик + meat_jerky: Вяленое мясо armor_forge: Изготовление доспехов - auto_anvil: Автоматизированная наковальня - auto_breeder: Автоматизированное размножение - auto_drier: "«День сушки»" - auto_enchanting: Автоматизированное зачаровывание и разачаровывание - automated_crafting_chamber: Автоматизированный крафт - automated_panning_machine: Автоматизированная рудопромывочная машина - automatic_ignition_chamber: Автоматизированная камера зажигания - backpacks: Рюкзаки + glowstone_armor: Светящаяся броня + lumps: Осколки Незера и Эндера + ender_backpack: Эндер-рюкзак + ender_armor: Эндер-броня + magic_eye_of_ender: Магическое око Эндера + magic_sugar: Волшебный сахар + monster_jerky: Вяленая плоть + slime_armor: Слизневая броня + sword_of_beheading: Меч обезглавливания basic_circuit_board: Монтажная плата + advanced_circuit_board: Печатная плата + smeltery: Плавильня + steel: Стальной век + misc_power_items: Важные ресурсы для питания сети battery: Ваша первая батарея - better_carbon_press: Модернизированный углеродный пресс - better_crop_growth_accelerator: Модернизированный ускоритель роста растений - better_electric_crucibles: Горячие тигли - better_electric_furnace: Модернизированная электрическая печь - better_food_fabricator: Улучшенная пищевая фабрика - better_freezer: Улучшенная морозилка - better_gps_transmitters: Модернизированные передатчики - better_heated_pressure_chamber: Модернизированная обогреваемая барокамера - better_solar_generators: Модернизированные солнечные генераторы - bio_reactor: Биореактор - blade_of_vampires: Вампирский клинок - blistering_ingots: Раскалённые слитки - block_placer: Размещатель блоков - boosted_uranium: "«Замкнутый круг»" - boots_of_the_stomper: Сапожки путешественника - bound_armor: Персональная броня - bound_backpack: Персональное хранилище - bound_tools: Персональные инструменты - bound_weapons: Персональное оружие - bronze: Создание бронзы - butcher_androids: Андроид-мясник + steel_plate: Стальное покрытие + steel_thruster: Стальной ускоритель + parachute: Парашют + grappling_hook: Крюк-кошка + jetpacks: Реактивные ранцы + multitools: Мультиинструменты + solar_panel_and_helmet: Солнечная энергия + elemental_staff: Стихийные посохи + grind_stone: Точильный камень cactus_armor: Кактусовый костюм - capacitors: Маленький накопитель энергии - carbonado: Карбонадо - carbonado_furnace: Карбонадовая печь - carbonado_tools: Высокоуровневые машины - carbon_press: Углеродный пресс - cargo_basics: Основы грузовой сети - cargo_nodes: Установка грузовой сети - chainmail_armor: Кольчужная броня - charging_bench: Зарядное устройство-верстак - coal_generator: Угольный генератор - cobalt_pickaxe: Кобальтовая кирка - combustion_reactor: Реактор внутреннего сгорания - common_talisman: Обычный талисман - composter: Компостирование грязи + gold_pan: Рудопромывочный лоток + magical_book_cover: Обложка магической книги + slimefun_metals: Новые металлы + ore_crusher: Разрушитель руд + bronze: Создание бронзы + alloys: Продвинутые сплавы compressor_and_carbon: Создание углерода - cooler: "«Переносной холодильник»" - copper_wire: Медный провод - crop_growth_accelerator: Ускорение роста растений - crucible: Тигель - crushed_ore: Очистка руды + gilded_iron_armor: Позолоченные железные доспехи + synthetic_diamond: Синтезированный алмаз + pressure_chamber: Барокамера + synthetic_sapphire: Синтетические сапфиры damascus_steel: Слиток дамасской стали damascus_steel_armor: Доспехи из дамасской стали - diet_cookie: Диетическое печенье - duct_tape: Скотч - electric_crucible: Электрический тигель - electric_furnaces: Электрическая печь - electric_ingot_machines: Электрический завод слитков + reinforced_alloy: Армированный сплав + carbonado: Карбонадо + magic_workbench: Магический верстак + wind_staff: Посох ветров + reinforced_armor: Армированная броня + ore_washer: Очиститель руд + gold_carats: Чистое золото + silicon: Силиконовая долина + fire_staff: Посох пламени + smelters_pickaxe: Плазменная кирка + common_talisman: Обычный талисман + anvil_talisman: Талисман кузнеца + miner_talisman: Талисман шахтёра + hunter_talisman: Талисман охотника + lava_talisman: Талисман покорителя лавы + water_talisman: Талисман покорителя воды + angel_talisman: Талисман ангела + fire_talisman: Талисман пожарного + lava_crystal: "«Огненная ситуация»" + magician_talisman: Талисман мага + traveller_talisman: Талисман путешественника + warrior_talisman: Талисман воина + knight_talisman: Талисман рыцаря + gilded_iron: "«Блестящее железо»" + synthetic_emerald: Фальшивый изумруд + chainmail_armor: Кольчужная броня + whirlwind_talisman: Талисман вихря + wizard_talisman: Талисман волшебника + lumber_axe: Топор дровосека + hazmat_suit: Костюм химзащиты + uranium: Радиоактивные штучки + crushed_ore: Очистка руды + redstone_alloy: Редстоуновый сплав + carbonado_tools: Высокоуровневые машины + first_aid: Первая помощь + gold_armor: "«Блестящие доспехи»" + night_vision_googles: Прибор ночного видения + pickaxe_of_containment: Кирка сдерживания + hercules_pickaxe: Геркулесовая кирка + table_saw: Лесопилка + slime_steel_armor: Слизистые стальные доспехи + blade_of_vampires: Вампирский клинок + water_staff: Посох морей + 24k_gold_block: "«Эльдорадо»" + composter: Компостирование грязи + farmer_shoes: Фермерские ботинки + explosive_tools: Взрывные инструменты + automated_panning_machine: Автоматизированная рудопромывочная машина + boots_of_the_stomper: Сапожки путешественника + pickaxe_of_the_seeker: Кирка искателя + backpacks: Рюкзаки + woven_backpack: Тканевой рюкзак + crucible: Тигель + gilded_backpack: Позолоченный рюкзак + armored_jetpack: Бронированный реактивный ранец + ender_talismans: Эндер-талисманы + nickel_and_cobalt: Даже больше руд! + magnet: Магнитные металлы + infused_magnet: Магнит? + cobalt_pickaxe: Кобальтовая кирка + essence_of_afterlife: Некромантия + bound_backpack: Персональное хранилище + jetboots: Реактивные ботинки + armored_jetboots: Бронированные реактивные ботинки + seismic_axe: Сейсмический топор + pickaxe_of_vein_mining: Кирка жильного копания + bound_weapons: Персональное оружие + bound_tools: Персональные инструменты + bound_armor: Персональная броня + juicer: Вкусные напитки + repaired_spawner: Починка спавнеров + enhanced_furnace: Продвинутая печь + more_enhanced_furnaces: Улучшенные печи + high_tier_enhanced_furnaces: Высокоуровневая печь + reinforced_furnace: Усиленная печь + carbonado_furnace: Карбонадовая печь electric_motor: "«Нагрев»" + block_placer: Размещатель блоков + scroll_of_dimensional_teleposition: Поворот вещей вокруг + special_bows: "«Робин Гуд»" + tome_of_knowledge_sharing: Поделиться с ближними + flask_of_knowledge: Хранилище опыта + hardened_glass: Покорение взрывов + golden_apple_juice: "«Золотое зелье»" + cooler: "«Переносной холодильник»" + ancient_altar: Древний алтарь + wither_proof_obsidian: Визеростойкий обсидиан + ancient_runes: Стихийные руны + special_runes: Особые руны + infernal_bonemeal: Незерская костная мука + rainbow_blocks: Радужные блоки + infused_hopper: Заряженная воронка + wither_proof_glass: Визеростойкое стекло + duct_tape: Скотч + plastic_sheet: Пластик + android_memory_core: Ядро памяти + oil: Нефть! + fuel: Топливо + hologram_projector: ГоЛоГрАмМы + capacitors: Маленький накопитель энергии + high_tier_capacitors: Средний накопитель энергии + solar_generators: Солнечная электростанция + electric_furnaces: Электрическая печь electric_ore_grinding: Дробление и распыление - electric_press: Электрический пресс - electric_smeltery: Электрическая плавильня - elemental_staff: Стихийные посохи + heated_pressure_chamber: Обогреваемая барокамера + coal_generator: Угольный генератор + bio_reactor: Биореактор + auto_enchanting: Автоматизированное зачаровывание и разачаровывание + auto_anvil: Автоматизированная наковальня + multimeter: Измерение мощности + gps_setup: Базовая GPS установка + gps_emergency_transmitter: GPS аварийная точка + programmable_androids: Программируемые Андроиды + android_interfaces: Андроид-интерфейсы + geo_scanner: Гоесканирование + combustion_reactor: Реактор внутреннего сгорания + teleporter: Базовые компоненты телепортера + teleporter_activation_plates: Активация телепортера + better_solar_generators: Модернизированные солнечные генераторы + better_gps_transmitters: Модернизированные передатчики elevator: Лифтовая плита - elytra: Элитры + energized_solar_generator: Солнечная энергия круглые сутки! + energized_gps_transmitter: Высокоуровневый передатчик + energy_regulator: Электрические сети + butcher_androids: Андроид-мясник + organic_food: Органическая пища + auto_breeder: Автоматизированное размножение + advanced_android: Продвинутые Андроиды + advanced_butcher_android: Продвинутый Андроид-мясник + advanced_fisherman_android: Продвинутый Андроид-рыбак + animal_growth_accelerator: Ускоритель роста животных + xp_collector: Собиратель опыта + organic_fertilizer: Органические удобрения + crop_growth_accelerator: Ускорение роста растений + better_crop_growth_accelerator: Модернизированный ускоритель роста растений + reactor_essentials: Реакторные основы + nuclear_reactor: Атомная электростанция + freezer: Морозилка + cargo_basics: Основы грузовой сети + cargo_nodes: Установка грузовой сети + electric_ingot_machines: Электрический завод слитков + high_tier_electric_ingot_machines: Сверхбыстрый электрический завод слитков + automated_crafting_chamber: Автоматизированный крафт + better_food_fabricator: Улучшенная пищевая фабрика + reactor_access_port: Порт доступа к реактору + fluid_pump: Жидкостный насос + better_freezer: Улучшенная морозилка + boosted_uranium: "«Замкнутый круг»" + trash_can: Мусорка + advanced_output_node: Продвинутый грузовой узел + carbon_press: Углеродный пресс + electric_smeltery: Электрическая плавильня + better_electric_furnace: Модернизированная электрическая печь + better_carbon_press: Модернизированный углеродный пресс empowered_android: Усиленные Андроиды empowered_butcher_android: Усиленный Андроид-мясник empowered_fisherman_android: Усиленный Андроид-рыбак - ender_armor: Эндер-броня - ender_backpack: Эндер-рюкзак - ender_talismans: Эндер-талисманы - energized_gps_transmitter: Высокоуровневый передатчик - energized_solar_generator: Солнечная энергия круглые сутки! - energy_regulator: Электрические сети - enhanced_furnace: Продвинутая печь - essence_of_afterlife: Некромантия - explosive_tools: Взрывные инструменты - farmer_shoes: Фермерские ботинки - fire_staff: Посох пламени - fire_talisman: Талисман пожарного - first_aid: Первая помощь - flask_of_knowledge: Хранилище опыта - fluid_pump: Жидкостный насос - fortune_cookie: Печенье судьбы - freezer: Морозилка - fuel: Топливо - geo_miner: Геокопатель - geo_scanner: Гоесканирование - gilded_backpack: Позолоченный рюкзак - gilded_iron: "«Блестящее железо»" - gilded_iron_armor: Позолоченные железные доспехи - glowstone_armor: Светящаяся броня - gold_armor: "«Блестящие доспехи»" - gold_carats: Чистое золото - golden_apple_juice: "«Золотое зелье»" - gold_pan: Рудопромывочный лоток - gps_emergency_transmitter: GPS аварийная точка - gps_setup: Базовая GPS установка - grappling_hook: Крюк-кошка - grind_stone: Точильный камень - hardened_glass: Покорение взрывов - hazmat_suit: Костюм химзащиты - heated_pressure_chamber: Обогреваемая барокамера - hercules_pickaxe: Геркулесовая кирка - high_tier_capacitors: Средний накопитель энергии high_tier_carbon_press: Высокоуровневый углеродный пресс - high_tier_electric_ingot_machines: Сверхбыстрый электрический завод слитков - high_tier_enhanced_furnaces: Высокоуровневая печь - hologram_projector: ГоЛоГрАмМы - hunter_talisman: Талисман охотника - infernal_bonemeal: Незеритовая костная мука - infused_hopper: Заряженная воронка - infused_magnet: Магнит? - jetboots: Реактивные ботинки - jetpacks: Реактивные ранцы - juicer: Вкусные напитки - kelp_cookie: Вкусная водоросль - knight_talisman: Талисман рыцаря - lava_crystal: "«Огненная ситуация»" - lava_generator: Лавовый генератор - lava_talisman: Талисман покорителя лавы - lightning_rune: Молниевая руна - lumber_axe: Топор дровосека - lumps: Осколки Незера и Эндера - magical_book_cover: Обложка магической книги - magic_eye_of_ender: Магическое око Эндера - magician_talisman: Талисман мага - magic_sugar: Волшебный сахар - magic_workbench: Магический верстак - magnesium_generator: Магниевое питание - magnet: Магнитные металлы - makeshift_smeltery: Импровизированная плавильня - meat_jerky: Вяленое мясо - miner_talisman: Талисман шахтёра - misc_power_items: Важные ресурсы для питания сети - monster_jerky: Вяленая плоть - more_enhanced_furnaces: Улучшенные печи - multimeter: Измерение мощности - multitools: Мультиинструменты - nether_gold_pan: Незеритовый рудопромывочный лоток - nether_ice: Незеритовый хладагент - nether_star_reactor: Звёздный незеритовый реактор - nickel_and_cobalt: Даже больше руд! - night_vision_googles: Прибор ночного видения - nuclear_reactor: Атомная электростанция - oil: Нефть! - ore_crusher: Разрушитель руд - ore_washer: Очиститель руд - organic_fertilizer: Органические удобрения - organic_food: Органическая пища - output_chest: Выходной сундук - parachute: Парашют - pickaxe_of_containment: Кирка сдерживания - pickaxe_of_the_seeker: Кирка искателя - pickaxe_of_vein_mining: Кирка жильного копания - plastic_sheet: Пластик - portable_crafter: Портативный крафтер - portable_dustbin: Портативный мусорный ящик - pressure_chamber: Барокамера - programmable_androids: Программируемые Андроиды - radiant_backpack: Рюкзак путешественника - rainbow_blocks: Радужные блоки - reactor_access_port: Порт доступа к реактору - reactor_essentials: Реакторные основы - redstone_alloy: Редстоуновый сплав - reinforced_alloy: Армированный сплав - reinforced_armor: Армированная броня - reinforced_furnace: Усиленная печь - repaired_spawner: Починка спавнеров - scroll_of_dimensional_teleposition: Поворот вещей вокруг - seismic_axe: Сейсмический топор - silicon: Силиконовая долина - slime_armor: Слизневая броня - slimefun_metals: Новые металлы - slime_steel_armor: Слизистые стальные доспехи - smelters_pickaxe: Плазменная кирка - smeltery: Плавильня - solar_generators: Солнечная электростанция - solar_panel_and_helmet: Солнечная энергия - soulbound_rune: Персональная руна - special_bows: "«Робин Гуд»" - special_elytras: Особые элитры - special_runes: Особые руны - steel: Стальной век - steel_plate: Стальное покрытие - steel_thruster: Стальной ускоритель - storm_staff: Штормовой посох - sword_of_beheading: Меч обезглавливания - synthetic_diamond: Синтезированный алмаз - synthetic_emerald: Фальшивый изумруд - synthetic_sapphire: Синтетические сапфиры - table_saw: Лесопилка - teleporter: Базовые компоненты телепортера - teleporter_activation_plates: Активация телепортера - tome_of_knowledge_sharing: Поделиться с ближними - totem_of_undying: Тотем бессмертия - trash_can: Мусорка - traveller_talisman: Талисман путешественника - tree_growth_accelerator: Быстрорастущие деревья - uranium: Радиоактивные штучки - walking_sticks: Мои любимые трости - warrior_talisman: Талисман воина - water_staff: Посох морей - water_talisman: Талисман покорителя воды - whirlwind_talisman: Талисман вихря - wind_staff: Посох ветров wither_assembler: Образователь Визеров - wither_proof_glass: Визеростойкое стекло - wither_proof_obsidian: Визеростойкий обсидиан - wizard_talisman: Талисман волшебника - woven_backpack: Тканевой рюкзак - xp_collector: Собиратель опыта + better_heated_pressure_chamber: Модернизированная обогреваемая барокамера + elytra: Элитры + special_elytras: Особые элитры + electric_crucible: Электрический тигель + better_electric_crucibles: Горячие тигли + advanced_electric_smeltery: Модернизированная электрическая плавильня + advanced_farmer_android: Продвинутый Андроид-фермер + lava_generator: Лавовый генератор + nether_ice: Незерский хладагент + nether_star_reactor: Звёздный незерский реактор + blistering_ingots: Раскалённые слитки + automatic_ignition_chamber: Автоматизированная камера зажигания + output_chest: Выходной сундук + copper_wire: Медный провод + radiant_backpack: Рюкзак путешественника + auto_drier: "«День сушки»" + diet_cookie: Диетическое печенье + storm_staff: Штормовой посох + soulbound_rune: Персональная руна + geo_miner: Геокопатель + lightning_rune: Молниевая руна + totem_of_undying: Тотем бессмертия + charging_bench: Зарядное устройство-верстак + nether_gold_pan: Незерский рудопромывочный лоток + electric_press: Электрический пресс + magnesium_generator: Магниевое питание + kelp_cookie: Вкусная водоросль + makeshift_smeltery: Импровизированная плавильня + tree_growth_accelerator: Быстрорастущие деревья industrial_miner: Промышленная добыча advanced_industrial_miner: Улучшенная добыча + magical_zombie_pills: Дезомбификация + auto_brewer: Промышленная пивоварня From 5d283c053dfe8b11605d7c150d4c2f5d680e2509 Mon Sep 17 00:00:00 2001 From: SoSeDiK Date: Fri, 26 Jun 2020 08:38:51 +0000 Subject: [PATCH 09/31] Translate recipes_ru.yml via GitLocalize --- src/main/resources/languages/recipes_ru.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/resources/languages/recipes_ru.yml b/src/main/resources/languages/recipes_ru.yml index 81807a2d2..a888b0340 100644 --- a/src/main/resources/languages/recipes_ru.yml +++ b/src/main/resources/languages/recipes_ru.yml @@ -156,3 +156,8 @@ minecraft: lore: - Создаётся так, как показано, - используя камнерез + smithing: + name: Создаётся на столе кузнеца + lore: + - Создаётся так, как показано, + - используя стол кузнеца From 1e6ac71befac8dc565c495cb51172fdd28ff489e Mon Sep 17 00:00:00 2001 From: SoSeDiK Date: Fri, 26 Jun 2020 08:53:53 +0000 Subject: [PATCH 10/31] Translate messages_uk.yml via GitLocalize --- src/main/resources/languages/messages_uk.yml | 525 ++++++++++--------- 1 file changed, 265 insertions(+), 260 deletions(-) diff --git a/src/main/resources/languages/messages_uk.yml b/src/main/resources/languages/messages_uk.yml index f007bc9d4..46dda9c0a 100644 --- a/src/main/resources/languages/messages_uk.yml +++ b/src/main/resources/languages/messages_uk.yml @@ -1,244 +1,135 @@ --- -android: - scripts: - already-uploaded: "&4Цей скрипт вже було завантажено." - editor: Редактор скриптів - enter-name: - - - - "&eБудь ласка, введіть назву для Вашого скрипту" - instructions: - ATTACK_ANIMALS: "&4Атакувати &c(тварини)" - ATTACK_ANIMALS_ADULT: "&4Атакувати &c(тварини &7[дорослі]&c)" - ATTACK_MOBS: "&4Атакувати &c(ворожі моби)" - ATTACK_MOBS_ANIMALS: "&4Атакувати &c(ворожі моби та тварини)" - CATCH_FISH: "&bВиловити рибу" - CHOP_TREE: "&cЗрубати та пересадити" - DIG_DOWN: "&bКопнути вниз" - DIG_FORWARD: "&bКопнути вперед" - DIG_UP: "&bКопнути вгору" - FARM_DOWN: "&bЗібрати врожай та пересадити &7(блок знизу)" - FARM_EXOTIC_DOWN: "&bПрогресивне збирання врожаю та пересадка &7(блок знизу)" - FARM_EXOTIC_FORWARD: "&bПрогресивне збирання врожаю та пересадка" - FARM_FORWARD: "&bЗібрати врожай та пересадити" - GO_DOWN: "&7Рушити вниз" - GO_FORWARD: "&7Рушити вперед" - GO_UP: "&7Рушити вгору" - INTERFACE_FUEL: "&cПоповнити запаси палива зі сховища спереду" - INTERFACE_ITEMS: "&9Скласти збережені предмети в сховище спереду" - MOVE_AND_DIG_DOWN: "&bРушити та копнути вниз" - MOVE_AND_DIG_FORWARD: "&bРушити та копнути вперед" - MOVE_AND_DIG_UP: "&bРушити та копнути вверх" - REPEAT: "&9Повторити виконання скрипту" - START: "&2Розпочати виконання скрипту" - TURN_LEFT: "&7Повернутись наліво" - TURN_RIGHT: "&7Повернутись направо" - WAIT: "&eЗачекати 0.5с" - rating: - already: "&4Ви вже оцінили цей скрипт!" - own: "&4Ви не можете оцінити власний скрипт!" - uploaded: - - "&bЗавантаження…" - - "&aВаш скрипт успішно завантажено!" - started: "&7Ваш Андроїд продовжив виконання свого скрипту" - stopped: "&7Ваш Андроїд призупинив виконання свого скрипту" -anvil: - not-working: "&4Ви не можете використовувати Slimefun предмети в наковальні!" -backpack: - already-open: "&cВибачте, цей рюкзак уже відкрито в іншому місці!" - no-stack: "&cВи не можете складати рюкзаки разом" commands: + help: Вивести цей екран допомоги cheat: Увійти в режим видачі предметів give: Видача Slimefun предметів guide: Отримати посібник Slimefun - help: Вивести цей екран допомоги + timings: Вивести інформацію про нагрузку сервера + teleporter: Перегляд контрольних точок інших гравців + versions: Вивести список установлених доповнень + search: Пошук предметів по заданому запиту open_guide: Відкрити посібник Slimefun + stats: Вивести статистику гравця research: description: Видати або скинути дослідження гравця reset: "&cВи скинули дослідження гравця %player%" reset-target: "&cВаші дослідження були скинуті" - search: Пошук предметів по заданому запиту - stats: Вивести статистику гравця - teleporter: Перегляд контрольних точок інших гравців - timings: Вивести інформацію про нагрузку сервера - versions: Вивести список установлених доповнень backpack: description: Отримати копію існуючого рюкзака invalid-id: "&4Ідентифікатор повинен бути невід’ємним числом!" player-never-joined: "&4Гравця з таким ніком не знайдено!" backpack-does-not-exist: "&4Вказаний рюкзак не існує!" restored-backpack-given: "&aРюкзак відновлено та додано в Ваш інвентар!" -gps: - deathpoint: "&4Точка смерті &7%date%" - geo: - scan-required: "&4Необхідне геосканування! &cПроскануйте цей чанк геосканером - спочатку!" - insufficient-complexity: - - "&4Недостатня загальна сила GPS мережі: &c%complexity%" - - "&4а) Ваша GPS мережа ще не під’эднана" - - "&4б) У Вашої GPS мережі недостатня сила сигналу" - waypoint: - added: "&aКонтрольну точку успішно додано" - max: "&4Ви досягли максимальної кількості контрольних точок" - new: "&eБудь ласка, введіть назву для контрольної точки в чат. &7(кольори підтримуються!)" guide: - back: - guide: Повернутись до посібника Slimefun - settings: Повернутись до панелі налаштувань - title: Назад + search: + message: "&bЩо би Ви бажали знайти?" + name: "&7Пошук…" + tooltip: "&bНатисніть для пошуку предмету" + inventory: 'Пошук: %item%' cheat: no-multiblocks: "&4Ви не можете видати собі споруду, вона повинна бути побудована!" - credits: - commit: Коміт - commits: Комітів - profile-link: Натисніть, щоб відвідати GitHub профіль - roles: - developer: "&6Розробник" - resourcepack: "&cТекстурщик" - translator: "&9Локалізатор" - wiki: "&3Редактор Вікі" languages: + updated: "&aВашу мову було успішно встановлено на: &b%lang%" + translations: + name: "&aЧогось не вистачає?" + lore: Натисніть, щоб додати свій переклад select: Натисніть для вибору цієї мови select-default: Натисніть для вибору стандартної мови selected-language: 'Наразі обрано:' - translations: - lore: Натисніть, щоб додати свій переклад - name: "&aЧогось не вистачає?" - updated: "&aВашу мову було успішно встановлено на: &b%lang%" + title: + main: Посібник Slimefun + settings: Налаштування та інформація + languages: Виберіть бажану мову + credits: Автори Slimefun4 + wiki: Slimefun4 Вікі + addons: Доповнення до Slimefun4 + bugs: Звіти про помилки + source: Вихідний код + credits: + commit: Коміт + commits: Комітів + roles: + developer: "&6Розробник" + wiki: "&3Редактор Вікі" + resourcepack: "&cТекстурщик" + translator: "&9Локалізатор" + profile-link: Натисніть, щоб відвідати GitHub профіль + pages: + previous: Попередня сторінка + next: Наступна сторінка + tooltips: + open-category: Натисніть, що відкрити + versions-notice: Це дуже важливо, коли Ви повідомляєте про помилки! + wiki: Переглянути цей предмет на офіційній Slimefun Вікі + recipes: + machine: Рецепти, доступні у цій машині + miner: Ресурси, що видобуваються цим шахтарем + generator: Доступні види палива + gold-pan: Ресурси, які Ви можете отримати + back: + title: Назад + guide: Повернутись до посібника Slimefun + settings: Повернутись до панелі налаштувань locked: ЗАКРИТО locked-category: - Для розблокування цієї категорії - спочатку відкрийте всі предмети - з категорій нижче - pages: - next: Наступна сторінка - previous: Попередня сторінка - search: - inventory: 'Пошук: %item%' - message: "&bЩо би Ви бажали знайти?" - name: "&7Пошук…" - tooltip: "&bНатисніть для пошуку предмету" - title: - addons: Доповнення до Slimefun4 - bugs: Звіти про помилки - credits: Автори Slimefun4 - languages: Виберіть бажану мову - main: Посібник Slimefun - settings: Налаштування та інформація - source: Вихідний код - wiki: Slimefun4 Вікі - tooltips: - open-category: Натисніть, що відкрити - recipes: - generator: Доступні види палива - gold-pan: Ресурси, які Ви можете отримати - machine: Рецепти, доступні у цій машині - miner: Ресурси, що видобуваються цим шахтарем - versions-notice: Це дуже важливо, коли Ви повідомляєте про помилки! - wiki: Переглянути цей предмет на офіційній Slimefun Вікі -inventory: - no-access: "&4У Вас немає доступу до цього блоку" -languages: - af: Бурська - ar: Арабська - be: Білоруська - bg: Болгарська - cs: Чеська - da: Датська - de: Німецька - default: За замовчуванням - el: Грецька - en: Англійська - es: Іспанська - fa: Перська - fi: Фінська - fr: Французька - he: Іврит - hr: Хорватська - hu: Угорська - id: Індонезійська - it: Італійська - ja: Японська - ko: Корейська - lv: Латвійська - mk: Македонська - ms: Малайська - nl: Голландська - 'no': Норвезька - pl: Польська - pt: Португальська (Португалія) - pt-BR: Португальська (Бразилія) - ro: Румунська - ru: Російська - sk: Словацька - sr: Сербська - sv: Шведська - th: Тайська - tr: Турецька - uk: Українська - vi: В’єтнамська - zh-CN: Китайська (Китай) - zh-TW: Китайська (Тайвань) -machines: - ANCIENT_ALTAR: - not-enough-pedestals: "&4Вівтар не оточений необхідною кількістю п’єдесталів &c(%pedestals% - / 8)" - unknown-catalyst: "&4Невідомий каталізатор! &cВикористовуйте правильний рецепт!" - unknown-recipe: "&4Невідомий рецепт! &cВикористовуйте правильний рецепт!" - ANCIENT_PEDESTAL: - obstructed: "&4Щось мішає! &cВпевніться, що над п’єдесталом нічого немає!" - CARGO_NODES: - must-be-placed: "&4Повинно бути розміщено на сундуку або машині!" - ELEVATOR: - click-to-teleport: "&eКлацніть &7для переміщення на цей поверх:" - current-floor: "&eВаш поверх:" - enter-name: "&7Будь ласка, введіть назву для поверху в чат. &r(кольори підтримуються!)" - named: "&2Поверх успішно названо: &r%floor%" - no-destinations: "&4Поверхи не знайдено" - pick-a-floor: "&3- Виберіть поверх -" - full-inventory: "&eВибачте, інвентар переповнено!" - GPS_CONTROL_PANEL: - title: Контрольна панель GPS - transmitters: Перегляд передавачів - waypoints: Перегляд контрольних точок - HOLOGRAM_PROJECTOR: - enter-text: "&7Будь ласка, введіть бажаний текст для голограми в чат. &r(кольори - підтримуються!)" - inventory-title: Редагування голограми - ignition-chamber-no-flint: "&cАвтоматична камера запалювання не змогла запалити - блок через відсутність запальничок." - in-use: "&cІнвентар цього блоку вже переглядає інший гравець." - pattern-not-found: "&eНа жаль, не вдалось розпізнати цей рецепт. Будь ласка, розмістіть - предмети у правильній послідовності у роздавач." - TELEPORTER: - cancelled: "&4Телепортацію відмінено!" - gui: - time: Розрахунковий час - title: Ваші контрольні точки - tooltip: Натисніть для телепортації - invulnerability: "&b&lВи отримали 30 секунд невразливості!" - teleported: "&3Телепортовано!" - teleporting: "&3Телепортація…" - unknown-material: "&eНа жаль, не вдалось розпізнати предмет у роздавачі. Будь ласка, - перепровірте предмети." - wrong-item: "&eНа жаль, не вдалось розпізнати предмет, яким Ви нажали. Провірте - рецепти та гляньте, які предмети Ви можете використовувати." - INDUSTRIAL_MINER: - no-fuel: "&cУ Вашого промислового шахтаря закінчилося пальне! Розмістіть пальне - у сундук вище." - piston-facing: "&cПоршні Вашого промислового шахтаря повинні бути направлені вгору!" - piston-space: "&cНад поршнями повинно бути повітря!" - destroyed: "&cСхоже, що Вашого промислового шахтаря було знищено." - already-running: "&cЦей промисловий шахтар вже працює!" - full-chest: "&cСундук Вашого промислового шахтаря переповнено!" - no-permission: "&4У Вас немає дозволу на використання промислового шахтаря у цьому - місці!" - finished: "&eВаш промисловий шахтар завершив роботу! Отримано руд: %ores%!" messages: - cannot-place: "&cВи не можете поставити цей блок тут!" - diet-cookie: "&eВи відчуваєте неймовірне полегшення…" + not-researched: "&4Вам бракує знань, щоб зрозуміти це" + not-enough-xp: "&4У Вас недостатньо опиту, щоб дослідити це" + unlocked: '&bВи дослідили &7"%research%"' + only-players: "&4Ця команда доступна лише для гравців" + unknown-player: "&4Невідомий гравець: &c%player%" + no-permission: "&4У Вас недостатньо прав для цього" + usage: "&4Використання: &c%usage%" + not-online: "&4%player% &cзараз не знаходиться у грі!" + not-valid-item: "&4%item% &cне є достовірним предметом!" + not-valid-amount: "&4%amount% &cне є допустимою кількістю: значення повинно бути + більшим за 0!" + given-item: '&bВам видали &a%amount% &7"%item%&7"' + give-item: '&bВи видали гравцю %player% &a%amount% &7"%item%&7"' + not-valid-research: "&4%research% &cне є правильним дослідженням!" + give-research: '&bВи видали грацю %player% дослідження &7"%research%&7"' + hungry: "&cВи занадто голодні для цього!" + mode-change: "&b%device% | Режим змінено на: &9%mode%" disabled-in-world: "&4&lЦей предмет було відключено у цьому світі" disabled-item: "&4&lЦей предмет було відключено! Де Ви змогли його надибати?" + no-tome-yourself: "&cВи не можете використати &4том обміну знаннями &cна собі…" + multimeter: "&bНакопичена електрика: &3%stored% &b/ &3%capacity%" + talisman: + anvil: "&a&oВаш талісман зберіг інструмент від поломки" + miner: "&a&oВаш талісман подвоїв Ваш дроп" + hunter: "&a&oВаш талісман подвоїв Ваш дроп" + lava: "&a&oВаш талісман врятував Вас від спалення до смерті" + water: "&a&oВаш талісман врятував Вас від утоплення" + angel: "&a&oВаш талісман пом'якшив пошкодження від падіння" + fire: "&a&oВаш талісман врятував Вас від спалення до смерті" + magician: "&a&oВаш талісман надав Вам додаткове зачарування" + traveller: "&a&oВаш талісман надав Вам швидкості" + warrior: "&a&oВаш талісман надав Вам силу на деякий час" + knight: "&a&oВаш талісман надав Вам 5 секунд регенерації" + whirlwind: "&a&oВаш талісман відобразив снаряд" + wizard: "&a&oВаш талісман покращив рівень зачарування «Вдача», але також міг погіршити + інші зачарування" + soulbound-rune: + fail: "&cВи можете прикріпити до себе лише один предмет за раз." + success: "&aВи успішно прикріпили цей предмет до себе! Він залишиться з Вами після + смерті." + research: + start: "&7Древні духи шепочуть загадкові слова в Ваше вухо!" + progress: "&7Ви починаєте задумуватись над &b%research% &e(%progress%)" fire-extinguish: "&7Ви погасили себе" + cannot-place: "&cВи не можете поставити цей блок тут!" + no-pvp: "&cВи не можете вступати в PvP тут!" + radiation: "&4Ви потрапили у дію небезпечної радіації! &cПозбавтесь радіоактивних + предметів або одягніть костюм хімзахисту!" + opening-guide: "&bВідкриваємо посібник, це може зайняти кілька секунд…" + opening-backpack: "&bВідкриваємо рюкзак, це може зайняти кілька секунд…" + no-iron-golem-heal: "&cЦей предмет не є залізним злитком. Його не можна використовувати + для лагодження залізних големів!" + link-prompt: "&eНатисніть сюди:" + diet-cookie: "&eВи відчуваєте неймовірне полегшення…" fortune-cookie: - "&7Допоможіть мені! Я у пастці на фабриці печива долі!" - "&7Завтра ти помреш… від люб’язного Кріпера" @@ -252,56 +143,170 @@ messages: - "&742. Відповідь – 42." - "&7Неприємності йдуть лісом – Walshy вже договорився з бісом." - "&7Ніколи не копайте вниз!" - give-item: '&bВи видали гравцю %player% &a%amount% &7"%item%&7"' - given-item: '&bВам видали &a%amount% &7"%item%&7"' - give-research: '&bВи видали грацю %player% дослідження &7"%research%&7"' - hungry: "&cВи занадто голодні для цього!" - link-prompt: "&eНатисніть сюди:" - mode-change: "&b%device% | Режим змінено на: &9%mode%" - multimeter: "&bНакопичена електрика: &3%stored% &b/ &3%capacity%" - no-iron-golem-heal: "&cЦей предмет не є залізним злитком. Його не можна використовувати - для лагодження залізних големів!" - no-permission: "&4У Вас недостатньо прав для цього" - no-pvp: "&cВи не можете вступати в PvP тут!" - not-enough-xp: "&4У Вас недостатньо опиту, щоб дослідити це" - no-tome-yourself: "&cВи не можете використати &4том обміну знаннями &cна собі…" - not-online: "&4%player% &cзараз не знаходиться у грі!" - not-researched: "&4Вам бракує знань, щоб зрозуміти це" - not-valid-amount: "&4%amount% &cне є допустимою кількістю: значення повинно бути - більшим за 0!" - not-valid-item: "&4%item% &cне є достовірним предметом!" - not-valid-research: "&4%research% &cне є правильним дослідженням!" - only-players: "&4Ця команда доступна лише для гравців" - opening-backpack: "&bВідкриваємо рюкзак, це може зайняти кілька секунд…" - opening-guide: "&bВідкриваємо посібник, це може зайняти кілька секунд…" - radiation: "&4Ви потрапили у дію небезпечної радіації! &cПозбавтесь радіоактивних - предметів або одягніть костюм хімзахисту!" - research: - progress: "&7Ви починаєте задумуватись над &b%research% &e(%progress%)" - start: "&7Древні духи шепочуть загадкові слова в Ваше вухо!" - soulbound-rune: - fail: "&cВи можете прикріпити до себе лише один предмет за раз." - success: "&aВи успішно прикріпили цей предмет до себе! Він залишиться з Вами після - смерті." - talisman: - angel: "&a&oВаш талісман пом'якшив пошкодження від падіння" - anvil: "&a&oВаш талісман зберіг інструмент від поломки" - fire: "&a&oВаш талісман врятував Вас від спалення до смерті" - hunter: "&a&oВаш талісман подвоїв Ваш дроп" - knight: "&a&oВаш талісман надав Вам 5 секунд регенерації" - lava: "&a&oВаш талісман врятував Вас від спалення до смерті" - magician: "&a&oВаш талісман надав Вам додаткове зачарування" - miner: "&a&oВаш талісман подвоїв Ваш дроп" - traveller: "&a&oВаш талісман надав Вам швидкості" - warrior: "&a&oВаш талісман надав Вам силу на деякий час" - water: "&a&oВаш талісман врятував Вас від утоплення" - whirlwind: "&a&oВаш талісман відобразив снаряд" - wizard: "&a&oВаш талісман покращив рівень зачарування «Вдача», але також міг погіршити - інші зачарування" - unknown-player: "&4Невідомий гравець: &c%player%" - unlocked: '&bВи дослідили &7"%research%"' - usage: "&4Використання: &c%usage%" -miner: - no-ores: "&eНа жаль, не вдалось знайти руду поблизу!" + - "&7Це лише подряпина!" + - "&7Завжди дивіться на світлу сторону життя!" + - "&7Цього разу попався бісквіт, а не печиво" + - "&7Неонові таблички просто ШИК!" +machines: + pattern-not-found: "&eНа жаль, не вдалось розпізнати цей рецепт. Будь ласка, розмістіть + предмети у правильній послідовності у роздавач." + unknown-material: "&eНа жаль, не вдалось розпізнати предмет у роздавачі. Будь ласка, + перепровірте предмети." + wrong-item: "&eНа жаль, не вдалось розпізнати предмет, яким Ви нажали. Провірте + рецепти та гляньте, які предмети Ви можете використовувати." + full-inventory: "&eВибачте, інвентар переповнено!" + in-use: "&cІнвентар цього блоку вже переглядає інший гравець." + ignition-chamber-no-flint: "&cАвтоматична камера запалювання не змогла запалити + блок через відсутність запальничок." + ANCIENT_ALTAR: + not-enough-pedestals: "&4Вівтар не оточений необхідною кількістю п’єдесталів &c(%pedestals% + / 8)" + unknown-catalyst: "&4Невідомий каталізатор! &cВикористовуйте правильний рецепт!" + unknown-recipe: "&4Невідомий рецепт! &cВикористовуйте правильний рецепт!" + ANCIENT_PEDESTAL: + obstructed: "&4Щось мішає! &cВпевніться, що над п’єдесталом нічого немає!" + HOLOGRAM_PROJECTOR: + enter-text: "&7Будь ласка, введіть бажаний текст для голограми в чат. &r(кольори + підтримуються!)" + inventory-title: Редагування голограми + ELEVATOR: + no-destinations: "&4Поверхи не знайдено" + pick-a-floor: "&3- Виберіть поверх -" + current-floor: "&eВаш поверх:" + click-to-teleport: "&eКлацніть &7для переміщення на цей поверх:" + enter-name: "&7Будь ласка, введіть назву для поверху в чат. &r(кольори підтримуються!)" + named: "&2Поверх успішно названо: &r%floor%" + TELEPORTER: + teleporting: "&3Телепортація…" + teleported: "&3Телепортовано!" + cancelled: "&4Телепортацію відмінено!" + invulnerability: "&b&lВи отримали 30 секунд невразливості!" + gui: + title: Ваші контрольні точки + tooltip: Натисніть для телепортації + time: Розрахунковий час + CARGO_NODES: + must-be-placed: "&4Повинно бути розміщено на сундуку або машині!" + GPS_CONTROL_PANEL: + title: Контрольна панель GPS + transmitters: Перегляд передавачів + waypoints: Перегляд контрольних точок + INDUSTRIAL_MINER: + no-fuel: "&cУ Вашого промислового шахтаря закінчилося пальне! Розмістіть пальне + у сундук вище." + piston-facing: "&cПоршні Вашого промислового шахтаря повинні бути направлені вгору!" + piston-space: "&cНад поршнями повинно бути повітря!" + destroyed: "&cСхоже, що Вашого промислового шахтаря було знищено." + already-running: "&cЦей промисловий шахтар вже працює!" + full-chest: "&cСундук Вашого промислового шахтаря переповнено!" + no-permission: "&4У Вас немає дозволу на використання промислового шахтаря у цьому + місці!" + finished: "&eВаш промисловий шахтар завершив роботу! Отримано руд: %ores%!" +anvil: + not-working: "&4Ви не можете використовувати Slimefun предмети в наковальні!" +backpack: + already-open: "&cВибачте, цей рюкзак уже відкрито в іншому місці!" + no-stack: "&cВи не можете складати рюкзаки разом" workbench: not-enhanced: "&4Ви не можете використовувати Slimefun предмети в звичайному верстаку" +gps: + deathpoint: "&4Точка смерті &7%date%" + waypoint: + new: "&eБудь ласка, введіть назву для контрольної точки в чат. &7(кольори підтримуються!)" + added: "&aКонтрольну точку успішно додано" + max: "&4Ви досягли максимальної кількості контрольних точок" + insufficient-complexity: + - "&4Недостатня загальна сила GPS мережі: &c%complexity%" + - "&4а) Ваша GPS мережа ще не під’эднана" + - "&4б) У Вашої GPS мережі недостатня сила сигналу" + geo: + scan-required: "&4Необхідне геосканування! &cПроскануйте цей чанк геосканером + спочатку!" +inventory: + no-access: "&4У Вас немає доступу до цього блоку" +android: + started: "&7Ваш Андроїд продовжив виконання свого скрипту" + stopped: "&7Ваш Андроїд призупинив виконання свого скрипту" + scripts: + already-uploaded: "&4Цей скрипт вже було завантажено." + instructions: + START: "&2Розпочати виконання скрипту" + REPEAT: "&9Повторити виконання скрипту" + WAIT: "&eЗачекати 0.5с" + GO_FORWARD: "&7Рушити вперед" + GO_UP: "&7Рушити вгору" + GO_DOWN: "&7Рушити вниз" + TURN_LEFT: "&7Повернутись наліво" + TURN_RIGHT: "&7Повернутись направо" + DIG_UP: "&bКопнути вгору" + DIG_FORWARD: "&bКопнути вперед" + DIG_DOWN: "&bКопнути вниз" + MOVE_AND_DIG_UP: "&bРушити та копнути вверх" + MOVE_AND_DIG_FORWARD: "&bРушити та копнути вперед" + MOVE_AND_DIG_DOWN: "&bРушити та копнути вниз" + ATTACK_MOBS_ANIMALS: "&4Атакувати &c(ворожі моби та тварини)" + ATTACK_MOBS: "&4Атакувати &c(ворожі моби)" + ATTACK_ANIMALS: "&4Атакувати &c(тварини)" + ATTACK_ANIMALS_ADULT: "&4Атакувати &c(тварини &7[дорослі]&c)" + CHOP_TREE: "&cЗрубати та пересадити" + CATCH_FISH: "&bВиловити рибу" + FARM_FORWARD: "&bЗібрати врожай та пересадити" + FARM_DOWN: "&bЗібрати врожай та пересадити &7(блок знизу)" + FARM_EXOTIC_FORWARD: "&bПрогресивне збирання врожаю та пересадка" + FARM_EXOTIC_DOWN: "&bПрогресивне збирання врожаю та пересадка &7(блок знизу)" + INTERFACE_ITEMS: "&9Скласти збережені предмети в сховище спереду" + INTERFACE_FUEL: "&cПоповнити запаси палива зі сховища спереду" + enter-name: + - + - "&eБудь ласка, введіть назву для Вашого скрипту" + uploaded: + - "&bЗавантаження…" + - "&aВаш скрипт успішно завантажено!" + rating: + own: "&4Ви не можете оцінити власний скрипт!" + already: "&4Ви вже оцінили цей скрипт!" + editor: Редактор скриптів +languages: + default: За замовчуванням + en: Англійська + de: Німецька + fr: Французька + it: Італійська + es: Іспанська + pl: Польська + sv: Шведська + nl: Голландська + cs: Чеська + hu: Угорська + lv: Латвійська + ru: Російська + sk: Словацька + zh-TW: Китайська (Тайвань) + vi: В’єтнамська + id: Індонезійська + zh-CN: Китайська (Китай) + el: Грецька + he: Іврит + pt: Португальська (Португалія) + pt-BR: Португальська (Бразилія) + ar: Арабська + af: Бурська + da: Датська + fi: Фінська + uk: Українська + ms: Малайська + 'no': Норвезька + ja: Японська + fa: Перська + th: Тайська + ro: Румунська + bg: Болгарська + ko: Корейська + tr: Турецька + hr: Хорватська + mk: Македонська + sr: Сербська + be: Білоруська + tl: Тагальська +miner: + no-ores: "&eНа жаль, не вдалось знайти руду поблизу!" From ca73b4a89170a780a0f156fb062831fee99e7aa2 Mon Sep 17 00:00:00 2001 From: SoSeDiK Date: Fri, 26 Jun 2020 08:53:54 +0000 Subject: [PATCH 11/31] Translate recipes_uk.yml via GitLocalize --- src/main/resources/languages/recipes_uk.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/resources/languages/recipes_uk.yml b/src/main/resources/languages/recipes_uk.yml index 2e5821c9f..735980ba8 100644 --- a/src/main/resources/languages/recipes_uk.yml +++ b/src/main/resources/languages/recipes_uk.yml @@ -156,3 +156,8 @@ minecraft: lore: - Цей предмет створюється - у камнерізі + smithing: + name: Верстат коваля + lore: + - Цей предмет створюється + - на верстаті коваля From 6ab2b34a83bf166c26ac0a280137061c0e881b58 Mon Sep 17 00:00:00 2001 From: SoSeDiK Date: Fri, 26 Jun 2020 08:53:56 +0000 Subject: [PATCH 12/31] Translate researches_uk.yml via GitLocalize --- .../resources/languages/researches_uk.yml | 422 +++++++++--------- 1 file changed, 212 insertions(+), 210 deletions(-) diff --git a/src/main/resources/languages/researches_uk.yml b/src/main/resources/languages/researches_uk.yml index c74ca85b2..3335c3996 100644 --- a/src/main/resources/languages/researches_uk.yml +++ b/src/main/resources/languages/researches_uk.yml @@ -1,236 +1,238 @@ --- slimefun: - 24k_gold_block: "«Ельдорадо»" - advanced_android: Просунуті Андроїди - advanced_butcher_android: Просунутий Андроїд-м’ясник - advanced_circuit_board: Друкована плата - advanced_electric_smeltery: Модернізована електрична плавильня - advanced_farmer_android: Покращений Андроїд-фермер - advanced_fisherman_android: Просунутий Андроїд-рибалка - advanced_output_node: Просунутий вантажний вузол - alloys: Передові сплави - ancient_altar: Стародавній вівтар - ancient_runes: Стихійні руни - android_interfaces: Андроїд-інтерфейси - android_memory_core: Ядро пам’яті - angel_talisman: Талісман ангела - animal_growth_accelerator: Прискорювач росту тварин - anvil_talisman: Талісман коваля - armored_jetboots: Броньовані реактивні черевики - armored_jetpack: Броньований реактивний ранець + walking_sticks: Мої улюблені палиці + portable_crafter: Портативний крафтер + fortune_cookie: Печиво долі + portable_dustbin: Портативна мусорка + meat_jerky: В’ялене м’ясо armor_forge: Виготовлення обладунків - auto_anvil: Автоматизоване ковадло - auto_breeder: Автоматизоване розмноження - auto_drier: "«День сушки»" - auto_enchanting: Автоматизоване зачарування та розчарування - automated_crafting_chamber: Автоматизований крафт - automated_panning_machine: Автоматизована машина для очищення руди - automatic_ignition_chamber: Автоматизована камера запалювання - backpacks: Рюкзаки + glowstone_armor: Сяюча броня + lumps: Уламки Незеру та Енду + ender_backpack: Ендер-рюкзак + ender_armor: Ендер-броня + magic_eye_of_ender: Магічне око Енду + magic_sugar: Чарівний цукор + monster_jerky: В’ялена плоть + slime_armor: Слизова броня + sword_of_beheading: Меч обезголовлювання basic_circuit_board: Монтажна плата + advanced_circuit_board: Друкована плата + smeltery: Плавильня + steel: Сталевий вік + misc_power_items: Важливі ресурси для підтримання електромережі battery: Ваша перша батарея - better_carbon_press: Модернізований вуглецевий прес - better_crop_growth_accelerator: Модернізований прискорювач росту рослин - better_electric_crucibles: Гарячі тиглі - better_electric_furnace: Модернізована електрична піч - better_food_fabricator: Покращена харчова фабрика - better_freezer: Покращена морозилка - better_gps_transmitters: Модернізовані передавачі - better_heated_pressure_chamber: Модернізована обігріваюча барокамера - better_solar_generators: Модернізовані сонячні генератори - bio_reactor: Біореактор - blade_of_vampires: Вампірський клинок - blistering_ingots: Розпечені злитки - block_placer: Розміщувач блоків - boosted_uranium: "«Замкнуте коло»" - boots_of_the_stomper: Чобітки мандрівника - bound_armor: Персональна броня - bound_backpack: Персональне сховище - bound_tools: Персональні інструменти - bound_weapons: Персональна зброя - bronze: Створення бронзи - butcher_androids: Андроїд-м’ясник + steel_plate: Сталеве покриття + steel_thruster: Сталевий прискорювач + parachute: Парашут + grappling_hook: Крюк-кішка + jetpacks: Реактивні ранці + multitools: Мультиприбори + solar_panel_and_helmet: Сонячна енергія + elemental_staff: Стихійні посохи + grind_stone: Точильний камінь cactus_armor: Кактусовий костюм - capacitors: Маленький накопичувач енергії - carbonado: Карбонад - carbonado_furnace: Піч-карбонадо - carbonado_tools: Високорівневі машини - carbon_press: Вуглецевий прес - cargo_basics: Основи вантажної мережі - cargo_nodes: Налаштування вантажної мережі - chainmail_armor: Кольчужна броня - charging_bench: Зарядний пристрій-верстак - coal_generator: Вугільний генератор - cobalt_pickaxe: Кобальтове кайло - combustion_reactor: Реактор внутрішнього згоряння - common_talisman: Звичайний талісман - composter: Компостування бруду + gold_pan: Рудопромивочний лоток + magical_book_cover: Обкладинка магічної книги + slimefun_metals: Нові метали + ore_crusher: Руйнівник руд + bronze: Створення бронзи + alloys: Передові сплави compressor_and_carbon: Створення вуглецю - cooler: "«Переносний холодильник»" - copper_wire: Мідний дріт - crop_growth_accelerator: Прискорення росту рослин - crucible: Тигель - crushed_ore: Очищення руди + gilded_iron_armor: Позолочені залізні обладунки + synthetic_diamond: Синтезований діамант + pressure_chamber: Барокамера + synthetic_sapphire: Синтетичні сапфіри damascus_steel: Злиток дамаської сталі damascus_steel_armor: Обладунки з дамаської сталі - diet_cookie: Дієтичне печиво - duct_tape: Скотч - electric_crucible: Електричний тигель - electric_furnaces: Електрична піч - electric_ingot_machines: Електричний завод злитків + reinforced_alloy: Армований сплав + carbonado: Карбонад + magic_workbench: Магічний верстак + wind_staff: Посох вітрів + reinforced_armor: Армована броня + ore_washer: Очищувач руд + gold_carats: Чисте золото + silicon: Силіконова долина + fire_staff: Посох полум'я + smelters_pickaxe: Плазмове кайло + common_talisman: Звичайний талісман + anvil_talisman: Талісман коваля + miner_talisman: Талісман шахтаря + hunter_talisman: Талісман мисливця + lava_talisman: Талісман підкорювача лави + water_talisman: Талісман підкорювача води + angel_talisman: Талісман ангела + fire_talisman: Талісман пожежного + lava_crystal: "«Вогняна ситуація»" + magician_talisman: Талісман мага + traveller_talisman: Талісман мандрівника + warrior_talisman: Талісман воїна + knight_talisman: Талісман лицаря + gilded_iron: "«Блискуче залізо»" + synthetic_emerald: Фальшивий смарагд + chainmail_armor: Кольчужна броня + whirlwind_talisman: Талісман вихору + wizard_talisman: Талісман чарівника + lumber_axe: Сокира дроворуба + hazmat_suit: Костюм хімзахисту + uranium: Радіоактивність + crushed_ore: Очищення руди + redstone_alloy: Редстоуновий сплав + carbonado_tools: Високорівневі машини + first_aid: Перша допомога + gold_armor: "«Блискучі обладунки»" + night_vision_googles: Пристрій нічного бачення + pickaxe_of_containment: Кайло стримування + hercules_pickaxe: Геркулесове кайло + table_saw: Лісопилка + slime_steel_armor: Слизові сталеві обладунки + blade_of_vampires: Вампірський клинок + water_staff: Посох морів + 24k_gold_block: "«Ельдорадо»" + composter: Компостування бруду + farmer_shoes: Фермерські черевики + explosive_tools: Вибухові інструменти + automated_panning_machine: Автоматизована машина для очищення руди + boots_of_the_stomper: Чобітки мандрівника + pickaxe_of_the_seeker: Кайло шукача + backpacks: Рюкзаки + woven_backpack: Тканевий рюкзак + crucible: Тигель + gilded_backpack: Позолочений рюкзак + armored_jetpack: Броньований реактивний ранець + ender_talismans: Ендер-талісмани + nickel_and_cobalt: Навіть більше руд! + magnet: Магнітні метали + infused_magnet: Магніт? + cobalt_pickaxe: Кобальтове кайло + essence_of_afterlife: Некромантія + bound_backpack: Персональне сховище + jetboots: Реактивні черевики + armored_jetboots: Броньовані реактивні черевики + seismic_axe: Сейсмічна сокира + pickaxe_of_vein_mining: Кайло жильного копання + bound_weapons: Персональна зброя + bound_tools: Персональні інструменти + bound_armor: Персональна броня + juicer: Смачні напої + repaired_spawner: Ремонт спавнерів + enhanced_furnace: Просунута піч + more_enhanced_furnaces: Покращені печі + high_tier_enhanced_furnaces: Високорівнева піч + reinforced_furnace: Посилена піч + carbonado_furnace: Піч-карбонадо electric_motor: "«Нагрів»" + block_placer: Розміщувач блоків + scroll_of_dimensional_teleposition: Поворот речей навколо + special_bows: "«Робін Гуд»" + tome_of_knowledge_sharing: Поділитися з ближніми + flask_of_knowledge: Сховище досвіду + hardened_glass: Підкорення вибухів + golden_apple_juice: "«Золоте зілля»" + cooler: "«Переносний холодильник»" + ancient_altar: Стародавній вівтар + wither_proof_obsidian: Візеростійкий обсидіан + ancient_runes: Стихійні руни + special_runes: Особливі руни + infernal_bonemeal: Пекельне кісткове бодошно + rainbow_blocks: Райдужні блоки + infused_hopper: Заряджена воронка + wither_proof_glass: Візеростійке скло + duct_tape: Скотч + plastic_sheet: Пластик + android_memory_core: Ядро пам’яті + oil: Нафта! + fuel: Паливо + hologram_projector: ГоЛоГрАмИ + capacitors: Маленький накопичувач енергії + high_tier_capacitors: Середній накопичувач енергії + solar_generators: Сонячна електростанція + electric_furnaces: Електрична піч electric_ore_grinding: Дроблення і розпорошення - electric_press: Електричний прес - electric_smeltery: Електрична плавильня - elemental_staff: Стихійні посохи + heated_pressure_chamber: Отеплювальна барокамера + coal_generator: Вугільний генератор + bio_reactor: Біореактор + auto_enchanting: Автоматизоване зачарування та розчарування + auto_anvil: Автоматизоване ковадло + multimeter: Вимірювання потужності + gps_setup: Базова GPS установка + gps_emergency_transmitter: GPS аварійний пункт + programmable_androids: Програмовані Андроїди + android_interfaces: Андроїд-інтерфейси + geo_scanner: Геосканування + combustion_reactor: Реактор внутрішнього згоряння + teleporter: Базові компоненти телепортера + teleporter_activation_plates: Активація телепортера + better_solar_generators: Модернізовані сонячні генератори + better_gps_transmitters: Модернізовані передавачі elevator: Ліфтові плити - elytra: Елітри + energized_solar_generator: Сонячна енергія цілодобово! + energized_gps_transmitter: Високорівневий передавач + energy_regulator: Електричні мережі + butcher_androids: Андроїд-м’ясник + organic_food: Органічна їжа + auto_breeder: Автоматизоване розмноження + advanced_android: Просунуті Андроїди + advanced_butcher_android: Просунутий Андроїд-м’ясник + advanced_fisherman_android: Просунутий Андроїд-рибалка + animal_growth_accelerator: Прискорювач росту тварин + xp_collector: Збирач досвіду + organic_fertilizer: Органічні добрива + crop_growth_accelerator: Прискорення росту рослин + better_crop_growth_accelerator: Модернізований прискорювач росту рослин + reactor_essentials: Реакторні основи + nuclear_reactor: Атомна електростанція + freezer: Морозилка + cargo_basics: Основи вантажної мережі + cargo_nodes: Налаштування вантажної мережі + electric_ingot_machines: Електричний завод злитків + high_tier_electric_ingot_machines: Надшвидкий електричний завод злитків + automated_crafting_chamber: Автоматизований крафт + better_food_fabricator: Покращена харчова фабрика + reactor_access_port: Порт доступу до реактора + fluid_pump: Рідинний насос + better_freezer: Покращена морозилка + boosted_uranium: "«Замкнуте коло»" + trash_can: Смітник + advanced_output_node: Просунутий вантажний вузол + carbon_press: Вуглецевий прес + electric_smeltery: Електрична плавильня + better_electric_furnace: Модернізована електрична піч + better_carbon_press: Модернізований вуглецевий прес empowered_android: Посилені Андроїди empowered_butcher_android: Посилений Андроїд-м’ясник empowered_fisherman_android: Посилений Андроїд-рибалка - ender_armor: Ендер-броня - ender_backpack: Ендер-рюкзак - ender_talismans: Ендер-талісмани - energized_gps_transmitter: Високорівневий передавач - energized_solar_generator: Сонячна енергія цілодобово! - energy_regulator: Електричні мережі - enhanced_furnace: Просунута піч - essence_of_afterlife: Некромантія - explosive_tools: Вибухові інструменти - farmer_shoes: Фермерські черевики - fire_staff: Посох полум'я - fire_talisman: Талісман пожежного - first_aid: Перша допомога - flask_of_knowledge: Сховище досвіду - fluid_pump: Рідинний насос - fortune_cookie: Печиво долі - freezer: Морозилка - fuel: Паливо - geo_miner: Геокопач - geo_scanner: Геосканування - gilded_backpack: Позолочений рюкзак - gilded_iron: "«Блискуче залізо»" - gilded_iron_armor: Позолочені залізні обладунки - glowstone_armor: Сяюча броня - gold_armor: "«Блискучі обладунки»" - gold_carats: Чисте золото - golden_apple_juice: "«Золоте зілля»" - gold_pan: Рудопромивочний лоток - gps_emergency_transmitter: GPS аварійний пункт - gps_setup: Базова GPS установка - grappling_hook: Крюк-кішка - grind_stone: Точильний камінь - hardened_glass: Підкорення вибухів - hazmat_suit: Костюм хімзахисту - heated_pressure_chamber: Отеплювальна барокамера - hercules_pickaxe: Геркулесове кайло - high_tier_capacitors: Середній накопичувач енергії high_tier_carbon_press: Високорівневий вуглецевий прес - high_tier_electric_ingot_machines: Надшвидкий електричний завод злитків - high_tier_enhanced_furnaces: Високорівнева піч - hologram_projector: ГоЛоГрАмИ - hunter_talisman: Талісман мисливця - infernal_bonemeal: Пекельне кісткове бодошно - infused_hopper: Заряджена воронка - infused_magnet: Магніт? - jetboots: Реактивні черевики - jetpacks: Реактивні ранці - juicer: Смачні напої - kelp_cookie: Смачна водорість - knight_talisman: Талісман лицаря - lava_crystal: "«Вогняна ситуація»" + wither_assembler: Створювач Висушувачів + better_heated_pressure_chamber: Модернізована обігріваюча барокамера + elytra: Елітри + special_elytras: Особливі елітри + electric_crucible: Електричний тигель + better_electric_crucibles: Гарячі тиглі + advanced_electric_smeltery: Модернізована електрична плавильня + advanced_farmer_android: Покращений Андроїд-фермер lava_generator: Лавовий генератор - lava_talisman: Талісман підкорювача лави - lightning_rune: Блискавична руна - lumber_axe: Сокира дроворуба - lumps: Уламки Незеру та Енду - magical_book_cover: Обкладинка магічної книги - magic_eye_of_ender: Магічне око Енду - magician_talisman: Талісман мага - magic_sugar: Чарівний цукор - magic_workbench: Магічний верстак - magnesium_generator: Магнієва підпитка - magnet: Магнітні метали - makeshift_smeltery: Імпровізована плавильня - meat_jerky: В’ялене м’ясо - miner_talisman: Талісман шахтаря - misc_power_items: Важливі ресурси для підтримання електромережі - monster_jerky: В’ялена плоть - more_enhanced_furnaces: Покращені печі - multimeter: Вимірювання потужності - multitools: Мультиприбори - nether_gold_pan: Пекельний рудопромивочний лоток nether_ice: Пекельний холодоагент nether_star_reactor: Пекельно-зірковий реактор - nickel_and_cobalt: Навіть більше руд! - night_vision_googles: Пристрій нічного бачення - nuclear_reactor: Атомна електростанція - oil: Нафта! - ore_crusher: Руйнівник руд - ore_washer: Очищувач руд - organic_fertilizer: Органічні добрива - organic_food: Органічна їжа + blistering_ingots: Розпечені злитки + automatic_ignition_chamber: Автоматизована камера запалювання output_chest: Вихідна скриня - parachute: Парашут - pickaxe_of_containment: Кайло стримування - pickaxe_of_the_seeker: Кайло шукача - pickaxe_of_vein_mining: Кайло жильного копання - plastic_sheet: Пластик - portable_crafter: Портативний крафтер - portable_dustbin: Портативна мусорка - pressure_chamber: Барокамера - programmable_androids: Програмовані Андроїди + copper_wire: Мідний дріт radiant_backpack: Рюкзак мандрівника - rainbow_blocks: Райдужні блоки - reactor_access_port: Порт доступу до реактора - reactor_essentials: Реакторні основи - redstone_alloy: Редстоуновий сплав - reinforced_alloy: Армований сплав - reinforced_armor: Армована броня - reinforced_furnace: Посилена піч - repaired_spawner: Ремонт спавнерів - scroll_of_dimensional_teleposition: Поворот речей навколо - seismic_axe: Сейсмічна сокира - silicon: Силіконова долина - slime_armor: Слизова броня - slimefun_metals: Нові метали - slime_steel_armor: Слизові сталеві обладунки - smelters_pickaxe: Плазмове кайло - smeltery: Плавильня - solar_generators: Сонячна електростанція - solar_panel_and_helmet: Сонячна енергія - soulbound_rune: Персональна руна - special_bows: "«Робін Гуд»" - special_elytras: Особливі елітри - special_runes: Особливі руни - steel: Сталевий вік - steel_plate: Сталеве покриття - steel_thruster: Сталевий прискорювач + auto_drier: "«День сушки»" + diet_cookie: Дієтичне печиво storm_staff: Штормовий посох - sword_of_beheading: Меч обезголовлювання - synthetic_diamond: Синтезований діамант - synthetic_emerald: Фальшивий смарагд - synthetic_sapphire: Синтетичні сапфіри - table_saw: Лісопилка - teleporter: Базові компоненти телепортера - teleporter_activation_plates: Активація телепортера - tome_of_knowledge_sharing: Поділитися з ближніми + soulbound_rune: Персональна руна + geo_miner: Геокопач + lightning_rune: Блискавична руна totem_of_undying: Тотем безсмертя - trash_can: Смітник - traveller_talisman: Талісман мандрівника + charging_bench: Зарядний пристрій-верстак + nether_gold_pan: Пекельний рудопромивочний лоток + electric_press: Електричний прес + magnesium_generator: Магнієва підпитка + kelp_cookie: Смачна водорість + makeshift_smeltery: Імпровізована плавильня tree_growth_accelerator: Швидкорослі дерева - uranium: Радіоактивність - walking_sticks: Мої улюблені палиці - warrior_talisman: Талісман воїна - water_staff: Посох морів - water_talisman: Талісман підкорювача води - whirlwind_talisman: Талісман вихору - wind_staff: Посох вітрів - wither_assembler: Створювач Висушувачів - wither_proof_glass: Візеростійке скло - wither_proof_obsidian: Візеростійкий обсидіан - wizard_talisman: Талісман чарівника - woven_backpack: Тканевий рюкзак - xp_collector: Збирач досвіду industrial_miner: Промисловий видобуток advanced_industrial_miner: Покращений видобуток + magical_zombie_pills: Дезомбіфікація + auto_brewer: Промислова пивоварня From 6ffa5ab9a7d42e1cb40b2d56720f41564198bc58 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Fri, 26 Jun 2020 15:32:57 +0200 Subject: [PATCH 13/31] Lots of refactoring and rewriting of Item Energy --- CHANGELOG.md | 1 + .../core/attributes/Rechargeable.java | 145 ++++++++++++++++++ .../core/attributes/RechargeableHelper.java | 73 +++++++++ .../items/electric/gadgets/JetBoots.java | 14 +- .../items/electric/gadgets/Jetpack.java | 14 +- .../items/electric/gadgets/MultiTool.java | 21 +-- .../items/electric/gadgets/SolarHelmet.java | 36 ++++- .../items/electric/machines/AutoBrewer.java | 28 ++-- .../electric/machines/ChargingBench.java | 39 +++-- .../listeners/GadgetsListener.java | 4 +- .../setup/SlimefunItemSetup.java | 57 ++++--- .../implementation/tasks/ArmorTask.java | 16 +- .../implementation/tasks/JetBootsTask.java | 27 ++-- .../implementation/tasks/JetpackTask.java | 22 +-- .../slimefun4/utils/NumberUtils.java | 4 + .../Objects/SlimefunItem/ChargableItem.java | 20 ++- .../Objects/SlimefunItem/SlimefunItem.java | 7 +- .../Slimefun/api/energy/ItemEnergy.java | 9 ++ 18 files changed, 417 insertions(+), 120 deletions(-) create mode 100644 src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/Rechargeable.java create mode 100644 src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/RechargeableHelper.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 517599a59..595dcb80f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,7 @@ * items which cannot be distributed by a Cargo Net will be dropped on the ground now instead of getting deleted * Small performance improvements to the Cargo Net * Slimefun no longer supports CraftBukkit +* Item Energy is now also stored persistently via NBT #### Fixes * Fixed #2005 diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/Rechargeable.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/Rechargeable.java new file mode 100644 index 000000000..73205a28d --- /dev/null +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/Rechargeable.java @@ -0,0 +1,145 @@ +package io.github.thebusybiscuit.slimefun4.core.attributes; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import io.github.thebusybiscuit.slimefun4.core.networks.energy.EnergyNet; +import io.github.thebusybiscuit.slimefun4.implementation.items.electric.gadgets.Jetpack; +import io.github.thebusybiscuit.slimefun4.implementation.items.electric.gadgets.MultiTool; +import io.github.thebusybiscuit.slimefun4.implementation.items.electric.machines.ChargingBench; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; + +/** + * A {@link Rechargeable} {@link SlimefunItem} can hold energy and is able to + * be recharged using a {@link ChargingBench}. + * Any {@link SlimefunItem} which is supposed to be chargeable must implement this interface. + * + * @author TheBusyBiscuit + * + * @see ChargingBench + * @see EnergyNet + * @see Jetpack + * @see MultiTool + * + */ +@FunctionalInterface +public interface Rechargeable extends ItemAttribute { + + /** + * This method returns the maximum charge the given {@link ItemStack} is capable of holding. + * + * @param item + * The {@link ItemStack} for which to determine the maximum charge + * + * @return The maximum energy charge for this {@link ItemStack} + */ + float getMaxItemCharge(ItemStack item); + + /** + * This method sets the stored energy charge for a given {@link ItemStack}. + * The charge must be at least zero and at most {@link #getMaxItemCharge(ItemStack)}. + * + * @param item + * The {@link ItemStack} to charge + * @param charge + * The amount of charge to store + */ + default void setItemCharge(ItemStack item, float charge) { + if (item == null || item.getType() == Material.AIR) { + throw new IllegalArgumentException("Cannot set an Item charge for null or air"); + } + + float maximum = getMaxItemCharge(item); + + if (charge <= 0 || charge >= maximum) { + throw new IllegalArgumentException("Charge must be between zero and " + maximum + "."); + } + + ItemMeta meta = item.getItemMeta(); + RechargeableHelper.setCharge(meta, charge, maximum); + item.setItemMeta(meta); + } + + /** + * This method returns the currently stored energy charge on the provided {@link ItemStack}. + * + * @param item + * The {@link ItemStack} to get the charge from + * + * @return The charge stored on this {@link ItemStack} + */ + default float getItemCharge(ItemStack item) { + if (item == null || item.getType() == Material.AIR || !item.hasItemMeta()) { + throw new IllegalArgumentException("Cannot get the Item charge for invalid items (null, air or no ItemMeta)"); + } + + return RechargeableHelper.getCharge(item.getItemMeta()); + } + + /** + * This method adds the given charge to the provided {@link ItemStack}. + * The method will also return whether this operation was successful. + * If the {@link ItemStack} is already at maximum charge, the method will return false. + * + * @param item + * The {@link ItemStack} to charge + * @param charge + * The amount of charge to add + * + * @return Whether the given charge could be added successfully + */ + default boolean addItemCharge(ItemStack item, float charge) { + if (item == null || item.getType() == Material.AIR || !item.hasItemMeta()) { + throw new IllegalArgumentException("Cannot add Item charge for invalid items (null, air or no ItemMeta)"); + } + + ItemMeta meta = item.getItemMeta(); + float currentCharge = RechargeableHelper.getCharge(meta); + float maximum = getMaxItemCharge(item); + + // If the item is already fully charged, we abort. + if (currentCharge >= maximum) { + return false; + } + + float newCharge = Math.min(currentCharge + charge, maximum); + RechargeableHelper.setCharge(meta, newCharge, maximum); + + item.setItemMeta(meta); + return true; + } + + /** + * This method removes the given charge to the provided {@link ItemStack}. + * The method will also return whether this operation was successful. + * If the {@link ItemStack} does not have enough charge, the method will return false. + * + * @param item + * The {@link ItemStack} to remove the charge from + * @param charge + * The amount of charge to remove + * + * @return Whether the given charge could be removed successfully + */ + default boolean removeItemCharge(ItemStack item, float charge) { + if (item == null || item.getType() == Material.AIR || !item.hasItemMeta()) { + throw new IllegalArgumentException("Cannot remove Item charge for invalid items (null, air or no ItemMeta)"); + } + + ItemMeta meta = item.getItemMeta(); + float currentCharge = RechargeableHelper.getCharge(meta); + + // If the item does not have enough charge, we abort + if (currentCharge < charge) { + return false; + } + + float newCharge = Math.max(currentCharge - charge, 0); + RechargeableHelper.setCharge(meta, newCharge, getMaxItemCharge(item)); + + item.setItemMeta(meta); + return true; + } + +} diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/RechargeableHelper.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/RechargeableHelper.java new file mode 100644 index 000000000..e4bd282d1 --- /dev/null +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/RechargeableHelper.java @@ -0,0 +1,73 @@ +package io.github.thebusybiscuit.slimefun4.core.attributes; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; + +import org.bukkit.NamespacedKey; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataType; + +import io.github.thebusybiscuit.cscorelib2.chat.ChatColors; +import io.github.thebusybiscuit.slimefun4.api.MinecraftVersion; +import io.github.thebusybiscuit.slimefun4.utils.PatternUtils; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; + +/** + * This is just a simple helper class to provide static methods to the {@link Rechargeable} + * interface. + * + * @author TheBusyBiscuit + * + * @see Rechargeable + * + */ +final class RechargeableHelper { + + private static final NamespacedKey CHARGE_KEY = new NamespacedKey(SlimefunPlugin.instance, "item_charge"); + private static final String LORE_PREFIX = ChatColors.color("&c&o&8\u21E8 &e\u26A1 &7"); + + private RechargeableHelper() {} + + static void setCharge(ItemMeta meta, float charge, float capacity) { + BigDecimal decimal = BigDecimal.valueOf(charge).setScale(2, RoundingMode.HALF_UP); + float value = decimal.floatValue(); + + if (SlimefunPlugin.getMinecraftVersion().isAtLeast(MinecraftVersion.MINECRAFT_1_14)) { + meta.getPersistentDataContainer().set(CHARGE_KEY, PersistentDataType.FLOAT, value); + } + + List lore = meta.getLore(); + for (int i = 0; i < lore.size(); i++) { + String line = lore.get(i); + + if (line.startsWith(LORE_PREFIX)) { + lore.set(i, LORE_PREFIX + value + " / " + capacity + " J"); + meta.setLore(lore); + return; + } + } + } + + static float getCharge(ItemMeta meta) { + if (SlimefunPlugin.getMinecraftVersion().isAtLeast(MinecraftVersion.MINECRAFT_1_14)) { + Float value = meta.getPersistentDataContainer().get(CHARGE_KEY, PersistentDataType.FLOAT); + + // If no persistent data exists, we will just fall back to the lore + if (value != null) { + return value; + } + } + + if (meta.hasLore()) { + for (String line : meta.getLore()) { + if (line.startsWith(LORE_PREFIX) && line.contains(" / ") && line.endsWith(" J")) { + return Float.parseFloat(PatternUtils.SLASH_SEPARATOR.split(line)[0].replace(LORE_PREFIX, "")); + } + } + } + + return 0; + } + +} diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/JetBoots.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/JetBoots.java index 8b1a62c48..a28dc115a 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/JetBoots.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/JetBoots.java @@ -2,23 +2,31 @@ package io.github.thebusybiscuit.slimefun4.implementation.items.electric.gadgets import org.bukkit.inventory.ItemStack; +import io.github.thebusybiscuit.slimefun4.core.attributes.Rechargeable; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.ChargableItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; -public class JetBoots extends ChargableItem { +public class JetBoots extends SlimefunItem implements Rechargeable { private final double speed; + private final float capacity; - public JetBoots(Category category, SlimefunItemStack item, ItemStack[] recipe, double speed) { + public JetBoots(Category category, SlimefunItemStack item, ItemStack[] recipe, double speed, float capacity) { super(category, item, RecipeType.ENHANCED_CRAFTING_TABLE, recipe); this.speed = speed; + this.capacity = capacity; } public double getSpeed() { return speed; } + @Override + public float getMaxItemCharge(ItemStack item) { + return capacity; + } + } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/Jetpack.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/Jetpack.java index 0e59465bf..9131a16c5 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/Jetpack.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/Jetpack.java @@ -2,23 +2,31 @@ package io.github.thebusybiscuit.slimefun4.implementation.items.electric.gadgets import org.bukkit.inventory.ItemStack; +import io.github.thebusybiscuit.slimefun4.core.attributes.Rechargeable; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.ChargableItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; -public class Jetpack extends ChargableItem { +public class Jetpack extends SlimefunItem implements Rechargeable { private final double thrust; + private final float capacity; - public Jetpack(Category category, SlimefunItemStack item, ItemStack[] recipe, double thrust) { + public Jetpack(Category category, SlimefunItemStack item, ItemStack[] recipe, double thrust, float capacity) { super(category, item, RecipeType.ENHANCED_CRAFTING_TABLE, recipe); this.thrust = thrust; + this.capacity = capacity; } public double getThrust() { return thrust; } + @Override + public float getMaxItemCharge(ItemStack item) { + return capacity; + } + } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/MultiTool.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/MultiTool.java index 33469534e..9fd98d226 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/MultiTool.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/MultiTool.java @@ -10,29 +10,36 @@ import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import io.github.thebusybiscuit.slimefun4.core.attributes.Rechargeable; import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.ChargableItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler; import me.mrCookieSlime.Slimefun.Objects.handlers.ItemUseHandler; import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; -import me.mrCookieSlime.Slimefun.api.energy.ItemEnergy; -public class MultiTool extends ChargableItem { +public class MultiTool extends SlimefunItem implements Rechargeable { private static final float COST = 0.3F; private final Map selectedMode = new HashMap<>(); private final List modes = new ArrayList<>(); + private final float capacity; - public MultiTool(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe, String... items) { + public MultiTool(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe, float capacity, String... items) { super(category, item, recipeType, recipe); for (int i = 0; i < items.length; i++) { modes.add(new MultiToolMode(this, i, items[i])); } + + this.capacity = capacity; + } + + @Override + public float getMaxItemCharge(ItemStack item) { + return capacity; } protected ItemUseHandler getItemUseHandler() { @@ -44,11 +51,7 @@ public class MultiTool extends ChargableItem { int index = selectedMode.getOrDefault(p.getUniqueId(), 0); if (!p.isSneaking()) { - float charge = ItemEnergy.getStoredEnergy(item); - - if (charge >= COST) { - ItemEnergy.chargeItem(item, -COST); - + if (removeItemCharge(item, -COST)) { SlimefunItem sfItem = modes.get(index).getItem(); if (sfItem != null) { diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/SolarHelmet.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/SolarHelmet.java index 953d9013c..3c24a6cf5 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/SolarHelmet.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/SolarHelmet.java @@ -1,25 +1,53 @@ package io.github.thebusybiscuit.slimefun4.implementation.items.electric.gadgets; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import io.github.thebusybiscuit.slimefun4.api.items.ItemSetting; +import io.github.thebusybiscuit.slimefun4.core.attributes.Rechargeable; +import io.github.thebusybiscuit.slimefun4.implementation.tasks.ArmorTask; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; +/** + * The {@link SolarHelmet} can be worn by {@link Player}. + * As long as that {@link Player} has contact with sunlight, the helmet will charge any + * {@link Rechargeable} {@link SlimefunItem} that this {@link Player} is currently wearing + * or holding. + * + * @author TheBusyBiscuit + * + * @see ArmorTask + * @see Rechargeable + * + */ public class SolarHelmet extends SlimefunItem { - private final ItemSetting chargeSetting = new ItemSetting<>("charge-amount", 0.1); + private final ItemSetting charge = new ItemSetting<>("charge-amount", 0.1); public SolarHelmet(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) { super(category, item, recipeType, recipe, null); - addItemSetting(chargeSetting); + addItemSetting(charge); } - public double getChargeAmount() { - return chargeSetting.getValue(); + public void chargeItems(Player p) { + recharge(p.getInventory().getHelmet()); + recharge(p.getInventory().getChestplate()); + recharge(p.getInventory().getLeggings()); + recharge(p.getInventory().getBoots()); + recharge(p.getInventory().getItemInMainHand()); + recharge(p.getInventory().getItemInOffHand()); + } + + private void recharge(ItemStack item) { + SlimefunItem sfItem = SlimefunItem.getByItem(item); + + if (sfItem instanceof Rechargeable) { + ((Rechargeable) sfItem).addItemCharge(item, charge.getValue().floatValue()); + } } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/AutoBrewer.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/AutoBrewer.java index d7e43cce9..e6915a671 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/AutoBrewer.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/AutoBrewer.java @@ -29,7 +29,7 @@ import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; * @author Linox * */ -public class AutoBrewer extends AContainer { +public abstract class AutoBrewer extends AContainer { private static final Map potionRecipes = new EnumMap<>(Material.class); private static final Map fermentations = new EnumMap<>(PotionType.class); @@ -122,15 +122,14 @@ public class AutoBrewer extends AContainer { ItemStack potionItem = slot ? input1 : input2; ItemStack ingredient = slot ? input2 : input1; - PotionMeta potion = (PotionMeta) potionItem.getItemMeta(); - // Reject any named items if (ingredient.hasItemMeta()) { return null; } - PotionData potionData = potion.getBasePotionData(); - ItemStack output = brew(ingredient.getType(), potionItem.getType(), potion, potionData); + PotionMeta potion = (PotionMeta) potionItem.getItemMeta(); + + ItemStack output = brew(ingredient.getType(), potionItem.getType(), potion); if (output == null) { return null; @@ -144,8 +143,10 @@ public class AutoBrewer extends AContainer { } } - private ItemStack brew(Material input, Material potionType, PotionMeta potion, PotionData potionData) { - if (potionData.getType() == PotionType.WATER) { + private ItemStack brew(Material input, Material potionType, PotionMeta potion) { + PotionData data = potion.getBasePotionData(); + + if (data.getType() == PotionType.WATER) { if (input == Material.FERMENTED_SPIDER_EYE) { potion.setBasePotionData(new PotionData(PotionType.WEAKNESS, false, false)); return new ItemStack(potionType); @@ -166,18 +167,18 @@ public class AutoBrewer extends AContainer { } else if (input == Material.FERMENTED_SPIDER_EYE) { - potion.setBasePotionData(new PotionData(fermentations.get(potionData.getType()), false, false)); + potion.setBasePotionData(new PotionData(fermentations.get(data.getType()), false, false)); return new ItemStack(potionType); } else if (input == Material.REDSTONE) { - potion.setBasePotionData(new PotionData(potionData.getType(), true, potionData.isUpgraded())); + potion.setBasePotionData(new PotionData(data.getType(), true, data.isUpgraded())); return new ItemStack(potionType); } else if (input == Material.GLOWSTONE_DUST) { - potion.setBasePotionData(new PotionData(potionData.getType(), potionData.isExtended(), true)); + potion.setBasePotionData(new PotionData(data.getType(), data.isExtended(), true)); return new ItemStack(potionType); } - else if (potionData.getType() == PotionType.AWKWARD && potionRecipes.containsKey(input)) { + else if (data.getType() == PotionType.AWKWARD && potionRecipes.containsKey(input)) { potion.setBasePotionData(new PotionData(potionRecipes.get(input), false, false)); return new ItemStack(potionType); } @@ -213,11 +214,6 @@ public class AutoBrewer extends AContainer { return 6; } - @Override - public int getSpeed() { - return 1; - } - @Override public String getMachineIdentifier() { return "AUTO_BREWER"; diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ChargingBench.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ChargingBench.java index f06c0f7e9..59ecfbc9b 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ChargingBench.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ChargingBench.java @@ -4,13 +4,14 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.inventory.ItemStack; +import io.github.thebusybiscuit.slimefun4.core.attributes.Rechargeable; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; -import me.mrCookieSlime.Slimefun.api.energy.ItemEnergy; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; public class ChargingBench extends AContainer { @@ -50,38 +51,34 @@ public class ChargingBench extends AContainer { for (int slot : getInputSlots()) { ItemStack item = inv.getItemInSlot(slot); - if (ItemEnergy.getMaxEnergy(item) > 0) { - charge(b, inv, slot, item); + if (charge(b, inv, slot, item)) { return; } } } - private void charge(Block b, BlockMenu inv, int slot, ItemStack item) { - if (ItemEnergy.getStoredEnergy(item) < ItemEnergy.getMaxEnergy(item)) { - ChargableBlock.addCharge(b, -getEnergyConsumption()); - float rest = ItemEnergy.addStoredEnergy(item, getEnergyConsumption() / 2F); + private boolean charge(Block b, BlockMenu inv, int slot, ItemStack item) { + SlimefunItem sfItem = SlimefunItem.getByItem(item); - if (rest > 0F) { - if (inv.fits(item, getOutputSlots())) { - inv.pushItem(item, getOutputSlots()); - inv.replaceExistingItem(slot, null); - } - else { - inv.replaceExistingItem(slot, item); - } + if (sfItem instanceof Rechargeable) { + float charge = getEnergyConsumption() / 2F; + + if (((Rechargeable) sfItem).addItemCharge(item, charge)) { + ChargableBlock.addCharge(b, -getEnergyConsumption()); } - else { - inv.replaceExistingItem(slot, item); + else if (inv.fits(item, getOutputSlots())) { + inv.pushItem(item, getOutputSlots()); + inv.replaceExistingItem(slot, null); } + + return true; } - else if (inv.fits(item, getOutputSlots())) { + else if (sfItem != null && inv.fits(item, getOutputSlots())) { inv.pushItem(item, getOutputSlots()); inv.replaceExistingItem(slot, null); } - else { - inv.replaceExistingItem(slot, item); - } + + return false; } @Override diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/GadgetsListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/GadgetsListener.java index 34fd363f2..c9a93fc53 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/GadgetsListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/GadgetsListener.java @@ -72,7 +72,7 @@ public class GadgetsListener implements Listener { double thrust = ((Jetpack) chestplate).getThrust(); if (thrust > 0.2) { - new JetpackTask(p, thrust).scheduleRepeating(0, 3); + new JetpackTask(p, (Jetpack) chestplate).scheduleRepeating(0, 3); } } else if (chestplate instanceof Parachute) { @@ -85,7 +85,7 @@ public class GadgetsListener implements Listener { double speed = ((JetBoots) boots).getSpeed(); if (speed > 0.2) { - new JetBootsTask(p, speed).scheduleRepeating(0, 2); + new JetBootsTask(p, (JetBoots) boots).scheduleRepeating(0, 2); } } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/setup/SlimefunItemSetup.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/setup/SlimefunItemSetup.java index 416bb34f5..a7a2dbc63 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/setup/SlimefunItemSetup.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/setup/SlimefunItemSetup.java @@ -599,37 +599,37 @@ public final class SlimefunItemSetup { new Jetpack(categories.technicalGadgets, SlimefunItems.DURALUMIN_JETPACK, new ItemStack[] {SlimefunItems.DURALUMIN_INGOT, null, SlimefunItems.DURALUMIN_INGOT, SlimefunItems.DURALUMIN_INGOT, SlimefunItems.POWER_CRYSTAL, SlimefunItems.DURALUMIN_INGOT, SlimefunItems.STEEL_THRUSTER, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.STEEL_THRUSTER}, - 0.35) + 0.35, 20) .register(plugin); new Jetpack(categories.technicalGadgets, SlimefunItems.SOLDER_JETPACK, new ItemStack[] {SlimefunItems.SOLDER_INGOT, null, SlimefunItems.SOLDER_INGOT, SlimefunItems.SOLDER_INGOT, SlimefunItems.POWER_CRYSTAL, SlimefunItems.SOLDER_INGOT, SlimefunItems.STEEL_THRUSTER, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.STEEL_THRUSTER}, - 0.4) + 0.4, 30) .register(plugin); new Jetpack(categories.technicalGadgets, SlimefunItems.BILLON_JETPACK, new ItemStack[] {SlimefunItems.BILLON_INGOT, null, SlimefunItems.BILLON_INGOT, SlimefunItems.BILLON_INGOT, SlimefunItems.POWER_CRYSTAL, SlimefunItems.BILLON_INGOT, SlimefunItems.STEEL_THRUSTER, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.STEEL_THRUSTER}, - 0.45) + 0.45, 45) .register(plugin); new Jetpack(categories.technicalGadgets, SlimefunItems.STEEL_JETPACK, new ItemStack[] {SlimefunItems.STEEL_INGOT, null, SlimefunItems.STEEL_INGOT, SlimefunItems.STEEL_INGOT, SlimefunItems.POWER_CRYSTAL, SlimefunItems.STEEL_INGOT, SlimefunItems.STEEL_THRUSTER, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.STEEL_THRUSTER}, - 0.5) + 0.5, 60) .register(plugin); new Jetpack(categories.technicalGadgets, SlimefunItems.DAMASCUS_STEEL_JETPACK, new ItemStack[] {SlimefunItems.DAMASCUS_STEEL_INGOT, null, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.POWER_CRYSTAL, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.STEEL_THRUSTER, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.STEEL_THRUSTER}, - 0.55) + 0.55, 75) .register(plugin); new Jetpack(categories.technicalGadgets, SlimefunItems.REINFORCED_ALLOY_JETPACK, new ItemStack[] {SlimefunItems.REINFORCED_ALLOY_INGOT, null, SlimefunItems.REINFORCED_ALLOY_INGOT, SlimefunItems.REINFORCED_ALLOY_INGOT, SlimefunItems.POWER_CRYSTAL, SlimefunItems.REINFORCED_ALLOY_INGOT, SlimefunItems.STEEL_THRUSTER, SlimefunItems.MEDIUM_CAPACITOR, SlimefunItems.STEEL_THRUSTER}, - 0.6) + 0.6, 100) .register(plugin); new Jetpack(categories.technicalGadgets, SlimefunItems.CARBONADO_JETPACK, new ItemStack[] {SlimefunItems.CARBON_CHUNK, null, SlimefunItems.CARBON_CHUNK, SlimefunItems.CARBONADO, SlimefunItems.POWER_CRYSTAL, SlimefunItems.CARBONADO, SlimefunItems.STEEL_THRUSTER, SlimefunItems.LARGE_CAPACITOR, SlimefunItems.STEEL_THRUSTER}, - 0.7) + 0.7, 150) .register(plugin); new Parachute(categories.technicalGadgets, SlimefunItems.PARACHUTE, RecipeType.ENHANCED_CRAFTING_TABLE, @@ -672,37 +672,37 @@ public final class SlimefunItemSetup { new MultiTool(categories.technicalGadgets, SlimefunItems.DURALUMIN_MULTI_TOOL, RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.DURALUMIN_INGOT, null, SlimefunItems.DURALUMIN_INGOT, SlimefunItems.DURALUMIN_INGOT, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.DURALUMIN_INGOT, null, SlimefunItems.DURALUMIN_INGOT, null}, - multiToolItems) + 20, multiToolItems) .register(plugin); new MultiTool(categories.technicalGadgets, SlimefunItems.SOLDER_MULTI_TOOL, RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.SOLDER_INGOT, null, SlimefunItems.SOLDER_INGOT, SlimefunItems.SOLDER_INGOT, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.SOLDER_INGOT, null, SlimefunItems.SOLDER_INGOT, null}, - multiToolItems) + 30, multiToolItems) .register(plugin); new MultiTool(categories.technicalGadgets, SlimefunItems.BILLON_MULTI_TOOL, RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.BILLON_INGOT, null, SlimefunItems.BILLON_INGOT, SlimefunItems.BILLON_INGOT, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.BILLON_INGOT, null, SlimefunItems.BILLON_INGOT, null}, - multiToolItems) + 40, multiToolItems) .register(plugin); new MultiTool(categories.technicalGadgets, SlimefunItems.STEEL_MULTI_TOOL, RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.STEEL_INGOT, null, SlimefunItems.STEEL_INGOT, SlimefunItems.STEEL_INGOT, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.STEEL_INGOT, null, SlimefunItems.STEEL_INGOT, null}, - multiToolItems) + 50, multiToolItems) .register(plugin); new MultiTool(categories.technicalGadgets, SlimefunItems.DAMASCUS_STEEL_MULTI_TOOL, RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.DAMASCUS_STEEL_INGOT, null, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.DAMASCUS_STEEL_INGOT, null, SlimefunItems.DAMASCUS_STEEL_INGOT, null}, - multiToolItems) + 60, multiToolItems) .register(plugin); new MultiTool(categories.technicalGadgets, SlimefunItems.REINFORCED_ALLOY_MULTI_TOOL, RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.REINFORCED_ALLOY_INGOT, null, SlimefunItems.REINFORCED_ALLOY_INGOT, SlimefunItems.REINFORCED_ALLOY_INGOT, SlimefunItems.MEDIUM_CAPACITOR, SlimefunItems.REINFORCED_ALLOY_INGOT, null, SlimefunItems.REINFORCED_ALLOY_INGOT, null}, - multiToolItems) + 75, multiToolItems) .register(plugin); new MultiTool(categories.technicalGadgets, SlimefunItems.CARBONADO_MULTI_TOOL, RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.CARBONADO, null, SlimefunItems.CARBONADO, SlimefunItems.CARBONADO, SlimefunItems.LARGE_CAPACITOR, SlimefunItems.CARBONADO, null, SlimefunItems.CARBONADO, null}, - "PORTABLE_CRAFTER", "MAGIC_EYE_OF_ENDER", "STAFF_ELEMENTAL_WIND", "GRAPPLING_HOOK", "GOLD_PAN", "NETHER_GOLD_PAN") + 100, "PORTABLE_CRAFTER", "MAGIC_EYE_OF_ENDER", "STAFF_ELEMENTAL_WIND", "GRAPPLING_HOOK", "GOLD_PAN", "NETHER_GOLD_PAN") .register(plugin); new OreWasher(categories.basicMachines, SlimefunItems.ORE_WASHER).register(plugin); @@ -1112,42 +1112,42 @@ public final class SlimefunItemSetup { new JetBoots(categories.technicalGadgets, SlimefunItems.DURALUMIN_JETBOOTS, new ItemStack[] {null, null, null, SlimefunItems.DURALUMIN_INGOT, SlimefunItems.POWER_CRYSTAL, SlimefunItems.DURALUMIN_INGOT, SlimefunItems.STEEL_THRUSTER, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.STEEL_THRUSTER}, - 0.35) + 0.35, 20) .register(plugin); new JetBoots(categories.technicalGadgets, SlimefunItems.SOLDER_JETBOOTS, new ItemStack[] {null, null, null, SlimefunItems.SOLDER_INGOT, SlimefunItems.POWER_CRYSTAL, SlimefunItems.SOLDER_INGOT, SlimefunItems.STEEL_THRUSTER, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.STEEL_THRUSTER}, - 0.4) + 0.4, 30) .register(plugin); new JetBoots(categories.technicalGadgets, SlimefunItems.BILLON_JETBOOTS, new ItemStack[] {null, null, null, SlimefunItems.BILLON_INGOT, SlimefunItems.POWER_CRYSTAL, SlimefunItems.BILLON_INGOT, SlimefunItems.STEEL_THRUSTER, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.STEEL_THRUSTER}, - 0.45) + 0.45, 40) .register(plugin); new JetBoots(categories.technicalGadgets, SlimefunItems.STEEL_JETBOOTS, new ItemStack[] {null, null, null, SlimefunItems.STEEL_INGOT, SlimefunItems.POWER_CRYSTAL, SlimefunItems.STEEL_INGOT, SlimefunItems.STEEL_THRUSTER, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.STEEL_THRUSTER}, - 0.5) + 0.5, 50) .register(plugin); new JetBoots(categories.technicalGadgets, SlimefunItems.DAMASCUS_STEEL_JETBOOTS, new ItemStack[] {null, null, null, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.POWER_CRYSTAL, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.STEEL_THRUSTER, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.STEEL_THRUSTER}, - 0.55) + 0.55, 75) .register(plugin); new JetBoots(categories.technicalGadgets, SlimefunItems.REINFORCED_ALLOY_JETBOOTS, new ItemStack[] {null, null, null, SlimefunItems.REINFORCED_ALLOY_INGOT, SlimefunItems.POWER_CRYSTAL, SlimefunItems.REINFORCED_ALLOY_INGOT, SlimefunItems.STEEL_THRUSTER, SlimefunItems.MEDIUM_CAPACITOR, SlimefunItems.STEEL_THRUSTER}, - 0.6) + 0.6, 100) .register(plugin); new JetBoots(categories.technicalGadgets, SlimefunItems.CARBONADO_JETBOOTS, new ItemStack[] {null, null, null, SlimefunItems.CARBONADO, SlimefunItems.POWER_CRYSTAL, SlimefunItems.CARBONADO, SlimefunItems.STEEL_THRUSTER, SlimefunItems.LARGE_CAPACITOR, SlimefunItems.STEEL_THRUSTER}, - 0.7) + 0.7, 125) .register(plugin); new JetBoots(categories.technicalGadgets, SlimefunItems.ARMORED_JETBOOTS, new ItemStack[] {null, null, null, SlimefunItems.STEEL_PLATE, SlimefunItems.POWER_CRYSTAL, SlimefunItems.STEEL_PLATE, SlimefunItems.STEEL_THRUSTER, SlimefunItems.MEDIUM_CAPACITOR, SlimefunItems.STEEL_THRUSTER}, - 0.45) + 0.45, 50) .register(plugin); new SeismicAxe(categories.weapons, SlimefunItems.SEISMIC_AXE, RecipeType.MAGIC_WORKBENCH, @@ -1975,15 +1975,22 @@ public final class SlimefunItemSetup { new AutoDrier(categories.electricity, SlimefunItems.AUTO_DRIER, RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[]{null, null, null, SlimefunItems.HEATING_COIL, new ItemStack(Material.SMOKER), SlimefunItems.HEATING_COIL, null, new ItemStack(Material.CAMPFIRE), null}) .register(plugin); - } else { + } + else { new AutoDrier(categories.electricity, SlimefunItems.AUTO_DRIER, RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[]{null, null, null, SlimefunItems.HEATING_COIL, new ItemStack(Material.FURNACE), SlimefunItems.HEATING_COIL, null, new ItemStack(Material.TORCH), null}) .register(plugin); } new AutoBrewer(categories.electricity, SlimefunItems.AUTO_BREWER, RecipeType.ENHANCED_CRAFTING_TABLE, - new ItemStack[] {null, SlimefunItems.HEATING_COIL, null, SlimefunItems.REINFORCED_PLATE, new ItemStack(Material.BREWING_STAND), SlimefunItems.REINFORCED_PLATE, null, SlimefunItems.ELECTRIC_MOTOR, null}) - .register(plugin); + new ItemStack[] {null, SlimefunItems.HEATING_COIL, null, SlimefunItems.REINFORCED_PLATE, new ItemStack(Material.BREWING_STAND), SlimefunItems.REINFORCED_PLATE, null, SlimefunItems.ELECTRIC_MOTOR, null}) { + + @Override + public int getSpeed() { + return 1; + } + + }.register(plugin); new ElectricPress(categories.electricity, SlimefunItems.ELECTRIC_PRESS, RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {new ItemStack(Material.PISTON), SlimefunItems.ELECTRIC_MOTOR, new ItemStack(Material.PISTON), null, SlimefunItems.MEDIUM_CAPACITOR, null, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.DAMASCUS_STEEL_INGOT}) { diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/ArmorTask.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/ArmorTask.java index e3809b012..32313de41 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/ArmorTask.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/ArmorTask.java @@ -20,7 +20,6 @@ import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils; import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.api.Slimefun; -import me.mrCookieSlime.Slimefun.api.energy.ItemEnergy; /** * The {@link ArmorTask} is responsible for handling {@link PotionEffect PotionEffects} for @@ -57,7 +56,11 @@ public class ArmorTask implements Runnable { HashedArmorpiece[] cachedArmor = profile.getArmor(); handleSlimefunArmor(p, armor, cachedArmor); - checkForSolarHelmet(p); + + if (hasSunlight(p)) { + checkForSolarHelmet(p); + } + checkForRadiation(p); }); } @@ -89,15 +92,10 @@ public class ArmorTask implements Runnable { } private void checkForSolarHelmet(Player p) { - // Temporary performance improvement - if (!SlimefunUtils.isItemSimilar(p.getInventory().getHelmet(), SlimefunItems.SOLAR_HELMET, true)) { - return; - } - SlimefunItem item = SlimefunItem.getByItem(p.getInventory().getHelmet()); - if (item instanceof SolarHelmet && Slimefun.hasUnlocked(p, item, true) && hasSunlight(p)) { - ItemEnergy.chargeInventory(p, (float) ((SolarHelmet) item).getChargeAmount()); + if (item instanceof SolarHelmet && Slimefun.hasUnlocked(p, item, true)) { + ((SolarHelmet) item).chargeItems(p); } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/JetBootsTask.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/JetBootsTask.java index c5ea9fcc3..0c79d4c62 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/JetBootsTask.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/JetBootsTask.java @@ -4,40 +4,45 @@ import java.util.concurrent.ThreadLocalRandom; import org.bukkit.Bukkit; import org.bukkit.Effect; +import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.util.Vector; import io.github.thebusybiscuit.cscorelib2.math.DoubleHandler; -import me.mrCookieSlime.Slimefun.api.energy.ItemEnergy; +import io.github.thebusybiscuit.slimefun4.implementation.items.electric.gadgets.JetBoots; public class JetBootsTask extends PlayerTask { - private final double speed; + private static final float COST = 0.075F; - public JetBootsTask(Player p, double speed) { + private final JetBoots boots; + + public JetBootsTask(Player p, JetBoots boots) { super(p); - this.speed = speed; + this.boots = boots; } @Override protected void executeTask() { - float cost = 0.075F; - float charge = ItemEnergy.getStoredEnergy(p.getInventory().getBoots()); - double accuracy = DoubleHandler.fixDouble(speed - 0.7); + if (p.getInventory().getBoots() == null || p.getInventory().getBoots().getType() == Material.AIR) { + return; + } - if (charge >= cost) { - p.getInventory().setBoots(ItemEnergy.chargeItem(p.getInventory().getBoots(), -cost)); + double accuracy = DoubleHandler.fixDouble(boots.getSpeed() - 0.7); + if (boots.removeItemCharge(p.getInventory().getBoots(), COST)) { p.getWorld().playSound(p.getLocation(), Sound.ENTITY_TNT_PRIMED, (float) 0.25, 1); p.getWorld().playEffect(p.getLocation(), Effect.SMOKE, 1, 1); p.setFallDistance(0F); double gravity = 0.04; double offset = ThreadLocalRandom.current().nextBoolean() ? accuracy : -accuracy; - Vector vector = new Vector(p.getEyeLocation().getDirection().getX() * speed + offset, gravity, p.getEyeLocation().getDirection().getZ() * speed - offset); + Vector vector = new Vector(p.getEyeLocation().getDirection().getX() * boots.getSpeed() + offset, gravity, p.getEyeLocation().getDirection().getZ() * boots.getSpeed() - offset); p.setVelocity(vector); } - else Bukkit.getScheduler().cancelTask(id); + else { + Bukkit.getScheduler().cancelTask(id); + } } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/JetpackTask.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/JetpackTask.java index 16ccbd6f0..ece737483 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/JetpackTask.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/JetpackTask.java @@ -2,19 +2,22 @@ package io.github.thebusybiscuit.slimefun4.implementation.tasks; import org.bukkit.Bukkit; import org.bukkit.Effect; +import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.util.Vector; -import me.mrCookieSlime.Slimefun.api.energy.ItemEnergy; +import io.github.thebusybiscuit.slimefun4.implementation.items.electric.gadgets.Jetpack; public class JetpackTask extends PlayerTask { - private final double thrust; + private static final float COST = 0.08F; - public JetpackTask(Player p, double thrust) { + private final Jetpack jetpack; + + public JetpackTask(Player p, Jetpack jetpack) { super(p); - this.thrust = thrust; + this.jetpack = jetpack; } @Override @@ -24,17 +27,16 @@ public class JetpackTask extends PlayerTask { @Override protected void executeTask() { - float cost = 0.08F; - float charge = ItemEnergy.getStoredEnergy(p.getInventory().getChestplate()); - - if (charge >= cost) { - p.getInventory().setChestplate(ItemEnergy.chargeItem(p.getInventory().getChestplate(), -cost)); + if (p.getInventory().getChestplate() == null || p.getInventory().getChestplate().getType() == Material.AIR) { + return; + } + if (jetpack.removeItemCharge(p.getInventory().getChestplate(), COST)) { p.getWorld().playSound(p.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, (float) 0.25, 1); p.getWorld().playEffect(p.getLocation(), Effect.SMOKE, 1, 1); p.setFallDistance(0F); Vector vector = new Vector(0, 1, 0); - vector.multiply(thrust); + vector.multiply(jetpack.getThrust()); vector.add(p.getEyeLocation().getDirection().multiply(0.2F)); p.setVelocity(vector); diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/utils/NumberUtils.java b/src/main/java/io/github/thebusybiscuit/slimefun4/utils/NumberUtils.java index cd9fa88ba..1c5a37cb3 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/utils/NumberUtils.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/utils/NumberUtils.java @@ -87,4 +87,8 @@ public final class NumberUtils { public static int getInt(Integer value, int defaultValue) { return value == null ? defaultValue : value; } + + public static float getFloat(Float value, float defaultValue) { + return value == null ? defaultValue : value; + } } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ChargableItem.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ChargableItem.java index 8430fa40b..2d1bddbbb 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ChargableItem.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ChargableItem.java @@ -2,18 +2,30 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem; import org.bukkit.inventory.ItemStack; +import io.github.thebusybiscuit.slimefun4.core.attributes.Rechargeable; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; +import me.mrCookieSlime.Slimefun.api.energy.ItemEnergy; -// We need to refactor this class some day... -// Add some methods or whatever, make it useful -// (And also fix the typo in the name) +/** + * This class is deprecated. + * + * @deprecated Please implement the {@link Rechargeable} interface from now on. + * + * @author TheBusyBiscuit + * + */ @Deprecated -public class ChargableItem extends SlimefunItem { +public class ChargableItem extends SlimefunItem implements Rechargeable { public ChargableItem(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) { super(category, item, recipeType, recipe); } + @Override + public float getMaxItemCharge(ItemStack item) { + return ItemEnergy.getMaxEnergy(item); + } + } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java index 28a952444..9f56f65e3 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java @@ -28,6 +28,7 @@ import io.github.thebusybiscuit.slimefun4.api.items.ItemState; import io.github.thebusybiscuit.slimefun4.core.attributes.EnergyNetComponent; import io.github.thebusybiscuit.slimefun4.core.attributes.Placeable; import io.github.thebusybiscuit.slimefun4.core.attributes.Radioactive; +import io.github.thebusybiscuit.slimefun4.core.attributes.Rechargeable; import io.github.thebusybiscuit.slimefun4.core.attributes.WitherProof; import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuide; import io.github.thebusybiscuit.slimefun4.core.researching.Research; @@ -462,12 +463,12 @@ public class SlimefunItem implements Placeable { } public void setRecipeType(RecipeType type) { - Validate.notNull(type, "'recipeType' is not allowed to be null!"); + Validate.notNull(type, "The RecipeType is not allowed to be null!"); this.recipeType = type; } public void setCategory(Category category) { - Validate.notNull(category, "'category' is not allowed to be null!"); + Validate.notNull(category, "The Category is not allowed to be null!"); this.category.remove(this); category.add(this); @@ -543,7 +544,7 @@ public class SlimefunItem implements Placeable { // Backwards compatibility if (SlimefunPlugin.getMinecraftVersion().isBefore(MinecraftVersion.MINECRAFT_1_14) || SlimefunPlugin.getRegistry().isBackwardsCompatible()) { - boolean loreInsensitive = this instanceof ChargableItem || this instanceof SlimefunBackpack || id.equals("BROKEN_SPAWNER") || id.equals("REINFORCED_SPAWNER"); + boolean loreInsensitive = this instanceof Rechargeable || this instanceof SlimefunBackpack || id.equals("BROKEN_SPAWNER") || id.equals("REINFORCED_SPAWNER"); return SlimefunUtils.isItemSimilar(item, this.item, !loreInsensitive); } else { diff --git a/src/main/java/me/mrCookieSlime/Slimefun/api/energy/ItemEnergy.java b/src/main/java/me/mrCookieSlime/Slimefun/api/energy/ItemEnergy.java index 6ec6ce360..a668d0ad1 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/api/energy/ItemEnergy.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/api/energy/ItemEnergy.java @@ -10,8 +10,17 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import io.github.thebusybiscuit.cscorelib2.chat.ChatColors; +import io.github.thebusybiscuit.slimefun4.core.attributes.Rechargeable; import io.github.thebusybiscuit.slimefun4.utils.PatternUtils; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +/** + * @deprecated Please implement {@link Rechargeable} on your {@link SlimefunItem} instead. + * + * @author TheBusyBiscuit + * + */ +@Deprecated public final class ItemEnergy { // We should find a replacement for this class From 8d0c816ed2fe1bc767dbd0c5779467ed450e68b9 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Fri, 26 Jun 2020 16:27:16 +0200 Subject: [PATCH 14/31] Some performance improvements --- .../core/services/CustomItemDataService.java | 3 ++- .../items/electric/gadgets/SolarHelmet.java | 9 ++++++++- .../slimefun4/implementation/tasks/ArmorTask.java | 11 +++++++++-- .../Objects/SlimefunItem/SlimefunItem.java | 14 ++++++-------- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/CustomItemDataService.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/CustomItemDataService.java index 2345b5b00..b2ca07a7c 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/CustomItemDataService.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/CustomItemDataService.java @@ -3,6 +3,7 @@ package io.github.thebusybiscuit.slimefun4.core.services; import java.util.Optional; import org.bukkit.Keyed; +import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -65,7 +66,7 @@ public class CustomItemDataService implements PersistentDataService, Keyed { * @return An {@link Optional} describing the result */ public Optional getItemData(ItemStack item) { - if (item == null || !item.hasItemMeta()) { + if (item == null || item.getType() == Material.AIR || !item.hasItemMeta()) { return Optional.empty(); } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/SolarHelmet.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/SolarHelmet.java index 3c24a6cf5..79263be8f 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/SolarHelmet.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/SolarHelmet.java @@ -33,7 +33,14 @@ public class SolarHelmet extends SlimefunItem { addItemSetting(charge); } - public void chargeItems(Player p) { + /** + * This method recharges the equipment of the given {@link Player} by the configured + * factor of this {@link SolarHelmet}. + * + * @param p + * The {@link Player} wearing this {@link SolarHelmet} + */ + public void rechargeItems(Player p) { recharge(p.getInventory().getHelmet()); recharge(p.getInventory().getChestplate()); recharge(p.getInventory().getLeggings()); diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/ArmorTask.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/ArmorTask.java index 32313de41..ffbdd1381 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/ArmorTask.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/ArmorTask.java @@ -92,10 +92,17 @@ public class ArmorTask implements Runnable { } private void checkForSolarHelmet(Player p) { - SlimefunItem item = SlimefunItem.getByItem(p.getInventory().getHelmet()); + ItemStack helmet = p.getInventory().getHelmet(); + + if (SlimefunPlugin.getRegistry().isBackwardsCompatible() && !SlimefunUtils.isItemSimilar(helmet, SlimefunItems.SOLAR_HELMET, true, false)) { + // Performance saver for slow backwards-compatible versions of Slimefun + return; + } + + SlimefunItem item = SlimefunItem.getByItem(helmet); if (item instanceof SolarHelmet && Slimefun.hasUnlocked(p, item, true)) { - ((SolarHelmet) item).chargeItems(p); + ((SolarHelmet) item).rechargeItems(p); } } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java index 9f56f65e3..58d084165 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java @@ -805,19 +805,17 @@ public class SlimefunItem implements Placeable { return getByID(((SlimefunItemStack) item).getItemId()); } - // This wrapper improves the heavy ItemStack#getItemMeta() call by caching it. - ItemStackWrapper wrapper = new ItemStackWrapper(item); + Optional itemID = SlimefunPlugin.getItemDataService().getItemData(item); - if (item.hasItemMeta()) { - Optional itemID = SlimefunPlugin.getItemDataService().getItemData(wrapper); - - if (itemID.isPresent()) { - return getByID(itemID.get()); - } + if (itemID.isPresent()) { + return getByID(itemID.get()); } // Backwards compatibility if (SlimefunPlugin.getMinecraftVersion().isBefore(MinecraftVersion.MINECRAFT_1_14) || SlimefunPlugin.getRegistry().isBackwardsCompatible()) { + // This wrapper improves the heavy ItemStack#getItemMeta() call by caching it. + ItemStackWrapper wrapper = new ItemStackWrapper(item); + // Quite expensive performance-wise // But necessary for supporting legacy items for (SlimefunItem sfi : SlimefunPlugin.getRegistry().getAllSlimefunItems()) { From 28e5b57c5d91fe62f79953ffe5186281cc77e0f6 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Fri, 26 Jun 2020 17:36:57 +0200 Subject: [PATCH 15/31] Some better exception handling --- .../implementation/tasks/SlimefunStartupTask.java | 10 +++++++++- .../me/mrCookieSlime/Slimefun/api/BlockStorage.java | 4 ++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/SlimefunStartupTask.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/SlimefunStartupTask.java index abfd58f4c..691b15913 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/SlimefunStartupTask.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/SlimefunStartupTask.java @@ -1,5 +1,7 @@ package io.github.thebusybiscuit.slimefun4.implementation.tasks; +import java.util.logging.Level; + import org.bukkit.Bukkit; import org.bukkit.World; @@ -10,6 +12,7 @@ import io.github.thebusybiscuit.slimefun4.implementation.setup.PostSetup; import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; /** * This Task initializes all items, some listeners and various other stuff. @@ -48,7 +51,12 @@ public class SlimefunStartupTask implements Runnable { SlimefunPlugin.getWorldSettingsService().load(Bukkit.getWorlds()); for (World world : Bukkit.getWorlds()) { - new BlockStorage(world); + try { + new BlockStorage(world); + } + catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, x, () -> "An Error occured while trying to load World \"" + world.getName() + "\" for Slimefun v" + SlimefunPlugin.getVersion()); + } } // Load all listeners that depend on items to be enabled diff --git a/src/main/java/me/mrCookieSlime/Slimefun/api/BlockStorage.java b/src/main/java/me/mrCookieSlime/Slimefun/api/BlockStorage.java index 0c318134d..a48353540 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/api/BlockStorage.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/api/BlockStorage.java @@ -97,6 +97,10 @@ public class BlockStorage { public BlockStorage(World w) { this.world = w; + if (world.getName().indexOf('.') != -1) { + throw new IllegalArgumentException("Slimefun cannot deal with World names that contain a dot: " + w.getName()); + } + if (SlimefunPlugin.getRegistry().getWorlds().containsKey(w.getName())) { // Cancel the loading process if the world was already loaded return; From ed85a9a051e3f63b9e3b903d194c5b815f01c538 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Fri, 26 Jun 2020 17:58:54 +0200 Subject: [PATCH 16/31] Added Unit tests for rechargeable items --- .../core/attributes/Rechargeable.java | 16 +-- .../tests/items/TestRechargeableItems.java | 126 ++++++++++++++++++ 2 files changed, 134 insertions(+), 8 deletions(-) create mode 100644 src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/items/TestRechargeableItems.java diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/Rechargeable.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/Rechargeable.java index 73205a28d..ef3ddea37 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/Rechargeable.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/Rechargeable.java @@ -47,12 +47,12 @@ public interface Rechargeable extends ItemAttribute { */ default void setItemCharge(ItemStack item, float charge) { if (item == null || item.getType() == Material.AIR) { - throw new IllegalArgumentException("Cannot set an Item charge for null or air"); + throw new IllegalArgumentException("Cannot set Item charge for null or AIR"); } float maximum = getMaxItemCharge(item); - if (charge <= 0 || charge >= maximum) { + if (charge < 0 || charge > maximum) { throw new IllegalArgumentException("Charge must be between zero and " + maximum + "."); } @@ -70,8 +70,8 @@ public interface Rechargeable extends ItemAttribute { * @return The charge stored on this {@link ItemStack} */ default float getItemCharge(ItemStack item) { - if (item == null || item.getType() == Material.AIR || !item.hasItemMeta()) { - throw new IllegalArgumentException("Cannot get the Item charge for invalid items (null, air or no ItemMeta)"); + if (item == null || item.getType() == Material.AIR) { + throw new IllegalArgumentException("Cannot get Item charge for null or AIR"); } return RechargeableHelper.getCharge(item.getItemMeta()); @@ -90,8 +90,8 @@ public interface Rechargeable extends ItemAttribute { * @return Whether the given charge could be added successfully */ default boolean addItemCharge(ItemStack item, float charge) { - if (item == null || item.getType() == Material.AIR || !item.hasItemMeta()) { - throw new IllegalArgumentException("Cannot add Item charge for invalid items (null, air or no ItemMeta)"); + if (item == null || item.getType() == Material.AIR) { + throw new IllegalArgumentException("Cannot add Item charge for null or AIR"); } ItemMeta meta = item.getItemMeta(); @@ -123,8 +123,8 @@ public interface Rechargeable extends ItemAttribute { * @return Whether the given charge could be removed successfully */ default boolean removeItemCharge(ItemStack item, float charge) { - if (item == null || item.getType() == Material.AIR || !item.hasItemMeta()) { - throw new IllegalArgumentException("Cannot remove Item charge for invalid items (null, air or no ItemMeta)"); + if (item == null || item.getType() == Material.AIR) { + throw new IllegalArgumentException("Cannot remove Item charge for null or AIR"); } ItemMeta meta = item.getItemMeta(); diff --git a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/items/TestRechargeableItems.java b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/items/TestRechargeableItems.java new file mode 100644 index 000000000..13499c17d --- /dev/null +++ b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/items/TestRechargeableItems.java @@ -0,0 +1,126 @@ +package io.github.thebusybiscuit.slimefun4.testing.tests.items; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import be.seeseemelk.mockbukkit.MockBukkit; +import io.github.thebusybiscuit.cscorelib2.chat.ChatColors; +import io.github.thebusybiscuit.cscorelib2.item.CustomItem; +import io.github.thebusybiscuit.slimefun4.core.attributes.Rechargeable; +import io.github.thebusybiscuit.slimefun4.testing.TestUtilities; +import io.github.thebusybiscuit.slimefun4.utils.LoreBuilder; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; + +public class TestRechargeableItems { + + private static SlimefunPlugin plugin; + + @BeforeAll + public static void load() { + MockBukkit.mock(); + plugin = MockBukkit.load(SlimefunPlugin.class); + } + + @AfterAll + public static void unload() { + MockBukkit.unmock(); + } + + @Test + public void testInvalidItems() { + Rechargeable rechargeable = mock("INVALID_CHARGING_TEST", 1); + + Assertions.assertThrows(IllegalArgumentException.class, () -> rechargeable.getItemCharge(null)); + Assertions.assertThrows(IllegalArgumentException.class, () -> rechargeable.getItemCharge(new ItemStack(Material.AIR))); + + Assertions.assertThrows(IllegalArgumentException.class, () -> rechargeable.setItemCharge(null, 1)); + Assertions.assertThrows(IllegalArgumentException.class, () -> rechargeable.setItemCharge(new ItemStack(Material.AIR), 1)); + + Assertions.assertThrows(IllegalArgumentException.class, () -> rechargeable.addItemCharge(null, 1)); + Assertions.assertThrows(IllegalArgumentException.class, () -> rechargeable.addItemCharge(new ItemStack(Material.AIR), 1)); + + Assertions.assertThrows(IllegalArgumentException.class, () -> rechargeable.removeItemCharge(null, 1)); + Assertions.assertThrows(IllegalArgumentException.class, () -> rechargeable.removeItemCharge(new ItemStack(Material.AIR), 1)); + } + + @Test + public void testSetItemCharge() { + Rechargeable rechargeable = mock("CHARGING_TEST", 10); + ItemStack item = new CustomItem(Material.REDSTONE_ORE, "&4Chargeable Item", "", LoreBuilder.powerCharged(0, 10)); + + Assertions.assertEquals(0, rechargeable.getItemCharge(item)); + + rechargeable.setItemCharge(item, 10); + Assertions.assertEquals(10, rechargeable.getItemCharge(item)); + + String lore = ChatColors.color("&c&o&8\u21E8 &e\u26A1 &7") + "10.0 / 10.0 J"; + Assertions.assertEquals(lore, item.getItemMeta().getLore().get(1)); + } + + @Test + public void testItemChargeBounds() { + Rechargeable rechargeable = mock("CHARGING_BOUNDS_TEST", 10); + ItemStack item = new CustomItem(Material.REDSTONE_BLOCK, "&4Chargeable Item with bounds", "", LoreBuilder.powerCharged(0, 10)); + + Assertions.assertThrows(IllegalArgumentException.class, () -> rechargeable.setItemCharge(item, -1)); + Assertions.assertThrows(IllegalArgumentException.class, () -> rechargeable.setItemCharge(item, -0.01F)); + Assertions.assertThrows(IllegalArgumentException.class, () -> rechargeable.setItemCharge(item, 10.01F)); + Assertions.assertThrows(IllegalArgumentException.class, () -> rechargeable.setItemCharge(item, 11)); + } + + @Test + public void testAddItemCharge() { + Rechargeable rechargeable = mock("CHARGING_BOUNDS_TEST", 10); + ItemStack item = new CustomItem(Material.REDSTONE_BLOCK, "&4Chargeable Item with additions", "", LoreBuilder.powerCharged(0, 10)); + + Assertions.assertTrue(rechargeable.addItemCharge(item, 10)); + Assertions.assertEquals(10, rechargeable.getItemCharge(item)); + + Assertions.assertFalse(rechargeable.addItemCharge(item, 1)); + } + + @Test + public void testRemoveItemCharge() { + Rechargeable rechargeable = mock("CHARGING_BOUNDS_TEST", 10); + ItemStack item = new CustomItem(Material.REDSTONE_BLOCK, "&4Chargeable Item with removal", "", LoreBuilder.powerCharged(0, 10)); + + Assertions.assertFalse(rechargeable.removeItemCharge(item, 1)); + + rechargeable.setItemCharge(item, 10); + + Assertions.assertTrue(rechargeable.removeItemCharge(item, 10)); + Assertions.assertEquals(0, rechargeable.getItemCharge(item)); + + Assertions.assertFalse(rechargeable.removeItemCharge(item, 1)); + } + + private RechargeableMock mock(String id, float capacity) { + Category category = TestUtilities.getCategory(plugin, "rechargeable"); + return new RechargeableMock(category, new SlimefunItemStack(id, new CustomItem(Material.REDSTONE_LAMP, "&3" + id)), capacity); + } + + private class RechargeableMock extends SlimefunItem implements Rechargeable { + + private final float capacity; + + protected RechargeableMock(Category category, SlimefunItemStack item, float capacity) { + super(category, item, RecipeType.NULL, new ItemStack[9]); + this.capacity = capacity; + } + + @Override + public float getMaxItemCharge(ItemStack item) { + return capacity; + } + + } + +} From f99c7275831980f0564553278764f3dd2b644425 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Fri, 26 Jun 2020 20:37:53 +0200 Subject: [PATCH 17/31] Added another Unit Test --- .../testing/tests/items/TestCategories.java | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/items/TestCategories.java b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/items/TestCategories.java index 46e1e99ed..f38eaf17a 100644 --- a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/items/TestCategories.java +++ b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/items/TestCategories.java @@ -20,10 +20,13 @@ import io.github.thebusybiscuit.slimefun4.core.categories.FlexCategory; import io.github.thebusybiscuit.slimefun4.core.categories.LockedCategory; import io.github.thebusybiscuit.slimefun4.core.categories.SeasonalCategory; import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideLayout; +import io.github.thebusybiscuit.slimefun4.core.researching.Research; import io.github.thebusybiscuit.slimefun4.testing.TestUtilities; import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; public class TestCategories { @@ -115,7 +118,7 @@ public class TestCategories { } @Test - public void testLockedCategories() { + public void testLockedCategoriesParents() { Assertions.assertThrows(IllegalArgumentException.class, () -> new LockedCategory(new NamespacedKey(plugin, "locked"), new CustomItem(Material.GOLD_NUGGET, "&6Locked Test"), (NamespacedKey) null)); Category category = new Category(new NamespacedKey(plugin, "unlocked"), new CustomItem(Material.EMERALD, "&5I am SHERlocked")); @@ -139,6 +142,39 @@ public class TestCategories { Assertions.assertTrue(locked.getParents().contains(category)); } + @Test + public void testLockedCategoriesUnlocking() throws InterruptedException { + Player player = server.addPlayer(); + PlayerProfile profile = TestUtilities.awaitProfile(player); + + Assertions.assertThrows(IllegalArgumentException.class, () -> new LockedCategory(new NamespacedKey(plugin, "locked"), new CustomItem(Material.GOLD_NUGGET, "&6Locked Test"), (NamespacedKey) null)); + + Category category = new Category(new NamespacedKey(plugin, "parent"), new CustomItem(Material.EMERALD, "&5I am SHERlocked")); + category.register(); + + LockedCategory locked = new LockedCategory(new NamespacedKey(plugin, "locked"), new CustomItem(Material.GOLD_NUGGET, "&6Locked Test"), category.getKey()); + locked.register(); + + // No Items, so it should be unlocked + Assertions.assertTrue(locked.hasUnlocked(player, profile)); + + SlimefunItem item = new SlimefunItem(category, new SlimefunItemStack("LOCKED_CATEGORY_TEST", new CustomItem(Material.LANTERN, "&6Test Item for locked categories")), RecipeType.NULL, new ItemStack[9]); + item.register(plugin); + item.load(); + + SlimefunPlugin.getRegistry().setResearchingEnabled(true); + Research research = new Research(new NamespacedKey(plugin, "cant_touch_this"), 432432, "MC Hammer", 90); + research.addItems(item); + research.register(); + + Assertions.assertFalse(profile.hasUnlocked(research)); + Assertions.assertFalse(locked.hasUnlocked(player, profile)); + + profile.setResearched(research, true); + + Assertions.assertTrue(locked.hasUnlocked(player, profile)); + } + @Test public void testSeasonalCategories() { // Category with current Month From 80fc0a173e1d389873cdca0033539694e9e620d1 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Fri, 26 Jun 2020 20:58:23 +0200 Subject: [PATCH 18/31] Added lore addition --- .../slimefun4/core/attributes/RechargeableHelper.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/RechargeableHelper.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/RechargeableHelper.java index e4bd282d1..43e0378ff 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/RechargeableHelper.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/RechargeableHelper.java @@ -43,10 +43,12 @@ final class RechargeableHelper { if (line.startsWith(LORE_PREFIX)) { lore.set(i, LORE_PREFIX + value + " / " + capacity + " J"); - meta.setLore(lore); - return; + break; } } + + lore.add(LORE_PREFIX + value + " / " + capacity + " J"); + meta.setLore(lore); } static float getCharge(ItemMeta meta) { From dab48cbe13f3102494a99e981afd1f31e7e718a6 Mon Sep 17 00:00:00 2001 From: HeroBrineKing Date: Fri, 26 Jun 2020 21:51:16 +0000 Subject: [PATCH 19/31] Translate categories_zh-TW.yml via GitLocalize --- src/main/resources/languages/categories_zh-TW.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/languages/categories_zh-TW.yml b/src/main/resources/languages/categories_zh-TW.yml index 544b513d4..0ccd29ed4 100644 --- a/src/main/resources/languages/categories_zh-TW.yml +++ b/src/main/resources/languages/categories_zh-TW.yml @@ -23,3 +23,4 @@ slimefun: easter: 復活節 birthday: TheBusyBiscuit的生日(10月26日) halloween: 萬聖節 + androids: 可編輯的機器人 From 6b89cd3fc2f7b2f57fb2a7625f8a4fc2f098a3de Mon Sep 17 00:00:00 2001 From: HeroBrineKing Date: Fri, 26 Jun 2020 21:51:17 +0000 Subject: [PATCH 20/31] Translate recipes_zh-TW.yml via GitLocalize --- .../resources/languages/recipes_zh-TW.yml | 221 +++++++++--------- 1 file changed, 113 insertions(+), 108 deletions(-) diff --git a/src/main/resources/languages/recipes_zh-TW.yml b/src/main/resources/languages/recipes_zh-TW.yml index 1aa858d18..52f547443 100644 --- a/src/main/resources/languages/recipes_zh-TW.yml +++ b/src/main/resources/languages/recipes_zh-TW.yml @@ -1,134 +1,96 @@ --- -minecraft: - blasting: - lore: - - 加熱燒一燒 - - 成品出來了! - name: 高爐合成表 - campfire: - lore: - - 加熱燒一燒 - - "\t\n成品出來了!" - name: 營火合成表 - furnace: - lore: - - 加熱燒一燒 - - 成品出來了! - name: 熔爐合成表 - shaped: - lore: - - 數量一樣 - - 位置一致 - - "(原版合成檯)" - name: 有序合成 - shapeless: - lore: - - 數量一樣 - - 位置不重要 - - "(原版合成檯)" - name: 無序合成 - smoking: - lore: - - 加熱燒一燒 - - 成品出來了! - name: 煙燻爐合成表 - stonecutting: - lore: - - 上去磨一磨 - - "\t\n成品出來了!" - name: 切石機合成表 slimefun: - ancient_altar: + multiblock: + name: 多重方塊 lore: - - 使用古代祭壇 - - 合成出該物品 - - 到古代祭壇頁面獲取更多資訊 - name: 古代祭壇(Ancient Altar) - armor_forge: - lore: - - 在盔甲鍛造檯中 - - 鍛造出該物品 - name: 盔甲鍛造檯(Armor Forge) - compressor: - lore: - - 使用壓縮機 - - 壓縮出該物品 - name: 壓縮機(Compressor) + - 在世界中蓋出該結構 + - 這不是一個可合成的物品 enhanced_crafting_table: + name: 進階合成檯(Enhanced Crafting Table) lore: - 在進階合成檯中 - 合成出該物品 - 原版工作檯沒用喔 - name: 進階合成檯(Enhanced Crafting Table) - food_composter: + armor_forge: + name: 盔甲鍛造檯(Armor Forge) lore: - - 使用堆肥機 - - 製造該物品 - name: 堆肥機(Food Composter) - food_fabricator: + - 在盔甲鍛造檯中 + - 鍛造出該物品 + grind_stone: + name: 研磨機(Grind Stone) lore: - - 使用食品加工場 - - 製造該物品 - name: 食品加工場(Food Fabricator) + - 在研磨機中 + - 研磨出該物品 + smeltery: + name: 冶(一ㄝˇ )煉爐(Smeltery) + lore: + - 在冶煉爐中 + - 冶煉出該物品 + ore_crusher: + name: 礦石粉碎機(Ore Crusher) + lore: + - 使用礦石粉碎機 + - 粉碎出該物品 + mob_drop: + name: 怪物掉落物 + lore: + - 擊殺該怪物 + - 以取得該物品 gold_pan: + name: 掏金盤(Gold Pan)[工具區] lore: - '使用掏金盤 ' - 篩出此物品 - name: 掏金盤(Gold Pan)[工具區] - grind_stone: + compressor: + name: 壓縮機(Compressor) lore: - - 在研磨機中 - - 研磨出該物品 - name: 研磨機(Grind Stone) - heated_pressure_chamber: - lore: - - 使用高溫加壓室 + - 使用壓縮機 - 壓縮出該物品 - name: |- - 高溫加壓室 - (Heated Pressure Chamber) - juicer: - lore: - - 使用果汁機 - - 榨出蓋物品 - name: 果汁機(Juicer) - magic_workbench: - lore: - - 使用魔法合成檯 - - 合成出該物品 - name: 魔法合成檯(Magic Workbench) - mob_drop: - lore: - - 擊殺該怪物 - - 以取得該物品 - name: 怪物掉落物 - multiblock: - lore: - - 在世界中蓋出該結構 - - 這不是一個可合成的物品 - name: 多重方塊 - ore_crusher: - lore: - - 使用礦石粉碎機 - - 粉碎出該物品 - name: 礦石粉碎機(Ore Crusher) - ore_washer: - lore: - - 使用礦物洗滌機 - - 篩出該物品 - name: 礦物洗滌機(Ore Washer) pressure_chamber: + name: 加壓室(Pressure Chamber) lore: - 使用加壓室 - 壓縮出該物品 - name: 加壓室(Pressure Chamber) - smeltery: + ore_washer: + name: 礦物洗滌機(Ore Washer) lore: - - 在冶煉爐中 - - 冶煉出該物品 - name: 冶(一ㄝˇ )煉爐(Smeltery) + - 使用礦物洗滌機 + - 篩出該物品 + juicer: + name: 果汁機(Juicer) + lore: + - 使用果汁機 + - 榨出蓋物品 + magic_workbench: + name: 魔法合成檯(Magic Workbench) + lore: + - 使用魔法合成檯 + - 合成出該物品 + ancient_altar: + name: 古代祭壇(Ancient Altar) + lore: + - 使用古代祭壇 + - 合成出該物品 + - 到古代祭壇頁面獲取更多資訊 + heated_pressure_chamber: + name: |- + 高溫加壓室 + (Heated Pressure Chamber) + lore: + - 使用高溫加壓室 + - 壓縮出該物品 + food_fabricator: + name: 食品加工場(Food Fabricator) + lore: + - 使用食品加工場 + - 製造該物品 + food_composter: + name: 堆肥機(Food Composter) + lore: + - 使用堆肥機 + - 製造該物品 freezer: name: 冷凍艙(Freezer) lore: @@ -160,3 +122,46 @@ slimefun: lore: - 使用煉油廠 - 提煉該物品 +minecraft: + shaped: + name: 有序合成 + lore: + - 數量一樣 + - 位置一致 + - "(原版合成檯)" + shapeless: + name: 無序合成 + lore: + - 數量一樣 + - 位置不重要 + - "(原版合成檯)" + furnace: + name: 熔爐合成表 + lore: + - 加熱燒一燒 + - 成品出來了! + blasting: + name: 高爐合成表 + lore: + - 加熱燒一燒 + - 成品出來了! + smoking: + name: 煙燻爐合成表 + lore: + - 加熱燒一燒 + - 成品出來了! + campfire: + name: 營火合成表 + lore: + - 加熱燒一燒 + - "\t\n成品出來了!" + stonecutting: + name: 切石機合成表 + lore: + - 上去磨一磨 + - "\t\n成品出來了!" + smithing: + name: 鍛造台合成表 + lore: + - 鍛造一下下 + - 成品出來了 From 3ba284746b5a34474715af8a7c867d28d9f082f1 Mon Sep 17 00:00:00 2001 From: HeroBrineKing Date: Fri, 26 Jun 2020 21:51:18 +0000 Subject: [PATCH 21/31] Translate researches_zh-TW.yml via GitLocalize --- .../resources/languages/researches_zh-TW.yml | 424 +++++++++--------- 1 file changed, 215 insertions(+), 209 deletions(-) diff --git a/src/main/resources/languages/researches_zh-TW.yml b/src/main/resources/languages/researches_zh-TW.yml index 39c4bcd5a..d4625c9d1 100644 --- a/src/main/resources/languages/researches_zh-TW.yml +++ b/src/main/resources/languages/researches_zh-TW.yml @@ -1,232 +1,238 @@ --- slimefun: - 24k_gold_block: 我就有錢 - advanced_android: 進階機器人 - advanced_butcher_android: 進階機器人–屠夫 - advanced_circuit_board: 進階電路板 - advanced_electric_smeltery: 進階電動冶煉爐 - advanced_farmer_android: 進階機器人—農夫 - advanced_fisherman_android: 進階機器人— 漁夫 - advanced_output_node: 進階輸出接口 - alloys: 進階合金 - ancient_altar: 古代祭壇 - ancient_runes: 元素符文 - android_interfaces: 機器人接口 - android_memory_core: 機器人記憶體 - angel_talisman: 天使護身符 - animal_growth_accelerator: 動物轉大人 - anvil_talisman: 鐵砧護身符 - armored_jetboots: 火箭鐵靴 - armored_jetpack: 噴射裝甲 + walking_sticks: 拐杖 + portable_crafter: 隨身合成檯 + fortune_cookie: 幸運餅乾 + portable_dustbin: 隨身垃圾桶 + meat_jerky: 肉乾 armor_forge: 盔甲合成檯 - auto_anvil: 電動鐵砧 - auto_breeder: 幫你餵動物 - auto_drier: 乾燥機 - auto_enchanting: 附魔&退魔檯 - automated_crafting_chamber: 自動合成檯 - automated_panning_machine: 懶人掏金盤 - automatic_ignition_chamber: 自動點火 - backpacks: 背包 + glowstone_armor: 螢光石套裝 + lumps: 魔法結晶 + ender_backpack: 終界背包 + ender_armor: 終界套裝 + magic_eye_of_ender: 終界法眼 + magic_sugar: 魔法糖 + monster_jerky: 腐肉乾 + slime_armor: 史萊姆套裝 + sword_of_beheading: 斬首劍 basic_circuit_board: 基礎電路板 + advanced_circuit_board: 進階電路板 + smeltery: 冶煉爐 + steel: 鋼鐵時代 + misc_power_items: 硫酸鹽和能量水晶 battery: 電池 - better_carbon_press: 升級版碳壓縮機 - better_crop_growth_accelerator: 金坷垃2.0 - better_electric_crucibles: 電熱坩堝—改 - better_electric_furnace: 升級版電磁爐 - better_food_fabricator: 進階食品加工場 - better_freezer: 比你的笑話還冷 - better_gps_transmitters: 高階GPS信號發送器 - better_heated_pressure_chamber: 進階高溫加壓室 - better_solar_generators: 高階太陽能發電機 - bio_reactor: 生化反應爐 - blade_of_vampires: 吸血之刃 - blistering_ingots: 發泡錠 - block_placer: 方塊放置器 - boosted_uranium: 高壓鈾 - boots_of_the_stomper: 踐踏之靴 - bound_armor: 魂綁套裝 - bound_backpack: 魂綁背包 - bound_tools: 魂綁工具 - bound_weapons: 魂綁武器 - bronze: 青銅時代 - butcher_androids: 屠夫機器人 + steel_plate: 鋼板 + steel_thruster: 鋼製推進器 + parachute: 降落傘 + grappling_hook: 鷹爪鉤 + jetpacks: 噴射背包 + multitools: 多功能工具 + solar_panel_and_helmet: 太陽能頭盔 + elemental_staff: 元素杖 + grind_stone: 研磨機 cactus_armor: 仙人掌套裝 - capacitors: 初階電容器 - carbonado: 黑鑽石 - carbonado_furnace: 碳纖維熔爐 - carbonado_tools: 頂級機器 - carbon_press: 碳壓縮機 - cargo_basics: 物流基礎 - cargo_nodes: 物流節點 - chainmail_armor: 鎖鍊套裝 - charging_bench: 充電台 - coal_generator: 乾淨的煤 - cobalt_pickaxe: 我是速度 - combustion_reactor: 火力反應爐 - common_talisman: 基礎護身符 - composter: 堆肥 + gold_pan: 掏金盤 + magical_book_cover: 魔法書封面 + slimefun_metals: 更多金屬 + ore_crusher: 雙倍礦物 + bronze: 青銅時代 + alloys: 進階合金 compressor_and_carbon: 壓縮碳 - cooler: 保溫器 - copper_wire: 良導體! - crop_growth_accelerator: 金坷垃 - crucible: 坩鍋 - crushed_ore: 礦石純化 + gilded_iron_armor: 鍍金鐵套裝 + synthetic_diamond: 合成鑽石 + pressure_chamber: 加壓室 + synthetic_sapphire: 合成藍寶石 damascus_steel: 大馬士革鋼 damascus_steel_armor: 大馬士革鋼套裝 - diet_cookie: 減肥餅 - duct_tape: FLEX TAPE - electric_crucible: 電動坩堝 - electric_furnaces: 電磁爐 - electric_ingot_machines: 電動煉錠產業鍊 + reinforced_alloy: 強化合金錠 + carbonado: 黑鑽石 + magic_workbench: 魔術合成檯 + wind_staff: 元素杖—風 + reinforced_armor: 強化合金錠套裝 + ore_washer: 礦物洗滌機 + gold_carats: 純金 + silicon: 麥塊矽谷 + fire_staff: 元素杖—火 + smelters_pickaxe: 冶煉鎬 + common_talisman: 基礎護身符 + anvil_talisman: 鐵砧護身符 + miner_talisman: 礦工護身符 + hunter_talisman: 獵人護身符 + lava_talisman: 熔岩護身符 + water_talisman: 水中呼吸護身符 + angel_talisman: 天使護身符 + fire_talisman: 火焰護身符 + lava_crystal: 燒喔~ + magician_talisman: 法師護身符 + traveller_talisman: 旅者護身符 + warrior_talisman: 戰士護身符 + knight_talisman: 騎士護身符 + gilded_iron: 鍍金鐵 + synthetic_emerald: 人造翡翠 + chainmail_armor: 鎖鍊套裝 + whirlwind_talisman: 旋風護身符 + wizard_talisman: 巫師護身符 + lumber_axe: 伐木斧 + hazmat_suit: 抗輻射套裝 + uranium: 輻射金屬 + crushed_ore: 礦石純化 + redstone_alloy: 紅石合金錠 + carbonado_tools: 頂級機器 + first_aid: 急救包 + gold_armor: 比較強的金裝 + night_vision_googles: 夜視鏡 + pickaxe_of_containment: 生怪磚鎬 + hercules_pickaxe: 粉碎鎬 + table_saw: 鋸木機 + slime_steel_armor: 鋼鐵史萊姆套裝 + blade_of_vampires: 吸血之刃 + water_staff: 元素杖—水 + 24k_gold_block: 我就有錢 + composter: 堆肥 + farmer_shoes: 農夫鞋 + explosive_tools: 爆炸性的突破 + automated_panning_machine: 懶人掏金盤 + boots_of_the_stomper: 踐踏之靴 + pickaxe_of_the_seeker: 合法X-ray + backpacks: 背包 + woven_backpack: 手織背包 + crucible: 坩鍋 + gilded_backpack: 鍍金背包 + armored_jetpack: 噴射裝甲 + ender_talismans: 放終界箱 + nickel_and_cobalt: 這是元素不是合金啊啊啊啊啊 + magnet: 磁鐵 + infused_magnet: 物品磁鐵 + cobalt_pickaxe: 我是速度 + essence_of_afterlife: 死靈法師?! + bound_backpack: 魂綁背包 + jetboots: 火箭靴 + armored_jetboots: 火箭鐵靴 + seismic_axe: 地震斧 + pickaxe_of_vein_mining: 連鎖鎬 + bound_weapons: 魂綁武器 + bound_tools: 魂綁工具 + bound_armor: 魂綁套裝 + juicer: 果汁! + repaired_spawner: 修理生怪磚 + enhanced_furnace: 進階熔爐 + more_enhanced_furnaces: 更好的進階熔爐 + high_tier_enhanced_furnaces: 更高階的熔爐 + reinforced_furnace: 強化熔爐 + carbonado_furnace: 碳纖維熔爐 electric_motor: 馬達 + block_placer: 方塊放置器 + scroll_of_dimensional_teleposition: 他很奇異~ + special_bows: 鷹眼 + tome_of_knowledge_sharing: 共產經驗 + flask_of_knowledge: 經驗值儲存器 + hardened_glass: 抗爆 + golden_apple_juice: 比較黃的果汁 + cooler: 保溫器 + ancient_altar: 古代祭壇 + wither_proof_obsidian: 抗凋黑曜石 + ancient_runes: 元素符文 + special_runes: 紫色符文 + infernal_bonemeal: 地獄骨粉 + rainbow_blocks: 彩虹方塊 + infused_hopper: 滴水不漏 + wither_proof_glass: 抗凋玻璃 + duct_tape: FLEX TAPE + plastic_sheet: 塑膠 + android_memory_core: 機器人記憶體 + oil: 美國的最愛 + fuel: 石油燃料 + hologram_projector: 投影文字 + capacitors: 初階電容器 + high_tier_capacitors: 高階電容器 + solar_generators: 太陽能發機 + electric_furnaces: 電磁爐 electric_ore_grinding: 電動研磨 - electric_press: 電動壓縮機 - electric_smeltery: 電動冶煉爐 - elemental_staff: 元素杖 + heated_pressure_chamber: 高溫加壓室 + coal_generator: 乾淨的煤 + bio_reactor: 生化反應爐 + auto_enchanting: 附魔&退魔檯 + auto_anvil: 電動鐵砧 + multimeter: 電力測量 + gps_setup: GPS基礎組件 + gps_emergency_transmitter: GPS求救信號 + programmable_androids: 機器人 + android_interfaces: 機器人接口 + geo_scanner: 地質掃描 + combustion_reactor: 火力反應爐 + teleporter: 傳送檯基座 + teleporter_activation_plates: 傳送裝置 + better_solar_generators: 高階太陽能發電機 + better_gps_transmitters: 高階GPS信號發送器 elevator: 電梯 - elytra: 鞘翅 + energized_solar_generator: 這...這不科學! + energized_gps_transmitter: 頂級GPS信號發送器 + energy_regulator: 電力核心 + butcher_androids: 屠夫機器人 + organic_food: 有機食品 + auto_breeder: 幫你餵動物 + advanced_android: 進階機器人 + advanced_butcher_android: 進階機器人–屠夫 + advanced_fisherman_android: 進階機器人— 漁夫 + animal_growth_accelerator: 動物轉大人 + xp_collector: 經驗收集器 + organic_fertilizer: 有機堆肥 + crop_growth_accelerator: 金坷垃 + better_crop_growth_accelerator: 金坷垃2.0 + reactor_essentials: 反應爐必需品 + nuclear_reactor: 核分裂反應爐 + freezer: 我的超人裝呢 + cargo_basics: 物流基礎 + cargo_nodes: 物流節點 + electric_ingot_machines: 電動煉錠產業鍊 + high_tier_electric_ingot_machines: 高速煉錠產業鍊 + automated_crafting_chamber: 自動合成檯 + better_food_fabricator: 進階食品加工場 + reactor_access_port: 反應爐接口 + fluid_pump: 幫浦 + better_freezer: 比你的笑話還冷 + boosted_uranium: 高壓鈾 + trash_can: 黑洞! + advanced_output_node: 進階輸出接口 + carbon_press: 碳壓縮機 + electric_smeltery: 電動冶煉爐 + better_electric_furnace: 升級版電磁爐 + better_carbon_press: 升級版碳壓縮機 empowered_android: 頂級機器人 empowered_butcher_android: 頂級機器人-屠夫 empowered_fisherman_android: 頂級機器人—漁夫 - ender_armor: 終界套裝 - ender_backpack: 終界背包 - ender_talismans: 放終界箱 - energized_gps_transmitter: 頂級GPS信號發送器 - energized_solar_generator: 這...這不科學! - energy_regulator: 電力核心 - enhanced_furnace: 進階熔爐 - essence_of_afterlife: 死靈法師?! - explosive_tools: 爆炸性的突破 - farmer_shoes: 農夫鞋 - fire_staff: 元素杖—火 - fire_talisman: 火焰護身符 - first_aid: 急救包 - flask_of_knowledge: 經驗值儲存器 - fluid_pump: 幫浦 - fortune_cookie: 幸運餅乾 - freezer: 我的超人裝呢 - fuel: 石油燃料 - geo_miner: 自然資源挖掘機 - gilded_backpack: 鍍金背包 - gilded_iron: 鍍金鐵 - gilded_iron_armor: 鍍金鐵套裝 - glowstone_armor: 螢光石套裝 - gold_armor: 比較強的金裝 - gold_carats: 純金 - golden_apple_juice: 比較黃的果汁 - gold_pan: 掏金盤 - gps_emergency_transmitter: GPS求救信號 - gps_setup: GPS基礎組件 - grappling_hook: 鷹爪鉤 - grind_stone: 研磨機 - hardened_glass: 抗爆 - hazmat_suit: 抗輻射套裝 - heated_pressure_chamber: 高溫加壓室 - hercules_pickaxe: 粉碎鎬 - high_tier_capacitors: 高階電容器 high_tier_carbon_press: 終極碳壓縮機 - high_tier_electric_ingot_machines: 高速煉錠產業鍊 - high_tier_enhanced_furnaces: 更高階的熔爐 - hologram_projector: 投影文字 - hunter_talisman: 獵人護身符 - infernal_bonemeal: 地獄骨粉 - infused_hopper: 滴水不漏 - infused_magnet: 物品磁鐵 - jetboots: 火箭靴 - jetpacks: 噴射背包 - juicer: 果汁! - kelp_cookie: 自然的顏 - knight_talisman: 騎士護身符 - lava_crystal: 燒喔~ + wither_assembler: 凋零農場 + better_heated_pressure_chamber: 進階高溫加壓室 + elytra: 鞘翅 + special_elytras: 特殊鞘翅 + electric_crucible: 電動坩堝 + better_electric_crucibles: 電熱坩堝—改 + advanced_electric_smeltery: 進階電動冶煉爐 + advanced_farmer_android: 進階機器人—農夫 lava_generator: 熔岩發電機 - lava_talisman: 熔岩護身符 - lightning_rune: 閃電符文 - lumber_axe: 伐木斧 - lumps: 魔法結晶 - magical_book_cover: 魔法書封面 - magic_eye_of_ender: 終界法眼 - magician_talisman: 法師護身符 - magic_sugar: 魔法糖 - magic_workbench: 魔術合成檯 - magnesium_generator: 鎂鹽發電 - magnet: 磁鐵 - meat_jerky: 肉乾 - miner_talisman: 礦工護身符 - misc_power_items: 硫酸鹽和能量水晶 - monster_jerky: 腐肉乾 - more_enhanced_furnaces: 更好的進階熔爐 - multimeter: 電力測量 - multitools: 多功能工具 - nether_gold_pan: 地域掏金盤 nether_ice: 地域冰 nether_star_reactor: 地域之星反應堆 - nickel_and_cobalt: 這是元素不是合金啊啊啊啊啊 - night_vision_googles: 夜視鏡 - nuclear_reactor: 核分裂反應爐 - oil: 美國的最愛 - ore_crusher: 雙倍礦物 - ore_washer: 礦物洗滌機 - organic_fertilizer: 有機堆肥 - organic_food: 有機食品 + blistering_ingots: 發泡錠 + automatic_ignition_chamber: 自動點火 output_chest: 基礎器械輸出箱 - parachute: 降落傘 - pickaxe_of_containment: 生怪磚鎬 - pickaxe_of_the_seeker: 合法X-ray - pickaxe_of_vein_mining: 連鎖鎬 - plastic_sheet: 塑膠 - portable_crafter: 隨身合成檯 - portable_dustbin: 隨身垃圾桶 - pressure_chamber: 加壓室 - programmable_androids: 機器人 + copper_wire: 良導體! radiant_backpack: 超級背包 - rainbow_blocks: 彩虹方塊 - reactor_access_port: 反應爐接口 - reactor_essentials: 反應爐必需品 - redstone_alloy: 紅石合金錠 - reinforced_alloy: 強化合金錠 - reinforced_armor: 強化合金錠套裝 - reinforced_furnace: 強化熔爐 - repaired_spawner: 修理生怪磚 - scroll_of_dimensional_teleposition: 他很奇異~ - seismic_axe: 地震斧 - silicon: 麥塊矽谷 - slime_armor: 史萊姆套裝 - slimefun_metals: 更多金屬 - slime_steel_armor: 鋼鐵史萊姆套裝 - smelters_pickaxe: 冶煉鎬 - smeltery: 冶煉爐 - solar_generators: 太陽能發機 - solar_panel_and_helmet: 太陽能頭盔 - soulbound_rune: 魂綁符文 - special_bows: 鷹眼 - special_elytras: 特殊鞘翅 - special_runes: 紫色符文 - steel: 鋼鐵時代 - steel_plate: 鋼板 - steel_thruster: 鋼製推進器 + auto_drier: 乾燥機 + diet_cookie: 減肥餅 storm_staff: 元素杖—風暴 - sword_of_beheading: 斬首劍 - synthetic_diamond: 合成鑽石 - synthetic_emerald: 人造翡翠 - synthetic_sapphire: 合成藍寶石 - table_saw: 鋸木機 - teleporter: 傳送檯基座 - teleporter_activation_plates: 傳送裝置 - tome_of_knowledge_sharing: 共產經驗 + soulbound_rune: 魂綁符文 + geo_miner: 自然資源挖掘機 + lightning_rune: 閃電符文 totem_of_undying: 逃避死亡 - trash_can: 黑洞! - traveller_talisman: 旅者護身符 - uranium: 輻射金屬 - walking_sticks: 拐杖 - warrior_talisman: 戰士護身符 - water_staff: 元素杖—水 - water_talisman: 水中呼吸護身符 - whirlwind_talisman: 旋風護身符 - wind_staff: 元素杖—風 - wither_assembler: 凋零農場 - wither_proof_glass: 抗凋玻璃 - wither_proof_obsidian: 抗凋黑曜石 - wizard_talisman: 巫師護身符 - woven_backpack: 手織背包 - xp_collector: 經驗收集器 - geo_scanner: 地質掃描 + charging_bench: 充電台 + nether_gold_pan: 地域掏金盤 + electric_press: 電動壓縮機 + magnesium_generator: 鎂鹽發電 + kelp_cookie: 自然的顏 + makeshift_smeltery: 自動冶煉 + tree_growth_accelerator: 自動金坷垃 + industrial_miner: 工業化採礦 + advanced_industrial_miner: 工業化採礦 - 改 + magical_zombie_pills: 救贖藥丸 + auto_brewer: 工業化釀造 From 758e687783ba6146306ef8233e772444a65bb429 Mon Sep 17 00:00:00 2001 From: HeroBrineKing Date: Fri, 26 Jun 2020 21:51:20 +0000 Subject: [PATCH 22/31] Translate messages_zh-TW.yml via GitLocalize --- .../resources/languages/messages_zh-TW.yml | 496 +++++++++--------- 1 file changed, 260 insertions(+), 236 deletions(-) diff --git a/src/main/resources/languages/messages_zh-TW.yml b/src/main/resources/languages/messages_zh-TW.yml index 572635929..26b65a0d6 100644 --- a/src/main/resources/languages/messages_zh-TW.yml +++ b/src/main/resources/languages/messages_zh-TW.yml @@ -1,219 +1,133 @@ --- -android: - scripts: - already-uploaded: "&4程式已上傳" - editor: 程式編輯器 - enter-name: - - - - "&e輸入程式名稱" - instructions: - ATTACK_ANIMALS: "&4攻擊&c動物" - ATTACK_ANIMALS_ADULT: "&4攻擊&c成年動物" - ATTACK_MOBS: "&4攻擊&c主動怪" - ATTACK_MOBS_ANIMALS: "&4攻擊&c主動怪和動物" - CATCH_FISH: "&b嘗試抓魚" - CHOP_TREE: "&c砍完整棵樹並重種" - DIG_DOWN: "&b挖下面" - DIG_FORWARD: "&b挖前面" - DIG_UP: "&b挖上面" - FARM_DOWN: "&b向下收割並重種" - FARM_EXOTIC_DOWN: "&b進階向下收割並重種" - FARM_EXOTIC_FORWARD: "&b進階向前收割並重種" - FARM_FORWARD: "&b向前收割並重種" - GO_DOWN: "&7向下移動" - GO_FORWARD: "&7向前移動" - GO_UP: "&7向上移動" - INTERFACE_FUEL: "&c從燃料節點取得燃料" - INTERFACE_ITEMS: "&c向物品節點輸入物品" - MOVE_AND_DIG_DOWN: "&b挖並向下移動" - MOVE_AND_DIG_FORWARD: "&b挖並向前移動" - MOVE_AND_DIG_UP: "&b挖並向上移動" - REPEAT: "&9重複程式" - START: "&2執行程式" - TURN_LEFT: "&7左轉" - TURN_RIGHT: "&7右轉" - WAIT: "&e等0.5秒" - rating: - already: "&4你已經評價過此程式!" - own: "&4你不能評價自己的程式!" - uploaded: - - "&b上傳中" - - "&a成功上傳程式!" - started: "&7機器人繼續運作" - stopped: "&7機器人暫停運作" -anvil: - not-working: "&4科技物品需要用自動鐵砧+修理膠帶!" -backpack: - already-open: "&c別人正在使用這個背包!" - no-stack: "&c背包不能疊!" commands: + help: 顯示此幫助畫面 cheat: 允許您以作弊取得物品 give: 給其他玩家Slimefun物品 guide: 給自己一個Slimefun指南 - help: 顯示此幫助畫面 + timings: 關於您的伺服器的卡頓信息 + teleporter: 查看其他玩家的位置標點 + versions: 列出所有已安裝的附屬插件 + search: 在指南中搜索輸入的字句 open_guide: 打開Slimefun指南(不使用書本) + stats: 顯示玩家的統計數據 research: description: 解鎖/重置玩家的研究項目 reset: "&c你已使%player%變回智障" reset-target: "&c你變回笨蛋了" - search: 在指南中搜索輸入的字句 - stats: 顯示玩家的統計數據 - teleporter: 查看其他玩家的位置標點 - timings: 關於您的伺服器的卡頓信息 - versions: 列出所有已安裝的附屬插件 -gps: - deathpoint: "&4死亡點&7%date%" - geo: - scan-required: "&4請先做地質掃描" - insufficient-complexity: - - "&4GPS信號不足 &c%complexity%" - - "&4a) GPS基礎設施未放置" - - "&4b)GPS信號不足" - waypoint: - added: "&a成功新增傳送點" - max: "&4傳送點已達上限" - new: "&e輸入傳送點名稱 &7(Color Codes supported!)" + backpack: + description: 檢索已存在背包的副本 + invalid-id: "&4ID不能是負數!" + player-never-joined: "&4找不到該ID的玩家" + backpack-does-not-exist: "&4該背包不存在!" + restored-backpack-given: "&a你的背包已被修復並放到你的物品欄中!" guide: - back: - guide: 回到Slimefun指南 - settings: 回到設定介面 - title: 上一頁 + search: + message: "&c你要搜尋什麼?" + name: "&7搜尋..." + tooltip: "&b點擊以尋找物品" + inventory: '尋找: %item%' + lore: + - "&b您要搜尋什麼?" + - "&7請輸入搜尋字句到聊天" cheat: no-multiblocks: "&4您不能靠作弊取得多方塊結構機械,你必須用蓋的!" - credits: - commit: 成員 - commits: 成員 - profile-link: 點擊觀看他們在GitHub上的個人資料 - roles: - developer: "&6開發人員" - resourcepack: "&7資源包製作人員" - translator: "&9翻譯人員" - wiki: "&3Wiki編輯人員" languages: + updated: "&a你的語言已改成: &b%lang%" + translations: + name: "&a缺少什麼嗎?" + lore: 點擊增加您自己的翻譯 select: 點擊選擇此語言 select-default: 點擊選擇默認語言 selected-language: 當前選擇: - translations: - lore: 點擊增加您自己的翻譯 - name: "&a缺少什麼嗎?" - updated: "&a你的語言已改成: &b%lang%" + title: + main: Slimefun指南 + settings: 設置及資訊 + languages: 請選擇您偏好的語言 + credits: Slimefun4貢獻者 + wiki: Slimefun4 Wiki + addons: Slimefun4的附加插件 + bugs: 錯誤報告 + source: 來源代碼 + credits: + commit: 成員 + commits: 成員 + roles: + developer: "&6開發人員" + wiki: "&3Wiki編輯人員" + resourcepack: "&7資源包製作人員" + translator: "&9翻譯人員" + profile-link: 點擊觀看他們在GitHub上的個人資料 + pages: + previous: 上一頁 + next: 下一頁 + tooltips: + open-category: 點擊開啟 + versions-notice: 這些在報告錯誤時非常重要! + wiki: 在Slimefun官方Wiki上查看此物品 + recipes: + machine: 使用本機械的合成表 + miner: 此挖礦機可獲取的資源 + generator: 可以使用的燃料 + gold-pan: 可以獲取的資源 + back: + title: 上一頁 + guide: 回到Slimefun指南 + settings: 回到設定介面 locked: 已鎖定 locked-category: - 要解鎖此分類 - 必須先解鎖下列分類 - 的所有物品 - pages: - next: 下一頁 - previous: 上一頁 - search: - inventory: '尋找: %item%' - lore: - - "&b您要搜尋什麼?" - - "&7請輸入搜尋字句到聊天" - message: "&c你要搜尋什麼?" - name: "&7搜尋..." - tooltip: "&b點擊以尋找物品" - title: - addons: Slimefun4的附加插件 - bugs: 錯誤報告 - credits: Slimefun4貢獻者 - languages: 請選擇您偏好的語言 - main: Slimefun指南 - settings: 設置及資訊 - source: 來源代碼 - wiki: Slimefun4 Wiki - tooltips: - open-category: 點擊開啟 - recipes: - generator: 可以使用的燃料 - gold-pan: 可以獲取的資源 - machine: 使用本機械的合成表 - miner: 此挖礦機可獲取的資源 - versions-notice: 這些在報告錯誤時非常重要! - wiki: 在Slimefun官方Wiki上查看此物品 -inventory: - no-access: "&4沒有權限使用該物品" -languages: - af: 南非語 - ar: 阿拉伯文 - bg: 保加利亞語 - cs: 捷克文 - da: 丹麥文 - de: 德語 - default: 默認 - el: 希臘語 - en: 英語 - es: 西班牙文 - fa: 波斯語 - fi: 芬蘭文 - fr: 法文 - he: 希伯來語 - hu: 匈牙利文 - id: 印尼語 - it: 義大利文 - ja: 日語 - ko: 韓語 - lv: 拉脫維亞語 - ms: 馬來語 - nl: 荷蘭語 - 'no': 挪威 - pl: 波蘭語 - pt: 葡萄牙文(葡萄牙) - pt-BR: 葡萄牙文(巴西) - ro: 羅馬尼亞語 - ru: 俄語 - sk: 斯洛伐克文 - sv: 瑞典語 - th: 泰語 - tr: 土耳其 - uk: 烏克蘭文 - vi: 越南文 - zh-CN: 中文(簡體) - zh-TW: 中文(繁體) -machines: - ANCIENT_ALTAR: - not-enough-pedestals: "&4此祭壇需要更多基座&c(%pedestals% / 8)" - unknown-catalyst: "&4未知中心物品! &c請檢察合成表!" - unknown-recipe: "&4未知合成表! &c請檢察合成表!" - ANCIENT_PEDESTAL: - obstructed: "&4基座被擋住了! &c移除上方的方塊!" - CARGO_NODES: - must-be-placed: "&4必須連接在箱子或機器旁!" - ELEVATOR: - click-to-teleport: "&e按這 &7來傳送到該樓:" - current-floor: "&e這是你現在的樓層:" - enter-name: "&7輸入你的樓層名稱&r(可以輸入顏色代碼!)" - named: "&2成功命名為 &r%floor%" - no-destinations: "&4沒有目的地" - pick-a-floor: "&3選擇樓層" - full-inventory: "&e發射器滿了!(請考慮使用基礎機械輸出箱)" - GPS_CONTROL_PANEL: - title: GPS控制面板 - transmitters: 訊號發射器總覽 - waypoints: 傳送點總覽 - HOLOGRAM_PROJECTOR: - enter-text: "&7輸入你想要的文字 &r(可以輸入顏色代碼!)" - inventory-title: 全息投影編輯器 - ignition-chamber-no-flint: "&c點火系統沒有打火石" - in-use: "&c別人正在使用這台機器" - pattern-not-found: "&e查無此合成表 請確認使用的機器或合成表的材料" - TELEPORTER: - cancelled: "&4傳送中止!" - gui: - time: 估計時間 - title: 你的標記點 - tooltip: 點擊以傳送 - invulnerability: "&b&l你得到了30秒的無敵!" - teleported: "&3傳送成功!" - teleporting: "&3傳送中..." - unknown-material: "&e這個機器不能處理這個物品 請確認使用的機器或合成表的材料" - wrong-item: "&e你手持的物品和機器並不相容 請確認使用的機器或合成表的材料" messages: - cannot-place: "&c那裡不能放方塊!" - diet-cookie: "&e你開始覺得很輕..." + not-researched: "&4你太笨了" + not-enough-xp: "&4你沒有足夠的經驗值用以解鎖這個" + unlocked: "&b你已解鎖&7“%research%”" + only-players: "&4此命令只可由玩家發送" + unknown-player: "&4未知玩家:&c%player%" + no-permission: "&4您沒有執行此動作所需的權限" + usage: "&4用法: &c%usage%" + not-online: "&4%player% &c還未上線!" + not-valid-item: "&4%item% &c不存在!" + not-valid-amount: "&4%amount% &c不是有效數量:數值必須大於0!" + given-item: '&b你已獲得 &a%amount% &7"%item%&7"' + give-item: '&b你已給予%player% &a%amount% &7"%item%&7"' + not-valid-research: "&4%research% &c不存在!" + give-research: '&b你已給予%player% 研究項目&7"%research%&7"' + hungry: "&c你太餓了,做不了這個!" + mode-change: "&b%device% 模式切換至: &9%mode%" disabled-in-world: "&4&l此物品在此世界中已被禁用" disabled-item: "&4&l此物品已被禁用!你到底是怎樣得到的?" + no-tome-yourself: "&c你不能在自己身上使用 &4知識之書&c..." + multimeter: "&b已儲存的能量:&3%stored% &b最大容量:&3%capacity%" + talisman: + anvil: "&a&o你的護符免了您的工具於斷裂" + miner: "&a&o你的護符剛雙倍了你的掉落" + hunter: "&a&o你的護符剛雙倍了你的掉落" + lava: "&a&o你的護符把你從被燒死的命運中救出" + water: "&a&o你的護身符給了你空氣" + angel: "&a&o你的護身符使你免疫摔落傷害" + fire: "&a&o你的護身符使你沒有燒死" + magician: "&a&o你的護身符給了你額外的附魔" + traveller: "&a&o你的護身符給了你速度3" + warrior: "&a&o你的護身符暫時提高了你的力量" + knight: "&a&o你的護身符給了你5秒的回復時間" + whirlwind: "&a&o你的護身符反射了投射物" + wizard: "&a&o你的護身符為你升高了幸運等級,但也降低了其他附魔等級" + soulbound-rune: + fail: "&c你一次只能魂綁一個物品。" + success: "&a您已成功將此物品綁定魂綁!死後不會噴掉。" + research: + start: "&7遠古之靈在你耳邊低語!" + progress: "&7你開始研究&b%research% &e(%progress%)" fire-extinguish: "&7你熄滅身上的火" + cannot-place: "&c那裡不能放方塊!" + no-pvp: "&c這裡不准打架!" + radiation: "&4你正暴露在致命的輻射之下!&c立即丟棄放射性物品或裝備完整的防護服!" + opening-guide: "&b正在打開指南,這可能需要幾秒鐘的時間..." + opening-backpack: "&b正在打開背包,這可能需要幾秒鐘的時間..." + no-iron-golem-heal: "&c這不是鐵錠。你不能用它來治癒鐵巨人!" + link-prompt: "&e點擊此處:" + diet-cookie: "&e你開始覺得很輕..." fortune-cookie: - "&7快來幫幫我!我在幸運餅乾工廠裡出不了來!" - "&7明天會有苦力怕歡樂送" @@ -225,51 +139,161 @@ messages: - "&742, 萬物的答案" - "&7Walshy會使你每天開開心心\n" - "&7不要垂直往下挖!" - give-item: '&b你已給予%player% &a%amount% &7"%item%&7"' - given-item: '&b你已獲得 &a%amount% &7"%item%&7"' - give-research: '&b你已給予%player% 研究項目&7"%research%&7"' - hungry: "&c你太餓了,做不了這個!" - link-prompt: "&e點擊此處:" - mode-change: "&b%device% 模式切換至: &9%mode%" - multimeter: "&b已儲存的能量:&3%stored% &b最大容量:&3%capacity%" - no-iron-golem-heal: "&c這不是鐵錠。你不能用它來治癒鐵巨人!" - no-permission: "&4您沒有執行此動作所需的權限" - no-pvp: "&c這裡不准打架!" - not-enough-xp: "&4你沒有足夠的經驗值用以解鎖這個" - no-tome-yourself: "&c你不能在自己身上使用 &4知識之書&c..." - not-online: "&4%player% &c還未上線!" - not-researched: "&4你太笨了" - not-valid-amount: "&4%amount% &c不是有效數量:數值必須大於0!" - not-valid-item: "&4%item% &c不存在!" - not-valid-research: "&4%research% &c不存在!" - only-players: "&4此命令只可由玩家發送" - opening-backpack: "&b正在打開背包,這可能需要幾秒鐘的時間..." - opening-guide: "&b正在打開指南,這可能需要幾秒鐘的時間..." - radiation: "&4你正暴露在致命的輻射之下!&c立即丟棄放射性物品或裝備完整的防護服!" - research: - progress: "&7你開始研究&b%research% &e(%progress%)" - start: "&7遠古之靈在你耳邊低語!" - soulbound-rune: - fail: "&c你一次只能魂綁一個物品。" - success: "&a您已成功將此物品綁定魂綁!死後不會噴掉。" - talisman: - angel: "&a&o你的護身符使你免疫摔落傷害" - anvil: "&a&o你的護符免了您的工具於斷裂" - fire: "&a&o你的護身符使你沒有燒死" - hunter: "&a&o你的護符剛雙倍了你的掉落" - knight: "&a&o你的護身符給了你5秒的回復時間" - lava: "&a&o你的護符把你從被燒死的命運中救出" - magician: "&a&o你的護身符給了你額外的附魔" - miner: "&a&o你的護符剛雙倍了你的掉落" - traveller: "&a&o你的護身符給了你速度3" - warrior: "&a&o你的護身符暫時提高了你的力量" - water: "&a&o你的護身符給了你空氣" - whirlwind: "&a&o你的護身符反射了投射物" - wizard: "&a&o你的護身符為你升高了幸運等級,但也降低了其他附魔等級" - unknown-player: "&4未知玩家:&c%player%" - unlocked: "&b你已解鎖&7“%research%”" - usage: "&4用法: &c%usage%" -miner: - no-ores: "&e附近沒礦了!" + - "&7這只是一個小傷!" + - "&7永遠保持樂觀積極!" + - "&7這不是普通的餅乾" + - "&7霓虹燈好帥!" +machines: + pattern-not-found: "&e查無此合成表 請確認使用的機器或合成表的材料" + unknown-material: "&e這個機器不能處理這個物品 請確認使用的機器或合成表的材料" + wrong-item: "&e你手持的物品和機器並不相容 請確認使用的機器或合成表的材料" + full-inventory: "&e發射器滿了!(請考慮使用基礎機械輸出箱)" + in-use: "&c別人正在使用這台機器" + ignition-chamber-no-flint: "&c點火系統沒有打火石" + ANCIENT_ALTAR: + not-enough-pedestals: "&4此祭壇需要更多基座&c(%pedestals% / 8)" + unknown-catalyst: "&4未知中心物品! &c請檢察合成表!" + unknown-recipe: "&4未知合成表! &c請檢察合成表!" + ANCIENT_PEDESTAL: + obstructed: "&4基座被擋住了! &c移除上方的方塊!" + HOLOGRAM_PROJECTOR: + enter-text: "&7輸入你想要的文字 &r(可以輸入顏色代碼!)" + inventory-title: 全息投影編輯器 + ELEVATOR: + no-destinations: "&4沒有目的地" + pick-a-floor: "&3選擇樓層" + current-floor: "&e這是你現在的樓層:" + click-to-teleport: "&e按這 &7來傳送到該樓:" + enter-name: "&7輸入你的樓層名稱&r(可以輸入顏色代碼!)" + named: "&2成功命名為 &r%floor%" + TELEPORTER: + teleporting: "&3傳送中..." + teleported: "&3傳送成功!" + cancelled: "&4傳送中止!" + invulnerability: "&b&l你得到了30秒的無敵!" + gui: + title: 你的標記點 + tooltip: 點擊以傳送 + time: 估計時間 + CARGO_NODES: + must-be-placed: "&4必須連接在箱子或機器旁!" + GPS_CONTROL_PANEL: + title: GPS控制面板 + transmitters: 訊號發射器總覽 + waypoints: 傳送點總覽 + INDUSTRIAL_MINER: + no-fuel: "&c你的工業挖礦機沒燃料了! 將燃料放置到上方的箱子" + piston-facing: "&c工業挖礦機的活塞需要朝上!" + piston-space: "&c兩活塞的上面需要為空氣!" + destroyed: "&c你的工業挖礦機被摧毀了" + already-running: "&c此工業挖礦機已經在運作中了!" + full-chest: "&c此工業挖礦機的箱子已滿!" + no-permission: "&4你沒有權限在此使用工業挖礦機!" + finished: "&e你的工業挖礦機已挖掘完畢 共挖到 %ores% 個!" +anvil: + not-working: "&4科技物品需要用自動鐵砧+修理膠帶!" +backpack: + already-open: "&c別人正在使用這個背包!" + no-stack: "&c背包不能疊!" workbench: not-enhanced: "&4科技物品不可在普通合成檯使用" +gps: + deathpoint: "&4死亡點&7%date%" + waypoint: + new: "&e輸入傳送點名稱 &7(Color Codes supported!)" + added: "&a成功新增傳送點" + max: "&4傳送點已達上限" + insufficient-complexity: + - "&4GPS信號不足 &c%complexity%" + - "&4a) GPS基礎設施未放置" + - "&4b)GPS信號不足" + geo: + scan-required: "&4請先做地質掃描" +inventory: + no-access: "&4沒有權限使用該物品" +android: + started: "&7機器人繼續運作" + stopped: "&7機器人暫停運作" + scripts: + already-uploaded: "&4程式已上傳" + instructions: + START: "&2執行程式" + REPEAT: "&9重複程式" + WAIT: "&e等0.5秒" + GO_FORWARD: "&7向前移動" + GO_UP: "&7向上移動" + GO_DOWN: "&7向下移動" + TURN_LEFT: "&7左轉" + TURN_RIGHT: "&7右轉" + DIG_UP: "&b挖上面" + DIG_FORWARD: "&b挖前面" + DIG_DOWN: "&b挖下面" + MOVE_AND_DIG_UP: "&b挖並向上移動" + MOVE_AND_DIG_FORWARD: "&b挖並向前移動" + MOVE_AND_DIG_DOWN: "&b挖並向下移動" + ATTACK_MOBS_ANIMALS: "&4攻擊&c主動怪和動物" + ATTACK_MOBS: "&4攻擊&c主動怪" + ATTACK_ANIMALS: "&4攻擊&c動物" + ATTACK_ANIMALS_ADULT: "&4攻擊&c成年動物" + CHOP_TREE: "&c砍完整棵樹並重種" + CATCH_FISH: "&b嘗試抓魚" + FARM_FORWARD: "&b向前收割並重種" + FARM_DOWN: "&b向下收割並重種" + FARM_EXOTIC_FORWARD: "&b進階向前收割並重種" + FARM_EXOTIC_DOWN: "&b進階向下收割並重種" + INTERFACE_ITEMS: "&c向物品節點輸入物品" + INTERFACE_FUEL: "&c從燃料節點取得燃料" + enter-name: + - + - "&e輸入程式名稱" + uploaded: + - "&b上傳中" + - "&a成功上傳程式!" + rating: + own: "&4你不能評價自己的程式!" + already: "&4你已經評價過此程式!" + editor: 程式編輯器 +languages: + default: 默認 + en: 英語 + de: 德語 + fr: 法文 + it: 義大利文 + es: 西班牙文 + pl: 波蘭語 + sv: 瑞典語 + nl: 荷蘭語 + cs: 捷克文 + hu: 匈牙利文 + lv: 拉脫維亞語 + ru: 俄語 + sk: 斯洛伐克文 + zh-TW: 中文(繁體) + vi: 越南文 + id: 印尼語 + zh-CN: 中文(簡體) + el: 希臘語 + he: 希伯來語 + ar: 阿拉伯文 + af: 南非語 + da: 丹麥文 + fi: 芬蘭文 + uk: 烏克蘭文 + ms: 馬來語 + 'no': 挪威 + ja: 日語 + fa: 波斯語 + th: 泰語 + ro: 羅馬尼亞語 + pt: 葡萄牙文(葡萄牙) + pt-BR: 葡萄牙文(巴西) + bg: 保加利亞語 + ko: 韓語 + tr: 土耳其 + hr: 克羅地亞語 + mk: 馬其頓語 + sr: 塞爾維亞語 + be: 白俄羅斯語 + tl: 他加祿語 +miner: + no-ores: "&e附近沒礦了!" From c941b9080ff88fa07339a5b2fc8877968292ef44 Mon Sep 17 00:00:00 2001 From: Vravinite Date: Fri, 26 Jun 2020 21:53:21 +0000 Subject: [PATCH 23/31] Translate recipes_es.yml via GitLocalize --- src/main/resources/languages/recipes_es.yml | 253 ++++++++++---------- 1 file changed, 129 insertions(+), 124 deletions(-) diff --git a/src/main/resources/languages/recipes_es.yml b/src/main/resources/languages/recipes_es.yml index af652ac8c..8dcb8c432 100644 --- a/src/main/resources/languages/recipes_es.yml +++ b/src/main/resources/languages/recipes_es.yml @@ -1,145 +1,107 @@ --- -minecraft: - blasting: - lore: - - Funde este objeto en un Alto Horno - - para obtener el objeto que buscas. - name: Receta de Alto Horno - campfire: - lore: - - Funde este objeto sobre una Hoguera - - para obtener el objeto que buscas. - name: Receta de Hoguera - furnace: - lore: - - Funde este objeto en un Horno - - para obtener el objeto que buscas. - name: Receta de Horno - shaped: - lore: - - Haz este objeto tal como se muestra - - en una Tabla de Crafteo normal, - - la forma es importante. - name: Receta de Crafteo con forma - shapeless: - lore: - - Haz este objeto tal como se muestra - - en una Tabla de Crafteo normal - - Esta receta no tiene forma. - name: Receta de Crafteo sin forma - smoking: - lore: - - Funde este objeto en un Ahumador - - para obtener el objeto que buscas. - name: Receta de Ahumador - stonecutting: - lore: - - Haz este objeto tal como se muestra - - usando un Cortapiedras - name: Receta de Cortapiedras slimefun: - ancient_altar: + multiblock: + name: Multiblock lore: - - Haz este objeto tal como se muestra - - usando un Ancient Altar. - - Busca Ancient Altar para mas info. - name: Ancient Altar - armor_forge: - lore: - - Haz este objeto tal como se muestra - - usando una Armor Forge - name: Armor Forge - compressor: - lore: - - Haz este objeto tal como se muestra - - usando un Compressor - name: Compressor + - Construye la estructura presentada + - tal cual. No es una receta. enhanced_crafting_table: + name: Enhanced Crafting Table lore: - Haz este objeto tal como se muestra - en una Enhanced Crafting Table. - "¡Una Tabla de Crafteo normal no servirá!" - name: Enhanced Crafting Table - food_composter: + armor_forge: + name: Armor Forge lore: - Haz este objeto tal como se muestra - - usando un Food Composter - name: Food Composter - food_fabricator: - lore: - - Haz este objeto tal como se muestra - - usando un Food Fabricator - name: Food Fabricator - freezer: - lore: - - Congela este objeto tal como se muestra - - usando un Freezer - name: Freezer - geo_miner: - lore: - - Este objeto se puede obtener - - usando un GEO Miner - name: GEO Miner - gold_pan: - lore: - - Usa un Gold Pan para - - obtener este objeto. - name: Gold Pan + - usando una Armor Forge grind_stone: + name: Grind Stone lore: - Haz este objeto tal como se muestra - usando una Grind Stone - name: Grind Stone - heated_pressure_chamber: - lore: - - Haz este objeto tal como se muestra - - usando una Heated Pressure Chamber - name: Heated Pressure Chamber - juicer: - lore: - - Haz este jugo tal como se muestra - - usando un Juicer - name: Juicer - magic_workbench: - lore: - - Haz este objeto tal como se muestra - - Usando una Magic Workbench - name: Magic Workbench - mob_drop: - lore: - - Mata ese Mob para - - obtener este objeto. - name: Botín de Mob - multiblock: - lore: - - Construye la estructura presentada - - tal cual. No es una receta. - name: Multiblock - nuclear_reactor: - lore: - - Este objeto es un suproducto generado - - al correr un Nuclear Reactor - name: Nuclear Reactor - ore_crusher: - lore: - - Haz este objeto tal como se muestra - - usando un Ore Crusher - name: Ore Crusher - ore_washer: - lore: - - Haz este objeto tal como se muestra - - usando un Ore Washer - name: Ore Washer - pressure_chamber: - lore: - - Haz este objeto tal como se muestra - - usando un Pressure Chamber - name: Pressure Chamber smeltery: + name: Smeltery lore: - Haz este objeto tal como se muestra - usando un Smeltery - name: Smeltery + ore_crusher: + name: Ore Crusher + lore: + - Haz este objeto tal como se muestra + - usando un Ore Crusher + mob_drop: + name: Botín de Mob + lore: + - Mata ese Mob para + - obtener este objeto. + gold_pan: + name: Gold Pan + lore: + - Usa un Gold Pan para + - obtener este objeto. + compressor: + name: Compressor + lore: + - Haz este objeto tal como se muestra + - usando un Compressor + pressure_chamber: + name: Pressure Chamber + lore: + - Haz este objeto tal como se muestra + - usando un Pressure Chamber + ore_washer: + name: Ore Washer + lore: + - Haz este objeto tal como se muestra + - usando un Ore Washer + juicer: + name: Juicer + lore: + - Haz este jugo tal como se muestra + - usando un Juicer + magic_workbench: + name: Magic Workbench + lore: + - Haz este objeto tal como se muestra + - Usando una Magic Workbench + ancient_altar: + name: Ancient Altar + lore: + - Haz este objeto tal como se muestra + - usando un Ancient Altar. + - Busca Ancient Altar para mas info. + heated_pressure_chamber: + name: Heated Pressure Chamber + lore: + - Haz este objeto tal como se muestra + - usando una Heated Pressure Chamber + food_fabricator: + name: Food Fabricator + lore: + - Haz este objeto tal como se muestra + - usando un Food Fabricator + food_composter: + name: Food Composter + lore: + - Haz este objeto tal como se muestra + - usando un Food Composter + freezer: + name: Freezer + lore: + - Congela este objeto tal como se muestra + - usando un Freezer + geo_miner: + name: GEO Miner + lore: + - Este objeto se puede obtener + - usando un GEO Miner + nuclear_reactor: + name: Nuclear Reactor + lore: + - Este objeto es un suproducto generado + - al correr un Nuclear Reactor oil_pump: name: Oil Pump lore: @@ -156,3 +118,46 @@ slimefun: lore: - Haz este objeto tal como se muestra - usando una Refinery +minecraft: + shaped: + name: Receta de Crafteo con forma + lore: + - Haz este objeto tal como se muestra + - en una Tabla de Crafteo normal, + - la forma es importante. + shapeless: + name: Receta de Crafteo sin forma + lore: + - Haz este objeto tal como se muestra + - en una Tabla de Crafteo normal + - Esta receta no tiene forma. + furnace: + name: Receta de Horno + lore: + - Funde este objeto en un Horno + - para obtener el objeto que buscas. + blasting: + name: Receta de Alto Horno + lore: + - Funde este objeto en un Alto Horno + - para obtener el objeto que buscas. + smoking: + name: Receta de Ahumador + lore: + - Funde este objeto en un Ahumador + - para obtener el objeto que buscas. + campfire: + name: Receta de Hoguera + lore: + - Funde este objeto sobre una Hoguera + - para obtener el objeto que buscas. + stonecutting: + name: Receta de Cortapiedras + lore: + - Haz este objeto tal como se muestra + - usando un Cortapiedras + smithing: + name: Smithing Table Recipe + lore: + - Haz este objeto como se muestra + - usando una Smithing Table From e081d15c6d6643d40d46c1adb4275df80ac69d9c Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Sat, 27 Jun 2020 01:46:20 +0200 Subject: [PATCH 24/31] Fixed a slight mistake with the lore --- .../core/attributes/RechargeableHelper.java | 6 ++++-- .../testing/tests/items/TestRechargeableItems.java | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/RechargeableHelper.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/RechargeableHelper.java index 43e0378ff..546ffe0e9 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/RechargeableHelper.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/RechargeableHelper.java @@ -2,6 +2,7 @@ package io.github.thebusybiscuit.slimefun4.core.attributes; import java.math.BigDecimal; import java.math.RoundingMode; +import java.util.ArrayList; import java.util.List; import org.bukkit.NamespacedKey; @@ -37,13 +38,14 @@ final class RechargeableHelper { meta.getPersistentDataContainer().set(CHARGE_KEY, PersistentDataType.FLOAT, value); } - List lore = meta.getLore(); + List lore = meta.hasLore() ? meta.getLore() : new ArrayList<>(); for (int i = 0; i < lore.size(); i++) { String line = lore.get(i); if (line.startsWith(LORE_PREFIX)) { lore.set(i, LORE_PREFIX + value + " / " + capacity + " J"); - break; + meta.setLore(lore); + return; } } diff --git a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/items/TestRechargeableItems.java b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/items/TestRechargeableItems.java index 13499c17d..3e11539ef 100644 --- a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/items/TestRechargeableItems.java +++ b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/items/TestRechargeableItems.java @@ -87,6 +87,20 @@ public class TestRechargeableItems { Assertions.assertFalse(rechargeable.addItemCharge(item, 1)); } + @Test + public void testAddItemChargeWithoutLore() { + Rechargeable rechargeable = mock("CHARGING_NO_LORE_TEST", 10); + ItemStack item = new CustomItem(Material.REDSTONE_BLOCK, "&4Chargeable Item with no lore"); + + Assertions.assertEquals(0, rechargeable.getItemCharge(item)); + + Assertions.assertTrue(rechargeable.addItemCharge(item, 10)); + Assertions.assertEquals(10, rechargeable.getItemCharge(item)); + + String lore = ChatColors.color("&c&o&8\u21E8 &e\u26A1 &7") + "10.0 / 10.0 J"; + Assertions.assertEquals(lore, item.getItemMeta().getLore().get(0)); + } + @Test public void testRemoveItemCharge() { Rechargeable rechargeable = mock("CHARGING_BOUNDS_TEST", 10); From b2833b3ce85782ea07f2513cbc44904026f43f89 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Sat, 27 Jun 2020 02:18:49 +0200 Subject: [PATCH 25/31] Removed unused parameter --- .../implementation/items/electric/gadgets/SolarHelmet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/SolarHelmet.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/SolarHelmet.java index 79263be8f..c9d4f1812 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/SolarHelmet.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/SolarHelmet.java @@ -28,7 +28,7 @@ public class SolarHelmet extends SlimefunItem { private final ItemSetting charge = new ItemSetting<>("charge-amount", 0.1); public SolarHelmet(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) { - super(category, item, recipeType, recipe, null); + super(category, item, recipeType, recipe); addItemSetting(charge); } From f6f09d2e2eef4d34c2cff586e6b477899301a1dd Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Sat, 27 Jun 2020 02:28:01 +0200 Subject: [PATCH 26/31] Some more refactoring --- .../items/electric/gadgets/SolarHelmet.java | 9 +++++++-- .../implementation/setup/SlimefunItemSetup.java | 3 ++- .../slimefun4/implementation/tasks/ArmorTask.java | 6 ++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/SolarHelmet.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/SolarHelmet.java index c9d4f1812..fb19075ca 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/SolarHelmet.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/SolarHelmet.java @@ -25,11 +25,16 @@ import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; */ public class SolarHelmet extends SlimefunItem { - private final ItemSetting charge = new ItemSetting<>("charge-amount", 0.1); + private final ItemSetting charge; - public SolarHelmet(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) { + public SolarHelmet(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe, double defaultChargingLevel) { super(category, item, recipeType, recipe); + if (defaultChargingLevel <= 0) { + throw new IllegalArgumentException("A Solar Helmet must have a positive charging level!"); + } + + charge = new ItemSetting<>("charge-amount", defaultChargingLevel); addItemSetting(charge); } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/setup/SlimefunItemSetup.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/setup/SlimefunItemSetup.java index a7a2dbc63..33335b37d 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/setup/SlimefunItemSetup.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/setup/SlimefunItemSetup.java @@ -765,7 +765,8 @@ public final class SlimefunItemSetup { .register(plugin); new SolarHelmet(categories.technicalGadgets, SlimefunItems.SOLAR_HELMET, RecipeType.ENHANCED_CRAFTING_TABLE, - new ItemStack[] {SlimefunItems.REINFORCED_ALLOY_INGOT, SlimefunItems.SOLAR_PANEL, SlimefunItems.REINFORCED_ALLOY_INGOT, SlimefunItems.REINFORCED_ALLOY_INGOT, null, SlimefunItems.REINFORCED_ALLOY_INGOT, SlimefunItems.MEDIUM_CAPACITOR, null, SlimefunItems.MEDIUM_CAPACITOR}) + new ItemStack[] {SlimefunItems.REINFORCED_ALLOY_INGOT, SlimefunItems.SOLAR_PANEL, SlimefunItems.REINFORCED_ALLOY_INGOT, SlimefunItems.REINFORCED_ALLOY_INGOT, null, SlimefunItems.REINFORCED_ALLOY_INGOT, SlimefunItems.MEDIUM_CAPACITOR, null, SlimefunItems.MEDIUM_CAPACITOR}, + 0.1) .register(plugin); new UnplaceableBlock(categories.magicalResources, SlimefunItems.LAVA_CRYSTAL, RecipeType.ENHANCED_CRAFTING_TABLE, diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/ArmorTask.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/ArmorTask.java index ffbdd1381..a23d3fe33 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/ArmorTask.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/ArmorTask.java @@ -5,6 +5,7 @@ import java.util.HashSet; import java.util.Set; import org.bukkit.Bukkit; +import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; @@ -107,12 +108,13 @@ public class ArmorTask implements Runnable { } private boolean hasSunlight(Player p) { - return (p.getWorld().getTime() < 12300 || p.getWorld().getTime() > 23850) && p.getEyeLocation().getBlock().getLightFromSky() == 15; + World world = p.getWorld(); + return (world.getTime() < 12300 || world.getTime() > 23850) && p.getEyeLocation().getBlock().getLightFromSky() == 15; } private void checkForRadiation(Player p) { // Check for a Hazmat Suit - if (!SlimefunUtils.isItemSimilar(SlimefunItems.SCUBA_HELMET, p.getInventory().getHelmet(), true) || !SlimefunUtils.isItemSimilar(SlimefunItems.HAZMAT_CHESTPLATE, p.getInventory().getChestplate(), true) || !SlimefunUtils.isItemSimilar(SlimefunItems.HAZMAT_LEGGINGS, p.getInventory().getLeggings(), true) || !SlimefunUtils.isItemSimilar(SlimefunItems.RUBBER_BOOTS, p.getInventory().getBoots(), true)) { + if (!SlimefunUtils.isItemSimilar(p.getInventory().getHelmet(), SlimefunItems.SCUBA_HELMET, true) || !SlimefunUtils.isItemSimilar(p.getInventory().getChestplate(), SlimefunItems.HAZMAT_CHESTPLATE, true) || !SlimefunUtils.isItemSimilar(p.getInventory().getLeggings(), SlimefunItems.HAZMAT_LEGGINGS, true) || !SlimefunUtils.isItemSimilar(p.getInventory().getBoots(), SlimefunItems.RUBBER_BOOTS, true)) { for (ItemStack item : p.getInventory()) { if (isRadioactive(p, item)) { break; From 0dfd40e4079448db5e6d48910566084f3b7cfe14 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Sat, 27 Jun 2020 02:35:29 +0200 Subject: [PATCH 27/31] Fixed a few more color codes for 1.16 (Sorry Walshy :P ) --- .../thebusybiscuit/slimefun4/api/gps/GPSNetwork.java | 8 ++++---- .../slimefun4/api/gps/TeleportationManager.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/GPSNetwork.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/GPSNetwork.java index 5d638162f..27415de8c 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/GPSNetwork.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/GPSNetwork.java @@ -137,7 +137,7 @@ public class GPSNetwork { menu.addMenuClickHandler(2, ChestMenuUtils.getEmptyClickHandler()); int complexity = getNetworkComplexity(p.getUniqueId()); - menu.addItem(4, new CustomItem(SlimefunItems.GPS_CONTROL_PANEL, "&7Network Info", "", "&8\u21E8 &7Status: " + (complexity > 0 ? "&2&lONLINE" : "&4&lOFFLINE"), "&8\u21E8 &7Complexity: &r" + complexity)); + menu.addItem(4, new CustomItem(SlimefunItems.GPS_CONTROL_PANEL, "&7Network Info", "", "&8\u21E8 &7Status: " + (complexity > 0 ? "&2&lONLINE" : "&4&lOFFLINE"), "&8\u21E8 &7Complexity: &f" + complexity)); menu.addMenuClickHandler(4, ChestMenuUtils.getEmptyClickHandler()); menu.addItem(6, new CustomItem(HeadTexture.GLOBE_OVERWORLD.getAsItemStack(), "&7" + SlimefunPlugin.getLocal().getMessage(p, "machines.GPS_CONTROL_PANEL.waypoints"), "", ChatColor.GRAY + "\u21E8 " + SlimefunPlugin.getLocal().getMessage(p, "guide.tooltips.open-category"))); @@ -154,7 +154,7 @@ public class GPSNetwork { if (sfi instanceof GPSTransmitter) { int slot = inventory[index]; - menu.addItem(slot, new CustomItem(SlimefunItems.GPS_TRANSMITTER, "&bGPS Transmitter", "&8\u21E8 &7World: &r" + l.getWorld().getName(), "&8\u21E8 &7X: &r" + l.getX(), "&8\u21E8 &7Y: &r" + l.getY(), "&8\u21E8 &7Z: &r" + l.getZ(), "", "&8\u21E8 &7Signal Strength: &r" + ((GPSTransmitter) sfi).getMultiplier(l.getBlockY()), "&8\u21E8 &7Ping: &r" + DoubleHandler.fixDouble(1000D / l.getY()) + "ms")); + menu.addItem(slot, new CustomItem(SlimefunItems.GPS_TRANSMITTER, "&bGPS Transmitter", "&8\u21E8 &7World: &f" + l.getWorld().getName(), "&8\u21E8 &7X: &f" + l.getX(), "&8\u21E8 &7Y: &f" + l.getY(), "&8\u21E8 &7Z: &f" + l.getZ(), "", "&8\u21E8 &7Signal Strength: &f" + ((GPSTransmitter) sfi).getMultiplier(l.getBlockY()), "&8\u21E8 &7Ping: &f" + DoubleHandler.fixDouble(1000D / l.getY()) + "ms")); menu.addMenuClickHandler(slot, ChestMenuUtils.getEmptyClickHandler()); index++; @@ -209,7 +209,7 @@ public class GPSNetwork { }); int complexity = getNetworkComplexity(p.getUniqueId()); - menu.addItem(4, new CustomItem(SlimefunItems.GPS_CONTROL_PANEL, "&7Network Info", "", "&8\u21E8 &7Status: " + (complexity > 0 ? "&2&lONLINE" : "&4&lOFFLINE"), "&8\u21E8 &7Complexity: &r" + complexity)); + menu.addItem(4, new CustomItem(SlimefunItems.GPS_CONTROL_PANEL, "&7Network Info", "", "&8\u21E8 &7Status: " + (complexity > 0 ? "&2&lONLINE" : "&4&lOFFLINE"), "&8\u21E8 &7Complexity: &f" + complexity)); menu.addMenuClickHandler(4, ChestMenuUtils.getEmptyClickHandler()); menu.addItem(6, new CustomItem(HeadTexture.GLOBE_OVERWORLD.getAsItemStack(), "&7" + SlimefunPlugin.getLocal().getMessage(p, "machines.GPS_CONTROL_PANEL.waypoints"))); @@ -221,7 +221,7 @@ public class GPSNetwork { int slot = inventory[index]; Location l = waypoint.getLocation(); - menu.addItem(slot, new CustomItem(waypoint.getIcon(), waypoint.getName().replace("player:death ", ""), "&8\u21E8 &7World: &r" + l.getWorld().getName(), "&8\u21E8 &7X: &r" + l.getX(), "&8\u21E8 &7Y: &r" + l.getY(), "&8\u21E8 &7Z: &r" + l.getZ(), "", "&8\u21E8 &cClick to delete")); + menu.addItem(slot, new CustomItem(waypoint.getIcon(), waypoint.getName().replace("player:death ", ""), "&8\u21E8 &7World: &f" + l.getWorld().getName(), "&8\u21E8 &7X: &f" + l.getX(), "&8\u21E8 &7Y: &f" + l.getY(), "&8\u21E8 &7Z: &f" + l.getZ(), "", "&8\u21E8 &cClick to delete")); menu.addMenuClickHandler(slot, (pl, s, item, action) -> { profile.removeWaypoint(waypoint); pl.playSound(pl.getLocation(), Sound.UI_BUTTON_CLICK, 1F, 1F); diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/TeleportationManager.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/TeleportationManager.java index 357ab8a7c..7535551a0 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/TeleportationManager.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/TeleportationManager.java @@ -61,7 +61,7 @@ public final class TeleportationManager { Location l = waypoint.getLocation(); menu.addItem(slot, - new CustomItem(waypoint.getIcon(), waypoint.getName().replace("player:death ", ""), "", "&8\u21E8 &7" + SlimefunPlugin.getLocal().getResourceString(p, "tooltips.world") + ": &r" + l.getWorld().getName(), "&8\u21E8 &7X: &r" + l.getX(), "&8\u21E8 &7Y: &r" + l.getY(), "&8\u21E8 &7Z: &r" + l.getZ(), "&8\u21E8 &7" + SlimefunPlugin.getLocal().getMessage(p, "machines.TELEPORTER.gui.time") + ": &r" + DoubleHandler.fixDouble(0.5 * getTeleportationTime(complexity, source, l)) + "s", "", "&8\u21E8 &c" + SlimefunPlugin.getLocal().getMessage(p, "machines.TELEPORTER.gui.tooltip"))); + new CustomItem(waypoint.getIcon(), waypoint.getName().replace("player:death ", ""), "", "&8\u21E8 &7" + SlimefunPlugin.getLocal().getResourceString(p, "tooltips.world") + ": &f" + l.getWorld().getName(), "&8\u21E8 &7X: &f" + l.getX(), "&8\u21E8 &7Y: &f" + l.getY(), "&8\u21E8 &7Z: &f" + l.getZ(), "&8\u21E8 &7" + SlimefunPlugin.getLocal().getMessage(p, "machines.TELEPORTER.gui.time") + ": &f" + DoubleHandler.fixDouble(0.5 * getTeleportationTime(complexity, source, l)) + "s", "", "&8\u21E8 &c" + SlimefunPlugin.getLocal().getMessage(p, "machines.TELEPORTER.gui.tooltip"))); menu.addMenuClickHandler(slot, (pl, s, item, action) -> { pl.closeInventory(); teleport(pl.getUniqueId(), complexity, source, l, false); @@ -107,7 +107,7 @@ public final class TeleportationManager { teleporterUsers.remove(uuid); if (p != null) { - p.sendTitle(ChatColors.color(SlimefunPlugin.getLocal().getMessage(p, "machines.TELEPORTER.cancelled")), ChatColors.color("&c&k40&r&c%"), 20, 60, 20); + p.sendTitle(ChatColors.color(SlimefunPlugin.getLocal().getMessage(p, "machines.TELEPORTER.cancelled")), ChatColors.color("&c&k40&f&c%"), 20, 60, 20); } } From 44c0029587805a0721655ce52149c5af0bfa5993 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Sat, 27 Jun 2020 02:47:53 +0200 Subject: [PATCH 28/31] Fixed a rare concurrency issue with world saving --- CHANGELOG.md | 1 + .../thebusybiscuit/slimefun4/core/SlimefunRegistry.java | 7 +++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 595dcb80f..93026a309 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,7 @@ * Fixed #1855 * Fixed some issues with AsyncWorldEdit * Fixed some problems with unregistered or fake worlds +* Fixed a rare concurrency issue with world saving ## Release Candidate 13 (16 Jun 2020) https://thebusybiscuit.github.io/builds/TheBusyBiscuit/Slimefun4/stable/#13 diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/SlimefunRegistry.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/SlimefunRegistry.java index bfcdbb596..62aebdfae 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/SlimefunRegistry.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/SlimefunRegistry.java @@ -10,7 +10,6 @@ import java.util.Map; import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; import org.bukkit.Location; import org.bukkit.Server; @@ -76,8 +75,8 @@ public class SlimefunRegistry { private final Set chargeableBlocks = new HashSet<>(); private final Map witherProofBlocks = new HashMap<>(); - private final ConcurrentMap profiles = new ConcurrentHashMap<>(); - private final Map worlds = new HashMap<>(); + private final Map profiles = new ConcurrentHashMap<>(); + private final Map worlds = new ConcurrentHashMap<>(); private final Map chunks = new HashMap<>(); private final Map layouts = new EnumMap<>(SlimefunGuideLayout.class); private final Map> drops = new EnumMap<>(EntityType.class); @@ -234,7 +233,7 @@ public class SlimefunRegistry { return universalInventories; } - public ConcurrentMap getPlayerProfiles() { + public Map getPlayerProfiles() { return profiles; } From 468617d9a2a81221488050c32b4986d5854269a7 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Sat, 27 Jun 2020 03:13:43 +0200 Subject: [PATCH 29/31] Changed a comment. --- .../slimefun4/core/attributes/RechargeableHelper.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/RechargeableHelper.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/RechargeableHelper.java index 546ffe0e9..47fe3b4a8 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/RechargeableHelper.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/RechargeableHelper.java @@ -57,12 +57,13 @@ final class RechargeableHelper { if (SlimefunPlugin.getMinecraftVersion().isAtLeast(MinecraftVersion.MINECRAFT_1_14)) { Float value = meta.getPersistentDataContainer().get(CHARGE_KEY, PersistentDataType.FLOAT); - // If no persistent data exists, we will just fall back to the lore + // If persistent data is available, we just return this value if (value != null) { return value; } } + // If no persistent data exists, we will just fall back to the lore if (meta.hasLore()) { for (String line : meta.getLore()) { if (line.startsWith(LORE_PREFIX) && line.contains(" / ") && line.endsWith(" J")) { From bd2f4b196d6a3c265ea8945bcbd4d1ac853b4afc Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Sat, 27 Jun 2020 03:29:10 +0200 Subject: [PATCH 30/31] Minor optimization for Solar Helmet checks --- .../slimefun4/implementation/tasks/ArmorTask.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/ArmorTask.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/ArmorTask.java index a23d3fe33..dbcde28bf 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/ArmorTask.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/ArmorTask.java @@ -6,6 +6,7 @@ import java.util.Set; import org.bukkit.Bukkit; import org.bukkit.World; +import org.bukkit.World.Environment; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; @@ -109,6 +110,12 @@ public class ArmorTask implements Runnable { private boolean hasSunlight(Player p) { World world = p.getWorld(); + + if (world.getEnvironment() != Environment.NORMAL) { + // The End and Nether have no sunlight + return false; + } + return (world.getTime() < 12300 || world.getTime() > 23850) && p.getEyeLocation().getBlock().getLightFromSky() == 15; } From 6d3665508175600f592be2b68de06ea3215e7fa0 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Sat, 27 Jun 2020 03:40:27 +0200 Subject: [PATCH 31/31] Another optimization for Solar Generators --- .../items/electric/generators/SolarGenerator.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/generators/SolarGenerator.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/generators/SolarGenerator.java index 3ebef8a14..84b0fa7d0 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/generators/SolarGenerator.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/generators/SolarGenerator.java @@ -1,6 +1,8 @@ package io.github.thebusybiscuit.slimefun4.implementation.items.electric.generators; import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.World.Environment; import org.bukkit.inventory.ItemStack; import io.github.thebusybiscuit.slimefun4.api.events.PlayerRightClickEvent; @@ -60,11 +62,17 @@ public abstract class SolarGenerator extends SimpleSlimefunItem @Override public double generateEnergy(Location l, SlimefunItem item, Config data) { - if (!l.getWorld().isChunkLoaded(l.getBlockX() >> 4, l.getBlockZ() >> 4) || l.getBlock().getLightFromSky() != 15) { - return 0D; + World world = l.getWorld(); + + if (world.getEnvironment() != Environment.NORMAL) { + return 0; } - if (l.getWorld().getTime() < 12300 || l.getWorld().getTime() > 23850) { + if (!world.isChunkLoaded(l.getBlockX() >> 4, l.getBlockZ() >> 4) || l.getBlock().getLightFromSky() != 15) { + return 0; + } + + if (world.getTime() < 12300 || world.getTime() > 23850) { return getDayEnergy(); }