> function, @Nonnull Runnable runnable) {
try {
runnable.run();
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/MinecraftVersion.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/MinecraftVersion.java
index 73c3f855e..17238d76d 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/MinecraftVersion.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/MinecraftVersion.java
@@ -6,6 +6,7 @@ import org.apache.commons.lang.Validate;
import org.bukkit.Server;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
+import io.papermc.lib.PaperLib;
/**
* This enum holds all versions of Minecraft that we currently support.
@@ -21,19 +22,19 @@ public enum MinecraftVersion {
* This constant represents Minecraft (Java Edition) Version 1.14
* (The "Village & Pillage" Update)
*/
- MINECRAFT_1_14("1.14.x"),
+ MINECRAFT_1_14(14, "1.14.x"),
/**
* This constant represents Minecraft (Java Edition) Version 1.15
* (The "Buzzy Bees" Update)
*/
- MINECRAFT_1_15("1.15.x"),
+ MINECRAFT_1_15(15, "1.15.x"),
/**
* This constant represents Minecraft (Java Edition) Version 1.16
* (The "Nether Update")
*/
- MINECRAFT_1_16("1.16.x"),
+ MINECRAFT_1_16(16, "1.16.x"),
/**
* This constant represents an exceptional state in which we were unable
@@ -51,18 +52,22 @@ public enum MinecraftVersion {
private final String name;
private final boolean virtual;
- private final String prefix;
+ private final int majorVersion;
/**
* This constructs a new {@link MinecraftVersion} with the given name.
* This constructor forces the {@link MinecraftVersion} to be real.
* It must be a real version of Minecraft.
*
+ * @param majorVersion
+ * The major version of minecraft as an {@link Integer}
* @param name
* The display name of this {@link MinecraftVersion}
*/
- MinecraftVersion(@Nonnull String name) {
- this(name, false);
+ MinecraftVersion(int majorVersion, @Nonnull String name) {
+ this.name = name;
+ this.majorVersion = majorVersion;
+ this.virtual = false;
}
/**
@@ -77,8 +82,8 @@ public enum MinecraftVersion {
*/
MinecraftVersion(@Nonnull String name, boolean virtual) {
this.name = name;
+ this.majorVersion = 0;
this.virtual = virtual;
- this.prefix = name().replace("MINECRAFT_", "v") + '_';
}
/**
@@ -105,18 +110,21 @@ public enum MinecraftVersion {
}
/**
- * This method checks whether the given version matches with this
+ * This tests if the given minecraft version number matches with this
* {@link MinecraftVersion}.
+ *
+ * You can obtain the version number by doing {@link PaperLib#getMinecraftVersion()}.
+ * It is equivalent to the "major" version
+ *
+ * Example: {@literal "1.13"} returns {@literal 13}
*
- * @param version
- * The version to compare
+ * @param minecraftVersion
+ * The {@link Integer} version to match
*
- * @return Whether the version matches with this one
+ * @return Whether this {@link MinecraftVersion} matches the specified version id
*/
- public boolean matches(@Nonnull String version) {
- Validate.notNull(version, "The input version must not be null!");
-
- return version.startsWith(prefix);
+ public boolean isMinecraftVersion(int minecraftVersion) {
+ return !isVirtual() && this.majorVersion == minecraftVersion;
}
/**
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/SlimefunAddon.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/SlimefunAddon.java
index 610791493..39a402501 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/SlimefunAddon.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/SlimefunAddon.java
@@ -1,21 +1,15 @@
package io.github.thebusybiscuit.slimefun4.api;
-import java.util.Collection;
-import java.util.Locale;
import java.util.logging.Logger;
-import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.apache.commons.lang.Validate;
-import org.bukkit.NamespacedKey;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.java.JavaPlugin;
-import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
-import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
/**
@@ -106,16 +100,4 @@ public interface SlimefunAddon {
return description.getDepend().contains(dependency) || description.getSoftDepend().contains(dependency);
}
- /**
- * This returns a {@link Collection} holding every {@link Category} that can be directly
- * linked to this {@link SlimefunAddon} based on its {@link NamespacedKey}.
- *
- * @return A {@link Collection} of every {@link Category} from this addon
- */
- @Nonnull
- default Collection getCategories() {
- String namespace = getJavaPlugin().getName().toLowerCase(Locale.ROOT);
- return SlimefunPlugin.getRegistry().getCategories().stream().filter(cat -> cat.getKey().getNamespace().equals(namespace)).collect(Collectors.toList());
- }
-
}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/events/AncientAltarCraftEvent.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/events/AncientAltarCraftEvent.java
index a71bb461b..2e282d966 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/events/AncientAltarCraftEvent.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/events/AncientAltarCraftEvent.java
@@ -34,10 +34,10 @@ public class AncientAltarCraftEvent extends PlayerEvent implements Cancellable {
private boolean cancelled;
/**
- * @param block
- * The altar {@link Block}
* @param output
* The {@link ItemStack} that would be dropped by the ritual
+ * @param block
+ * The altar {@link Block}
* @param player
* The {@link Player} that started the ritual.
*/
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/events/PlayerRightClickEvent.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/events/PlayerRightClickEvent.java
index 4d09ebbed..f292df16e 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/events/PlayerRightClickEvent.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/events/PlayerRightClickEvent.java
@@ -16,7 +16,7 @@ import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
-import io.github.thebusybiscuit.cscorelib2.data.ComputedOptional;
+import io.github.thebusybiscuit.cscorelib2.data.TriStateOptional;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.api.BlockStorage;
@@ -46,8 +46,8 @@ public class PlayerRightClickEvent extends PlayerEvent {
private final EquipmentSlot hand;
private final BlockFace face;
- private ComputedOptional slimefunItem = ComputedOptional.createNew();
- private ComputedOptional slimefunBlock = ComputedOptional.createNew();
+ private TriStateOptional slimefunItem = TriStateOptional.createNew();
+ private TriStateOptional slimefunBlock = TriStateOptional.createNew();
private Result itemResult;
private Result blockResult;
@@ -127,7 +127,7 @@ public class PlayerRightClickEvent extends PlayerEvent {
if (itemStack.isPresent()) {
slimefunItem.compute(SlimefunItem.getByItem(itemStack.get()));
} else {
- slimefunItem = ComputedOptional.empty();
+ slimefunItem = TriStateOptional.empty();
}
}
@@ -140,7 +140,7 @@ public class PlayerRightClickEvent extends PlayerEvent {
if (clickedBlock.isPresent()) {
slimefunBlock.compute(BlockStorage.check(clickedBlock.get()));
} else {
- slimefunBlock = ComputedOptional.empty();
+ slimefunBlock = TriStateOptional.empty();
}
}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/items/settings/EnumSetting.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/items/settings/EnumSetting.java
index d952286af..480c4afb8 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/items/settings/EnumSetting.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/items/settings/EnumSetting.java
@@ -12,6 +12,9 @@ import io.github.thebusybiscuit.slimefun4.api.items.ItemSetting;
* This variation of {@link ItemSetting} allows you to allow {@link Enum} constants to be
* used for {@link ItemSetting} validation.
*
+ * @param
+ * The {@link Enum} type
+ *
* @author TheBusyBiscuit
*
* @see ItemSetting
@@ -41,6 +44,7 @@ public class EnumSetting> extends ItemSetting {
*
* @return An array of allowed {@link Enum} constants
*/
+ @Nonnull
public T[] getAllowedValues() {
return enumClass.getEnumConstants();
}
@@ -50,6 +54,7 @@ public class EnumSetting> extends ItemSetting {
*
* @return The value as an {@link Enum} constant
*/
+ @Nonnull
public T getAsEnumConstant() {
return Enum.valueOf(enumClass, getValue());
}
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 d2ae3524b..c7133aa03 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/SlimefunRegistry.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/SlimefunRegistry.java
@@ -30,7 +30,6 @@ import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideMode;
import io.github.thebusybiscuit.slimefun4.core.multiblocks.MultiBlock;
import io.github.thebusybiscuit.slimefun4.core.researching.Research;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
-
import io.github.thebusybiscuit.slimefun4.implementation.guide.CheatSheetSlimefunGuide;
import io.github.thebusybiscuit.slimefun4.implementation.guide.SurvivalSlimefunGuide;
import me.mrCookieSlime.Slimefun.Objects.Category;
@@ -82,7 +81,7 @@ public final class SlimefunRegistry {
private final Map profiles = new ConcurrentHashMap<>();
private final Map worlds = new ConcurrentHashMap<>();
private final Map chunks = new HashMap<>();
- private final Map layouts = new EnumMap<>(SlimefunGuideMode.class);
+ private final Map guides = new EnumMap<>(SlimefunGuideMode.class);
private final Map> mobDrops = new EnumMap<>(EntityType.class);
private final Map blockMenuPresets = new HashMap<>();
@@ -99,8 +98,8 @@ public final class SlimefunRegistry {
guideKey = new NamespacedKey(plugin, "slimefun_guide_mode");
boolean showVanillaRecipes = cfg.getBoolean("guide.show-vanilla-recipes");
- layouts.put(SlimefunGuideMode.SURVIVAL_MODE, new SurvivalSlimefunGuide(showVanillaRecipes));
- layouts.put(SlimefunGuideMode.CHEAT_MODE, new CheatSheetSlimefunGuide());
+ guides.put(SlimefunGuideMode.SURVIVAL_MODE, new SurvivalSlimefunGuide(showVanillaRecipes));
+ guides.put(SlimefunGuideMode.CHEAT_MODE, new CheatSheetSlimefunGuide());
researchRanks.addAll(cfg.getStringList("research-ranks"));
@@ -141,6 +140,7 @@ public final class SlimefunRegistry {
automaticallyLoadItems = mode;
}
+ @Nonnull
public List getCategories() {
return categories;
}
@@ -150,6 +150,7 @@ public final class SlimefunRegistry {
*
* @return A {@link List} containing every {@link SlimefunItem}
*/
+ @Nonnull
public List getAllSlimefunItems() {
return slimefunItems;
}
@@ -159,18 +160,22 @@ public final class SlimefunRegistry {
*
* @return A {@link List} containing every enabled {@link SlimefunItem}
*/
+ @Nonnull
public List getEnabledSlimefunItems() {
return enabledItems;
}
+ @Nonnull
public List getResearches() {
return researches;
}
+ @Nonnull
public Set getCurrentlyResearchingPlayers() {
return researchingPlayers;
}
+ @Nonnull
public List getResearchRanks() {
return researchRanks;
}
@@ -195,12 +200,31 @@ public final class SlimefunRegistry {
return researchFireworks;
}
+ @Nonnull
public List getMultiBlocks() {
return multiblocks;
}
- public SlimefunGuideImplementation getGuideLayout(SlimefunGuideMode layout) {
- return layouts.get(layout);
+ /**
+ * This returns the corresponding {@link SlimefunGuideImplementation} for a certain
+ * {@link SlimefunGuideMode}.
+ *
+ * @param mode
+ * The {@link SlimefunGuideMode}
+ *
+ * @return The corresponding {@link SlimefunGuideImplementation}
+ */
+ @Nonnull
+ public SlimefunGuideImplementation getSlimefunGuide(@Nonnull SlimefunGuideMode mode) {
+ Validate.notNull(mode, "The Guide mode cannot be null");
+
+ SlimefunGuideImplementation guide = guides.get(mode);
+
+ if (guide == null) {
+ throw new IllegalStateException("Slimefun Guide '" + mode + "' has no registered implementation.");
+ }
+
+ return guide;
}
/**
@@ -209,6 +233,7 @@ public final class SlimefunRegistry {
*
* @return The {@link Map} of custom mob drops
*/
+ @Nonnull
public Map> getMobDrops() {
return mobDrops;
}
@@ -219,50 +244,62 @@ public final class SlimefunRegistry {
*
* @return A {@link Set} of bartering drops
*/
+ @Nonnull
public Set getBarteringDrops() {
return barterDrops;
}
+ @Nonnull
public Set getRadioactiveItems() {
return radioactive;
}
+ @Nonnull
public Set getTickerBlocks() {
return tickers;
}
+ @Nonnull
public Map getSlimefunItemIds() {
return slimefunIds;
}
+ @Nonnull
public Map getMenuPresets() {
return blockMenuPresets;
}
+ @Nonnull
public Map getUniversalInventories() {
return universalInventories;
}
+ @Nonnull
public Map getPlayerProfiles() {
return profiles;
}
+ @Nonnull
public Map, Set> getPublicItemHandlers() {
return globalItemHandlers;
}
+ @Nonnull
public Map getBlockHandlers() {
return blockHandlers;
}
+ @Nonnull
public Map getWorlds() {
return worlds;
}
+ @Nonnull
public Map getChunks() {
return chunks;
}
+ @Nonnull
public KeyMap getGEOResources() {
return geoResources;
}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/NotHopperable.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/NotHopperable.java
new file mode 100644
index 000000000..5e284e569
--- /dev/null
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/attributes/NotHopperable.java
@@ -0,0 +1,14 @@
+package io.github.thebusybiscuit.slimefun4.core.attributes;
+
+import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer;
+
+/**
+ * Implement this interface for any {@link AContainer} to prevent
+ * that {@link AContainer} from being hopperable.
+ *
+ * @author CURVX
+ *
+ */
+public interface NotHopperable extends ItemAttribute {
+
+}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/categories/FlexCategory.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/categories/FlexCategory.java
index 896a23730..2d7d2994d 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/categories/FlexCategory.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/categories/FlexCategory.java
@@ -68,7 +68,7 @@ public abstract class FlexCategory extends Category {
@Override
public final boolean isHidden(@Nonnull Player p) {
- /**
+ /*
* We can stop this method right here.
* We provide a custom method with more parameters for this.
* See isVisible(...)
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/categories/LockedCategory.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/categories/LockedCategory.java
index e47732c79..7056eadcf 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/categories/LockedCategory.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/categories/LockedCategory.java
@@ -149,12 +149,13 @@ public class LockedCategory extends Category {
* The {@link Player} to check
* @param profile
* The {@link PlayerProfile} that belongs to the given {@link Player}
+ *
* @return Whether the {@link Player} has fully completed all parent categories, otherwise false
*/
public boolean hasUnlocked(@Nonnull Player p, @Nonnull PlayerProfile profile) {
for (Category category : parents) {
for (SlimefunItem item : category.getItems()) {
- /**
+ /*
* Should probably be replaced with Slimefun.hasUnlocked(...)
* However this will result in better performance because we don't
* request the PlayerProfile everytime
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/GuideCommand.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/GuideCommand.java
index b25c96063..c0f6a1949 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/GuideCommand.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/GuideCommand.java
@@ -19,7 +19,7 @@ class GuideCommand extends SubCommand {
public void onExecute(CommandSender sender, String[] args) {
if (sender instanceof Player) {
if (sender.hasPermission("slimefun.command.guide")) {
- SlimefunGuideMode design = SlimefunGuide.getDefaultLayout();
+ SlimefunGuideMode design = SlimefunGuide.getDefaultMode();
((Player) sender).getInventory().addItem(SlimefunGuide.getItem(design).clone());
} else {
SlimefunPlugin.getLocalization().sendMessage(sender, "messages.no-permission", true);
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/SearchCommand.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/SearchCommand.java
index af311645f..c52927221 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/SearchCommand.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/SearchCommand.java
@@ -9,6 +9,7 @@ import io.github.thebusybiscuit.slimefun4.api.player.PlayerProfile;
import io.github.thebusybiscuit.slimefun4.core.commands.SlimefunCommand;
import io.github.thebusybiscuit.slimefun4.core.commands.SubCommand;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuide;
+import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideMode;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
class SearchCommand extends SubCommand {
@@ -23,7 +24,7 @@ class SearchCommand extends SubCommand {
if (sender.hasPermission("slimefun.command.search")) {
if (args.length > 1) {
String query = String.join(" ", Arrays.copyOfRange(args, 1, args.length));
- PlayerProfile.get((Player) sender, profile -> SlimefunGuide.openSearch(profile, query, true, true));
+ PlayerProfile.get((Player) sender, profile -> SlimefunGuide.openSearch(profile, query, SlimefunGuideMode.SURVIVAL_MODE, true));
} else {
SlimefunPlugin.getLocalization().sendMessage(sender, "messages.usage", true, msg -> msg.replace("%usage%", "/sf search "));
}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/SlimefunGuide.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/SlimefunGuide.java
index 662320f53..779f634d1 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/SlimefunGuide.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/SlimefunGuide.java
@@ -6,6 +6,7 @@ import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
+import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
@@ -14,6 +15,7 @@ import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import io.github.thebusybiscuit.slimefun4.implementation.guide.SurvivalSlimefunGuide;
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
+import io.github.thebusybiscuit.slimefun4.utils.itemstack.SlimefunGuideItem;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
@@ -33,7 +35,7 @@ public final class SlimefunGuide {
@Nonnull
public static ItemStack getItem(@Nonnull SlimefunGuideMode design) {
- return SlimefunPlugin.getRegistry().getGuideLayout(design).getItem();
+ return SlimefunPlugin.getRegistry().getSlimefunGuide(design).getItem();
}
public static void openCheatMenu(@Nonnull Player p) {
@@ -52,7 +54,7 @@ public final class SlimefunGuide {
}
}
- public static void openGuide(@Nonnull Player p, @Nonnull SlimefunGuideMode layout) {
+ public static void openGuide(@Nonnull Player p, @Nonnull SlimefunGuideMode mode) {
if (!SlimefunPlugin.getWorldSettingsService().isWorldEnabled(p.getWorld())) {
return;
}
@@ -61,67 +63,72 @@ public final class SlimefunGuide {
if (optional.isPresent()) {
PlayerProfile profile = optional.get();
- SlimefunGuideImplementation guide = SlimefunPlugin.getRegistry().getGuideLayout(layout);
+ SlimefunGuideImplementation guide = SlimefunPlugin.getRegistry().getSlimefunGuide(mode);
profile.getGuideHistory().openLastEntry(guide);
} else {
- openMainMenuAsync(p, layout, 1);
+ openMainMenuAsync(p, mode, 1);
}
}
@ParametersAreNonnullByDefault
- private static void openMainMenuAsync(Player player, SlimefunGuideMode layout, int selectedPage) {
- if (!PlayerProfile.get(player, profile -> SlimefunPlugin.runSync(() -> openMainMenu(profile, layout, selectedPage)))) {
+ private static void openMainMenuAsync(Player player, SlimefunGuideMode mode, int selectedPage) {
+ if (!PlayerProfile.get(player, profile -> SlimefunPlugin.runSync(() -> openMainMenu(profile, mode, selectedPage)))) {
SlimefunPlugin.getLocalization().sendMessage(player, "messages.opening-guide");
}
}
@ParametersAreNonnullByDefault
- public static void openMainMenu(PlayerProfile profile, SlimefunGuideMode layout, int selectedPage) {
- SlimefunPlugin.getRegistry().getGuideLayout(layout).openMainMenu(profile, selectedPage);
+ public static void openMainMenu(PlayerProfile profile, SlimefunGuideMode mode, int selectedPage) {
+ SlimefunPlugin.getRegistry().getSlimefunGuide(mode).openMainMenu(profile, selectedPage);
}
@ParametersAreNonnullByDefault
- public static void openCategory(PlayerProfile profile, Category category, SlimefunGuideMode layout, int selectedPage) {
- SlimefunPlugin.getRegistry().getGuideLayout(layout).openCategory(profile, category, selectedPage);
+ public static void openCategory(PlayerProfile profile, Category category, SlimefunGuideMode mode, int selectedPage) {
+ SlimefunPlugin.getRegistry().getSlimefunGuide(mode).openCategory(profile, category, selectedPage);
}
@ParametersAreNonnullByDefault
- public static void openSearch(PlayerProfile profile, String input, boolean survival, boolean addToHistory) {
- SlimefunGuideImplementation layout = SlimefunPlugin.getRegistry().getGuideLayout(SlimefunGuideMode.SURVIVAL_MODE);
-
- if (!survival) {
- layout = SlimefunPlugin.getRegistry().getGuideLayout(SlimefunGuideMode.CHEAT_MODE);
- }
-
- layout.openSearch(profile, input, addToHistory);
+ public static void openSearch(PlayerProfile profile, String input, SlimefunGuideMode mode, boolean addToHistory) {
+ SlimefunGuideImplementation guide = SlimefunPlugin.getRegistry().getSlimefunGuide(mode);
+ guide.openSearch(profile, input, addToHistory);
}
@ParametersAreNonnullByDefault
public static void displayItem(PlayerProfile profile, ItemStack item, boolean addToHistory) {
- SlimefunPlugin.getRegistry().getGuideLayout(SlimefunGuideMode.SURVIVAL_MODE).displayItem(profile, item, 0, addToHistory);
+ SlimefunPlugin.getRegistry().getSlimefunGuide(SlimefunGuideMode.SURVIVAL_MODE).displayItem(profile, item, 0, addToHistory);
}
@ParametersAreNonnullByDefault
public static void displayItem(PlayerProfile profile, SlimefunItem item, boolean addToHistory) {
- SlimefunPlugin.getRegistry().getGuideLayout(SlimefunGuideMode.SURVIVAL_MODE).displayItem(profile, item, addToHistory);
+ SlimefunPlugin.getRegistry().getSlimefunGuide(SlimefunGuideMode.SURVIVAL_MODE).displayItem(profile, item, addToHistory);
}
+ /**
+ * This method checks if a given {@link ItemStack} is a {@link SlimefunGuide}.
+ *
+ * @param item
+ * The {@link ItemStack} to check
+ *
+ * @return Whether this {@link ItemStack} represents a {@link SlimefunGuide}
+ */
public static boolean isGuideItem(@Nullable ItemStack item) {
- if (item == null) {
+ if (item == null || item.getType() != Material.ENCHANTED_BOOK) {
return false;
+ } else if (item instanceof SlimefunGuideItem) {
+ return true;
} else {
return SlimefunUtils.isItemSimilar(item, getItem(SlimefunGuideMode.SURVIVAL_MODE), true) || SlimefunUtils.isItemSimilar(item, getItem(SlimefunGuideMode.CHEAT_MODE), true);
}
}
/**
- * Get the default layout for the Slimefun guide.
+ * Get the default mode for the Slimefun guide.
* Currently this is only {@link SlimefunGuideMode#SURVIVAL_MODE}.
*
- * @return The default {@link SlimefunGuideLayout}.
+ * @return The default {@link SlimefunGuideMode}.
*/
@Nonnull
- public static SlimefunGuideMode getDefaultLayout() {
+ public static SlimefunGuideMode getDefaultMode() {
return SlimefunGuideMode.SURVIVAL_MODE;
}
}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/Contributor.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/Contributor.java
index 47fe8ac88..130198a82 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/Contributor.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/Contributor.java
@@ -15,7 +15,7 @@ import javax.annotation.Nullable;
import org.apache.commons.lang.Validate;
import org.bukkit.ChatColor;
-import io.github.thebusybiscuit.cscorelib2.data.ComputedOptional;
+import io.github.thebusybiscuit.cscorelib2.data.TriStateOptional;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import io.github.thebusybiscuit.slimefun4.utils.HeadTexture;
@@ -35,7 +35,7 @@ public class Contributor {
private final String profileLink;
private final ConcurrentMap contributions = new ConcurrentHashMap<>();
- private final ComputedOptional headTexture = ComputedOptional.createNew();
+ private final TriStateOptional headTexture = TriStateOptional.createNew();
private Optional uuid = Optional.empty();
private boolean immutable = false;
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubTask.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubTask.java
index 84b725496..cfc214538 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubTask.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubTask.java
@@ -14,7 +14,7 @@ import javax.annotation.Nullable;
import org.bukkit.Bukkit;
import io.github.thebusybiscuit.cscorelib2.players.MinecraftAccount;
-import io.github.thebusybiscuit.cscorelib2.players.MinecraftAccount.TooManyRequestsException;
+import io.github.thebusybiscuit.cscorelib2.players.TooManyRequestsException;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
/**
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/SlimefunPlugin.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/SlimefunPlugin.java
index 92d30ab5f..6e3369de9 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/SlimefunPlugin.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/SlimefunPlugin.java
@@ -21,6 +21,7 @@ import org.bukkit.Server;
import org.bukkit.command.Command;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
+import org.bukkit.inventory.Recipe;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.java.JavaPlugin;
@@ -29,7 +30,6 @@ import org.bukkit.scheduler.BukkitTask;
import io.github.thebusybiscuit.cscorelib2.config.Config;
import io.github.thebusybiscuit.cscorelib2.protection.ProtectionManager;
-import io.github.thebusybiscuit.cscorelib2.reflection.ReflectionUtils;
import io.github.thebusybiscuit.slimefun4.api.MinecraftVersion;
import io.github.thebusybiscuit.slimefun4.api.SlimefunAddon;
import io.github.thebusybiscuit.slimefun4.api.exceptions.TagMisconfigurationException;
@@ -75,6 +75,7 @@ import io.github.thebusybiscuit.slimefun4.implementation.listeners.EnhancedFurna
import io.github.thebusybiscuit.slimefun4.implementation.listeners.ExplosionsListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.GadgetsListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.GrapplingHookListener;
+import io.github.thebusybiscuit.slimefun4.implementation.listeners.HopperListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.ItemDropListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.ItemPickupListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.MultiBlockListener;
@@ -502,13 +503,13 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon {
}
// Now check the actual Version of Minecraft
- String currentVersion = ReflectionUtils.getVersion();
+ int version = PaperLib.getMinecraftVersion();
- if (currentVersion.startsWith("v")) {
+ if (version > 0) {
// Check all supported versions of Minecraft
- for (MinecraftVersion version : MinecraftVersion.valuesCache) {
- if (version.matches(currentVersion)) {
- minecraftVersion = version;
+ for (MinecraftVersion supportedVersion : MinecraftVersion.valuesCache) {
+ if (supportedVersion.isMinecraftVersion(version)) {
+ minecraftVersion = supportedVersion;
return false;
}
}
@@ -518,22 +519,22 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon {
getLogger().log(Level.SEVERE, "### Slimefun was not installed correctly!");
getLogger().log(Level.SEVERE, "### You are using the wrong version of Minecraft!");
getLogger().log(Level.SEVERE, "###");
- getLogger().log(Level.SEVERE, "### You are using Minecraft {0}", currentVersion);
+ getLogger().log(Level.SEVERE, "### You are using Minecraft 1.{0}.x", version);
getLogger().log(Level.SEVERE, "### but Slimefun {0} requires you to be using", getDescription().getVersion());
getLogger().log(Level.SEVERE, "### Minecraft {0}", String.join(" / ", getSupportedVersions()));
getLogger().log(Level.SEVERE, "#############################################");
return true;
+ } else {
+ getLogger().log(Level.WARNING, "We could not determine the version of Minecraft you were using? ({0})", Bukkit.getVersion());
+
+ /*
+ * If we are unsure about it, we will assume "supported".
+ * They could be using a non-Bukkit based Software which still
+ * might support Bukkit-based plugins.
+ * Use at your own risk in this case.
+ */
+ return false;
}
-
- getLogger().log(Level.WARNING, "We could not determine the version of Minecraft you were using ({0})", currentVersion);
-
- /*
- * If we are unsure about it, we will assume "supported".
- * They could be using a non-Bukkit based Software which still
- * might support Bukkit-based plugins.
- * Use at your own risk in this case.
- */
- return false;
} catch (Exception | LinkageError x) {
getLogger().log(Level.SEVERE, x, () -> "Error: Could not determine Environment or version of Minecraft for Slimefun v" + getDescription().getVersion());
@@ -625,6 +626,7 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon {
new CartographyTableListener(this);
new ButcherAndroidListener(this);
new NetworkListener(this, networkManager);
+ new HopperListener(this);
// Bees were added in 1.15
if (minecraftVersion.isAtLeast(MinecraftVersion.MINECRAFT_1_15)) {
@@ -792,6 +794,13 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon {
return instance.local;
}
+ /**
+ * This method returns out {@link MinecraftRecipeService} for Slimefun.
+ * This service is responsible for finding/identifying {@link Recipe Recipes}
+ * from vanilla Minecraft.
+ *
+ * @return Slimefun's {@link MinecraftRecipeService} instance
+ */
@Nonnull
public static MinecraftRecipeService getMinecraftRecipeService() {
validateInstance();
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/guide/SurvivalSlimefunGuide.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/guide/SurvivalSlimefunGuide.java
index 760fee545..2f8964939 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/guide/SurvivalSlimefunGuide.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/guide/SurvivalSlimefunGuide.java
@@ -570,7 +570,7 @@ public class SurvivalSlimefunGuide implements SlimefunGuideImplementation {
pl.closeInventory();
SlimefunPlugin.getLocalization().sendMessage(pl, "guide.search.message");
- ChatInput.waitForPlayer(SlimefunPlugin.instance(), pl, msg -> SlimefunGuide.openSearch(profile, msg, isSurvivalMode(), isSurvivalMode()));
+ ChatInput.waitForPlayer(SlimefunPlugin.instance(), pl, msg -> SlimefunGuide.openSearch(profile, msg, getMode(), isSurvivalMode()));
return false;
});
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 cd1bfd2bb..c44b3b358 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
@@ -843,6 +843,7 @@ public class ProgrammableAndroid extends SlimefunItem implements InventoryBlock,
}
}
+ @ParametersAreNonnullByDefault
protected void move(Block b, BlockFace face, Block block) {
if (block.getY() > 0 && block.getY() < block.getWorld().getMaxHeight() && block.isEmpty()) {
BlockData blockData = Material.PLAYER_HEAD.createBlockData(data -> {
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/armor/StomperBoots.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/armor/StomperBoots.java
index da217cf57..3888d6506 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/armor/StomperBoots.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/armor/StomperBoots.java
@@ -105,7 +105,6 @@ public class StomperBoots extends SlimefunItem {
* @return If the entity can move.
*/
protected boolean canPush(@Nonnull Player player, @Nonnull LivingEntity entity) {
- return entity.isValid() && !entity.getUniqueId().equals(player.getUniqueId())
- && entity.isCollidable() && entity.hasGravity();
+ return entity.isValid() && !entity.getUniqueId().equals(player.getUniqueId()) && entity.isCollidable() && entity.hasGravity();
}
}
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 cba3f71cf..eae1b162b 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
@@ -52,8 +52,7 @@ public class MultiTool extends SlimefunItem implements Rechargeable {
if (index >= modes.size()) {
index = 0;
}
- }
- while (index != i && !modes.get(index).isEnabled());
+ } while (index != i && !modes.get(index).isEnabled());
return index;
}
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 627fe50a9..9dcb2db78 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
@@ -12,12 +12,13 @@ import org.bukkit.potion.PotionData;
import org.bukkit.potion.PotionType;
import io.github.thebusybiscuit.cscorelib2.inventory.InvUtils;
+import io.github.thebusybiscuit.slimefun4.core.attributes.NotHopperable;
+import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
+import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.MachineRecipe;
-import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
-import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
/**
*
@@ -26,7 +27,7 @@ import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
* @author Linox
*
*/
-public class AutoBrewer extends AContainer {
+public class AutoBrewer extends AContainer implements NotHopperable {
private static final Map potionRecipes = new EnumMap<>(Material.class);
private static final Map fermentations = new EnumMap<>(PotionType.class);
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/AutoDrier.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/AutoDrier.java
index 9273af6b4..cea222eae 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/AutoDrier.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/AutoDrier.java
@@ -7,6 +7,7 @@ import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.inventory.ItemStack;
+import io.github.thebusybiscuit.slimefun4.core.attributes.NotHopperable;
import io.github.thebusybiscuit.slimefun4.core.attributes.RecipeDisplayItem;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
@@ -22,7 +23,7 @@ import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
* @author Linox
*
*/
-public class AutoDrier extends AContainer implements RecipeDisplayItem {
+public class AutoDrier extends AContainer implements RecipeDisplayItem, NotHopperable {
private List recipeList;
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricFurnace.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricFurnace.java
index 8d70af663..ba2071cf6 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricFurnace.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricFurnace.java
@@ -7,12 +7,13 @@ import org.bukkit.inventory.RecipeChoice;
import org.bukkit.inventory.RecipeChoice.MaterialChoice;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
+import io.github.thebusybiscuit.slimefun4.core.attributes.NotHopperable;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
-import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer;
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
+import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer;
-public class ElectricFurnace extends AContainer {
+public class ElectricFurnace extends AContainer implements NotHopperable {
public ElectricFurnace(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, recipeType, recipe);
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricIngotPulverizer.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricIngotPulverizer.java
index 1fe511565..1b9e51673 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricIngotPulverizer.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricIngotPulverizer.java
@@ -6,6 +6,7 @@ import java.util.List;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
+import io.github.thebusybiscuit.slimefun4.core.attributes.NotHopperable;
import io.github.thebusybiscuit.slimefun4.core.attributes.RecipeDisplayItem;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
@@ -23,7 +24,7 @@ import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
* @see ElectricIngotFactory
*
*/
-public class ElectricIngotPulverizer extends AContainer implements RecipeDisplayItem {
+public class ElectricIngotPulverizer extends AContainer implements RecipeDisplayItem, NotHopperable {
public ElectricIngotPulverizer(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, recipeType, recipe);
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricOreGrinder.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricOreGrinder.java
index 50187ea92..2a8675258 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricOreGrinder.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricOreGrinder.java
@@ -3,13 +3,14 @@ package io.github.thebusybiscuit.slimefun4.implementation.items.electric.machine
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
+import io.github.thebusybiscuit.slimefun4.core.attributes.NotHopperable;
import io.github.thebusybiscuit.slimefun4.core.attributes.RecipeDisplayItem;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
-import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer;
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
+import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer;
-public class ElectricOreGrinder extends AContainer implements RecipeDisplayItem {
+public class ElectricOreGrinder extends AContainer implements RecipeDisplayItem, NotHopperable {
public ElectricOreGrinder(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, recipeType, recipe);
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricSmeltery.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricSmeltery.java
index 0768c6621..a0ce3cd4d 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricSmeltery.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricSmeltery.java
@@ -13,6 +13,7 @@ import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction;
+import io.github.thebusybiscuit.slimefun4.core.attributes.NotHopperable;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import io.github.thebusybiscuit.slimefun4.implementation.items.multiblocks.Smeltery;
import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils;
@@ -21,13 +22,13 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu.AdvancedMenu
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ClickAction;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
-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.inventory.BlockMenu;
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset;
import me.mrCookieSlime.Slimefun.api.inventory.DirtyChestMenu;
import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow;
+import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer;
/**
* The {@link ElectricSmeltery} is an electric version of the standard {@link Smeltery}.
@@ -35,7 +36,7 @@ import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow;
* @author TheBusyBiscuit
*
*/
-public class ElectricSmeltery extends AContainer {
+public class ElectricSmeltery extends AContainer implements NotHopperable {
private static final int[] border = { 4, 5, 6, 7, 8, 13, 31, 40, 41, 42, 43, 44 };
private static final int[] inputBorder = { 0, 1, 2, 3, 9, 12, 18, 21, 27, 30, 36, 37, 38, 39 };
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/BlockListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/BlockListener.java
index 4b401f1bc..b14d02d8e 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/BlockListener.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/BlockListener.java
@@ -67,12 +67,13 @@ public class BlockListener implements Listener {
SlimefunItem sfItem = BlockStorage.check(block);
if (sfItem != null) {
- /* Temp fix for #2636
- for (ItemStack item : sfItem.getDrops()) {
- if (item != null && !item.getType().isAir()) {
- block.getWorld().dropItemNaturally(block.getLocation(), item);
- }
- }
+ /*
+ * Temp fix for #2636
+ * for (ItemStack item : sfItem.getDrops()) {
+ * if (item != null && !item.getType().isAir()) {
+ * block.getWorld().dropItemNaturally(block.getLocation(), item);
+ * }
+ * }
*/
BlockStorage.clearBlockInfo(block);
}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/HopperListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/HopperListener.java
new file mode 100644
index 000000000..94c07556e
--- /dev/null
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/HopperListener.java
@@ -0,0 +1,38 @@
+package io.github.thebusybiscuit.slimefun4.implementation.listeners;
+
+import javax.annotation.Nonnull;
+
+import org.bukkit.Location;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.inventory.InventoryMoveItemEvent;
+import org.bukkit.event.inventory.InventoryType;
+
+import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
+import io.github.thebusybiscuit.slimefun4.core.attributes.NotHopperable;
+import me.mrCookieSlime.Slimefun.api.BlockStorage;
+import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer;
+
+/**
+ * This {@link Listener} prevents item from being transferred to
+ * and from {@link AContainer} using a hopper.
+ *
+ * @author CURVX
+ *
+ * @see NotHopperable
+ *
+ */
+public class HopperListener implements Listener {
+
+ public HopperListener(@Nonnull SlimefunPlugin plugin) {
+ plugin.getServer().getPluginManager().registerEvents(this, plugin);
+ }
+
+ @EventHandler
+ public void onHopperInsert(InventoryMoveItemEvent e) {
+ Location loc = e.getDestination().getLocation();
+ if (e.getSource().getType() == InventoryType.HOPPER && loc != null && BlockStorage.check(loc.getBlock()) instanceof NotHopperable) {
+ e.setCancelled(true);
+ }
+ }
+}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/SlimefunGuideListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/SlimefunGuideListener.java
index 79c319c3b..97a64076f 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/SlimefunGuideListener.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/SlimefunGuideListener.java
@@ -38,7 +38,7 @@ public class SlimefunGuideListener implements Listener {
return;
}
- SlimefunGuideMode type = SlimefunGuide.getDefaultLayout();
+ SlimefunGuideMode type = SlimefunGuide.getDefaultMode();
p.getInventory().addItem(SlimefunGuide.getItem(type).clone());
}
}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/utils/HeadTexture.java b/src/main/java/io/github/thebusybiscuit/slimefun4/utils/HeadTexture.java
index ce1b5b7c7..4c041af0f 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/utils/HeadTexture.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/utils/HeadTexture.java
@@ -114,8 +114,6 @@ public enum HeadTexture {
PIGLIN_HEAD("2882af1294a74023e6919a31d1a027310f2e142afb4667d230d155e7f21dbb41"),
NECROTIC_SKULL("7953b6c68448e7e6b6bf8fb273d7203acd8e1be19e81481ead51f45de59a8");
- public static final HeadTexture[] valuesCache = values();
-
private final String texture;
private final UUID uuid;
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/utils/tags/SlimefunTag.java b/src/main/java/io/github/thebusybiscuit/slimefun4/utils/tags/SlimefunTag.java
index 1a7869875..855485681 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/utils/tags/SlimefunTag.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/utils/tags/SlimefunTag.java
@@ -62,7 +62,7 @@ public enum SlimefunTag implements Tag {
* All command block variants
*/
COMMAND_BLOCKS,
-
+
/**
* All variants of Spawn Eggs
*/
diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/Category.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/Category.java
index 7f174deea..cf95721f3 100644
--- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/Category.java
+++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/Category.java
@@ -110,17 +110,6 @@ public class Category implements Keyed {
Collections.sort(SlimefunPlugin.getRegistry().getCategories(), Comparator.comparingInt(Category::getTier));
}
- /**
- * Old way of registering categories, do not call this manually.
- *
- * @deprecated Please use {@link #register(SlimefunAddon)} instead.
- */
- @Deprecated
- public void register() {
- SlimefunPlugin.getRegistry().getCategories().add(this);
- Collections.sort(SlimefunPlugin.getRegistry().getCategories(), Comparator.comparingInt(Category::getTier));
- }
-
/**
* This returns the {@link SlimefunAddon} which has registered this {@link Category}.
* Or null if it has not been registered yet.
@@ -279,7 +268,7 @@ public class Category implements Keyed {
/**
* This method returns whether this {@link Category} has been registered yet.
- * More specifically: Whether {@link #register()} was called or not.
+ * More specifically: Whether {@link #register(SlimefunAddon)} was called or not.
*
* @return Whether this {@link Category} has been registered
*/
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 f1bfe75e5..6c82dd51a 100644
--- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java
+++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java
@@ -12,6 +12,7 @@ import java.util.logging.Logger;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
import org.apache.commons.lang.Validate;
import org.bukkit.Material;
@@ -130,6 +131,7 @@ public class SlimefunItem implements Placeable {
* @param recipe
* An Array representing the recipe of this {@link SlimefunItem}
*/
+ @ParametersAreNonnullByDefault
public SlimefunItem(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
this(category, item, recipeType, recipe, null);
}
@@ -148,6 +150,7 @@ public class SlimefunItem implements Placeable {
* @param recipeOutput
* The result of crafting this item
*/
+ @ParametersAreNonnullByDefault
public SlimefunItem(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) {
Validate.notNull(category, "'category' is not allowed to be null!");
Validate.notNull(item, "'item' is not allowed to be null!");
@@ -162,6 +165,7 @@ public class SlimefunItem implements Placeable {
}
// Previously deprecated constructor, now only for internal purposes
+ @ParametersAreNonnullByDefault
protected SlimefunItem(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) {
Validate.notNull(category, "'category' is not allowed to be null!");
Validate.notNull(item, "'item' is not allowed to be null!");
@@ -371,7 +375,7 @@ public class SlimefunItem implements Placeable {
* @return The {@link SlimefunAddon} that registered this {@link SlimefunItem}
*/
@Nonnull
- public SlimefunAddon getAddon() {
+ public final SlimefunAddon getAddon() {
if (addon == null) {
throw new UnregisteredItemException(this);
}
@@ -482,6 +486,16 @@ public class SlimefunItem implements Placeable {
// Send out deprecation warnings for any classes or interfaces
checkForDeprecations(getClass());
+ // Check for an illegal stack size
+ if (itemStackTemplate.getAmount() != 1) {
+ // @formatter:off
+ warn("This item has an illegal stack size: " + itemStackTemplate.getAmount()
+ + "An Item size of 1 is recommended. Please inform the autho of " + addon.getName()
+ + " to fix this. Crafting Results with amounts of higher should be handled"
+ + " via the recipeOutput parameter!");
+ // @formatter:on
+ }
+
// Add it to the list of enabled items
SlimefunPlugin.getRegistry().getEnabledSlimefunItems().add(this);
@@ -501,13 +515,17 @@ public class SlimefunItem implements Placeable {
if (exception.isPresent()) {
throw exception.get();
} else {
- // Make developers or at least Server admins aware that
- // an Item is using a deprecated ItemHandler
+ /*
+ * Make developers or at least Server admins aware that an Item
+ * is using a deprecated ItemHandler
+ */
checkForDeprecations(handler.getClass());
}
- // If this ItemHandler is "public" (not bound to this SlimefunItem),
- // we add it to the list of public Item handlers
+ /*
+ * If this ItemHandler is "public" (not bound to this SlimefunItem),
+ * we add it to the list of public Item handlers
+ */
if (!handler.isPrivate()) {
Set handlerset = getPublicItemHandlers(handler.getIdentifier());
handlerset.add(handler);
@@ -563,15 +581,19 @@ public class SlimefunItem implements Placeable {
*/
private void checkForDeprecations(@Nullable Class> c) {
if (SlimefunPlugin.getUpdater().getBranch() == SlimefunBranch.DEVELOPMENT) {
- // This method is currently way too spammy with all the restructuring going on...
- // Since DEV builds are anyway under "development", things may be relocated.
- // So we fire these only for stable versions, since devs should update then, so
- // it's the perfect moment to tell them to act.
+ /*
+ * This method is currently way too spammy with all the restructuring going on...
+ * Since DEV builds are anyway under "development", things may be relocated.
+ * So we fire these only for stable versions, since devs should update then, so
+ * it's the perfect moment to tell them to act.
+ */
return;
}
- // We do not wanna throw an Exception here since this could also mean that
- // we have reached the end of the Class hierarchy
+ /*
+ * We do not wanna throw an Exception here since this could also mean that.
+ * We have reached the end of the Class hierarchy
+ */
if (c != null) {
// Check if this Class is deprecated
if (c.isAnnotationPresent(Deprecated.class)) {
diff --git a/src/main/resources/languages/messages_zh-CN.yml b/src/main/resources/languages/messages_zh-CN.yml
index d49cafb64..2421eab20 100644
--- a/src/main/resources/languages/messages_zh-CN.yml
+++ b/src/main/resources/languages/messages_zh-CN.yml
@@ -1,12 +1,11 @@
---
commands:
- help: 展示此帮助页面
- cheat: 使用作弊模式获取 Slimefun 的物品
- give: 给某人 Slimefun 物品
- guide: 给你自己一本 Slimefun 指南
- timings: 查看关于 Slimefun 的耗能信息
- teleporter: 查看其他玩家的公开传送点
- versions: 列出已安装的扩展插件
+ help: 显示此帮助
+ cheat: 直接拿取 Slimefun 物品
+ give: 给予玩家 Slimefun 物品
+ guide: 获取一本 Slimefun 指南书
+ teleporter: 查看其他玩家的公共传送点
+ versions: 显示 Slimefun 运行环境
search: 搜索 Slimefun 物品
open_guide: 使用命令打开 Slimefun 指南
stats: 查看玩家的统计数据
@@ -24,9 +23,14 @@ commands:
description: 为你手持的物品充电
charge-success: 充电完成!
not-rechargeable: 这个物品不能充电!
+ timings:
+ description: Slimefun 及其附属插件的性能报告
+ please-wait: "&e请稍等一会...结果马上就来!"
+ verbose-player: "&4该标记不能对玩家使用!"
+ unknown-flag: "&4未知标记: &c%flag%"
guide:
search:
- message: "&b你想要搜索什么?"
+ message: "&b今天要搜些什么?"
name: "&7搜索..."
tooltip: "&b单击搜索物品"
inventory: '正在搜索: %item%'
@@ -34,28 +38,28 @@ guide:
- "&b你想要搜索什么?"
- "&7将要搜索的物品的名字输入在聊天栏上"
cheat:
- no-multiblocks: "&4你不能在作弊模式下直接获得多方块结构的机器, 你必须自己建造!"
+ no-multiblocks: "&4你不能在作弊模式下获得多方块结构的机器, 必须按书中所示建造!"
languages:
- updated: "&a你的语言已设为: &b%lang%"
+ updated: "&a成功修改语言为: &b%lang%"
translations:
name: "&a少了些什么?"
lore: 单击添加你自己的翻译
select: 单击选中此语言
select-default: 单击选中默认语言
selected-language: '目前使用的语言:'
- change: 单击选择新的语言
+ change: 单击选择要更改的语言
description:
- - "&7现在你有了修改 Slimefun"
- - "&7展示给你的文本语言选项了."
- - "&7物品中的文本"
- - "&7还不能够修改."
+ - "&7现在你可以修改 Slimefun"
+ - "&7展示的文本消息的语言了."
+ - "&7注意: 物品中的文本"
+ - "&7暂时无法修改."
title:
main: Slimefun 指南
- settings: 设置 & 关于
- languages: 选择你想要的语言
+ settings: 设置 & 详情
+ languages: 选择你想要更改的语言
credits: Slimefun4 贡献者
wiki: Slimefun4 维基
- addons: Slimefun4 扩展
+ addons: Slimefun4 附属插件
bugs: 问题反馈
source: 源代码
versions: 安装的版本
@@ -67,8 +71,8 @@ guide:
wiki: "&3Wiki 编辑者"
resourcepack: "&c材质制作者"
translator: "&9翻译者"
- profile-link: 单击访问TA们的 Github 个人主页
- open: 单击查看我们的贡献者
+ profile-link: 单击访问他们的 Github 个人主页
+ open: 单击查看贡献者名单
description:
- "&7Slimefun 是一个开源的项目"
- "&7并且由玩家社区维护."
@@ -84,7 +88,7 @@ guide:
recipes:
machine: 此机器可用的合成配方
miner: 此采矿机可以获得的资源
- generator: 可用的燃料种类
+ generator: 可用的燃料类型
gold-pan: 你可以获得的资源
climbing-pick: 你可以攀爬的平面
back:
@@ -96,14 +100,14 @@ guide:
- 为了解锁这一类别
- 你需要先解锁以下
- 类别里的所有物品
- work-in-progress: 这个功能还没完全做完!
+ work-in-progress: 该功能暂未推出!
messages:
- not-researched: "&4你没有足够的学识来理解它"
+ not-researched: "&4你的知识还不足以理解这个物品"
not-enough-xp: "&4你没有足够的经验来解锁这个研究"
unlocked: '&b成功解锁研究 &7"%research%"'
only-players: "&4这个指令只能在游戏内使用"
unknown-player: "&4未知玩家: &c%player%"
- no-permission: "&4你没有足够的权限做这个"
+ no-permission: "&4你没有足够的权限这么做"
usage: "&4用法: &c%usage%"
not-online: "&4%player% &c不在线"
given-item: '&b你获得了 &a%amount% &7"%item%&7"'
@@ -123,25 +127,25 @@ messages:
angel: "&a&o你的护身符使你在信仰之跃时不受伤害"
fire: "&a&o你的护身符使你免受火焰伤害"
magician: "&a&o你的护身符赠送了你额外的附魔"
- traveller: "&a&o你的护身符让你跑起来更快了"
- warrior: "&a&o你的护身符使你在一段时间内变强了"
+ traveller: "&a&o你的护身符让你跑得更快了"
+ warrior: "&a&o你的护身符使你变强了"
knight: "&a&o你的护身符给予了你 5 秒的生命恢复"
- whirlwind: "&a&o你的护身符反弹了所有的弹射物"
- wizard: "&a&o你的护身符使一个附魔的等级提高了, 同时其他附魔等级将会下降"
+ whirlwind: "&a&o你的护身符反弹了所有射向你的投掷物"
+ wizard: "&a&o你的护身符随机提高了一个附魔的等级, 但其他的附魔等级将会下降"
caveman: "&a&o你的护身符给予了你急迫效果"
soulbound-rune:
- fail: "&c一次只能灵魂绑定一个物品."
+ fail: "&c灵魂一次只能绑定一个物品."
success: "&a物品绑定成功! 在你死亡后此物品将不会掉落."
research:
- start: "&7古老的灵魂正向你诉说神秘的话语!"
- progress: "&7你开始慢慢理解研究 &b%research% &e(%progress%)"
+ start: "&7古老的灵魂正向你低语其中的神秘!"
+ progress: "&7你逐渐开始理解研究 &b%research% &e(%progress%)"
fire-extinguish: "&7你灭掉了身上的火"
cannot-place: "&c你不能在这里放置方块!"
- no-pvp: "&c你不能在这里 PVP!"
+ no-pvp: "&c你不能在这里攻击其他玩家!"
radiation: "&4你已经暴露在致命的辐射之下! &c快把辐射物品丢掉或者穿上防化服!"
opening-guide: "&b正在打开指南书, 请稍等..."
opening-backpack: "&b正在打开背包, 请稍等...."
- no-iron-golem-heal: "&c这不是铁锭. 你不能用这个治疗铁傀儡!"
+ no-iron-golem-heal: "&c这不是铁锭. 不能用来治疗铁傀儡!"
link-prompt: "&e单击此处:"
diet-cookie: "&e你感觉变轻了..."
fortune-cookie:
@@ -159,7 +163,7 @@ messages:
- "&7要总是看着生活中光明的一面!"
- "&7这一块其实是饼干而不是曲奇"
- "&7霓虹灯亮起来了!"
- piglin-barter: "&4你不能使用 Slimefun 的物品和猪灵以物换物"
+ piglin-barter: "&4你不能使用 Slimefun 的物品和猪灵易物"
enchantment-rune:
fail: "&c你不能附魔这个物品."
no-enchantment: "&c无法找到此物品可用的附魔属性."
@@ -167,21 +171,21 @@ messages:
tape-measure:
no-anchor: "&c在开始测量之前请先选定测量起点!"
wrong-world: "&c你设置的起点似乎在另一个世界!"
- distance: "&7已测量到距离, &e为: %distance%"
+ distance: "&7距离已测量, &e为: %distance%"
anchor-set: "&a成功在 &e %anchor% &a设置了测量起点"
multi-tool:
mode-change: "&b%device% 的模式已切换为: &9%mode%"
- not-shears: "&c多功能工具 (Multi Tool) 不能当成剪刀来用!"
+ not-shears: "&c多功能工具 (Multi Tool) 不能作为剪刀使用!"
climbing-pick:
dual-wielding: "&4你需要双手拿着攀岩镐才能使用!"
- wrong-material: "&c你不能爬上这个平面. 查看指南书了解更多!"
+ wrong-material: "&c你不能爬上这个平面. 查看指南书了解详情!"
invalid-item: "&4%item% &c不是一个有效的物品名!"
invalid-amount: "&4%amount% &ci不是一个有效的数字 : 它必须大于 0!"
invalid-research: "&4%research% &c不是一个有效的研究名!"
- bee-suit-slow-fall: "&e你的蜂翅会让你安全且缓慢地回到地面"
+ bee-suit-slow-fall: "&e你的蜂翅将会让你安全缓降"
mode-change: "&b%device% 的模式已切换为: &9%mode%"
machines:
- pattern-not-found: "&e抱歉, 你记错合成表了吧. 这不是一个正确的合成配方, 请检查发射器里放置物品的顺序."
+ pattern-not-found: "&e抱歉, 这不是正确的合成配方, 请检查发射器里放置物品的顺序."
unknown-material: "&e抱歉, 我无法识别在发射器里的物品. 请按照合成配方放置物品."
wrong-item: "&e抱歉, 我无法识别你右键的物品. 检查指南书看看哪些物品可以使用."
full-inventory: "&e抱歉, 物品栏已经满了!"
@@ -190,14 +194,14 @@ machines:
ANCIENT_ALTAR:
not-enough-pedestals: "&4古代基座不足. 目前已摆放的基座数: &c(%pedestals% / 8)"
unknown-catalyst: "&4无效的催化剂! &c请按照合成配方正确摆放物品!"
- unknown-recipe: "&4未知合成表! &c请使用正确的合成配方!"
+ unknown-recipe: "&4未知合成表! &c请按照合成配方正确摆放物品!"
ANCIENT_PEDESTAL:
obstructed: "&4基座被挡住了! &c把基座上面的东西移开!"
HOLOGRAM_PROJECTOR:
enter-text: "&7请写下想显示在全息文本上的话. &r(支持颜色代码)"
inventory-title: 全息图像编辑器
ELEVATOR:
- no-destinations: "&4找不到目的地"
+ no-destinations: "&4找不到上下楼"
pick-a-floor: "&3- 选择一个楼层 -"
current-floor: "&e你现在所在的楼层:"
click-to-teleport: "&e单击 &7传送至楼层:"
@@ -213,10 +217,10 @@ machines:
tooltip: 单击传送
time: 预计时间
CARGO_NODES:
- must-be-placed: "&4必须放置在箱子或机器上!"
+ must-be-placed: "&4货运节点必须放置在箱子或机器上!"
GPS_CONTROL_PANEL:
title: GPS - 控制面板
- transmitters: 信号发射器概览
+ transmitters: 信号发射机详情
waypoints: 传送点列表
INDUSTRIAL_MINER:
no-fuel: "&c你的工业矿机没有燃料了! 将燃料放入它上面的箱子里."
@@ -225,7 +229,7 @@ machines:
destroyed: "&c你的工业矿机被拆除了."
already-running: "&c这个工业矿机正在运行!"
full-chest: "&c你的工业矿机的箱子已经满了!"
- no-permission: "&4你没有权限在此操作此工业矿机!"
+ no-permission: "&4你没有权限操作这台工业矿机!"
finished: "&e你的工业矿机采矿已完成! 总共开采了 %ores% 个矿石!"
anvil:
not-working: "&4你不能在铁砧里使用 Slimefun 的物品"
@@ -236,14 +240,14 @@ backpack:
workbench:
not-enhanced: "&4你不能在普通的工作台上使用 Slimefun 物品"
gps:
- deathpoint: "&4死亡地点 &7%date%"
+ deathpoint: "&4死亡点 &7%date%"
waypoint:
new: "&e给你的路径点起个名字吧 &7(支持彩色代码!)"
added: "&a成功添加了新的传送点"
max: "&4你已到达设置传送点个数的最大上限"
- duplicate: "&4你已经创建了一个相同名字的传送点了: &f%waypoint%"
+ duplicate: "&4已经有相同名字的传送点了: &f%waypoint%"
insufficient-complexity:
- - "&4GPS网络复杂度不足: &c%complexity%"
+ - "&4GPS 网络复杂度不足: &c%complexity%"
- "&4a) 你还没有设置一个 GPS 网络"
- "&4b) 你的 GPS 网络复杂度不够, 多放置几个 GPS 信号发射机"
geo:
@@ -251,10 +255,10 @@ gps:
inventory:
no-access: "&4你没有权限使用这个方块"
android:
- started: "&7你的机器人开始运行脚本"
- stopped: "&7你的机器人暂停运行了脚本"
+ started: "&7机器人正在依照脚本运行"
+ stopped: "&7机器人停止了运行"
scripts:
- already-uploaded: "&4这个脚本已经上传过了."
+ already-uploaded: "&4你已经上传过这个脚本了."
instructions:
START: "&2运行脚本"
REPEAT: "&9重复运行脚本"
@@ -278,8 +282,8 @@ android:
CATCH_FISH: "&b钓鱼"
FARM_FORWARD: "&b自动采收并补种作物"
FARM_DOWN: "&b自动采收并补种下面的作物"
- FARM_EXOTIC_FORWARD: "&b自动采收并补种作物 &7(支持异域花园植物)"
- FARM_EXOTIC_DOWN: "&b自动采收并补种下面的作物 &7(支持异域花园植物)"
+ FARM_EXOTIC_FORWARD: "&b自动采收并补种所有作物"
+ FARM_EXOTIC_DOWN: "&b自动采收并补种下面的所有作物"
INTERFACE_ITEMS: "&9将物品栏里的物品放入面前的容器"
INTERFACE_FUEL: "&c从面前的容器中拿出燃料"
enter-name:
@@ -313,7 +317,6 @@ languages:
zh-CN: 简体中文 (中国)
el: 希腊语
he: 希伯来语
- pt: 葡萄牙语 (葡萄牙)
ar: 阿拉伯语
af: 南非语
da: 丹麦语
@@ -325,6 +328,7 @@ languages:
fa: 波斯语
th: 泰语
ro: 罗马尼亚语
+ pt: 葡萄牙语 (葡萄牙)
pt-BR: 葡萄牙语 (巴西)
bg: 保加利亚语
ko: 韩语
@@ -341,6 +345,6 @@ villagers:
cartography_table:
not-working: "&4你不能在制图台中使用 Slimefun 物品!"
cauldron:
- no-discoloring: "&4你不能用炼药锅清洗 Slimefun 物品上的颜色"
+ no-discoloring: "&4你不能用炼药锅洗去 Slimefun 物品的颜色"
miner:
no-ores: "&e抱歉, 周围找不到矿石了!"
diff --git a/src/main/resources/wiki.json b/src/main/resources/wiki.json
index 7de89de83..789d340ca 100644
--- a/src/main/resources/wiki.json
+++ b/src/main/resources/wiki.json
@@ -1,247 +1,247 @@
{
- "GOLD_PAN" : "Gold-Pan",
- "SIFTED_ORE" : "Sifted-Ore",
- "SMELTERY" : "Smeltery",
- "DIET_COOKIE" : "Diet-Cookie",
- "ENHANCED_CRAFTING_TABLE" : "Enhanced-Crafting-Table",
- "FORTUNE_COOKIE" : "Fortune-Cookie",
- "TABLE_SAW" : "Table-Saw",
- "APPLE_JUICE" : "Juices",
- "GOLDEN_APPLE_JUICE" : "Juices",
- "CARROT_JUICE" : "Juices",
- "MELON_JUICE" : "Juices",
- "PUMPKIN_JUICE" : "Juices",
- "SWEET_BERRY_JUICE" : "Juices",
- "MAGIC_SUGAR" : "Magic-Sugar",
- "MONSTER_JERKY" : "Monster-Jerky",
- "OUTPUT_CHEST" : "Output-Chest",
- "BEEF_JERKY" : "Meat-Jerky",
- "PORK_JERKY" : "Meat-Jerky",
- "CHICKEN_JERKY" : "Meat-Jerky",
- "MUTTON_JERKY" : "Meat-Jerky",
- "RABBIT_JERKY" : "Meat-Jerky",
- "FISH_JERKY" : "Meat-Jerky",
- "KELP_COOKIE" : "Kelp-Cookie",
- "ANCIENT_ALTAR" : "Ancient-Altar",
- "ANCIENT_PEDESTAL" : "Ancient-Pedestal",
- "BLADE_OF_VAMPIRES" : "Blade-of-Vampires",
- "BROKEN_SPAWNER" : "Broken-Spawner",
- "REPAIRED_SPAWNER" : "Reinforced-Spawner",
- "NETHER_GOLD_PAN" : "Nether-Gold-Pan",
- "PICKAXE_OF_CONTAINMENT" : "Pickaxe-of-Containment",
- "SEISMIC_AXE" : "Seismic-Axe",
- "SMELTERS_PICKAXE" : "Smelter's-Pickaxe",
- "MAGNET" : "Magnet",
- "BASIC_CIRCUIT_BOARD" : "Circuit-Boards",
- "ADVANCED_CIRCUIT_BOARD" : "Circuit-Boards",
- "BATTERY" : "Battery",
- "STEEL_THRUSTER" : "Steel-Thruster",
- "POWER_CRYSTAL" : "Power-Crystal",
- "SOLAR_PANEL" : "Solar-Panel",
- "ELECTRO_MAGNET" : "Electromagnet",
- "ELECTRIC_MOTOR" : "Electric-Motor",
- "HEATING_COIL" : "Heating-Coil",
- "COPPER_WIRE" : "Copper-Wire",
- "HARDENED_GLASS" : "Hardened-Glass",
- "COOLING_UNIT" : "Cooling-Unit",
- "WITHER_PROOF_OBSIDIAN" : "Wither-Proof-Blocks",
- "WITHER_PROOF_GLASS" : "Wither-Proof-Blocks",
- "REACTOR_COOLANT_CELL" : "Coolant-Cells",
- "NETHER_ICE_COOLANT_CELL" : "Coolant-Cells",
- "IRON_DUST" : "Iron-Dust",
- "GOLD_DUST" : "Gold-Dust",
- "GOLD_4K" : "Gold-Ingot",
- "GOLD_6K" : "Gold-Ingot",
- "GOLD_8K" : "Gold-Ingot",
- "GOLD_10K" : "Gold-Ingot",
- "GOLD_12K" : "Gold-Ingot",
- "GOLD_14K" : "Gold-Ingot",
- "GOLD_16K" : "Gold-Ingot",
- "GOLD_18K" : "Gold-Ingot",
- "GOLD_20K" : "Gold-Ingot",
- "GOLD_22K" : "Gold-Ingot",
- "GOLD_24K" : "Gold-Ingot",
- "ENERGY_REGULATOR" : "Energy-Regulator",
- "SMALL_CAPACITOR" : "Energy-Capacitors",
- "MEDIUM_CAPACITOR" : "Energy-Capacitors",
- "BIG_CAPACITOR" : "Energy-Capacitors",
- "LARGE_CAPACITOR" : "Energy-Capacitors",
- "CARBONADO_EDGED_CAPACITOR" : "Energy-Capacitors",
- "SOLAR_GENERATOR" : "Solar-Generator",
- "SOLAR_GENERATOR_2" : "Solar-Generator",
- "SOLAR_GENERATOR_3" : "Solar-Generator",
- "SOLAR_GENERATOR_4" : "Solar-Generator",
- "COAL_GENERATOR" : "Coal-Generator",
- "COAL_GENERATOR_2" : "Coal-Generator",
- "COBALT_PICKAXE" : "Cobalt-Pickaxe",
- "EXPLOSIVE_PICKAXE" : "Explosive-Pickaxe",
- "EXPLOSIVE_SHOVEL" : "Explosive-Shovel",
- "GRAPPLING_HOOK" : "Grappling-Hook",
- "HERCULES_PICKAXE" : "Hercules'-Pickaxe",
- "LUMBER_AXE" : "Lumber-Axe",
- "PICKAXE_OF_VEIN_MINING" : "Pickaxe-of-Vein-Mining",
- "PICKAXE_OF_THE_SEEKER" : "Pickaxe-of-the-Seeker",
- "CARGO_OUTPUT_ADVANCED" : "Advanced-Output-Node",
- "CARGO_MANAGER" : "Cargo-Manager",
- "CARGO_MOTOR" : "Cargo-Motor",
- "CARGO_NODE" : "Connector-Node",
- "CARGO_INPUT" : "Input-Node",
- "CARGO_OUTPUT" : "Output-Node",
- "TRASH_CAN" : "Trash-Can",
- "ORE_WASHER" : "Ore-Washer",
- "SCUBA_HELMET" : "Hazmat-Suit",
- "HAZMAT_CHESTPLATE" : "Hazmat-Suit",
- "HAZMAT_LEGGINGS" : "Hazmat-Suit",
- "RUBBER_BOOTS" : "Hazmat-Suit",
- "ARMOR_FORGE" : "Armor-Forge",
- "AUTOMATED_PANNING_MACHINE" : "Automated-Panning-Machine",
- "COMPRESSOR" : "Compressor",
- "ORE_CRUSHER" : "Ore-Crusher",
- "PRESSURE_CHAMBER" : "Pressure-Chamber",
- "GRIND_STONE" : "Grind-Stone",
- "MAGIC_WORKBENCH" : "Magic-Workbench",
- "PORTABLE_CRAFTER" : "Portable-Crafter",
- "PORTABLE_DUSTBIN" : "Portable-Dustbin",
- "COOLER" : "Cooler",
- "ALUMINUM_BRASS_INGOT" : "Aluminum-Brass-Ingot",
- "ALUMINUM_BRONZE_INGOT" : "Aluminum-Bronze-Ingot",
- "ALUMINUM_DUST" : "Aluminum-Dust",
- "ALUMINUM_INGOT" : "Aluminum-Ingot",
- "GLOWSTONE_HELMET" : "Magical-Armor",
- "GLOWSTONE_CHESTPLATE" : "Magical-Armor",
- "GLOWSTONE_LEGGINGS" : "Magical-Armor",
- "GLOWSTONE_BOOTS" : "Magical-Armor",
- "ENDER_HELMET" : "Magical-Armor",
- "ENDER_CHESTPLATE" : "Magical-Armor",
- "ENDER_LEGGINGS" : "Magical-Armor",
- "ENDER_BOOTS" : "Magical-Armor",
- "SLIME_HELMET" : "Magical-Armor",
- "SLIME_CHESTPLATE" : "Magical-Armor",
- "SLIME_LEGGINGS" : "Magical-Armor",
- "SLIME_BOOTS" : "Magical-Armor",
- "CACTUS_HELMET" : "Armor",
- "CACTUS_CHESTPLATE" : "Armor",
- "CACTUS_LEGGINGS" : "Armor",
- "CACTUS_BOOTS" : "Armor",
- "DAMASCUS_STEEL_HELMET" : "Armor",
- "DAMASCUS_STEEL_CHESTPLATE" : "Armor",
- "DAMASCUS_STEEL_LEGGINGS" : "Armor",
- "DAMASCUS_STEEL_BOOTS" : "Armor",
- "REINFORCED_ALLOY_HELMET" : "Armor",
- "REINFORCED_ALLOY_CHESTPLATE" : "Armor",
- "REINFORCED_ALLOY_LEGGINGS" : "Armor",
- "REINFORCED_ALLOY_BOOTS" : "Armor",
- "GILDED_IRON_HELMET" : "Armor",
- "GILDED_IRON_CHESTPLATE" : "Armor",
- "GILDED_IRON_LEGGINGS" : "Armor",
- "GILDED_IRON_BOOTS" : "Armor",
- "GOLD_12K_HELMET" : "Armor",
- "GOLD_12K_CHESTPLATE" : "Armor",
- "GOLD_12K_LEGGINGS" : "Armor",
- "GOLD_12K_BOOTS" : "Armor",
- "SLIME_STEEL_HELMET" : "Magical-Armor",
- "SLIME_STEEL_CHESTPLATE" : "Magical-Armor",
- "SLIME_STEEL_LEGGINGS" : "Magical-Armor",
- "SLIME_STEEL_BOOTS" : "Magical-Armor",
- "BILLON_INGOT" : "Billon-Ingot",
- "BLOCK_PLACER" : "Block-Placer",
- "EXPLOSIVE_BOW" : "Bows",
- "ICY_BOW" : "Bows",
- "BRASS_INGOT" : "Brass-Ingot",
- "BRONZE_INGOT" : "Bronze-Ingot",
- "CHRISTMAS_MILK" : "Christmas-Items",
- "CHRISTMAS_CHOCOLATE_MILK" : "Christmas-Items",
- "CHRISTMAS_EGG_NOG" : "Christmas-Items",
- "CHRISTMAS_APPLE_CIDER" : "Christmas-Items",
- "CHRISTMAS_COOKIE" : "Christmas-Items",
- "CHRISTMAS_FRUIT_CAKE" : "Christmas-Items",
- "CHRISTMAS_APPLE_PIE" : "Christmas-Items",
- "CHRISTMAS_HOT_CHOCOLATE" : "Christmas-Items",
- "CHRISTMAS_CAKE" : "Christmas-Items",
- "CHRISTMAS_CARAMEL" : "Christmas-Items",
- "CHRISTMAS_CARAMEL_APPLE" : "Christmas-Items",
- "CHRISTMAS_CHOCOLATE_APPLE" : "Christmas-Items",
- "CHRISTMAS_PRESENT" : "Christmas-Items",
- "RAINBOW_WOOL_XMAS" : "Christmas-Seasonal-Category",
- "RAINBOW_GLASS_XMAS" : "Christmas-Seasonal-Category",
- "RAINBOW_CLAY_XMAS" : "Christmas-Seasonal-Category",
- "RAINBOW_GLASS_PANE_XMAS" : "Christmas-Seasonal-Category",
- "RAINBOW_CONCRETE_XMAS" : "Christmas-Seasonal-Category",
- "RAINBOW_GLAZED_TERRACOTTA_XMAS" : "Christmas-Seasonal-Category",
- "COBALT_INGOT" : "Cobalt-Ingot",
- "COPPER_DUST" : "Copper-Dust",
- "COPPER_INGOT" : "Copper-Ingot",
- "CORINTHIAN_BRONZE_INGOT" : "Corinthian-Bronze-Ingot",
- "DAMASCUS_STEEL_INGOT" : "Damascus-Steel-Ingot",
- "DURALUMIN_INGOT" : "Duralumin-Ingot",
- "ELEVATOR_PLATE" : "Elevator-Plate",
- "ELYTRA_SCALE" : "Elytras",
- "INFUSED_ELYTRA" : "Elytras",
- "SOULBOUND_ELYTRA" : "Elytras",
- "ENHANCED_FURNACE" : "Enhanced-Furnaces",
- "ENHANCED_FURNACE_2" : "Enhanced-Furnaces",
- "ENHANCED_FURNACE_3" : "Enhanced-Furnaces",
- "ENHANCED_FURNACE_4" : "Enhanced-Furnaces",
- "ENHANCED_FURNACE_5" : "Enhanced-Furnaces",
- "ENHANCED_FURNACE_6" : "Enhanced-Furnaces",
- "ENHANCED_FURNACE_7" : "Enhanced-Furnaces",
- "ENHANCED_FURNACE_8" : "Enhanced-Furnaces",
- "ENHANCED_FURNACE_9" : "Enhanced-Furnaces",
- "ENHANCED_FURNACE_10" : "Enhanced-Furnaces",
- "ENHANCED_FURNACE_11" : "Enhanced-Furnaces",
- "REINFORCED_FURNACE" : "Enhanced-Furnaces",
- "CARBONADO_EDGED_FURNACE" : "Enhanced-Furnaces",
- "FERROSILICON" : "Ferrosilicon",
- "GEO_MINER" : "GEO-Miner",
- "GPS_ACTIVATION_DEVICE_SHARED" : "GPS-Activation-Device",
- "GPS_ACTIVATION_DEVICE_PERSONAL" : "GPS-Activation-Device",
- "GPS_CONTROL_PANEL" : "GPS-Control-Panel",
- "GPS_EMERGENCY_TRANSMITTER" : "GPS-Emergency-Transmitter",
- "GPS_GEO_SCANNER" : "GPS-Geo-Scanner",
- "GPS_MARKER_TOOL" : "GPS-Marker-Tool",
- "GPS_TELEPORTATION_MATRIX" : "GPS-Teleporter-Matrix",
- "GPS_TELEPORTER_PYLON" : "GPS-Teleporter-Pylon",
- "GPS_TRANSMITTER" : "GPS-Transmitter",
- "GILDED_IRON" : "Gilded-Iron",
- "HARDENED_METAL_INGOT" : "Hardened-Metal",
- "LEAD_DUST" : "Lead-Dust",
- "LEAD_INGOT" : "Lead-Ingot",
- "MAGNESIUM_DUST" : "Magnesium-Dust",
- "MAGNESIUM_INGOT" : "Magnesium-Ingot",
- "NICKEL_INGOT" : "Nickel-Ingot",
- "OIL_PUMP" : "Oil-Pump",
- "PORTABLE_GEO_SCANNER" : "Portable-Geo-Scanner",
- "RAINBOW_WOOL" : "Rainbow-Blocks",
- "RAINBOW_GLASS" : "Rainbow-Blocks",
- "RAINBOW_CLAY" : "Rainbow-Blocks",
- "RAINBOW_GLASS_PANE" : "Rainbow-Blocks",
- "RAINBOW_CONCRETE" : "Rainbow-Blocks",
- "RAINBOW_GLAZED_TERRACOTTA" : "Rainbow-Blocks",
- "REDSTONE_ALLOY" : "Redstone-Alloy-Ingot",
- "REINFORCED_ALLOY_INGOT" : "Reinforced-Alloy-Ingot",
- "SILVER_DUST" : "Silver-Dust",
- "SILVER_INGOT" : "Silver-Ingot",
- "SOLDER_INGOT" : "Solder-Ingot",
- "SOULBOUND_HELMET" : "Soulbound-Armor",
- "SOULBOUND_CHESTPLATE" : "Soulbound-Armor",
- "SOULBOUND_LEGGINGS" : "Soulbound-Armor",
- "SOULBOUND_BOOTS" : "Soulbound-Armor",
- "ANCIENT_RUNE_SOULBOUND" : "Soulbound-Rune",
- "SOULBOUND_SWORD" : "Soulbound-Weapons",
- "SOULBOUND_BOW" : "Soulbound-Weapons",
- "SOULBOUND_PICKAXE" : "Soulbound-Weapons",
- "SOULBOUND_AXE" : "Soulbound-Weapons",
- "SOULBOUND_SHOVEL" : "Soulbound-Weapons",
- "SOULBOUND_HOE" : "Soulbound-Weapons",
- "SOULBOUND_TRIDENT" : "Soulbound-Weapons",
- "STEEL_INGOT" : "Steel-Ingot",
- "SWORD_OF_BEHEADING" : "Sword-of-Beheading",
- "COMMON_TALISMAN" : "Talismans",
- "ENDER_TALISMAN" : "Talismans",
- "TIN_DUST" : "Tin-Dust",
- "TIN_INGOT" : "Tin-Ingot",
- "GRANDMAS_WALKING_STICK" : "Walking-Sticks",
- "GRANDPAS_WALKING_STICK" : "Walking-Sticks",
- "ZINC_DUST" : "Zinc-Dust",
- "ZINC_INGOT" : "Zinc-Ingot"
+ "GOLD_PAN" : "Gold-Pan",
+ "SIFTED_ORE" : "Sifted-Ore",
+ "SMELTERY" : "Smeltery",
+ "DIET_COOKIE" : "Diet-Cookie",
+ "ENHANCED_CRAFTING_TABLE" : "Enhanced-Crafting-Table",
+ "FORTUNE_COOKIE" : "Fortune-Cookie",
+ "TABLE_SAW" : "Table-Saw",
+ "APPLE_JUICE" : "Juices",
+ "GOLDEN_APPLE_JUICE" : "Juices",
+ "CARROT_JUICE" : "Juices",
+ "MELON_JUICE" : "Juices",
+ "PUMPKIN_JUICE" : "Juices",
+ "SWEET_BERRY_JUICE" : "Juices",
+ "MAGIC_SUGAR" : "Magic-Sugar",
+ "MONSTER_JERKY" : "Monster-Jerky",
+ "OUTPUT_CHEST" : "Output-Chest",
+ "BEEF_JERKY" : "Meat-Jerky",
+ "PORK_JERKY" : "Meat-Jerky",
+ "CHICKEN_JERKY" : "Meat-Jerky",
+ "MUTTON_JERKY" : "Meat-Jerky",
+ "RABBIT_JERKY" : "Meat-Jerky",
+ "FISH_JERKY" : "Meat-Jerky",
+ "KELP_COOKIE" : "Kelp-Cookie",
+ "ANCIENT_ALTAR" : "Ancient-Altar",
+ "ANCIENT_PEDESTAL" : "Ancient-Pedestal",
+ "BLADE_OF_VAMPIRES" : "Blade-of-Vampires",
+ "BROKEN_SPAWNER" : "Broken-Spawner",
+ "REPAIRED_SPAWNER" : "Reinforced-Spawner",
+ "NETHER_GOLD_PAN" : "Nether-Gold-Pan",
+ "PICKAXE_OF_CONTAINMENT" : "Pickaxe-of-Containment",
+ "SEISMIC_AXE" : "Seismic-Axe",
+ "SMELTERS_PICKAXE" : "Smelter's-Pickaxe",
+ "MAGNET" : "Magnet",
+ "BASIC_CIRCUIT_BOARD" : "Circuit-Boards",
+ "ADVANCED_CIRCUIT_BOARD" : "Circuit-Boards",
+ "BATTERY" : "Battery",
+ "STEEL_THRUSTER" : "Steel-Thruster",
+ "POWER_CRYSTAL" : "Power-Crystal",
+ "SOLAR_PANEL" : "Solar-Panel",
+ "ELECTRO_MAGNET" : "Electromagnet",
+ "ELECTRIC_MOTOR" : "Electric-Motor",
+ "HEATING_COIL" : "Heating-Coil",
+ "COPPER_WIRE" : "Copper-Wire",
+ "HARDENED_GLASS" : "Hardened-Glass",
+ "COOLING_UNIT" : "Cooling-Unit",
+ "WITHER_PROOF_OBSIDIAN" : "Wither-Proof-Blocks",
+ "WITHER_PROOF_GLASS" : "Wither-Proof-Blocks",
+ "REACTOR_COOLANT_CELL" : "Coolant-Cells",
+ "NETHER_ICE_COOLANT_CELL" : "Coolant-Cells",
+ "IRON_DUST" : "Iron-Dust",
+ "GOLD_DUST" : "Gold-Dust",
+ "GOLD_4K" : "Gold-Ingot",
+ "GOLD_6K" : "Gold-Ingot",
+ "GOLD_8K" : "Gold-Ingot",
+ "GOLD_10K" : "Gold-Ingot",
+ "GOLD_12K" : "Gold-Ingot",
+ "GOLD_14K" : "Gold-Ingot",
+ "GOLD_16K" : "Gold-Ingot",
+ "GOLD_18K" : "Gold-Ingot",
+ "GOLD_20K" : "Gold-Ingot",
+ "GOLD_22K" : "Gold-Ingot",
+ "GOLD_24K" : "Gold-Ingot",
+ "ENERGY_REGULATOR" : "Energy-Regulator",
+ "SMALL_CAPACITOR" : "Energy-Capacitors",
+ "MEDIUM_CAPACITOR" : "Energy-Capacitors",
+ "BIG_CAPACITOR" : "Energy-Capacitors",
+ "LARGE_CAPACITOR" : "Energy-Capacitors",
+ "CARBONADO_EDGED_CAPACITOR" : "Energy-Capacitors",
+ "SOLAR_GENERATOR" : "Solar-Generator",
+ "SOLAR_GENERATOR_2" : "Solar-Generator",
+ "SOLAR_GENERATOR_3" : "Solar-Generator",
+ "SOLAR_GENERATOR_4" : "Solar-Generator",
+ "COAL_GENERATOR" : "Coal-Generator",
+ "COAL_GENERATOR_2" : "Coal-Generator",
+ "COBALT_PICKAXE" : "Cobalt-Pickaxe",
+ "EXPLOSIVE_PICKAXE" : "Explosive-Pickaxe",
+ "EXPLOSIVE_SHOVEL" : "Explosive-Shovel",
+ "GRAPPLING_HOOK" : "Grappling-Hook",
+ "HERCULES_PICKAXE" : "Hercules'-Pickaxe",
+ "LUMBER_AXE" : "Lumber-Axe",
+ "PICKAXE_OF_VEIN_MINING" : "Pickaxe-of-Vein-Mining",
+ "PICKAXE_OF_THE_SEEKER" : "Pickaxe-of-the-Seeker",
+ "CARGO_OUTPUT_ADVANCED" : "Advanced-Output-Node",
+ "CARGO_MANAGER" : "Cargo-Manager",
+ "CARGO_MOTOR" : "Cargo-Motor",
+ "CARGO_NODE" : "Connector-Node",
+ "CARGO_INPUT" : "Input-Node",
+ "CARGO_OUTPUT" : "Output-Node",
+ "TRASH_CAN" : "Trash-Can",
+ "ORE_WASHER" : "Ore-Washer",
+ "SCUBA_HELMET" : "Hazmat-Suit",
+ "HAZMAT_CHESTPLATE" : "Hazmat-Suit",
+ "HAZMAT_LEGGINGS" : "Hazmat-Suit",
+ "RUBBER_BOOTS" : "Hazmat-Suit",
+ "ARMOR_FORGE" : "Armor-Forge",
+ "AUTOMATED_PANNING_MACHINE" : "Automated-Panning-Machine",
+ "COMPRESSOR" : "Compressor",
+ "ORE_CRUSHER" : "Ore-Crusher",
+ "PRESSURE_CHAMBER" : "Pressure-Chamber",
+ "GRIND_STONE" : "Grind-Stone",
+ "MAGIC_WORKBENCH" : "Magic-Workbench",
+ "PORTABLE_CRAFTER" : "Portable-Crafter",
+ "PORTABLE_DUSTBIN" : "Portable-Dustbin",
+ "COOLER" : "Cooler",
+ "ALUMINUM_BRASS_INGOT" : "Aluminum-Brass-Ingot",
+ "ALUMINUM_BRONZE_INGOT" : "Aluminum-Bronze-Ingot",
+ "ALUMINUM_DUST" : "Aluminum-Dust",
+ "ALUMINUM_INGOT" : "Aluminum-Ingot",
+ "GLOWSTONE_HELMET" : "Magical-Armor",
+ "GLOWSTONE_CHESTPLATE" : "Magical-Armor",
+ "GLOWSTONE_LEGGINGS" : "Magical-Armor",
+ "GLOWSTONE_BOOTS" : "Magical-Armor",
+ "ENDER_HELMET" : "Magical-Armor",
+ "ENDER_CHESTPLATE" : "Magical-Armor",
+ "ENDER_LEGGINGS" : "Magical-Armor",
+ "ENDER_BOOTS" : "Magical-Armor",
+ "SLIME_HELMET" : "Magical-Armor",
+ "SLIME_CHESTPLATE" : "Magical-Armor",
+ "SLIME_LEGGINGS" : "Magical-Armor",
+ "SLIME_BOOTS" : "Magical-Armor",
+ "CACTUS_HELMET" : "Armor",
+ "CACTUS_CHESTPLATE" : "Armor",
+ "CACTUS_LEGGINGS" : "Armor",
+ "CACTUS_BOOTS" : "Armor",
+ "DAMASCUS_STEEL_HELMET" : "Armor",
+ "DAMASCUS_STEEL_CHESTPLATE" : "Armor",
+ "DAMASCUS_STEEL_LEGGINGS" : "Armor",
+ "DAMASCUS_STEEL_BOOTS" : "Armor",
+ "REINFORCED_ALLOY_HELMET" : "Armor",
+ "REINFORCED_ALLOY_CHESTPLATE" : "Armor",
+ "REINFORCED_ALLOY_LEGGINGS" : "Armor",
+ "REINFORCED_ALLOY_BOOTS" : "Armor",
+ "GILDED_IRON_HELMET" : "Armor",
+ "GILDED_IRON_CHESTPLATE" : "Armor",
+ "GILDED_IRON_LEGGINGS" : "Armor",
+ "GILDED_IRON_BOOTS" : "Armor",
+ "GOLD_12K_HELMET" : "Armor",
+ "GOLD_12K_CHESTPLATE" : "Armor",
+ "GOLD_12K_LEGGINGS" : "Armor",
+ "GOLD_12K_BOOTS" : "Armor",
+ "SLIME_STEEL_HELMET" : "Magical-Armor",
+ "SLIME_STEEL_CHESTPLATE" : "Magical-Armor",
+ "SLIME_STEEL_LEGGINGS" : "Magical-Armor",
+ "SLIME_STEEL_BOOTS" : "Magical-Armor",
+ "BILLON_INGOT" : "Billon-Ingot",
+ "BLOCK_PLACER" : "Block-Placer",
+ "EXPLOSIVE_BOW" : "Bows",
+ "ICY_BOW" : "Bows",
+ "BRASS_INGOT" : "Brass-Ingot",
+ "BRONZE_INGOT" : "Bronze-Ingot",
+ "CHRISTMAS_MILK" : "Christmas-Items",
+ "CHRISTMAS_CHOCOLATE_MILK" : "Christmas-Items",
+ "CHRISTMAS_EGG_NOG" : "Christmas-Items",
+ "CHRISTMAS_APPLE_CIDER" : "Christmas-Items",
+ "CHRISTMAS_COOKIE" : "Christmas-Items",
+ "CHRISTMAS_FRUIT_CAKE" : "Christmas-Items",
+ "CHRISTMAS_APPLE_PIE" : "Christmas-Items",
+ "CHRISTMAS_HOT_CHOCOLATE" : "Christmas-Items",
+ "CHRISTMAS_CAKE" : "Christmas-Items",
+ "CHRISTMAS_CARAMEL" : "Christmas-Items",
+ "CHRISTMAS_CARAMEL_APPLE" : "Christmas-Items",
+ "CHRISTMAS_CHOCOLATE_APPLE" : "Christmas-Items",
+ "CHRISTMAS_PRESENT" : "Christmas-Items",
+ "RAINBOW_WOOL_XMAS" : "Christmas-Seasonal-Category",
+ "RAINBOW_GLASS_XMAS" : "Christmas-Seasonal-Category",
+ "RAINBOW_CLAY_XMAS" : "Christmas-Seasonal-Category",
+ "RAINBOW_GLASS_PANE_XMAS" : "Christmas-Seasonal-Category",
+ "RAINBOW_CONCRETE_XMAS" : "Christmas-Seasonal-Category",
+ "RAINBOW_GLAZED_TERRACOTTA_XMAS" : "Christmas-Seasonal-Category",
+ "COBALT_INGOT" : "Cobalt-Ingot",
+ "COPPER_DUST" : "Copper-Dust",
+ "COPPER_INGOT" : "Copper-Ingot",
+ "CORINTHIAN_BRONZE_INGOT" : "Corinthian-Bronze-Ingot",
+ "DAMASCUS_STEEL_INGOT" : "Damascus-Steel-Ingot",
+ "DURALUMIN_INGOT" : "Duralumin-Ingot",
+ "ELEVATOR_PLATE" : "Elevator-Plate",
+ "ELYTRA_SCALE" : "Elytras",
+ "INFUSED_ELYTRA" : "Elytras",
+ "SOULBOUND_ELYTRA" : "Elytras",
+ "ENHANCED_FURNACE" : "Enhanced-Furnaces",
+ "ENHANCED_FURNACE_2" : "Enhanced-Furnaces",
+ "ENHANCED_FURNACE_3" : "Enhanced-Furnaces",
+ "ENHANCED_FURNACE_4" : "Enhanced-Furnaces",
+ "ENHANCED_FURNACE_5" : "Enhanced-Furnaces",
+ "ENHANCED_FURNACE_6" : "Enhanced-Furnaces",
+ "ENHANCED_FURNACE_7" : "Enhanced-Furnaces",
+ "ENHANCED_FURNACE_8" : "Enhanced-Furnaces",
+ "ENHANCED_FURNACE_9" : "Enhanced-Furnaces",
+ "ENHANCED_FURNACE_10" : "Enhanced-Furnaces",
+ "ENHANCED_FURNACE_11" : "Enhanced-Furnaces",
+ "REINFORCED_FURNACE" : "Enhanced-Furnaces",
+ "CARBONADO_EDGED_FURNACE" : "Enhanced-Furnaces",
+ "FERROSILICON" : "Ferrosilicon",
+ "GEO_MINER" : "GEO-Miner",
+ "GPS_ACTIVATION_DEVICE_SHARED" : "GPS-Activation-Device",
+ "GPS_ACTIVATION_DEVICE_PERSONAL" : "GPS-Activation-Device",
+ "GPS_CONTROL_PANEL" : "GPS-Control-Panel",
+ "GPS_EMERGENCY_TRANSMITTER" : "GPS-Emergency-Transmitter",
+ "GPS_GEO_SCANNER" : "GPS-Geo-Scanner",
+ "GPS_MARKER_TOOL" : "GPS-Marker-Tool",
+ "GPS_TELEPORTATION_MATRIX" : "GPS-Teleporter-Matrix",
+ "GPS_TELEPORTER_PYLON" : "GPS-Teleporter-Pylon",
+ "GPS_TRANSMITTER" : "GPS-Transmitter",
+ "GILDED_IRON" : "Gilded-Iron",
+ "HARDENED_METAL_INGOT" : "Hardened-Metal",
+ "LEAD_DUST" : "Lead-Dust",
+ "LEAD_INGOT" : "Lead-Ingot",
+ "MAGNESIUM_DUST" : "Magnesium-Dust",
+ "MAGNESIUM_INGOT" : "Magnesium-Ingot",
+ "NICKEL_INGOT" : "Nickel-Ingot",
+ "OIL_PUMP" : "Oil-Pump",
+ "PORTABLE_GEO_SCANNER" : "Portable-Geo-Scanner",
+ "RAINBOW_WOOL" : "Rainbow-Blocks",
+ "RAINBOW_GLASS" : "Rainbow-Blocks",
+ "RAINBOW_CLAY" : "Rainbow-Blocks",
+ "RAINBOW_GLASS_PANE" : "Rainbow-Blocks",
+ "RAINBOW_CONCRETE" : "Rainbow-Blocks",
+ "RAINBOW_GLAZED_TERRACOTTA" : "Rainbow-Blocks",
+ "REDSTONE_ALLOY" : "Redstone-Alloy-Ingot",
+ "REINFORCED_ALLOY_INGOT" : "Reinforced-Alloy-Ingot",
+ "SILVER_DUST" : "Silver-Dust",
+ "SILVER_INGOT" : "Silver-Ingot",
+ "SOLDER_INGOT" : "Solder-Ingot",
+ "SOULBOUND_HELMET" : "Soulbound-Armor",
+ "SOULBOUND_CHESTPLATE" : "Soulbound-Armor",
+ "SOULBOUND_LEGGINGS" : "Soulbound-Armor",
+ "SOULBOUND_BOOTS" : "Soulbound-Armor",
+ "ANCIENT_RUNE_SOULBOUND" : "Soulbound-Rune",
+ "SOULBOUND_SWORD" : "Soulbound-Weapons",
+ "SOULBOUND_BOW" : "Soulbound-Weapons",
+ "SOULBOUND_PICKAXE" : "Soulbound-Weapons",
+ "SOULBOUND_AXE" : "Soulbound-Weapons",
+ "SOULBOUND_SHOVEL" : "Soulbound-Weapons",
+ "SOULBOUND_HOE" : "Soulbound-Weapons",
+ "SOULBOUND_TRIDENT" : "Soulbound-Weapons",
+ "STEEL_INGOT" : "Steel-Ingot",
+ "SWORD_OF_BEHEADING" : "Sword-of-Beheading",
+ "COMMON_TALISMAN" : "Talismans",
+ "ENDER_TALISMAN" : "Talismans",
+ "TIN_DUST" : "Tin-Dust",
+ "TIN_INGOT" : "Tin-Ingot",
+ "GRANDMAS_WALKING_STICK" : "Walking-Sticks",
+ "GRANDPAS_WALKING_STICK" : "Walking-Sticks",
+ "ZINC_DUST" : "Zinc-Dust",
+ "ZINC_INGOT" : "Zinc-Ingot"
}
diff --git a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/listeners/TestSlimefunGuideListener.java b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/listeners/TestSlimefunGuideListener.java
index 91cee4018..7330fcbdc 100644
--- a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/listeners/TestSlimefunGuideListener.java
+++ b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/listeners/TestSlimefunGuideListener.java
@@ -51,7 +51,7 @@ class TestSlimefunGuideListener {
PlayerJoinEvent event = new PlayerJoinEvent(player, "CanIHazGuide has joined and wants sum guide");
listener.onJoin(event);
- ItemStack guide = SlimefunGuide.getItem(SlimefunGuide.getDefaultLayout());
+ ItemStack guide = SlimefunGuide.getItem(SlimefunGuide.getDefaultMode());
Assertions.assertEquals(!hasPlayedBefore && giveSlimefunGuide, hasSlimefunGuide(player, guide));
}
diff --git a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/utils/TestHeadTextures.java b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/utils/TestHeadTextures.java
index 601d0d335..c320da673 100644
--- a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/utils/TestHeadTextures.java
+++ b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/utils/TestHeadTextures.java
@@ -16,7 +16,7 @@ class TestHeadTextures {
void testForDuplicates() {
Set textures = new HashSet<>();
- for (HeadTexture head : HeadTexture.valuesCache) {
+ for (HeadTexture head : HeadTexture.values()) {
String texture = head.getTexture();
Assertions.assertNotNull(texture);
diff --git a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/utils/TestMinecraftVersion.java b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/utils/TestMinecraftVersion.java
index 1bdb43a44..ed1fa31d8 100644
--- a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/utils/TestMinecraftVersion.java
+++ b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/utils/TestMinecraftVersion.java
@@ -11,12 +11,11 @@ class TestMinecraftVersion {
@Test
@DisplayName("Test if Minecraft versions match themselves")
void testMatches() {
- Assertions.assertTrue(MinecraftVersion.MINECRAFT_1_14.matches("v1_14_R2"));
- Assertions.assertTrue(MinecraftVersion.MINECRAFT_1_15.matches("v1_15_R1"));
+ Assertions.assertTrue(MinecraftVersion.MINECRAFT_1_14.isMinecraftVersion(14));
+ Assertions.assertTrue(MinecraftVersion.MINECRAFT_1_15.isMinecraftVersion(15));
- Assertions.assertFalse(MinecraftVersion.MINECRAFT_1_15.matches("v1_14_R2"));
- Assertions.assertFalse(MinecraftVersion.MINECRAFT_1_14.matches("1.14.x"));
- Assertions.assertThrows(IllegalArgumentException.class, () -> MinecraftVersion.MINECRAFT_1_14.matches(null));
+ Assertions.assertFalse(MinecraftVersion.MINECRAFT_1_15.isMinecraftVersion(14));
+ Assertions.assertFalse(MinecraftVersion.MINECRAFT_1_14.isMinecraftVersion(0));
}
@Test