diff --git a/CHANGELOG.md b/CHANGELOG.md index 35cbdb690..1b07384d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ ## Release Candidate 18 (TBD) #### Additions +* The Smelters Pick now also works on Ancient Debris #### Changes * Removed 1.13 support @@ -48,6 +49,11 @@ * Fixed #2469 * Fixed #2509 * Fixed #2499 +* Fixed #2527 +* Fixed #2519 +* Fixed #2517 +* Fixed Magician Talisman sometimes drawing invalid enchantments +* Fixed id conflicts for external Enchantment sources (e.g. plugins) for the Magician Talisman settings ## Release Candidate 17 (17 Oct 2020) diff --git a/pom.xml b/pom.xml index 0073cdbbc..14f4de509 100644 --- a/pom.xml +++ b/pom.xml @@ -315,7 +315,7 @@ com.github.seeseemelk MockBukkit-v1.16 - 0.13.0 + 0.13.1 test @@ -349,7 +349,7 @@ com.konghq unirest-java - 3.11.02 + 3.11.03 compile diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/GiveCommand.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/GiveCommand.java index 64c741ca1..dc3e4f00d 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/GiveCommand.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/GiveCommand.java @@ -40,7 +40,7 @@ class GiveCommand extends SubCommand { if (sfItem != null) { giveItem(sender, p, sfItem, args); } else { - SlimefunPlugin.getLocalization().sendMessage(sender, "messages.not-valid-item", true, msg -> msg.replace(PLACEHOLDER_ITEM, args[2])); + SlimefunPlugin.getLocalization().sendMessage(sender, "messages.invalid-item", true, msg -> msg.replace(PLACEHOLDER_ITEM, args[2])); } } else { SlimefunPlugin.getLocalization().sendMessage(sender, "messages.not-online", true, msg -> msg.replace(PLACEHOLDER_PLAYER, args[1])); @@ -70,7 +70,7 @@ class GiveCommand extends SubCommand { SlimefunPlugin.getLocalization().sendMessage(sender, "messages.give-item", true, msg -> msg.replace(PLACEHOLDER_PLAYER, args[1]).replace(PLACEHOLDER_ITEM, sfItem.getItemName()).replace(PLACEHOLDER_AMOUNT, String.valueOf(amount))); } else { - SlimefunPlugin.getLocalization().sendMessage(sender, "messages.not-valid-amount", true, msg -> msg.replace(PLACEHOLDER_AMOUNT, args[3])); + SlimefunPlugin.getLocalization().sendMessage(sender, "messages.invalid-amount", true, msg -> msg.replace(PLACEHOLDER_AMOUNT, args[3])); } } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/ResearchCommand.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/ResearchCommand.java index 8bc1d7e2d..9c3d29889 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/ResearchCommand.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/ResearchCommand.java @@ -66,7 +66,7 @@ class ResearchCommand extends SubCommand { SlimefunPlugin.getLocalization().sendMessage(player, "messages.give-research", true, variables); }); } else { - SlimefunPlugin.getLocalization().sendMessage(sender, "messages.not-valid-research", true, msg -> msg.replace(PLACEHOLDER_RESEARCH, input)); + SlimefunPlugin.getLocalization().sendMessage(sender, "messages.invalid-research", true, msg -> msg.replace(PLACEHOLDER_RESEARCH, input)); } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/handlers/RainbowTickHandler.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/handlers/RainbowTickHandler.java index 4ba7ed63a..bcd5f0ac8 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/handlers/RainbowTickHandler.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/handlers/RainbowTickHandler.java @@ -16,6 +16,7 @@ import io.github.thebusybiscuit.cscorelib2.collections.LoopIterator; import io.github.thebusybiscuit.slimefun4.api.MinecraftVersion; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; import io.github.thebusybiscuit.slimefun4.implementation.items.blocks.RainbowBlock; +import io.github.thebusybiscuit.slimefun4.utils.ColoredMaterial; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker; @@ -48,10 +49,14 @@ public class RainbowTickHandler extends BlockTicker { material = iterator.next(); } - public RainbowTickHandler(Material... materials) { + public RainbowTickHandler(@Nonnull Material... materials) { this(Arrays.asList(materials)); } + public RainbowTickHandler(@Nonnull ColoredMaterial material) { + this(material.asList()); + } + /** * This method checks whether a given {@link Material} array contains any {@link Material} * that would result in a {@link GlassPane} {@link BlockData}. diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/BlockDataService.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/BlockDataService.java index 14b39c042..72b7c1f09 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/BlockDataService.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/BlockDataService.java @@ -1,22 +1,29 @@ package io.github.thebusybiscuit.slimefun4.core.services; import java.util.Optional; +import java.util.logging.Level; import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.apache.commons.lang.Validate; +import org.bukkit.Bukkit; import org.bukkit.Keyed; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.TileState; +import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataHolder; +import org.bukkit.persistence.PersistentDataType; import org.bukkit.plugin.Plugin; +import io.github.thebusybiscuit.slimefun4.api.MinecraftVersion; +import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; import io.papermc.lib.PaperLib; import io.papermc.lib.features.blockstatesnapshot.BlockStateSnapshotResult; +import me.mrCookieSlime.Slimefun.api.Slimefun; /** * The {@link BlockDataService} is similar to the {@link CustomItemDataService}, @@ -27,7 +34,7 @@ import io.papermc.lib.features.blockstatesnapshot.BlockStateSnapshotResult; * @author TheBusyBiscuit * */ -public class BlockDataService implements PersistentDataService, Keyed { +public class BlockDataService implements Keyed { private final NamespacedKey namespacedKey; @@ -62,14 +69,27 @@ public class BlockDataService implements PersistentDataService, Keyed { Validate.notNull(b, "The block cannot be null!"); Validate.notNull(value, "The value cannot be null!"); - BlockStateSnapshotResult result = PaperLib.getBlockState(b, false); + // Due to a bug on older versions, Persistent Data is nullable for non-snapshots + boolean useSnapshot = SlimefunPlugin.getMinecraftVersion().isBefore(MinecraftVersion.MINECRAFT_1_16); + + BlockStateSnapshotResult result = PaperLib.getBlockState(b, useSnapshot); BlockState state = result.getState(); if (state instanceof TileState) { - setString((TileState) state, namespacedKey, value); + try { + PersistentDataContainer container = ((TileState) state).getPersistentDataContainer(); + container.set(namespacedKey, PersistentDataType.STRING, value); - if (result.isSnapshot()) { - state.update(); + if (result.isSnapshot()) { + state.update(); + } + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "Please check if your Server Software is up to date!"); + + String serverSoftware = PaperLib.isSpigot() && !PaperLib.isPaper() ? "Spigot" : Bukkit.getName(); + Slimefun.getLogger().log(Level.SEVERE, () -> serverSoftware + " | " + Bukkit.getVersion() + " | " + Bukkit.getBukkitVersion()); + + Slimefun.getLogger().log(Level.SEVERE, "An Exception was thrown while trying to set Persistent Data for a Block", x); } } } @@ -87,7 +107,8 @@ public class BlockDataService implements PersistentDataService, Keyed { BlockState state = PaperLib.getBlockState(b, false).getState(); if (state instanceof TileState) { - return getString((TileState) state, namespacedKey); + PersistentDataContainer container = ((TileState) state).getPersistentDataContainer(); + return Optional.ofNullable(container.get(namespacedKey, PersistentDataType.STRING)); } else { return Optional.empty(); } 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 aed4e5d3e..6100fb821 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 @@ -11,6 +11,8 @@ import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; import org.bukkit.plugin.Plugin; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; @@ -26,7 +28,7 @@ import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; * @see SlimefunItemStack * */ -public class CustomItemDataService implements PersistentDataService, Keyed { +public class CustomItemDataService implements Keyed { private final NamespacedKey namespacedKey; @@ -71,16 +73,17 @@ public class CustomItemDataService implements PersistentDataService, Keyed { * This method stores the given id on the provided {@link ItemMeta} via * persistent data. * - * @param im + * @param meta * The {@link ItemMeta} to store data on * @param id * The id to store on the {@link ItemMeta} */ - public void setItemData(@Nonnull ItemMeta im, @Nonnull String id) { - Validate.notNull(im, "The ItemMeta cannot be null!"); + public void setItemData(@Nonnull ItemMeta meta, @Nonnull String id) { + Validate.notNull(meta, "The ItemMeta cannot be null!"); Validate.notNull(id, "Cannot store null on an ItemMeta!"); - setString(im, namespacedKey, id); + PersistentDataContainer container = meta.getPersistentDataContainer(); + container.set(namespacedKey, PersistentDataType.STRING, id); } /** @@ -115,7 +118,8 @@ public class CustomItemDataService implements PersistentDataService, Keyed { public Optional getItemData(@Nonnull ItemMeta meta) { Validate.notNull(meta, "Cannot read data from null!"); - return getString(meta, namespacedKey); + PersistentDataContainer container = meta.getPersistentDataContainer(); + return Optional.ofNullable(container.get(namespacedKey, PersistentDataType.STRING)); } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/LocalizationService.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/LocalizationService.java index d790144c4..f14fe320b 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/LocalizationService.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/LocalizationService.java @@ -8,7 +8,6 @@ import java.util.Collection; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; -import java.util.Optional; import java.util.Set; import java.util.logging.Level; @@ -21,6 +20,8 @@ import org.bukkit.Server; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; import io.github.thebusybiscuit.cscorelib2.math.DoubleHandler; import io.github.thebusybiscuit.slimefun4.core.services.localization.Language; @@ -37,7 +38,7 @@ import me.mrCookieSlime.Slimefun.api.Slimefun; * @see Language * */ -public class LocalizationService extends SlimefunLocalization implements PersistentDataService { +public class LocalizationService extends SlimefunLocalization { private static final String LANGUAGE_PATH = "language"; @@ -151,10 +152,12 @@ public class LocalizationService extends SlimefunLocalization implements Persist @Override public Language getLanguage(@Nonnull Player p) { Validate.notNull("Player cannot be null!"); - Optional language = getString(p, languageKey); - if (language.isPresent()) { - Language lang = languages.get(language.get()); + PersistentDataContainer container = p.getPersistentDataContainer(); + String language = container.get(languageKey, PersistentDataType.STRING); + + if (language != null) { + Language lang = languages.get(language); if (lang != null) { return lang; @@ -164,7 +167,7 @@ public class LocalizationService extends SlimefunLocalization implements Persist return getDefaultLanguage(); } - private void setLanguage(String language, boolean reset) { + private void setLanguage(@Nonnull String language, boolean reset) { // Clearing out the old Language (if necessary) if (reset) { getConfig().clear(); diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/PersistentDataService.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/PersistentDataService.java deleted file mode 100644 index b1792f546..000000000 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/PersistentDataService.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.github.thebusybiscuit.slimefun4.core.services; - -import java.util.Optional; - -import org.bukkit.NamespacedKey; -import org.bukkit.persistence.PersistentDataContainer; -import org.bukkit.persistence.PersistentDataHolder; -import org.bukkit.persistence.PersistentDataType; - -import io.github.thebusybiscuit.cscorelib2.data.PersistentDataAPI; -import io.github.thebusybiscuit.slimefun4.api.MinecraftVersion; - -/** - * This interface is used to defer calls to Persistent Data and make sure they are only called - * if the {@link MinecraftVersion} supports it. - * - * @author TheBusyBiscuit - * - * @deprecated This is redundant, we can use {@link PersistentDataAPI} instead. - * - */ -@Deprecated -interface PersistentDataService { - - default void setString(Object obj, NamespacedKey key, String value) { - PersistentDataContainer container = ((PersistentDataHolder) obj).getPersistentDataContainer(); - container.set(key, PersistentDataType.STRING, value); - } - - default Optional getString(Object obj, NamespacedKey key) { - PersistentDataContainer container = ((PersistentDataHolder) obj).getPersistentDataContainer(); - return Optional.ofNullable(container.get(key, PersistentDataType.STRING)); - } - -} diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/localization/SlimefunLocalization.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/localization/SlimefunLocalization.java index dc1bea4b1..79523c45a 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/localization/SlimefunLocalization.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/localization/SlimefunLocalization.java @@ -31,14 +31,14 @@ import me.mrCookieSlime.Slimefun.Lists.RecipeType; * This is an abstract parent class of {@link LocalizationService}. * There is not really much more I can say besides that... * - * @author TheBusyBiscui + * @author TheBusyBiscuit * * @see LocalizationService * */ public abstract class SlimefunLocalization extends Localization implements Keyed { - public SlimefunLocalization(@Nonnull SlimefunPlugin plugin) { + protected SlimefunLocalization(@Nonnull SlimefunPlugin plugin) { super(plugin); } @@ -71,6 +71,15 @@ public abstract class SlimefunLocalization extends Localization implements Keyed */ public abstract Language getDefaultLanguage(); + /** + * This returns whether a {@link Language} with the given id exists within + * the project resources. + * + * @param id + * The {@link Language} id + * + * @return Whether the project contains a {@link Language} with that id + */ protected abstract boolean hasLanguage(@Nonnull String id); /** @@ -82,10 +91,23 @@ public abstract class SlimefunLocalization extends Localization implements Keyed @Nonnull public abstract Collection getLanguages(); + /** + * This method adds a new {@link Language} with the given id and texture. + * + * @param id + * The {@link Language} id + * @param texture + * The texture of how this {@link Language} should be displayed + */ protected abstract void addLanguage(@Nonnull String id, @Nonnull String texture); + /** + * This will load every {@link SupportedLanguage} into memory. + * To be precise: It performs {@link #addLanguage(String, String)} for every + * value of {@link SupportedLanguage}. + */ protected void loadEmbeddedLanguages() { - for (SupportedLanguage lang : SupportedLanguage.valuesCache) { + for (SupportedLanguage lang : SupportedLanguage.values()) { if (lang.isReadyForRelease() || SlimefunPlugin.getUpdater().getBranch() != SlimefunBranch.STABLE) { addLanguage(lang.getLanguageId(), lang.getTexture()); } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/localization/SupportedLanguage.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/localization/SupportedLanguage.java index a6381a059..7e9dfd85d 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/localization/SupportedLanguage.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/localization/SupportedLanguage.java @@ -58,8 +58,6 @@ enum SupportedLanguage { MACEDONIAN("mk", false, "a0e0b0b5d87a855466980a101a757bcdb5f77d9f7287889f3efa998ee0472fc0"), TAGALOG("tl", true, "9306c0c1ce6a9c61bb42a572c49e6d0ed20e0e6b3d122cc64c339cbf78e9e937"); - public static final SupportedLanguage[] valuesCache = values(); - private final String id; private final boolean releaseReady; private final String textureHash; @@ -71,11 +69,22 @@ enum SupportedLanguage { this.textureHash = textureHash; } + /** + * This returns the id of this {@link Language}. + * + * @return + */ @Nonnull public String getLanguageId() { return id; } + /** + * This returns whether this {@link SupportedLanguage} is "release-ready". + * A release-ready {@link Language} will be available in RC builds of Slimefun. + * + * @return Whether this {@link Language} is "release-ready" + */ public boolean isReadyForRelease() { return releaseReady; } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/plugins/ThirdPartyPluginService.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/plugins/ThirdPartyPluginService.java index 4bf85071f..1b4e5e1a4 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/plugins/ThirdPartyPluginService.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/plugins/ThirdPartyPluginService.java @@ -101,9 +101,6 @@ public class ThirdPartyPluginService { // mcMMO Integration if (isPluginInstalled("mcMMO")) { try { - // This makes sure that the FakeEvent interface is present. - // Class.forName("com.gmail.nossr50.events.fake.FakeEvent"); - new McMMOIntegration(plugin); isMcMMOInstalled = true; } catch (Exception | LinkageError x) { @@ -170,7 +167,7 @@ public class ThirdPartyPluginService { * @return Whether this is a fake event */ public boolean isEventFaked(@Nonnull Event event) { - // TODO: Change this to FakeEvent once the new mcMMO build was released + // This can be changed to "FakeEvent" in a later version return isMcMMOInstalled && event instanceof FakeBlockBreakEvent; } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/RadioactiveItem.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/RadioactiveItem.java index a17c61a3d..c445c93aa 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/RadioactiveItem.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/RadioactiveItem.java @@ -31,6 +31,9 @@ import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; */ public class RadioactiveItem extends SlimefunItem implements Radioactive, NotPlaceable { + /** + * This is the level of {@link Radioactivity} for this {@link SlimefunItem} + */ private final Radioactivity radioactivity; /** diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/FisherAndroid.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/FisherAndroid.java index de83525a7..9dd3373d7 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/FisherAndroid.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/FisherAndroid.java @@ -57,7 +57,7 @@ public class FisherAndroid extends ProgrammableAndroid { if (ThreadLocalRandom.current().nextInt(100) < 10 * getTier()) { ItemStack drop = fishingLoot.getRandom(); - menu.pushItem(drop, getOutputSlots()); + menu.pushItem(drop.clone(), getOutputSlots()); } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/ProgrammableAndroid.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/ProgrammableAndroid.java index 07d828f96..428e6e732 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/ProgrammableAndroid.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/ProgrammableAndroid.java @@ -807,12 +807,8 @@ public class ProgrammableAndroid extends SlimefunItem implements InventoryBlock, } private void constructMenu(@Nonnull BlockMenuPreset preset) { - for (int i : BORDER) { - preset.addItem(i, ChestMenuUtils.getBackground(), ChestMenuUtils.getEmptyClickHandler()); - } - for (int i : OUTPUT_BORDER) { - preset.addItem(i, ChestMenuUtils.getOutputSlotTexture(), ChestMenuUtils.getEmptyClickHandler()); - } + preset.drawBackground(BORDER); + preset.drawBackground(ChestMenuUtils.getOutputSlotTexture(), OUTPUT_BORDER); for (int i : getOutputSlots()) { preset.addMenuClickHandler(i, new AdvancedMenuClickHandler() { @@ -841,7 +837,7 @@ public class ProgrammableAndroid extends SlimefunItem implements InventoryBlock, } protected void move(Block b, BlockFace face, Block block) { - if (block.getY() > 0 && block.getY() < block.getWorld().getMaxHeight() && (block.getType() == Material.AIR || block.getType() == Material.CAVE_AIR)) { + if (block.getY() > 0 && block.getY() < block.getWorld().getMaxHeight() && block.isEmpty()) { BlockData blockData = Material.PLAYER_HEAD.createBlockData(data -> { if (data instanceof Rotatable) { Rotatable rotatable = ((Rotatable) data); diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/AbstractCargoNode.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/AbstractCargoNode.java index e1d43bfc0..723ad0df3 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/AbstractCargoNode.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/AbstractCargoNode.java @@ -11,7 +11,7 @@ import io.github.thebusybiscuit.slimefun4.core.handlers.BlockPlaceHandler; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; import io.github.thebusybiscuit.slimefun4.utils.ChatUtils; import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils; -import io.github.thebusybiscuit.slimefun4.utils.ColoredMaterials; +import io.github.thebusybiscuit.slimefun4.utils.ColoredMaterial; import io.github.thebusybiscuit.slimefun4.utils.HeadTexture; import io.github.thebusybiscuit.slimefun4.utils.NumberUtils; import me.mrCookieSlime.Slimefun.Lists.RecipeType; @@ -100,7 +100,7 @@ abstract class AbstractCargoNode extends SlimefunItem { menu.replaceExistingItem(slotCurrent, new CustomItem(HeadTexture.CHEST_TERMINAL.getAsItemStack(), "&bChannel ID: &3" + (channel + 1))); menu.addMenuClickHandler(slotCurrent, ChestMenuUtils.getEmptyClickHandler()); } else { - menu.replaceExistingItem(slotCurrent, new CustomItem(ColoredMaterials.WOOL.get(channel), "&bChannel ID: &3" + (channel + 1))); + menu.replaceExistingItem(slotCurrent, new CustomItem(ColoredMaterial.WOOL.get(channel), "&bChannel ID: &3" + (channel + 1))); menu.addMenuClickHandler(slotCurrent, ChestMenuUtils.getEmptyClickHandler()); } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/ReactorAccessPort.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/ReactorAccessPort.java index 58a380771..05791763c 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/ReactorAccessPort.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/ReactorAccessPort.java @@ -1,5 +1,7 @@ package io.github.thebusybiscuit.slimefun4.implementation.items.cargo; +import javax.annotation.Nonnull; + import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; @@ -107,22 +109,12 @@ public class ReactorAccessPort extends SlimefunItem { }); } - private void constructMenu(BlockMenuPreset preset) { - for (int i : background) { - preset.addItem(i, ChestMenuUtils.getBackground(), ChestMenuUtils.getEmptyClickHandler()); - } + private void constructMenu(@Nonnull BlockMenuPreset preset) { + preset.drawBackground(ChestMenuUtils.getBackground(), background); - for (int i : fuelBorder) { - preset.addItem(i, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), " "), ChestMenuUtils.getEmptyClickHandler()); - } - - for (int i : inputBorder) { - preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), ChestMenuUtils.getEmptyClickHandler()); - } - - for (int i : outputBorder) { - preset.addItem(i, new CustomItem(new ItemStack(Material.GREEN_STAINED_GLASS_PANE), " "), ChestMenuUtils.getEmptyClickHandler()); - } + preset.drawBackground(new CustomItem(Material.LIME_STAINED_GLASS_PANE, " "), fuelBorder); + preset.drawBackground(new CustomItem(Material.CYAN_STAINED_GLASS_PANE, " "), inputBorder); + preset.drawBackground(new CustomItem(Material.GREEN_STAINED_GLASS_PANE, " "), outputBorder); preset.addItem(1, new CustomItem(SlimefunItems.URANIUM, "&7Fuel Slot", "", "&rThis Slot accepts radioactive Fuel such as:", "&2Uranium &ror &aNeptunium"), ChestMenuUtils.getEmptyClickHandler()); preset.addItem(22, new CustomItem(SlimefunItems.PLUTONIUM, "&7Byproduct Slot", "", "&rThis Slot contains the Reactor's Byproduct", "&rsuch as &aNeptunium &ror &7Plutonium"), ChestMenuUtils.getEmptyClickHandler()); diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/AbstractEntityAssembler.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/AbstractEntityAssembler.java index ccd858373..e8d5b962f 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/AbstractEntityAssembler.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/AbstractEntityAssembler.java @@ -66,17 +66,9 @@ public abstract class AbstractEntityAssembler extends SimpleSl @Override public void init() { - for (int i : border) { - addItem(i, ChestMenuUtils.getBackground(), ChestMenuUtils.getEmptyClickHandler()); - } - - for (int i : headBorder) { - addItem(i, new CustomItem(getHeadBorder(), " "), ChestMenuUtils.getEmptyClickHandler()); - } - - for (int i : bodyBorder) { - addItem(i, new CustomItem(getBodyBorder(), " "), ChestMenuUtils.getEmptyClickHandler()); - } + drawBackground(border); + drawBackground(new CustomItem(getHeadBorder(), " "), headBorder); + drawBackground(new CustomItem(getBodyBorder(), " "), bodyBorder); constructMenu(this); } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/magical/talismans/MagicianTalisman.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/magical/talismans/MagicianTalisman.java index 29a819f04..0909fb3f4 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/magical/talismans/MagicianTalisman.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/magical/talismans/MagicianTalisman.java @@ -7,8 +7,13 @@ import java.util.concurrent.ThreadLocalRandom; import java.util.logging.Level; import java.util.stream.Collectors; -import org.bukkit.Material; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; + +import org.apache.commons.lang.Validate; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import io.github.thebusybiscuit.slimefun4.api.items.ItemSetting; @@ -16,10 +21,18 @@ import io.github.thebusybiscuit.slimefun4.implementation.settings.TalismanEnchan import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; +/** + * The {@link MagicianTalisman} is a special kind of {@link Talisman} which awards a {@link Player} + * with an extra {@link Enchantment} when they enchant their {@link ItemStack}. + * + * @author TheBusyBiscuit + * + */ public class MagicianTalisman extends Talisman { private final Set enchantments = new HashSet<>(); + @ParametersAreNonnullByDefault public MagicianTalisman(SlimefunItemStack item, ItemStack[] recipe) { super(item, recipe, false, false, "magician", 80); @@ -47,13 +60,31 @@ public class MagicianTalisman extends Talisman { * * @return An applicable {@link TalismanEnchantment} or null */ - public TalismanEnchantment getRandomEnchantment(ItemStack item) { - if (item == null || item.getType() == Material.AIR) { - return null; - } + @Nullable + public TalismanEnchantment getRandomEnchantment(@Nonnull ItemStack item, @Nonnull Set existingEnchantments) { + Validate.notNull(item, "The ItemStack cannot be null"); + Validate.notNull(existingEnchantments, "The Enchantments Set cannot be null"); + + // @formatter:off + List enabled = enchantments.stream() + .filter(e -> e.getEnchantment().canEnchantItem(item)) + .filter(e -> hasConflicts(existingEnchantments, e)) + .filter(TalismanEnchantment::getValue) + .collect(Collectors.toList()); + // @formatter:on - List enabled = enchantments.stream().filter(e -> e.getEnchantment().canEnchantItem(item)).filter(TalismanEnchantment::getValue).collect(Collectors.toList()); return enabled.isEmpty() ? null : enabled.get(ThreadLocalRandom.current().nextInt(enabled.size())); } + @ParametersAreNonnullByDefault + private boolean hasConflicts(Set enchantments, TalismanEnchantment ench) { + for (Enchantment existing : enchantments) { + if (existing.conflictsWith(ench.getEnchantment())) { + return false; + } + } + + return true; + } + } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/TalismanListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/TalismanListener.java index 32c6e986a..1b059b7c7 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/TalismanListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/TalismanListener.java @@ -5,8 +5,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Optional; +import java.util.Map; import java.util.Random; -import java.util.Set; import java.util.concurrent.ThreadLocalRandom; import javax.annotation.Nonnull; @@ -243,26 +243,27 @@ public class TalismanListener implements Listener { @EventHandler public void onEnchant(EnchantItemEvent e) { Random random = ThreadLocalRandom.current(); + Map enchantments = e.getEnchantsToAdd(); + // Magician Talisman if (Talisman.tryActivate(e, SlimefunItems.TALISMAN_MAGICIAN)) { MagicianTalisman talisman = (MagicianTalisman) SlimefunItems.TALISMAN_MAGICIAN.getItem(); - TalismanEnchantment enchantment = talisman.getRandomEnchantment(e.getItem()); + TalismanEnchantment enchantment = talisman.getRandomEnchantment(e.getItem(), enchantments.keySet()); if (enchantment != null) { - e.getEnchantsToAdd().put(enchantment.getEnchantment(), enchantment.getLevel()); + enchantments.put(enchantment.getEnchantment(), enchantment.getLevel()); } } - if (!e.getEnchantsToAdd().containsKey(Enchantment.SILK_TOUCH) && Enchantment.LOOT_BONUS_BLOCKS.canEnchantItem(e.getItem()) && Talisman.tryActivate(e, SlimefunItems.TALISMAN_WIZARD)) { - Set enchantments = e.getEnchantsToAdd().keySet(); - - for (Enchantment enchantment : enchantments) { + // Wizard Talisman + if (!enchantments.containsKey(Enchantment.SILK_TOUCH) && Enchantment.LOOT_BONUS_BLOCKS.canEnchantItem(e.getItem()) && Talisman.tryActivate(e, SlimefunItems.TALISMAN_WIZARD)) { + for (Enchantment enchantment : enchantments.keySet()) { if (random.nextInt(100) < 40) { e.getEnchantsToAdd().put(enchantment, random.nextInt(3) + 1); } } - e.getEnchantsToAdd().put(Enchantment.LOOT_BONUS_BLOCKS, random.nextInt(3) + 3); + enchantments.put(Enchantment.LOOT_BONUS_BLOCKS, random.nextInt(3) + 3); } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/crafting/AnvilListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/crafting/AnvilListener.java index 4df3a82eb..912c1804f 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/crafting/AnvilListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/crafting/AnvilListener.java @@ -2,7 +2,6 @@ package io.github.thebusybiscuit.slimefun4.implementation.listeners.crafting; import javax.annotation.Nonnull; -import org.bukkit.block.BrewingStand; import org.bukkit.entity.Player; import org.bukkit.event.Event.Result; import org.bukkit.event.EventHandler; @@ -15,8 +14,8 @@ import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; /** - * This {@link Listener} prevents any {@link SlimefunItem} from being used in a - * {@link BrewingStand}. + * This {@link Listener} prevents any {@link SlimefunItem} from being used in an + * anvil. * * @author TheBusyBiscuit * diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/crafting/BrewingStandListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/crafting/BrewingStandListener.java index 60a4594af..9f3d40f2f 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/crafting/BrewingStandListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/crafting/BrewingStandListener.java @@ -17,7 +17,7 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; /** * This {@link Listener} prevents any {@link SlimefunItem} from being used in a - * {@link BrewingStand}. + * brewing stand. * * @author VoidAngel * @author SoSeDiK diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/settings/TalismanEnchantment.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/settings/TalismanEnchantment.java index 74681d9c6..c67a198da 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/settings/TalismanEnchantment.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/settings/TalismanEnchantment.java @@ -21,7 +21,7 @@ public class TalismanEnchantment extends ItemSetting { private final int level; public TalismanEnchantment(@Nonnull Enchantment enchantment, int level) { - super("allow-enchantments." + enchantment.getKey().getKey() + ".level." + level, true); + super("allow-enchantments." + enchantment.getKey().getNamespace() + '.' + enchantment.getKey().getKey() + ".level." + level, true); this.enchantment = enchantment; this.level = level; 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 e65701e5c..1ba6f3b2f 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 @@ -193,7 +193,7 @@ import io.github.thebusybiscuit.slimefun4.implementation.items.weapons.IcyBow; import io.github.thebusybiscuit.slimefun4.implementation.items.weapons.SeismicAxe; import io.github.thebusybiscuit.slimefun4.implementation.items.weapons.SwordOfBeheading; import io.github.thebusybiscuit.slimefun4.implementation.items.weapons.VampireBlade; -import io.github.thebusybiscuit.slimefun4.utils.ColoredMaterials; +import io.github.thebusybiscuit.slimefun4.utils.ColoredMaterial; import io.github.thebusybiscuit.slimefun4.utils.HeadTexture; import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils; import me.mrCookieSlime.Slimefun.Lists.RecipeType; @@ -2304,32 +2304,32 @@ public final class SlimefunItemSetup { new RainbowBlock(categories.magicalGadgets, SlimefunItems.RAINBOW_WOOL, RecipeType.ANCIENT_ALTAR, new ItemStack[] {new ItemStack(Material.WHITE_WOOL), new ItemStack(Material.WHITE_WOOL), new ItemStack(Material.WHITE_WOOL), new ItemStack(Material.WHITE_WOOL), SlimefunItems.RAINBOW_RUNE, new ItemStack(Material.WHITE_WOOL), new ItemStack(Material.WHITE_WOOL), new ItemStack(Material.WHITE_WOOL), new ItemStack(Material.WHITE_WOOL)}, - new SlimefunItemStack(SlimefunItems.RAINBOW_WOOL, 8), new RainbowTickHandler(ColoredMaterials.WOOL)) + new SlimefunItemStack(SlimefunItems.RAINBOW_WOOL, 8), new RainbowTickHandler(ColoredMaterial.WOOL)) .register(plugin); new RainbowBlock(categories.magicalGadgets, SlimefunItems.RAINBOW_GLASS, RecipeType.ANCIENT_ALTAR, new ItemStack[] {new ItemStack(Material.WHITE_STAINED_GLASS), new ItemStack(Material.WHITE_STAINED_GLASS), new ItemStack(Material.WHITE_STAINED_GLASS), new ItemStack(Material.WHITE_STAINED_GLASS), SlimefunItems.RAINBOW_RUNE, new ItemStack(Material.WHITE_STAINED_GLASS), new ItemStack(Material.WHITE_STAINED_GLASS), new ItemStack(Material.WHITE_STAINED_GLASS), new ItemStack(Material.WHITE_STAINED_GLASS)}, - new SlimefunItemStack(SlimefunItems.RAINBOW_GLASS, 8), new RainbowTickHandler(ColoredMaterials.STAINED_GLASS)) + new SlimefunItemStack(SlimefunItems.RAINBOW_GLASS, 8), new RainbowTickHandler(ColoredMaterial.STAINED_GLASS)) .register(plugin); new RainbowBlock(categories.magicalGadgets, SlimefunItems.RAINBOW_GLASS_PANE, RecipeType.ANCIENT_ALTAR, new ItemStack[] {new ItemStack(Material.WHITE_STAINED_GLASS_PANE), new ItemStack(Material.WHITE_STAINED_GLASS_PANE), new ItemStack(Material.WHITE_STAINED_GLASS_PANE), new ItemStack(Material.WHITE_STAINED_GLASS_PANE), SlimefunItems.RAINBOW_RUNE, new ItemStack(Material.WHITE_STAINED_GLASS_PANE), new ItemStack(Material.WHITE_STAINED_GLASS_PANE), new ItemStack(Material.WHITE_STAINED_GLASS_PANE), new ItemStack(Material.WHITE_STAINED_GLASS_PANE)}, - new SlimefunItemStack(SlimefunItems.RAINBOW_GLASS_PANE, 8), new RainbowTickHandler(ColoredMaterials.STAINED_GLASS_PANE)) + new SlimefunItemStack(SlimefunItems.RAINBOW_GLASS_PANE, 8), new RainbowTickHandler(ColoredMaterial.STAINED_GLASS_PANE)) .register(plugin); new RainbowBlock(categories.magicalGadgets, SlimefunItems.RAINBOW_CLAY, RecipeType.ANCIENT_ALTAR, new ItemStack[] {new ItemStack(Material.WHITE_TERRACOTTA), new ItemStack(Material.WHITE_TERRACOTTA), new ItemStack(Material.WHITE_TERRACOTTA), new ItemStack(Material.WHITE_TERRACOTTA), SlimefunItems.RAINBOW_RUNE, new ItemStack(Material.WHITE_TERRACOTTA), new ItemStack(Material.WHITE_TERRACOTTA), new ItemStack(Material.WHITE_TERRACOTTA), new ItemStack(Material.WHITE_TERRACOTTA)}, - new SlimefunItemStack(SlimefunItems.RAINBOW_CLAY, 8), new RainbowTickHandler(ColoredMaterials.TERRACOTTA)) + new SlimefunItemStack(SlimefunItems.RAINBOW_CLAY, 8), new RainbowTickHandler(ColoredMaterial.TERRACOTTA)) .register(plugin); new RainbowBlock(categories.magicalGadgets, SlimefunItems.RAINBOW_CONCRETE, RecipeType.ANCIENT_ALTAR, new ItemStack[] {new ItemStack(Material.WHITE_CONCRETE), new ItemStack(Material.WHITE_CONCRETE), new ItemStack(Material.WHITE_CONCRETE), new ItemStack(Material.WHITE_CONCRETE), SlimefunItems.RAINBOW_RUNE, new ItemStack(Material.WHITE_CONCRETE), new ItemStack(Material.WHITE_CONCRETE), new ItemStack(Material.WHITE_CONCRETE), new ItemStack(Material.WHITE_CONCRETE)}, - new SlimefunItemStack(SlimefunItems.RAINBOW_CONCRETE, 8), new RainbowTickHandler(ColoredMaterials.CONCRETE)) + new SlimefunItemStack(SlimefunItems.RAINBOW_CONCRETE, 8), new RainbowTickHandler(ColoredMaterial.CONCRETE)) .register(plugin); new RainbowBlock(categories.magicalGadgets, SlimefunItems.RAINBOW_GLAZED_TERRACOTTA, RecipeType.ANCIENT_ALTAR, new ItemStack[] {new ItemStack(Material.WHITE_GLAZED_TERRACOTTA), new ItemStack(Material.WHITE_GLAZED_TERRACOTTA), new ItemStack(Material.WHITE_GLAZED_TERRACOTTA), new ItemStack(Material.WHITE_GLAZED_TERRACOTTA), SlimefunItems.RAINBOW_RUNE, new ItemStack(Material.WHITE_GLAZED_TERRACOTTA), new ItemStack(Material.WHITE_GLAZED_TERRACOTTA), new ItemStack(Material.WHITE_GLAZED_TERRACOTTA), new ItemStack(Material.WHITE_GLAZED_TERRACOTTA)}, - new SlimefunItemStack(SlimefunItems.RAINBOW_GLAZED_TERRACOTTA, 8), new RainbowTickHandler(ColoredMaterials.GLAZED_TERRACOTTA)) + new SlimefunItemStack(SlimefunItems.RAINBOW_GLAZED_TERRACOTTA, 8), new RainbowTickHandler(ColoredMaterial.GLAZED_TERRACOTTA)) .register(plugin); // Christmas diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/utils/ColoredMaterials.java b/src/main/java/io/github/thebusybiscuit/slimefun4/utils/ColoredMaterial.java similarity index 82% rename from src/main/java/io/github/thebusybiscuit/slimefun4/utils/ColoredMaterials.java rename to src/main/java/io/github/thebusybiscuit/slimefun4/utils/ColoredMaterial.java index 7b4f8de31..bb7836767 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/utils/ColoredMaterials.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/utils/ColoredMaterial.java @@ -7,6 +7,7 @@ import java.util.List; import javax.annotation.Nonnull; import org.apache.commons.lang.Validate; +import org.bukkit.DyeColor; import org.bukkit.Material; import io.github.thebusybiscuit.slimefun4.utils.tags.SlimefunTag; @@ -20,20 +21,14 @@ import io.github.thebusybiscuit.slimefun4.utils.tags.SlimefunTag; * @see SlimefunTag * */ -public final class ColoredMaterials { - - /** - * We don't want any instances of this class, so we set the - * constructor to be private. - */ - private ColoredMaterials() {} +public enum ColoredMaterial { // @formatter:off (We want this to stay formatted like this) /** * This {@link List} contains all wool colors ordered by their appearance ingame. */ - public static final List WOOL = asList(new Material[] { + WOOL(new Material[] { Material.WHITE_WOOL, Material.ORANGE_WOOL, Material.MAGENTA_WOOL, @@ -50,12 +45,12 @@ public final class ColoredMaterials { Material.GREEN_WOOL, Material.RED_WOOL, Material.BLACK_WOOL - }); + }), /** * This {@link List} contains all stained glass colors ordered by their appearance ingame. */ - public static final List STAINED_GLASS = asList(new Material[] { + STAINED_GLASS(new Material[] { Material.WHITE_STAINED_GLASS, Material.ORANGE_STAINED_GLASS, Material.MAGENTA_STAINED_GLASS, @@ -72,12 +67,12 @@ public final class ColoredMaterials { Material.GREEN_STAINED_GLASS, Material.RED_STAINED_GLASS, Material.BLACK_STAINED_GLASS - }); + }), /** * This {@link List} contains all stained glass pane colors ordered by their appearance ingame. */ - public static final List STAINED_GLASS_PANE = asList(new Material[] { + STAINED_GLASS_PANE(new Material[] { Material.WHITE_STAINED_GLASS_PANE, Material.ORANGE_STAINED_GLASS_PANE, Material.MAGENTA_STAINED_GLASS_PANE, @@ -94,12 +89,12 @@ public final class ColoredMaterials { Material.GREEN_STAINED_GLASS_PANE, Material.RED_STAINED_GLASS_PANE, Material.BLACK_STAINED_GLASS_PANE - }); + }), /** * This {@link List} contains all terracotta colors ordered by their appearance ingame. */ - public static final List TERRACOTTA = asList(new Material[] { + TERRACOTTA(new Material[] { Material.WHITE_TERRACOTTA, Material.ORANGE_TERRACOTTA, Material.MAGENTA_TERRACOTTA, @@ -116,12 +111,12 @@ public final class ColoredMaterials { Material.GREEN_TERRACOTTA, Material.RED_TERRACOTTA, Material.BLACK_TERRACOTTA - }); + }), /** * This {@link List} contains all glazed terracotta colors ordered by their appearance ingame. */ - public static final List GLAZED_TERRACOTTA = asList(new Material[] { + GLAZED_TERRACOTTA(new Material[] { Material.WHITE_GLAZED_TERRACOTTA, Material.ORANGE_GLAZED_TERRACOTTA, Material.MAGENTA_GLAZED_TERRACOTTA, @@ -138,12 +133,12 @@ public final class ColoredMaterials { Material.GREEN_GLAZED_TERRACOTTA, Material.RED_GLAZED_TERRACOTTA, Material.BLACK_GLAZED_TERRACOTTA - }); + }), /** * This {@link List} contains all concrete colors ordered by their appearance ingame. */ - public static final List CONCRETE = asList(new Material[] { + CONCRETE(new Material[] { Material.WHITE_CONCRETE, Material.ORANGE_CONCRETE, Material.MAGENTA_CONCRETE, @@ -164,12 +159,38 @@ public final class ColoredMaterials { // @formatter:on - @Nonnull - private static List asList(@Nonnull Material[] materials) { + private final List list; + + /** + * This creates a new constant of {@link ColoredMaterial}. + * The array must have a length of 16 and cannot contain null elements! + * + * @param materials + * The {@link Material Materials} for this {@link ColoredMaterial}. + */ + ColoredMaterial(@Nonnull Material[] materials) { Validate.noNullElements(materials, "The List cannot contain any null elements"); Validate.isTrue(materials.length == 16, "Expected 16, received: " + materials.length + ". Did you miss a color?"); - return Collections.unmodifiableList(Arrays.asList(materials)); + list = Collections.unmodifiableList(Arrays.asList(materials)); + } + + @Nonnull + public List asList() { + return list; + } + + @Nonnull + public Material get(int index) { + Validate.isTrue(index >= 0 && index < 16, "The index must be between 0 and 15 (inclusive)."); + + return list.get(index); + } + + public Material get(@Nonnull DyeColor color) { + Validate.notNull(color, "Color cannot be null!"); + + return get(color.ordinal()); } } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/interfaces/InventoryBlock.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/interfaces/InventoryBlock.java index de0c283a3..8de896dc1 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/interfaces/InventoryBlock.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/interfaces/InventoryBlock.java @@ -19,7 +19,7 @@ import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow; * @deprecated This interface is not designed to be used by addons. * */ -// @Deprecated - commented out because we are not ready to send out warnings yet +@Deprecated public interface InventoryBlock { /** diff --git a/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/BlockMenuPreset.java b/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/BlockMenuPreset.java index 1a1a0ebb3..4c80fedb2 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/BlockMenuPreset.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/BlockMenuPreset.java @@ -15,6 +15,7 @@ import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.ItemStack; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; +import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow; @@ -122,6 +123,33 @@ public abstract class BlockMenuPreset extends ChestMenu { throw new UnsupportedOperationException("BlockMenuPreset does not support this method."); } + /** + * This method will draw unclickable background items into this {@link BlockMenuPreset}. + * + * @param item + * The {@link ItemStack} that should be used as background + * @param slots + * The slots which should be treated as background + */ + public void drawBackground(@Nonnull ItemStack item, @Nonnull int[] slots) { + Validate.notNull(item, "The background item cannot be null!"); + checkIfLocked(); + + for (int slot : slots) { + addItem(slot, item, ChestMenuUtils.getEmptyClickHandler()); + } + } + + /** + * This method will draw unclickable background items into this {@link BlockMenuPreset}. + * + * @param slots + * The slots which should be treated as background + */ + public void drawBackground(@Nonnull int[] slots) { + drawBackground(ChestMenuUtils.getBackground(), slots); + } + @Override public ChestMenu addItem(int slot, @Nullable ItemStack item) { checkIfLocked(); diff --git a/src/main/resources/languages/categories_zh-TW.yml b/src/main/resources/languages/categories_zh-TW.yml index 0ccd29ed4..cd08226db 100644 --- a/src/main/resources/languages/categories_zh-TW.yml +++ b/src/main/resources/languages/categories_zh-TW.yml @@ -6,7 +6,7 @@ slimefun: food: 食物 basic_machines: 基礎機器 electricity: 電力與能源 - gps: GPS機械 + gps: GPS 機械 armor: 盔甲 magical_items: 魔法物品 magical_gadgets: 魔法工具 @@ -21,6 +21,6 @@ slimefun: christmas: 聖誕節 valentines_day: 西洋情人節 easter: 復活節 - birthday: TheBusyBiscuit的生日(10月26日) + birthday: TheBusyBiscuit 的生日(10 月 26 日) halloween: 萬聖節 androids: 可編輯的機器人 diff --git a/src/main/resources/languages/messages_ar.yml b/src/main/resources/languages/messages_ar.yml index 594a2774f..e3ef3db50 100644 --- a/src/main/resources/languages/messages_ar.yml +++ b/src/main/resources/languages/messages_ar.yml @@ -245,9 +245,9 @@ messages: 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ليس بحث صحيح!" + invalid-amount: "&4%amount% &cليست قيمة صحيحة: يجب أن تكون أكثر من صفر!" + invalid-item: "&4%item% &cليس عنصر صحيح!" + invalid-research: "&4%research% &cليس بحث صحيح!" only-players: "&4هذا الأمر لللاعبين فقط" opening-backpack: "&bيتم فتح الحقيبة، قد تستغرق ثوان..." opening-guide: "&bيتم فتح الكتيب، قد يستغرق ثوان..." diff --git a/src/main/resources/languages/messages_cs.yml b/src/main/resources/languages/messages_cs.yml index 51b8b885b..89f93a40f 100644 --- a/src/main/resources/languages/messages_cs.yml +++ b/src/main/resources/languages/messages_cs.yml @@ -100,11 +100,11 @@ messages: no-permission: "&4Na tohle nemáš dostatečné povolení" usage: "&4Použití: &c%usage%" not-online: "&4%player% &czrovna není připojen!" - not-valid-item: "&4%item% &cnení platný item!" - not-valid-amount: "&4%amount% &cnení platné číslo : musí být větší než 0!" + invalid-item: "&4%item% &cnení platný item!" + invalid-amount: "&4%amount% &cnení platné číslo : musí být větší než 0!" given-item: '&bDostal jsi &a%amount% &7"%item%&7"' give-item: '&bDal jsi %player% &a%amount% &7"%item%&7"' - not-valid-research: "&4%research% &cnení platný výzkum!" + invalid-research: "&4%research% &cnení platný výzkum!" give-research: '&bUdělil jsi %player% výzkum &7"%research%&7"' hungry: "&cJsi moc hladový na to, abys to zvládl!" disabled-in-world: "&4&lTahle věc není v tomhle světě povolená" diff --git a/src/main/resources/languages/messages_de.yml b/src/main/resources/languages/messages_de.yml index b45b3b598..7ef8cd8b1 100644 --- a/src/main/resources/languages/messages_de.yml +++ b/src/main/resources/languages/messages_de.yml @@ -108,11 +108,11 @@ messages: no-permission: "&4Du hast nicht die benötigten Rechte hierfür" usage: "&4Korrekte Schreibweise: &c%usage%" not-online: "&4%player% &cist derzeit nicht online!" - not-valid-item: "&4%item% &cist kein gültiges Item!" - not-valid-amount: "&4%amount% &cist keine gültige Anzahl! Sie muss höher als 0 sein!" + invalid-item: "&4%item% &cist kein gültiges Item!" + invalid-amount: "&4%amount% &cist keine gültige Anzahl! Sie muss höher als 0 sein!" given-item: '&bDir wurde &a%amount% &7mal "%item%&7" gegeben' give-item: '&bDu hast %player% &a%amount% &7"%item%&7" gegeben' - not-valid-research: "&4%research% &cist kein gültiger Erfahrungsgrad!" + invalid-research: "&4%research% &cist kein gültiger Erfahrungsgrad!" give-research: '&bDu hast %player% den Erfahrungsgrad &7"%research%&7" vergeben' hungry: "&cDu bist zu hungrig, um dies zu tun!" disabled-in-world: "&4&lDieses Item wurde in dieser Welt deaktiviert!" diff --git a/src/main/resources/languages/messages_en.yml b/src/main/resources/languages/messages_en.yml index 6962c5e67..9ac0812b4 100644 --- a/src/main/resources/languages/messages_en.yml +++ b/src/main/resources/languages/messages_en.yml @@ -120,11 +120,11 @@ messages: no-permission: '&4You do not have the required permission to do this' usage: '&4Usage: &c%usage%' not-online: '&4%player% &cis not online!' - not-valid-item: '&4%item% &cis not a valid Item!' - not-valid-amount: '&4%amount% &cis not a valid amount : it must be higher than 0!' + invalid-item: '&4%item% &cis not a valid Item!' + invalid-amount: '&4%amount% &cis not a valid amount : it must be higher than 0!' given-item: '&bYou have been given &a%amount% &7"%item%&7"' give-item: '&bYou have given %player% &a%amount% &7"%item%&7"' - not-valid-research: '&4%research% &cis not a valid Research!' + invalid-research: '&4%research% &cis not a valid Research!' give-research: '&bYou have given %player% the Research &7"%research%&7"' hungry: '&cYou are too hungry to do that!' disabled-in-world: '&4&lThis Item has been disabled in this world' diff --git a/src/main/resources/languages/messages_es.yml b/src/main/resources/languages/messages_es.yml index 0629e3429..a9c282018 100644 --- a/src/main/resources/languages/messages_es.yml +++ b/src/main/resources/languages/messages_es.yml @@ -102,12 +102,12 @@ messages: no-permission: "&4No tienes el permiso requerido para hacer esto." usage: "&4Uso: &c%usage%" not-online: "&c¡&4%player% &cno está conectado!" - not-valid-item: "&c¡&4%item% &cno es un objeto válido!" - not-valid-amount: "&c¡&4%amount% &cno es un valor válido: tiene que ser mayor a + invalid-item: "&c¡&4%item% &cno es un objeto válido!" + invalid-amount: "&c¡&4%amount% &cno es un valor válido: tiene que ser mayor a 0!" given-item: '&bTe han dado &a%amount% &7"%item%&7"' give-item: '&bLe has dado a %player%, &a%amount% &7"%item%&7"' - not-valid-research: "&c¡&4%research% &cno es un conocimiento válido!" + invalid-research: "&c¡&4%research% &cno es un conocimiento válido!" give-research: '&bLe has dado a %player% la investigación &7"%research%&7"' hungry: "&c¡Tienes demasiada hambre para hacer eso!" disabled-in-world: "&4&lEste item ha sido desactivado en el mundo." diff --git a/src/main/resources/languages/messages_fr.yml b/src/main/resources/languages/messages_fr.yml index 797238f77..45789bdf8 100644 --- a/src/main/resources/languages/messages_fr.yml +++ b/src/main/resources/languages/messages_fr.yml @@ -110,12 +110,12 @@ messages: no-permission: "&4Vous n'avez pas les permissions requises pour faire ceci" usage: "&4Utilisation: &c%usage%" not-online: "&4%player% &cn'est pas en ligne!" - not-valid-item: "&4%item% &cn'est pas un item valide!" - not-valid-amount: "&4%amount% &cn'est pas un montant valide: il doit être supérieur + invalid-item: "&4%item% &cn'est pas un item valide!" + invalid-amount: "&4%amount% &cn'est pas un montant valide: il doit être supérieur à 0!" given-item: '&bVous avez reçu &a%amount%&7 "%item%&7"' give-item: '&bVous avez donné &a%amount% &7"%item%&7" à %player%' - not-valid-research: "&4%research% &cn'est pas une recherche valide!" + invalid-research: "&4%research% &cn'est pas une recherche valide!" give-research: '&bVous avez débloqué la recherche "%research%&7" à %player%' hungry: "&cVous avez trop faim pour faire ça!" disabled-in-world: "&4&lCet item a été désactivé dans ce monde" diff --git a/src/main/resources/languages/messages_hu.yml b/src/main/resources/languages/messages_hu.yml index 5bfa56bdd..cff22a025 100644 --- a/src/main/resources/languages/messages_hu.yml +++ b/src/main/resources/languages/messages_hu.yml @@ -106,11 +106,11 @@ messages: no-permission: "&4Ehhez nincs jogod" usage: "&4Használat: &c%usage%" not-online: "&4%player% &cjelenleg nem elérhető!" - not-valid-item: "&4%item% &cnem megfelelő tárgy!" - not-valid-amount: "&4%amount% &cnem megfelelő mennyiség: 0-nál nagyobbnak kell lennie!" + invalid-item: "&4%item% &cnem megfelelő tárgy!" + invalid-amount: "&4%amount% &cnem megfelelő mennyiség: 0-nál nagyobbnak kell lennie!" given-item: '&bKaptál &a%amount% darab &7"%item%&7"&b-t' give-item: '&bAdtál %player%-nek/nak &a%amount% &7"%item%&7"&b-t' - not-valid-research: "&4%research% &cnem érvényes Kutatás!" + invalid-research: "&4%research% &cnem érvényes Kutatás!" give-research: '&bMegadtad %player% játékosnak a(z) &7"%research%&7" &bkutatást' hungry: "&cTúl éhes vagy ehhez!" disabled-in-world: "&4&lEz a tárgy tiltva van ebben a világban" diff --git a/src/main/resources/languages/messages_id.yml b/src/main/resources/languages/messages_id.yml index 033a0c516..f7ff26158 100644 --- a/src/main/resources/languages/messages_id.yml +++ b/src/main/resources/languages/messages_id.yml @@ -83,11 +83,11 @@ messages: no-permission: "&4Anda Tidak Memiliki Izin Untuk Ini" usage: "&4Penggunaan: &c%usage%" not-online: "&4%player% &cTidak Sedang Bermain Disini!" - not-valid-item: "&4%item% &cBenda Ini Tidak sah" - not-valid-amount: "&4%amount% &cJumlah Ini Salah : Harus Lebih Tinggi Dari 0!" + invalid-item: "&4%item% &cBenda Ini Tidak sah" + invalid-amount: "&4%amount% &cJumlah Ini Salah : Harus Lebih Tinggi Dari 0!" given-item: '&bAnda Telah Diberikan &a%amount% &7"%item%&7"' give-item: '&bAnda Telah Memberi %player% &a%amount% &7"%item%&7"' - not-valid-research: "&4%research% &cIni Bukan Penelitian Yang Benar!" + invalid-research: "&4%research% &cIni Bukan Penelitian Yang Benar!" give-research: '&bAnda Telah Memberi %player% Penelitian &7"%research%&7"' hungry: "&cAnda Terlalu Lapar Untuk Ini " mode-change: "&b%device% Mode Telah Berubah Menjadi: &9%mode%" diff --git a/src/main/resources/languages/messages_it.yml b/src/main/resources/languages/messages_it.yml index 4ab431a8c..aba2ae226 100644 --- a/src/main/resources/languages/messages_it.yml +++ b/src/main/resources/languages/messages_it.yml @@ -249,9 +249,9 @@ messages: no-tome-yourself: "&cNon puoi utilizzare il &4Tomo della conoscienza &c su te stesso ..." not-online: "&4%player% &cnon è online!" - not-valid-amount: "&4%amount% &cnon è una valida quantità: deve essere maggiore + invalid-amount: "&4%amount% &cnon è una valida quantità: deve essere maggiore di 0!" - not-valid-research: "&4%research% &cnon è una ricerca valida!" + invalid-research: "&4%research% &cnon è una ricerca valida!" only-players: "&4Questo comando è solo per i players" opening-backpack: "&bAprendo lo zaino, potrebbero essere necessari alcuni secondi ..." @@ -282,7 +282,7 @@ messages: unlocked: '&bHai sbloccato &7 "%research%"' usage: "&4Utilizzo: &c%usage%" not-researched: "&4Non hai abbastanza conoscenze per capirlo!" - not-valid-item: "&4%item% &cnon è un oggetto valido!" + invalid-item: "&4%item% &cnon è un oggetto valido!" disabled-in-world: "&4&lQuesto oggetto è stato disattivato in questo mondo!" disabled-item: "&4& lQuesto oggetto è stato disabilitato! Come l'hai ottenuto?" radiation: "&4Sei stato esposto a radiazioni mortali! &cSbarazzati dell'oggetto diff --git a/src/main/resources/languages/messages_ja.yml b/src/main/resources/languages/messages_ja.yml index c34c65548..a38e85db9 100644 --- a/src/main/resources/languages/messages_ja.yml +++ b/src/main/resources/languages/messages_ja.yml @@ -106,11 +106,11 @@ messages: no-permission: "&4権限がありません" usage: "&4使用法: &c%usage%" not-online: "&4%player% &cはオンラインではありません!" - not-valid-item: "&4%item% &cは正しくないアイテムです" - not-valid-amount: "&4%amount% &cの部分には、正の整数を指定してください" + invalid-item: "&4%item% &cは正しくないアイテムです" + invalid-amount: "&4%amount% &cの部分には、正の整数を指定してください" given-item: "&b%item%を%amount%個与えられました" give-item: "&b%player%に%item%を%amount%個与えました" - not-valid-research: "&4%research%&cは正しくないリサーチです" + invalid-research: "&4%research%&cは正しくないリサーチです" give-research: "&b%player%のリサーチ%research%を完了させました" hungry: "&c空腹のため使えません" disabled-in-world: "&4&lこのワールドでは使用できません" diff --git a/src/main/resources/languages/messages_ko.yml b/src/main/resources/languages/messages_ko.yml index a160b4358..ad0290582 100644 --- a/src/main/resources/languages/messages_ko.yml +++ b/src/main/resources/languages/messages_ko.yml @@ -90,11 +90,11 @@ messages: no-permission: "&4이 작업에 필요한 권한이 없습니다." usage: "&4사용량: &c%usage%\n" not-online: "&4%player% &cis가 온라인 상태가 아닙니다!" - not-valid-item: "&4%item% &cis가 올바른 아이템이 아닙니다!" - not-valid-amount: "&4%amount% &cis 유효한 금액이 아닙니다. 0보다 커야 합니다!" + invalid-item: "&4%item% &cis가 올바른 아이템이 아닙니다!" + invalid-amount: "&4%amount% &cis 유효한 금액이 아닙니다. 0보다 커야 합니다!" given-item: '&b당신은 &a%amount% &7"%item%&7"을 받았다.' give-item: '&b%player% &a%amount% &7"%item%&7"을(를) 제공하셨습니다.' - not-valid-research: "&4%research% &cis가 유효하지 않은 연구!\n" + invalid-research: "&4%research% &cis가 유효하지 않은 연구!\n" give-research: '&b%player%에 Research &7"%research%&7"을(를) 제공했습니다. ' diff --git a/src/main/resources/languages/messages_lv.yml b/src/main/resources/languages/messages_lv.yml index de6d2c82b..8e4ce69f6 100644 --- a/src/main/resources/languages/messages_lv.yml +++ b/src/main/resources/languages/messages_lv.yml @@ -56,11 +56,11 @@ messages: no-permission: "&4Tev šo nav atļauts darīt" usage: "&4Pamācība: &c%usage%" not-online: "&4%player%&c nav pieslēdzies!" - not-valid-item: "&4%item% &cneeksistē!" - not-valid-amount: "&4%amount% &cnav pareizs daudzums : tam jābūt lielākam par 0!" + invalid-item: "&4%item% &cneeksistē!" + invalid-amount: "&4%amount% &cnav pareizs daudzums : tam jābūt lielākam par 0!" given-item: '&bTev iedeva &a%amount% &7"%item%&7"' give-item: '&bTu iedevi %player% &a%amount% &7"%item%&7"' - not-valid-research: "&4%research% &cis nav eksistējošs atklājums!" + invalid-research: "&4%research% &cis nav eksistējošs atklājums!" give-research: '&bTu iedevi %player% atklājumu ar nosaukumu &7"%research%&7"' hungry: "&cTu esi pārāk izsalcis, lai šo darītu!" mode-change: "&b%device% režīms nomainīts uz &9%mode%" diff --git a/src/main/resources/languages/messages_nl.yml b/src/main/resources/languages/messages_nl.yml index 2589909bd..199735711 100644 --- a/src/main/resources/languages/messages_nl.yml +++ b/src/main/resources/languages/messages_nl.yml @@ -83,12 +83,12 @@ messages: no-permission: "&4Je hebt geen toestemming om deze actie uit te voeren" usage: "&4Gebruik, zoals: &c%usage%" not-online: "&4%player% &cis niet online!" - not-valid-item: "&4%item% &cis geen geldig voorwerp!" - not-valid-amount: "&4%amount% &cis geen geldige hoeveelheid: het moet meer zijn + invalid-item: "&4%item% &cis geen geldig voorwerp!" + invalid-amount: "&4%amount% &cis geen geldige hoeveelheid: het moet meer zijn dan 0!" given-item: '&bJe hebt &a%amount% keer &7"%item%&7" ontvangen' give-item: '&bJe hebt %player% &a%amount% keer &7"%item%&7" gegeven' - not-valid-research: "&4%research% &cis geen geldig Slimefun onderzoek" + invalid-research: "&4%research% &cis geen geldig Slimefun onderzoek" give-research: '&bJe hebt %player% de kennis over &7"%research%&7" gegeven' hungry: "&cJe hebt teveel honger om zoiets te doen!" disabled-in-world: "&4&lDit voorwerp is uitgeschakeld in deze wereld" diff --git a/src/main/resources/languages/messages_pl.yml b/src/main/resources/languages/messages_pl.yml index 1cff0f74c..108aaaaee 100644 --- a/src/main/resources/languages/messages_pl.yml +++ b/src/main/resources/languages/messages_pl.yml @@ -81,12 +81,12 @@ messages: no-permission: "&4Brak uprawnień" usage: "&4Użycie: &c%usage%" not-online: "&4%player% &cnie jest online!" - not-valid-item: "&4%item% &cnie jest poprawnym przedmiotem!" - not-valid-amount: "&4%amount% &cnie jest prawidłową ilością: ilość musi być większa + invalid-item: "&4%item% &cnie jest poprawnym przedmiotem!" + invalid-amount: "&4%amount% &cnie jest prawidłową ilością: ilość musi być większa od 0!" given-item: '&bOtrzymano &a%amount% &7"%item%&7"' give-item: '&bDodano przedmiot do plecaka gracza %player%: &a%amount% &7"%item%&7"' - not-valid-research: "&4%research% &cnie jest poprawnym Badaniem!" + invalid-research: "&4%research% &cnie jest poprawnym Badaniem!" give-research: '&bOdblokowano badanie &7"%research%&7" dla gracza %player%' hungry: "&cJesteś zbyt głodny, żeby to zrobić!" mode-change: "&bTryb urządzenia %device% został zmieniony na: &9%mode%" diff --git a/src/main/resources/languages/messages_pt-BR.yml b/src/main/resources/languages/messages_pt-BR.yml index 995c26915..df1a164f5 100644 --- a/src/main/resources/languages/messages_pt-BR.yml +++ b/src/main/resources/languages/messages_pt-BR.yml @@ -237,10 +237,10 @@ messages: no-tome-yourself: "&cVocê não pode usar o &4Tomo do Conhecimento &cem si mesmo..." not-online: "&4%player% &cnão está online!" not-researched: "&4Você não tem conhecimento suficiente para entender sobre isso." - not-valid-amount: "&4%amount% &cnão é uma quantidade válida (precisa ser maior que + invalid-amount: "&4%amount% &cnão é uma quantidade válida (precisa ser maior que 0)!" - not-valid-item: "&4%item% &cnão é um item válido!" - not-valid-research: "&4%research% &cnão é uma Pesquisa válida!" + invalid-item: "&4%item% &cnão é um item válido!" + invalid-research: "&4%research% &cnão é uma Pesquisa válida!" only-players: "&4Este comando é apenas para jogadores" opening-backpack: "&bAbrindo a mochila, isso pode levar alguns segundos..." opening-guide: "&bAbrindo o guia, isso pode levar alguns segundos..." diff --git a/src/main/resources/languages/messages_ru.yml b/src/main/resources/languages/messages_ru.yml index addbf80bb..5b3643cd9 100644 --- a/src/main/resources/languages/messages_ru.yml +++ b/src/main/resources/languages/messages_ru.yml @@ -107,12 +107,12 @@ messages: no-permission: "&4У Вас недостаточно прав, чтобы сделать это" usage: "&4Использование: &c%usage%" not-online: "&4%player% &cсейчас не в игре!" - not-valid-item: "&4%item% &cне является допустимым предметом!" - not-valid-amount: "&4%amount% &cне является допустимым числом: количество должно + invalid-item: "&4%item% &cне является допустимым предметом!" + invalid-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не является допустимым исследованием!" + invalid-research: "&4%research% &cне является допустимым исследованием!" give-research: '&bВы выдали игроку %player% исследование &7"%research%&7"' hungry: "&cВы слишком голодны для этого!" disabled-in-world: "&4&lДанный предмет отключен в этом мире" diff --git a/src/main/resources/languages/messages_sk.yml b/src/main/resources/languages/messages_sk.yml index 1d2279149..23ea80a91 100644 --- a/src/main/resources/languages/messages_sk.yml +++ b/src/main/resources/languages/messages_sk.yml @@ -251,9 +251,9 @@ messages: no-tome-yourself: "&cNemôžeš použiť &4Knihu vedomostí &cna seba..." not-online: "&4%player% &cnie je online!" not-researched: "&4Nemáš toľko vedomostí aby si tomu porozumel" - not-valid-amount: "&4%amount% &cnie je platné množstvo: Musí byť väčšie ako 0!" - not-valid-item: "&4%item% &cnie je platný item!" - not-valid-research: "&4%research% &cnie je platný výskum!" + invalid-amount: "&4%amount% &cnie je platné množstvo: Musí byť väčšie ako 0!" + invalid-item: "&4%item% &cnie je platný item!" + invalid-research: "&4%research% &cnie je platný výskum!" only-players: "&4Tento príkaz je iba pre hráčov" opening-backpack: "&bOtváram batoh, môže to trvať pár sekúnd..." opening-guide: "&bOtváram príručku, môže to trvať pár sekúnd..." diff --git a/src/main/resources/languages/messages_sv.yml b/src/main/resources/languages/messages_sv.yml index 54a258473..99a7d7a9c 100644 --- a/src/main/resources/languages/messages_sv.yml +++ b/src/main/resources/languages/messages_sv.yml @@ -250,10 +250,10 @@ messages: no-tome-yourself: "&cDu kan inte använda &4Tome of Knowledge &cpå dig själv" not-online: "&4%player% &cär inte online!" not-researched: "&4Du har inte tillräckligt mycket kunskap för att förstå detta" - not-valid-amount: "&4%amount% &cär inget giltigt antal : det måste vara större än + invalid-amount: "&4%amount% &cär inget giltigt antal : det måste vara större än noll!" - not-valid-item: "&4%item% &cär inget giltigt föremål!" - not-valid-research: "&4%research% &cär ingen giltig forskning!" + invalid-item: "&4%item% &cär inget giltigt föremål!" + invalid-research: "&4%research% &cär ingen giltig forskning!" only-players: "&4Detta kommando är endast för spelare" opening-backpack: "&bÖppnar ryggsäck. Detta kan ta några sekunder..." opening-guide: "&bÖppnar handboken. Detta kan ta några sekunder..." diff --git a/src/main/resources/languages/messages_th.yml b/src/main/resources/languages/messages_th.yml index c6dab712c..aac31598d 100644 --- a/src/main/resources/languages/messages_th.yml +++ b/src/main/resources/languages/messages_th.yml @@ -75,8 +75,8 @@ messages: unknown-player: "&4ไม่รู้จักผู้เล่น: &c%player%" no-permission: "&4คุณต้องได้รับ permission เพื่อกระทำสิ่งนี้" not-online: "&4%player% &cไม่ได้ออนไลน์!" - not-valid-item: "&4%item% &cไม่ใช่ไอเทมที่ถูกต้อง!" - not-valid-amount: "&4%amount% &cไม่ใช่จำนวนที่ถูกต้อง : ตัวเลขควรมากกว่า 0!" + invalid-item: "&4%item% &cไม่ใช่ไอเทมที่ถูกต้อง!" + invalid-amount: "&4%amount% &cไม่ใช่จำนวนที่ถูกต้อง : ตัวเลขควรมากกว่า 0!" given-item: '&bคุณได้เสก &7"%item%&7" &ax%amount%' give-item: '&bคุณได้เสก &7"%item%&7" &ax%amount% ให้กับ %player%' hungry: "&cคุณหิวเกินไปจะทำเช่นนั้น!" @@ -100,7 +100,7 @@ messages: not-researched: "&4คุณมีความรู้ไม่เพียงพอที่จะเข้าใจสิ่งนี้" not-enough-xp: "&4คุณมี XP ไม่เพียงพอที่จะปลดล็อก" usage: "&4วิธีใช้: &c%usage%" - not-valid-research: "&4%research% &cนี้ไม่ใช่คำสำหรับการค้นหา!" + invalid-research: "&4%research% &cนี้ไม่ใช่คำสำหรับการค้นหา!" give-research: '&bคุณได้ให้ %player% เรียนรู้&7"%research%&7"' mode-change: "&b%device% เปลี่ยนโหมดเป็น: &9%mode%" disabled-item: "&4&lไอเท็มถูกปิดการใช้งาน! คุณเอาไอเท็มมาจากไหน?" diff --git a/src/main/resources/languages/messages_tl.yml b/src/main/resources/languages/messages_tl.yml index cb9531d74..3075f703a 100644 --- a/src/main/resources/languages/messages_tl.yml +++ b/src/main/resources/languages/messages_tl.yml @@ -105,12 +105,12 @@ messages: no-permission: "&4Wala kang permiso para gawin ito." usage: "&4Paggamit: &c%usage%" not-online: "&cHindi online si &4%player%!" - not-valid-item: "&cHindi valid ang &4%item%!" - not-valid-amount: "&cHindi valid ang amount na &4%amount% : dapat ito'y mas mataas + invalid-item: "&cHindi valid ang &4%item%!" + invalid-amount: "&cHindi valid ang amount na &4%amount% : dapat ito'y mas mataas kaysa sa 0!" given-item: '&bIka''y binigyan ng &a%amount% &7"%item%&7"' give-item: '&bBinigyan mo si %player% ng &a%amount% &7"%item%&7"' - not-valid-research: "&4%research% &cay hindi valid na Research!" + invalid-research: "&4%research% &cay hindi valid na Research!" give-research: '&bBinigyan mo si %player% ng Research &7"%research%&7"' hungry: "&cIkaw ay sobrang gutom para gawin ito!" disabled-in-world: "&4&lDinisable ang Aytem sa world na ito." diff --git a/src/main/resources/languages/messages_tr.yml b/src/main/resources/languages/messages_tr.yml index b919a99d0..fa2955464 100644 --- a/src/main/resources/languages/messages_tr.yml +++ b/src/main/resources/languages/messages_tr.yml @@ -108,11 +108,11 @@ messages: no-permission: "&4Bunu yapmak için gerekli izniniz yok" usage: "&4Kullanış: &c%usage%" not-online: "&4%player% &coyunda değil!" - not-valid-item: "&4%item% &cgeçerli bir eşya değil!" - not-valid-amount: "&4%amount% &cgeçerli bir miktar değil : 0 dan büyük olmalı!" + invalid-item: "&4%item% &cgeçerli bir eşya değil!" + invalid-amount: "&4%amount% &cgeçerli bir miktar değil : 0 dan büyük olmalı!" given-item: '&a%amount% &badet &7"%item%&7" &bsana verildi.' give-item: '&b%player% adlı oyuncuya &a%amount% &badet &7"%item%&7" &bverdin.' - not-valid-research: "&4%research% &cgeçerli bir araştırma değil!" + invalid-research: "&4%research% &cgeçerli bir araştırma değil!" give-research: '&b%player% adlı oyuncu için bir araştırmayı açtın: &7"%research%&7"' hungry: "&cBunu yapmak için çok açsın!" disabled-in-world: "&4&lBu eşya bu dünyada devre dışı bırakıldı." diff --git a/src/main/resources/languages/messages_uk.yml b/src/main/resources/languages/messages_uk.yml index cf34438e5..4c73a7570 100644 --- a/src/main/resources/languages/messages_uk.yml +++ b/src/main/resources/languages/messages_uk.yml @@ -84,12 +84,12 @@ messages: no-permission: "&4У Вас недостатньо прав для цього" usage: "&4Використання: &c%usage%" not-online: "&4%player% &cзараз не знаходиться у грі!" - not-valid-item: "&4%item% &cне є достовірним предметом!" - not-valid-amount: "&4%amount% &cне є допустимою кількістю: значення повинно бути + invalid-item: "&4%item% &cне є достовірним предметом!" + invalid-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не є правильним дослідженням!" + invalid-research: "&4%research% &cне є правильним дослідженням!" give-research: '&bВи видали грацю %player% дослідження &7"%research%&7"' hungry: "&cВи занадто голодні для цього!" mode-change: "&b%device% | Режим змінено на: &9%mode%" diff --git a/src/main/resources/languages/messages_vi.yml b/src/main/resources/languages/messages_vi.yml index 1c6234769..0cdcc4902 100644 --- a/src/main/resources/languages/messages_vi.yml +++ b/src/main/resources/languages/messages_vi.yml @@ -273,9 +273,9 @@ messages: no-tome-yourself: "&cBạn không thể sử dụng &4Bộ kiến thức &ccho chính bạn..." not-online: "&4%player% &cđang không trực tuyến!" not-researched: "&4Bạn không có đủ kiến thức để hiểu điều này" - not-valid-amount: "&4%amount% &ckhông hợp lệ : phải lớn hơn 0!" - not-valid-item: "&4%item% &ckhông phải là vật phẩm hợp lệ!" - not-valid-research: "&4%research% &ckhông phải là nghiên cứu hợp lệ!" + invalid-amount: "&4%amount% &ckhông hợp lệ : phải lớn hơn 0!" + invalid-item: "&4%item% &ckhông phải là vật phẩm hợp lệ!" + invalid-research: "&4%research% &ckhông phải là nghiên cứu hợp lệ!" only-players: "&4Lệnh này chỉ dành cho người chơi" opening-backpack: "&bĐang mở ba lô, việc này có thể mất một vài giây..." opening-guide: "&bĐang mở hướng dẫn, việc này có thể mất một vài giây..." diff --git a/src/main/resources/languages/messages_zh-CN.yml b/src/main/resources/languages/messages_zh-CN.yml index 34134c21d..2b1cf8558 100644 --- a/src/main/resources/languages/messages_zh-CN.yml +++ b/src/main/resources/languages/messages_zh-CN.yml @@ -106,11 +106,11 @@ messages: no-permission: "&4你没有足够的权限做这个" usage: "&4用法: &c%usage%" not-online: "&4%player% &c不在线" - not-valid-item: "&4%item% &c不是一个有效的物品名!" - not-valid-amount: "&4%amount% &ci不是一个有效的数字 : 它必须大于 0!" + invalid-item: "&4%item% &c不是一个有效的物品名!" + invalid-amount: "&4%amount% &ci不是一个有效的数字 : 它必须大于 0!" given-item: '&b你获得了 &a%amount% &7"%item%&7"' give-item: '&b成功给予玩家 %player% &a%amount% &7"%item%&7"' - not-valid-research: "&4%research% &c不是一个有效的研究名!" + invalid-research: "&4%research% &c不是一个有效的研究名!" give-research: '&b你成功解锁了玩家 %player% 的研究 &7"%research%&7"' hungry: "&c你太饿了, 先吃点东西再试试吧!" disabled-in-world: "&4&l这个物品在此世界已被禁用" diff --git a/src/main/resources/languages/messages_zh-TW.yml b/src/main/resources/languages/messages_zh-TW.yml index 26b65a0d6..a9622a5ac 100644 --- a/src/main/resources/languages/messages_zh-TW.yml +++ b/src/main/resources/languages/messages_zh-TW.yml @@ -20,6 +20,10 @@ commands: player-never-joined: "&4找不到該ID的玩家" backpack-does-not-exist: "&4該背包不存在!" restored-backpack-given: "&a你的背包已被修復並放到你的物品欄中!" + charge: + description: 為你手中的物品充電 + charge-success: 此物品以充電完成! + not-rechargeable: 此物品不可被充電! guide: search: message: "&c你要搜尋什麼?" @@ -39,6 +43,12 @@ guide: select: 點擊選擇此語言 select-default: 點擊選擇默認語言 selected-language: 當前選擇: + change: 點擊以選取新語言 + description: + - "&7你現在可以選擇 Slimefun" + - "&7介面的語言" + - "&7不過科技物品礙於技術" + - "&7暫時沒有辦法翻譯" title: main: Slimefun指南 settings: 設置及資訊 @@ -48,6 +58,7 @@ guide: addons: Slimefun4的附加插件 bugs: 錯誤報告 source: 來源代碼 + versions: 安裝版本 credits: commit: 成員 commits: 成員 @@ -57,6 +68,12 @@ guide: resourcepack: "&7資源包製作人員" translator: "&9翻譯人員" profile-link: 點擊觀看他們在GitHub上的個人資料 + open: 點擊查看貢獻者 + description: + - "&7Slimefun 是個開放性的計畫" + - "&7由一大群人一起開發和構想" + - "&7超過 &e%contributors% &7個人在這些年中" + - "&7花時間開發Slimefun" pages: previous: 上一頁 next: 下一頁 @@ -69,6 +86,7 @@ guide: miner: 此挖礦機可獲取的資源 generator: 可以使用的燃料 gold-pan: 可以獲取的資源 + climbing-pick: 你可以攀爬的平面材質 back: title: 上一頁 guide: 回到Slimefun指南 @@ -78,6 +96,7 @@ guide: - 要解鎖此分類 - 必須先解鎖下列分類 - 的所有物品 + work-in-progress: 此功能尚未開發完成! messages: not-researched: "&4你太笨了" not-enough-xp: "&4你沒有足夠的經驗值用以解鎖這個" @@ -87,14 +106,10 @@ messages: 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..." @@ -113,6 +128,7 @@ messages: knight: "&a&o你的護身符給了你5秒的回復時間" whirlwind: "&a&o你的護身符反射了投射物" wizard: "&a&o你的護身符為你升高了幸運等級,但也降低了其他附魔等級" + caveman: "&a&o你的護身符給了你挖掘加速效果" soulbound-rune: fail: "&c你一次只能魂綁一個物品。" success: "&a您已成功將此物品綁定魂綁!死後不會噴掉。" @@ -143,6 +159,26 @@ messages: - "&7永遠保持樂觀積極!" - "&7這不是普通的餅乾" - "&7霓虹燈好帥!" + piglin-barter: "&4你不能用 Slimefun 物品和豬布林交易" + enchantment-rune: + fail: "&c你無法附魔該物品" + no-enchantment: "&c找不到可以附在該物品上的附魔" + success: "&a你已成功地在該物品上附上了一個隨機的附魔" + tape-measure: + no-anchor: "&c你需要設錨點才能開始測量!" + wrong-world: "&c你的錨點在另外一個世界" + distance: "&7測量成功 &e距離: %distance%" + anchor-set: "&a成功設置錨點:&e %anchor%" + multi-tool: + mode-change: "&b%device% 模式切換成: &9%mode%" + not-shears: "&c不要把它當剪刀用!" + climbing-pick: + dual-wielding: "&4你需要雙手都握著攀爬鎬才能攀爬" + wrong-material: "&c你無法攀爬這種平面 使用你的科技書以獲取更多資訊" + invalid-item: "&4%item% &c不存在!" + invalid-amount: "&4%amount% &c不是有效數量:數值必須大於0!" + invalid-research: "&4%research% &c不存在!" + mode-change: "&b%device% 模式切換至: &9%mode%" machines: pattern-not-found: "&e查無此合成表 請確認使用的機器或合成表的材料" unknown-material: "&e這個機器不能處理這個物品 請確認使用的機器或合成表的材料" @@ -192,6 +228,7 @@ machines: finished: "&e你的工業挖礦機已挖掘完畢 共挖到 %ores% 個!" anvil: not-working: "&4科技物品需要用自動鐵砧+修理膠帶!" + mcmmo-salvaging: "&4你不能回收利用 Slimefun 物品!" backpack: already-open: "&c別人正在使用這個背包!" no-stack: "&c背包不能疊!" @@ -203,6 +240,7 @@ gps: new: "&e輸入傳送點名稱 &7(Color Codes supported!)" added: "&a成功新增傳送點" max: "&4傳送點已達上限" + duplicate: "&4已經有叫做 &f%waypoint% &4的傳送點了" insufficient-complexity: - "&4GPS信號不足 &c%complexity%" - "&4a) GPS基礎設施未放置" @@ -274,6 +312,7 @@ languages: zh-CN: 中文(簡體) el: 希臘語 he: 希伯來語 + pt: 葡萄牙文(葡萄牙) ar: 阿拉伯文 af: 南非語 da: 丹麥文 @@ -285,7 +324,6 @@ languages: fa: 波斯語 th: 泰語 ro: 羅馬尼亞語 - pt: 葡萄牙文(葡萄牙) pt-BR: 葡萄牙文(巴西) bg: 保加利亞語 ko: 韓語 @@ -295,5 +333,13 @@ languages: sr: 塞爾維亞語 be: 白俄羅斯語 tl: 他加祿語 +brewing_stand: + not-working: "&4你不能用 Slimefun 物品釀造!" +villagers: + no-trading: "&4你不能用 Slimefun 物品交易!" +cartography_table: + not-working: "&4你不能在製圖桌上使用 Slimefun 物品!" +cauldron: + no-discoloring: "&4你不能把 Slimefun 物品的顏色消除!" miner: no-ores: "&e附近沒礦了!" diff --git a/src/main/resources/languages/recipes_ko.yml b/src/main/resources/languages/recipes_ko.yml index dcf9daa0c..8fbaa0b79 100644 --- a/src/main/resources/languages/recipes_ko.yml +++ b/src/main/resources/languages/recipes_ko.yml @@ -6,109 +6,109 @@ slimefun: - 표시된 구조를 설치 - 보여진 바와 같이. 제작되지 않습니다. enhanced_crafting_table: + name: '향상된 조합대 (Enhanced Crafting Table)' lore: - 표시된대로 이 아이템을 제작하십시오 - 향상된 조합대(Enhanced Crafting Table) 내에서 - 일반 조합대로는 충분하지 않습니다! - name: '향상된 조합대 (Enhanced Crafting Table) ' armor_forge: + name: 갑옷 대장간 (Armor Forge) lore: - 표시된대로 이 아이템을 제작하십시오 - 갑옷 대장간 (Armor Forge) 사용 - name: 갑옷 대장간 (Armor Forge grind_stone: + name: 맷돌 (Grind Stone) lore: - 표시된대로이 아이템을 제작하십시오 - 맷돌(Grind Stone) 사용 - name: 맷돌 (Grind Stone) smeltery: + name: 제련소 (Smeltery) lore: - 표시된대로 이 아이템을 제작하십시오 - 제련소 (Smeltery) 사용 - name: 제련소 (Smeltery) ore_crusher: + name: 광석 분쇄기 (Ore Crusher) lore: - 표시된대로이 아이템을 제작하십시오 - 광석 분쇄기 (Ore Crusher) 사용 - name: 광석 분쇄기 (Ore Crusher) mob_drop: name: 몹 드롭 lore: - 몹을 처치하여 - 이 아이템을 얻다 gold_pan: + name: 골드 판 (Gold Pan) lore: - 골드 판 (Gold Pan) 사용 - 이 아이템을 얻다 - name: 골드 판 (Gold Pan) compressor: + name: 압축기 (Compressor) lore: - 표시된대로 이 아이템을 제작하십시오 - 압축기(Compressor) 를 사용하여 - name: 압축기 (Compressor) pressure_chamber: name: 압력 챔버 lore: - 표시된대로이 아이템을 제작하십시오 - 압력 챔버를 사용하여 ore_washer: + name: 광물 세척기 (Ore Washer) lore: - 표시된대로 이 아이템을 제작하십시오 - 광물 세척기를 사용하여 - name: 광물 세척기 (Ore Washer) juicer: + name: 주스기 (Juicer) lore: - 그림과 같이 주스를 만드십시오 - 주스기 (Juicer) 를 사용하여 - name: 주스기 (Juicer) magic_workbench: + name: 마법 조합대 (Magic Workbench) lore: - 표시된대로 이 아이템을 제작하십시오 - 마법 조합대 (Magic Workbench) 를 사용하여 - name: 마법 조합대 (Magic Workbench) ancient_altar: + name: 고대 제단 (Ancient Altar) lore: - 표시된대로 이 아이템을 제작하십시오 - 고대 제단 (Ancient Altar) 을 사용하여 - 자세한 정보는 고대 제단 (Ancient Altar) 을 찾아보십시오 - name: 고대 제단 (Ancient Altar) heated_pressure_chamber: + name: 가열 압력 챔버 (Heated Pressure Chamber) lore: - 표시된대로 이 아이템을 제작하십시오 - 가열 압력 챔버 (Heated Pressure Chamber) 를 사용하여 - name: 가열 압력 챔버 (Heated Pressure Chamber) food_fabricator: + name: 식품 제작기 (Food Fabricator) lore: - 표시된대로 이 아이템을 제작하십시오 - 식품 제작기 (Food Fabricator) 를 사용하여 - name: 식품 제작기 (Food Fabricator) food_composter: + name: 식품 퇴비통 (Food Composter) lore: - 표시된대로 이 아이템을 제작하십시오 - 식품 퇴비통 (Food Composter) 을 사용하여 - name: 식품 퇴비통 (Food Composter) freezer: + name: 냉동고 (Freezer) lore: - 표시된대로 이 아이템을 제작하십시오 - 냉동고 (Freezer) 를 사용하여 - name: 냉동고 (Freezer) geo_miner: + name: GEO 마이너 (GEO Miner) lore: - 채굴 할 수있는 아이템 - GEO 마이너 (Geo Miner) 를 사용하여 - name: GEO 마이너 (GEO Miner) nuclear_reactor: + name: 원자로 (Nuclear Reactor) lore: - 이 아이템은 부산물입니다 - 원자로 (Nuclear Reactor) 운영 - name: 원자로 (Nuclear Reactor) oil_pump: name: 오일 펌프 (Oil Pump) lore: - 이 아이템은 수집 가능합니다. - 오일 펌프 (Oil Pump) 를 사용하여 pickaxe_of_containment: - name: 억제의 곡괭이 + name: 억제의 곡괭이 (Pickaxe of Containment) lore: - 이 블록을 얻을 수 있습니다 - 를 통해 스포너를 채굴하여 @@ -118,19 +118,24 @@ slimefun: lore: - 표시된대로이 아이템을 제작하십시오 - 정유 공장 (Refinery) 을 사용하여 + barter_drop: + name: 피글린 물물 교환 드롭 + lore: + - 다음을 사용하여 피글린과 물물 교환 + - 이 아이템을 얻기위한 금괴 minecraft: shaped: + name: 유형 조합 조합법 lore: - 표시된대로 이 아이템을 제작하십시오 - 일반 조합대에서 - 모양이 중요합니다. - name: 유형 조합 조합법 shapeless: + name: 무형 조합 조합법 lore: - 표시된대로 이 아이템을 제작하십시오 - 일반 조합대에서 - 이 조합법은 형태가 없습니다. - name: 무형 조합 조합법 furnace: name: 화로 조합법 lore: @@ -156,3 +161,8 @@ minecraft: lore: - 표시된대로이 아이템을 제작하십시오 - 석제 절단기를 사용하여 + smithing: + name: 스미팅 테이블 레시피 + lore: + - 표시된대로 이 아이템을 제작하십시오 + - 스미팅 테이블 사용 diff --git a/src/main/resources/languages/recipes_zh-TW.yml b/src/main/resources/languages/recipes_zh-TW.yml index 52f547443..22108a6c6 100644 --- a/src/main/resources/languages/recipes_zh-TW.yml +++ b/src/main/resources/languages/recipes_zh-TW.yml @@ -122,6 +122,11 @@ slimefun: lore: - 使用煉油廠 - 提煉該物品 + barter_drop: + name: 豬布林交易 + lore: + - 用黃金和豬布林 + - 交易以獲取此物品 minecraft: shaped: name: 有序合成 diff --git a/src/main/resources/languages/researches_zh-TW.yml b/src/main/resources/languages/researches_zh-TW.yml index 209e0dbbf..caf477469 100644 --- a/src/main/resources/languages/researches_zh-TW.yml +++ b/src/main/resources/languages/researches_zh-TW.yml @@ -46,7 +46,7 @@ slimefun: damascus_steel_armor: 大馬士革鋼套裝 reinforced_alloy: 強化合金錠 carbonado: 黑鑽石 - magic_workbench: 魔術合成檯 + magic_workbench: 魔法合成檯 wind_staff: 元素杖—風 reinforced_armor: 強化合金錠套裝 ore_washer: 礦物洗滌機 @@ -93,7 +93,7 @@ slimefun: explosive_tools: 爆炸性的突破 automated_panning_machine: 懶人掏金盤 boots_of_the_stomper: 踐踏之靴 - pickaxe_of_the_seeker: 合法X-ray + pickaxe_of_the_seeker: 合法 X-ray backpacks: 背包 woven_backpack: 手織背包 crucible: 坩鍋 @@ -150,12 +150,12 @@ slimefun: electric_ore_grinding: 電動研磨 heated_pressure_chamber: 高溫加壓室 coal_generator: 乾淨的煤 - bio_reactor: 生化反應爐 + bio_reactor: 生質能反應爐 auto_enchanting: 附魔&退魔檯 auto_anvil: 電動鐵砧 multimeter: 電力測量 - gps_setup: GPS基礎組件 - gps_emergency_transmitter: GPS求救信號 + gps_setup: GPS 基礎組件 + gps_emergency_transmitter: GPS 求救信號 programmable_androids: 機器人 android_interfaces: 機器人接口 geo_scanner: 地質掃描 @@ -166,19 +166,19 @@ slimefun: better_gps_transmitters: 高階GPS信號發送器 elevator: 電梯 energized_solar_generator: 這...這不科學! - energized_gps_transmitter: 頂級GPS信號發送器 + energized_gps_transmitter: 頂級 GPS 信號發送器 energy_regulator: 電力核心 butcher_androids: 屠夫機器人 organic_food: 有機食品 auto_breeder: 幫你餵動物 advanced_android: 進階機器人 - advanced_butcher_android: 進階機器人–屠夫 - advanced_fisherman_android: 進階機器人— 漁夫 + advanced_butcher_android: 進階機器人—屠夫 + advanced_fisherman_android: 進階機器人—漁夫 animal_growth_accelerator: 動物轉大人 xp_collector: 經驗收集器 organic_fertilizer: 有機堆肥 crop_growth_accelerator: 金坷垃 - better_crop_growth_accelerator: 金坷垃2.0 + better_crop_growth_accelerator: 金坷垃 2.0 reactor_essentials: 反應爐必需品 nuclear_reactor: 核分裂反應爐 freezer: 我的超人裝呢 @@ -199,7 +199,7 @@ slimefun: better_electric_furnace: 升級版電磁爐 better_carbon_press: 升級版碳壓縮機 empowered_android: 頂級機器人 - empowered_butcher_android: 頂級機器人-屠夫 + empowered_butcher_android: 頂級機器人—屠夫 empowered_fisherman_android: 頂級機器人—漁夫 high_tier_carbon_press: 終極碳壓縮機 wither_assembler: 凋零農場 @@ -233,10 +233,17 @@ slimefun: makeshift_smeltery: 自動冶煉 tree_growth_accelerator: 自動金坷垃 industrial_miner: 工業化採礦 - advanced_industrial_miner: 工業化採礦 - 改 + advanced_industrial_miner: 工業化採礦—改 magical_zombie_pills: 救贖藥丸 auto_brewer: 工業化釀造 enchantment_rune: 古代附魔 lead_clothing: 防輻射衣 tape_measure: 捲尺 iron_golem_assembler: 鐵巨人召喚機 + climbing_pick: 飛簷走壁 + shulker_shell: 工業界伏殼 + villager_rune: 讓村民失業 + caveman_talisman: 穴居人護符 + even_higher_tier_capacitors: 第三級電容器 + elytra_cap: 體驗動能 + energy_connectors: 電線 diff --git a/src/main/resources/languages/resources_zh-TW.yml b/src/main/resources/languages/resources_zh-TW.yml index dd6739964..299b19382 100644 --- a/src/main/resources/languages/resources_zh-TW.yml +++ b/src/main/resources/languages/resources_zh-TW.yml @@ -14,11 +14,11 @@ resources: slimefunorechunks: iron_ore_chunk: 鐵石塊 gold_ore_chunk: 金石塊 - copper_ore_chunk: 銅礦塊 - tin_ore_chunk: 錫礦塊 + copper_ore_chunk: 銅石塊 + tin_ore_chunk: 錫石塊 silver_ore_chunk: 銀石塊 aluminum_ore_chunk: 鋁石塊 lead_ore_chunk: 鉛石塊 - zinc_ore_chunk: 鋅礦塊 - nickel_ore_chunk: 鎳礦塊 + zinc_ore_chunk: 鋅石塊 + nickel_ore_chunk: 鎳石塊 cobalt_ore_chunk: 鈷石塊 diff --git a/src/main/resources/tags/smelters_pickaxe_blocks.json b/src/main/resources/tags/smelters_pickaxe_blocks.json index 79444a5aa..da26b5634 100644 --- a/src/main/resources/tags/smelters_pickaxe_blocks.json +++ b/src/main/resources/tags/smelters_pickaxe_blocks.json @@ -5,6 +5,10 @@ "required" : false }, "minecraft:gold_ore", - "minecraft:iron_ore" + "minecraft:iron_ore", + { + "id" : "minecraft:ancient_debris", + "required" : false + } ] }