mirror of
https://github.com/StarWishsama/Slimefun4.git
synced 2024-09-20 03:35:51 +00:00
Merge branch 'master' of https://github.com/TheBusyBiscuit/Slimefun4
into experimental Conflicts: CHANGELOG.md
This commit is contained in:
commit
92ca696140
44
.github/ISSUE_TEMPLATE/bug-report.md
vendored
44
.github/ISSUE_TEMPLATE/bug-report.md
vendored
@ -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:
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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!");
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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()});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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());
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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) {
|
||||
|
@ -16,6 +16,7 @@ options:
|
||||
legacy-ore-grinder: true
|
||||
language: en
|
||||
enable-translations: true
|
||||
log-duplicate-block-entries: true
|
||||
|
||||
guide:
|
||||
default-view-book: false
|
||||
|
@ -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!"
|
||||
|
@ -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'
|
||||
|
@ -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: Турецкий
|
||||
|
@ -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."
|
||||
|
@ -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: Турецька
|
||||
|
Loading…
Reference in New Issue
Block a user