io.papermc
paperlib
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/VersionsCommand.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/VersionsCommand.java
index c63601815..2ca581eff 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/VersionsCommand.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/VersionsCommand.java
@@ -2,17 +2,16 @@ package io.github.thebusybiscuit.slimefun4.core.commands.subcommands;
import java.util.Collection;
-import org.bukkit.Bukkit;
-import org.bukkit.ChatColor;
-import org.bukkit.command.CommandSender;
-import org.bukkit.command.ConsoleCommandSender;
-import org.bukkit.plugin.Plugin;
-
import io.github.thebusybiscuit.cscorelib2.chat.ChatColors;
import io.github.thebusybiscuit.cscorelib2.reflection.ReflectionUtils;
import io.github.thebusybiscuit.slimefun4.core.commands.SlimefunCommand;
import io.github.thebusybiscuit.slimefun4.core.commands.SubCommand;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.command.ConsoleCommandSender;
+import org.bukkit.plugin.Plugin;
import io.papermc.lib.PaperLib;
class VersionsCommand extends SubCommand {
@@ -42,8 +41,11 @@ class VersionsCommand extends SubCommand {
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.getRegistry().isBackwardsCompatible()) {
- sender.sendMessage(ChatColor.YELLOW + "Backwards compatiblity enabled!");
+ sender.sendMessage(ChatColor.YELLOW + "Backwards compatibility enabled!");
}
sender.sendMessage("");
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/MetricsService.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/MetricsService.java
new file mode 100644
index 000000000..fef03a78a
--- /dev/null
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/MetricsService.java
@@ -0,0 +1,242 @@
+package io.github.thebusybiscuit.slimefun4.core.services;
+
+import javax.annotation.Nullable;
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.logging.Level;
+
+import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
+import io.github.thebusybiscuit.slimefun4.utils.PatternUtils;
+import kong.unirest.HttpResponse;
+import kong.unirest.JsonNode;
+import kong.unirest.Unirest;
+import kong.unirest.UnirestException;
+import me.mrCookieSlime.Slimefun.api.Slimefun;
+import org.bukkit.plugin.Plugin;
+
+/**
+ * This Class represents a Metrics Service that sends data to https://bstats.org/
+ * This data is used to analyse the usage of this {@link Plugin}.
+ *
+ * You can find more info in the README file of this Project on GitHub.
+ * Note: To start the metrics you will need to be calling {@link #start()}
+ *
+ * @author WalshyDev
+ */
+public class MetricsService {
+
+ private static final String REPO_NAME = "MetricsModule";
+ private static final String GH_API = "https://api.github.com/repos/Slimefun/" + REPO_NAME;
+ private static final String GH_RELEASES = "https://github.com/Slimefun/" + REPO_NAME + "/releases/download";
+
+ private final SlimefunPlugin plugin;
+ private final File parentFolder;
+ private final File metricsModuleFile;
+
+ private URLClassLoader moduleClassLoader;
+ private String metricVersion = null;
+ private boolean hasDownloadedUpdate = false;
+
+ static {
+ Unirest.config()
+ .concurrency(2, 1)
+ .setDefaultHeader("User-Agent", "MetricsModule Auto-Updater")
+ .setDefaultHeader("Accept", "application/vnd.github.v3+json")
+ .enableCookieManagement(false)
+ .cookieSpec("ignoreCookies");
+ }
+
+ public MetricsService(SlimefunPlugin plugin) {
+ this.plugin = plugin;
+ this.parentFolder = new File(plugin.getDataFolder(), "cache" + File.separatorChar + "modules");
+
+ if (!parentFolder.exists()) {
+ parentFolder.mkdirs();
+ }
+
+ this.metricsModuleFile = new File(parentFolder, REPO_NAME + ".jar");
+ }
+
+ /**
+ * This method loads the metric module and starts the metrics collection.
+ */
+ public void start() {
+ if (!metricsModuleFile.exists()) {
+ plugin.getLogger().info(REPO_NAME + " does not exist, downloading...");
+
+ if (!download(getLatestVersion())) {
+ plugin.getLogger().warning("Failed to start metrics as the file could not be downloaded.");
+ return;
+ }
+ }
+
+ 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");
+
+ metricVersion = cl.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)
+ ) {
+ plugin.getLogger().info("Cleaning up and re-loading Metrics.");
+ cleanUp();
+ start();
+ return;
+ }
+
+ // Finally, we're good to start this.
+ Method start = cl.getDeclaredMethod("start");
+ String version = cl.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) {
+ 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);
+ }
+ }
+
+ /**
+ * This will close the child classloader and mark all the resources held under this no longer
+ * in use, they will be cleaned up the next GC run.
+ */
+ public void cleanUp() {
+ try {
+ 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.");
+ }
+ }
+
+ /**
+ * 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.
+ * @return True if there is an update available.
+ */
+ public boolean checkForUpdate(String currentVersion) {
+ if (currentVersion == null || !PatternUtils.NUMERIC.matcher(currentVersion).matches()) {
+ return false;
+ }
+
+ int latest = getLatestVersion();
+
+ if (latest > Integer.parseInt(currentVersion)) {
+ return download(latest);
+ }
+
+ return false;
+ }
+
+ /**
+ * Gets the latest version available as an int.
+ * This is an internal method used by {@link #checkForUpdate(String)}.
+ * If it cannot get the version for whatever reason this will return 0, effectively always
+ * being behind.
+ *
+ * @return The latest version as an integer or -1 if it failed to fetch.
+ */
+ private int getLatestVersion() {
+ try {
+ HttpResponse response = Unirest.get(GH_API + "/releases/latest")
+ .asJson();
+ if (!response.isSuccess()) return -1;
+
+ JsonNode node = response.getBody();
+
+ if (node == null) return -1;
+
+ return node.getObject().getInt("tag_name");
+ } catch (UnirestException e) {
+ plugin.getLogger().log(Level.SEVERE, "Failed to fetch latest builds for SFMetrics");
+ return -1;
+ }
+ }
+
+ /**
+ * Downloads the version specified to Slimefun's data folder.
+ *
+ * @param version The version to download.
+ */
+ private boolean download(int version) {
+ File f = new File(parentFolder, "Metrics-" + version + ".jar");
+
+ try {
+ plugin.getLogger().log(Level.INFO, "# Starting download of MetricsModule build: #{0}", version);
+
+ AtomicInteger lastPercentPosted = new AtomicInteger();
+ HttpResponse response = Unirest.get(GH_RELEASES + "/" + version
+ + "/" + REPO_NAME + ".jar")
+ .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)");
+ lastPercentPosted.set(percent);
+ }
+ })
+ .asFile(f.getPath());
+ if (response.isSuccess()) {
+ 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);
+
+ metricVersion = String.valueOf(version);
+ 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());
+ }
+ return false;
+ }
+
+ /**
+ * Returns the currently downloaded metrics version.
+ * This can change! It may be null or an
+ * older version before it has downloaded a newer one.
+ *
+ * @return The current version or null if not loaded.
+ */
+ @Nullable
+ public String getVersion() {
+ return metricVersion;
+ }
+
+ /**
+ * Returns if the current server has metrics auto-updates enabled.
+ *
+ * @return True if the current server has metrics auto-updates enabled.
+ */
+ public boolean hasAutoUpdates() {
+ return SlimefunPlugin.instance().getConfig().getBoolean("metrics.auto-update");
+ }
+}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/ContributionsConnector.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/ContributionsConnector.java
index 5f50d2783..7aea16847 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/ContributionsConnector.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/ContributionsConnector.java
@@ -6,10 +6,9 @@ import java.util.List;
import java.util.Map;
import java.util.logging.Level;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-
+import kong.unirest.JsonNode;
+import kong.unirest.json.JSONArray;
+import kong.unirest.json.JSONObject;
import me.mrCookieSlime.Slimefun.api.Slimefun;
class ContributionsConnector extends GitHubConnector {
@@ -57,10 +56,10 @@ class ContributionsConnector extends GitHubConnector {
}
@Override
- public void onSuccess(JsonElement element) {
+ public void onSuccess(JsonNode element) {
finished = true;
- if (element.isJsonArray()) {
- computeContributors(element.getAsJsonArray());
+ if (element.isArray()) {
+ computeContributors(element.getArray());
}
else {
Slimefun.getLogger().log(Level.WARNING, "Received an unusual answer from GitHub, possibly a timeout? ({0})", element);
@@ -82,13 +81,13 @@ class ContributionsConnector extends GitHubConnector {
return "/contributors?per_page=100&page=" + page;
}
- private void computeContributors(JsonArray array) {
- for (int i = 0; i < array.size(); i++) {
- JsonObject object = array.get(i).getAsJsonObject();
+ private void computeContributors(JSONArray array) {
+ for (int i = 0; i < array.length(); i++) {
+ JSONObject object = array.getJSONObject(i);
- String name = object.get("login").getAsString();
- int commits = object.get("contributions").getAsInt();
- String profile = object.get("html_url").getAsString();
+ String name = object.getString("login");
+ int commits = object.getInt("contributions");
+ String profile = object.getString("html_url");
if (!blacklist.contains(name)) {
github.addContributor(aliases.getOrDefault(name, name), profile, role, commits);
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubConnector.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubConnector.java
index 68e76ec42..1ab1b4149 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubConnector.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubConnector.java
@@ -6,17 +6,14 @@ import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
-import java.net.URL;
-import java.net.URLConnection;
-import java.nio.channels.Channels;
-import java.nio.channels.ReadableByteChannel;
import java.nio.charset.StandardCharsets;
import java.util.logging.Level;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonParser;
-
-import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
+import kong.unirest.HttpResponse;
+import kong.unirest.JsonNode;
+import kong.unirest.Unirest;
+import kong.unirest.UnirestException;
+import kong.unirest.json.JSONException;
import me.mrCookieSlime.Slimefun.api.Slimefun;
abstract class GitHubConnector {
@@ -34,7 +31,7 @@ abstract class GitHubConnector {
public abstract String getURLSuffix();
- public abstract void onSuccess(JsonElement element);
+ public abstract void onSuccess(JsonNode element);
public void onFailure() {
// Don't do anything by default
@@ -48,58 +45,54 @@ abstract class GitHubConnector {
}
try {
- URL website = new URL("https://api.github.com/repos/" + repository + getURLSuffix());
+ HttpResponse resp = Unirest.get("https://api.github.com/repos/" + repository + getURLSuffix())
+ .header("User-Agent", "Slimefun4 (https://github.com/Slimefun)")
+ .asJson();
- URLConnection connection = website.openConnection();
- connection.setConnectTimeout(8000);
- connection.addRequestProperty("Accept-Charset", "UTF-8");
- connection.addRequestProperty("User-Agent", "Slimefun 4 GitHub Agent (by TheBusyBiscuit)");
- connection.setDoOutput(true);
-
- try (ReadableByteChannel channel = Channels.newChannel(connection.getInputStream())) {
- try (FileOutputStream stream = new FileOutputStream(file)) {
- stream.getChannel().transferFrom(channel, 0, Long.MAX_VALUE);
- parseData();
- }
+ if (resp.isSuccess()) {
+ onSuccess(resp.getBody());
+ writeCacheFile(resp.getBody());
+ }
+ else {
+ Slimefun.getLogger().log(Level.WARNING, "Failed to fetch {0}", repository + getURLSuffix());
}
}
- catch (IOException e) {
+ catch (UnirestException e) {
if (github.isLoggingEnabled()) {
Slimefun.getLogger().log(Level.WARNING, "Could not connect to GitHub in time.");
}
- if (hasData()) {
- parseData();
- }
- else {
- onFailure();
- }
- }
- }
+ // It has the cached file, let's just read that then
+ if (file.exists()) {
+ JsonNode cache = readCacheFile();
- public boolean hasData() {
- return getFile().exists();
- }
-
- public File getFile() {
- return file;
- }
-
- public void parseData() {
- try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(getFile()), StandardCharsets.UTF_8))) {
- StringBuilder builder = new StringBuilder();
-
- String line;
- while ((line = reader.readLine()) != null) {
- builder.append(line);
+ if (cache != null) {
+ onSuccess(cache);
+ return;
+ }
}
- JsonElement element = new JsonParser().parse(builder.toString());
- onSuccess(element);
- }
- catch (IOException x) {
- Slimefun.getLogger().log(Level.SEVERE, x, () -> "An Error occurred while parsing GitHub-Data for Slimefun " + SlimefunPlugin.getVersion());
+ // If the request failed and it failed to read the cache then call onFailure.
onFailure();
}
}
+
+ private JsonNode readCacheFile() {
+ try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8))) {
+ return new JsonNode(br.readLine());
+ }
+ catch (IOException | JSONException e) {
+ Slimefun.getLogger().log(Level.WARNING, "Failed to read Github cache file: {0}", file.getName());
+ return null;
+ }
+ }
+
+ private void writeCacheFile(JsonNode node) {
+ try (FileOutputStream fos = new FileOutputStream(file)) {
+ fos.write(node.toString().getBytes(StandardCharsets.UTF_8));
+ }
+ catch (IOException e) {
+ Slimefun.getLogger().log(Level.WARNING, "Failed to populate GitHub cache");
+ }
+ }
}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubIssuesTracker.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubIssuesTracker.java
index 9686d4e92..84af62998 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubIssuesTracker.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubIssuesTracker.java
@@ -2,10 +2,9 @@ package io.github.thebusybiscuit.slimefun4.core.services.github;
import java.util.logging.Level;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-
+import kong.unirest.JsonNode;
+import kong.unirest.json.JSONArray;
+import kong.unirest.json.JSONObject;
import me.mrCookieSlime.Slimefun.api.Slimefun;
class GitHubIssuesTracker extends GitHubConnector {
@@ -25,15 +24,15 @@ class GitHubIssuesTracker extends GitHubConnector {
}
@Override
- public void onSuccess(JsonElement element) {
- if (element.isJsonArray()) {
- JsonArray array = element.getAsJsonArray();
+ public void onSuccess(JsonNode element) {
+ if (element.isArray()) {
+ JSONArray array = element.getArray();
int issues = 0;
int pullRequests = 0;
- for (JsonElement elem : array) {
- JsonObject obj = elem.getAsJsonObject();
+ for (int i = 0; i < array.length(); i++) {
+ JSONObject obj = array.getJSONObject(i);
if (obj.has("pull_request")) {
pullRequests++;
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubService.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubService.java
index 0364140d0..77df08cc0 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubService.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubService.java
@@ -9,14 +9,13 @@ import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-
import io.github.thebusybiscuit.cscorelib2.config.Config;
import io.github.thebusybiscuit.slimefun4.core.services.localization.Translators;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import io.github.thebusybiscuit.slimefun4.utils.HeadTexture;
import io.github.thebusybiscuit.slimefun4.utils.NumberUtils;
+import kong.unirest.JsonNode;
+import kong.unirest.json.JSONObject;
/**
* This Service is responsible for grabbing every {@link Contributor} to this project
@@ -108,11 +107,11 @@ public class GitHubService {
connectors.add(new GitHubConnector(this, repository) {
@Override
- public void onSuccess(JsonElement element) {
- JsonObject object = element.getAsJsonObject();
- forks = object.get("forks").getAsInt();
- stars = object.get("stargazers_count").getAsInt();
- lastUpdate = NumberUtils.parseGitHubDate(object.get("pushed_at").getAsString());
+ public void onSuccess(JsonNode element) {
+ JSONObject object = element.getObject();
+ forks = object.getInt("forks");
+ stars = object.getInt("stargazers_count");
+ lastUpdate = NumberUtils.parseGitHubDate(object.getString("pushed_at"));
}
@Override
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/AddonsChart.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/AddonsChart.java
deleted file mode 100644
index 2ed2a7d59..000000000
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/AddonsChart.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package io.github.thebusybiscuit.slimefun4.core.services.metrics;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.bstats.bukkit.Metrics.AdvancedPie;
-import org.bukkit.plugin.Plugin;
-
-import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
-
-class AddonsChart extends AdvancedPie {
-
- AddonsChart() {
- super("installed_addons", () -> {
- Map addons = new HashMap<>();
-
- for (Plugin plugin : SlimefunPlugin.getInstalledAddons()) {
- if (plugin.isEnabled()) {
- addons.put(plugin.getName(), 1);
- }
- }
-
- return addons;
- });
- }
-
-}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/AutoUpdaterChart.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/AutoUpdaterChart.java
deleted file mode 100644
index eba426338..000000000
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/AutoUpdaterChart.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package io.github.thebusybiscuit.slimefun4.core.services.metrics;
-
-import org.bstats.bukkit.Metrics.SimplePie;
-
-import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
-
-class AutoUpdaterChart extends SimplePie {
-
- AutoUpdaterChart() {
- super("auto_updates", () -> {
- boolean enabled = SlimefunPlugin.getUpdater().isEnabled();
- return enabled ? "enabled" : "disabled";
- });
- }
-
-}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/CommandChart.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/CommandChart.java
deleted file mode 100644
index d9fc909c1..000000000
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/CommandChart.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package io.github.thebusybiscuit.slimefun4.core.services.metrics;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.bstats.bukkit.Metrics.AdvancedPie;
-
-import io.github.thebusybiscuit.slimefun4.core.commands.SubCommand;
-import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
-
-class CommandChart extends AdvancedPie {
-
- CommandChart() {
- super("commands_ran", () -> {
- Map commands = new HashMap<>();
-
- for (Map.Entry entry : SlimefunPlugin.getCommand().getCommandUsage().entrySet()) {
- commands.put("/sf " + entry.getKey().getName(), entry.getValue());
- }
-
- return commands;
- });
- }
-
-}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/CompatibilityModeChart.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/CompatibilityModeChart.java
deleted file mode 100644
index 045c2657e..000000000
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/CompatibilityModeChart.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package io.github.thebusybiscuit.slimefun4.core.services.metrics;
-
-import org.bstats.bukkit.Metrics.SimplePie;
-
-import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
-
-class CompatibilityModeChart extends SimplePie {
-
- CompatibilityModeChart() {
- super("compatibility_mode", () -> {
- boolean enabled = SlimefunPlugin.getRegistry().isBackwardsCompatible();
- return enabled ? "enabled" : "disabled";
- });
- }
-
-}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/GuideLayoutChart.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/GuideLayoutChart.java
deleted file mode 100644
index 75fc72b42..000000000
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/GuideLayoutChart.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package io.github.thebusybiscuit.slimefun4.core.services.metrics;
-
-import org.bstats.bukkit.Metrics.SimplePie;
-
-import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
-
-class GuideLayoutChart extends SimplePie {
-
- GuideLayoutChart() {
- super("guide_layout", () -> {
- boolean book = SlimefunPlugin.getCfg().getBoolean("guide.default-view-book");
-
- return book ? "Book" : "Chest GUI";
- });
- }
-
-}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/MetricsService.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/MetricsService.java
deleted file mode 100644
index d6654f6a2..000000000
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/MetricsService.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package io.github.thebusybiscuit.slimefun4.core.services.metrics;
-
-import org.bstats.bukkit.Metrics;
-import org.bukkit.plugin.Plugin;
-
-import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
-
-/**
- * This Class represents a Metrics Service that sends data to https://bstats.org/
- * This data is used to analyse the usage of this {@link Plugin}.
- *
- * You can find more info in the README file of this Project on GitHub.
- *
- * @author TheBusyBiscuit
- *
- */
-public class MetricsService {
-
- private final SlimefunPlugin plugin;
-
- /**
- * This creates a new {@link MetricsService}. The constructor does not set up
- * anything related to bStats yet, that happens in the {@link MetricsService#start()} method.
- *
- * @param plugin
- * The instance of our {@link SlimefunPlugin}
- */
- public MetricsService(SlimefunPlugin plugin) {
- this.plugin = plugin;
- }
-
- /**
- * This method intializes and starts the metrics collection.
- */
- public void start() {
- Metrics metrics = new Metrics(plugin, 4574);
-
- if (SlimefunPlugin.getUpdater().getBranch().isOfficial()) {
- // We really do not need this data if it is an unofficially modified build...
- metrics.addCustomChart(new AutoUpdaterChart());
- }
-
- metrics.addCustomChart(new ResourcePackChart());
- metrics.addCustomChart(new SlimefunVersionChart());
- metrics.addCustomChart(new ServerLanguageChart());
- metrics.addCustomChart(new PlayerLanguageChart());
- metrics.addCustomChart(new ResearchesEnabledChart());
- metrics.addCustomChart(new GuideLayoutChart());
- metrics.addCustomChart(new AddonsChart());
- metrics.addCustomChart(new CommandChart());
- metrics.addCustomChart(new ServerSizeChart());
- metrics.addCustomChart(new CompatibilityModeChart());
- }
-
-}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/PlayerLanguageChart.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/PlayerLanguageChart.java
deleted file mode 100644
index 347bf0640..000000000
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/PlayerLanguageChart.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package io.github.thebusybiscuit.slimefun4.core.services.metrics;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.bstats.bukkit.Metrics.AdvancedPie;
-import org.bukkit.Bukkit;
-import org.bukkit.entity.Player;
-
-import io.github.thebusybiscuit.slimefun4.core.services.localization.Language;
-import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
-
-class PlayerLanguageChart extends AdvancedPie {
-
- PlayerLanguageChart() {
- super("player_languages", () -> {
- Map languages = new HashMap<>();
-
- for (Player p : Bukkit.getOnlinePlayers()) {
- Language language = SlimefunPlugin.getLocalization().getLanguage(p);
- boolean supported = SlimefunPlugin.getLocalization().isLanguageLoaded(language.getId());
-
- String lang = supported ? language.getId() : "Unsupported Language";
- languages.merge(lang, 1, Integer::sum);
- }
-
- return languages;
- });
- }
-
-}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/ResearchesEnabledChart.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/ResearchesEnabledChart.java
deleted file mode 100644
index 87a66bf2f..000000000
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/ResearchesEnabledChart.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package io.github.thebusybiscuit.slimefun4.core.services.metrics;
-
-import org.bstats.bukkit.Metrics.SimplePie;
-
-import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
-
-class ResearchesEnabledChart extends SimplePie {
-
- ResearchesEnabledChart() {
- super("servers_with_researches_enabled", () -> {
- boolean enabled = SlimefunPlugin.getRegistry().isFreeCreativeResearchingEnabled();
- return enabled ? "enabled" : "disabled";
- });
- }
-
-}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/ResourcePackChart.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/ResourcePackChart.java
deleted file mode 100644
index 0622c6e03..000000000
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/ResourcePackChart.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package io.github.thebusybiscuit.slimefun4.core.services.metrics;
-
-import org.bstats.bukkit.Metrics.SimplePie;
-
-import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
-
-class ResourcePackChart extends SimplePie {
-
- ResourcePackChart() {
- super("resourcepack", () -> {
- String version = SlimefunPlugin.getItemTextureService().getVersion();
-
- if (version != null && version.startsWith("v")) {
- return version + " (Official)";
- }
- else if (SlimefunPlugin.getItemTextureService().isActive()) {
- return "Custom / Modified";
- }
- else {
- return "None";
- }
- });
- }
-
-}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/ServerLanguageChart.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/ServerLanguageChart.java
deleted file mode 100644
index e006eaf6d..000000000
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/ServerLanguageChart.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package io.github.thebusybiscuit.slimefun4.core.services.metrics;
-
-import org.bstats.bukkit.Metrics.SimplePie;
-
-import io.github.thebusybiscuit.slimefun4.core.services.localization.Language;
-import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
-
-class ServerLanguageChart extends SimplePie {
-
- ServerLanguageChart() {
- super("language", () -> {
- Language language = SlimefunPlugin.getLocalization().getDefaultLanguage();
- boolean supported = SlimefunPlugin.getLocalization().isLanguageLoaded(language.getId());
- return supported ? language.getId() : "Unsupported Language";
- });
- }
-
-}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/ServerSizeChart.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/ServerSizeChart.java
deleted file mode 100644
index 607859ba6..000000000
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/ServerSizeChart.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package io.github.thebusybiscuit.slimefun4.core.services.metrics;
-
-import org.bstats.bukkit.Metrics.SimplePie;
-import org.bukkit.Bukkit;
-
-class ServerSizeChart extends SimplePie {
-
- ServerSizeChart() {
- super("server_size", () -> {
- int players = Bukkit.getOnlinePlayers().size();
-
- if (players < 10) {
- return "0-10";
- }
-
- if (players < 25) {
- return "10-25";
- }
-
- if (players < 50) {
- return "25-50";
- }
-
- if (players < 100) {
- return "50-100";
- }
-
- if (players < 200) {
- return "100-200";
- }
-
- if (players < 300) {
- return "200-300";
- }
-
- return "300+";
- });
- }
-
-}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/SlimefunVersionChart.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/SlimefunVersionChart.java
deleted file mode 100644
index 6140b60b0..000000000
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/SlimefunVersionChart.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package io.github.thebusybiscuit.slimefun4.core.services.metrics;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.bstats.bukkit.Metrics.DrilldownPie;
-
-import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
-
-class SlimefunVersionChart extends DrilldownPie {
-
- SlimefunVersionChart() {
- super("slimefun_version", () -> {
- Map> outerMap = new HashMap<>();
- Map innerMap = new HashMap<>();
-
- innerMap.put(SlimefunPlugin.getVersion(), 1);
- outerMap.put(SlimefunPlugin.getUpdater().getBranch().getName(), innerMap);
-
- return outerMap;
- });
- }
-
-}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/package-info.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/package-info.java
deleted file mode 100644
index 3528603ca..000000000
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * This package contains everything related to bStats Metrics
- */
-package io.github.thebusybiscuit.slimefun4.core.services.metrics;
\ No newline at end of file
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/SlimefunPlugin.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/SlimefunPlugin.java
index f149a7712..b46b45f22 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/SlimefunPlugin.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/SlimefunPlugin.java
@@ -41,7 +41,7 @@ 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.metrics.MetricsService;
+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;
@@ -197,7 +197,7 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon {
networkManager = new NetworkManager(networkSize);
// Setting up bStats
- metricsService.start();
+ new Thread(metricsService::start).start();
// Starting the Auto-Updater
if (config.getBoolean("options.auto-update")) {
@@ -368,6 +368,8 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon {
// Create a new backup zip
backupService.run();
+ metricsService.cleanUp();
+
// Prevent Memory Leaks
// These static Maps should be removed at some point...
AContainer.processing = null;
@@ -570,6 +572,16 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon {
return instance.updaterService;
}
+ /**
+ * This method returns the {@link MetricsService} of Slimefun.
+ * It is used to handle sending metric information to bStats.
+ *
+ * @return The {@link MetricsService} for Slimefun
+ */
+ public static MetricsService getMetricsService() {
+ return instance.metricsService;
+ }
+
/**
* This method returns the {@link GitHubService} of Slimefun.
* It is used to retrieve data from GitHub repositories.
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/CargoManager.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/CargoManager.java
index be3bb5d5d..bd1e20633 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/CargoManager.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/CargoManager.java
@@ -46,8 +46,6 @@ public class CargoManager extends SlimefunItem {
}, new BlockUseHandler() {
- private final String visualizerKey = "visualizer";
-
@Override
public void onRightClick(PlayerRightClickEvent e) {
Optional block = e.getClickedBlock();
@@ -56,12 +54,12 @@ public class CargoManager extends SlimefunItem {
Player p = e.getPlayer();
Block b = block.get();
- if (BlockStorage.getLocationInfo(b.getLocation(), visualizerKey) == null) {
- BlockStorage.addBlockInfo(b, visualizerKey, "disabled");
+ if (BlockStorage.getLocationInfo(b.getLocation(), "visualizer") == null) {
+ BlockStorage.addBlockInfo(b, "visualizer", "disabled");
p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cCargo Net Visualizer: " + "&4\u2718"));
}
else {
- BlockStorage.addBlockInfo(b, visualizerKey, null);
+ BlockStorage.addBlockInfo(b, "visualizer", null);
p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cCargo Net Visualizer: " + "&2\u2714"));
}
}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/OreCrusher.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/OreCrusher.java
index d5b52795a..9d07221a0 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/OreCrusher.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/OreCrusher.java
@@ -50,6 +50,12 @@ public class OreCrusher extends MultiBlockMachine {
recipes.add(new ItemStack(Material.MAGMA_BLOCK, 4));
recipes.add(SlimefunItems.SULFATE);
+
+ recipes.add(SlimefunItems.CARBON);
+ recipes.add(new ItemStack(Material.COAL, 8));
+
+ recipes.add(SlimefunItems.COMPRESSED_CARBON);
+ recipes.add(new SlimefunItemStack(SlimefunItems.CARBON, 4));
}
public boolean isOreDoublingEnabled() {
diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/Research.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/Research.java
deleted file mode 100644
index eeb6ab35d..000000000
--- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/Research.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package me.mrCookieSlime.Slimefun.Objects;
-
-import org.bukkit.NamespacedKey;
-
-/**
- * @deprecated Moved to io.github.thebusybiscuit.slimefun4.core.researching.Research
- *
- */
-@Deprecated
-public class Research extends io.github.thebusybiscuit.slimefun4.core.researching.Research {
-
- public Research(NamespacedKey key, int id, String name, int cost) {
- super(key, id, name, cost);
- }
-}
\ No newline at end of file
diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SimpleSlimefunItem.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SimpleSlimefunItem.java
deleted file mode 100644
index f90416c80..000000000
--- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SimpleSlimefunItem.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package me.mrCookieSlime.Slimefun.Objects.SlimefunItem;
-
-import org.bukkit.inventory.ItemStack;
-
-import me.mrCookieSlime.Slimefun.Lists.RecipeType;
-import me.mrCookieSlime.Slimefun.Objects.Category;
-import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler;
-import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
-
-/**
- * @deprecated Moved to {@link io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem}
- *
- * @param
- * deprecated.
- */
-@Deprecated
-public abstract class SimpleSlimefunItem extends io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem {
-
- public SimpleSlimefunItem(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
- super(category, item, recipeType, recipe);
- }
-
- public SimpleSlimefunItem(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) {
- super(category, item, recipeType, recipe, recipeOutput);
- }
-
-}
diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/handlers/ItemUseHandler.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/handlers/ItemUseHandler.java
deleted file mode 100644
index 13c5653b2..000000000
--- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/handlers/ItemUseHandler.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package me.mrCookieSlime.Slimefun.Objects.handlers;
-
-/**
- * @deprecated Moved to {@link io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler}
- */
-@Deprecated
-public interface ItemUseHandler extends io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler {
-
-}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 3ff862a3d..eca44c177 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -6,7 +6,7 @@ options:
auto-update: true
backwards-compatibility: true
- chat-prefix: '&a&lSlimefun 4 &7>'
+ chat-prefix: '&a&lSlimefun 4&7> '
armor-update-interval: 10
enable-armor-effects: true
auto-save-delay-in-minutes: 10
@@ -40,6 +40,9 @@ items:
backpacks: true
soulbound: true
+metrics:
+ auto-update: true
+
research-ranks:
- Chicken
- Cow
diff --git a/src/main/resources/languages/categories_hu.yml b/src/main/resources/languages/categories_hu.yml
index c02ce2fcb..812f254a8 100644
--- a/src/main/resources/languages/categories_hu.yml
+++ b/src/main/resources/languages/categories_hu.yml
@@ -23,3 +23,4 @@ slimefun:
easter: Húsvét (Április)
birthday: TheBusyBiscuit születésnapja (Október 26.)
halloween: Halloween (Október 31.)
+ androids: Programozható Androidok
diff --git a/src/main/resources/languages/recipes_hu.yml b/src/main/resources/languages/recipes_hu.yml
index 4ded3545d..1992ade71 100644
--- a/src/main/resources/languages/recipes_hu.yml
+++ b/src/main/resources/languages/recipes_hu.yml
@@ -1,145 +1,107 @@
---
-minecraft:
- blasting:
- lore:
- - Olvaszd meg ezt a tárgyat egy Kohóban,
- - hogy elkészítsd a kívánt tárgyat
- name: Kohó Recept
- campfire:
- lore:
- - Olvaszd meg ezt a tárgyat egy Tábortűzön,
- - hogy elkészítsd a kívánt tárgyat
- name: Tábortűz Recept
- furnace:
- lore:
- - Olvaszd meg ezt a tárgyat egy Kemencében,
- - hogy elkészítsd a kívánt tárgyat
- name: Kemence Recept
- shaped:
- lore:
- - Készítsd el ezt a Tárgyat az ábra alapján
- - egy Normális Barkácsasztal segítségével.
- - A forma fontos.
- name: Barkácsrecept Forma
- shapeless:
- lore:
- - Készítsd el ezt a Tárgyat az ábra alapján
- - egy Normális Barkácsasztal segítségével.
- - Ez a Recept forma nélküli.
- name: Forma Nélküli Barkácsrecept
- smoking:
- lore:
- - Olvaszd meg ezt a tárgyat egy Füstölőben,
- - hogy elkészítsd a kívánt tárgyat
- name: Füstölő Recept
- stonecutting:
- lore:
- - Készítsd el ezt a Tárgyat az ábra alapján
- - egy Kővágó segítségével
- name: Kővágó Recept
slimefun:
- ancient_altar:
+ multiblock:
+ name: Multiblock
lore:
- - Készítsd el ezt a Tárgyat az ábra alapján
- - egy Ancient Altar segítségével.
- - Keress utána az Ancient Altar-nak a további információkért
- name: Ancient Altar
- armor_forge:
- lore:
- - Készítsd el ezt a Tárgyat az ábra alapján
- - egy Armor Forge segítségével
- name: Armor Forge
- compressor:
- lore:
- - Készítsd el ezt a Tárgyat az ábra alapján
- - egy Compressor segítségével
- name: Compressor
+ - Építsd meg a látott szerkezetet
+ - az ábra alapján. Ez nem barkácsolás.
enhanced_crafting_table:
+ name: Enhanced Crafting Table
lore:
- Készítsd el ezt a Tárgyat az ábra alapján
- egy Enhanced Crafting Table-ben.
- A normális Barkácsasztal nem lesz elegendő!
- name: Enhanced Crafting Table
- food_composter:
+ armor_forge:
+ name: Armor Forge
lore:
- Készítsd el ezt a Tárgyat az ábra alapján
- - egy Food Composter segítségével
- name: Food Composter
- food_fabricator:
- lore:
- - Készítsd el ezt a Tárgyat az ábra alapján
- - egy Food Fabricator segítségével
- name: Food Fabricator
- freezer:
- lore:
- - Készítsd el ezt a Tárgyat az ábra alapján
- - egy Freezer segítségével
- name: Freezer
- geo_miner:
- lore:
- - Ez a tárgy összegyűjthető
- - egy GEO Miner segítségével
- name: GEO Miner
- gold_pan:
- lore:
- - Használd az Gold Pan-t,
- - hogy megszerezd ezt a tárgyat
- name: Gold Pan
+ - egy Armor Forge segítségével
grind_stone:
+ name: Grind Stone
lore:
- Készítsd el ezt a Tárgyat az ábra alapján
- egy Grind Stone segítségével
- name: Grind Stone
- heated_pressure_chamber:
- lore:
- - Készítsd el ezt a Tárgyat az ábra alapján
- - egy Heated Pressure Chamber segítségével
- name: Heated Pressure Chamber
- juicer:
- lore:
- - Készítsd el ezt a Gyümölcslevet az ábra alapján
- - egy Juicer segítségével
- name: Juicer
- magic_workbench:
- lore:
- - Készítsd el ezt a Tárgyat az ábra alapján
- - egy Magic Workbench segítségével
- name: Magic Workbench
- mob_drop:
- lore:
- - Öld meg ezt az Élőlényt,
- - hogy megszerezd ezt a tárgyat
- name: Mob Drop
- multiblock:
- lore:
- - Építsd meg a látott szerkezetet
- - az ábra alapján. Ez nem barkácsolás.
- name: Multiblock
- nuclear_reactor:
- lore:
- - Ez a tárgy mellékterméke
- - a Nuclear Reactor működésének
- name: Nuclear Reactor
- ore_crusher:
- lore:
- - Készítsd el ezt a Tárgyat az ábra alapján
- - egy Ore Crusher segítségével
- name: Ore Crusher
- ore_washer:
- lore:
- - Készítsd el ezt a Tárgyat az ábra alapján
- - egy Ore Washer segítségével
- name: Ore Washer
- pressure_chamber:
- lore:
- - Készítsd el ezt a Tárgyat az ábra alapján
- - egy Pressure Chamber segítségével
- name: Pressure Chamber
smeltery:
+ name: Smeltery
lore:
- Készítsd el ezt a Tárgyat az ábra alapján
- egy Smeltery segítségével
- name: Smeltery
+ ore_crusher:
+ name: Ore Crusher
+ lore:
+ - Készítsd el ezt a Tárgyat az ábra alapján
+ - egy Ore Crusher segítségével
+ mob_drop:
+ name: Mob Drop
+ lore:
+ - Öld meg ezt az Élőlényt,
+ - hogy megszerezd ezt a tárgyat
+ gold_pan:
+ name: Gold Pan
+ lore:
+ - Használd az Gold Pan-t,
+ - hogy megszerezd ezt a tárgyat
+ compressor:
+ name: Compressor
+ lore:
+ - Készítsd el ezt a Tárgyat az ábra alapján
+ - egy Compressor segítségével
+ pressure_chamber:
+ name: Pressure Chamber
+ lore:
+ - Készítsd el ezt a Tárgyat az ábra alapján
+ - egy Pressure Chamber segítségével
+ ore_washer:
+ name: Ore Washer
+ lore:
+ - Készítsd el ezt a Tárgyat az ábra alapján
+ - egy Ore Washer segítségével
+ juicer:
+ name: Juicer
+ lore:
+ - Készítsd el ezt a Gyümölcslevet az ábra alapján
+ - egy Juicer segítségével
+ magic_workbench:
+ name: Magic Workbench
+ lore:
+ - Készítsd el ezt a Tárgyat az ábra alapján
+ - egy Magic Workbench segítségével
+ ancient_altar:
+ name: Ancient Altar
+ lore:
+ - Készítsd el ezt a Tárgyat az ábra alapján
+ - egy Ancient Altar segítségével.
+ - Keress utána az Ancient Altar-nak a további információkért
+ heated_pressure_chamber:
+ name: Heated Pressure Chamber
+ lore:
+ - Készítsd el ezt a Tárgyat az ábra alapján
+ - egy Heated Pressure Chamber segítségével
+ food_fabricator:
+ name: Food Fabricator
+ lore:
+ - Készítsd el ezt a Tárgyat az ábra alapján
+ - egy Food Fabricator segítségével
+ food_composter:
+ name: Food Composter
+ lore:
+ - Készítsd el ezt a Tárgyat az ábra alapján
+ - egy Food Composter segítségével
+ freezer:
+ name: Freezer
+ lore:
+ - Készítsd el ezt a Tárgyat az ábra alapján
+ - egy Freezer segítségével
+ geo_miner:
+ name: GEO Miner
+ lore:
+ - Ez a tárgy összegyűjthető
+ - egy GEO Miner segítségével
+ nuclear_reactor:
+ name: Nuclear Reactor
+ lore:
+ - Ez a tárgy mellékterméke
+ - a Nuclear Reactor működésének
oil_pump:
name: Oil Pump
lore:
@@ -156,3 +118,46 @@ slimefun:
lore:
- Készítsd el ezt a Tárgyat az ábra alapján
- egy Refinery segítségével
+minecraft:
+ shaped:
+ name: Barkácsrecept Forma
+ lore:
+ - Készítsd el ezt a Tárgyat az ábra alapján
+ - egy Normális Barkácsasztal segítségével.
+ - A forma fontos.
+ shapeless:
+ name: Forma Nélküli Barkácsrecept
+ lore:
+ - Készítsd el ezt a Tárgyat az ábra alapján
+ - egy Normális Barkácsasztal segítségével.
+ - Ez a Recept forma nélküli.
+ furnace:
+ name: Kemence Recept
+ lore:
+ - Olvaszd meg ezt a tárgyat egy Kemencében,
+ - hogy elkészítsd a kívánt tárgyat
+ blasting:
+ name: Kohó Recept
+ lore:
+ - Olvaszd meg ezt a tárgyat egy Kohóban,
+ - hogy elkészítsd a kívánt tárgyat
+ smoking:
+ name: Füstölő Recept
+ lore:
+ - Olvaszd meg ezt a tárgyat egy Füstölőben,
+ - hogy elkészítsd a kívánt tárgyat
+ campfire:
+ name: Tábortűz Recept
+ lore:
+ - Olvaszd meg ezt a tárgyat egy Tábortűzön,
+ - hogy elkészítsd a kívánt tárgyat
+ stonecutting:
+ name: Kővágó Recept
+ lore:
+ - Készítsd el ezt a Tárgyat az ábra alapján
+ - egy Kővágó segítségével
+ smithing:
+ name: Kovácsasztal Recept
+ lore:
+ - Készítsd el ezt a Tárgyat az ábra alapján
+ - egy Kovácsasztal segítségével
diff --git a/src/main/resources/languages/researches_hu.yml b/src/main/resources/languages/researches_hu.yml
index 21165e6ea..6ae319fe9 100644
--- a/src/main/resources/languages/researches_hu.yml
+++ b/src/main/resources/languages/researches_hu.yml
@@ -1,234 +1,238 @@
---
slimefun:
- 24k_gold_block: Aranyváros
- advanced_android: Speciális Androidok
- advanced_butcher_android: Fejlett Androidok - Hentes
- advanced_circuit_board: Fejlett Áramköri Lap
- advanced_electric_smeltery: Fejlett Elektromos Olvasztómű
- advanced_farmer_android: Fejlett Androidok - Farmer
- advanced_fisherman_android: Fejlett Androidok - Halász
- advanced_output_node: Speciális Kimeneti Csomópont
- alloys: Speciális Ötvözetek
- ancient_altar: Ősi Oltár
- ancient_runes: Elemi Rúnák
- android_interfaces: Android Csatlakozási Felületek
- android_memory_core: Memóriamag
- angel_talisman: Az Angyal Talizmánja
- animal_growth_accelerator: Az állatok Növekedésének Manipulálása
- anvil_talisman: Az Üllő Talizmánja
- armored_jetboots: Páncélozott Sugárhajtású Csizmák
- armored_jetpack: Páncélozott Jetpack
+ walking_sticks: Sétapálcák
+ portable_crafter: Hordozható Barkácsoló
+ fortune_cookie: Szerencsesüti
+ portable_dustbin: Hordozható Kuka
+ meat_jerky: Pácolt Hús
armor_forge: Páncél Barkácsolás
- auto_anvil: Automatikus Üllő
- auto_breeder: Automatizált Etetés
- auto_drier: Egy Száraz Nap
- auto_enchanting: Automatikus Fejlesztés és Fejlesztés Törlés
- automated_crafting_chamber: Automatizált Barkácsolás
- automated_panning_machine: Automatizált Aranymosó
- automatic_ignition_chamber: Automatikus Gyújtókamra
- backpacks: Hátizsákok
+ glowstone_armor: Izzókő Páncél
+ lumps: Rögök és Varázslat
+ ender_backpack: Ender Hátizsák
+ ender_armor: Ender Páncél
+ magic_eye_of_ender: Varázslatos Ender Szeme
+ magic_sugar: Varázscukor
+ monster_jerky: Pácolt Szörnyhús
+ slime_armor: Nyálka Páncél
+ sword_of_beheading: Lefejezés Kardja
basic_circuit_board: Alapvető Áramköri Lap
+ advanced_circuit_board: Fejlett Áramköri Lap
+ smeltery: Kohó
+ steel: Acélkor
+ misc_power_items: Fontos energiával kapcsolatos tárgyak
battery: Az első Akkumulátorod
- better_carbon_press: Továbbfejlesztett Szénprés
- better_crop_growth_accelerator: Továbbfejlesztett Növény Növekedés Gyorsító
- better_electric_crucibles: Forró Olvasztótégelyek
- better_electric_furnace: Továbbfejlesztett Elektromos Kemence
- better_food_fabricator: Továbbfejlesztett Élelmiszergyártás
- better_freezer: Továbbfejlesztett Fagyasztó
- better_gps_transmitters: Továbbfejlesztett Transzmitterek
- better_heated_pressure_chamber: Továbbfejlesztett Fűtött Nyomású Kamra
- better_solar_generators: Továbbfejlesztett Napelemes Generátorok
- bio_reactor: Bioreaktor
- blade_of_vampires: Vámpírok Pengéje
- blistering_ingots: Hólyagos Radioaktivitás
- block_placer: Blokk Lehelyező
- boosted_uranium: Soha Véget Nem Érő Kör
- boots_of_the_stomper: A Taposás Cipője
- bound_armor: Lélekhez Kötött Páncél
- bound_backpack: Lélekhez Kötött Tárolás
- bound_tools: Lélélekhez Kötött Eszközök
- bound_weapons: Lélekhez Kötött Fegyverek
- bronze: Bronzkészítés
- butcher_androids: Hentes Androidok
+ steel_plate: Acéllemez
+ steel_thruster: Acélhajtómű
+ parachute: Ejtőernyő
+ grappling_hook: Vasmacska
+ jetpacks: Jetpackek
+ multitools: Többfunkciós Eszközök
+ solar_panel_and_helmet: Napenergia
+ elemental_staff: Elemi Pálcák
+ grind_stone: Köszörűkő
cactus_armor: Kaktusz Ruha
- capacitors: 1. Szintű Kondenzátorok
- carbonado: Fekete Gyémántok
- carbonado_furnace: Karbonádó Szélű Kemence
- carbonado_tools: Felső Szintű Gépek
- carbon_press: Szénprés
- cargo_basics: Szállítmány Alapjai
- cargo_nodes: Szállítmány Beállítása
- chainmail_armor: Lánc Páncél
- charging_bench: Töltőpad
- coal_generator: Széngenerátor
- cobalt_pickaxe: Gyors Csákány
- combustion_reactor: Égésreaktor
- common_talisman: Gyakori Talizmán
- composter: Föld Komposztáló
+ gold_pan: Aranymosó
+ magical_book_cover: Varázslatos Könyvkötés
+ slimefun_metals: Új Fémek
+ ore_crusher: Érc Duplázás
+ bronze: Bronzkészítés
+ alloys: Speciális Ötvözetek
compressor_and_carbon: Szénkészítés
- cooler: Hordozható Italok
- copper_wire: Hígított Vezetőképesség
- crop_growth_accelerator: Növény Növekedés Gyorsító
- crucible: Olvasztótégely
- crushed_ore: Ércek Tisztítása
+ gilded_iron_armor: Aranyozott Vaspáncél
+ synthetic_diamond: Szintetikus Gyémántok
+ pressure_chamber: Nyomáskamra
+ synthetic_sapphire: Szintetikus Zafírok
damascus_steel: Damaszkuszi Acél
damascus_steel_armor: Damaszkuszi Acél Páncél
- diet_cookie: Diétás Süti
- duct_tape: Szövetbetétes Ragasztószalag
- electric_crucible: Elektromos Olvasztótégely
- electric_furnaces: Erős Kemence
- electric_ingot_machines: Elektromos Öntvénygyártás
+ reinforced_alloy: Megerősített Ötvözet
+ carbonado: Fekete Gyémántok
+ magic_workbench: Varázslatos Barkácsasztal
+ wind_staff: Szél Pálca
+ reinforced_armor: Megerősített Páncél
+ ore_washer: Ércmosó
+ gold_carats: Tiszta Arany
+ silicon: Szilícium-völgy
+ fire_staff: Tűz Pálca
+ smelters_pickaxe: Olvasztó Csákány
+ common_talisman: Gyakori Talizmán
+ anvil_talisman: Az Üllő Talizmánja
+ miner_talisman: A Bányász Talizmánja
+ hunter_talisman: A Vadász Talizmánja
+ lava_talisman: A Láva Járó Talizmánja
+ water_talisman: A Vízlélegzés Talizmánja
+ angel_talisman: Az Angyal Talizmánja
+ fire_talisman: A Tűzoltó Talizmánja
+ lava_crystal: Tüzes Helyzet
+ magician_talisman: A Bűvész Talizmánja
+ traveller_talisman: Az Utazó Talizmánja
+ warrior_talisman: A Harcos Talizmánja
+ knight_talisman: A Lovag Talizmánja
+ gilded_iron: Fényes Vas
+ synthetic_emerald: Hamis Drágakő
+ chainmail_armor: Lánc Páncél
+ whirlwind_talisman: A Forgószél Talizmánja
+ wizard_talisman: A Varázsló Talizmánja
+ lumber_axe: Fadöntő Fejsze
+ hazmat_suit: Vegyvédelmi Ruha
+ uranium: Radioaktív
+ crushed_ore: Ércek Tisztítása
+ redstone_alloy: Redstone Ötvözet
+ carbonado_tools: Felső Szintű Gépek
+ first_aid: Elsősegély
+ gold_armor: Fényes Páncél
+ night_vision_googles: Éjjellátó Szemüvegek
+ pickaxe_of_containment: Csomagtartó Csákány
+ hercules_pickaxe: Herkules Csákány
+ table_saw: Asztali Fűrész
+ slime_steel_armor: Nyálkás Acél Páncél
+ blade_of_vampires: Vámpírok Pengéje
+ water_staff: Víz Pálca
+ 24k_gold_block: Aranyváros
+ composter: Föld Komposztáló
+ farmer_shoes: Farmer Cipők
+ explosive_tools: Robbanóeszközök
+ automated_panning_machine: Automatizált Aranymosó
+ boots_of_the_stomper: A Taposás Cipője
+ pickaxe_of_the_seeker: A Kutatók Csákánya
+ backpacks: Hátizsákok
+ woven_backpack: Szőtt Hátizsák
+ crucible: Olvasztótégely
+ gilded_backpack: Aranyozott Hátizsák
+ armored_jetpack: Páncélozott Jetpack
+ ender_talismans: Ender Talizmánok
+ nickel_and_cobalt: Még több Érc
+ magnet: Mágneses Fémek
+ infused_magnet: Infúziós Mágnesek
+ cobalt_pickaxe: Gyors Csákány
+ essence_of_afterlife: Szellemidézés
+ bound_backpack: Lélekhez Kötött Tárolás
+ jetboots: Sugárhajtású Csizma
+ armored_jetboots: Páncélozott Sugárhajtású Csizmák
+ seismic_axe: Szeizmikus Fejsze
+ pickaxe_of_vein_mining: 'Ér Bányász Csákány '
+ bound_weapons: Lélekhez Kötött Fegyverek
+ bound_tools: Lélélekhez Kötött Eszközök
+ bound_armor: Lélekhez Kötött Páncél
+ juicer: Ízletes Italok
+ repaired_spawner: Spawnerek Javítása
+ enhanced_furnace: Továbbfejlesztett Kemence
+ more_enhanced_furnaces: Jobb Kemencék
+ high_tier_enhanced_furnaces: Magas Szintű Kemence
+ reinforced_furnace: Megerősített Kemence
+ carbonado_furnace: Karbonádó Szélű Kemence
electric_motor: Felmelegítés
+ block_placer: Blokk Lehelyező
+ scroll_of_dimensional_teleposition: Megfordítva a dolgokat
+ special_bows: Robin Hood
+ tome_of_knowledge_sharing: Megosztás a barátokkal
+ flask_of_knowledge: XP Tároló
+ hardened_glass: Robbanások Ellen
+ golden_apple_juice: Arany Főzet
+ cooler: Hordozható Italok
+ ancient_altar: Ősi Oltár
+ wither_proof_obsidian: Wither-Védett Obszidián
+ ancient_runes: Elemi Rúnák
+ special_runes: Lila Rúnák
+ infernal_bonemeal: Pokoli Csontliszt
+ rainbow_blocks: Szivárvány Blokkok
+ infused_hopper: Pokoli Tölcsér
+ wither_proof_glass: Wither-Védett Üveg
+ duct_tape: Szövetbetétes Ragasztószalag
+ plastic_sheet: Műanyag
+ android_memory_core: Memóriamag
+ oil: Olaj
+ fuel: Üzemanyag
+ hologram_projector: Hologramok
+ capacitors: 1. Szintű Kondenzátorok
+ high_tier_capacitors: 2. Szintű Kondenzátorok
+ solar_generators: Napenergia Erőmű
+ electric_furnaces: Erős Kemence
electric_ore_grinding: Zúzás és Őrlés
- electric_press: Elektromos Prés
- electric_smeltery: Elektromos Olvasztó
- elemental_staff: Elemi Pálcák
+ heated_pressure_chamber: Fűtött Nyomáskamra
+ coal_generator: Széngenerátor
+ bio_reactor: Bioreaktor
+ auto_enchanting: Automatikus Fejlesztés és Fejlesztés Törlés
+ auto_anvil: Automatikus Üllő
+ multimeter: Teljesítménymérés
+ gps_setup: Alapvető GPS Beállítás
+ gps_emergency_transmitter: GPS Vészhelyzeti Útpont
+ programmable_androids: Programozható Androidok
+ android_interfaces: Android Csatlakozási Felületek
+ geo_scanner: GEO-Vizsgálatok
+ combustion_reactor: Égésreaktor
+ teleporter: Teleportáló Alapelemek
+ teleporter_activation_plates: Teleportáló Aktiválás
+ better_solar_generators: Továbbfejlesztett Napelemes Generátorok
+ better_gps_transmitters: Továbbfejlesztett Transzmitterek
elevator: Liftek
- elytra: Kitinszárnyak
+ energized_solar_generator: Teljes-Munkaidős Napenergia
+ energized_gps_transmitter: Legfelső Szintű Transzmitter
+ energy_regulator: Energiahálózatok 101
+ butcher_androids: Hentes Androidok
+ organic_food: Bioélelmiszerek
+ auto_breeder: Automatizált Etetés
+ advanced_android: Speciális Androidok
+ advanced_butcher_android: Fejlett Androidok - Hentes
+ advanced_fisherman_android: Fejlett Androidok - Halász
+ animal_growth_accelerator: Az állatok Növekedésének Manipulálása
+ xp_collector: XP Gyűjtő
+ organic_fertilizer: Organikus Trágya
+ crop_growth_accelerator: Növény Növekedés Gyorsító
+ better_crop_growth_accelerator: Továbbfejlesztett Növény Növekedés Gyorsító
+ reactor_essentials: Reaktor Alapjai
+ nuclear_reactor: Atomerőmű
+ freezer: Fagyasztó Úr
+ cargo_basics: Szállítmány Alapjai
+ cargo_nodes: Szállítmány Beállítása
+ electric_ingot_machines: Elektromos Öntvénygyártás
+ high_tier_electric_ingot_machines: Szupergyors Öntvénygyártás
+ automated_crafting_chamber: Automatizált Barkácsolás
+ better_food_fabricator: Továbbfejlesztett Élelmiszergyártás
+ reactor_access_port: Reaktor Kölcsönhatás
+ fluid_pump: Folyadék Szivattyú
+ better_freezer: Továbbfejlesztett Fagyasztó
+ boosted_uranium: Soha Véget Nem Érő Kör
+ trash_can: Szemetes
+ advanced_output_node: Speciális Kimeneti Csomópont
+ carbon_press: Szénprés
+ electric_smeltery: Elektromos Olvasztó
+ better_electric_furnace: Továbbfejlesztett Elektromos Kemence
+ better_carbon_press: Továbbfejlesztett Szénprés
empowered_android: Felhatalmazott Androidok
empowered_butcher_android: Felhatalmazott Androidok - Hentes
empowered_fisherman_android: Felhatalmazott Androidok - Halász
- ender_armor: Ender Páncél
- ender_backpack: Ender Hátizsák
- ender_talismans: Ender Talizmánok
- energized_gps_transmitter: Legfelső Szintű Transzmitter
- energized_solar_generator: Teljes-Munkaidős Napenergia
- energy_regulator: Energiahálózatok 101
- enhanced_furnace: Továbbfejlesztett Kemence
- essence_of_afterlife: Szellemidézés
- explosive_tools: Robbanóeszközök
- farmer_shoes: Farmer Cipők
- fire_staff: Tűz Pálca
- fire_talisman: A Tűzoltó Talizmánja
- first_aid: Elsősegély
- flask_of_knowledge: XP Tároló
- fluid_pump: Folyadék Szivattyú
- fortune_cookie: Szerencsesüti
- freezer: Fagyasztó Úr
- fuel: Üzemanyag
- geo_miner: GEO-Bányász
- geo_scanner: GEO-Vizsgálatok
- gilded_backpack: Aranyozott Hátizsák
- gilded_iron: Fényes Vas
- gilded_iron_armor: Aranyozott Vaspáncél
- glowstone_armor: Izzókő Páncél
- gold_armor: Fényes Páncél
- gold_carats: Tiszta Arany
- golden_apple_juice: Arany Főzet
- gold_pan: Aranymosó
- gps_emergency_transmitter: GPS Vészhelyzeti Útpont
- gps_setup: Alapvető GPS Beállítás
- grappling_hook: Vasmacska
- grind_stone: Köszörűkő
- hardened_glass: Robbanások Ellen
- hazmat_suit: Vegyvédelmi Ruha
- heated_pressure_chamber: Fűtött Nyomáskamra
- hercules_pickaxe: Herkules Csákány
- high_tier_capacitors: 2. Szintű Kondenzátorok
high_tier_carbon_press: Végleges Szénprés
- high_tier_electric_ingot_machines: Szupergyors Öntvénygyártás
- high_tier_enhanced_furnaces: Magas Szintű Kemence
- hologram_projector: Hologramok
- hunter_talisman: A Vadász Talizmánja
- infernal_bonemeal: Pokoli Csontliszt
- infused_hopper: Pokoli Tölcsér
- infused_magnet: Infúziós Mágnesek
- jetboots: Sugárhajtású Csizma
- jetpacks: Jetpackek
- juicer: Ízletes Italok
- kelp_cookie: Ízletes Moszat
- knight_talisman: A Lovag Talizmánja
- lava_crystal: Tüzes Helyzet
+ wither_assembler: Automatizált Wither Ölő
+ better_heated_pressure_chamber: Továbbfejlesztett Fűtött Nyomású Kamra
+ elytra: Kitinszárnyak
+ special_elytras: Speciális Kitinszárnyak
+ electric_crucible: Elektromos Olvasztótégely
+ better_electric_crucibles: Forró Olvasztótégelyek
+ advanced_electric_smeltery: Fejlett Elektromos Olvasztómű
+ advanced_farmer_android: Fejlett Androidok - Farmer
lava_generator: Lávagenerátor
- lava_talisman: A Láva Járó Talizmánja
- lightning_rune: Villám Rúna
- lumber_axe: Fadöntő Fejsze
- lumps: Rögök és Varázslat
- magical_book_cover: Varázslatos Könyvkötés
- magic_eye_of_ender: Varázslatos Ender Szeme
- magician_talisman: A Bűvész Talizmánja
- magic_sugar: Varázscukor
- magic_workbench: Varázslatos Barkácsasztal
- magnesium_generator: Energia Magnéziumból
- magnet: Mágneses Fémek
- meat_jerky: Pácolt Hús
- miner_talisman: A Bányász Talizmánja
- misc_power_items: Fontos energiával kapcsolatos tárgyak
- monster_jerky: Pácolt Szörnyhús
- more_enhanced_furnaces: Jobb Kemencék
- multimeter: Teljesítménymérés
- multitools: Többfunkciós Eszközök
- nether_gold_pan: Nether Aranymosó
nether_ice: Nether Jéghűtő
nether_star_reactor: Nethercsillag Reaktor
- nickel_and_cobalt: Még több Érc
- night_vision_googles: Éjjellátó Szemüvegek
- nuclear_reactor: Atomerőmű
- oil: Olaj
- ore_crusher: Érc Duplázás
- ore_washer: Ércmosó
- organic_fertilizer: Organikus Trágya
- organic_food: Bioélelmiszerek
+ blistering_ingots: Hólyagos Radioaktivitás
+ automatic_ignition_chamber: Automatikus Gyújtókamra
output_chest: Alapvető Gépek Kimeneti Láda
- parachute: Ejtőernyő
- pickaxe_of_containment: Csomagtartó Csákány
- pickaxe_of_the_seeker: A Kutatók Csákánya
- pickaxe_of_vein_mining: 'Ér Bányász Csákány '
- plastic_sheet: Műanyag
- portable_crafter: Hordozható Barkácsoló
- portable_dustbin: Hordozható Kuka
- pressure_chamber: Nyomáskamra
- programmable_androids: Programozható Androidok
+ copper_wire: Hígított Vezetőképesség
radiant_backpack: Sugárzó Hátizsák
- rainbow_blocks: Szivárvány Blokkok
- reactor_access_port: Reaktor Kölcsönhatás
- reactor_essentials: Reaktor Alapjai
- redstone_alloy: Redstone Ötvözet
- reinforced_alloy: Megerősített Ötvözet
- reinforced_armor: Megerősített Páncél
- reinforced_furnace: Megerősített Kemence
- repaired_spawner: Spawnerek Javítása
- scroll_of_dimensional_teleposition: Megfordítva a dolgokat
- seismic_axe: Szeizmikus Fejsze
- silicon: Szilícium-völgy
- slime_armor: Nyálka Páncél
- slimefun_metals: Új Fémek
- slime_steel_armor: Nyálkás Acél Páncél
- smelters_pickaxe: Olvasztó Csákány
- smeltery: Kohó
- solar_generators: Napenergia Erőmű
- solar_panel_and_helmet: Napenergia
- soulbound_rune: Lélekhez Kötött Rúna
- special_bows: Robin Hood
- special_elytras: Speciális Kitinszárnyak
- special_runes: Lila Rúnák
- steel: Acélkor
- steel_plate: Acéllemez
- steel_thruster: Acélhajtómű
+ auto_drier: Egy Száraz Nap
+ diet_cookie: Diétás Süti
storm_staff: Vihar Pálca
- sword_of_beheading: Lefejezés Kardja
- synthetic_diamond: Szintetikus Gyémántok
- synthetic_emerald: Hamis Drágakő
- synthetic_sapphire: Szintetikus Zafírok
- table_saw: Asztali Fűrész
- teleporter: Teleportáló Alapelemek
- teleporter_activation_plates: Teleportáló Aktiválás
- tome_of_knowledge_sharing: Megosztás a barátokkal
+ soulbound_rune: Lélekhez Kötött Rúna
+ geo_miner: GEO-Bányász
+ lightning_rune: Villám Rúna
totem_of_undying: Életmentés Toteme
- trash_can: Szemetes
- traveller_talisman: Az Utazó Talizmánja
- uranium: Radioaktív
- walking_sticks: Sétapálcák
- warrior_talisman: A Harcos Talizmánja
- water_staff: Víz Pálca
- water_talisman: A Vízlélegzés Talizmánja
- whirlwind_talisman: A Forgószél Talizmánja
- wind_staff: Szél Pálca
- wither_assembler: Automatizált Wither Ölő
- wither_proof_glass: Wither-Védett Üveg
- wither_proof_obsidian: Wither-Védett Obszidián
- wizard_talisman: A Varázsló Talizmánja
- woven_backpack: Szőtt Hátizsák
- xp_collector: XP Gyűjtő
+ charging_bench: Töltőpad
+ nether_gold_pan: Nether Aranymosó
+ electric_press: Elektromos Prés
+ magnesium_generator: Energia Magnéziumból
+ kelp_cookie: Ízletes Moszat
makeshift_smeltery: Improvizált Olvasztó
tree_growth_accelerator: Gyorsabb Fák
+ industrial_miner: Ipari Bányászat
+ advanced_industrial_miner: Jobb Bányászat
+ magical_zombie_pills: Zombi Átváltoztató
+ auto_brewer: Ipari Sörgyár
diff --git a/src/main/resources/languages/resources_hu.yml b/src/main/resources/languages/resources_hu.yml
index 7f35f3c57..6e46c219d 100644
--- a/src/main/resources/languages/resources_hu.yml
+++ b/src/main/resources/languages/resources_hu.yml
@@ -1,7 +1,7 @@
---
tooltips:
results: GEO-Vizsgálat Eredmények
- chunk: Vizsgált Chunkok
+ chunk: Vizsgált Chunk
world: Világ
unit: Egység
units: Egységek