1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-20 03:35:51 +00:00
into experimental

Conflicts:
	CHANGELOG.md
This commit is contained in:
TheBusyBiscuit 2020-07-25 14:27:12 +02:00
commit 92ca696140
17 changed files with 509 additions and 383 deletions

View File

@ -7,24 +7,46 @@ assignees: ''
---
## Description (Required)
<!-- A clear and detailed description of what exactly the Issue consists of. -->
<!-- FILL IN THE FORM BELOW -->
## Steps to reproduce the Issue (Required)
## Description (REQUIRED)
<!-- A clear and detailed description of what went wrong. -->
<!-- The more information you can provide, the easier we can handle this problem. -->
<!-- Start writing below this line -->
## Steps to reproduce the Issue (REQUIRED)
<!-- Tell us the exact steps to reproduce this issue, the more detailed the easier we can reproduce it. -->
<!-- Youtube Videos and Screenshots are recommended! -->
<!-- Start writing below this line -->
## Expected behavior (Required)
<!-- What did you expect to happen? -->
## Server Log / Error Report
<!-- Take a look at your Server Log and please provide any error reports you can find via https://pastebin.com/ -->
<!-- We may discard your Issue if you just post it here, as it's unreadable for us. Please use Pastebin! -->
## Expected behavior (REQUIRED)
<!-- What were you expecting to happen? -->
<!-- What do you think would have been the correct behaviour? -->
<!-- Start writing below this line -->
## Environment (Required)
<!-- We may also close your Issue if you are not providing the exact version numbers. -->
## Server Log
<!-- Take a look at your Server Log and post any errors you can find via https://pastebin.com/ -->
<!-- If you are unsure about it, post your full log, you can find it under /logs/latest.log -->
<!-- Start writing below this line -->
## Error Reports
<!-- Check the folder /plugins/Slimefun/error-reports/ and upload all files inside that folder. -->
<!-- You can also post these files via https://pastebin.com/ -->
<!-- Start writing below this line -->
## Environment (REQUIRED)
<!-- Any info without the exact version numbers will be closed! -->
<!-- "latest" IS NOT A VERSION NUMBER. -->
<!-- You can also just run "/sf versions" and show us a screenshot of that. -->
<!-- We recommend running "/sf versions" and showing us a screenshot of that. -->
<!-- Make sure that the screenshot covers the entire output of that command. -->
<!-- If your issue is related to other plugins, make sure to include the versions of these plugins too! -->
- Server Software (Spigot/Paper):
- Minecraft Version:
- Slimefun Version:
- CS-CoreLib Version:

View File

@ -27,6 +27,7 @@
* Added a [Metrics module](https://github.com/Slimefun/MetricsModule) which allows us to release updates to metrics (bStats) independently from the main plugin
* Added "Compressed Carbon -> Carbon" recipe to the Ore Crusher
* Added "Carbon -> Coal" recipe to the Ore Crusher
* Added an option to disable the message "Ignoring duplicate block"
* Added Iron Golem Assembler
* Added Reinforced Cloth
* Added Bee protection to Hazmat Suit
@ -51,6 +52,7 @@
* Fixed #2093
* Fixed #2086
* Fixed #1894
* Fixed #2097
## Release Candidate 14 (12 Jul 2020)

View File

@ -64,10 +64,11 @@ public class SlimefunRegistry {
private boolean enableResearches;
private boolean freeCreativeResearches;
private boolean researchFireworks;
private boolean logDuplicateBlockEntries;
private final Set<String> tickers = new HashSet<>();
private final Set<SlimefunItem> radioactive = new HashSet<>();
private final Set<String> activeChunks = new HashSet<>();
private final Set<String> activeChunks = ConcurrentHashMap.newKeySet();
private final KeyMap<GEOResource> geoResources = new KeyMap<>();
@ -82,7 +83,7 @@ public class SlimefunRegistry {
private final Map<Class<? extends ItemHandler>, Set<ItemHandler>> globalItemHandlers = new HashMap<>();
private final Map<String, SlimefunBlockHandler> blockHandlers = new HashMap<>();
private final Map<String, Set<Location>> activeTickers = new HashMap<>();
private final Map<String, Set<Location>> activeTickers = new ConcurrentHashMap<>();
private final Map<String, ItemStack> automatedCraftingChamberRecipes = new HashMap<>();
@ -98,6 +99,7 @@ public class SlimefunRegistry {
backwardsCompatibility = cfg.getBoolean("options.backwards-compatibility") || SlimefunPlugin.getMinecraftVersion().isBefore(MinecraftVersion.MINECRAFT_1_14);
freeCreativeResearches = cfg.getBoolean("researches.free-in-creative-mode");
researchFireworks = cfg.getBoolean("researches.enable-fireworks");
logDuplicateBlockEntries = cfg.getBoolean("options.log-duplicate-block-entries");
}
/**
@ -265,4 +267,8 @@ public class SlimefunRegistry {
return automatedCraftingChamberRecipes;
}
public boolean logDuplicateBlockEntries() {
return logDuplicateBlockEntries;
}
}

View File

@ -36,13 +36,15 @@ class VersionsCommand extends SubCommand {
// After all these years... Spigot still displays as "CraftBukkit"
// so we will just fix this inconsistency for them :)
String serverSoftware = PaperLib.isSpigot() && !PaperLib.isPaper() ? "Spigot" : Bukkit.getName();
sender.sendMessage(ChatColors.color("&a" + serverSoftware + " &2" + ReflectionUtils.getVersion()));
sender.sendMessage("");
sender.sendMessage(ChatColors.color("&aCS-CoreLib &2v" + SlimefunPlugin.getCSCoreLibVersion()));
sender.sendMessage(ChatColors.color("&aSlimefun &2v" + SlimefunPlugin.getVersion()));
if (SlimefunPlugin.getMetricsService().getVersion() != null)
sender.sendMessage(ChatColors.color("&aMetrics: &2#" + SlimefunPlugin.getMetricsService().getVersion() + ')'));
if (SlimefunPlugin.getMetricsService().getVersion() != null) {
sender.sendMessage(ChatColors.color("&aMetrics build: &2#" + SlimefunPlugin.getMetricsService().getVersion()));
}
if (SlimefunPlugin.getRegistry().isBackwardsCompatible()) {
sender.sendMessage(ChatColor.YELLOW + "Backwards compatibility enabled!");

View File

@ -13,6 +13,7 @@ import java.util.logging.Level;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import io.github.thebusybiscuit.slimefun4.utils.PatternUtils;
import kong.unirest.GetRequest;
import kong.unirest.HttpResponse;
import kong.unirest.JsonNode;
import kong.unirest.Unirest;
@ -79,16 +80,14 @@ public class MetricsService {
try {
// Load the jar file into a child class loader using the SF PluginClassLoader
// as a parent.
moduleClassLoader = URLClassLoader.newInstance(new URL[] { metricsModuleFile.toURI().toURL() },
plugin.getClass().getClassLoader());
Class<?> cl = moduleClassLoader.loadClass("dev.walshy.sfmetrics.MetricsModule");
moduleClassLoader = URLClassLoader.newInstance(new URL[] { metricsModuleFile.toURI().toURL() }, plugin.getClass().getClassLoader());
Class<?> metricsClass = moduleClassLoader.loadClass("dev.walshy.sfmetrics.MetricsModule");
metricVersion = cl.getPackage().getImplementationVersion();
metricVersion = metricsClass.getPackage().getImplementationVersion();
// If it has not been newly downloaded, auto-updates are on AND there's a new version
// then cleanup, download and start
if (!hasDownloadedUpdate && hasAutoUpdates() && checkForUpdate(metricVersion)
) {
if (!hasDownloadedUpdate && hasAutoUpdates() && checkForUpdate(metricVersion)) {
plugin.getLogger().info("Cleaning up and re-loading Metrics.");
cleanUp();
start();
@ -96,21 +95,22 @@ public class MetricsService {
}
// Finally, we're good to start this.
Method start = cl.getDeclaredMethod("start");
String version = cl.getPackage().getImplementationVersion();
Method start = metricsClass.getDeclaredMethod("start");
String version = metricsClass.getPackage().getImplementationVersion();
// This is required to be sync due to bStats.
Slimefun.runSync(() -> {
try {
start.invoke(null);
plugin.getLogger().info("Metrics build #" + version + " started.");
} catch (Exception e) {
}
catch (Exception | LinkageError e) {
plugin.getLogger().log(Level.WARNING, "Failed to start metrics.", e);
}
});
} catch (Exception e) {
plugin.getLogger().log(Level.WARNING,
"Failed to load the metrics module. Maybe the jar is corrupt?", e);
}
catch (Exception | LinkageError e) {
plugin.getLogger().log(Level.WARNING, "Failed to load the metrics module. Maybe the jar is corrupt?", e);
}
}
@ -123,9 +123,9 @@ public class MetricsService {
if (this.moduleClassLoader != null) {
this.moduleClassLoader.close();
}
} catch (IOException e) {
plugin.getLogger().log(Level.WARNING,
"Could not clean up module class loader. Some memory may have been leaked.");
}
catch (IOException e) {
plugin.getLogger().log(Level.WARNING, "Could not clean up module class loader. Some memory may have been leaked.");
}
}
@ -133,7 +133,8 @@ public class MetricsService {
* Checks for a new update and compares it against the current version.
* If there is a new version available then this returns true.
*
* @param currentVersion The current version which is being used.
* @param currentVersion
* The current version which is being used.
* @return True if there is an update available.
*/
public boolean checkForUpdate(String currentVersion) {
@ -160,16 +161,21 @@ public class MetricsService {
*/
private int getLatestVersion() {
try {
HttpResponse<JsonNode> response = Unirest.get(GH_API + "/releases/latest")
.asJson();
if (!response.isSuccess()) return -1;
HttpResponse<JsonNode> response = Unirest.get(GH_API + "/releases/latest").asJson();
if (!response.isSuccess()) {
return -1;
}
JsonNode node = response.getBody();
if (node == null) return -1;
if (node == null) {
return -1;
}
return node.getObject().getInt("tag_name");
} catch (UnirestException e) {
}
catch (UnirestException e) {
plugin.getLogger().log(Level.SEVERE, "Failed to fetch latest builds for SFMetrics");
return -1;
}
@ -178,7 +184,8 @@ public class MetricsService {
/**
* Downloads the version specified to Slimefun's data folder.
*
* @param version The version to download.
* @param version
* The version to download.
*/
private boolean download(int version) {
File f = new File(parentFolder, "Metrics-" + version + ".jar");
@ -187,20 +194,19 @@ public class MetricsService {
plugin.getLogger().log(Level.INFO, "# Starting download of MetricsModule build: #{0}", version);
AtomicInteger lastPercentPosted = new AtomicInteger();
HttpResponse<File> response = Unirest.get(GH_RELEASES + "/" + version
+ "/" + REPO_NAME + ".jar")
.downloadMonitor((b, fileName, bytesWritten, totalBytes) -> {
GetRequest request = Unirest.get(GH_RELEASES + "/" + version + "/" + REPO_NAME + ".jar");
HttpResponse<File> response = request.downloadMonitor((b, fileName, bytesWritten, totalBytes) -> {
int percent = (int) (20 * (Math.round((((double) bytesWritten / totalBytes) * 100) / 20)));
if (percent != 0 && percent != lastPercentPosted.get()) {
plugin.getLogger().info("# Downloading... " + percent + "% " +
"(" + bytesWritten + "/" + totalBytes + " bytes)");
plugin.getLogger().info("# Downloading... " + percent + "% " + "(" + bytesWritten + "/" + totalBytes + " bytes)");
lastPercentPosted.set(percent);
}
})
.asFile(f.getPath());
}).asFile(f.getPath());
if (response.isSuccess()) {
plugin.getLogger().log(Level.INFO, "Successfully downloaded {0} build: #{1}", new Object[] {REPO_NAME, version});
plugin.getLogger().log(Level.INFO, "Successfully downloaded {0} build: #{1}", new Object[] { REPO_NAME, version });
// Replace the metric file with the new one
Files.move(f.toPath(), metricsModuleFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
@ -209,12 +215,12 @@ public class MetricsService {
hasDownloadedUpdate = true;
return true;
}
} catch (UnirestException e) {
plugin.getLogger().log(Level.WARNING, "Failed to fetch the latest jar file from the" +
" builds page. Perhaps GitHub is down.");
} catch (IOException e) {
plugin.getLogger().log(Level.WARNING, "Failed to replace the old metric file with the " +
"new one. Please do this manually! Error: {0}", e.getMessage());
}
catch (UnirestException e) {
plugin.getLogger().log(Level.WARNING, "Failed to fetch the latest jar file from the" + " builds page. Perhaps GitHub is down.");
}
catch (IOException e) {
plugin.getLogger().log(Level.WARNING, "Failed to replace the old metric file with the " + "new one. Please do this manually! Error: {0}", e.getMessage());
}
return false;
}

View File

@ -54,7 +54,7 @@ abstract class GitHubConnector {
writeCacheFile(resp.getBody());
}
else {
Slimefun.getLogger().log(Level.WARNING, "Failed to fetch {0}", repository + getURLSuffix());
Slimefun.getLogger().log(Level.WARNING, "Failed to fetch {0}: {1} - {2}", new Object[] {repository + getURLSuffix(), resp.getStatus(), resp.getBody()});
}
}
catch (UnirestException e) {
@ -78,21 +78,21 @@ abstract class GitHubConnector {
}
private JsonNode readCacheFile() {
try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8))) {
return new JsonNode(br.readLine());
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8))) {
return new JsonNode(reader.readLine());
}
catch (IOException | JSONException e) {
Slimefun.getLogger().log(Level.WARNING, "Failed to read Github cache file: {0}", file.getName());
Slimefun.getLogger().log(Level.WARNING, "Failed to read Github cache file: {0} - {1}: {2}", new Object[] {file.getName(), e.getClass().getSimpleName(), e.getMessage()});
return null;
}
}
private void writeCacheFile(JsonNode node) {
try (FileOutputStream fos = new FileOutputStream(file)) {
fos.write(node.toString().getBytes(StandardCharsets.UTF_8));
try (FileOutputStream output = new FileOutputStream(file)) {
output.write(node.toString().getBytes(StandardCharsets.UTF_8));
}
catch (IOException e) {
Slimefun.getLogger().log(Level.WARNING, "Failed to populate GitHub cache");
Slimefun.getLogger().log(Level.WARNING, "Failed to populate GitHub cache: {0} - {1}", new Object[] {e.getClass().getSimpleName(), e.getMessage()});
}
}
}

View File

@ -36,12 +36,12 @@ import io.github.thebusybiscuit.slimefun4.core.services.BlockDataService;
import io.github.thebusybiscuit.slimefun4.core.services.CustomItemDataService;
import io.github.thebusybiscuit.slimefun4.core.services.CustomTextureService;
import io.github.thebusybiscuit.slimefun4.core.services.LocalizationService;
import io.github.thebusybiscuit.slimefun4.core.services.MetricsService;
import io.github.thebusybiscuit.slimefun4.core.services.MinecraftRecipeService;
import io.github.thebusybiscuit.slimefun4.core.services.PerWorldSettingsService;
import io.github.thebusybiscuit.slimefun4.core.services.PermissionsService;
import io.github.thebusybiscuit.slimefun4.core.services.UpdaterService;
import io.github.thebusybiscuit.slimefun4.core.services.github.GitHubService;
import io.github.thebusybiscuit.slimefun4.core.services.MetricsService;
import io.github.thebusybiscuit.slimefun4.core.services.plugins.ThirdPartyPluginService;
import io.github.thebusybiscuit.slimefun4.core.services.profiler.SlimefunProfiler;
import io.github.thebusybiscuit.slimefun4.implementation.items.altar.AncientAltar;
@ -69,6 +69,7 @@ import io.github.thebusybiscuit.slimefun4.implementation.listeners.IronGolemList
import io.github.thebusybiscuit.slimefun4.implementation.listeners.ItemPickupListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.MobDropListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.MultiBlockListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.PiglinListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.PlayerInteractEntityListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.PlayerProfileListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.SeismicAxeListener;
@ -431,12 +432,15 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon {
new WitherListener(this);
new IronGolemListener(this);
new PlayerInteractEntityListener(this);
new MobDropListener(this);
if (minecraftVersion.isAtLeast(MinecraftVersion.MINECRAFT_1_15)) {
new BeeListener(this);
}
new MobDropListener(this);
if (minecraftVersion.isAtLeast(MinecraftVersion.MINECRAFT_1_16)) {
new PiglinListener(this);
}
// Item-specific Listeners
new VampireBladeListener(this, (VampireBlade) SlimefunItems.BLADE_OF_VAMPIRES.getItem());

View File

@ -21,9 +21,9 @@ import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemDropHandler;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.api.Slimefun;
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;

View File

@ -0,0 +1,62 @@
package io.github.thebusybiscuit.slimefun4.implementation.listeners;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Item;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityPickupItemEvent;
import org.bukkit.event.entity.EntityTargetEvent;
import org.bukkit.event.player.PlayerInteractAtEntityEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
/**
* Listens to "Piglin trading events" to prevent trading with Slimefun items.
*
* @author poma123
*/
public class PiglinListener implements Listener {
public PiglinListener(SlimefunPlugin plugin) {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
@EventHandler
public void onEntityPickup(EntityPickupItemEvent e) {
if (e.getEntityType() == EntityType.PIGLIN) {
if (SlimefunItem.getByItem(e.getItem().getItemStack()) != null) {
e.setCancelled(true);
}
}
}
@EventHandler
public void onInteractEntity(PlayerInteractEntityEvent e) {
if (!e.getRightClicked().isValid() || e.getRightClicked().getType() != EntityType.PIGLIN) {
return;
}
ItemStack itemStack;
if (e.getHand() == EquipmentSlot.OFF_HAND) {
itemStack = e.getPlayer().getInventory().getItemInOffHand();
} else {
itemStack = e.getPlayer().getInventory().getItemInMainHand();
}
if (itemStack.getType() != Material.GOLD_INGOT) {
return;
}
SlimefunItem sfItem = SlimefunItem.getByItem(itemStack);
if (sfItem != null) {
SlimefunPlugin.getLocalization().sendMessage(e.getPlayer(), "messages.piglin-barter", true);
e.setCancelled(true);
}
}
}

View File

@ -16,7 +16,6 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Block;
@ -151,11 +150,35 @@ public class BlockStorage {
FileConfiguration cfg = YamlConfiguration.loadConfiguration(file);
for (String key : cfg.getKeys(false)) {
loadBlock(file, cfg, key);
totalBlocks++;
}
done++;
}
}
}
finally {
long time = (System.currentTimeMillis() - start);
Slimefun.getLogger().log(Level.INFO, "Loading Blocks... 100% (FINISHED - {0}ms)", time);
Slimefun.getLogger().log(Level.INFO, "Loaded a total of {0} Blocks for World \"{1}\"", new Object[] { totalBlocks, world.getName() });
if (totalBlocks > 0) {
Slimefun.getLogger().log(Level.INFO, "Avg: {0}ms/Block", DoubleHandler.fixDouble((double) time / (double) totalBlocks, 3));
}
}
}
private void loadBlock(File file, FileConfiguration cfg, String key) {
Location l = deserializeLocation(key);
String chunkString = locationToChunkString(l);
if (l == null) {
// That location was malformed, we will skip this one
return;
}
try {
totalBlocks++;
String chunkString = locationToChunkString(l);
String json = cfg.getString(key);
Config blockInfo = parseBlockInfo(l, json);
@ -163,10 +186,11 @@ public class BlockStorage {
if (storage.containsKey(l)) {
// It should not be possible to have two blocks on the same location. Ignore the
// new entry if a block is already present and print an error to the console.
if (SlimefunPlugin.getRegistry().logDuplicateBlockEntries()) {
Slimefun.getLogger().log(Level.INFO, "Ignoring duplicate block @ {0}, {1}, {2} ({3} -> {4})", new Object[] { l.getBlockX(), l.getBlockY(), l.getBlockZ(), blockInfo.getString("id"), storage.get(l).getString("id") });
}
Slimefun.getLogger().log(Level.INFO, "Ignoring duplicate block @ {0}, {1}, {2}", new Object[] { l.getBlockX(), l.getBlockY(), l.getBlockZ() });
Slimefun.getLogger().log(Level.INFO, "New: {0} | Old: {1}", new Object[] { key, serializeBlockInfo(storage.get(l)) });
continue;
return;
}
storage.put(l, blockInfo);
@ -187,21 +211,6 @@ public class BlockStorage {
}
}
done++;
}
}
}
finally {
long time = (System.currentTimeMillis() - start);
Slimefun.getLogger().log(Level.INFO, "Loading Blocks... 100% (FINISHED - {0}ms)", time);
Slimefun.getLogger().log(Level.INFO, "Loaded a total of {0} Blocks for World \"{1}\"", new Object[] { totalBlocks, world.getName() });
if (totalBlocks > 0) {
Slimefun.getLogger().log(Level.INFO, "Avg: {0}ms/Block", DoubleHandler.fixDouble((double) time / (double) totalBlocks, 3));
}
}
}
private void loadChunks() {
File chunks = new File(PATH_CHUNKS + "chunks.sfc");
@ -211,7 +220,8 @@ public class BlockStorage {
for (String key : cfg.getKeys(false)) {
try {
if (world.getName().equals(PatternUtils.SEMICOLON.split(key)[0])) {
SlimefunPlugin.getRegistry().getChunks().put(key, new BlockInfoConfig(parseJSON(cfg.getString(key))));
BlockInfoConfig data = new BlockInfoConfig(parseJSON(cfg.getString(key)));
SlimefunPlugin.getRegistry().getChunks().put(key, data);
}
}
catch (Exception x) {
@ -381,6 +391,7 @@ public class BlockStorage {
*
* @param block
* the block to retrieve the ItemStack from
*
* @return the SlimefunItem's ItemStack corresponding to the block if it has one, otherwise null
*
* @since 4.0
@ -424,6 +435,7 @@ public class BlockStorage {
map.put(entry.getKey(), entry.getValue().getAsString());
}
}
return map;
}
@ -530,12 +542,14 @@ public class BlockStorage {
}
else if (!storage.hasInventory(l)) {
File file = new File(PATH_INVENTORIES + serializeLocation(l) + ".sfi");
BlockMenuPreset preset = BlockMenuPreset.getPreset(id);
if (file.exists()) {
storage.inventories.put(l, new BlockMenu(BlockMenuPreset.getPreset(id), l, new io.github.thebusybiscuit.cscorelib2.config.Config(file)));
BlockMenu inventory = new BlockMenu(preset, l, new io.github.thebusybiscuit.cscorelib2.config.Config(file));
storage.inventories.put(l, inventory);
}
else {
storage.loadInventory(l, BlockMenuPreset.getPreset(id));
storage.loadInventory(l, preset);
}
}
}
@ -732,15 +746,11 @@ public class BlockStorage {
}
public static Set<String> getTickingChunks() {
return new HashSet<>(SlimefunPlugin.getRegistry().getActiveChunks());
}
public static Set<Location> getTickingLocations(Chunk chunk) {
return getTickingLocations(chunk.toString());
return SlimefunPlugin.getRegistry().getActiveChunks();
}
public static Set<Location> getTickingLocations(String chunk) {
return new HashSet<>(SlimefunPlugin.getRegistry().getActiveTickers().get(chunk));
return SlimefunPlugin.getRegistry().getActiveTickers().getOrDefault(chunk, new HashSet<>());
}
public BlockMenu loadInventory(Location l, BlockMenuPreset preset) {
@ -769,7 +779,8 @@ public class BlockStorage {
}
public void loadUniversalInventory(BlockMenuPreset preset) {
SlimefunPlugin.getRegistry().getUniversalInventories().put(preset.getID(), new UniversalBlockMenu(preset));
UniversalBlockMenu inventory = new UniversalBlockMenu(preset);
SlimefunPlugin.getRegistry().getUniversalInventories().put(preset.getID(), inventory);
}
public void clearInventory(Location l) {

View File

@ -16,6 +16,7 @@ options:
legacy-ore-grinder: true
language: en
enable-translations: true
log-duplicate-block-entries: true
guide:
default-view-book: false

View File

@ -1,66 +1,19 @@
---
android:
scripts:
already-uploaded: "&4Dieses Skript wurde bereits hochgeladen."
editor: Skripteditor
enter-name:
-
- "&eBitte gebe einen Namen für dein Skript ins Chatfenster ein"
instructions:
ATTACK_ANIMALS: "&4Angreifen &c(Nur Tiere)"
ATTACK_ANIMALS_ADULT: "&4Angreifen &c(Nur ausgewachsene Tiere)"
ATTACK_MOBS: "&4Angreifen &c(Nur Monster)"
ATTACK_MOBS_ANIMALS: "&4Angreifen &c(Monster & Tiere)"
CATCH_FISH: "&bAngeln"
CHOP_TREE: "&cBaum fällen und nachpflanzen"
DIG_DOWN: "&bGrabe nach unten"
DIG_FORWARD: "&bGrabe vorwärts"
DIG_UP: "&bGrabe nach oben"
FARM_DOWN: "&bErnten und Nachpflanzen &7(Unterer Block)"
FARM_EXOTIC_DOWN: "&bErnten und Nachpflanzen (Fortgeschritten und unterer Block)"
FARM_EXOTIC_FORWARD: "&bErnten und Nachpflanzen (Fortgeschritten)"
FARM_FORWARD: "&bErnten und Nachpflanzen"
GO_DOWN: "&7Gehe nach unten"
GO_FORWARD: "&7Gehe vorwärts"
GO_UP: "&7Gehe nach oben"
INTERFACE_FUEL: "&cTreibstoff aus dem vorliegenden Interface nehmen"
INTERFACE_ITEMS: "&9Items ins vorliegende Interface bewegen"
MOVE_AND_DIG_DOWN: "&bGehe & Grabe nach unten"
MOVE_AND_DIG_FORWARD: "&bGehe & Grabe vorwärts"
MOVE_AND_DIG_UP: "&bGehe & Grabe nach oben"
REPEAT: "&9Neubeginn des Skripts"
START: "&2Start des Skripts"
TURN_LEFT: "&7Drehung nach links"
TURN_RIGHT: "&7Drehung nach rechts"
WAIT: "&eWarte 0.5 Sekunden"
rating:
already: "&4Du hast dieses Skript bereits bewertet!"
own: "&4Du kannst nicht dein eigenes Skript bewerten!"
uploaded:
- "&bLade dein Skript hoch..."
- "&aDein Skript wurde erfolgreich hochgeladen!"
started: "&7Dein Android hat sein Skript fortgesetzt"
stopped: "&7Dein Android hat sein Skript pausiert"
anvil:
not-working: "&4Items von Slimefun können nicht in einem Amboss verwendet werden!"
backpack:
already-open: "&cDieser Rucksack wird derzeit von jemand anderem benutzt!"
no-stack: "&cRucksäcke dürfen nicht gestapelt werden"
commands:
help: Zeigt diesen Infotext an
cheat: Ermöglicht das Cheaten von Items
give: Gibt jemandem ein bestimmtes Item
guide: Gibt dir das Slimefun-Handbuch
help: Zeigt diesen Infotext an
timings: Zeigt einige Informationen über die Performance
teleporter: Erlaubt es dir Wegpunkte anderer Spieler anzusehen
versions: Eine Liste aller installierter Addons
search: Durchsucht dein Slimefun-Handbuch nach einem Begriff
open_guide: Öffnet das Slimefun-Handbuch
stats: Zeigt einige Statistiken über einen Spieler
research:
description: Verändert den Erfahrungsgrad eines Spielers
reset: "&cDu hast soeben %player%'s Erfahrungsgrad zurückgesetzt"
reset-target: "&cDein Erfahrungsgrad wurde zurückgesetzt"
search: Durchsucht dein Slimefun-Handbuch nach einem Begriff
stats: Zeigt einige Statistiken über einen Spieler
teleporter: Erlaubt es dir Wegpunkte anderer Spieler anzusehen
timings: Zeigt einige Informationen über die Performance
versions: Eine Liste aller installierter Addons
backpack:
description: Gibt eine Kopie eines existierenden Rucksacks
invalid-id: "&4Die id muss eine nicht-negative ganze Zahl sein!"
@ -68,184 +21,120 @@ commands:
backpack-does-not-exist: "&4Der angegebene Rucksack konnte nicht gefunden werden!"
restored-backpack-given: "&aDein Rucksack wurde erfolgreich wiederhergestellt
und deinem Inventar hinzugefügt!"
gps:
deathpoint: "&4Todespunkt &7%date%"
geo:
scan-required: "&4GEO-Scan benötigt! &cScanne diesen Chunk mit einem GEO-Scanner!"
insufficient-complexity:
- "&4Unzureichende Komplexität deines GPS-Netzwerkes! Folgende Komplexität wird
benötigt: &c%complexity%"
- "&4a) Vielleicht hast du gar kein GPS-Netzwerk"
- "&4b) Oder dein GPS-Netzwerk ist nicht komplex genug"
waypoint:
added: "&aEin neuer Wegpunkt wurde hinzugefügt"
max: "&4Du hast die maximale Anzahl an Wegpunkten erreicht"
new: "&eBitte gebe ins Chatfenser einen Namen für deinen Wegpunkt ein. &7(Farbcodes
werden unterstützt!)"
guide:
back:
guide: Gehe zurück zum Slimefun-Handbuch
settings: Gehe zurück zu den Einstellungen
title: Zurück
search:
message: "&bWonach möchtest du suchen?"
name: "&7Suche..."
tooltip: "&bKlicke um die Suche zu starten"
inventory: 'Suche nach: %item%'
lore:
- "&bWonach möchtest du suchen?"
- "&7Gib den Begriff, nach dem du suchen willst, in das Chatfenster ein"
cheat:
no-multiblocks: "&4Multiblöcke müssen gebaut werden! Du kannst dir diese nicht
geben."
credits:
commit: Beitrag
commits: Beiträge
profile-link: Klick um mich auf GitHub zu sehen
roles:
developer: "&6Entwickler"
resourcepack: "&cRessourcenpaket-Designer"
translator: "&9Übersetzer"
wiki: "&3Wiki-Editor"
languages:
updated: "&aFolgende Sprache wurde ausgewählt: &b%lang%"
translations:
name: "&aFehlt etwas?"
lore: Klicke um eine Übersetzung hinzuzufügen
select: Klicke hier um diese Sprache auszuwählen
select-default: Klicke hier um die Standardsprache auszuwählen
selected-language: 'Aktuell ausgewählt:'
translations:
lore: Klicke um eine Übersetzung hinzuzufügen
name: "&aFehlt etwas?"
updated: "&aFolgende Sprache wurde ausgewählt: &b%lang%"
title:
main: Slimefun-Handbuch
settings: Einstellungen & Infos
languages: Wähle deine bevorzugte Sprache
credits: 'Slimefun4: Mitwirkende'
wiki: Slimefun4-Wiki
addons: Addons für Slimefun4
bugs: Fehlermeldungen
source: Quellcode
credits:
commit: Beitrag
commits: Beiträge
roles:
developer: "&6Entwickler"
wiki: "&3Wiki-Editor"
resourcepack: "&cRessourcenpaket-Designer"
translator: "&9Übersetzer"
profile-link: Klick um mich auf GitHub zu sehen
pages:
previous: Vorherige Seite
next: Nächste Seite
tooltips:
open-category: Klicke zum Öffnen
versions-notice: Dies ist sehr wichtig bei Fehlermeldungen!
wiki: Besuche das offizielle Slimefun-Wiki
recipes:
machine: Rezepte dieser Maschine
miner: Ressourcen, die mit dieser Maschine gewonnen werden können
generator: Mögliche Treibstoffquellen
gold-pan: Ressourcen, die hiermit gewonnen werden können
back:
title: Zurück
guide: Gehe zurück zum Slimefun-Handbuch
settings: Gehe zurück zu den Einstellungen
locked: GESPERRT
locked-category:
- Um diese Kategorie freizuschalten,
- müssen zuerst sämtliche Items der
- folgenden Kategorien freigeschaltet werden
pages:
next: Nächste Seite
previous: Vorherige Seite
search:
inventory: 'Suche nach: %item%'
lore:
- "&bWonach möchtest du suchen?"
- "&7Gib den Begriff, nach dem du suchen willst, in das Chatfenster ein"
message: "&bWonach möchtest du suchen?"
name: "&7Suche..."
tooltip: "&bKlicke um die Suche zu starten"
title:
addons: Addons für Slimefun4
bugs: Fehlermeldungen
credits: 'Slimefun4: Mitwirkende'
languages: Wähle deine bevorzugte Sprache
main: Slimefun-Handbuch
settings: Einstellungen & Infos
source: Quellcode
wiki: Slimefun4-Wiki
tooltips:
open-category: Klicke zum Öffnen
recipes:
generator: Mögliche Treibstoffquellen
gold-pan: Ressourcen, die hiermit gewonnen werden können
machine: Rezepte dieser Maschine
miner: Ressourcen, die mit dieser Maschine gewonnen werden können
versions-notice: Dies ist sehr wichtig bei Fehlermeldungen!
wiki: Besuche das offizielle Slimefun-Wiki
inventory:
no-access: "&4Du kannst nicht auf diesen Block zugreifen"
languages:
af: Afrikaans
ar: Arabisch
be: Belarusisch
bg: Bulgarisch
cs: Tschechisch
da: Dänisch
de: Deutsch
default: Server-Standard
el: Griechisch
en: Englisch
es: Spanisch
fa: Persisch
fi: Finnisch
fr: Französisch
he: Hebräisch
hr: Kroatisch
hu: Ungarisch
id: Indonesisch
it: Italienisch
ja: Japanisch
ko: Koreanisch
lv: Lettisch
mk: Mazedonisch
ms: Malaiisch
nl: Niederländisch
'no': Norwegisch
pl: Polnisch
pt: Portugiesisch (Portugal)
pt-BR: Portugiesisch (Brasilien)
ro: Rumänisch
ru: Russisch
sk: Slowakisch
sr: Serbisch
sv: Schwedisch
th: Thailändisch
tr: Türkisch
uk: Ukrainisch
vi: Vietnamesisch
zh-CN: Chinesisch (China)
zh-TW: Chinesisch (Taiwan)
machines:
ANCIENT_ALTAR:
not-enough-pedestals: "&4Es fehlen einige Sockel des Altars &c(%pedestals% / 8)"
unknown-catalyst: "&4Unbekannter Katalysator!"
unknown-recipe: "&4Unbekanntes Rezept!"
ANCIENT_PEDESTAL:
obstructed: "&4Der Sockel wurde blockiert! &cBitte entferne den Block über jedem
jedem Sockel!"
CARGO_NODES:
must-be-placed: "&4Dieser Block muss an die Seite einer Maschine oder Kiste platziert
werden!"
ELEVATOR:
click-to-teleport: "&eKlicke hier &7um zu dieser Etage zu teleportieren:"
current-floor: "&eDeine aktuelle Etage:"
enter-name: "&7Bitte gebe ins Chatfenser einen Namen für diese Etage ein. &r(Farbcodes
werden unterstützt!)"
named: '&2Diese Etage wurde erfolgreich &r"%floor%&r" &2genannt'
no-destinations: "&4Es konnten keine weiteren Etagen gefunden werden"
pick-a-floor: "&3- Wähle eine Etage -"
full-inventory: "&eDieses Inventar ist bereits voll!"
GPS_CONTROL_PANEL:
title: GPS - Kontrolltafel
transmitters: Satelliten-Übersicht
waypoints: Wegpunkte-Übersicht
HOLOGRAM_PROJECTOR:
enter-text: "&7Bitte gebe ins Chatfenser einen Text für dieses Hologram ein. &r(Farbcodes
werden unterstützt!)"
inventory-title: Hologrammeditor
ignition-chamber-no-flint: "&cAlle Feuerzeuge wurden aufgebraucht!"
in-use: "&cDiese Maschine wird derzeit von einem anderen Spieler verwendet."
pattern-not-found: "&eEs tut mir leid, aber ich konnte kein passendes Rezept finden."
TELEPORTER:
cancelled: "&4Teleportation abgebrochen!"
gui:
time: Voraussichtliche Dauer
title: Deine Wegpunkte
tooltip: Klicke zum teleportieren
invulnerability: "&b&lDu bist nun für 30 Sekunden unverwundbar!"
teleported: "&3Erfolgreich teleportiert!"
teleporting: "&3Du wirst teleportiert..."
unknown-material: "&eEs tut mir leid, aber ich erkenne das Item in meinem Werfer
nicht, probier ein anderes Item aus."
wrong-item: "&eEs tut mir leid, aber ich erkenne das Item in deiner Hand nicht,
probier ein anderes Item aus."
INDUSTRIAL_MINER:
no-fuel: "&cDein Industrial Miner hat keinen Treibstoff mehr! Platziere den benötigten
Treibstoff in die Kiste."
piston-facing: "&cEinIndustrial Miner erfordert Kolben, die nach oben zeigen!"
piston-space: "&cDie Blöcke über den Kolben müssen leer bleiben!"
destroyed: "&cDein Industrial Miner scheint zerstört worden zu sein."
already-running: "&cDieser Industrial Miner wird bereits verwendet!"
full-chest: "&cDie Kiste deines Industrial Miner ist vollgelaufen!"
no-permission: "&4Du scheinst nicht die benötigten Rechte zu haben, um in diesem
Gebiet einen Industrial Miner zu verwenden."
finished: "&eDein Industrial Miner ist fertig! Es wurde(n) insgesamt %ores% Erz(e)
gefunden!"
messages:
cannot-place: "&cDu kannst hier keine Blöcke platzieren!"
diet-cookie: "&eDu beginnst dich sehr leicht zu fühlen..."
not-researched: "&4Du hast diesen Gegenstand noch nicht freigeschaltet!"
not-enough-xp: "&4Du hast nicht genügend Erfahrungspunkte, um dies freizuschalten"
unlocked: '&bDu hast folgenden Erfahrungsgrad gewonnen: &7"%research%"'
only-players: "&4Dieser Befehl ist nur für Spieler"
unknown-player: "&4Unbekannter Spieler: &c%player%"
no-permission: "&4Du hast nicht die benötigten Rechte hierfür"
usage: "&4Korrekte Schreibweise: &c%usage%"
not-online: "&4%player% &cist derzeit nicht online!"
not-valid-item: "&4%item% &cist kein gültiges Item!"
not-valid-amount: "&4%amount% &cist keine gültige Anzahl! Sie muss höher als 0 sein!"
given-item: '&bDir wurde &a%amount% &7mal "%item%&7" gegeben'
give-item: '&bDu hast %player% &a%amount% &7"%item%&7" gegeben'
not-valid-research: "&4%research% &cist kein gültiger Erfahrungsgrad!"
give-research: '&bDu hast %player% den Erfahrungsgrad &7"%research%&7" vergeben'
hungry: "&cDu bist zu hungrig, um dies zu tun!"
mode-change: "&bDer Modus von deinem %device% wurde geändert zu: &9%mode%"
disabled-in-world: "&4&lDieses Item wurde in dieser Welt deaktiviert!"
disabled-item: "&4&lDieses Item wurde von einem Server-Administrator deaktiviert!"
no-tome-yourself: "&cDu kannst dieses Item nicht an dir selbst anwenden..."
multimeter: "&bGespeicherte Energie: &3%stored% &b/ &3%capacity%"
talisman:
anvil: "&a&oDein Talisman hat dein Werkzeug vor dem Zerfall gerettet"
miner: "&a&oDein Talisman hat soeben die Drops verdoppelt"
hunter: "&a&oDein Talisman hat soeben die Drops verdoppelt"
lava: "&a&oDein Talisman hat dich vor dem Verbrennen gerettet"
water: "&a&oDein Talisman hat dich vor dem Ertrinken gerettet"
angel: "&a&oDein Talisman hat dich davor bewahrt Fallschaden zu erleiden"
fire: "&a&oDein Talisman hat dich vor dem Verbrennen gerettet"
magician: "&a&oDein Talisman hat dir eine zusätzliche Verzauberung verliehen"
traveller: "&a&oDein Talisman hat dir einen Geschwindigkeitsboost gegeben"
warrior: "&a&oDein Talisman hat dir einen temporären Stärkebonus gegeben"
knight: "&a&oDein Talisman hat dir 5 Sekunden Regeneration gegeben"
whirlwind: "&a&oDein Talisman hat soeben ein Projektil reflektiert"
wizard: "&a&oDein Talisman hat dein Glück-Level erhöht aber möglicherweise das
Level einer anderen Verzauberung vermindert"
soulbound-rune:
fail: "&cDu kannst nicht mehrere Items auf einmal an deine Seele binden"
success: "&aDu hast dieses Item erfolgreich an deine Seele gebunden! Solltest
du sterben, wirst du es nun behalten."
research:
start: "&7Mysteriöse Worte flüstert man dir in dein Ohr!"
progress: "&7Du beginnst über &b%research% &7nachzudenken &e(%progress%)"
fire-extinguish: "&7Das Feuer wurde erfolgreich gelöscht"
cannot-place: "&cDu kannst hier keine Blöcke platzieren!"
no-pvp: "&cDu kannst andere Spieler hier nicht verletzen!"
radiation: "&4Du wurdest radioaktiver Strahlung ausgesetzt! &cZiehe einen vollständigen
Hazmat Suit an oder werde das radioaktive Item schnleunigst los!"
opening-guide: "&bÖffne dein Handbuch, dies kann eventuell ein paar Sekunden dauern..."
opening-backpack: "&bÖffne deinen Rucksack, dies kann eventuell ein paar Sekunden
dauern..."
no-iron-golem-heal: "&cDas ist kein Eisenbarren. Du kannst dieses Item nicht verwenden
um Eisengolems zu reparieren!"
link-prompt: "&eKlicke hier:"
diet-cookie: "&eDu beginnst dich sehr leicht zu fühlen..."
fortune-cookie:
- "&7Hilfe, ich bin in einer Glückskeks-Fabrik gefangen!"
- "&7Morgen könntest du sterben... durch einen Creeper"
@ -259,56 +148,173 @@ messages:
- "&742. Die Antwort ist 42."
- "&7Ein Walshy am Tag, hält die Sorgen fern. (Insiderwitz)"
- "&7Grabe niemals direkt nach unten!"
give-item: '&bDu hast %player% &a%amount% &7"%item%&7" gegeben'
given-item: '&bDir wurde &a%amount% &7mal "%item%&7" gegeben'
give-research: '&bDu hast %player% den Erfahrungsgrad &7"%research%&7" vergeben'
hungry: "&cDu bist zu hungrig, um dies zu tun!"
link-prompt: "&eKlicke hier:"
mode-change: "&bDer Modus von deinem %device% wurde geändert zu: &9%mode%"
multimeter: "&bGespeicherte Energie: &3%stored% &b/ &3%capacity%"
no-iron-golem-heal: "&cDas ist kein Eisenbarren. Du kannst dieses Item nicht verwenden
um Eisengolems zu reparieren!"
no-permission: "&4Du hast nicht die benötigten Rechte hierfür"
no-pvp: "&cDu kannst andere Spieler hier nicht verletzen!"
not-enough-xp: "&4Du hast nicht genügend Erfahrungspunkte, um dies freizuschalten"
no-tome-yourself: "&cDu kannst dieses Item nicht an dir selbst anwenden..."
not-online: "&4%player% &cist derzeit nicht online!"
not-researched: "&4Du hast diesen Gegenstand noch nicht freigeschaltet!"
not-valid-amount: "&4%amount% &cist keine gültige Anzahl! Sie muss höher als 0 sein!"
not-valid-item: "&4%item% &cist kein gültiges Item!"
not-valid-research: "&4%research% &cist kein gültiger Erfahrungsgrad!"
only-players: "&4Dieser Befehl ist nur für Spieler"
opening-backpack: "&bÖffne deinen Rucksack, dies kann eventuell ein paar Sekunden
dauern..."
opening-guide: "&bÖffne dein Handbuch, dies kann eventuell ein paar Sekunden dauern..."
radiation: "&4Du wurdest radioaktiver Strahlung ausgesetzt! &cZiehe einen vollständigen
Hazmat Suit an oder werde das radioaktive Item schnleunigst los!"
research:
progress: "&7Du beginnst über &b%research% &7nachzudenken &e(%progress%)"
start: "&7Mysteriöse Worte flüstert man dir in dein Ohr!"
soulbound-rune:
fail: "&cDu kannst nicht mehrere Items auf einmal an deine Seele binden"
success: "&aDu hast dieses Item erfolgreich an deine Seele gebunden! Solltest
du sterben, wirst du es nun behalten."
talisman:
angel: "&a&oDein Talisman hat dich davor bewahrt Fallschaden zu erleiden"
anvil: "&a&oDein Talisman hat dein Werkzeug vor dem Zerfall gerettet"
fire: "&a&oDein Talisman hat dich vor dem Verbrennen gerettet"
hunter: "&a&oDein Talisman hat soeben die Drops verdoppelt"
knight: "&a&oDein Talisman hat dir 5 Sekunden Regeneration gegeben"
lava: "&a&oDein Talisman hat dich vor dem Verbrennen gerettet"
magician: "&a&oDein Talisman hat dir eine zusätzliche Verzauberung verliehen"
miner: "&a&oDein Talisman hat soeben die Drops verdoppelt"
traveller: "&a&oDein Talisman hat dir einen Geschwindigkeitsboost gegeben"
warrior: "&a&oDein Talisman hat dir einen temporären Stärkebonus gegeben"
water: "&a&oDein Talisman hat dich vor dem Ertrinken gerettet"
whirlwind: "&a&oDein Talisman hat soeben ein Projektil reflektiert"
wizard: "&a&oDein Talisman hat dein Glück-Level erhöht aber möglicherweise das
Level einer anderen Verzauberung vermindert"
unknown-player: "&4Unbekannter Spieler: &c%player%"
unlocked: '&bDu hast folgenden Erfahrungsgrad gewonnen: &7"%research%"'
usage: "&4Korrekte Schreibweise: &c%usage%"
miner:
no-ores: "&eIch konnte leider keine Erze in der Nähe finden!"
- "&7Das ist nur ein Kratzer!"
- "&7Always look on the bright side of life!"
- "&7Ist das jetzt ein Keks, Cookie oder ein Biscuit?"
- "&7Jetzt auch zuckerfrei!"
piglin-barter: "&4Du kannst Piglins keine Slimefun-Gegenständen anbieten!"
machines:
pattern-not-found: "&eEs tut mir leid, aber ich konnte kein passendes Rezept finden."
unknown-material: "&eEs tut mir leid, aber ich erkenne das Item in meinem Werfer
nicht, probier ein anderes Item aus."
wrong-item: "&eEs tut mir leid, aber ich erkenne das Item in deiner Hand nicht,
probier ein anderes Item aus."
full-inventory: "&eDieses Inventar ist bereits voll!"
in-use: "&cDiese Maschine wird derzeit von einem anderen Spieler verwendet."
ignition-chamber-no-flint: "&cAlle Feuerzeuge wurden aufgebraucht!"
ANCIENT_ALTAR:
not-enough-pedestals: "&4Es fehlen einige Sockel des Altars &c(%pedestals% / 8)"
unknown-catalyst: "&4Unbekannter Katalysator!"
unknown-recipe: "&4Unbekanntes Rezept!"
ANCIENT_PEDESTAL:
obstructed: "&4Der Sockel wurde blockiert! &cBitte entferne den Block über jedem
jedem Sockel!"
HOLOGRAM_PROJECTOR:
enter-text: "&7Bitte gebe ins Chatfenser einen Text für dieses Hologram ein. &r(Farbcodes
werden unterstützt!)"
inventory-title: Hologrammeditor
ELEVATOR:
no-destinations: "&4Es konnten keine weiteren Etagen gefunden werden"
pick-a-floor: "&3- Wähle eine Etage -"
current-floor: "&eDeine aktuelle Etage:"
click-to-teleport: "&eKlicke hier &7um zu dieser Etage zu teleportieren:"
enter-name: "&7Bitte gebe ins Chatfenser einen Namen für diese Etage ein. &r(Farbcodes
werden unterstützt!)"
named: '&2Diese Etage wurde erfolgreich &r"%floor%&r" &2genannt'
TELEPORTER:
teleporting: "&3Du wirst teleportiert..."
teleported: "&3Erfolgreich teleportiert!"
cancelled: "&4Teleportation abgebrochen!"
invulnerability: "&b&lDu bist nun für 30 Sekunden unverwundbar!"
gui:
title: Deine Wegpunkte
tooltip: Klicke zum teleportieren
time: Voraussichtliche Dauer
CARGO_NODES:
must-be-placed: "&4Dieser Block muss an die Seite einer Maschine oder Kiste platziert
werden!"
GPS_CONTROL_PANEL:
title: GPS - Kontrolltafel
transmitters: Satelliten-Übersicht
waypoints: Wegpunkte-Übersicht
INDUSTRIAL_MINER:
no-fuel: "&cDein Industrial Miner hat keinen Treibstoff mehr! Platziere den benötigten
Treibstoff in die Kiste."
piston-facing: "&cEinIndustrial Miner erfordert Kolben, die nach oben zeigen!"
piston-space: "&cDie Blöcke über den Kolben müssen leer bleiben!"
destroyed: "&cDein Industrial Miner scheint zerstört worden zu sein."
already-running: "&cDieser Industrial Miner wird bereits verwendet!"
full-chest: "&cDie Kiste deines Industrial Miner ist vollgelaufen!"
no-permission: "&4Du scheinst nicht die benötigten Rechte zu haben, um in diesem
Gebiet einen Industrial Miner zu verwenden."
finished: "&eDein Industrial Miner ist fertig! Es wurde(n) insgesamt %ores% Erz(e)
gefunden!"
anvil:
not-working: "&4Items von Slimefun können nicht in einem Amboss verwendet werden!"
backpack:
already-open: "&cDieser Rucksack wird derzeit von jemand anderem benutzt!"
no-stack: "&cRucksäcke dürfen nicht gestapelt werden"
workbench:
not-enhanced: "&4Dieses Item kann nicht in einer normalen Werkbank genutzt werden"
gps:
deathpoint: "&4Todespunkt &7%date%"
waypoint:
new: "&eBitte gebe ins Chatfenser einen Namen für deinen Wegpunkt ein. &7(Farbcodes
werden unterstützt!)"
added: "&aEin neuer Wegpunkt wurde hinzugefügt"
max: "&4Du hast die maximale Anzahl an Wegpunkten erreicht"
insufficient-complexity:
- "&4Unzureichende Komplexität deines GPS-Netzwerkes! Folgende Komplexität wird
benötigt: &c%complexity%"
- "&4a) Vielleicht hast du gar kein GPS-Netzwerk"
- "&4b) Oder dein GPS-Netzwerk ist nicht komplex genug"
geo:
scan-required: "&4GEO-Scan benötigt! &cScanne diesen Chunk mit einem GEO-Scanner!"
inventory:
no-access: "&4Du kannst nicht auf diesen Block zugreifen"
android:
started: "&7Dein Android hat sein Skript fortgesetzt"
stopped: "&7Dein Android hat sein Skript pausiert"
scripts:
already-uploaded: "&4Dieses Skript wurde bereits hochgeladen."
instructions:
START: "&2Start des Skripts"
REPEAT: "&9Neubeginn des Skripts"
WAIT: "&eWarte 0.5 Sekunden"
GO_FORWARD: "&7Gehe vorwärts"
GO_UP: "&7Gehe nach oben"
GO_DOWN: "&7Gehe nach unten"
TURN_LEFT: "&7Drehung nach links"
TURN_RIGHT: "&7Drehung nach rechts"
DIG_UP: "&bGrabe nach oben"
DIG_FORWARD: "&bGrabe vorwärts"
DIG_DOWN: "&bGrabe nach unten"
MOVE_AND_DIG_UP: "&bGehe & Grabe nach oben"
MOVE_AND_DIG_FORWARD: "&bGehe & Grabe vorwärts"
MOVE_AND_DIG_DOWN: "&bGehe & Grabe nach unten"
ATTACK_MOBS_ANIMALS: "&4Angreifen &c(Monster & Tiere)"
ATTACK_MOBS: "&4Angreifen &c(Nur Monster)"
ATTACK_ANIMALS: "&4Angreifen &c(Nur Tiere)"
ATTACK_ANIMALS_ADULT: "&4Angreifen &c(Nur ausgewachsene Tiere)"
CHOP_TREE: "&cBaum fällen und nachpflanzen"
CATCH_FISH: "&bAngeln"
FARM_FORWARD: "&bErnten und Nachpflanzen"
FARM_DOWN: "&bErnten und Nachpflanzen &7(Unterer Block)"
FARM_EXOTIC_FORWARD: "&bErnten und Nachpflanzen (Fortgeschritten)"
FARM_EXOTIC_DOWN: "&bErnten und Nachpflanzen (Fortgeschritten und unterer Block)"
INTERFACE_ITEMS: "&9Items ins vorliegende Interface bewegen"
INTERFACE_FUEL: "&cTreibstoff aus dem vorliegenden Interface nehmen"
enter-name:
-
- "&eBitte gebe einen Namen für dein Skript ins Chatfenster ein"
uploaded:
- "&bLade dein Skript hoch..."
- "&aDein Skript wurde erfolgreich hochgeladen!"
rating:
own: "&4Du kannst nicht dein eigenes Skript bewerten!"
already: "&4Du hast dieses Skript bereits bewertet!"
editor: Skripteditor
languages:
default: Server-Standard
en: Englisch
de: Deutsch
fr: Französisch
it: Italienisch
es: Spanisch
pl: Polnisch
sv: Schwedisch
nl: Niederländisch
cs: Tschechisch
hu: Ungarisch
lv: Lettisch
ru: Russisch
sk: Slowakisch
zh-TW: Chinesisch (Taiwan)
vi: Vietnamesisch
id: Indonesisch
zh-CN: Chinesisch (China)
el: Griechisch
he: Hebräisch
pt: Portugiesisch (Portugal)
ar: Arabisch
af: Afrikaans
da: Dänisch
fi: Finnisch
uk: Ukrainisch
ms: Malaiisch
'no': Norwegisch
ja: Japanisch
fa: Persisch
th: Thailändisch
ro: Rumänisch
pt-BR: Portugiesisch (Brasilien)
bg: Bulgarisch
ko: Koreanisch
tr: Türkisch
hr: Kroatisch
mk: Mazedonisch
sr: Serbisch
be: Belarusisch
tl: Tagalog
miner:
no-ores: "&eIch konnte leider keine Erze in der Nähe finden!"

View File

@ -110,6 +110,7 @@ messages:
disabled-item: '&4&lThis Item has been disabled! How did you even get that?'
no-tome-yourself: '&cYou cannot use the &4Tome of Knowledge &con yourself...'
multimeter: '&bStored Energy: &3%stored% &b/ &3%capacity%'
piglin-barter: '&4You cannot barter with piglins using Slimefun items'
talisman:
anvil: '&a&oYour Talisman saved your tool from breaking'

View File

@ -151,6 +151,7 @@ messages:
- "&7Всегда смотрите на светлую сторону жизни!"
- "&7Вы съели странное печенье, до жути напоминающее бисквит"
- "&7Неоновые таблички просто ШИК!"
piglin-barter: "&4Вы не можете торговать с пиглинами, используя Slimefun предметы"
machines:
pattern-not-found: "&eК сожалению, не удалось распознать этот рецепт. Пожалуйста,
разложите предметы в верной последовательности в раздатчик."
@ -292,6 +293,8 @@ languages:
zh-CN: Китайский (Китай)
el: Греческий
he: Иврит
pt: Португальский (Португалия)
pt-BR: Португальский (Бразилия)
ar: Арабский
af: Бурский
da: Датский
@ -303,8 +306,6 @@ languages:
fa: Персидский
th: Тайский
ro: Румынский
pt: Португальский (Португалия)
pt-BR: Португальский (Бразилия)
bg: Болгарский
ko: Корейский
tr: Турецкий

View File

@ -149,6 +149,7 @@ messages:
- "&7Daima hayatın parlak tarafından bak!"
- "&7Bu aslında bir Bisküvi idi, Kurabiye değil."
- "&7Neon levhalar ışık yayar!"
piglin-barter: "&4Slimefun eşyalarıyla, piglinlerle ticaret yapamazsın"
machines:
pattern-not-found: "&eÜzgünüm, bu tarifi tanıyamadım. Lütfen Eşyaları Dağıtıcıya
doğru şekilde yerleştirin."

View File

@ -147,6 +147,7 @@ messages:
- "&7Завжди дивіться на світлу сторону життя!"
- "&7Цього разу попався бісквіт, а не печиво"
- "&7Неонові таблички просто ШИК!"
piglin-barter: "&4Ви не можете торгувати з піґлінами, використовуючи Slimefun предмети"
machines:
pattern-not-found: "&eНа жаль, не вдалось розпізнати цей рецепт. Будь ласка, розмістіть
предмети у правильній послідовності у роздавач."
@ -287,7 +288,6 @@ languages:
zh-CN: Китайська (Китай)
el: Грецька
he: Іврит
pt: Португальська (Португалія)
pt-BR: Португальська (Бразилія)
ar: Арабська
af: Бурська
@ -300,6 +300,7 @@ languages:
fa: Перська
th: Тайська
ro: Румунська
pt: Португальська (Португалія)
bg: Болгарська
ko: Корейська
tr: Турецька