1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-20 11:45:51 +00:00

Merge branch 'master' into MoreTalismans

This commit is contained in:
TheBusyBiscuit 2020-11-02 15:12:56 +01:00 committed by GitHub
commit d69cf78331
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
58 changed files with 434 additions and 267 deletions

View File

@ -26,6 +26,7 @@
## Release Candidate 18 (TBD) ## Release Candidate 18 (TBD)
#### Additions #### Additions
* The Smelters Pick now also works on Ancient Debris
#### Changes #### Changes
* Removed 1.13 support * Removed 1.13 support
@ -48,6 +49,11 @@
* Fixed #2469 * Fixed #2469
* Fixed #2509 * Fixed #2509
* Fixed #2499 * 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) ## Release Candidate 17 (17 Oct 2020)

View File

@ -315,7 +315,7 @@
<dependency> <dependency>
<groupId>com.github.seeseemelk</groupId> <groupId>com.github.seeseemelk</groupId>
<artifactId>MockBukkit-v1.16</artifactId> <artifactId>MockBukkit-v1.16</artifactId>
<version>0.13.0</version> <version>0.13.1</version>
<scope>test</scope> <scope>test</scope>
<exclusions> <exclusions>
<exclusion> <exclusion>
@ -349,7 +349,7 @@
<dependency> <dependency>
<groupId>com.konghq</groupId> <groupId>com.konghq</groupId>
<artifactId>unirest-java</artifactId> <artifactId>unirest-java</artifactId>
<version>3.11.02</version> <version>3.11.03</version>
<scope>compile</scope> <scope>compile</scope>
<exclusions> <exclusions>
<exclusion> <exclusion>

View File

@ -40,7 +40,7 @@ class GiveCommand extends SubCommand {
if (sfItem != null) { if (sfItem != null) {
giveItem(sender, p, sfItem, args); giveItem(sender, p, sfItem, args);
} else { } 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 { } else {
SlimefunPlugin.getLocalization().sendMessage(sender, "messages.not-online", true, msg -> msg.replace(PLACEHOLDER_PLAYER, args[1])); 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))); 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 { } 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]));
} }
} }
} }

View File

@ -66,7 +66,7 @@ class ResearchCommand extends SubCommand {
SlimefunPlugin.getLocalization().sendMessage(player, "messages.give-research", true, variables); SlimefunPlugin.getLocalization().sendMessage(player, "messages.give-research", true, variables);
}); });
} else { } 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));
} }
} }

View File

@ -16,6 +16,7 @@ import io.github.thebusybiscuit.cscorelib2.collections.LoopIterator;
import io.github.thebusybiscuit.slimefun4.api.MinecraftVersion; import io.github.thebusybiscuit.slimefun4.api.MinecraftVersion;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import io.github.thebusybiscuit.slimefun4.implementation.items.blocks.RainbowBlock; 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.CSCoreLibPlugin.Configuration.Config;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker; import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
@ -48,10 +49,14 @@ public class RainbowTickHandler extends BlockTicker {
material = iterator.next(); material = iterator.next();
} }
public RainbowTickHandler(Material... materials) { public RainbowTickHandler(@Nonnull Material... materials) {
this(Arrays.asList(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} * This method checks whether a given {@link Material} array contains any {@link Material}
* that would result in a {@link GlassPane} {@link BlockData}. * that would result in a {@link GlassPane} {@link BlockData}.

View File

@ -1,22 +1,29 @@
package io.github.thebusybiscuit.slimefun4.core.services; package io.github.thebusybiscuit.slimefun4.core.services;
import java.util.Optional; import java.util.Optional;
import java.util.logging.Level;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.Keyed; import org.bukkit.Keyed;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockState; import org.bukkit.block.BlockState;
import org.bukkit.block.TileState; import org.bukkit.block.TileState;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataHolder; import org.bukkit.persistence.PersistentDataHolder;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.plugin.Plugin; 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.PaperLib;
import io.papermc.lib.features.blockstatesnapshot.BlockStateSnapshotResult; import io.papermc.lib.features.blockstatesnapshot.BlockStateSnapshotResult;
import me.mrCookieSlime.Slimefun.api.Slimefun;
/** /**
* The {@link BlockDataService} is similar to the {@link CustomItemDataService}, * The {@link BlockDataService} is similar to the {@link CustomItemDataService},
@ -27,7 +34,7 @@ import io.papermc.lib.features.blockstatesnapshot.BlockStateSnapshotResult;
* @author TheBusyBiscuit * @author TheBusyBiscuit
* *
*/ */
public class BlockDataService implements PersistentDataService, Keyed { public class BlockDataService implements Keyed {
private final NamespacedKey namespacedKey; private final NamespacedKey namespacedKey;
@ -62,14 +69,27 @@ public class BlockDataService implements PersistentDataService, Keyed {
Validate.notNull(b, "The block cannot be null!"); Validate.notNull(b, "The block cannot be null!");
Validate.notNull(value, "The value 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(); BlockState state = result.getState();
if (state instanceof TileState) { if (state instanceof TileState) {
setString((TileState) state, namespacedKey, value); try {
PersistentDataContainer container = ((TileState) state).getPersistentDataContainer();
container.set(namespacedKey, PersistentDataType.STRING, value);
if (result.isSnapshot()) { if (result.isSnapshot()) {
state.update(); 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(); BlockState state = PaperLib.getBlockState(b, false).getState();
if (state instanceof TileState) { if (state instanceof TileState) {
return getString((TileState) state, namespacedKey); PersistentDataContainer container = ((TileState) state).getPersistentDataContainer();
return Optional.ofNullable(container.get(namespacedKey, PersistentDataType.STRING));
} else { } else {
return Optional.empty(); return Optional.empty();
} }

View File

@ -11,6 +11,8 @@ import org.bukkit.Material;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
@ -26,7 +28,7 @@ import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
* @see SlimefunItemStack * @see SlimefunItemStack
* *
*/ */
public class CustomItemDataService implements PersistentDataService, Keyed { public class CustomItemDataService implements Keyed {
private final NamespacedKey namespacedKey; 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 * This method stores the given id on the provided {@link ItemMeta} via
* persistent data. * persistent data.
* *
* @param im * @param meta
* The {@link ItemMeta} to store data on * The {@link ItemMeta} to store data on
* @param id * @param id
* The id to store on the {@link ItemMeta} * The id to store on the {@link ItemMeta}
*/ */
public void setItemData(@Nonnull ItemMeta im, @Nonnull String id) { public void setItemData(@Nonnull ItemMeta meta, @Nonnull String id) {
Validate.notNull(im, "The ItemMeta cannot be null!"); Validate.notNull(meta, "The ItemMeta cannot be null!");
Validate.notNull(id, "Cannot store null on an ItemMeta!"); 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<String> getItemData(@Nonnull ItemMeta meta) { public Optional<String> getItemData(@Nonnull ItemMeta meta) {
Validate.notNull(meta, "Cannot read data from null!"); Validate.notNull(meta, "Cannot read data from null!");
return getString(meta, namespacedKey); PersistentDataContainer container = meta.getPersistentDataContainer();
return Optional.ofNullable(container.get(namespacedKey, PersistentDataType.STRING));
} }
} }

View File

@ -8,7 +8,6 @@ import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.logging.Level; import java.util.logging.Level;
@ -21,6 +20,8 @@ import org.bukkit.Server;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player; 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.cscorelib2.math.DoubleHandler;
import io.github.thebusybiscuit.slimefun4.core.services.localization.Language; import io.github.thebusybiscuit.slimefun4.core.services.localization.Language;
@ -37,7 +38,7 @@ import me.mrCookieSlime.Slimefun.api.Slimefun;
* @see Language * @see Language
* *
*/ */
public class LocalizationService extends SlimefunLocalization implements PersistentDataService { public class LocalizationService extends SlimefunLocalization {
private static final String LANGUAGE_PATH = "language"; private static final String LANGUAGE_PATH = "language";
@ -151,10 +152,12 @@ public class LocalizationService extends SlimefunLocalization implements Persist
@Override @Override
public Language getLanguage(@Nonnull Player p) { public Language getLanguage(@Nonnull Player p) {
Validate.notNull("Player cannot be null!"); Validate.notNull("Player cannot be null!");
Optional<String> language = getString(p, languageKey);
if (language.isPresent()) { PersistentDataContainer container = p.getPersistentDataContainer();
Language lang = languages.get(language.get()); String language = container.get(languageKey, PersistentDataType.STRING);
if (language != null) {
Language lang = languages.get(language);
if (lang != null) { if (lang != null) {
return lang; return lang;
@ -164,7 +167,7 @@ public class LocalizationService extends SlimefunLocalization implements Persist
return getDefaultLanguage(); return getDefaultLanguage();
} }
private void setLanguage(String language, boolean reset) { private void setLanguage(@Nonnull String language, boolean reset) {
// Clearing out the old Language (if necessary) // Clearing out the old Language (if necessary)
if (reset) { if (reset) {
getConfig().clear(); getConfig().clear();

View File

@ -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<String> getString(Object obj, NamespacedKey key) {
PersistentDataContainer container = ((PersistentDataHolder) obj).getPersistentDataContainer();
return Optional.ofNullable(container.get(key, PersistentDataType.STRING));
}
}

View File

@ -31,14 +31,14 @@ import me.mrCookieSlime.Slimefun.Lists.RecipeType;
* This is an abstract parent class of {@link LocalizationService}. * This is an abstract parent class of {@link LocalizationService}.
* There is not really much more I can say besides that... * There is not really much more I can say besides that...
* *
* @author TheBusyBiscui * @author TheBusyBiscuit
* *
* @see LocalizationService * @see LocalizationService
* *
*/ */
public abstract class SlimefunLocalization extends Localization implements Keyed { public abstract class SlimefunLocalization extends Localization implements Keyed {
public SlimefunLocalization(@Nonnull SlimefunPlugin plugin) { protected SlimefunLocalization(@Nonnull SlimefunPlugin plugin) {
super(plugin); super(plugin);
} }
@ -71,6 +71,15 @@ public abstract class SlimefunLocalization extends Localization implements Keyed
*/ */
public abstract Language getDefaultLanguage(); 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); protected abstract boolean hasLanguage(@Nonnull String id);
/** /**
@ -82,10 +91,23 @@ public abstract class SlimefunLocalization extends Localization implements Keyed
@Nonnull @Nonnull
public abstract Collection<Language> getLanguages(); public abstract Collection<Language> 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); 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() { protected void loadEmbeddedLanguages() {
for (SupportedLanguage lang : SupportedLanguage.valuesCache) { for (SupportedLanguage lang : SupportedLanguage.values()) {
if (lang.isReadyForRelease() || SlimefunPlugin.getUpdater().getBranch() != SlimefunBranch.STABLE) { if (lang.isReadyForRelease() || SlimefunPlugin.getUpdater().getBranch() != SlimefunBranch.STABLE) {
addLanguage(lang.getLanguageId(), lang.getTexture()); addLanguage(lang.getLanguageId(), lang.getTexture());
} }

View File

@ -58,8 +58,6 @@ enum SupportedLanguage {
MACEDONIAN("mk", false, "a0e0b0b5d87a855466980a101a757bcdb5f77d9f7287889f3efa998ee0472fc0"), MACEDONIAN("mk", false, "a0e0b0b5d87a855466980a101a757bcdb5f77d9f7287889f3efa998ee0472fc0"),
TAGALOG("tl", true, "9306c0c1ce6a9c61bb42a572c49e6d0ed20e0e6b3d122cc64c339cbf78e9e937"); TAGALOG("tl", true, "9306c0c1ce6a9c61bb42a572c49e6d0ed20e0e6b3d122cc64c339cbf78e9e937");
public static final SupportedLanguage[] valuesCache = values();
private final String id; private final String id;
private final boolean releaseReady; private final boolean releaseReady;
private final String textureHash; private final String textureHash;
@ -71,11 +69,22 @@ enum SupportedLanguage {
this.textureHash = textureHash; this.textureHash = textureHash;
} }
/**
* This returns the id of this {@link Language}.
*
* @return
*/
@Nonnull @Nonnull
public String getLanguageId() { public String getLanguageId() {
return id; 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() { public boolean isReadyForRelease() {
return releaseReady; return releaseReady;
} }

View File

@ -101,9 +101,6 @@ public class ThirdPartyPluginService {
// mcMMO Integration // mcMMO Integration
if (isPluginInstalled("mcMMO")) { if (isPluginInstalled("mcMMO")) {
try { try {
// This makes sure that the FakeEvent interface is present.
// Class.forName("com.gmail.nossr50.events.fake.FakeEvent");
new McMMOIntegration(plugin); new McMMOIntegration(plugin);
isMcMMOInstalled = true; isMcMMOInstalled = true;
} catch (Exception | LinkageError x) { } catch (Exception | LinkageError x) {
@ -170,7 +167,7 @@ public class ThirdPartyPluginService {
* @return Whether this is a fake event * @return Whether this is a fake event
*/ */
public boolean isEventFaked(@Nonnull Event 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; return isMcMMOInstalled && event instanceof FakeBlockBreakEvent;
} }

View File

@ -31,6 +31,9 @@ import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
*/ */
public class RadioactiveItem extends SlimefunItem implements Radioactive, NotPlaceable { public class RadioactiveItem extends SlimefunItem implements Radioactive, NotPlaceable {
/**
* This is the level of {@link Radioactivity} for this {@link SlimefunItem}
*/
private final Radioactivity radioactivity; private final Radioactivity radioactivity;
/** /**

View File

@ -57,7 +57,7 @@ public class FisherAndroid extends ProgrammableAndroid {
if (ThreadLocalRandom.current().nextInt(100) < 10 * getTier()) { if (ThreadLocalRandom.current().nextInt(100) < 10 * getTier()) {
ItemStack drop = fishingLoot.getRandom(); ItemStack drop = fishingLoot.getRandom();
menu.pushItem(drop, getOutputSlots()); menu.pushItem(drop.clone(), getOutputSlots());
} }
} }

View File

@ -807,12 +807,8 @@ public class ProgrammableAndroid extends SlimefunItem implements InventoryBlock,
} }
private void constructMenu(@Nonnull BlockMenuPreset preset) { private void constructMenu(@Nonnull BlockMenuPreset preset) {
for (int i : BORDER) { preset.drawBackground(BORDER);
preset.addItem(i, ChestMenuUtils.getBackground(), ChestMenuUtils.getEmptyClickHandler()); preset.drawBackground(ChestMenuUtils.getOutputSlotTexture(), OUTPUT_BORDER);
}
for (int i : OUTPUT_BORDER) {
preset.addItem(i, ChestMenuUtils.getOutputSlotTexture(), ChestMenuUtils.getEmptyClickHandler());
}
for (int i : getOutputSlots()) { for (int i : getOutputSlots()) {
preset.addMenuClickHandler(i, new AdvancedMenuClickHandler() { 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) { 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 -> { BlockData blockData = Material.PLAYER_HEAD.createBlockData(data -> {
if (data instanceof Rotatable) { if (data instanceof Rotatable) {
Rotatable rotatable = ((Rotatable) data); Rotatable rotatable = ((Rotatable) data);

View File

@ -11,7 +11,7 @@ import io.github.thebusybiscuit.slimefun4.core.handlers.BlockPlaceHandler;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import io.github.thebusybiscuit.slimefun4.utils.ChatUtils; import io.github.thebusybiscuit.slimefun4.utils.ChatUtils;
import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils; 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.HeadTexture;
import io.github.thebusybiscuit.slimefun4.utils.NumberUtils; import io.github.thebusybiscuit.slimefun4.utils.NumberUtils;
import me.mrCookieSlime.Slimefun.Lists.RecipeType; 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.replaceExistingItem(slotCurrent, new CustomItem(HeadTexture.CHEST_TERMINAL.getAsItemStack(), "&bChannel ID: &3" + (channel + 1)));
menu.addMenuClickHandler(slotCurrent, ChestMenuUtils.getEmptyClickHandler()); menu.addMenuClickHandler(slotCurrent, ChestMenuUtils.getEmptyClickHandler());
} else { } 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()); menu.addMenuClickHandler(slotCurrent, ChestMenuUtils.getEmptyClickHandler());
} }

View File

@ -1,5 +1,7 @@
package io.github.thebusybiscuit.slimefun4.implementation.items.cargo; package io.github.thebusybiscuit.slimefun4.implementation.items.cargo;
import javax.annotation.Nonnull;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
@ -107,22 +109,12 @@ public class ReactorAccessPort extends SlimefunItem {
}); });
} }
private void constructMenu(BlockMenuPreset preset) { private void constructMenu(@Nonnull BlockMenuPreset preset) {
for (int i : background) { preset.drawBackground(ChestMenuUtils.getBackground(), background);
preset.addItem(i, ChestMenuUtils.getBackground(), ChestMenuUtils.getEmptyClickHandler());
}
for (int i : fuelBorder) { preset.drawBackground(new CustomItem(Material.LIME_STAINED_GLASS_PANE, " "), fuelBorder);
preset.addItem(i, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), " "), ChestMenuUtils.getEmptyClickHandler()); preset.drawBackground(new CustomItem(Material.CYAN_STAINED_GLASS_PANE, " "), inputBorder);
} preset.drawBackground(new CustomItem(Material.GREEN_STAINED_GLASS_PANE, " "), outputBorder);
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.addItem(1, new CustomItem(SlimefunItems.URANIUM, "&7Fuel Slot", "", "&rThis Slot accepts radioactive Fuel such as:", "&2Uranium &ror &aNeptunium"), ChestMenuUtils.getEmptyClickHandler()); 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()); preset.addItem(22, new CustomItem(SlimefunItems.PLUTONIUM, "&7Byproduct Slot", "", "&rThis Slot contains the Reactor's Byproduct", "&rsuch as &aNeptunium &ror &7Plutonium"), ChestMenuUtils.getEmptyClickHandler());

View File

@ -66,17 +66,9 @@ public abstract class AbstractEntityAssembler<T extends Entity> extends SimpleSl
@Override @Override
public void init() { public void init() {
for (int i : border) { drawBackground(border);
addItem(i, ChestMenuUtils.getBackground(), ChestMenuUtils.getEmptyClickHandler()); drawBackground(new CustomItem(getHeadBorder(), " "), headBorder);
} drawBackground(new CustomItem(getBodyBorder(), " "), bodyBorder);
for (int i : headBorder) {
addItem(i, new CustomItem(getHeadBorder(), " "), ChestMenuUtils.getEmptyClickHandler());
}
for (int i : bodyBorder) {
addItem(i, new CustomItem(getBodyBorder(), " "), ChestMenuUtils.getEmptyClickHandler());
}
constructMenu(this); constructMenu(this);
} }

View File

@ -7,8 +7,13 @@ import java.util.concurrent.ThreadLocalRandom;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.stream.Collectors; 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.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.slimefun4.api.items.ItemSetting; 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.Slimefun;
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; 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 { public class MagicianTalisman extends Talisman {
private final Set<TalismanEnchantment> enchantments = new HashSet<>(); private final Set<TalismanEnchantment> enchantments = new HashSet<>();
@ParametersAreNonnullByDefault
public MagicianTalisman(SlimefunItemStack item, ItemStack[] recipe) { public MagicianTalisman(SlimefunItemStack item, ItemStack[] recipe) {
super(item, recipe, false, false, "magician", 80); super(item, recipe, false, false, "magician", 80);
@ -47,13 +60,31 @@ public class MagicianTalisman extends Talisman {
* *
* @return An applicable {@link TalismanEnchantment} or null * @return An applicable {@link TalismanEnchantment} or null
*/ */
public TalismanEnchantment getRandomEnchantment(ItemStack item) { @Nullable
if (item == null || item.getType() == Material.AIR) { public TalismanEnchantment getRandomEnchantment(@Nonnull ItemStack item, @Nonnull Set<Enchantment> existingEnchantments) {
return null; Validate.notNull(item, "The ItemStack cannot be null");
} Validate.notNull(existingEnchantments, "The Enchantments Set cannot be null");
// @formatter:off
List<TalismanEnchantment> enabled = enchantments.stream()
.filter(e -> e.getEnchantment().canEnchantItem(item))
.filter(e -> hasConflicts(existingEnchantments, e))
.filter(TalismanEnchantment::getValue)
.collect(Collectors.toList());
// @formatter:on
List<TalismanEnchantment> 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())); return enabled.isEmpty() ? null : enabled.get(ThreadLocalRandom.current().nextInt(enabled.size()));
} }
@ParametersAreNonnullByDefault
private boolean hasConflicts(Set<Enchantment> enchantments, TalismanEnchantment ench) {
for (Enchantment existing : enchantments) {
if (existing.conflictsWith(ench.getEnchantment())) {
return false;
}
}
return true;
}
} }

View File

@ -5,8 +5,8 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Map;
import java.util.Random; import java.util.Random;
import java.util.Set;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@ -243,26 +243,27 @@ public class TalismanListener implements Listener {
@EventHandler @EventHandler
public void onEnchant(EnchantItemEvent e) { public void onEnchant(EnchantItemEvent e) {
Random random = ThreadLocalRandom.current(); Random random = ThreadLocalRandom.current();
Map<Enchantment, Integer> enchantments = e.getEnchantsToAdd();
// Magician Talisman
if (Talisman.tryActivate(e, SlimefunItems.TALISMAN_MAGICIAN)) { if (Talisman.tryActivate(e, SlimefunItems.TALISMAN_MAGICIAN)) {
MagicianTalisman talisman = (MagicianTalisman) SlimefunItems.TALISMAN_MAGICIAN.getItem(); MagicianTalisman talisman = (MagicianTalisman) SlimefunItems.TALISMAN_MAGICIAN.getItem();
TalismanEnchantment enchantment = talisman.getRandomEnchantment(e.getItem()); TalismanEnchantment enchantment = talisman.getRandomEnchantment(e.getItem(), enchantments.keySet());
if (enchantment != null) { 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)) { // Wizard Talisman
Set<Enchantment> enchantments = e.getEnchantsToAdd().keySet(); if (!enchantments.containsKey(Enchantment.SILK_TOUCH) && Enchantment.LOOT_BONUS_BLOCKS.canEnchantItem(e.getItem()) && Talisman.tryActivate(e, SlimefunItems.TALISMAN_WIZARD)) {
for (Enchantment enchantment : enchantments.keySet()) {
for (Enchantment enchantment : enchantments) {
if (random.nextInt(100) < 40) { if (random.nextInt(100) < 40) {
e.getEnchantsToAdd().put(enchantment, random.nextInt(3) + 1); 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);
} }
} }

View File

@ -2,7 +2,6 @@ package io.github.thebusybiscuit.slimefun4.implementation.listeners.crafting;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import org.bukkit.block.BrewingStand;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Event.Result; import org.bukkit.event.Event.Result;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -15,8 +14,8 @@ import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
/** /**
* This {@link Listener} prevents any {@link SlimefunItem} from being used in a * This {@link Listener} prevents any {@link SlimefunItem} from being used in an
* {@link BrewingStand}. * anvil.
* *
* @author TheBusyBiscuit * @author TheBusyBiscuit
* *

View File

@ -17,7 +17,7 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
/** /**
* This {@link Listener} prevents any {@link SlimefunItem} from being used in a * This {@link Listener} prevents any {@link SlimefunItem} from being used in a
* {@link BrewingStand}. * brewing stand.
* *
* @author VoidAngel * @author VoidAngel
* @author SoSeDiK * @author SoSeDiK

View File

@ -21,7 +21,7 @@ public class TalismanEnchantment extends ItemSetting<Boolean> {
private final int level; private final int level;
public TalismanEnchantment(@Nonnull Enchantment enchantment, 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.enchantment = enchantment;
this.level = level; this.level = level;

View File

@ -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.SeismicAxe;
import io.github.thebusybiscuit.slimefun4.implementation.items.weapons.SwordOfBeheading; import io.github.thebusybiscuit.slimefun4.implementation.items.weapons.SwordOfBeheading;
import io.github.thebusybiscuit.slimefun4.implementation.items.weapons.VampireBlade; 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.HeadTexture;
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils; import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
import me.mrCookieSlime.Slimefun.Lists.RecipeType; 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 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 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); .register(plugin);
new RainbowBlock(categories.magicalGadgets, SlimefunItems.RAINBOW_GLASS, RecipeType.ANCIENT_ALTAR, 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 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); .register(plugin);
new RainbowBlock(categories.magicalGadgets, SlimefunItems.RAINBOW_GLASS_PANE, RecipeType.ANCIENT_ALTAR, 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 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); .register(plugin);
new RainbowBlock(categories.magicalGadgets, SlimefunItems.RAINBOW_CLAY, RecipeType.ANCIENT_ALTAR, 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 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); .register(plugin);
new RainbowBlock(categories.magicalGadgets, SlimefunItems.RAINBOW_CONCRETE, RecipeType.ANCIENT_ALTAR, 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 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); .register(plugin);
new RainbowBlock(categories.magicalGadgets, SlimefunItems.RAINBOW_GLAZED_TERRACOTTA, RecipeType.ANCIENT_ALTAR, 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 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); .register(plugin);
// Christmas // Christmas

View File

@ -7,6 +7,7 @@ import java.util.List;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.DyeColor;
import org.bukkit.Material; import org.bukkit.Material;
import io.github.thebusybiscuit.slimefun4.utils.tags.SlimefunTag; import io.github.thebusybiscuit.slimefun4.utils.tags.SlimefunTag;
@ -20,20 +21,14 @@ import io.github.thebusybiscuit.slimefun4.utils.tags.SlimefunTag;
* @see SlimefunTag * @see SlimefunTag
* *
*/ */
public final class ColoredMaterials { public enum ColoredMaterial {
/**
* We don't want any instances of this class, so we set the
* constructor to be private.
*/
private ColoredMaterials() {}
// @formatter:off (We want this to stay formatted like this) // @formatter:off (We want this to stay formatted like this)
/** /**
* This {@link List} contains all wool colors ordered by their appearance ingame. * This {@link List} contains all wool colors ordered by their appearance ingame.
*/ */
public static final List<Material> WOOL = asList(new Material[] { WOOL(new Material[] {
Material.WHITE_WOOL, Material.WHITE_WOOL,
Material.ORANGE_WOOL, Material.ORANGE_WOOL,
Material.MAGENTA_WOOL, Material.MAGENTA_WOOL,
@ -50,12 +45,12 @@ public final class ColoredMaterials {
Material.GREEN_WOOL, Material.GREEN_WOOL,
Material.RED_WOOL, Material.RED_WOOL,
Material.BLACK_WOOL Material.BLACK_WOOL
}); }),
/** /**
* This {@link List} contains all stained glass colors ordered by their appearance ingame. * This {@link List} contains all stained glass colors ordered by their appearance ingame.
*/ */
public static final List<Material> STAINED_GLASS = asList(new Material[] { STAINED_GLASS(new Material[] {
Material.WHITE_STAINED_GLASS, Material.WHITE_STAINED_GLASS,
Material.ORANGE_STAINED_GLASS, Material.ORANGE_STAINED_GLASS,
Material.MAGENTA_STAINED_GLASS, Material.MAGENTA_STAINED_GLASS,
@ -72,12 +67,12 @@ public final class ColoredMaterials {
Material.GREEN_STAINED_GLASS, Material.GREEN_STAINED_GLASS,
Material.RED_STAINED_GLASS, Material.RED_STAINED_GLASS,
Material.BLACK_STAINED_GLASS Material.BLACK_STAINED_GLASS
}); }),
/** /**
* This {@link List} contains all stained glass pane colors ordered by their appearance ingame. * This {@link List} contains all stained glass pane colors ordered by their appearance ingame.
*/ */
public static final List<Material> STAINED_GLASS_PANE = asList(new Material[] { STAINED_GLASS_PANE(new Material[] {
Material.WHITE_STAINED_GLASS_PANE, Material.WHITE_STAINED_GLASS_PANE,
Material.ORANGE_STAINED_GLASS_PANE, Material.ORANGE_STAINED_GLASS_PANE,
Material.MAGENTA_STAINED_GLASS_PANE, Material.MAGENTA_STAINED_GLASS_PANE,
@ -94,12 +89,12 @@ public final class ColoredMaterials {
Material.GREEN_STAINED_GLASS_PANE, Material.GREEN_STAINED_GLASS_PANE,
Material.RED_STAINED_GLASS_PANE, Material.RED_STAINED_GLASS_PANE,
Material.BLACK_STAINED_GLASS_PANE Material.BLACK_STAINED_GLASS_PANE
}); }),
/** /**
* This {@link List} contains all terracotta colors ordered by their appearance ingame. * This {@link List} contains all terracotta colors ordered by their appearance ingame.
*/ */
public static final List<Material> TERRACOTTA = asList(new Material[] { TERRACOTTA(new Material[] {
Material.WHITE_TERRACOTTA, Material.WHITE_TERRACOTTA,
Material.ORANGE_TERRACOTTA, Material.ORANGE_TERRACOTTA,
Material.MAGENTA_TERRACOTTA, Material.MAGENTA_TERRACOTTA,
@ -116,12 +111,12 @@ public final class ColoredMaterials {
Material.GREEN_TERRACOTTA, Material.GREEN_TERRACOTTA,
Material.RED_TERRACOTTA, Material.RED_TERRACOTTA,
Material.BLACK_TERRACOTTA Material.BLACK_TERRACOTTA
}); }),
/** /**
* This {@link List} contains all glazed terracotta colors ordered by their appearance ingame. * This {@link List} contains all glazed terracotta colors ordered by their appearance ingame.
*/ */
public static final List<Material> GLAZED_TERRACOTTA = asList(new Material[] { GLAZED_TERRACOTTA(new Material[] {
Material.WHITE_GLAZED_TERRACOTTA, Material.WHITE_GLAZED_TERRACOTTA,
Material.ORANGE_GLAZED_TERRACOTTA, Material.ORANGE_GLAZED_TERRACOTTA,
Material.MAGENTA_GLAZED_TERRACOTTA, Material.MAGENTA_GLAZED_TERRACOTTA,
@ -138,12 +133,12 @@ public final class ColoredMaterials {
Material.GREEN_GLAZED_TERRACOTTA, Material.GREEN_GLAZED_TERRACOTTA,
Material.RED_GLAZED_TERRACOTTA, Material.RED_GLAZED_TERRACOTTA,
Material.BLACK_GLAZED_TERRACOTTA Material.BLACK_GLAZED_TERRACOTTA
}); }),
/** /**
* This {@link List} contains all concrete colors ordered by their appearance ingame. * This {@link List} contains all concrete colors ordered by their appearance ingame.
*/ */
public static final List<Material> CONCRETE = asList(new Material[] { CONCRETE(new Material[] {
Material.WHITE_CONCRETE, Material.WHITE_CONCRETE,
Material.ORANGE_CONCRETE, Material.ORANGE_CONCRETE,
Material.MAGENTA_CONCRETE, Material.MAGENTA_CONCRETE,
@ -164,12 +159,38 @@ public final class ColoredMaterials {
// @formatter:on // @formatter:on
@Nonnull private final List<Material> list;
private static List<Material> asList(@Nonnull Material[] materials) {
/**
* 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.noNullElements(materials, "The List cannot contain any null elements");
Validate.isTrue(materials.length == 16, "Expected 16, received: " + materials.length + ". Did you miss a color?"); 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<Material> 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());
} }
} }

View File

@ -19,7 +19,7 @@ import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow;
* @deprecated This interface is not designed to be used by addons. * @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 { public interface InventoryBlock {
/** /**

View File

@ -15,6 +15,7 @@ import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow; 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."); 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 @Override
public ChestMenu addItem(int slot, @Nullable ItemStack item) { public ChestMenu addItem(int slot, @Nullable ItemStack item) {
checkIfLocked(); checkIfLocked();

View File

@ -6,7 +6,7 @@ slimefun:
food: 食物 food: 食物
basic_machines: 基礎機器 basic_machines: 基礎機器
electricity: 電力與能源 electricity: 電力與能源
gps: GPS機械 gps: GPS 機械
armor: 盔甲 armor: 盔甲
magical_items: 魔法物品 magical_items: 魔法物品
magical_gadgets: 魔法工具 magical_gadgets: 魔法工具
@ -21,6 +21,6 @@ slimefun:
christmas: 聖誕節 christmas: 聖誕節
valentines_day: 西洋情人節 valentines_day: 西洋情人節
easter: 復活節 easter: 復活節
birthday: TheBusyBiscuit的生日(10月26日) birthday: TheBusyBiscuit 的生日(10 26 日)
halloween: 萬聖節 halloween: 萬聖節
androids: 可編輯的機器人 androids: 可編輯的機器人

View File

@ -245,9 +245,9 @@ messages:
no-tome-yourself: "&cلا يمكنك إستعمال &4القاموس &cعلى نفسك..." no-tome-yourself: "&cلا يمكنك إستعمال &4القاموس &cعلى نفسك..."
not-online: "&4%player% &cغير متصل!" not-online: "&4%player% &cغير متصل!"
not-researched: "&4لا تملك خبرة لفهم هذا الأمر" not-researched: "&4لا تملك خبرة لفهم هذا الأمر"
not-valid-amount: "&4%amount% &cليست قيمة صحيحة: يجب أن تكون أكثر من صفر!" invalid-amount: "&4%amount% &cليست قيمة صحيحة: يجب أن تكون أكثر من صفر!"
not-valid-item: "&4%item% &cليس عنصر صحيح!" invalid-item: "&4%item% &cليس عنصر صحيح!"
not-valid-research: "&4%research% &cليس بحث صحيح!" invalid-research: "&4%research% &cليس بحث صحيح!"
only-players: "&4هذا الأمر لللاعبين فقط" only-players: "&4هذا الأمر لللاعبين فقط"
opening-backpack: "&bيتم فتح الحقيبة، قد تستغرق ثوان..." opening-backpack: "&bيتم فتح الحقيبة، قد تستغرق ثوان..."
opening-guide: "&bيتم فتح الكتيب، قد يستغرق ثوان..." opening-guide: "&bيتم فتح الكتيب، قد يستغرق ثوان..."

View File

@ -100,11 +100,11 @@ messages:
no-permission: "&4Na tohle nemáš dostatečné povolení" no-permission: "&4Na tohle nemáš dostatečné povolení"
usage: "&4Použití: &c%usage%" usage: "&4Použití: &c%usage%"
not-online: "&4%player% &czrovna není připojen!" not-online: "&4%player% &czrovna není připojen!"
not-valid-item: "&4%item% &cnení platný item!" invalid-item: "&4%item% &cnení platný item!"
not-valid-amount: "&4%amount% &cnení platné číslo : musí být větší než 0!" invalid-amount: "&4%amount% &cnení platné číslo : musí být větší než 0!"
given-item: '&bDostal jsi &a%amount% &7"%item%&7"' given-item: '&bDostal jsi &a%amount% &7"%item%&7"'
give-item: '&bDal jsi %player% &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"' give-research: '&bUdělil jsi %player% výzkum &7"%research%&7"'
hungry: "&cJsi moc hladový na to, abys to zvládl!" hungry: "&cJsi moc hladový na to, abys to zvládl!"
disabled-in-world: "&4&lTahle věc není v tomhle světě povolená" disabled-in-world: "&4&lTahle věc není v tomhle světě povolená"

View File

@ -108,11 +108,11 @@ messages:
no-permission: "&4Du hast nicht die benötigten Rechte hierfür" no-permission: "&4Du hast nicht die benötigten Rechte hierfür"
usage: "&4Korrekte Schreibweise: &c%usage%" usage: "&4Korrekte Schreibweise: &c%usage%"
not-online: "&4%player% &cist derzeit nicht online!" not-online: "&4%player% &cist derzeit nicht online!"
not-valid-item: "&4%item% &cist kein gültiges Item!" invalid-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-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' given-item: '&bDir wurde &a%amount% &7mal "%item%&7" gegeben'
give-item: '&bDu hast %player% &a%amount% &7"%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' give-research: '&bDu hast %player% den Erfahrungsgrad &7"%research%&7" vergeben'
hungry: "&cDu bist zu hungrig, um dies zu tun!" hungry: "&cDu bist zu hungrig, um dies zu tun!"
disabled-in-world: "&4&lDieses Item wurde in dieser Welt deaktiviert!" disabled-in-world: "&4&lDieses Item wurde in dieser Welt deaktiviert!"

View File

@ -120,11 +120,11 @@ messages:
no-permission: '&4You do not have the required permission to do this' no-permission: '&4You do not have the required permission to do this'
usage: '&4Usage: &c%usage%' usage: '&4Usage: &c%usage%'
not-online: '&4%player% &cis not online!' not-online: '&4%player% &cis not online!'
not-valid-item: '&4%item% &cis not a valid Item!' invalid-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-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"' given-item: '&bYou have been given &a%amount% &7"%item%&7"'
give-item: '&bYou have given %player% &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"' give-research: '&bYou have given %player% the Research &7"%research%&7"'
hungry: '&cYou are too hungry to do that!' hungry: '&cYou are too hungry to do that!'
disabled-in-world: '&4&lThis Item has been disabled in this world' disabled-in-world: '&4&lThis Item has been disabled in this world'

View File

@ -102,12 +102,12 @@ messages:
no-permission: "&4No tienes el permiso requerido para hacer esto." no-permission: "&4No tienes el permiso requerido para hacer esto."
usage: "&4Uso: &c%usage%" usage: "&4Uso: &c%usage%"
not-online: "&c¡&4%player% &cno está conectado!" not-online: "&c¡&4%player% &cno está conectado!"
not-valid-item: "&c¡&4%item% &cno es un objeto válido!" invalid-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-amount: "&c¡&4%amount% &cno es un valor válido: tiene que ser mayor a
0!" 0!"
given-item: '&bTe han dado &a%amount% &7"%item%&7"' given-item: '&bTe han dado &a%amount% &7"%item%&7"'
give-item: '&bLe has dado a %player%, &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"' give-research: '&bLe has dado a %player% la investigación &7"%research%&7"'
hungry: "&c¡Tienes demasiada hambre para hacer eso!" hungry: "&c¡Tienes demasiada hambre para hacer eso!"
disabled-in-world: "&4&lEste item ha sido desactivado en el mundo." disabled-in-world: "&4&lEste item ha sido desactivado en el mundo."

View File

@ -110,12 +110,12 @@ messages:
no-permission: "&4Vous n'avez pas les permissions requises pour faire ceci" no-permission: "&4Vous n'avez pas les permissions requises pour faire ceci"
usage: "&4Utilisation: &c%usage%" usage: "&4Utilisation: &c%usage%"
not-online: "&4%player% &cn'est pas en ligne!" not-online: "&4%player% &cn'est pas en ligne!"
not-valid-item: "&4%item% &cn'est pas un item valide!" invalid-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-amount: "&4%amount% &cn'est pas un montant valide: il doit être supérieur
à 0!" à 0!"
given-item: '&bVous avez reçu &a%amount%&7 "%item%&7"' given-item: '&bVous avez reçu &a%amount%&7 "%item%&7"'
give-item: '&bVous avez donné &a%amount% &7"%item%&7" à %player%' 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%' give-research: '&bVous avez débloqué la recherche "%research%&7" à %player%'
hungry: "&cVous avez trop faim pour faire ça!" hungry: "&cVous avez trop faim pour faire ça!"
disabled-in-world: "&4&lCet item a été désactivé dans ce monde" disabled-in-world: "&4&lCet item a été désactivé dans ce monde"

View File

@ -106,11 +106,11 @@ messages:
no-permission: "&4Ehhez nincs jogod" no-permission: "&4Ehhez nincs jogod"
usage: "&4Használat: &c%usage%" usage: "&4Használat: &c%usage%"
not-online: "&4%player% &cjelenleg nem elérhető!" not-online: "&4%player% &cjelenleg nem elérhető!"
not-valid-item: "&4%item% &cnem megfelelő tárgy!" invalid-item: "&4%item% &cnem megfelelő tárgy!"
not-valid-amount: "&4%amount% &cnem megfelelő mennyiség: 0-nál nagyobbnak kell lennie!" 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' 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' 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' give-research: '&bMegadtad %player% játékosnak a(z) &7"%research%&7" &bkutatást'
hungry: "&cTúl éhes vagy ehhez!" hungry: "&cTúl éhes vagy ehhez!"
disabled-in-world: "&4&lEz a tárgy tiltva van ebben a világban" disabled-in-world: "&4&lEz a tárgy tiltva van ebben a világban"

View File

@ -83,11 +83,11 @@ messages:
no-permission: "&4Anda Tidak Memiliki Izin Untuk Ini" no-permission: "&4Anda Tidak Memiliki Izin Untuk Ini"
usage: "&4Penggunaan: &c%usage%" usage: "&4Penggunaan: &c%usage%"
not-online: "&4%player% &cTidak Sedang Bermain Disini!" not-online: "&4%player% &cTidak Sedang Bermain Disini!"
not-valid-item: "&4%item% &cBenda Ini Tidak sah" invalid-item: "&4%item% &cBenda Ini Tidak sah"
not-valid-amount: "&4%amount% &cJumlah Ini Salah : Harus Lebih Tinggi Dari 0!" invalid-amount: "&4%amount% &cJumlah Ini Salah : Harus Lebih Tinggi Dari 0!"
given-item: '&bAnda Telah Diberikan &a%amount% &7"%item%&7"' given-item: '&bAnda Telah Diberikan &a%amount% &7"%item%&7"'
give-item: '&bAnda Telah Memberi %player% &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"' give-research: '&bAnda Telah Memberi %player% Penelitian &7"%research%&7"'
hungry: "&cAnda Terlalu Lapar Untuk Ini " hungry: "&cAnda Terlalu Lapar Untuk Ini "
mode-change: "&b%device% Mode Telah Berubah Menjadi: &9%mode%" mode-change: "&b%device% Mode Telah Berubah Menjadi: &9%mode%"

View File

@ -249,9 +249,9 @@ messages:
no-tome-yourself: "&cNon puoi utilizzare il &4Tomo della conoscienza &c su te stesso no-tome-yourself: "&cNon puoi utilizzare il &4Tomo della conoscienza &c su te stesso
..." ..."
not-online: "&4%player% &cnon è online!" 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!" 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" only-players: "&4Questo comando è solo per i players"
opening-backpack: "&bAprendo lo zaino, potrebbero essere necessari alcuni secondi opening-backpack: "&bAprendo lo zaino, potrebbero essere necessari alcuni secondi
..." ..."
@ -282,7 +282,7 @@ messages:
unlocked: '&bHai sbloccato &7 "%research%"' unlocked: '&bHai sbloccato &7 "%research%"'
usage: "&4Utilizzo: &c%usage%" usage: "&4Utilizzo: &c%usage%"
not-researched: "&4Non hai abbastanza conoscenze per capirlo!" 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-in-world: "&4&lQuesto oggetto è stato disattivato in questo mondo!"
disabled-item: "&4& lQuesto oggetto è stato disabilitato! Come l'hai ottenuto?" disabled-item: "&4& lQuesto oggetto è stato disabilitato! Come l'hai ottenuto?"
radiation: "&4Sei stato esposto a radiazioni mortali! &cSbarazzati dell'oggetto radiation: "&4Sei stato esposto a radiazioni mortali! &cSbarazzati dell'oggetto

View File

@ -106,11 +106,11 @@ messages:
no-permission: "&4権限がありません" no-permission: "&4権限がありません"
usage: "&4使用法: &c%usage%" usage: "&4使用法: &c%usage%"
not-online: "&4%player% &cはオンラインではありません" not-online: "&4%player% &cはオンラインではありません"
not-valid-item: "&4%item% &cは正しくないアイテムです" invalid-item: "&4%item% &cは正しくないアイテムです"
not-valid-amount: "&4%amount% &cの部分には、正の整数を指定してください" invalid-amount: "&4%amount% &cの部分には、正の整数を指定してください"
given-item: "&b%item%を%amount%個与えられました" given-item: "&b%item%を%amount%個与えられました"
give-item: "&b%player%に%item%を%amount%個与えました" give-item: "&b%player%に%item%を%amount%個与えました"
not-valid-research: "&4%research%&cは正しくないリサーチです" invalid-research: "&4%research%&cは正しくないリサーチです"
give-research: "&b%player%のリサーチ%research%を完了させました" give-research: "&b%player%のリサーチ%research%を完了させました"
hungry: "&c空腹のため使えません" hungry: "&c空腹のため使えません"
disabled-in-world: "&4&lこのワールドでは使用できません" disabled-in-world: "&4&lこのワールドでは使用できません"

View File

@ -90,11 +90,11 @@ messages:
no-permission: "&4이 작업에 필요한 권한이 없습니다." no-permission: "&4이 작업에 필요한 권한이 없습니다."
usage: "&4사용량: &c%usage%\n" usage: "&4사용량: &c%usage%\n"
not-online: "&4%player% &cis가 온라인 상태가 아닙니다!" not-online: "&4%player% &cis가 온라인 상태가 아닙니다!"
not-valid-item: "&4%item% &cis가 올바른 아이템이 아닙니다!" invalid-item: "&4%item% &cis가 올바른 아이템이 아닙니다!"
not-valid-amount: "&4%amount% &cis 유효한 금액이 아닙니다. 0보다 커야 합니다!" invalid-amount: "&4%amount% &cis 유효한 금액이 아닙니다. 0보다 커야 합니다!"
given-item: '&b당신은 &a%amount% &7"%item%&7"을 받았다.' given-item: '&b당신은 &a%amount% &7"%item%&7"을 받았다.'
give-item: '&b%player% &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"을(를) 제공했습니다. give-research: '&b%player%에 Research &7"%research%&7"을(를) 제공했습니다.
' '

View File

@ -56,11 +56,11 @@ messages:
no-permission: "&4Tev šo nav atļauts darīt" no-permission: "&4Tev šo nav atļauts darīt"
usage: "&4Pamācība: &c%usage%" usage: "&4Pamācība: &c%usage%"
not-online: "&4%player%&c nav pieslēdzies!" not-online: "&4%player%&c nav pieslēdzies!"
not-valid-item: "&4%item% &cneeksistē!" invalid-item: "&4%item% &cneeksistē!"
not-valid-amount: "&4%amount% &cnav pareizs daudzums : tam jābūt lielākam par 0!" invalid-amount: "&4%amount% &cnav pareizs daudzums : tam jābūt lielākam par 0!"
given-item: '&bTev iedeva &a%amount% &7"%item%&7"' given-item: '&bTev iedeva &a%amount% &7"%item%&7"'
give-item: '&bTu iedevi %player% &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"' give-research: '&bTu iedevi %player% atklājumu ar nosaukumu &7"%research%&7"'
hungry: "&cTu esi pārāk izsalcis, lai šo darītu!" hungry: "&cTu esi pārāk izsalcis, lai šo darītu!"
mode-change: "&b%device% režīms nomainīts uz &9%mode%" mode-change: "&b%device% režīms nomainīts uz &9%mode%"

View File

@ -83,12 +83,12 @@ messages:
no-permission: "&4Je hebt geen toestemming om deze actie uit te voeren" no-permission: "&4Je hebt geen toestemming om deze actie uit te voeren"
usage: "&4Gebruik, zoals: &c%usage%" usage: "&4Gebruik, zoals: &c%usage%"
not-online: "&4%player% &cis niet online!" not-online: "&4%player% &cis niet online!"
not-valid-item: "&4%item% &cis geen geldig voorwerp!" invalid-item: "&4%item% &cis geen geldig voorwerp!"
not-valid-amount: "&4%amount% &cis geen geldige hoeveelheid: het moet meer zijn invalid-amount: "&4%amount% &cis geen geldige hoeveelheid: het moet meer zijn
dan 0!" dan 0!"
given-item: '&bJe hebt &a%amount% keer &7"%item%&7" ontvangen' given-item: '&bJe hebt &a%amount% keer &7"%item%&7" ontvangen'
give-item: '&bJe hebt %player% &a%amount% keer &7"%item%&7" gegeven' 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' give-research: '&bJe hebt %player% de kennis over &7"%research%&7" gegeven'
hungry: "&cJe hebt teveel honger om zoiets te doen!" hungry: "&cJe hebt teveel honger om zoiets te doen!"
disabled-in-world: "&4&lDit voorwerp is uitgeschakeld in deze wereld" disabled-in-world: "&4&lDit voorwerp is uitgeschakeld in deze wereld"

View File

@ -81,12 +81,12 @@ messages:
no-permission: "&4Brak uprawnień" no-permission: "&4Brak uprawnień"
usage: "&4Użycie: &c%usage%" usage: "&4Użycie: &c%usage%"
not-online: "&4%player% &cnie jest online!" not-online: "&4%player% &cnie jest online!"
not-valid-item: "&4%item% &cnie jest poprawnym przedmiotem!" invalid-item: "&4%item% &cnie jest poprawnym przedmiotem!"
not-valid-amount: "&4%amount% &cnie jest prawidłową ilością: ilość musi być większa invalid-amount: "&4%amount% &cnie jest prawidłową ilością: ilość musi być większa
od 0!" od 0!"
given-item: '&bOtrzymano &a%amount% &7"%item%&7"' given-item: '&bOtrzymano &a%amount% &7"%item%&7"'
give-item: '&bDodano przedmiot do plecaka gracza %player%: &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%' give-research: '&bOdblokowano badanie &7"%research%&7" dla gracza %player%'
hungry: "&cJesteś zbyt głodny, żeby to zrobić!" hungry: "&cJesteś zbyt głodny, żeby to zrobić!"
mode-change: "&bTryb urządzenia %device% został zmieniony na: &9%mode%" mode-change: "&bTryb urządzenia %device% został zmieniony na: &9%mode%"

View File

@ -237,10 +237,10 @@ messages:
no-tome-yourself: "&cVocê não pode usar o &4Tomo do Conhecimento &cem si mesmo..." no-tome-yourself: "&cVocê não pode usar o &4Tomo do Conhecimento &cem si mesmo..."
not-online: "&4%player% &cnão está online!" not-online: "&4%player% &cnão está online!"
not-researched: "&4Você não tem conhecimento suficiente para entender sobre isso." 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)!" 0)!"
not-valid-item: "&4%item% &cnão é um item válido!" invalid-item: "&4%item% &cnão é um item válido!"
not-valid-research: "&4%research% &cnão é uma Pesquisa válida!" invalid-research: "&4%research% &cnão é uma Pesquisa válida!"
only-players: "&4Este comando é apenas para jogadores" only-players: "&4Este comando é apenas para jogadores"
opening-backpack: "&bAbrindo a mochila, isso pode levar alguns segundos..." opening-backpack: "&bAbrindo a mochila, isso pode levar alguns segundos..."
opening-guide: "&bAbrindo o guia, isso pode levar alguns segundos..." opening-guide: "&bAbrindo o guia, isso pode levar alguns segundos..."

View File

@ -107,12 +107,12 @@ messages:
no-permission: "&4У Вас недостаточно прав, чтобы сделать это" no-permission: "&4У Вас недостаточно прав, чтобы сделать это"
usage: "&4Использование: &c%usage%" usage: "&4Использование: &c%usage%"
not-online: "&4%player% &cсейчас не в игре!" not-online: "&4%player% &cсейчас не в игре!"
not-valid-item: "&4%item% &cне является допустимым предметом!" invalid-item: "&4%item% &cне является допустимым предметом!"
not-valid-amount: "&4%amount% &cне является допустимым числом: количество должно invalid-amount: "&4%amount% &cне является допустимым числом: количество должно
быть больше нуля!" быть больше нуля!"
given-item: '&bВам выдали &a%amount% &7"%item%&7"' given-item: '&bВам выдали &a%amount% &7"%item%&7"'
give-item: '&bВы выдали игроку %player% &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"' give-research: '&bВы выдали игроку %player% исследование &7"%research%&7"'
hungry: "&cВы слишком голодны для этого!" hungry: "&cВы слишком голодны для этого!"
disabled-in-world: "&4&lДанный предмет отключен в этом мире" disabled-in-world: "&4&lДанный предмет отключен в этом мире"

View File

@ -251,9 +251,9 @@ messages:
no-tome-yourself: "&cNemôžeš použiť &4Knihu vedomostí &cna seba..." no-tome-yourself: "&cNemôžeš použiť &4Knihu vedomostí &cna seba..."
not-online: "&4%player% &cnie je online!" not-online: "&4%player% &cnie je online!"
not-researched: "&4Nemáš toľko vedomostí aby si tomu porozumel" 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!" invalid-amount: "&4%amount% &cnie je platné množstvo: Musí byť väčšie ako 0!"
not-valid-item: "&4%item% &cnie je platný item!" invalid-item: "&4%item% &cnie je platný item!"
not-valid-research: "&4%research% &cnie je platný výskum!" invalid-research: "&4%research% &cnie je platný výskum!"
only-players: "&4Tento príkaz je iba pre hráčov" only-players: "&4Tento príkaz je iba pre hráčov"
opening-backpack: "&bOtváram batoh, môže to trvať pár sekúnd..." 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..." opening-guide: "&bOtváram príručku, môže to trvať pár sekúnd..."

View File

@ -250,10 +250,10 @@ messages:
no-tome-yourself: "&cDu kan inte använda &4Tome of Knowledge &cpå dig själv" no-tome-yourself: "&cDu kan inte använda &4Tome of Knowledge &cpå dig själv"
not-online: "&4%player% &cär inte online!" not-online: "&4%player% &cär inte online!"
not-researched: "&4Du har inte tillräckligt mycket kunskap för att förstå detta" 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!" noll!"
not-valid-item: "&4%item% &cär inget giltigt föremål!" invalid-item: "&4%item% &cär inget giltigt föremål!"
not-valid-research: "&4%research% &cär ingen giltig forskning!" invalid-research: "&4%research% &cär ingen giltig forskning!"
only-players: "&4Detta kommando är endast för spelare" only-players: "&4Detta kommando är endast för spelare"
opening-backpack: "&bÖppnar ryggsäck. Detta kan ta några sekunder..." opening-backpack: "&bÖppnar ryggsäck. Detta kan ta några sekunder..."
opening-guide: "&bÖppnar handboken. Detta kan ta några sekunder..." opening-guide: "&bÖppnar handboken. Detta kan ta några sekunder..."

View File

@ -75,8 +75,8 @@ messages:
unknown-player: "&4ไม่รู้จักผู้เล่น: &c%player%" unknown-player: "&4ไม่รู้จักผู้เล่น: &c%player%"
no-permission: "&4คุณต้องได้รับ permission เพื่อกระทำสิ่งนี้" no-permission: "&4คุณต้องได้รับ permission เพื่อกระทำสิ่งนี้"
not-online: "&4%player% &cไม่ได้ออนไลน์!" not-online: "&4%player% &cไม่ได้ออนไลน์!"
not-valid-item: "&4%item% &cไม่ใช่ไอเทมที่ถูกต้อง!" invalid-item: "&4%item% &cไม่ใช่ไอเทมที่ถูกต้อง!"
not-valid-amount: "&4%amount% &cไม่ใช่จำนวนที่ถูกต้อง : ตัวเลขควรมากกว่า 0!" invalid-amount: "&4%amount% &cไม่ใช่จำนวนที่ถูกต้อง : ตัวเลขควรมากกว่า 0!"
given-item: '&bคุณได้เสก &7"%item%&7" &ax%amount%' given-item: '&bคุณได้เสก &7"%item%&7" &ax%amount%'
give-item: '&bคุณได้เสก &7"%item%&7" &ax%amount% ให้กับ %player%' give-item: '&bคุณได้เสก &7"%item%&7" &ax%amount% ให้กับ %player%'
hungry: "&cคุณหิวเกินไปจะทำเช่นนั้น!" hungry: "&cคุณหิวเกินไปจะทำเช่นนั้น!"
@ -100,7 +100,7 @@ messages:
not-researched: "&4คุณมีความรู้ไม่เพียงพอที่จะเข้าใจสิ่งนี้" not-researched: "&4คุณมีความรู้ไม่เพียงพอที่จะเข้าใจสิ่งนี้"
not-enough-xp: "&4คุณมี XP ไม่เพียงพอที่จะปลดล็อก" not-enough-xp: "&4คุณมี XP ไม่เพียงพอที่จะปลดล็อก"
usage: "&4วิธีใช้: &c%usage%" usage: "&4วิธีใช้: &c%usage%"
not-valid-research: "&4%research% &cนี้ไม่ใช่คำสำหรับการค้นหา!" invalid-research: "&4%research% &cนี้ไม่ใช่คำสำหรับการค้นหา!"
give-research: '&bคุณได้ให้ %player% เรียนรู้&7"%research%&7"' give-research: '&bคุณได้ให้ %player% เรียนรู้&7"%research%&7"'
mode-change: "&b%device% เปลี่ยนโหมดเป็น: &9%mode%" mode-change: "&b%device% เปลี่ยนโหมดเป็น: &9%mode%"
disabled-item: "&4&lไอเท็มถูกปิดการใช้งาน! คุณเอาไอเท็มมาจากไหน?" disabled-item: "&4&lไอเท็มถูกปิดการใช้งาน! คุณเอาไอเท็มมาจากไหน?"

View File

@ -105,12 +105,12 @@ messages:
no-permission: "&4Wala kang permiso para gawin ito." no-permission: "&4Wala kang permiso para gawin ito."
usage: "&4Paggamit: &c%usage%" usage: "&4Paggamit: &c%usage%"
not-online: "&cHindi online si &4%player%!" not-online: "&cHindi online si &4%player%!"
not-valid-item: "&cHindi valid ang &4%item%!" invalid-item: "&cHindi valid ang &4%item%!"
not-valid-amount: "&cHindi valid ang amount na &4%amount% : dapat ito'y mas mataas invalid-amount: "&cHindi valid ang amount na &4%amount% : dapat ito'y mas mataas
kaysa sa 0!" kaysa sa 0!"
given-item: '&bIka''y binigyan ng &a%amount% &7"%item%&7"' given-item: '&bIka''y binigyan ng &a%amount% &7"%item%&7"'
give-item: '&bBinigyan mo si %player% 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"' give-research: '&bBinigyan mo si %player% ng Research &7"%research%&7"'
hungry: "&cIkaw ay sobrang gutom para gawin ito!" hungry: "&cIkaw ay sobrang gutom para gawin ito!"
disabled-in-world: "&4&lDinisable ang Aytem sa world na ito." disabled-in-world: "&4&lDinisable ang Aytem sa world na ito."

View File

@ -108,11 +108,11 @@ messages:
no-permission: "&4Bunu yapmak için gerekli izniniz yok" no-permission: "&4Bunu yapmak için gerekli izniniz yok"
usage: "&4Kullanış: &c%usage%" usage: "&4Kullanış: &c%usage%"
not-online: "&4%player% &coyunda değil!" not-online: "&4%player% &coyunda değil!"
not-valid-item: "&4%item% &cgeçerli bir eşya değil!" invalid-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-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.' given-item: '&a%amount% &badet &7"%item%&7" &bsana verildi.'
give-item: '&b%player% adlı oyuncuya &a%amount% &badet &7"%item%&7" &bverdin.' 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"' 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!" hungry: "&cBunu yapmak için çok açsın!"
disabled-in-world: "&4&lBu eşya bu dünyada devre dışı bırakıldı." disabled-in-world: "&4&lBu eşya bu dünyada devre dışı bırakıldı."

View File

@ -84,12 +84,12 @@ messages:
no-permission: "&4У Вас недостатньо прав для цього" no-permission: "&4У Вас недостатньо прав для цього"
usage: "&4Використання: &c%usage%" usage: "&4Використання: &c%usage%"
not-online: "&4%player% &cзараз не знаходиться у грі!" not-online: "&4%player% &cзараз не знаходиться у грі!"
not-valid-item: "&4%item% &cне є достовірним предметом!" invalid-item: "&4%item% &cне є достовірним предметом!"
not-valid-amount: "&4%amount% &cне є допустимою кількістю: значення повинно бути invalid-amount: "&4%amount% &cне є допустимою кількістю: значення повинно бути
більшим за 0!" більшим за 0!"
given-item: '&bВам видали &a%amount% &7"%item%&7"' given-item: '&bВам видали &a%amount% &7"%item%&7"'
give-item: '&bВи видали гравцю %player% &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"' give-research: '&bВи видали грацю %player% дослідження &7"%research%&7"'
hungry: "&cВи занадто голодні для цього!" hungry: "&cВи занадто голодні для цього!"
mode-change: "&b%device% | Режим змінено на: &9%mode%" mode-change: "&b%device% | Режим змінено на: &9%mode%"

View File

@ -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..." 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-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-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!" invalid-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ệ!" invalid-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-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" 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-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..." opening-guide: "&bĐang mở hướng dẫn, việc này có thể mất một vài giây..."

View File

@ -106,11 +106,11 @@ messages:
no-permission: "&4你没有足够的权限做这个" no-permission: "&4你没有足够的权限做这个"
usage: "&4用法: &c%usage%" usage: "&4用法: &c%usage%"
not-online: "&4%player% &c不在线" not-online: "&4%player% &c不在线"
not-valid-item: "&4%item% &c不是一个有效的物品名!" invalid-item: "&4%item% &c不是一个有效的物品名!"
not-valid-amount: "&4%amount% &ci不是一个有效的数字 : 它必须大于 0!" invalid-amount: "&4%amount% &ci不是一个有效的数字 : 它必须大于 0!"
given-item: '&b你获得了 &a%amount% &7"%item%&7"' given-item: '&b你获得了 &a%amount% &7"%item%&7"'
give-item: '&b成功给予玩家 %player% &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"' give-research: '&b你成功解锁了玩家 %player% 的研究 &7"%research%&7"'
hungry: "&c你太饿了, 先吃点东西再试试吧!" hungry: "&c你太饿了, 先吃点东西再试试吧!"
disabled-in-world: "&4&l这个物品在此世界已被禁用" disabled-in-world: "&4&l这个物品在此世界已被禁用"

View File

@ -20,6 +20,10 @@ commands:
player-never-joined: "&4找不到該ID的玩家" player-never-joined: "&4找不到該ID的玩家"
backpack-does-not-exist: "&4該背包不存在!" backpack-does-not-exist: "&4該背包不存在!"
restored-backpack-given: "&a你的背包已被修復並放到你的物品欄中!" restored-backpack-given: "&a你的背包已被修復並放到你的物品欄中!"
charge:
description: 為你手中的物品充電
charge-success: 此物品以充電完成!
not-rechargeable: 此物品不可被充電!
guide: guide:
search: search:
message: "&c你要搜尋什麼?" message: "&c你要搜尋什麼?"
@ -39,6 +43,12 @@ guide:
select: 點擊選擇此語言 select: 點擊選擇此語言
select-default: 點擊選擇默認語言 select-default: 點擊選擇默認語言
selected-language: 當前選擇: selected-language: 當前選擇:
change: 點擊以選取新語言
description:
- "&7你現在可以選擇 Slimefun"
- "&7介面的語言"
- "&7不過科技物品礙於技術"
- "&7暫時沒有辦法翻譯"
title: title:
main: Slimefun指南 main: Slimefun指南
settings: 設置及資訊 settings: 設置及資訊
@ -48,6 +58,7 @@ guide:
addons: Slimefun4的附加插件 addons: Slimefun4的附加插件
bugs: 錯誤報告 bugs: 錯誤報告
source: 來源代碼 source: 來源代碼
versions: 安裝版本
credits: credits:
commit: 成員 commit: 成員
commits: 成員 commits: 成員
@ -57,6 +68,12 @@ guide:
resourcepack: "&7資源包製作人員" resourcepack: "&7資源包製作人員"
translator: "&9翻譯人員" translator: "&9翻譯人員"
profile-link: 點擊觀看他們在GitHub上的個人資料 profile-link: 點擊觀看他們在GitHub上的個人資料
open: 點擊查看貢獻者
description:
- "&7Slimefun 是個開放性的計畫"
- "&7由一大群人一起開發和構想"
- "&7超過 &e%contributors% &7個人在這些年中"
- "&7花時間開發Slimefun"
pages: pages:
previous: 上一頁 previous: 上一頁
next: 下一頁 next: 下一頁
@ -69,6 +86,7 @@ guide:
miner: 此挖礦機可獲取的資源 miner: 此挖礦機可獲取的資源
generator: 可以使用的燃料 generator: 可以使用的燃料
gold-pan: 可以獲取的資源 gold-pan: 可以獲取的資源
climbing-pick: 你可以攀爬的平面材質
back: back:
title: 上一頁 title: 上一頁
guide: 回到Slimefun指南 guide: 回到Slimefun指南
@ -78,6 +96,7 @@ guide:
- 要解鎖此分類 - 要解鎖此分類
- 必須先解鎖下列分類 - 必須先解鎖下列分類
- 的所有物品 - 的所有物品
work-in-progress: 此功能尚未開發完成!
messages: messages:
not-researched: "&4你太笨了" not-researched: "&4你太笨了"
not-enough-xp: "&4你沒有足夠的經驗值用以解鎖這個" not-enough-xp: "&4你沒有足夠的經驗值用以解鎖這個"
@ -87,14 +106,10 @@ messages:
no-permission: "&4您沒有執行此動作所需的權限" no-permission: "&4您沒有執行此動作所需的權限"
usage: "&4用法: &c%usage%" usage: "&4用法: &c%usage%"
not-online: "&4%player% &c還未上線!" 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"' given-item: '&b你已獲得 &a%amount% &7"%item%&7"'
give-item: '&b你已給予%player% &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"' give-research: '&b你已給予%player% 研究項目&7"%research%&7"'
hungry: "&c你太餓了做不了這個" hungry: "&c你太餓了做不了這個"
mode-change: "&b%device% 模式切換至: &9%mode%"
disabled-in-world: "&4&l此物品在此世界中已被禁用" disabled-in-world: "&4&l此物品在此世界中已被禁用"
disabled-item: "&4&l此物品已被禁用!你到底是怎樣得到的?" disabled-item: "&4&l此物品已被禁用!你到底是怎樣得到的?"
no-tome-yourself: "&c你不能在自己身上使用 &4知識之書&c..." no-tome-yourself: "&c你不能在自己身上使用 &4知識之書&c..."
@ -113,6 +128,7 @@ messages:
knight: "&a&o你的護身符給了你5秒的回復時間" knight: "&a&o你的護身符給了你5秒的回復時間"
whirlwind: "&a&o你的護身符反射了投射物" whirlwind: "&a&o你的護身符反射了投射物"
wizard: "&a&o你的護身符為你升高了幸運等級但也降低了其他附魔等級" wizard: "&a&o你的護身符為你升高了幸運等級但也降低了其他附魔等級"
caveman: "&a&o你的護身符給了你挖掘加速效果"
soulbound-rune: soulbound-rune:
fail: "&c你一次只能魂綁一個物品。" fail: "&c你一次只能魂綁一個物品。"
success: "&a您已成功將此物品綁定魂綁!死後不會噴掉。" success: "&a您已成功將此物品綁定魂綁!死後不會噴掉。"
@ -143,6 +159,26 @@ messages:
- "&7永遠保持樂觀積極!" - "&7永遠保持樂觀積極!"
- "&7這不是普通的餅乾" - "&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: machines:
pattern-not-found: "&e查無此合成表 請確認使用的機器或合成表的材料" pattern-not-found: "&e查無此合成表 請確認使用的機器或合成表的材料"
unknown-material: "&e這個機器不能處理這個物品 請確認使用的機器或合成表的材料" unknown-material: "&e這個機器不能處理這個物品 請確認使用的機器或合成表的材料"
@ -192,6 +228,7 @@ machines:
finished: "&e你的工業挖礦機已挖掘完畢 共挖到 %ores% 個!" finished: "&e你的工業挖礦機已挖掘完畢 共挖到 %ores% 個!"
anvil: anvil:
not-working: "&4科技物品需要用自動鐵砧+修理膠帶!" not-working: "&4科技物品需要用自動鐵砧+修理膠帶!"
mcmmo-salvaging: "&4你不能回收利用 Slimefun 物品!"
backpack: backpack:
already-open: "&c別人正在使用這個背包!" already-open: "&c別人正在使用這個背包!"
no-stack: "&c背包不能疊!" no-stack: "&c背包不能疊!"
@ -203,6 +240,7 @@ gps:
new: "&e輸入傳送點名稱 &7(Color Codes supported!)" new: "&e輸入傳送點名稱 &7(Color Codes supported!)"
added: "&a成功新增傳送點" added: "&a成功新增傳送點"
max: "&4傳送點已達上限" max: "&4傳送點已達上限"
duplicate: "&4已經有叫做 &f%waypoint% &4的傳送點了"
insufficient-complexity: insufficient-complexity:
- "&4GPS信號不足 &c%complexity%" - "&4GPS信號不足 &c%complexity%"
- "&4a) GPS基礎設施未放置" - "&4a) GPS基礎設施未放置"
@ -274,6 +312,7 @@ languages:
zh-CN: 中文(簡體) zh-CN: 中文(簡體)
el: 希臘語 el: 希臘語
he: 希伯來語 he: 希伯來語
pt: 葡萄牙文(葡萄牙)
ar: 阿拉伯文 ar: 阿拉伯文
af: 南非語 af: 南非語
da: 丹麥文 da: 丹麥文
@ -285,7 +324,6 @@ languages:
fa: 波斯語 fa: 波斯語
th: 泰語 th: 泰語
ro: 羅馬尼亞語 ro: 羅馬尼亞語
pt: 葡萄牙文(葡萄牙)
pt-BR: 葡萄牙文(巴西) pt-BR: 葡萄牙文(巴西)
bg: 保加利亞語 bg: 保加利亞語
ko: 韓語 ko: 韓語
@ -295,5 +333,13 @@ languages:
sr: 塞爾維亞語 sr: 塞爾維亞語
be: 白俄羅斯語 be: 白俄羅斯語
tl: 他加祿語 tl: 他加祿語
brewing_stand:
not-working: "&4你不能用 Slimefun 物品釀造!"
villagers:
no-trading: "&4你不能用 Slimefun 物品交易!"
cartography_table:
not-working: "&4你不能在製圖桌上使用 Slimefun 物品!"
cauldron:
no-discoloring: "&4你不能把 Slimefun 物品的顏色消除!"
miner: miner:
no-ores: "&e附近沒礦了!" no-ores: "&e附近沒礦了!"

View File

@ -6,109 +6,109 @@ slimefun:
- 표시된 구조를 설치 - 표시된 구조를 설치
- 보여진 바와 같이. 제작되지 않습니다. - 보여진 바와 같이. 제작되지 않습니다.
enhanced_crafting_table: enhanced_crafting_table:
name: '향상된 조합대 (Enhanced Crafting Table)'
lore: lore:
- 표시된대로 이 아이템을 제작하십시오 - 표시된대로 이 아이템을 제작하십시오
- 향상된 조합대(Enhanced Crafting Table) 내에서 - 향상된 조합대(Enhanced Crafting Table) 내에서
- 일반 조합대로는 충분하지 않습니다! - 일반 조합대로는 충분하지 않습니다!
name: '향상된 조합대 (Enhanced Crafting Table) '
armor_forge: armor_forge:
name: 갑옷 대장간 (Armor Forge)
lore: lore:
- 표시된대로 이 아이템을 제작하십시오 - 표시된대로 이 아이템을 제작하십시오
- 갑옷 대장간 (Armor Forge) 사용 - 갑옷 대장간 (Armor Forge) 사용
name: 갑옷 대장간 (Armor Forge
grind_stone: grind_stone:
name: 맷돌 (Grind Stone)
lore: lore:
- 표시된대로이 아이템을 제작하십시오 - 표시된대로이 아이템을 제작하십시오
- 맷돌(Grind Stone) 사용 - 맷돌(Grind Stone) 사용
name: 맷돌 (Grind Stone)
smeltery: smeltery:
name: 제련소 (Smeltery)
lore: lore:
- 표시된대로 이 아이템을 제작하십시오 - 표시된대로 이 아이템을 제작하십시오
- 제련소 (Smeltery) 사용 - 제련소 (Smeltery) 사용
name: 제련소 (Smeltery)
ore_crusher: ore_crusher:
name: 광석 분쇄기 (Ore Crusher)
lore: lore:
- 표시된대로이 아이템을 제작하십시오 - 표시된대로이 아이템을 제작하십시오
- 광석 분쇄기 (Ore Crusher) 사용 - 광석 분쇄기 (Ore Crusher) 사용
name: 광석 분쇄기 (Ore Crusher)
mob_drop: mob_drop:
name: 몹 드롭 name: 몹 드롭
lore: lore:
- 몹을 처치하여 - 몹을 처치하여
- 이 아이템을 얻다 - 이 아이템을 얻다
gold_pan: gold_pan:
name: 골드 판 (Gold Pan)
lore: lore:
- 골드 판 (Gold Pan) 사용 - 골드 판 (Gold Pan) 사용
- 이 아이템을 얻다 - 이 아이템을 얻다
name: 골드 판 (Gold Pan)
compressor: compressor:
name: 압축기 (Compressor)
lore: lore:
- 표시된대로 이 아이템을 제작하십시오 - 표시된대로 이 아이템을 제작하십시오
- 압축기(Compressor) 를 사용하여 - 압축기(Compressor) 를 사용하여
name: 압축기 (Compressor)
pressure_chamber: pressure_chamber:
name: 압력 챔버 name: 압력 챔버
lore: lore:
- 표시된대로이 아이템을 제작하십시오 - 표시된대로이 아이템을 제작하십시오
- 압력 챔버를 사용하여 - 압력 챔버를 사용하여
ore_washer: ore_washer:
name: 광물 세척기 (Ore Washer)
lore: lore:
- 표시된대로 이 아이템을 제작하십시오 - 표시된대로 이 아이템을 제작하십시오
- 광물 세척기를 사용하여 - 광물 세척기를 사용하여
name: 광물 세척기 (Ore Washer)
juicer: juicer:
name: 주스기 (Juicer)
lore: lore:
- 그림과 같이 주스를 만드십시오 - 그림과 같이 주스를 만드십시오
- 주스기 (Juicer) 를 사용하여 - 주스기 (Juicer) 를 사용하여
name: 주스기 (Juicer)
magic_workbench: magic_workbench:
name: 마법 조합대 (Magic Workbench)
lore: lore:
- 표시된대로 이 아이템을 제작하십시오 - 표시된대로 이 아이템을 제작하십시오
- 마법 조합대 (Magic Workbench) 를 사용하여 - 마법 조합대 (Magic Workbench) 를 사용하여
name: 마법 조합대 (Magic Workbench)
ancient_altar: ancient_altar:
name: 고대 제단 (Ancient Altar)
lore: lore:
- 표시된대로 이 아이템을 제작하십시오 - 표시된대로 이 아이템을 제작하십시오
- 고대 제단 (Ancient Altar) 을 사용하여 - 고대 제단 (Ancient Altar) 을 사용하여
- 자세한 정보는 고대 제단 (Ancient Altar) 을 찾아보십시오 - 자세한 정보는 고대 제단 (Ancient Altar) 을 찾아보십시오
name: 고대 제단 (Ancient Altar)
heated_pressure_chamber: heated_pressure_chamber:
name: 가열 압력 챔버 (Heated Pressure Chamber)
lore: lore:
- 표시된대로 이 아이템을 제작하십시오 - 표시된대로 이 아이템을 제작하십시오
- 가열 압력 챔버 (Heated Pressure Chamber) 를 사용하여 - 가열 압력 챔버 (Heated Pressure Chamber) 를 사용하여
name: 가열 압력 챔버 (Heated Pressure Chamber)
food_fabricator: food_fabricator:
name: 식품 제작기 (Food Fabricator)
lore: lore:
- 표시된대로 이 아이템을 제작하십시오 - 표시된대로 이 아이템을 제작하십시오
- 식품 제작기 (Food Fabricator) 를 사용하여 - 식품 제작기 (Food Fabricator) 를 사용하여
name: 식품 제작기 (Food Fabricator)
food_composter: food_composter:
name: 식품 퇴비통 (Food Composter)
lore: lore:
- 표시된대로 이 아이템을 제작하십시오 - 표시된대로 이 아이템을 제작하십시오
- 식품 퇴비통 (Food Composter) 을 사용하여 - 식품 퇴비통 (Food Composter) 을 사용하여
name: 식품 퇴비통 (Food Composter)
freezer: freezer:
name: 냉동고 (Freezer)
lore: lore:
- 표시된대로 이 아이템을 제작하십시오 - 표시된대로 이 아이템을 제작하십시오
- 냉동고 (Freezer) 를 사용하여 - 냉동고 (Freezer) 를 사용하여
name: 냉동고 (Freezer)
geo_miner: geo_miner:
name: GEO 마이너 (GEO Miner)
lore: lore:
- 채굴 할 수있는 아이템 - 채굴 할 수있는 아이템
- GEO 마이너 (Geo Miner) 를 사용하여 - GEO 마이너 (Geo Miner) 를 사용하여
name: GEO 마이너 (GEO Miner)
nuclear_reactor: nuclear_reactor:
name: 원자로 (Nuclear Reactor)
lore: lore:
- 이 아이템은 부산물입니다 - 이 아이템은 부산물입니다
- 원자로 (Nuclear Reactor) 운영 - 원자로 (Nuclear Reactor) 운영
name: 원자로 (Nuclear Reactor)
oil_pump: oil_pump:
name: 오일 펌프 (Oil Pump) name: 오일 펌프 (Oil Pump)
lore: lore:
- 이 아이템은 수집 가능합니다. - 이 아이템은 수집 가능합니다.
- 오일 펌프 (Oil Pump) 를 사용하여 - 오일 펌프 (Oil Pump) 를 사용하여
pickaxe_of_containment: pickaxe_of_containment:
name: 억제의 곡괭이 name: 억제의 곡괭이 (Pickaxe of Containment)
lore: lore:
- 이 블록을 얻을 수 있습니다 - 이 블록을 얻을 수 있습니다
- 를 통해 스포너를 채굴하여 - 를 통해 스포너를 채굴하여
@ -118,19 +118,24 @@ slimefun:
lore: lore:
- 표시된대로이 아이템을 제작하십시오 - 표시된대로이 아이템을 제작하십시오
- 정유 공장 (Refinery) 을 사용하여 - 정유 공장 (Refinery) 을 사용하여
barter_drop:
name: 피글린 물물 교환 드롭
lore:
- 다음을 사용하여 피글린과 물물 교환
- 이 아이템을 얻기위한 금괴
minecraft: minecraft:
shaped: shaped:
name: 유형 조합 조합법
lore: lore:
- 표시된대로 이 아이템을 제작하십시오 - 표시된대로 이 아이템을 제작하십시오
- 일반 조합대에서 - 일반 조합대에서
- 모양이 중요합니다. - 모양이 중요합니다.
name: 유형 조합 조합법
shapeless: shapeless:
name: 무형 조합 조합법
lore: lore:
- 표시된대로 이 아이템을 제작하십시오 - 표시된대로 이 아이템을 제작하십시오
- 일반 조합대에서 - 일반 조합대에서
- 이 조합법은 형태가 없습니다. - 이 조합법은 형태가 없습니다.
name: 무형 조합 조합법
furnace: furnace:
name: 화로 조합법 name: 화로 조합법
lore: lore:
@ -156,3 +161,8 @@ minecraft:
lore: lore:
- 표시된대로이 아이템을 제작하십시오 - 표시된대로이 아이템을 제작하십시오
- 석제 절단기를 사용하여 - 석제 절단기를 사용하여
smithing:
name: 스미팅 테이블 레시피
lore:
- 표시된대로 이 아이템을 제작하십시오
- 스미팅 테이블 사용

View File

@ -122,6 +122,11 @@ slimefun:
lore: lore:
- 使用煉油廠 - 使用煉油廠
- 提煉該物品 - 提煉該物品
barter_drop:
name: 豬布林交易
lore:
- 用黃金和豬布林
- 交易以獲取此物品
minecraft: minecraft:
shaped: shaped:
name: 有序合成 name: 有序合成

View File

@ -46,7 +46,7 @@ slimefun:
damascus_steel_armor: 大馬士革鋼套裝 damascus_steel_armor: 大馬士革鋼套裝
reinforced_alloy: 強化合金錠 reinforced_alloy: 強化合金錠
carbonado: 黑鑽石 carbonado: 黑鑽石
magic_workbench: 合成檯 magic_workbench: 合成檯
wind_staff: 元素杖—風 wind_staff: 元素杖—風
reinforced_armor: 強化合金錠套裝 reinforced_armor: 強化合金錠套裝
ore_washer: 礦物洗滌機 ore_washer: 礦物洗滌機
@ -93,7 +93,7 @@ slimefun:
explosive_tools: 爆炸性的突破 explosive_tools: 爆炸性的突破
automated_panning_machine: 懶人掏金盤 automated_panning_machine: 懶人掏金盤
boots_of_the_stomper: 踐踏之靴 boots_of_the_stomper: 踐踏之靴
pickaxe_of_the_seeker: 合法X-ray pickaxe_of_the_seeker: 合法 X-ray
backpacks: 背包 backpacks: 背包
woven_backpack: 手織背包 woven_backpack: 手織背包
crucible: 坩鍋 crucible: 坩鍋
@ -150,12 +150,12 @@ slimefun:
electric_ore_grinding: 電動研磨 electric_ore_grinding: 電動研磨
heated_pressure_chamber: 高溫加壓室 heated_pressure_chamber: 高溫加壓室
coal_generator: 乾淨的煤 coal_generator: 乾淨的煤
bio_reactor: 反應爐 bio_reactor: 質能反應爐
auto_enchanting: 附魔&退魔檯 auto_enchanting: 附魔&退魔檯
auto_anvil: 電動鐵砧 auto_anvil: 電動鐵砧
multimeter: 電力測量 multimeter: 電力測量
gps_setup: GPS基礎組件 gps_setup: GPS 基礎組件
gps_emergency_transmitter: GPS求救信號 gps_emergency_transmitter: GPS 求救信號
programmable_androids: 機器人 programmable_androids: 機器人
android_interfaces: 機器人接口 android_interfaces: 機器人接口
geo_scanner: 地質掃描 geo_scanner: 地質掃描
@ -166,19 +166,19 @@ slimefun:
better_gps_transmitters: 高階GPS信號發送器 better_gps_transmitters: 高階GPS信號發送器
elevator: 電梯 elevator: 電梯
energized_solar_generator: 這...這不科學! energized_solar_generator: 這...這不科學!
energized_gps_transmitter: 頂級GPS信號發送器 energized_gps_transmitter: 頂級 GPS 信號發送器
energy_regulator: 電力核心 energy_regulator: 電力核心
butcher_androids: 屠夫機器人 butcher_androids: 屠夫機器人
organic_food: 有機食品 organic_food: 有機食品
auto_breeder: 幫你餵動物 auto_breeder: 幫你餵動物
advanced_android: 進階機器人 advanced_android: 進階機器人
advanced_butcher_android: 進階機器人屠夫 advanced_butcher_android: 進階機器人屠夫
advanced_fisherman_android: 進階機器人— 漁夫 advanced_fisherman_android: 進階機器人—漁夫
animal_growth_accelerator: 動物轉大人 animal_growth_accelerator: 動物轉大人
xp_collector: 經驗收集器 xp_collector: 經驗收集器
organic_fertilizer: 有機堆肥 organic_fertilizer: 有機堆肥
crop_growth_accelerator: 金坷垃 crop_growth_accelerator: 金坷垃
better_crop_growth_accelerator: 金坷垃2.0 better_crop_growth_accelerator: 金坷垃 2.0
reactor_essentials: 反應爐必需品 reactor_essentials: 反應爐必需品
nuclear_reactor: 核分裂反應爐 nuclear_reactor: 核分裂反應爐
freezer: 我的超人裝呢 freezer: 我的超人裝呢
@ -199,7 +199,7 @@ slimefun:
better_electric_furnace: 升級版電磁爐 better_electric_furnace: 升級版電磁爐
better_carbon_press: 升級版碳壓縮機 better_carbon_press: 升級版碳壓縮機
empowered_android: 頂級機器人 empowered_android: 頂級機器人
empowered_butcher_android: 頂級機器人-屠夫 empowered_butcher_android: 頂級機器人屠夫
empowered_fisherman_android: 頂級機器人—漁夫 empowered_fisherman_android: 頂級機器人—漁夫
high_tier_carbon_press: 終極碳壓縮機 high_tier_carbon_press: 終極碳壓縮機
wither_assembler: 凋零農場 wither_assembler: 凋零農場
@ -233,10 +233,17 @@ slimefun:
makeshift_smeltery: 自動冶煉 makeshift_smeltery: 自動冶煉
tree_growth_accelerator: 自動金坷垃 tree_growth_accelerator: 自動金坷垃
industrial_miner: 工業化採礦 industrial_miner: 工業化採礦
advanced_industrial_miner: 工業化採礦 - advanced_industrial_miner: 工業化採礦
magical_zombie_pills: 救贖藥丸 magical_zombie_pills: 救贖藥丸
auto_brewer: 工業化釀造 auto_brewer: 工業化釀造
enchantment_rune: 古代附魔 enchantment_rune: 古代附魔
lead_clothing: 防輻射衣 lead_clothing: 防輻射衣
tape_measure: 捲尺 tape_measure: 捲尺
iron_golem_assembler: 鐵巨人召喚機 iron_golem_assembler: 鐵巨人召喚機
climbing_pick: 飛簷走壁
shulker_shell: 工業界伏殼
villager_rune: 讓村民失業
caveman_talisman: 穴居人護符
even_higher_tier_capacitors: 第三級電容器
elytra_cap: 體驗動能
energy_connectors: 電線

View File

@ -14,11 +14,11 @@ resources:
slimefunorechunks: slimefunorechunks:
iron_ore_chunk: 鐵石塊 iron_ore_chunk: 鐵石塊
gold_ore_chunk: 金石塊 gold_ore_chunk: 金石塊
copper_ore_chunk: copper_ore_chunk:
tin_ore_chunk: tin_ore_chunk:
silver_ore_chunk: 銀石塊 silver_ore_chunk: 銀石塊
aluminum_ore_chunk: 鋁石塊 aluminum_ore_chunk: 鋁石塊
lead_ore_chunk: 鉛石塊 lead_ore_chunk: 鉛石塊
zinc_ore_chunk: zinc_ore_chunk:
nickel_ore_chunk: nickel_ore_chunk:
cobalt_ore_chunk: 鈷石塊 cobalt_ore_chunk: 鈷石塊

View File

@ -5,6 +5,10 @@
"required" : false "required" : false
}, },
"minecraft:gold_ore", "minecraft:gold_ore",
"minecraft:iron_ore" "minecraft:iron_ore",
{
"id" : "minecraft:ancient_debris",
"required" : false
}
] ]
} }