authMethod;
- JCheckBox betaCraftAuth;
- JLabel stateLabel;
- JButton stateButton;
-
- public GeneralTab(final ViaProxyWindow frame) {
- super(frame, "general");
- }
-
- @Override
- protected void init(JPanel contentPane) {
- JPanel top = new JPanel();
- top.setLayout(new BorderLayout());
-
- contentPane.setLayout(new BorderLayout());
- contentPane.add(top, BorderLayout.NORTH);
-
- this.addHeader(top);
- this.addBody(top);
- this.addFooter(contentPane);
- }
-
- private void addHeader(final Container parent) {
- JPanel header = new JPanel();
- header.setLayout(new GridBagLayout());
-
- LinkLabel discord = new LinkLabel("Discord", "https://discord.gg/viaversion");
- GBC.create(header).grid(0, 0).width(0).insets(BORDER_PADDING, BORDER_PADDING, 0, 0).anchor(GBC.NORTHWEST).add(discord);
-
- JLabel title = new JLabel("ViaProxy");
- title.setFont(title.getFont().deriveFont(30F));
- GBC.create(header).grid(1, 0).weightx(1).width(0).insets(BORDER_PADDING, 0, 0, 0).anchor(GBC.CENTER).add(title);
-
- JLabel copyright = new JLabel("© RK_01 & Lenni0451");
- GBC.create(header).grid(2, 0).width(0).insets(BORDER_PADDING, 0, 0, BORDER_PADDING).anchor(GBC.NORTHEAST).add(copyright);
-
- parent.add(header, BorderLayout.NORTH);
- }
-
- private void addBody(final Container parent) {
- JPanel body = new JPanel();
- body.setLayout(new GridBagLayout());
-
- int gridy = 0;
- {
- JLabel serverAddressLabel = new JLabel(I18n.get("tab.general.server_address.label"));
- serverAddressLabel.setToolTipText(I18n.get("tab.general.server_address.tooltip"));
- GBC.create(body).grid(0, gridy++).insets(BODY_BLOCK_PADDING, BORDER_PADDING, 0, 0).anchor(GBC.NORTHWEST).add(serverAddressLabel);
-
- this.serverAddress = new JTextField();
- this.serverAddress.setToolTipText(I18n.get("tab.general.server_address.tooltip"));
- ViaProxy.getSaveManager().uiSave.loadTextField("server_address", this.serverAddress);
- GBC.create(body).grid(0, gridy++).weightx(1).insets(0, BORDER_PADDING, 0, BORDER_PADDING).fill(GBC.HORIZONTAL).add(this.serverAddress);
- }
- {
- JLabel serverVersionLabel = new JLabel(I18n.get("tab.general.server_version.label"));
- GBC.create(body).grid(0, gridy++).insets(BODY_BLOCK_PADDING, BORDER_PADDING, 0, 0).anchor(GBC.NORTHWEST).add(serverVersionLabel);
-
- this.serverVersion = new JComboBox<>(ProtocolVersion.getReversedProtocols().toArray(new ProtocolVersion[0]));
- this.serverVersion.setRenderer(new DefaultListCellRenderer() {
- @Override
- public Component getListCellRendererComponent(JList> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
- if (value instanceof ProtocolVersion version) {
- value = version.getName();
- }
- return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
- }
- });
- this.serverVersion.addActionListener(event -> {
- if (this.betaCraftAuth == null) return; // This is called when the JComboBox is created (before betaCraftAuth is set)
- if (!(this.serverVersion.getSelectedItem() instanceof ProtocolVersion selectedVersion)) return;
- if (selectedVersion.olderThanOrEqualTo(LegacyProtocolVersion.c0_28toc0_30)) {
- this.betaCraftAuth.setEnabled(true);
- } else {
- this.betaCraftAuth.setEnabled(false);
- this.betaCraftAuth.setSelected(false);
- }
- });
- this.serverVersion.setSelectedItem(ViaProxy.getConfig().getTargetVersion());
- GBC.create(body).grid(0, gridy++).weightx(1).insets(0, BORDER_PADDING, 0, BORDER_PADDING).fill(GBC.HORIZONTAL).add(this.serverVersion);
- }
- {
- JLabel minecraftAccountLabel = new JLabel(I18n.get("tab.general.minecraft_account.label"));
- GBC.create(body).grid(0, gridy++).insets(BODY_BLOCK_PADDING, BORDER_PADDING, 0, 0).anchor(GBC.NORTHWEST).add(minecraftAccountLabel);
-
- this.authMethod = new JComboBox<>(ViaProxyConfig.AuthMethod.values());
- this.authMethod.setRenderer(new DefaultListCellRenderer() {
- @Override
- public Component getListCellRendererComponent(JList> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
- if (value instanceof ViaProxyConfig.AuthMethod authMethod) {
- value = I18n.get(authMethod.getGuiTranslationKey());
- }
- return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
- }
- });
- this.authMethod.setSelectedItem(ViaProxy.getConfig().getAuthMethod());
- GBC.create(body).grid(0, gridy++).weightx(1).insets(0, BORDER_PADDING, 0, BORDER_PADDING).fill(GBC.HORIZONTAL).add(this.authMethod);
- }
- {
- this.betaCraftAuth = new JCheckBox(I18n.get("tab.general.betacraft_auth.label"));
- this.betaCraftAuth.setToolTipText(I18n.get("tab.general.betacraft_auth.tooltip"));
- this.betaCraftAuth.setSelected(ViaProxy.getConfig().useBetacraftAuth());
- GBC.create(body).grid(0, gridy++).insets(BODY_BLOCK_PADDING, BORDER_PADDING, 0, 0).anchor(GBC.NORTHWEST).add(this.betaCraftAuth);
- // Simulate user action on serverVersion to update betaCraftAuth
- final ActionEvent fakeAction = new ActionEvent(this.serverVersion, ActionEvent.ACTION_PERFORMED, "");
- for (ActionListener listener : this.serverVersion.getActionListeners()) {
- listener.actionPerformed(fakeAction);
- }
- }
-
- parent.add(body, BorderLayout.CENTER);
- }
-
- private void addFooter(final Container parent) {
- JPanel footer = new JPanel();
- footer.setLayout(new GridBagLayout());
-
- this.stateLabel = new JLabel("");
- this.stateLabel.setVisible(false);
- GBC.create(footer).grid(0, 0).weightx(1).insets(0, BORDER_PADDING, 0, BORDER_PADDING).anchor(GBC.WEST).fill(GBC.HORIZONTAL).add(this.stateLabel);
-
- this.stateButton = new JButton(I18n.get("tab.general.state.loading"));
- this.stateButton.addActionListener(event -> {
- if (this.stateButton.getText().equalsIgnoreCase(I18n.get("tab.general.state.start"))) this.start();
- else if (this.stateButton.getText().equalsIgnoreCase(I18n.get("tab.general.state.stop"))) this.stop();
- });
- this.stateButton.setEnabled(false);
- GBC.create(footer).grid(0, 1).weightx(1).insets(0, BORDER_PADDING, BORDER_PADDING, BORDER_PADDING).anchor(GBC.WEST).fill(GBC.HORIZONTAL).add(this.stateButton);
-
- parent.add(footer, BorderLayout.SOUTH);
-
- final Timer timer = new Timer(100, null);
- timer.addActionListener(event -> {
- if (Via.getManager().getProtocolManager().hasLoadedMappings()) {
- this.stateButton.setText(I18n.get("tab.general.state.start"));
- this.stateButton.setEnabled(true);
- timer.stop();
-
- if (System.getProperty("viaproxy.gui.autoStart") != null) {
- this.stateButton.doClick(0);
- }
- }
- });
- timer.start();
- }
-
- private void setComponentsEnabled(final boolean state) {
- this.serverAddress.setEnabled(state);
- this.serverVersion.setEnabled(state);
- this.viaProxyWindow.advancedTab.bindAddress.setEnabled(state);
- this.authMethod.setEnabled(state);
- this.betaCraftAuth.setEnabled(state);
- this.viaProxyWindow.advancedTab.proxyOnlineMode.setEnabled(state);
- this.viaProxyWindow.advancedTab.proxy.setEnabled(state);
- this.viaProxyWindow.advancedTab.legacySkinLoading.setEnabled(state);
- this.viaProxyWindow.advancedTab.chatSigning.setEnabled(state);
- this.viaProxyWindow.advancedTab.ignorePacketTranslationErrors.setEnabled(state);
- this.viaProxyWindow.advancedTab.allowBetaPinging.setEnabled(state);
- this.viaProxyWindow.advancedTab.simpleVoiceChatSupport.setEnabled(state);
- this.viaProxyWindow.advancedTab.fakeAcceptResourcePacks.setEnabled(state);
- if (state) this.serverVersion.getActionListeners()[0].actionPerformed(null);
- }
-
- private void updateStateLabel() {
- if (ViaProxy.getConfig().getBindAddress() instanceof InetSocketAddress inetSocketAddress) {
- this.stateLabel.setText(I18n.get("tab.general.state.running", "1.7+", "127.0.0.1:" + inetSocketAddress.getPort()));
- } else {
- this.stateLabel.setText(I18n.get("tab.general.state.running", "1.7+", AddressUtil.toString(ViaProxy.getConfig().getBindAddress())));
- }
- this.stateLabel.setForeground(Color.GREEN);
- this.stateLabel.setVisible(true);
- }
-
- private void start() {
- final Object selectedVersion = this.serverVersion.getSelectedItem();
- if (!(selectedVersion instanceof ProtocolVersion)) {
- ViaProxyWindow.showError(I18n.get("tab.general.error.no_server_version_selected"));
- return;
- }
- if (ViaProxy.getSaveManager().uiSave.get("notice.ban_warning") == null) {
- ViaProxy.getSaveManager().uiSave.put("notice.ban_warning", "true");
- ViaProxy.getSaveManager().save();
-
- ViaProxyWindow.showWarning("" + I18n.get("tab.general.warning.ban_warning.line1") + "
" + I18n.get("tab.general.warning.risk") + "
");
- }
- if (selectedVersion.equals(BedrockProtocolVersion.bedrockLatest) && ViaProxy.getSaveManager().uiSave.get("notice.bedrock_warning") == null) {
- ViaProxy.getSaveManager().uiSave.put("notice.bedrock_warning", "true");
- ViaProxy.getSaveManager().save();
-
- ViaProxyWindow.showWarning("" + I18n.get("tab.general.warning.bedrock_warning.line1") + "
" + I18n.get("tab.general.warning.risk") + "
");
- }
-
- this.setComponentsEnabled(false);
- this.stateButton.setEnabled(false);
- this.stateButton.setText(I18n.get("tab.general.state.starting"));
-
- new Thread(() -> {
- final String serverAddress = this.serverAddress.getText().trim();
- final ProtocolVersion serverVersion = (ProtocolVersion) this.serverVersion.getSelectedItem();
- final String bindAddress = this.viaProxyWindow.advancedTab.bindAddress.getText().trim();
- final ViaProxyConfig.AuthMethod authMethod = (ViaProxyConfig.AuthMethod) this.authMethod.getSelectedItem();
- final String proxyUrl = this.viaProxyWindow.advancedTab.proxy.getText().trim();
-
- try {
- try {
- if (serverAddress.startsWith("mc://")) { // ClassiCube Direct URL
- final URI uri = new URI(serverAddress);
-
- final String[] path = uri.getPath().substring(1).split("/");
- if (path.length < 2) {
- throw new IllegalArgumentException(I18n.get("tab.general.error.invalid_classicube_url"));
- }
-
- ViaProxy.getConfig().setTargetAddress(new InetSocketAddress(uri.getHost(), uri.getPort()));
- ViaProxy.getConfig().setAccount(new ClassicAccount(path[0], path[1]));
- } else {
- try {
- ViaProxy.getConfig().setTargetAddress(AddressUtil.parse(serverAddress, serverVersion));
- } catch (Throwable t) {
- throw new IllegalArgumentException(I18n.get("tab.general.error.invalid_server_address"));
- }
-
- if (authMethod == ViaProxyConfig.AuthMethod.ACCOUNT) {
- if (ViaProxy.getConfig().getAccount() == null) {
- this.viaProxyWindow.accountsTab.markSelected(0);
- }
- } else {
- ViaProxy.getConfig().setAccount(null);
- }
- }
- try {
- ViaProxy.getConfig().setBindAddress(AddressUtil.parse(bindAddress, null));
- } catch (Throwable t) {
- throw new IllegalArgumentException(I18n.get("tab.general.error.invalid_bind_address"));
- }
- if (!proxyUrl.isBlank()) {
- try {
- ViaProxy.getConfig().setBackendProxy(new Proxy(new URI(proxyUrl)));
- } catch (URISyntaxException e) {
- throw new IllegalArgumentException(I18n.get("tab.general.error.invalid_proxy_url"));
- }
- } else {
- ViaProxy.getConfig().setBackendProxy(null);
- }
- this.applyGuiState();
- this.viaProxyWindow.advancedTab.applyGuiState();
- ViaProxy.getConfig().save();
- ViaProxy.getSaveManager().save();
- } catch (Throwable t) {
- SwingUtilities.invokeLater(() -> ViaProxyWindow.showError(t.getMessage()));
- throw t;
- }
-
- try {
- ViaProxy.startProxy();
- } catch (Throwable e) {
- SwingUtilities.invokeLater(() -> ViaProxyWindow.showError(I18n.get("tab.general.error.failed_to_start")));
- throw e;
- }
-
- SwingUtilities.invokeLater(() -> {
- this.updateStateLabel();
- this.stateButton.setEnabled(true);
- this.stateButton.setText(I18n.get("tab.general.state.stop"));
- });
- } catch (Throwable e) {
- Logger.LOGGER.error("Error while starting ViaProxy", e);
- SwingUtilities.invokeLater(() -> {
- this.setComponentsEnabled(true);
- this.stateButton.setEnabled(true);
- this.stateButton.setText(I18n.get("tab.general.state.start"));
- this.stateLabel.setVisible(false);
- });
- }
- }).start();
- }
-
- private void stop() {
- ViaProxy.stopProxy();
-
- this.stateLabel.setVisible(false);
- this.stateButton.setText(I18n.get("tab.general.state.start"));
- this.setComponentsEnabled(true);
- }
-
- @EventHandler(events = UICloseEvent.class)
- void applyGuiState() {
- ViaProxy.getSaveManager().uiSave.put("server_address", this.serverAddress.getText());
- if (this.serverVersion.getSelectedItem() instanceof ProtocolVersion version) {
- ViaProxy.getConfig().setTargetVersion(version);
- }
- if (this.authMethod.getSelectedItem() instanceof ViaProxyConfig.AuthMethod authMethod) {
- ViaProxy.getConfig().setAuthMethod(authMethod);
- }
- ViaProxy.getConfig().setBetacraftAuth(this.betaCraftAuth.isSelected());
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/ui/impl/RealmsTab.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/ui/impl/RealmsTab.java
deleted file mode 100644
index ce6e584..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/ui/impl/RealmsTab.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.ui.impl;
-
-import com.google.common.collect.Iterables;
-import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
-import com.viaversion.viaversion.api.protocol.version.VersionType;
-import net.lenni0451.commons.swing.GBC;
-import net.lenni0451.commons.swing.layouts.VerticalLayout;
-import net.raphimc.minecraftauth.MinecraftAuth;
-import net.raphimc.minecraftauth.extra.realms.exception.RealmsRequestException;
-import net.raphimc.minecraftauth.extra.realms.model.RealmsJoinInformation;
-import net.raphimc.minecraftauth.extra.realms.model.RealmsServer;
-import net.raphimc.minecraftauth.extra.realms.service.RealmsService;
-import net.raphimc.minecraftauth.extra.realms.service.impl.BedrockRealmsService;
-import net.raphimc.minecraftauth.extra.realms.service.impl.JavaRealmsService;
-import net.raphimc.viabedrock.api.BedrockProtocolVersion;
-import net.raphimc.viabedrock.protocol.data.ProtocolConstants;
-import net.raphimc.viaproxy.ViaProxy;
-import net.raphimc.viaproxy.saves.impl.accounts.Account;
-import net.raphimc.viaproxy.saves.impl.accounts.BedrockAccount;
-import net.raphimc.viaproxy.saves.impl.accounts.MicrosoftAccount;
-import net.raphimc.viaproxy.ui.I18n;
-import net.raphimc.viaproxy.ui.UITab;
-import net.raphimc.viaproxy.ui.ViaProxyWindow;
-import net.raphimc.viaproxy.util.logging.Logger;
-
-import javax.swing.*;
-import java.awt.*;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-
-public class RealmsTab extends UITab {
-
- private static final ProtocolVersion LATEST_JAVA_RELEASE;
- private static final ProtocolVersion LATEST_JAVA_SNAPSHOT;
-
- static {
- ProtocolVersion latestVersion = null;
- ProtocolVersion latestSnapshotVersion = null;
- final List supportedVersions = ProtocolVersion.getProtocols();
- for (int i = supportedVersions.size() - 1; i >= 0; i--) {
- final ProtocolVersion version = supportedVersions.get(i);
- if (version.getVersionType() != VersionType.RELEASE) continue;
- if (version.isSnapshot() && latestSnapshotVersion == null) {
- latestSnapshotVersion = version;
- } else if (!version.isSnapshot()) {
- latestVersion = version;
- break;
- }
- }
- if (latestVersion == null) throw new IllegalStateException("Could not find compatible version");
- LATEST_JAVA_RELEASE = latestVersion;
- LATEST_JAVA_SNAPSHOT = latestSnapshotVersion;
- }
-
- private Account currentAccount = null;
- private ProtocolVersion currentSelectedJavaVersion = LATEST_JAVA_RELEASE;
-
- public RealmsTab(final ViaProxyWindow frame) {
- super(frame, "realms");
- }
-
- @Override
- protected void onTabOpened() {
- if (ViaProxy.getConfig().getAccount() != this.currentAccount) {
- this.currentAccount = ViaProxy.getConfig().getAccount();
- this.reinit();
- }
- }
-
- private void reinit() {
- this.contentPane.removeAll();
- this.init(this.contentPane);
- this.contentPane.revalidate();
- this.contentPane.repaint();
- }
-
- @Override
- protected void init(JPanel contentPane) {
- final JPanel body = new JPanel();
- body.setLayout(new GridBagLayout());
-
- final JLabel statusLabel = new JLabel("");
- statusLabel.setFont(statusLabel.getFont().deriveFont(20F));
- statusLabel.setHorizontalAlignment(SwingConstants.CENTER);
- body.add(statusLabel);
-
- if (this.currentAccount == null) {
- statusLabel.setText(I18n.get("tab.realms.no_account"));
- } else {
- statusLabel.setText(I18n.get("tab.realms.refreshing_account"));
- CompletableFuture.runAsync(() -> {
- try {
- SwingUtilities.invokeLater(() -> {
- if (this.currentAccount instanceof MicrosoftAccount account) {
- final JavaRealmsService realmsService = new JavaRealmsService(MinecraftAuth.createHttpClient(), Iterables.getLast(this.currentSelectedJavaVersion.getIncludedVersions()), account.getAuthManager().getMinecraftToken(), account.getAuthManager().getMinecraftProfile());
- this.loadRealms(realmsService, body, statusLabel);
- } else if (this.currentAccount instanceof BedrockAccount account) {
- final BedrockRealmsService realmsService = new BedrockRealmsService(MinecraftAuth.createHttpClient(), ProtocolConstants.BEDROCK_VERSION_NAME, account.getAuthManager().getRealmsXstsToken());
- this.loadRealms(realmsService, body, statusLabel);
- } else {
- statusLabel.setText(I18n.get("tab.realms.unsupported_account"));
- }
- });
- } catch (Throwable e) {
- Logger.LOGGER.error("Failed to refresh account", e);
- ViaProxyWindow.showError(I18n.get("tab.realms.error_account", e.getMessage()));
- SwingUtilities.invokeLater(() -> statusLabel.setText(I18n.get("tab.realms.error_account_label")));
- }
- });
- }
-
- contentPane.setLayout(new BorderLayout());
- contentPane.add(body, BorderLayout.NORTH);
- }
-
- private void loadRealms(final RealmsService realmsService, final JPanel body, final JLabel statusLabel) {
- statusLabel.setText(I18n.get("tab.realms.availability_check"));
-
- realmsService.isCompatibleAsync().thenAccept(state -> {
- if (state) {
- SwingUtilities.invokeLater(() -> statusLabel.setText(I18n.get("tab.realms.loading_worlds")));
- realmsService.getWorldsAsync().thenAccept(servers -> SwingUtilities.invokeLater(() -> {
- body.remove(statusLabel);
- this.addHeader(body, realmsService instanceof JavaRealmsService);
- final JPanel realmsPanel = new JPanel();
- realmsPanel.setLayout(new VerticalLayout(5, 5));
- if (servers.isEmpty()) {
- JLabel label = new JLabel(I18n.get("tab.realms.no_worlds"));
- label.setHorizontalAlignment(SwingConstants.CENTER);
- label.setFont(label.getFont().deriveFont(20F));
- realmsPanel.add(label);
- } else {
- this.addRealms(realmsPanel, realmsService, servers);
- }
- final JScrollPane realmsScrollPane = new JScrollPane(realmsPanel);
- realmsScrollPane.getVerticalScrollBar().setUnitIncrement(10);
- contentPane.add(realmsScrollPane, BorderLayout.CENTER);
- contentPane.revalidate();
- contentPane.repaint();
- })).exceptionally(e -> {
- final Throwable cause = e.getCause();
- Logger.LOGGER.error("Failed to get realms worlds", cause);
- ViaProxyWindow.showError(I18n.get("tab.realms.error_generic", cause.getMessage()));
- SwingUtilities.invokeLater(() -> statusLabel.setText(I18n.get("tab.realms.error_generic_label")));
- return null;
- });
- } else {
- SwingUtilities.invokeLater(() -> statusLabel.setText(I18n.get("tab.realms.unavailable")));
- }
- }).exceptionally(e -> {
- final Throwable cause = e.getCause();
- Logger.LOGGER.error("Failed to check realms availability", cause);
- ViaProxyWindow.showError(I18n.get("tab.realms.error_generic", cause.getMessage()));
- SwingUtilities.invokeLater(() -> statusLabel.setText(I18n.get("tab.realms.error_generic_label")));
- return null;
- });
- }
-
- private void addHeader(final JPanel parent, final boolean showType) {
- GBC.create(parent).grid(0, 0).weightx(1).insets(5, 5, 5, 5).fill(GBC.HORIZONTAL).add(new JLabel(I18n.get("tab.realms.account", this.currentAccount.getDisplayString())));
- if (showType && LATEST_JAVA_SNAPSHOT != null) {
- JComboBox type = new JComboBox<>();
- type.addItem(I18n.get("tab.realms.release"));
- type.addItem(I18n.get("tab.realms.snapshot"));
- type.setSelectedIndex(this.currentSelectedJavaVersion.isSnapshot() ? 1 : 0);
- type.addActionListener(e -> {
- ProtocolVersion selected = type.getSelectedIndex() == 0 ? LATEST_JAVA_RELEASE : LATEST_JAVA_SNAPSHOT;
- if (selected != this.currentSelectedJavaVersion) {
- this.currentSelectedJavaVersion = selected;
- this.reinit();
- }
- });
- GBC.create(parent).grid(1, 0).insets(5, 0, 5, 5).anchor(GBC.LINE_END).add(type);
- }
- }
-
- private void addRealms(final JPanel parent, final RealmsService realmsService, final List servers) {
- servers.sort((o1, o2) -> {
- boolean o1Compatible = o1.isCompatible() && !o1.isExpired();
- boolean o2Compatible = o2.isCompatible() && !o2.isExpired();
- if (o1Compatible && !o2Compatible) return -1;
- if (!o1Compatible && o2Compatible) return 1;
- return 0;
- });
- for (RealmsServer server : servers) {
- final JPanel panel = new JPanel();
- panel.setLayout(new GridBagLayout());
- panel.setBorder(BorderFactory.createLineBorder(UIManager.getColor("Table.gridColor")));
-
- String nameString = "";
- if (server.getOwnerName() != null) nameString += server.getOwnerName() + " - ";
- String versionString = "";
- if (server.getActiveVersion() != null) versionString += " - " + server.getActiveVersion();
- GBC.create(panel).grid(0, 0).weightx(1).insets(5, 5, 0, 5).fill(GBC.HORIZONTAL).add(new JLabel(nameString + server.getNameOr("") + " (" + server.getState() + ")"));
- GBC.create(panel).grid(1, 0).insets(5, 5, 0, 5).anchor(GBC.LINE_END).add(new JLabel(server.getWorldType() + versionString));
- GBC.create(panel).grid(0, 1).insets(5, 5, 0, 5).fill(GBC.HORIZONTAL).add(new JLabel(server.getMotdOr("")));
- final JButton join = new JButton(I18n.get("tab.realms.join"));
- if (server.isExpired()) {
- join.setEnabled(false);
- join.setToolTipText(I18n.get("tab.realms.expired"));
- } else if (!server.isCompatible()) {
- join.setEnabled(false);
- join.setToolTipText(I18n.get("tab.realms.incompatible"));
- }
- GBC.create(panel).grid(1, 1).insets(5, 0, 5, 5).anchor(GBC.LINE_END).add(join);
- join.addActionListener(event -> {
- join.setEnabled(false);
- join.setText(I18n.get("tab.realms.joining"));
- realmsService.joinWorldAsync(server).thenAccept(joinInformation -> SwingUtilities.invokeLater(() -> {
- join.setEnabled(true);
- join.setText(I18n.get("tab.realms.join"));
- this.setServerAddressAndStartViaProxy(joinInformation, realmsService instanceof JavaRealmsService ? this.currentSelectedJavaVersion : BedrockProtocolVersion.bedrockLatest);
- })).exceptionally(e -> {
- final Throwable cause = e.getCause();
- SwingUtilities.invokeLater(() -> {
- join.setEnabled(true);
- join.setText(I18n.get("tab.realms.join"));
- if (realmsService instanceof JavaRealmsService javaRealmsService && cause instanceof RealmsRequestException realmsRequestException && realmsRequestException.getErrorCode() == RealmsRequestException.ERROR_TOS_NOT_ACCEPTED) {
- final int chosen = JOptionPane.showConfirmDialog(this.viaProxyWindow, I18n.get("tab.realms.accept_tos", "https://aka.ms/MinecraftRealmsTerms"), "ViaProxy", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
- if (chosen == JOptionPane.YES_OPTION) {
- javaRealmsService.acceptTosUnchecked();
- join.doClick(0);
- }
- } else {
- Logger.LOGGER.error("Failed to join realm", cause);
- ViaProxyWindow.showError(I18n.get("tab.realms.error_generic", cause.getMessage()));
- }
- });
- return null;
- });
- });
-
- parent.add(panel);
- }
- }
-
- private void setServerAddressAndStartViaProxy(final RealmsJoinInformation joinInformation, final ProtocolVersion version) {
- final GeneralTab generalTab = this.viaProxyWindow.generalTab;
- if (generalTab.stateButton.isEnabled()) {
- if (!generalTab.stateButton.getText().equals(I18n.get("tab.general.state.start"))) {
- generalTab.stateButton.doClick(0); // Stop the running proxy
- }
-
- switch (joinInformation.getNetworkProtocol()) {
- case RealmsJoinInformation.PROTOCOL_DEFAULT -> generalTab.serverAddress.setText(joinInformation.getAddress());
- case RealmsJoinInformation.PROTOCOL_NETHERNET -> generalTab.serverAddress.setText("nethernet://" + joinInformation.getAddress());
- default -> throw new IllegalArgumentException("Unknown realms network protocol: " + joinInformation.getNetworkProtocol());
- }
-
- generalTab.serverVersion.setSelectedItem(version);
- generalTab.authMethod.setSelectedIndex(0);
- generalTab.stateButton.doClick(0);
- this.viaProxyWindow.contentPane.setSelectedIndex(0);
- }
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/ui/impl/UISettingsTab.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/ui/impl/UISettingsTab.java
deleted file mode 100644
index 432b5ff..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/ui/impl/UISettingsTab.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.ui.impl;
-
-import net.lenni0451.commons.swing.GBC;
-import net.raphimc.viaproxy.ui.I18n;
-import net.raphimc.viaproxy.ui.UITab;
-import net.raphimc.viaproxy.ui.ViaProxyWindow;
-import net.raphimc.viaproxy.ui.elements.LinkLabel;
-import net.raphimc.viaproxy.util.JarUtil;
-import net.raphimc.viaproxy.util.logging.Logger;
-
-import javax.swing.*;
-import java.awt.*;
-
-import static net.raphimc.viaproxy.ui.ViaProxyWindow.BODY_BLOCK_PADDING;
-import static net.raphimc.viaproxy.ui.ViaProxyWindow.BORDER_PADDING;
-
-public class UISettingsTab extends UITab {
-
- public UISettingsTab(final ViaProxyWindow frame) {
- super(frame, "ui_settings");
- }
-
- @Override
- protected void init(JPanel contentPane) {
- JPanel body = new JPanel();
- body.setLayout(new GridBagLayout());
-
- int gridy = 0;
- {
- JLabel languageLabel = new JLabel(I18n.get("tab.ui_settings.language.label"));
- GBC.create(body).grid(0, gridy++).insets(BORDER_PADDING, BORDER_PADDING, 0, BORDER_PADDING).anchor(GBC.NORTHWEST).add(languageLabel);
-
- JComboBox language = new JComboBox<>(I18n.getAvailableLocales().toArray(new String[0]));
- language.setRenderer(new DefaultListCellRenderer() {
- @Override
- public Component getListCellRendererComponent(JList> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
- if (value instanceof String locale) {
- value = "" + I18n.getSpecific(locale, "language.name") + " (" + I18n.get("tab.ui_settings.language.completion", I18n.getSpecific(locale, "language.completion")) + ")";
- }
- return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
- }
- });
- language.setSelectedItem(I18n.getCurrentLocale());
- language.addActionListener(event -> {
- if (!(language.getSelectedItem() instanceof String locale)) return;
- if (locale.equals(I18n.getCurrentLocale())) return;
- I18n.setLocale(locale);
- ViaProxyWindow.showInfo(I18n.get("tab.ui_settings.language.success", I18n.get("language.name"), locale));
- try {
- JarUtil.launch(JarUtil.getJarFile().orElseThrow());
- System.exit(0);
- } catch (Throwable e) {
- Logger.LOGGER.error("Could not start the ViaProxy jar", e);
- ViaProxyWindow.showException(e);
- System.exit(1);
- }
- });
- GBC.create(body).grid(0, gridy++).weightx(1).insets(0, BORDER_PADDING, 0, BORDER_PADDING).fill(GBC.HORIZONTAL).add(language);
- }
- GBC.create(body).grid(0, gridy++).weightx(1).insets(BODY_BLOCK_PADDING, BORDER_PADDING, 0, BORDER_PADDING).fill(GBC.HORIZONTAL).add(new JLabel("" + I18n.get("tab.ui_settings.crowdin.info") + ""));
- GBC.create(body).grid(0, gridy++).weightx(1).insets(0, BORDER_PADDING, 0, BORDER_PADDING).fill(GBC.HORIZONTAL).add(new LinkLabel(I18n.get("tab.ui_settings.crowdin.link"), "https://crowdin.com/project/viaproxy"));
-
- contentPane.setLayout(new BorderLayout());
- contentPane.add(body, BorderLayout.NORTH);
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/ui/popups/AddAccountPopup.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/ui/popups/AddAccountPopup.java
deleted file mode 100644
index 2b19fdb..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/ui/popups/AddAccountPopup.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.ui.popups;
-
-import net.lenni0451.commons.swing.GBC;
-import net.raphimc.minecraftauth.msa.model.MsaDeviceCode;
-import net.raphimc.viaproxy.ui.I18n;
-import net.raphimc.viaproxy.ui.ViaProxyWindow;
-import net.raphimc.viaproxy.ui.elements.LinkLabel;
-
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.util.function.Consumer;
-
-import static net.raphimc.viaproxy.ui.ViaProxyWindow.BODY_BLOCK_PADDING;
-import static net.raphimc.viaproxy.ui.ViaProxyWindow.BORDER_PADDING;
-
-public class AddAccountPopup extends JDialog {
-
- private final ViaProxyWindow parent;
- private final MsaDeviceCode msaDeviceCode;
- private boolean externalClose;
-
- public AddAccountPopup(final ViaProxyWindow parent, final MsaDeviceCode msaDeviceCode, final Consumer popupConsumer, final Runnable closeListener) {
- super(parent, true);
- this.parent = parent;
- this.msaDeviceCode = msaDeviceCode;
- popupConsumer.accept(this);
-
- this.initWindow(closeListener);
- this.initComponents();
- this.pack();
- this.setVisible(true);
- }
-
- private void initWindow(final Runnable closeListener) {
- this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
- this.addWindowListener(new WindowAdapter() {
- @Override
- public void windowClosing(WindowEvent e) {
- if (!AddAccountPopup.this.externalClose) closeListener.run();
- }
- });
- this.setTitle(I18n.get("popup.login_account.title"));
- this.setSize(400, 140);
- this.setResizable(false);
- this.setLocationRelativeTo(this.parent);
- }
-
- private void initComponents() {
- JPanel contentPane = new JPanel();
- contentPane.setLayout(new GridBagLayout());
- {
- JLabel browserLabel = new JLabel("" + I18n.get("popup.login_account.instructions.browser") + "
");
- GBC.create(contentPane).grid(0, 0).weightx(1).insets(BORDER_PADDING, BORDER_PADDING, 0, BORDER_PADDING).fill(GBC.HORIZONTAL).add(browserLabel);
-
- GBC.create(contentPane).grid(0, 1).weightx(1).insets(0, BORDER_PADDING, 0, BORDER_PADDING).fill(GBC.HORIZONTAL).add(new LinkLabel(this.msaDeviceCode.getDirectVerificationUri(), AddAccountPopup.this.msaDeviceCode.getDirectVerificationUri()));
-
- JLabel closeInfo = new JLabel("" + I18n.get("popup.login_account.instructions.close") + "
");
- GBC.create(contentPane).grid(0, 2).weightx(1).insets(BODY_BLOCK_PADDING, BORDER_PADDING, BORDER_PADDING, BORDER_PADDING).fill(GBC.HORIZONTAL).add(closeInfo);
- }
- this.setContentPane(contentPane);
- }
-
- public void markExternalClose() {
- this.externalClose = true;
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/ui/popups/DownloadPopup.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/ui/popups/DownloadPopup.java
deleted file mode 100644
index 1336fe2..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/ui/popups/DownloadPopup.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.ui.popups;
-
-import net.lenni0451.commons.swing.GBC;
-import net.raphimc.viaproxy.ViaProxy;
-import net.raphimc.viaproxy.ui.I18n;
-
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.nio.file.Files;
-import java.nio.file.StandardCopyOption;
-import java.util.function.Consumer;
-
-import static net.raphimc.viaproxy.ui.ViaProxyWindow.BORDER_PADDING;
-
-public class DownloadPopup extends JDialog {
-
- private final JFrame parent;
- private final String url;
- private final File file;
- private final Runnable finishListener;
- private final Consumer stopConsumer;
-
- private JProgressBar progressBar;
- private Thread downloadThread;
-
- public DownloadPopup(final JFrame parent, final String url, final File file, final Runnable finishListener, final Consumer stopConsumer) {
- super(parent, true);
- this.parent = parent;
- this.url = url;
- this.file = file;
- this.finishListener = finishListener;
- this.stopConsumer = stopConsumer;
-
- this.initWindow();
- this.initComponents();
- this.setVisible(true);
- }
-
- private void initWindow() {
- this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
- this.addWindowListener(new WindowAdapter() {
- @Override
- public void windowClosing(WindowEvent e) {
- DownloadPopup.this.close(false);
- }
- });
- this.setTitle(I18n.get("popup.download.title"));
- this.setSize(400, 110);
- this.setResizable(false);
- this.setLocationRelativeTo(this.parent);
- }
-
- private void initComponents() {
- JPanel contentPane = new JPanel();
- contentPane.setLayout(new GridBagLayout());
- {
- this.progressBar = new JProgressBar();
- this.progressBar.setStringPainted(true);
- GBC.create(contentPane).grid(0, 0).weightx(1).insets(BORDER_PADDING, BORDER_PADDING, 0, BORDER_PADDING).fill(GBC.HORIZONTAL).add(this.progressBar);
- }
- {
- JButton cancelButton = new JButton(I18n.get("generic.cancel"));
- cancelButton.addActionListener(event -> this.close(false));
- GBC.create(contentPane).grid(0, 1).weightx(1).insets(BORDER_PADDING, BORDER_PADDING, BORDER_PADDING, BORDER_PADDING).fill(GBC.HORIZONTAL).add(cancelButton);
- }
- this.setContentPane(contentPane);
- this.start();
- }
-
- private void start() {
- this.downloadThread = new Thread(() -> {
- try {
- HttpURLConnection con = (HttpURLConnection) new URL(this.url).openConnection();
- con.setRequestMethod("GET");
- con.setRequestProperty("User-Agent", "Viaproxy/" + ViaProxy.VERSION);
- con.setConnectTimeout(5000);
- con.setReadTimeout(5000);
-
- int contentLength = con.getContentLength();
- int current = 0;
- File tempFile = File.createTempFile("ViaProxy-download", "");
- InputStream is = con.getInputStream();
- FileOutputStream fos = new FileOutputStream(tempFile);
- byte[] buffer = new byte[1024 * 1024];
- int len;
- while ((len = is.read(buffer)) != -1) {
- if (this.downloadThread.isInterrupted()) throw new InterruptedException();
- fos.write(buffer, 0, len);
-
- if (contentLength != -1) {
- current += len;
- this.progressBar.setValue((int) (100F / contentLength * current));
- }
- }
- fos.close();
- is.close();
- con.disconnect();
-
- Files.move(tempFile.toPath(), this.file.toPath(), StandardCopyOption.REPLACE_EXISTING);
-
- this.close(true);
- this.finishListener.run();
- } catch (InterruptedException ignored) {
- } catch (Throwable t) {
- this.close(false);
- this.stopConsumer.accept(t);
- }
- }, "Download Popup Thread");
- this.downloadThread.setDaemon(true);
- this.downloadThread.start();
- }
-
- private void close(final boolean success) {
- if (!success && this.downloadThread != null && this.downloadThread.isAlive()) {
- this.downloadThread.interrupt();
- this.stopConsumer.accept(null);
- }
-
- this.setVisible(false);
- this.dispose();
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/AddressUtil.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/util/AddressUtil.java
deleted file mode 100644
index 591e7d1..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/AddressUtil.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.util;
-
-import com.google.common.net.HostAndPort;
-import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
-import dev.kastle.netty.channel.nethernet.config.NetherNetAddress;
-import io.netty.channel.unix.DomainSocketAddress;
-import net.lenni0451.reflect.stream.RStream;
-import net.raphimc.netminecraft.util.MinecraftServerAddress;
-import net.raphimc.viabedrock.api.BedrockProtocolVersion;
-import net.raphimc.vialegacy.api.LegacyProtocolVersion;
-
-import java.net.InetSocketAddress;
-import java.net.SocketAddress;
-import java.util.regex.Pattern;
-
-public class AddressUtil {
-
- private static final Pattern NETHERNET_NETWORK_ID_PATTERN = Pattern.compile("^(?>[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}|\\d+)$", Pattern.CASE_INSENSITIVE);
-
- public static SocketAddress parse(final String serverAddress, final ProtocolVersion version) {
- if (serverAddress.startsWith("file://") || serverAddress.startsWith("unix://")) { // Unix Socket
- return new DomainSocketAddress(serverAddress.substring(7));
- } else if (serverAddress.startsWith("nethernet://")) { // NetherNet Address
- final String addressPart = serverAddress.substring(12);
- if (NETHERNET_NETWORK_ID_PATTERN.matcher(addressPart).matches()) {
- return new NetherNetAddress(addressPart);
- } else {
- final HostAndPort hostAndPort = HostAndPort.fromString(addressPart);
- if (hostAndPort.getHost().isBlank()) {
- throw new IllegalArgumentException("Server address cannot be blank");
- }
- return new NetherNetInetSocketAddress(hostAndPort.getHost(), hostAndPort.getPortOrDefault(7551));
- }
- } else { // IP Address
- final HostAndPort hostAndPort = HostAndPort.fromString(serverAddress);
- if (hostAndPort.getHost().isBlank()) {
- throw new IllegalArgumentException("Server address cannot be blank");
- }
-
- final int port;
- if (version != null) {
- port = hostAndPort.getPortOrDefault(version.equals(BedrockProtocolVersion.bedrockLatest) ? 19132 : 25565);
- } else {
- port = hostAndPort.getPort();
- }
-
- if (version == null || version.olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2) || version.equals(BedrockProtocolVersion.bedrockLatest)) {
- return new InetSocketAddress(hostAndPort.getHost(), port);
- } else {
- return MinecraftServerAddress.ofResolved(hostAndPort.getHost(), port);
- }
- }
- }
-
- public static String toString(final SocketAddress address) {
- if (address instanceof DomainSocketAddress domainSocketAddress) {
- return "unix://" + domainSocketAddress.path();
- } else if (address instanceof NetherNetAddress netherNetAddress) {
- return "nethernet://" + netherNetAddress;
- } else if (address instanceof NetherNetInetSocketAddress netherNetAddress) {
- return "nethernet://" + netherNetAddress.getHostString() + ":" + netherNetAddress.getPort();
- } else if (address instanceof InetSocketAddress inetSocketAddress) {
- return inetSocketAddress.getHostString() + ":" + inetSocketAddress.getPort();
- } else {
- return address.toString();
- }
- }
-
- @Deprecated(forRemoval = true)
- public static int getDefaultPort(final ProtocolVersion version) {
- if (version.equals(BedrockProtocolVersion.bedrockLatest)) {
- return 19132;
- }
-
- return 25565;
- }
-
- /**
- * Converts the netty domain socket address to a Java 16 unix domain socket address if possible
- *
- * @param address The netty domain socket address
- * @return The Java 16 unix domain socket address or the original address if it is not a domain socket address
- */
- public static SocketAddress toJ16UnixSocketAddress(final SocketAddress address) {
- try {
- if (address instanceof DomainSocketAddress domainSocketAddress) {
- return RStream.of("java.net.UnixDomainSocketAddress").methods().by("of", String.class).invokeArgs(domainSocketAddress.path());
- }
- } catch (Throwable ignored) {
- }
-
- return address;
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/ArrayHelper.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/util/ArrayHelper.java
deleted file mode 100644
index a9c8d70..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/ArrayHelper.java
+++ /dev/null
@@ -1,370 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.util;
-
-import java.lang.reflect.Array;
-
-public class ArrayHelper {
-
- public static ArrayHelper instanceOf(final String... array) {
- return new ArrayHelper(array);
- }
-
-
- private String[] array;
-
- public ArrayHelper(final String[] array) {
- this.array = array;
- }
-
- public int getLength() {
- return this.array.length;
- }
-
- public boolean isLength(final int length) {
- return this.getLength() == length;
- }
-
- public boolean isSmaller(final int length) {
- return this.getLength() < length;
- }
-
- public boolean isSmallerOrEqual(final int length) {
- return this.getLength() <= length;
- }
-
- public boolean isLarger(final int length) {
- return this.getLength() > length;
- }
-
- public boolean isLargerOrEqual(final int length) {
- return this.getLength() >= length;
- }
-
- public boolean isEmpty() {
- return this.getLength() == 0;
- }
-
- public boolean isIndexValid(final int index) {
- return index >= 0 && index < this.getLength();
- }
-
- public String get(final int index) {
- if (!this.isIndexValid(index)) {
- return null;
- }
-
- return this.array[index];
- }
-
-
- public boolean isString(final int index) {
- return this.isIndexValid(index);
- }
-
- public boolean isBoolean(final int index) {
- if (!this.isIndexValid(index)) {
- return false;
- }
-
- try {
- Boolean.valueOf(this.getString(index));
- return true;
- } catch (Exception ignored) {
- }
-
- return false;
- }
-
- public boolean isChar(final int index) {
- if (!this.isIndexValid(index) || !this.isString(index)) {
- return false;
- }
-
- return this.getString(index).length() == 1;
- }
-
- public boolean isShort(final int index) {
- if (!this.isIndexValid(index)) {
- return false;
- }
-
- try {
- Short.valueOf(this.get(index));
- return true;
- } catch (Exception ignored) {
- }
-
- return false;
- }
-
- public boolean isInteger(final int index) {
- if (!this.isIndexValid(index)) {
- return false;
- }
-
- try {
- Integer.valueOf(this.get(index));
- return true;
- } catch (Exception ignored) {
- }
-
- return false;
- }
-
- public boolean isLong(final int index) {
- if (!this.isIndexValid(index)) {
- return false;
- }
-
- try {
- Long.valueOf(this.get(index));
- return true;
- } catch (Exception ignored) {
- }
-
- return false;
- }
-
- public boolean isFloat(final int index) {
- if (!this.isIndexValid(index)) {
- return false;
- }
-
- try {
- Float.valueOf(this.get(index));
- return true;
- } catch (Exception ignored) {
- }
-
- return false;
- }
-
- public boolean isDouble(final int index) {
- if (!this.isIndexValid(index)) {
- return false;
- }
-
- try {
- Double.valueOf(this.get(index));
- return true;
- } catch (Exception ignored) {
- }
-
- return false;
- }
-
-
- public String getString(final int index, final String standard) {
- if (!this.isIndexValid(index) || !this.isString(index)) {
- return standard;
- }
-
- return this.get(index);
- }
-
- public boolean getBoolean(final int index, final boolean standard) {
- if (!this.isIndexValid(index) || !this.isBoolean(index)) {
- return standard;
- }
-
- return Boolean.parseBoolean(this.getString(index));
- }
-
- public char getChar(final int index, final char standard) {
- if (!this.isIndexValid(index) || !this.isChar(index)) {
- return standard;
- }
-
- return this.getString(index, String.valueOf(standard)).charAt(0);
- }
-
- public short getShort(final int index, final short standard) {
- if (!this.isIndexValid(index) || !this.isShort(index)) {
- return standard;
- }
-
- return Short.parseShort(this.get(index));
- }
-
- public int getInteger(final int index, final int standard) {
- if (!this.isIndexValid(index) || !this.isInteger(index)) {
- return standard;
- }
-
- return Integer.parseInt(this.get(index));
- }
-
- public long getLong(final int index, final long standard) {
- if (!this.isIndexValid(index) || !this.isLong(index)) {
- return standard;
- }
-
- return Long.parseLong(this.get(index));
- }
-
- public float getFloat(final int index, final float standard) {
- if (!this.isIndexValid(index) || !this.isFloat(index)) {
- return standard;
- }
-
- return Float.parseFloat(this.get(index));
- }
-
- public double getDouble(final int index, final double standard) {
- if (!this.isIndexValid(index) || !this.isDouble(index)) {
- return standard;
- }
-
- return Double.parseDouble(this.get(index));
- }
-
-
- public String getString(final int index) {
- return this.getString(index, "");
- }
-
- public boolean getBoolean(final int index) {
- return this.getBoolean(index, false);
- }
-
- public char getChar(final int index) {
- return this.getChar(index, "A".toCharArray()[0]);
- }
-
- public short getShort(final int index) {
- return this.getShort(index, (short) 0);
- }
-
- public int getInteger(final int index) {
- return this.getInteger(index, 0);
- }
-
- public long getLong(final int index) {
- return this.getLong(index, 0);
- }
-
- public float getFloat(final int index) {
- return this.getFloat(index, 0);
- }
-
- public double getDouble(final int index) {
- return this.getDouble(index, 0);
- }
-
- public ArrayHelper add(final String object, final String... objects) {
- this.array = this.advance(object, objects);
- return this;
- }
-
-
- public String[] advance(final String obToAdd, final String... obs) {
- String[] newArray = new String[this.getLength() + 1 + obs.length];
-
- int i = 0;
- for (String ob : this.array) {
- Array.set(newArray, i, ob);
-
- i++;
- }
- Array.set(newArray, i, obToAdd);
- i++;
- for (String ob : obs) {
- Array.set(newArray, i, ob);
- i++;
- }
-
- return newArray;
- }
-
- public String[] advanceToStrings(final String strToAdd, final String... strs) {
- String[] newArray = new String[this.getLength() + 1 + strs.length];
-
- int i = 0;
- for (Object ob : this.array) {
- newArray[i] = ob.toString();
-
- i++;
- }
- newArray[i] = strToAdd;
- i++;
- for (String str : strs) {
- newArray[i] = str;
- i++;
- }
-
- return newArray;
- }
-
- public String[] getAsArray() {
- return this.array;
- }
-
- public String getAsString() {
- return this.getAsString(0, " ");
- }
-
- public String getAsString(final String combiner) {
- return this.getAsString(0, combiner);
- }
-
- public String getAsString(final int start) {
- return this.getAsString(start, " ");
- }
-
- public String getAsString(final int start, final String combiner) {
- return this.getAsString(start, this.getLength() - 1, combiner);
- }
-
- public String getAsString(final int start, final int end) {
- return this.getAsString(start, end, " ");
- }
-
- public String getAsString(int start, int end, final String combiner) {
- if (start < 0) {
- start = 0;
- }
- if (end > this.getLength() - 1) {
- end = this.getLength() - 1;
- }
- if (end < start) {
- return "";
- }
-
- StringBuilder out = new StringBuilder();
- for (int i = start; i <= end; i++) {
- if (out.isEmpty()) {
- out = new StringBuilder(this.getString(i));
- } else {
- out.append(combiner).append(this.getString(i));
- }
- }
- return out.toString();
- }
-
-
- @Override
- public String toString() {
- StringBuilder complete = new StringBuilder();
- for (String t : this.array) {
- complete.append((complete.isEmpty()) ? "" : ", ").append(t);
- }
- return "[" + complete + "]";
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/ClassLoaderPriorityUtil.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/util/ClassLoaderPriorityUtil.java
deleted file mode 100644
index 3a88533..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/ClassLoaderPriorityUtil.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.util;
-
-import net.lenni0451.reflect.ClassLoaders;
-import net.raphimc.viaproxy.ViaProxy;
-import net.raphimc.viaproxy.util.logging.Logger;
-
-import java.io.File;
-
-public class ClassLoaderPriorityUtil {
-
- public static void loadOverridingJars() {
- final File jarsFolder = new File(ViaProxy.getCwd(), "jars");
- if (!jarsFolder.exists()) {
- jarsFolder.mkdir();
- return;
- }
-
- if (jarsFolder.isDirectory()) {
- for (File file : jarsFolder.listFiles()) {
- try {
- if (file.getName().endsWith(".jar")) {
- ClassLoaders.loadToFront(file.toURI().toURL());
- Logger.LOGGER.warn("Loaded overriding jar " + file.getName());
- }
- } catch (Throwable e) {
- Logger.LOGGER.error("Failed to load overriding jar " + file.getName(), e);
- }
- }
- }
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/JarUtil.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/util/JarUtil.java
deleted file mode 100644
index f6b929f..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/JarUtil.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.util;
-
-import net.raphimc.viaproxy.ViaProxy;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Optional;
-
-public class JarUtil {
-
- public static Optional getJarFile() {
- try {
- return Optional.of(new File(ViaProxy.class.getProtectionDomain().getCodeSource().getLocation().toURI()));
- } catch (Throwable ignored) {
- return Optional.empty();
- }
- }
-
- public static void launch(final File jarFile) throws IOException {
- new ProcessBuilder(System.getProperty("java.home") + "/bin/java", "-jar", jarFile.getAbsolutePath()).directory(ViaProxy.getCwd()).start();
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/NetherNetInetSocketAddress.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/util/NetherNetInetSocketAddress.java
deleted file mode 100644
index ee72f10..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/NetherNetInetSocketAddress.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.util;
-
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-
-public class NetherNetInetSocketAddress extends InetSocketAddress {
-
- public NetherNetInetSocketAddress(final InetAddress addr, final int port) {
- super(addr, port);
- }
-
- public NetherNetInetSocketAddress(final String hostname, final int port) {
- super(hostname, port);
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/ProtocolVersionDetector.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/util/ProtocolVersionDetector.java
deleted file mode 100644
index 80b962f..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/ProtocolVersionDetector.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.util;
-
-import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
-import net.lenni0451.mcping.MCPing;
-import net.lenni0451.mcping.pings.sockets.impl.factories.SocketChannelSocketFactory;
-import net.lenni0451.mcping.responses.MCPingResponse;
-
-import java.net.SocketAddress;
-
-public class ProtocolVersionDetector {
-
- private static final int TIMEOUT = 3000;
-
- public static ProtocolVersion get(final SocketAddress serverAddress, final ProtocolVersion clientVersion) {
- final MCPingResponse response = MCPing
- .pingModern(clientVersion.getOriginalVersion(), true)
- .tcpSocketFactory(new SocketChannelSocketFactory())
- .address(AddressUtil.toJ16UnixSocketAddress(serverAddress))
- .noResolve()
- .timeout(TIMEOUT, TIMEOUT)
- .getSync();
-
- if (response.version.protocol == clientVersion.getOriginalVersion()) { // If the server is on the same version as the client, we can just connect
- return clientVersion;
- }
-
- if (ProtocolVersion.isRegistered(response.version.protocol)) { // If the protocol is registered, we can use it
- return ProtocolVersion.getProtocol(response.version.protocol);
- } else {
- for (ProtocolVersion protocolVersion : ProtocolVersion.getReversedProtocols()) {
- for (String version : protocolVersion.getIncludedVersions()) {
- if (response.version.name.contains(version)) {
- return protocolVersion;
- }
- }
- }
- throw new RuntimeException("Unable to detect the server version\nServer sent an invalid protocol id: " + response.version.protocol + " (" + response.version.name + "§r)");
- }
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/ProtocolVersionUtil.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/util/ProtocolVersionUtil.java
deleted file mode 100644
index 1992cfc..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/ProtocolVersionUtil.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.util;
-
-import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
-import net.raphimc.viaproxy.protocoltranslator.ProtocolTranslator;
-
-public class ProtocolVersionUtil {
-
- public static ProtocolVersion fromNameLenient(final String name) {
- if (name.equalsIgnoreCase("auto")) { // Short form for auto-detect
- return ProtocolTranslator.AUTO_DETECT_PROTOCOL;
- }
-
- final ProtocolVersion version = ProtocolVersion.getClosest(name);
- if (version == null) {
- return ProtocolVersion.getClosest(name.replace("-", " "));
- }
- return version;
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/Proxy.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/util/Proxy.java
deleted file mode 100644
index a798c0c..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/Proxy.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.util;
-
-import io.netty.handler.proxy.HttpProxyHandler;
-import io.netty.handler.proxy.ProxyHandler;
-import io.netty.handler.proxy.Socks4ProxyHandler;
-import io.netty.handler.proxy.Socks5ProxyHandler;
-import net.lenni0451.commons.httpclient.proxy.ProxyType;
-import net.lenni0451.commons.httpclient.utils.URLWrapper;
-
-import java.net.InetSocketAddress;
-import java.net.SocketAddress;
-import java.net.URI;
-import java.util.Locale;
-
-public class Proxy {
-
- private final String protocol;
- private final SocketAddress address;
- private final String username;
- private final String password;
-
- public Proxy(final URI uri) {
- this(uri.getScheme(), new InetSocketAddress(uri.getHost(), uri.getPort()), uri.getUserInfo());
- }
-
- public Proxy(final String protocol, final SocketAddress address) {
- this(protocol, address, null, null);
- }
-
- public Proxy(final String protocol, final SocketAddress address, final String userInfo) {
- this(protocol, address, userInfo != null ? userInfo.split(":", 2)[0] : null, userInfo != null ? (userInfo.split(":", 2).length > 1 ? userInfo.split(":", 2)[1] : null) : null);
- }
-
- public Proxy(final String protocol, final SocketAddress address, final String username, final String password) {
- this.protocol = protocol.toUpperCase(Locale.ROOT);
- this.address = address;
- this.username = username;
- this.password = password;
- }
-
- public ProxyHandler createNettyProxyHandler() {
- switch (this.protocol) {
- case "HTTP", "HTTPS" -> {
- if (this.username != null && this.password != null) return new HttpProxyHandler(this.address, this.username, this.password);
- else return new HttpProxyHandler(this.address);
- }
- case "SOCKS4" -> {
- if (this.username != null) return new Socks4ProxyHandler(this.address, this.username);
- else return new Socks4ProxyHandler(this.address);
- }
- case "SOCKS5" -> {
- if (this.username != null && this.password != null) return new Socks5ProxyHandler(this.address, this.username, this.password);
- else return new Socks5ProxyHandler(this.address);
- }
- default -> throw new IllegalArgumentException("Unsupported proxy protocol: " + this.protocol);
- }
- }
-
- public java.net.Proxy toJavaProxy() {
- final ProxyType proxyType = switch (this.protocol) {
- case "HTTP", "HTTPS" -> ProxyType.HTTP;
- case "SOCKS4" -> ProxyType.SOCKS4;
- case "SOCKS5" -> ProxyType.SOCKS5;
- default -> throw new IllegalArgumentException("Unsupported proxy protocol: " + this.protocol);
- };
- return new net.lenni0451.commons.httpclient.proxy.ProxyHandler(proxyType, this.address, this.username, this.password).toJavaProxy();
- }
-
- public URI toURI() {
- String userInfo = null;
- if (this.username != null) {
- userInfo = this.username;
- if (this.password != null) {
- userInfo += ":" + this.password;
- }
- }
- return URLWrapper.empty().setProtocol(this.protocol.toLowerCase(Locale.ROOT)).setHost(AddressUtil.toString(this.address)).setUserInfo(userInfo).toURI();
- }
-
- public String getProtocol() {
- return this.protocol;
- }
-
- public SocketAddress getAddress() {
- return this.address;
- }
-
- public String getUsername() {
- return this.username;
- }
-
- public String getPassword() {
- return this.password;
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/TFunction.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/util/TFunction.java
deleted file mode 100644
index bc0dc57..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/TFunction.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.util;
-
-@FunctionalInterface
-public interface TFunction {
-
- R apply(T t) throws Throwable;
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/WildcardDomainParser.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/util/WildcardDomainParser.java
deleted file mode 100644
index 5bf1d40..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/WildcardDomainParser.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.util;
-
-import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
-import net.raphimc.viaproxy.protocoltranslator.ProtocolTranslator;
-
-import java.net.SocketAddress;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class WildcardDomainParser {
-
- private static final Pattern PUBLIC_WILDCARD_FORMAT2_PATTERN = Pattern.compile("^address\\.(.+?)\\.port\\.(\\d+?)(?:\\.version\\.(.+?))?$");
-
- public static ParsedDomain parseFormat1(final String address) {
- try {
- final String addressData = address.substring(0, address.toLowerCase().lastIndexOf(".viaproxy."));
- final ArrayHelper arrayHelper = ArrayHelper.instanceOf(addressData.split(Pattern.quote("_")));
- if (arrayHelper.getLength() < 3) {
- return null;
- }
- final String versionString = arrayHelper.get(arrayHelper.getLength() - 1);
- ProtocolVersion serverVersion = ProtocolVersionUtil.fromNameLenient(versionString);
- final String connectAddress = arrayHelper.getAsString(0, arrayHelper.getLength() - 3, "_");
- final int connectPort = arrayHelper.getInteger(arrayHelper.getLength() - 2);
- return new ParsedDomain(AddressUtil.parse(connectAddress + ":" + connectPort, serverVersion), serverVersion);
- } catch (IllegalArgumentException | StringIndexOutOfBoundsException e) {
- return null;
- }
- }
-
- public static ParsedDomain parseFormat2(final String address) {
- try {
- final String addressData = address.substring(0, address.toLowerCase().lastIndexOf(".f2.viaproxy."));
- final Matcher matcher = PUBLIC_WILDCARD_FORMAT2_PATTERN.matcher(addressData);
- if (!matcher.matches()) {
- return null;
- }
- final String connectAddress = matcher.group(1);
- final int connectPort = Integer.parseInt(matcher.group(2));
- final String versionString = matcher.group(3);
- ProtocolVersion serverVersion;
- if (versionString != null) { // Version part is optional
- serverVersion = ProtocolVersionUtil.fromNameLenient(versionString);
- } else { // Default to auto-detect
- serverVersion = ProtocolTranslator.AUTO_DETECT_PROTOCOL;
- }
- return new ParsedDomain(AddressUtil.parse(connectAddress + ":" + connectPort, serverVersion), serverVersion);
- } catch (IllegalArgumentException | StringIndexOutOfBoundsException e) {
- return null;
- }
- }
-
-
- public record ParsedDomain(SocketAddress address, ProtocolVersion version) {
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/YamlConfigPatcher.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/util/YamlConfigPatcher.java
deleted file mode 100644
index ccf70e0..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/YamlConfigPatcher.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.util;
-
-import net.lenni0451.optconfig.MapConfigLoader;
-import net.lenni0451.optconfig.provider.ConfigProvider;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.util.Map;
-
-public class YamlConfigPatcher {
-
- private final MapConfigLoader configLoader;
- private final Map config;
-
- public YamlConfigPatcher(final File file) throws IOException {
- if (!file.exists()) {
- Files.writeString(file.toPath(), "{}");
- }
-
- this.configLoader = new MapConfigLoader(ConfigProvider.file(file));
- this.config = this.configLoader.load();
- }
-
- public Map getConfig() {
- return this.config;
- }
-
- public void write() throws IOException {
- this.configLoader.save(this.config);
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/config/AccountTypeSerializer.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/util/config/AccountTypeSerializer.java
deleted file mode 100644
index 92c59b4..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/config/AccountTypeSerializer.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.util.config;
-
-import net.lenni0451.optconfig.serializer.ConfigTypeSerializer;
-import net.raphimc.viaproxy.ViaProxy;
-import net.raphimc.viaproxy.protocoltranslator.viaproxy.ViaProxyConfig;
-import net.raphimc.viaproxy.saves.impl.accounts.Account;
-
-import java.util.List;
-
-public class AccountTypeSerializer extends ConfigTypeSerializer {
-
- public AccountTypeSerializer(final ViaProxyConfig config) {
- super(config);
- }
-
- @Override
- public Account deserialize(final Class typeClass, final Object serializedObject) {
- final List accounts = ViaProxy.getSaveManager().accountsSave.getAccounts();
- final int accountIndex = (int) serializedObject;
- if (this.config.getAuthMethod() == ViaProxyConfig.AuthMethod.ACCOUNT && accountIndex >= 0 && accountIndex < accounts.size()) {
- return accounts.get(accountIndex);
- } else {
- return null;
- }
- }
-
- @Override
- public Object serialize(final Account object) {
- if (object != null) {
- return ViaProxy.getSaveManager().accountsSave.getAccounts().indexOf(object);
- } else {
- return 0;
- }
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/config/ProtocolVersionTypeSerializer.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/util/config/ProtocolVersionTypeSerializer.java
deleted file mode 100644
index 2ed7af9..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/config/ProtocolVersionTypeSerializer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.util.config;
-
-import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
-import net.lenni0451.optconfig.serializer.ConfigTypeSerializer;
-import net.raphimc.viaproxy.protocoltranslator.viaproxy.ViaProxyConfig;
-
-public class ProtocolVersionTypeSerializer extends ConfigTypeSerializer {
-
- public ProtocolVersionTypeSerializer(final ViaProxyConfig config) {
- super(config);
- }
-
- @Override
- public ProtocolVersion deserialize(final Class typeClass, final Object serializedObject) {
- return ProtocolVersion.getClosest((String) serializedObject);
- }
-
- @Override
- public Object serialize(final ProtocolVersion object) {
- return object.getName();
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/config/ProxyTypeSerializer.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/util/config/ProxyTypeSerializer.java
deleted file mode 100644
index 7814364..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/config/ProxyTypeSerializer.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.util.config;
-
-import net.lenni0451.optconfig.serializer.ConfigTypeSerializer;
-import net.raphimc.viaproxy.protocoltranslator.viaproxy.ViaProxyConfig;
-import net.raphimc.viaproxy.util.Proxy;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-
-public class ProxyTypeSerializer extends ConfigTypeSerializer {
-
- public ProxyTypeSerializer(final ViaProxyConfig config) {
- super(config);
- }
-
- @Override
- public Proxy deserialize(final Class typeClass, final Object serializedObject) {
- final String proxyUrl = (String) serializedObject;
- if (!proxyUrl.isBlank()) {
- try {
- return new Proxy(new URI(proxyUrl));
- } catch (URISyntaxException e) {
- throw new IllegalArgumentException("Invalid proxy url: " + proxyUrl + ". Proxy url format: type://address:port or type://username:password@address:port");
- }
- }
- return null;
- }
-
- @Override
- public Object serialize(final Proxy object) {
- if (object != null) {
- return object.toURI().toString();
- } else {
- return "";
- }
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/config/SocketAddressTypeSerializer.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/util/config/SocketAddressTypeSerializer.java
deleted file mode 100644
index aa276a7..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/config/SocketAddressTypeSerializer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.util.config;
-
-import net.lenni0451.optconfig.serializer.ConfigTypeSerializer;
-import net.raphimc.viaproxy.protocoltranslator.viaproxy.ViaProxyConfig;
-import net.raphimc.viaproxy.util.AddressUtil;
-
-import java.net.SocketAddress;
-
-public class SocketAddressTypeSerializer extends ConfigTypeSerializer {
-
- public SocketAddressTypeSerializer(final ViaProxyConfig config) {
- super(config);
- }
-
- @Override
- public SocketAddress deserialize(final Class typeClass, final Object serializedObject) {
- return AddressUtil.parse((String) serializedObject, null);
- }
-
- @Override
- public Object serialize(final SocketAddress object) {
- return AddressUtil.toString(object);
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/config/TargetAddressTypeSerializer.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/util/config/TargetAddressTypeSerializer.java
deleted file mode 100644
index ec3c95d..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/config/TargetAddressTypeSerializer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.util.config;
-
-import net.lenni0451.optconfig.serializer.ConfigTypeSerializer;
-import net.raphimc.viaproxy.protocoltranslator.viaproxy.ViaProxyConfig;
-import net.raphimc.viaproxy.util.AddressUtil;
-
-import java.net.SocketAddress;
-
-public class TargetAddressTypeSerializer extends ConfigTypeSerializer {
-
- public TargetAddressTypeSerializer(final ViaProxyConfig config) {
- super(config);
- }
-
- @Override
- public SocketAddress deserialize(final Class typeClass, final Object serializedObject) {
- return AddressUtil.parse((String) serializedObject, this.config.getTargetVersion());
- }
-
- @Override
- public Object serialize(final SocketAddress object) {
- return AddressUtil.toString(object);
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/logging/IpRedactor.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/util/logging/IpRedactor.java
deleted file mode 100644
index d800560..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/logging/IpRedactor.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.util.logging;
-
-import net.raphimc.viaproxy.ViaProxy;
-import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.pattern.ConverterKeys;
-import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
-import org.apache.logging.log4j.core.pattern.PatternConverter;
-
-import java.util.regex.Pattern;
-
-@Plugin(name = "ip_redactor", category = PatternConverter.CATEGORY)
-@ConverterKeys({"ip_redactor"})
-public class IpRedactor extends LogEventPatternConverter {
-
- private final Pattern IPV4_REGEX = Pattern.compile("(\\b25[0-5]|\\b2[0-4][0-9]|\\b[01]?[0-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}");
- private final Pattern IPV6_REGEX = Pattern.compile("(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))");
-
- public static IpRedactor newInstance(final String[] options) {
- return new IpRedactor();
- }
-
- private IpRedactor() {
- super("IpRedactor", null);
- }
-
- @Override
- public void format(final LogEvent event, final StringBuilder toAppendTo) {
- if (ViaProxy.getConfig() != null && !ViaProxy.getConfig().shouldLogIps()) {
- String message = toAppendTo.toString();
- message = IPV4_REGEX.matcher(message).replaceAll("REDACTED_IP");
- message = IPV6_REGEX.matcher(message).replaceAll("REDACTED_IP");
- toAppendTo.setLength(0);
- toAppendTo.append(message);
- }
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/logging/JLoggerToSLF4J.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/util/logging/JLoggerToSLF4J.java
deleted file mode 100644
index dcfe05a..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/logging/JLoggerToSLF4J.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.util.logging;
-
-import java.text.MessageFormat;
-import java.util.logging.Level;
-import java.util.logging.LogRecord;
-import java.util.logging.Logger;
-
-public final class JLoggerToSLF4J extends Logger {
-
- private final org.slf4j.Logger base;
-
- public JLoggerToSLF4J(org.slf4j.Logger logger) {
- super("logger", null);
- this.base = logger;
- }
-
- @Override
- public void log(LogRecord record) {
- this.log(record.getLevel(), record.getMessage());
- }
-
- @Override
- public void log(Level level, String msg) {
- if (level == Level.FINE) {
- this.base.debug(msg);
- } else if (level == Level.WARNING) {
- this.base.warn(msg);
- } else if (level == Level.SEVERE) {
- this.base.error(msg);
- } else if (level == Level.INFO) {
- this.base.info(msg);
- } else {
- this.base.trace(msg);
- }
- }
-
- @Override
- public void log(Level level, String msg, Object param1) {
- if (level == Level.FINE) {
- this.base.debug(msg, param1);
- } else if (level == Level.WARNING) {
- this.base.warn(msg, param1);
- } else if (level == Level.SEVERE) {
- this.base.error(msg, param1);
- } else if (level == Level.INFO) {
- this.base.info(msg, param1);
- } else {
- this.base.trace(msg, param1);
- }
-
- }
-
- @Override
- public void log(Level level, String msg, Object[] params) {
- log(level, MessageFormat.format(msg, params));
- }
-
- @Override
- public void log(Level level, String msg, Throwable params) {
- if (level == Level.FINE) {
- this.base.debug(msg, params);
- } else if (level == Level.WARNING) {
- this.base.warn(msg, params);
- } else if (level == Level.SEVERE) {
- this.base.error(msg, params);
- } else if (level == Level.INFO) {
- this.base.info(msg, params);
- } else {
- this.base.trace(msg, params);
- }
- }
-
-}
\ No newline at end of file
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/logging/Logger.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/util/logging/Logger.java
deleted file mode 100644
index c3afcda..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/logging/Logger.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.util.logging;
-
-import com.mojang.authlib.GameProfile;
-import net.raphimc.viaproxy.proxy.session.ProxyConnection;
-import net.raphimc.viaproxy.util.AddressUtil;
-import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
-import org.jline.jansi.AnsiConsole;
-
-import java.io.PrintStream;
-import java.net.SocketAddress;
-import java.util.Locale;
-
-public class Logger {
-
- static {
- PluginManager.addPackage("net.raphimc.viaproxy.util.logging");
- }
-
- public static final org.apache.logging.log4j.Logger LOGGER = LogManager.getLogger("ViaProxy");
-
- public static final PrintStream SYSOUT = System.out;
- public static final PrintStream SYSERR = System.err;
-
- public static void setup() {
- if (System.console() != null) { // jANSI is the best lib. If there is no console it just segfaults the JVM process. Thanks!
- AnsiConsole.systemInstall();
- }
- System.setErr(new LoggerPrintStream("STDERR", SYSERR));
- System.setOut(new LoggerPrintStream("STDOUT", SYSOUT));
- }
-
- public static void u_info(final String title, final ProxyConnection proxyConnection, final String msg) {
- u_log(Level.INFO, title, proxyConnection, msg);
- }
-
- public static void u_warn(final String title, final ProxyConnection proxyConnection, final String msg) {
- u_log(Level.WARN, title, proxyConnection, msg);
- }
-
- public static void u_err(final String title, final ProxyConnection proxyConnection, final String msg) {
- u_log(Level.INFO, title, proxyConnection, msg);
- }
-
- public static void u_log(final Level level, final String title, final ProxyConnection proxyConnection, final String msg) {
- final SocketAddress address = proxyConnection.getC2P().remoteAddress();
- final GameProfile gameProfile = proxyConnection.getGameProfile();
- u_log(level, title, address, gameProfile, msg);
- }
-
- public static void u_log(final Level level, final String title, final SocketAddress address, final GameProfile gameProfile, final String msg) {
- LOGGER.log(level, "[" + title.toUpperCase(Locale.ROOT) + "] (" + AddressUtil.toString(address) + " | " + (gameProfile != null ? gameProfile.getName() : "null") + ") " + msg);
- }
-
-}
diff --git a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/logging/LoggerPrintStream.java b/ViaProxy/src/main/java/net/raphimc/viaproxy/util/logging/LoggerPrintStream.java
deleted file mode 100644
index 670136d..0000000
--- a/ViaProxy/src/main/java/net/raphimc/viaproxy/util/logging/LoggerPrintStream.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
- * Copyright (C) 2021-2026 RK_01/RaphiMC and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package net.raphimc.viaproxy.util.logging;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-
-import java.io.OutputStream;
-import java.io.PrintStream;
-
-public class LoggerPrintStream extends PrintStream {
-
- protected static final Logger LOGGER = LogManager.getLogger();
- protected final String name;
-
- public LoggerPrintStream(final String name, final OutputStream out) {
- super(out);
-
- this.name = name;
- }
-
- public void println(final String message) {
- this.log(message);
- }
-
- public void println(final Object object) {
- this.log(String.valueOf(object));
- }
-
- protected void log(final String message) {
- LOGGER.info("[{}]: {}", this.name, message);
- }
-
-}
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/data/armor-damages-b1.8.1.json b/ViaProxy/src/main/resources/assets/viaproxy/data/armor-damages-b1.8.1.json
deleted file mode 100644
index 83865a8..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/data/armor-damages-b1.8.1.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "minecraft:leather_helmet": 33,
- "minecraft:leather_chestplate": 48,
- "minecraft:leather_leggings": 45,
- "minecraft:leather_boots": 39,
- "minecraft:chainmail_helmet": 66,
- "minecraft:chainmail_chestplate": 96,
- "minecraft:chainmail_leggings": 90,
- "minecraft:chainmail_boots": 78,
- "minecraft:iron_helmet": 132,
- "minecraft:iron_chestplate": 192,
- "minecraft:iron_leggings": 180,
- "minecraft:iron_boots": 156,
- "minecraft:diamond_helmet": 264,
- "minecraft:diamond_chestplate": 384,
- "minecraft:diamond_leggings": 360,
- "minecraft:diamond_boots": 312,
- "minecraft:golden_helmet": 66,
- "minecraft:golden_chestplate": 96,
- "minecraft:golden_leggings": 90,
- "minecraft:golden_boots": 78
-}
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/data/item-attributes-1.8.json b/ViaProxy/src/main/resources/assets/viaproxy/data/item-attributes-1.8.json
deleted file mode 100644
index 1ad758c..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/data/item-attributes-1.8.json
+++ /dev/null
@@ -1,232 +0,0 @@
-{
- "minecraft:wooden_axe": {
- "generic.attackDamage": {
- "id": "CB3F55D3-645C-4F38-A497-9C13A33DB5CF",
- "name": "Tool modifier",
- "amount": 3.0,
- "operation": 0,
- "slot": "mainhand"
- }
- },
- "minecraft:stone_axe": {
- "generic.attackDamage": {
- "id": "CB3F55D3-645C-4F38-A497-9C13A33DB5CF",
- "name": "Tool modifier",
- "amount": 4.0,
- "operation": 0,
- "slot": "mainhand"
- }
- },
- "minecraft:iron_axe": {
- "generic.attackDamage": {
- "id": "CB3F55D3-645C-4F38-A497-9C13A33DB5CF",
- "name": "Tool modifier",
- "amount": 5.0,
- "operation": 0,
- "slot": "mainhand"
- }
- },
- "minecraft:golden_axe": {
- "generic.attackDamage": {
- "id": "CB3F55D3-645C-4F38-A497-9C13A33DB5CF",
- "name": "Tool modifier",
- "amount": 3.0,
- "operation": 0,
- "slot": "mainhand"
- }
- },
- "minecraft:diamond_axe": {
- "generic.attackDamage": {
- "id": "CB3F55D3-645C-4F38-A497-9C13A33DB5CF",
- "name": "Tool modifier",
- "amount": 6.0,
- "operation": 0,
- "slot": "mainhand"
- }
- },
- "minecraft:wooden_pickaxe": {
- "generic.attackDamage": {
- "id": "CB3F55D3-645C-4F38-A497-9C13A33DB5CF",
- "name": "Tool modifier",
- "amount": 2.0,
- "operation": 0,
- "slot": "mainhand"
- }
- },
- "minecraft:stone_pickaxe": {
- "generic.attackDamage": {
- "id": "CB3F55D3-645C-4F38-A497-9C13A33DB5CF",
- "name": "Tool modifier",
- "amount": 3.0,
- "operation": 0,
- "slot": "mainhand"
- }
- },
- "minecraft:iron_pickaxe": {
- "generic.attackDamage": {
- "id": "CB3F55D3-645C-4F38-A497-9C13A33DB5CF",
- "name": "Tool modifier",
- "amount": 4.0,
- "operation": 0,
- "slot": "mainhand"
- }
- },
- "minecraft:golden_pickaxe": {
- "generic.attackDamage": {
- "id": "CB3F55D3-645C-4F38-A497-9C13A33DB5CF",
- "name": "Tool modifier",
- "amount": 2.0,
- "operation": 0,
- "slot": "mainhand"
- }
- },
- "minecraft:diamond_pickaxe": {
- "generic.attackDamage": {
- "id": "CB3F55D3-645C-4F38-A497-9C13A33DB5CF",
- "name": "Tool modifier",
- "amount": 5.0,
- "operation": 0,
- "slot": "mainhand"
- }
- },
- "minecraft:wooden_shovel": {
- "generic.attackDamage": {
- "id": "CB3F55D3-645C-4F38-A497-9C13A33DB5CF",
- "name": "Tool modifier",
- "amount": 1.0,
- "operation": 0,
- "slot": "mainhand"
- }
- },
- "minecraft:stone_shovel": {
- "generic.attackDamage": {
- "id": "CB3F55D3-645C-4F38-A497-9C13A33DB5CF",
- "name": "Tool modifier",
- "amount": 2.0,
- "operation": 0,
- "slot": "mainhand"
- }
- },
- "minecraft:iron_shovel": {
- "generic.attackDamage": {
- "id": "CB3F55D3-645C-4F38-A497-9C13A33DB5CF",
- "name": "Tool modifier",
- "amount": 3.0,
- "operation": 0,
- "slot": "mainhand"
- }
- },
- "minecraft:golden_shovel": {
- "generic.attackDamage": {
- "id": "CB3F55D3-645C-4F38-A497-9C13A33DB5CF",
- "name": "Tool modifier",
- "amount": 1.0,
- "operation": 0,
- "slot": "mainhand"
- }
- },
- "minecraft:diamond_shovel": {
- "generic.attackDamage": {
- "id": "CB3F55D3-645C-4F38-A497-9C13A33DB5CF",
- "name": "Tool modifier",
- "amount": 4.0,
- "operation": 0,
- "slot": "mainhand"
- }
- },
- "minecraft:wooden_sword": {
- "generic.attackDamage": {
- "id": "CB3F55D3-645C-4F38-A497-9C13A33DB5CF",
- "name": "Weapon modifier",
- "amount": 4.0,
- "operation": 0,
- "slot": "mainhand"
- }
- },
- "minecraft:stone_sword": {
- "generic.attackDamage": {
- "id": "CB3F55D3-645C-4F38-A497-9C13A33DB5CF",
- "name": "Weapon modifier",
- "amount": 5.0,
- "operation": 0,
- "slot": "mainhand"
- }
- },
- "minecraft:iron_sword": {
- "generic.attackDamage": {
- "id": "CB3F55D3-645C-4F38-A497-9C13A33DB5CF",
- "name": "Weapon modifier",
- "amount": 6.0,
- "operation": 0,
- "slot": "mainhand"
- }
- },
- "minecraft:golden_sword": {
- "generic.attackDamage": {
- "id": "CB3F55D3-645C-4F38-A497-9C13A33DB5CF",
- "name": "Weapon modifier",
- "amount": 4.0,
- "operation": 0,
- "slot": "mainhand"
- }
- },
- "minecraft:diamond_sword": {
- "generic.attackDamage": {
- "id": "CB3F55D3-645C-4F38-A497-9C13A33DB5CF",
- "name": "Weapon modifier",
- "amount": 7.0,
- "operation": 0,
- "slot": "mainhand"
- }
- },
- "minecraft:wooden_hoe": {
- },
- "minecraft:stone_hoe": {
- },
- "minecraft:iron_hoe": {
- },
- "minecraft:golden_hoe": {
- },
- "minecraft:diamond_hoe": {
- },
- "minecraft:leather_boots": {
- },
- "minecraft:leather_leggings": {
- },
- "minecraft:leather_chestplate": {
- },
- "minecraft:leather_helmet": {
- },
- "minecraft:chainmail_boots": {
- },
- "minecraft:chainmail_leggings": {
- },
- "minecraft:chainmail_chestplate": {
- },
- "minecraft:chainmail_helmet": {
- },
- "minecraft:iron_boots": {
- },
- "minecraft:iron_leggings": {
- },
- "minecraft:iron_chestplate": {
- },
- "minecraft:iron_helmet": {
- },
- "minecraft:golden_boots": {
- },
- "minecraft:golden_leggings": {
- },
- "minecraft:golden_chestplate": {
- },
- "minecraft:golden_helmet": {
- },
- "minecraft:diamond_boots": {
- },
- "minecraft:diamond_leggings": {
- },
- "minecraft:diamond_chestplate": {
- },
- "minecraft:diamond_helmet": {
- }
-}
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/data/item-identifiers-1.8.json b/ViaProxy/src/main/resources/assets/viaproxy/data/item-identifiers-1.8.json
deleted file mode 100644
index 7d9d63c..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/data/item-identifiers-1.8.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "minecraft:wooden_axe": 271,
- "minecraft:stone_axe": 275,
- "minecraft:iron_axe": 258,
- "minecraft:golden_axe": 286,
- "minecraft:diamond_axe": 279,
- "minecraft:wooden_pickaxe": 270,
- "minecraft:stone_pickaxe": 274,
- "minecraft:iron_pickaxe": 257,
- "minecraft:golden_pickaxe": 285,
- "minecraft:diamond_pickaxe": 278,
- "minecraft:wooden_shovel": 269,
- "minecraft:stone_shovel": 273,
- "minecraft:iron_shovel": 256,
- "minecraft:golden_shovel": 284,
- "minecraft:diamond_shovel": 277,
- "minecraft:wooden_sword": 268,
- "minecraft:stone_sword": 272,
- "minecraft:iron_sword": 267,
- "minecraft:golden_sword": 283,
- "minecraft:diamond_sword": 276,
- "minecraft:wooden_hoe": 290,
- "minecraft:stone_hoe": 291,
- "minecraft:iron_hoe": 292,
- "minecraft:golden_hoe": 294,
- "minecraft:diamond_hoe": 293,
- "minecraft:leather_boots": 301,
- "minecraft:leather_leggings": 300,
- "minecraft:leather_chestplate": 299,
- "minecraft:leather_helmet": 298,
- "minecraft:chainmail_boots": 305,
- "minecraft:chainmail_leggings": 304,
- "minecraft:chainmail_chestplate": 303,
- "minecraft:chainmail_helmet": 302,
- "minecraft:iron_boots": 309,
- "minecraft:iron_leggings": 308,
- "minecraft:iron_chestplate": 307,
- "minecraft:iron_helmet": 306,
- "minecraft:golden_boots": 317,
- "minecraft:golden_leggings": 316,
- "minecraft:golden_chestplate": 315,
- "minecraft:golden_helmet": 314,
- "minecraft:diamond_boots": 313,
- "minecraft:diamond_leggings": 312,
- "minecraft:diamond_chestplate": 311,
- "minecraft:diamond_helmet": 310
-}
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/data/item-tool-components.json b/ViaProxy/src/main/resources/assets/viaproxy/data/item-tool-components.json
deleted file mode 100644
index 22142b5..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/data/item-tool-components.json
+++ /dev/null
@@ -1,3272 +0,0 @@
-{
- "b1.8.1": [
- {
- "item": "minecraft:wooden_axe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:bookshelf",
- "minecraft:chest",
- "minecraft:oak_planks",
- "minecraft:oak_log",
- "minecraft:birch_log",
- "minecraft:spruce_log"
- ],
- "speed": 2.0
- }
- ]
- },
- {
- "item": "minecraft:stone_axe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:bookshelf",
- "minecraft:chest",
- "minecraft:oak_planks",
- "minecraft:oak_log",
- "minecraft:birch_log",
- "minecraft:spruce_log"
- ],
- "speed": 4.0
- }
- ]
- },
- {
- "item": "minecraft:iron_axe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:bookshelf",
- "minecraft:chest",
- "minecraft:oak_planks",
- "minecraft:oak_log",
- "minecraft:birch_log",
- "minecraft:spruce_log"
- ],
- "speed": 6.0
- }
- ]
- },
- {
- "item": "minecraft:golden_axe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:bookshelf",
- "minecraft:chest",
- "minecraft:oak_planks",
- "minecraft:oak_log",
- "minecraft:birch_log",
- "minecraft:spruce_log"
- ],
- "speed": 12.0
- }
- ]
- },
- {
- "item": "minecraft:diamond_axe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:bookshelf",
- "minecraft:chest",
- "minecraft:oak_planks",
- "minecraft:oak_log",
- "minecraft:birch_log",
- "minecraft:spruce_log"
- ],
- "speed": 8.0
- }
- ]
- },
- {
- "item": "minecraft:wooden_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "-minecraft:iron_block",
- "-minecraft:iron_ore",
- "-minecraft:lapis_block",
- "-minecraft:lapis_ore",
- "-minecraft:diamond_block",
- "-minecraft:diamond_ore",
- "-minecraft:emerald_block",
- "-minecraft:emerald_ore",
- "-minecraft:gold_block",
- "-minecraft:gold_ore",
- "-minecraft:redstone_ore",
- "-minecraft:obsidian",
- "-minecraft:crying_obsidian",
- "-minecraft:netherite_block",
- "-minecraft:ancient_debris",
- "-minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:gold_ore",
- "minecraft:diamond_ore",
- "minecraft:stone",
- "minecraft:iron_block",
- "minecraft:netherrack",
- "minecraft:iron_ore",
- "minecraft:sandstone",
- "minecraft:lapis_block",
- "minecraft:ice",
- "minecraft:gold_block",
- "minecraft:mossy_cobblestone",
- "minecraft:diamond_block",
- "minecraft:petrified_oak_slab",
- "minecraft:lapis_ore",
- "minecraft:coal_ore",
- "minecraft:smooth_stone_slab",
- "minecraft:cobblestone",
- "minecraft:sandstone_slab",
- "minecraft:stone_brick_slab",
- "minecraft:brick_slab",
- "minecraft:cobblestone_slab"
- ],
- "speed": 2.0
- }
- ]
- },
- {
- "item": "minecraft:stone_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "-minecraft:diamond_block",
- "-minecraft:diamond_ore",
- "-minecraft:emerald_block",
- "-minecraft:emerald_ore",
- "-minecraft:gold_block",
- "-minecraft:gold_ore",
- "-minecraft:redstone_ore",
- "-minecraft:obsidian",
- "-minecraft:crying_obsidian",
- "-minecraft:netherite_block",
- "-minecraft:ancient_debris",
- "-minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:gold_ore",
- "minecraft:diamond_ore",
- "minecraft:stone",
- "minecraft:iron_block",
- "minecraft:netherrack",
- "minecraft:iron_ore",
- "minecraft:sandstone",
- "minecraft:lapis_block",
- "minecraft:ice",
- "minecraft:gold_block",
- "minecraft:mossy_cobblestone",
- "minecraft:diamond_block",
- "minecraft:petrified_oak_slab",
- "minecraft:lapis_ore",
- "minecraft:coal_ore",
- "minecraft:smooth_stone_slab",
- "minecraft:cobblestone",
- "minecraft:sandstone_slab",
- "minecraft:stone_brick_slab",
- "minecraft:brick_slab",
- "minecraft:cobblestone_slab"
- ],
- "speed": 4.0
- }
- ]
- },
- {
- "item": "minecraft:iron_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:emerald_block",
- "minecraft:emerald_ore",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:redstone_ore",
- "-minecraft:obsidian",
- "-minecraft:crying_obsidian",
- "-minecraft:netherite_block",
- "-minecraft:ancient_debris",
- "-minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:gold_ore",
- "minecraft:diamond_ore",
- "minecraft:stone",
- "minecraft:iron_block",
- "minecraft:netherrack",
- "minecraft:iron_ore",
- "minecraft:sandstone",
- "minecraft:lapis_block",
- "minecraft:ice",
- "minecraft:gold_block",
- "minecraft:mossy_cobblestone",
- "minecraft:diamond_block",
- "minecraft:petrified_oak_slab",
- "minecraft:lapis_ore",
- "minecraft:coal_ore",
- "minecraft:smooth_stone_slab",
- "minecraft:cobblestone",
- "minecraft:sandstone_slab",
- "minecraft:stone_brick_slab",
- "minecraft:brick_slab",
- "minecraft:cobblestone_slab"
- ],
- "speed": 6.0
- }
- ]
- },
- {
- "item": "minecraft:golden_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "-minecraft:iron_block",
- "-minecraft:iron_ore",
- "-minecraft:lapis_block",
- "-minecraft:lapis_ore",
- "-minecraft:diamond_block",
- "-minecraft:diamond_ore",
- "-minecraft:emerald_block",
- "-minecraft:emerald_ore",
- "-minecraft:gold_block",
- "-minecraft:gold_ore",
- "-minecraft:redstone_ore",
- "-minecraft:obsidian",
- "-minecraft:crying_obsidian",
- "-minecraft:netherite_block",
- "-minecraft:ancient_debris",
- "-minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:gold_ore",
- "minecraft:diamond_ore",
- "minecraft:stone",
- "minecraft:iron_block",
- "minecraft:netherrack",
- "minecraft:iron_ore",
- "minecraft:sandstone",
- "minecraft:lapis_block",
- "minecraft:ice",
- "minecraft:gold_block",
- "minecraft:mossy_cobblestone",
- "minecraft:diamond_block",
- "minecraft:petrified_oak_slab",
- "minecraft:lapis_ore",
- "minecraft:coal_ore",
- "minecraft:smooth_stone_slab",
- "minecraft:cobblestone",
- "minecraft:sandstone_slab",
- "minecraft:stone_brick_slab",
- "minecraft:brick_slab",
- "minecraft:cobblestone_slab"
- ],
- "speed": 12.0
- }
- ]
- },
- {
- "item": "minecraft:diamond_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:emerald_block",
- "minecraft:emerald_ore",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:redstone_ore",
- "minecraft:obsidian",
- "minecraft:crying_obsidian",
- "minecraft:netherite_block",
- "minecraft:ancient_debris",
- "minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:gold_ore",
- "minecraft:diamond_ore",
- "minecraft:stone",
- "minecraft:iron_block",
- "minecraft:netherrack",
- "minecraft:iron_ore",
- "minecraft:sandstone",
- "minecraft:lapis_block",
- "minecraft:ice",
- "minecraft:gold_block",
- "minecraft:mossy_cobblestone",
- "minecraft:diamond_block",
- "minecraft:petrified_oak_slab",
- "minecraft:lapis_ore",
- "minecraft:coal_ore",
- "minecraft:smooth_stone_slab",
- "minecraft:cobblestone",
- "minecraft:sandstone_slab",
- "minecraft:stone_brick_slab",
- "minecraft:brick_slab",
- "minecraft:cobblestone_slab"
- ],
- "speed": 8.0
- }
- ]
- },
- {
- "item": "minecraft:wooden_shovel",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "minecraft:snow",
- "minecraft:snow_block"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:sand",
- "minecraft:snow",
- "minecraft:gravel",
- "minecraft:farmland",
- "minecraft:snow_block",
- "minecraft:grass_block",
- "minecraft:dirt",
- "minecraft:clay"
- ],
- "speed": 2.0
- }
- ]
- },
- {
- "item": "minecraft:stone_shovel",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "minecraft:snow",
- "minecraft:snow_block"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:sand",
- "minecraft:snow",
- "minecraft:gravel",
- "minecraft:farmland",
- "minecraft:snow_block",
- "minecraft:grass_block",
- "minecraft:dirt",
- "minecraft:clay"
- ],
- "speed": 4.0
- }
- ]
- },
- {
- "item": "minecraft:iron_shovel",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "minecraft:snow",
- "minecraft:snow_block"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:sand",
- "minecraft:snow",
- "minecraft:gravel",
- "minecraft:farmland",
- "minecraft:snow_block",
- "minecraft:grass_block",
- "minecraft:dirt",
- "minecraft:clay"
- ],
- "speed": 6.0
- }
- ]
- },
- {
- "item": "minecraft:golden_shovel",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "minecraft:snow",
- "minecraft:snow_block"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:sand",
- "minecraft:snow",
- "minecraft:gravel",
- "minecraft:farmland",
- "minecraft:snow_block",
- "minecraft:grass_block",
- "minecraft:dirt",
- "minecraft:clay"
- ],
- "speed": 12.0
- }
- ]
- },
- {
- "item": "minecraft:diamond_shovel",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "minecraft:snow",
- "minecraft:snow_block"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:sand",
- "minecraft:snow",
- "minecraft:gravel",
- "minecraft:farmland",
- "minecraft:snow_block",
- "minecraft:grass_block",
- "minecraft:dirt",
- "minecraft:clay"
- ],
- "speed": 8.0
- }
- ]
- },
- {
- "item": "minecraft:wooden_sword",
- "default_mining_speed": 1.5,
- "damage_per_block": 2,
- "suitable_for": [
- "minecraft:cobweb"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:cobweb"
- ],
- "speed": 15.0
- }
- ]
- },
- {
- "item": "minecraft:stone_sword",
- "default_mining_speed": 1.5,
- "damage_per_block": 2,
- "suitable_for": [
- "minecraft:cobweb"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:cobweb"
- ],
- "speed": 15.0
- }
- ]
- },
- {
- "item": "minecraft:iron_sword",
- "default_mining_speed": 1.5,
- "damage_per_block": 2,
- "suitable_for": [
- "minecraft:cobweb"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:cobweb"
- ],
- "speed": 15.0
- }
- ]
- },
- {
- "item": "minecraft:golden_sword",
- "default_mining_speed": 1.5,
- "damage_per_block": 2,
- "suitable_for": [
- "minecraft:cobweb"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:cobweb"
- ],
- "speed": 15.0
- }
- ]
- },
- {
- "item": "minecraft:diamond_sword",
- "default_mining_speed": 1.5,
- "damage_per_block": 2,
- "suitable_for": [
- "minecraft:cobweb"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:cobweb"
- ],
- "speed": 15.0
- }
- ]
- },
- {
- "item": "minecraft:shears",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "minecraft:cobweb"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:white_wool",
- "minecraft:pink_wool",
- "minecraft:yellow_wool",
- "minecraft:brown_wool",
- "minecraft:blue_wool",
- "minecraft:magenta_wool",
- "minecraft:lime_wool",
- "minecraft:gray_wool",
- "minecraft:light_gray_wool",
- "minecraft:green_wool",
- "minecraft:light_blue_wool",
- "minecraft:purple_wool",
- "minecraft:orange_wool",
- "minecraft:red_wool",
- "minecraft:black_wool",
- "minecraft:cyan_wool"
- ],
- "speed": 5.0
- },
- {
- "blocks": [
- "minecraft:birch_leaves",
- "minecraft:oak_leaves",
- "minecraft:cobweb",
- "minecraft:spruce_leaves"
- ],
- "speed": 15.0
- }
- ]
- }
- ],
- "1.13.2": [
- {
- "item": "minecraft:wooden_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "-minecraft:iron_block",
- "-minecraft:iron_ore",
- "-minecraft:lapis_block",
- "-minecraft:lapis_ore",
- "-minecraft:diamond_block",
- "-minecraft:diamond_ore",
- "-minecraft:emerald_block",
- "-minecraft:emerald_ore",
- "-minecraft:gold_block",
- "-minecraft:gold_ore",
- "-minecraft:redstone_ore",
- "-minecraft:obsidian",
- "-minecraft:crying_obsidian",
- "-minecraft:netherite_block",
- "-minecraft:ancient_debris",
- "-minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:activator_rail",
- "minecraft:coal_ore",
- "minecraft:cobblestone",
- "minecraft:detector_rail",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:powered_rail",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:ice",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:mossy_cobblestone",
- "minecraft:netherrack",
- "minecraft:packed_ice",
- "minecraft:blue_ice",
- "minecraft:rail",
- "minecraft:redstone_ore",
- "minecraft:sandstone",
- "minecraft:chiseled_sandstone",
- "minecraft:cut_sandstone",
- "minecraft:chiseled_red_sandstone",
- "minecraft:cut_red_sandstone",
- "minecraft:red_sandstone",
- "minecraft:stone",
- "minecraft:granite",
- "minecraft:polished_granite",
- "minecraft:diorite",
- "minecraft:polished_diorite",
- "minecraft:andesite",
- "minecraft:polished_andesite",
- "minecraft:stone_slab",
- "minecraft:smooth_stone_slab",
- "minecraft:sandstone_slab",
- "minecraft:petrified_oak_slab",
- "minecraft:cobblestone_slab",
- "minecraft:brick_slab",
- "minecraft:stone_brick_slab",
- "minecraft:nether_brick_slab",
- "minecraft:quartz_slab",
- "minecraft:red_sandstone_slab",
- "minecraft:purpur_slab",
- "minecraft:smooth_quartz",
- "minecraft:smooth_red_sandstone",
- "minecraft:smooth_sandstone",
- "minecraft:smooth_stone",
- "minecraft:stone_button",
- "minecraft:stone_pressure_plate",
- "minecraft:polished_granite_slab",
- "minecraft:smooth_red_sandstone_slab",
- "minecraft:mossy_stone_brick_slab",
- "minecraft:polished_diorite_slab",
- "minecraft:mossy_cobblestone_slab",
- "minecraft:end_stone_brick_slab",
- "minecraft:smooth_sandstone_slab",
- "minecraft:smooth_quartz_slab",
- "minecraft:granite_slab",
- "minecraft:andesite_slab",
- "minecraft:red_nether_brick_slab",
- "minecraft:polished_andesite_slab",
- "minecraft:diorite_slab",
- "minecraft:shulker_box",
- "minecraft:black_shulker_box",
- "minecraft:blue_shulker_box",
- "minecraft:brown_shulker_box",
- "minecraft:cyan_shulker_box",
- "minecraft:gray_shulker_box",
- "minecraft:green_shulker_box",
- "minecraft:light_blue_shulker_box",
- "minecraft:light_gray_shulker_box",
- "minecraft:lime_shulker_box",
- "minecraft:magenta_shulker_box",
- "minecraft:orange_shulker_box",
- "minecraft:pink_shulker_box",
- "minecraft:purple_shulker_box",
- "minecraft:red_shulker_box",
- "minecraft:white_shulker_box",
- "minecraft:yellow_shulker_box"
- ],
- "speed": 2.0
- }
- ]
- },
- {
- "item": "minecraft:stone_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "-minecraft:diamond_block",
- "-minecraft:diamond_ore",
- "-minecraft:emerald_block",
- "-minecraft:emerald_ore",
- "-minecraft:gold_block",
- "-minecraft:gold_ore",
- "-minecraft:redstone_ore",
- "-minecraft:obsidian",
- "-minecraft:crying_obsidian",
- "-minecraft:netherite_block",
- "-minecraft:ancient_debris",
- "-minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:activator_rail",
- "minecraft:coal_ore",
- "minecraft:cobblestone",
- "minecraft:detector_rail",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:powered_rail",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:ice",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:mossy_cobblestone",
- "minecraft:netherrack",
- "minecraft:packed_ice",
- "minecraft:blue_ice",
- "minecraft:rail",
- "minecraft:redstone_ore",
- "minecraft:sandstone",
- "minecraft:chiseled_sandstone",
- "minecraft:cut_sandstone",
- "minecraft:chiseled_red_sandstone",
- "minecraft:cut_red_sandstone",
- "minecraft:red_sandstone",
- "minecraft:stone",
- "minecraft:granite",
- "minecraft:polished_granite",
- "minecraft:diorite",
- "minecraft:polished_diorite",
- "minecraft:andesite",
- "minecraft:polished_andesite",
- "minecraft:stone_slab",
- "minecraft:smooth_stone_slab",
- "minecraft:sandstone_slab",
- "minecraft:petrified_oak_slab",
- "minecraft:cobblestone_slab",
- "minecraft:brick_slab",
- "minecraft:stone_brick_slab",
- "minecraft:nether_brick_slab",
- "minecraft:quartz_slab",
- "minecraft:red_sandstone_slab",
- "minecraft:purpur_slab",
- "minecraft:smooth_quartz",
- "minecraft:smooth_red_sandstone",
- "minecraft:smooth_sandstone",
- "minecraft:smooth_stone",
- "minecraft:stone_button",
- "minecraft:stone_pressure_plate",
- "minecraft:polished_granite_slab",
- "minecraft:smooth_red_sandstone_slab",
- "minecraft:mossy_stone_brick_slab",
- "minecraft:polished_diorite_slab",
- "minecraft:mossy_cobblestone_slab",
- "minecraft:end_stone_brick_slab",
- "minecraft:smooth_sandstone_slab",
- "minecraft:smooth_quartz_slab",
- "minecraft:granite_slab",
- "minecraft:andesite_slab",
- "minecraft:red_nether_brick_slab",
- "minecraft:polished_andesite_slab",
- "minecraft:diorite_slab",
- "minecraft:shulker_box",
- "minecraft:black_shulker_box",
- "minecraft:blue_shulker_box",
- "minecraft:brown_shulker_box",
- "minecraft:cyan_shulker_box",
- "minecraft:gray_shulker_box",
- "minecraft:green_shulker_box",
- "minecraft:light_blue_shulker_box",
- "minecraft:light_gray_shulker_box",
- "minecraft:lime_shulker_box",
- "minecraft:magenta_shulker_box",
- "minecraft:orange_shulker_box",
- "minecraft:pink_shulker_box",
- "minecraft:purple_shulker_box",
- "minecraft:red_shulker_box",
- "minecraft:white_shulker_box",
- "minecraft:yellow_shulker_box"
- ],
- "speed": 4.0
- }
- ]
- },
- {
- "item": "minecraft:iron_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:emerald_block",
- "minecraft:emerald_ore",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:redstone_ore",
- "-minecraft:obsidian",
- "-minecraft:crying_obsidian",
- "-minecraft:netherite_block",
- "-minecraft:ancient_debris",
- "-minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:activator_rail",
- "minecraft:coal_ore",
- "minecraft:cobblestone",
- "minecraft:detector_rail",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:powered_rail",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:ice",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:mossy_cobblestone",
- "minecraft:netherrack",
- "minecraft:packed_ice",
- "minecraft:blue_ice",
- "minecraft:rail",
- "minecraft:redstone_ore",
- "minecraft:sandstone",
- "minecraft:chiseled_sandstone",
- "minecraft:cut_sandstone",
- "minecraft:chiseled_red_sandstone",
- "minecraft:cut_red_sandstone",
- "minecraft:red_sandstone",
- "minecraft:stone",
- "minecraft:granite",
- "minecraft:polished_granite",
- "minecraft:diorite",
- "minecraft:polished_diorite",
- "minecraft:andesite",
- "minecraft:polished_andesite",
- "minecraft:stone_slab",
- "minecraft:smooth_stone_slab",
- "minecraft:sandstone_slab",
- "minecraft:petrified_oak_slab",
- "minecraft:cobblestone_slab",
- "minecraft:brick_slab",
- "minecraft:stone_brick_slab",
- "minecraft:nether_brick_slab",
- "minecraft:quartz_slab",
- "minecraft:red_sandstone_slab",
- "minecraft:purpur_slab",
- "minecraft:smooth_quartz",
- "minecraft:smooth_red_sandstone",
- "minecraft:smooth_sandstone",
- "minecraft:smooth_stone",
- "minecraft:stone_button",
- "minecraft:stone_pressure_plate",
- "minecraft:polished_granite_slab",
- "minecraft:smooth_red_sandstone_slab",
- "minecraft:mossy_stone_brick_slab",
- "minecraft:polished_diorite_slab",
- "minecraft:mossy_cobblestone_slab",
- "minecraft:end_stone_brick_slab",
- "minecraft:smooth_sandstone_slab",
- "minecraft:smooth_quartz_slab",
- "minecraft:granite_slab",
- "minecraft:andesite_slab",
- "minecraft:red_nether_brick_slab",
- "minecraft:polished_andesite_slab",
- "minecraft:diorite_slab",
- "minecraft:shulker_box",
- "minecraft:black_shulker_box",
- "minecraft:blue_shulker_box",
- "minecraft:brown_shulker_box",
- "minecraft:cyan_shulker_box",
- "minecraft:gray_shulker_box",
- "minecraft:green_shulker_box",
- "minecraft:light_blue_shulker_box",
- "minecraft:light_gray_shulker_box",
- "minecraft:lime_shulker_box",
- "minecraft:magenta_shulker_box",
- "minecraft:orange_shulker_box",
- "minecraft:pink_shulker_box",
- "minecraft:purple_shulker_box",
- "minecraft:red_shulker_box",
- "minecraft:white_shulker_box",
- "minecraft:yellow_shulker_box"
- ],
- "speed": 6.0
- }
- ]
- },
- {
- "item": "minecraft:golden_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "-minecraft:iron_block",
- "-minecraft:iron_ore",
- "-minecraft:lapis_block",
- "-minecraft:lapis_ore",
- "-minecraft:diamond_block",
- "-minecraft:diamond_ore",
- "-minecraft:emerald_block",
- "-minecraft:emerald_ore",
- "-minecraft:gold_block",
- "-minecraft:gold_ore",
- "-minecraft:redstone_ore",
- "-minecraft:obsidian",
- "-minecraft:crying_obsidian",
- "-minecraft:netherite_block",
- "-minecraft:ancient_debris",
- "-minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:activator_rail",
- "minecraft:coal_ore",
- "minecraft:cobblestone",
- "minecraft:detector_rail",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:powered_rail",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:ice",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:mossy_cobblestone",
- "minecraft:netherrack",
- "minecraft:packed_ice",
- "minecraft:blue_ice",
- "minecraft:rail",
- "minecraft:redstone_ore",
- "minecraft:sandstone",
- "minecraft:chiseled_sandstone",
- "minecraft:cut_sandstone",
- "minecraft:chiseled_red_sandstone",
- "minecraft:cut_red_sandstone",
- "minecraft:red_sandstone",
- "minecraft:stone",
- "minecraft:granite",
- "minecraft:polished_granite",
- "minecraft:diorite",
- "minecraft:polished_diorite",
- "minecraft:andesite",
- "minecraft:polished_andesite",
- "minecraft:stone_slab",
- "minecraft:smooth_stone_slab",
- "minecraft:sandstone_slab",
- "minecraft:petrified_oak_slab",
- "minecraft:cobblestone_slab",
- "minecraft:brick_slab",
- "minecraft:stone_brick_slab",
- "minecraft:nether_brick_slab",
- "minecraft:quartz_slab",
- "minecraft:red_sandstone_slab",
- "minecraft:purpur_slab",
- "minecraft:smooth_quartz",
- "minecraft:smooth_red_sandstone",
- "minecraft:smooth_sandstone",
- "minecraft:smooth_stone",
- "minecraft:stone_button",
- "minecraft:stone_pressure_plate",
- "minecraft:polished_granite_slab",
- "minecraft:smooth_red_sandstone_slab",
- "minecraft:mossy_stone_brick_slab",
- "minecraft:polished_diorite_slab",
- "minecraft:mossy_cobblestone_slab",
- "minecraft:end_stone_brick_slab",
- "minecraft:smooth_sandstone_slab",
- "minecraft:smooth_quartz_slab",
- "minecraft:granite_slab",
- "minecraft:andesite_slab",
- "minecraft:red_nether_brick_slab",
- "minecraft:polished_andesite_slab",
- "minecraft:diorite_slab",
- "minecraft:shulker_box",
- "minecraft:black_shulker_box",
- "minecraft:blue_shulker_box",
- "minecraft:brown_shulker_box",
- "minecraft:cyan_shulker_box",
- "minecraft:gray_shulker_box",
- "minecraft:green_shulker_box",
- "minecraft:light_blue_shulker_box",
- "minecraft:light_gray_shulker_box",
- "minecraft:lime_shulker_box",
- "minecraft:magenta_shulker_box",
- "minecraft:orange_shulker_box",
- "minecraft:pink_shulker_box",
- "minecraft:purple_shulker_box",
- "minecraft:red_shulker_box",
- "minecraft:white_shulker_box",
- "minecraft:yellow_shulker_box"
- ],
- "speed": 12.0
- }
- ]
- },
- {
- "item": "minecraft:diamond_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:emerald_block",
- "minecraft:emerald_ore",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:redstone_ore",
- "minecraft:obsidian",
- "minecraft:crying_obsidian",
- "minecraft:netherite_block",
- "minecraft:ancient_debris",
- "minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:activator_rail",
- "minecraft:coal_ore",
- "minecraft:cobblestone",
- "minecraft:detector_rail",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:powered_rail",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:ice",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:mossy_cobblestone",
- "minecraft:netherrack",
- "minecraft:packed_ice",
- "minecraft:blue_ice",
- "minecraft:rail",
- "minecraft:redstone_ore",
- "minecraft:sandstone",
- "minecraft:chiseled_sandstone",
- "minecraft:cut_sandstone",
- "minecraft:chiseled_red_sandstone",
- "minecraft:cut_red_sandstone",
- "minecraft:red_sandstone",
- "minecraft:stone",
- "minecraft:granite",
- "minecraft:polished_granite",
- "minecraft:diorite",
- "minecraft:polished_diorite",
- "minecraft:andesite",
- "minecraft:polished_andesite",
- "minecraft:stone_slab",
- "minecraft:smooth_stone_slab",
- "minecraft:sandstone_slab",
- "minecraft:petrified_oak_slab",
- "minecraft:cobblestone_slab",
- "minecraft:brick_slab",
- "minecraft:stone_brick_slab",
- "minecraft:nether_brick_slab",
- "minecraft:quartz_slab",
- "minecraft:red_sandstone_slab",
- "minecraft:purpur_slab",
- "minecraft:smooth_quartz",
- "minecraft:smooth_red_sandstone",
- "minecraft:smooth_sandstone",
- "minecraft:smooth_stone",
- "minecraft:stone_button",
- "minecraft:stone_pressure_plate",
- "minecraft:polished_granite_slab",
- "minecraft:smooth_red_sandstone_slab",
- "minecraft:mossy_stone_brick_slab",
- "minecraft:polished_diorite_slab",
- "minecraft:mossy_cobblestone_slab",
- "minecraft:end_stone_brick_slab",
- "minecraft:smooth_sandstone_slab",
- "minecraft:smooth_quartz_slab",
- "minecraft:granite_slab",
- "minecraft:andesite_slab",
- "minecraft:red_nether_brick_slab",
- "minecraft:polished_andesite_slab",
- "minecraft:diorite_slab",
- "minecraft:shulker_box",
- "minecraft:black_shulker_box",
- "minecraft:blue_shulker_box",
- "minecraft:brown_shulker_box",
- "minecraft:cyan_shulker_box",
- "minecraft:gray_shulker_box",
- "minecraft:green_shulker_box",
- "minecraft:light_blue_shulker_box",
- "minecraft:light_gray_shulker_box",
- "minecraft:lime_shulker_box",
- "minecraft:magenta_shulker_box",
- "minecraft:orange_shulker_box",
- "minecraft:pink_shulker_box",
- "minecraft:purple_shulker_box",
- "minecraft:red_shulker_box",
- "minecraft:white_shulker_box",
- "minecraft:yellow_shulker_box"
- ],
- "speed": 8.0
- }
- ]
- }
- ],
- "1.15.2": [
- {
- "item": "minecraft:wooden_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "-minecraft:iron_block",
- "-minecraft:iron_ore",
- "-minecraft:lapis_block",
- "-minecraft:lapis_ore",
- "-minecraft:diamond_block",
- "-minecraft:diamond_ore",
- "-minecraft:emerald_block",
- "-minecraft:emerald_ore",
- "-minecraft:gold_block",
- "-minecraft:gold_ore",
- "-minecraft:redstone_ore",
- "-minecraft:obsidian",
- "-minecraft:crying_obsidian",
- "-minecraft:netherite_block",
- "-minecraft:ancient_debris",
- "-minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:activator_rail",
- "minecraft:coal_ore",
- "minecraft:cobblestone",
- "minecraft:detector_rail",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:powered_rail",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:ice",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:mossy_cobblestone",
- "minecraft:netherrack",
- "minecraft:packed_ice",
- "minecraft:blue_ice",
- "minecraft:rail",
- "minecraft:redstone_ore",
- "minecraft:sandstone",
- "minecraft:chiseled_sandstone",
- "minecraft:cut_sandstone",
- "minecraft:chiseled_red_sandstone",
- "minecraft:cut_red_sandstone",
- "minecraft:red_sandstone",
- "minecraft:stone",
- "minecraft:granite",
- "minecraft:polished_granite",
- "minecraft:diorite",
- "minecraft:polished_diorite",
- "minecraft:andesite",
- "minecraft:polished_andesite",
- "minecraft:stone_slab",
- "minecraft:smooth_stone_slab",
- "minecraft:sandstone_slab",
- "minecraft:petrified_oak_slab",
- "minecraft:cobblestone_slab",
- "minecraft:brick_slab",
- "minecraft:stone_brick_slab",
- "minecraft:nether_brick_slab",
- "minecraft:quartz_slab",
- "minecraft:red_sandstone_slab",
- "minecraft:purpur_slab",
- "minecraft:smooth_quartz",
- "minecraft:smooth_red_sandstone",
- "minecraft:smooth_sandstone",
- "minecraft:smooth_stone",
- "minecraft:stone_button",
- "minecraft:stone_pressure_plate",
- "minecraft:polished_granite_slab",
- "minecraft:smooth_red_sandstone_slab",
- "minecraft:mossy_stone_brick_slab",
- "minecraft:polished_diorite_slab",
- "minecraft:mossy_cobblestone_slab",
- "minecraft:end_stone_brick_slab",
- "minecraft:smooth_sandstone_slab",
- "minecraft:smooth_quartz_slab",
- "minecraft:granite_slab",
- "minecraft:andesite_slab",
- "minecraft:red_nether_brick_slab",
- "minecraft:polished_andesite_slab",
- "minecraft:diorite_slab",
- "minecraft:shulker_box",
- "minecraft:black_shulker_box",
- "minecraft:blue_shulker_box",
- "minecraft:brown_shulker_box",
- "minecraft:cyan_shulker_box",
- "minecraft:gray_shulker_box",
- "minecraft:green_shulker_box",
- "minecraft:light_blue_shulker_box",
- "minecraft:light_gray_shulker_box",
- "minecraft:lime_shulker_box",
- "minecraft:magenta_shulker_box",
- "minecraft:orange_shulker_box",
- "minecraft:pink_shulker_box",
- "minecraft:purple_shulker_box",
- "minecraft:red_shulker_box",
- "minecraft:white_shulker_box",
- "minecraft:yellow_shulker_box"
- ],
- "speed": 2.0
- }
- ]
- },
- {
- "item": "minecraft:stone_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "-minecraft:diamond_block",
- "-minecraft:diamond_ore",
- "-minecraft:emerald_block",
- "-minecraft:emerald_ore",
- "-minecraft:gold_block",
- "-minecraft:gold_ore",
- "-minecraft:redstone_ore",
- "-minecraft:obsidian",
- "-minecraft:crying_obsidian",
- "-minecraft:netherite_block",
- "-minecraft:ancient_debris",
- "-minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:activator_rail",
- "minecraft:coal_ore",
- "minecraft:cobblestone",
- "minecraft:detector_rail",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:powered_rail",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:ice",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:mossy_cobblestone",
- "minecraft:netherrack",
- "minecraft:packed_ice",
- "minecraft:blue_ice",
- "minecraft:rail",
- "minecraft:redstone_ore",
- "minecraft:sandstone",
- "minecraft:chiseled_sandstone",
- "minecraft:cut_sandstone",
- "minecraft:chiseled_red_sandstone",
- "minecraft:cut_red_sandstone",
- "minecraft:red_sandstone",
- "minecraft:stone",
- "minecraft:granite",
- "minecraft:polished_granite",
- "minecraft:diorite",
- "minecraft:polished_diorite",
- "minecraft:andesite",
- "minecraft:polished_andesite",
- "minecraft:stone_slab",
- "minecraft:smooth_stone_slab",
- "minecraft:sandstone_slab",
- "minecraft:petrified_oak_slab",
- "minecraft:cobblestone_slab",
- "minecraft:brick_slab",
- "minecraft:stone_brick_slab",
- "minecraft:nether_brick_slab",
- "minecraft:quartz_slab",
- "minecraft:red_sandstone_slab",
- "minecraft:purpur_slab",
- "minecraft:smooth_quartz",
- "minecraft:smooth_red_sandstone",
- "minecraft:smooth_sandstone",
- "minecraft:smooth_stone",
- "minecraft:stone_button",
- "minecraft:stone_pressure_plate",
- "minecraft:polished_granite_slab",
- "minecraft:smooth_red_sandstone_slab",
- "minecraft:mossy_stone_brick_slab",
- "minecraft:polished_diorite_slab",
- "minecraft:mossy_cobblestone_slab",
- "minecraft:end_stone_brick_slab",
- "minecraft:smooth_sandstone_slab",
- "minecraft:smooth_quartz_slab",
- "minecraft:granite_slab",
- "minecraft:andesite_slab",
- "minecraft:red_nether_brick_slab",
- "minecraft:polished_andesite_slab",
- "minecraft:diorite_slab",
- "minecraft:shulker_box",
- "minecraft:black_shulker_box",
- "minecraft:blue_shulker_box",
- "minecraft:brown_shulker_box",
- "minecraft:cyan_shulker_box",
- "minecraft:gray_shulker_box",
- "minecraft:green_shulker_box",
- "minecraft:light_blue_shulker_box",
- "minecraft:light_gray_shulker_box",
- "minecraft:lime_shulker_box",
- "minecraft:magenta_shulker_box",
- "minecraft:orange_shulker_box",
- "minecraft:pink_shulker_box",
- "minecraft:purple_shulker_box",
- "minecraft:red_shulker_box",
- "minecraft:white_shulker_box",
- "minecraft:yellow_shulker_box"
- ],
- "speed": 4.0
- }
- ]
- },
- {
- "item": "minecraft:iron_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:emerald_block",
- "minecraft:emerald_ore",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:redstone_ore",
- "-minecraft:obsidian",
- "-minecraft:crying_obsidian",
- "-minecraft:netherite_block",
- "-minecraft:ancient_debris",
- "-minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:activator_rail",
- "minecraft:coal_ore",
- "minecraft:cobblestone",
- "minecraft:detector_rail",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:powered_rail",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:ice",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:mossy_cobblestone",
- "minecraft:netherrack",
- "minecraft:packed_ice",
- "minecraft:blue_ice",
- "minecraft:rail",
- "minecraft:redstone_ore",
- "minecraft:sandstone",
- "minecraft:chiseled_sandstone",
- "minecraft:cut_sandstone",
- "minecraft:chiseled_red_sandstone",
- "minecraft:cut_red_sandstone",
- "minecraft:red_sandstone",
- "minecraft:stone",
- "minecraft:granite",
- "minecraft:polished_granite",
- "minecraft:diorite",
- "minecraft:polished_diorite",
- "minecraft:andesite",
- "minecraft:polished_andesite",
- "minecraft:stone_slab",
- "minecraft:smooth_stone_slab",
- "minecraft:sandstone_slab",
- "minecraft:petrified_oak_slab",
- "minecraft:cobblestone_slab",
- "minecraft:brick_slab",
- "minecraft:stone_brick_slab",
- "minecraft:nether_brick_slab",
- "minecraft:quartz_slab",
- "minecraft:red_sandstone_slab",
- "minecraft:purpur_slab",
- "minecraft:smooth_quartz",
- "minecraft:smooth_red_sandstone",
- "minecraft:smooth_sandstone",
- "minecraft:smooth_stone",
- "minecraft:stone_button",
- "minecraft:stone_pressure_plate",
- "minecraft:polished_granite_slab",
- "minecraft:smooth_red_sandstone_slab",
- "minecraft:mossy_stone_brick_slab",
- "minecraft:polished_diorite_slab",
- "minecraft:mossy_cobblestone_slab",
- "minecraft:end_stone_brick_slab",
- "minecraft:smooth_sandstone_slab",
- "minecraft:smooth_quartz_slab",
- "minecraft:granite_slab",
- "minecraft:andesite_slab",
- "minecraft:red_nether_brick_slab",
- "minecraft:polished_andesite_slab",
- "minecraft:diorite_slab",
- "minecraft:shulker_box",
- "minecraft:black_shulker_box",
- "minecraft:blue_shulker_box",
- "minecraft:brown_shulker_box",
- "minecraft:cyan_shulker_box",
- "minecraft:gray_shulker_box",
- "minecraft:green_shulker_box",
- "minecraft:light_blue_shulker_box",
- "minecraft:light_gray_shulker_box",
- "minecraft:lime_shulker_box",
- "minecraft:magenta_shulker_box",
- "minecraft:orange_shulker_box",
- "minecraft:pink_shulker_box",
- "minecraft:purple_shulker_box",
- "minecraft:red_shulker_box",
- "minecraft:white_shulker_box",
- "minecraft:yellow_shulker_box"
- ],
- "speed": 6.0
- }
- ]
- },
- {
- "item": "minecraft:golden_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "-minecraft:iron_block",
- "-minecraft:iron_ore",
- "-minecraft:lapis_block",
- "-minecraft:lapis_ore",
- "-minecraft:diamond_block",
- "-minecraft:diamond_ore",
- "-minecraft:emerald_block",
- "-minecraft:emerald_ore",
- "-minecraft:gold_block",
- "-minecraft:gold_ore",
- "-minecraft:redstone_ore",
- "-minecraft:obsidian",
- "-minecraft:crying_obsidian",
- "-minecraft:netherite_block",
- "-minecraft:ancient_debris",
- "-minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:activator_rail",
- "minecraft:coal_ore",
- "minecraft:cobblestone",
- "minecraft:detector_rail",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:powered_rail",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:ice",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:mossy_cobblestone",
- "minecraft:netherrack",
- "minecraft:packed_ice",
- "minecraft:blue_ice",
- "minecraft:rail",
- "minecraft:redstone_ore",
- "minecraft:sandstone",
- "minecraft:chiseled_sandstone",
- "minecraft:cut_sandstone",
- "minecraft:chiseled_red_sandstone",
- "minecraft:cut_red_sandstone",
- "minecraft:red_sandstone",
- "minecraft:stone",
- "minecraft:granite",
- "minecraft:polished_granite",
- "minecraft:diorite",
- "minecraft:polished_diorite",
- "minecraft:andesite",
- "minecraft:polished_andesite",
- "minecraft:stone_slab",
- "minecraft:smooth_stone_slab",
- "minecraft:sandstone_slab",
- "minecraft:petrified_oak_slab",
- "minecraft:cobblestone_slab",
- "minecraft:brick_slab",
- "minecraft:stone_brick_slab",
- "minecraft:nether_brick_slab",
- "minecraft:quartz_slab",
- "minecraft:red_sandstone_slab",
- "minecraft:purpur_slab",
- "minecraft:smooth_quartz",
- "minecraft:smooth_red_sandstone",
- "minecraft:smooth_sandstone",
- "minecraft:smooth_stone",
- "minecraft:stone_button",
- "minecraft:stone_pressure_plate",
- "minecraft:polished_granite_slab",
- "minecraft:smooth_red_sandstone_slab",
- "minecraft:mossy_stone_brick_slab",
- "minecraft:polished_diorite_slab",
- "minecraft:mossy_cobblestone_slab",
- "minecraft:end_stone_brick_slab",
- "minecraft:smooth_sandstone_slab",
- "minecraft:smooth_quartz_slab",
- "minecraft:granite_slab",
- "minecraft:andesite_slab",
- "minecraft:red_nether_brick_slab",
- "minecraft:polished_andesite_slab",
- "minecraft:diorite_slab",
- "minecraft:shulker_box",
- "minecraft:black_shulker_box",
- "minecraft:blue_shulker_box",
- "minecraft:brown_shulker_box",
- "minecraft:cyan_shulker_box",
- "minecraft:gray_shulker_box",
- "minecraft:green_shulker_box",
- "minecraft:light_blue_shulker_box",
- "minecraft:light_gray_shulker_box",
- "minecraft:lime_shulker_box",
- "minecraft:magenta_shulker_box",
- "minecraft:orange_shulker_box",
- "minecraft:pink_shulker_box",
- "minecraft:purple_shulker_box",
- "minecraft:red_shulker_box",
- "minecraft:white_shulker_box",
- "minecraft:yellow_shulker_box"
- ],
- "speed": 12.0
- }
- ]
- },
- {
- "item": "minecraft:diamond_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:emerald_block",
- "minecraft:emerald_ore",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:redstone_ore",
- "minecraft:obsidian",
- "minecraft:crying_obsidian",
- "minecraft:netherite_block",
- "minecraft:ancient_debris",
- "minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:activator_rail",
- "minecraft:coal_ore",
- "minecraft:cobblestone",
- "minecraft:detector_rail",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:powered_rail",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:ice",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:mossy_cobblestone",
- "minecraft:netherrack",
- "minecraft:packed_ice",
- "minecraft:blue_ice",
- "minecraft:rail",
- "minecraft:redstone_ore",
- "minecraft:sandstone",
- "minecraft:chiseled_sandstone",
- "minecraft:cut_sandstone",
- "minecraft:chiseled_red_sandstone",
- "minecraft:cut_red_sandstone",
- "minecraft:red_sandstone",
- "minecraft:stone",
- "minecraft:granite",
- "minecraft:polished_granite",
- "minecraft:diorite",
- "minecraft:polished_diorite",
- "minecraft:andesite",
- "minecraft:polished_andesite",
- "minecraft:stone_slab",
- "minecraft:smooth_stone_slab",
- "minecraft:sandstone_slab",
- "minecraft:petrified_oak_slab",
- "minecraft:cobblestone_slab",
- "minecraft:brick_slab",
- "minecraft:stone_brick_slab",
- "minecraft:nether_brick_slab",
- "minecraft:quartz_slab",
- "minecraft:red_sandstone_slab",
- "minecraft:purpur_slab",
- "minecraft:smooth_quartz",
- "minecraft:smooth_red_sandstone",
- "minecraft:smooth_sandstone",
- "minecraft:smooth_stone",
- "minecraft:stone_button",
- "minecraft:stone_pressure_plate",
- "minecraft:polished_granite_slab",
- "minecraft:smooth_red_sandstone_slab",
- "minecraft:mossy_stone_brick_slab",
- "minecraft:polished_diorite_slab",
- "minecraft:mossy_cobblestone_slab",
- "minecraft:end_stone_brick_slab",
- "minecraft:smooth_sandstone_slab",
- "minecraft:smooth_quartz_slab",
- "minecraft:granite_slab",
- "minecraft:andesite_slab",
- "minecraft:red_nether_brick_slab",
- "minecraft:polished_andesite_slab",
- "minecraft:diorite_slab",
- "minecraft:shulker_box",
- "minecraft:black_shulker_box",
- "minecraft:blue_shulker_box",
- "minecraft:brown_shulker_box",
- "minecraft:cyan_shulker_box",
- "minecraft:gray_shulker_box",
- "minecraft:green_shulker_box",
- "minecraft:light_blue_shulker_box",
- "minecraft:light_gray_shulker_box",
- "minecraft:lime_shulker_box",
- "minecraft:magenta_shulker_box",
- "minecraft:orange_shulker_box",
- "minecraft:pink_shulker_box",
- "minecraft:purple_shulker_box",
- "minecraft:red_shulker_box",
- "minecraft:white_shulker_box",
- "minecraft:yellow_shulker_box"
- ],
- "speed": 8.0
- }
- ]
- },
- {
- "item": "minecraft:wooden_hoe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": []
- },
- {
- "item": "minecraft:stone_hoe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": []
- },
- {
- "item": "minecraft:iron_hoe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": []
- },
- {
- "item": "minecraft:golden_hoe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": []
- },
- {
- "item": "minecraft:diamond_hoe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": []
- }
- ],
- "1.16.4": [
- {
- "item": "minecraft:wooden_axe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": [
- {
- "blocks": [
- "#wood",
- "#nether_wood",
- "#plant",
- "#replaceable_plant",
- "#bamboo",
- "#gourd",
- "minecraft:ladder",
- "minecraft:scaffolding",
- "minecraft:oak_button",
- "minecraft:spruce_button",
- "minecraft:birch_button",
- "minecraft:jungle_button",
- "minecraft:dark_oak_button",
- "minecraft:acacia_button",
- "minecraft:crimson_button",
- "minecraft:warped_button"
- ],
- "speed": 2.0
- }
- ]
- },
- {
- "item": "minecraft:stone_axe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": [
- {
- "blocks": [
- "#wood",
- "#nether_wood",
- "#plant",
- "#replaceable_plant",
- "#bamboo",
- "#gourd",
- "minecraft:ladder",
- "minecraft:scaffolding",
- "minecraft:oak_button",
- "minecraft:spruce_button",
- "minecraft:birch_button",
- "minecraft:jungle_button",
- "minecraft:dark_oak_button",
- "minecraft:acacia_button",
- "minecraft:crimson_button",
- "minecraft:warped_button"
- ],
- "speed": 4.0
- }
- ]
- },
- {
- "item": "minecraft:iron_axe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": [
- {
- "blocks": [
- "#wood",
- "#nether_wood",
- "#plant",
- "#replaceable_plant",
- "#bamboo",
- "#gourd",
- "minecraft:ladder",
- "minecraft:scaffolding",
- "minecraft:oak_button",
- "minecraft:spruce_button",
- "minecraft:birch_button",
- "minecraft:jungle_button",
- "minecraft:dark_oak_button",
- "minecraft:acacia_button",
- "minecraft:crimson_button",
- "minecraft:warped_button"
- ],
- "speed": 6.0
- }
- ]
- },
- {
- "item": "minecraft:golden_axe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": [
- {
- "blocks": [
- "#wood",
- "#nether_wood",
- "#plant",
- "#replaceable_plant",
- "#bamboo",
- "#gourd",
- "minecraft:ladder",
- "minecraft:scaffolding",
- "minecraft:oak_button",
- "minecraft:spruce_button",
- "minecraft:birch_button",
- "minecraft:jungle_button",
- "minecraft:dark_oak_button",
- "minecraft:acacia_button",
- "minecraft:crimson_button",
- "minecraft:warped_button"
- ],
- "speed": 12.0
- }
- ]
- },
- {
- "item": "minecraft:diamond_axe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": [
- {
- "blocks": [
- "#wood",
- "#nether_wood",
- "#plant",
- "#replaceable_plant",
- "#bamboo",
- "#gourd",
- "minecraft:ladder",
- "minecraft:scaffolding",
- "minecraft:oak_button",
- "minecraft:spruce_button",
- "minecraft:birch_button",
- "minecraft:jungle_button",
- "minecraft:dark_oak_button",
- "minecraft:acacia_button",
- "minecraft:crimson_button",
- "minecraft:warped_button"
- ],
- "speed": 8.0
- }
- ]
- },
- {
- "item": "minecraft:netherite_axe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": [
- {
- "blocks": [
- "#wood",
- "#nether_wood",
- "#plant",
- "#replaceable_plant",
- "#bamboo",
- "#gourd",
- "minecraft:ladder",
- "minecraft:scaffolding",
- "minecraft:oak_button",
- "minecraft:spruce_button",
- "minecraft:birch_button",
- "minecraft:jungle_button",
- "minecraft:dark_oak_button",
- "minecraft:acacia_button",
- "minecraft:crimson_button",
- "minecraft:warped_button"
- ],
- "speed": 9.0
- }
- ]
- },
- {
- "item": "minecraft:wooden_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "-minecraft:iron_block",
- "-minecraft:iron_ore",
- "-minecraft:lapis_block",
- "-minecraft:lapis_ore",
- "-minecraft:diamond_block",
- "-minecraft:diamond_ore",
- "-minecraft:emerald_block",
- "-minecraft:emerald_ore",
- "-minecraft:gold_block",
- "-minecraft:gold_ore",
- "-minecraft:redstone_ore",
- "-minecraft:obsidian",
- "-minecraft:crying_obsidian",
- "-minecraft:netherite_block",
- "-minecraft:ancient_debris",
- "-minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:activator_rail",
- "minecraft:coal_ore",
- "minecraft:cobblestone",
- "minecraft:detector_rail",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:powered_rail",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:nether_gold_ore",
- "minecraft:ice",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:mossy_cobblestone",
- "minecraft:netherrack",
- "minecraft:packed_ice",
- "minecraft:blue_ice",
- "minecraft:rail",
- "minecraft:redstone_ore",
- "minecraft:sandstone",
- "minecraft:chiseled_sandstone",
- "minecraft:cut_sandstone",
- "minecraft:chiseled_red_sandstone",
- "minecraft:cut_red_sandstone",
- "minecraft:red_sandstone",
- "minecraft:stone",
- "minecraft:granite",
- "minecraft:polished_granite",
- "minecraft:diorite",
- "minecraft:polished_diorite",
- "minecraft:andesite",
- "minecraft:polished_andesite",
- "minecraft:stone_slab",
- "minecraft:smooth_stone_slab",
- "minecraft:sandstone_slab",
- "minecraft:petrified_oak_slab",
- "minecraft:cobblestone_slab",
- "minecraft:brick_slab",
- "minecraft:stone_brick_slab",
- "minecraft:nether_brick_slab",
- "minecraft:quartz_slab",
- "minecraft:red_sandstone_slab",
- "minecraft:purpur_slab",
- "minecraft:smooth_quartz",
- "minecraft:smooth_red_sandstone",
- "minecraft:smooth_sandstone",
- "minecraft:smooth_stone",
- "minecraft:stone_button",
- "minecraft:stone_pressure_plate",
- "minecraft:polished_granite_slab",
- "minecraft:smooth_red_sandstone_slab",
- "minecraft:mossy_stone_brick_slab",
- "minecraft:polished_diorite_slab",
- "minecraft:mossy_cobblestone_slab",
- "minecraft:end_stone_brick_slab",
- "minecraft:smooth_sandstone_slab",
- "minecraft:smooth_quartz_slab",
- "minecraft:granite_slab",
- "minecraft:andesite_slab",
- "minecraft:red_nether_brick_slab",
- "minecraft:polished_andesite_slab",
- "minecraft:diorite_slab",
- "minecraft:shulker_box",
- "minecraft:black_shulker_box",
- "minecraft:blue_shulker_box",
- "minecraft:brown_shulker_box",
- "minecraft:cyan_shulker_box",
- "minecraft:gray_shulker_box",
- "minecraft:green_shulker_box",
- "minecraft:light_blue_shulker_box",
- "minecraft:light_gray_shulker_box",
- "minecraft:lime_shulker_box",
- "minecraft:magenta_shulker_box",
- "minecraft:orange_shulker_box",
- "minecraft:pink_shulker_box",
- "minecraft:purple_shulker_box",
- "minecraft:red_shulker_box",
- "minecraft:white_shulker_box",
- "minecraft:yellow_shulker_box",
- "minecraft:piston",
- "minecraft:sticky_piston",
- "minecraft:piston_head"
- ],
- "speed": 2.0
- }
- ]
- },
- {
- "item": "minecraft:stone_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "-minecraft:diamond_block",
- "-minecraft:diamond_ore",
- "-minecraft:emerald_block",
- "-minecraft:emerald_ore",
- "-minecraft:gold_block",
- "-minecraft:gold_ore",
- "-minecraft:redstone_ore",
- "-minecraft:obsidian",
- "-minecraft:crying_obsidian",
- "-minecraft:netherite_block",
- "-minecraft:ancient_debris",
- "-minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:activator_rail",
- "minecraft:coal_ore",
- "minecraft:cobblestone",
- "minecraft:detector_rail",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:powered_rail",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:nether_gold_ore",
- "minecraft:ice",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:mossy_cobblestone",
- "minecraft:netherrack",
- "minecraft:packed_ice",
- "minecraft:blue_ice",
- "minecraft:rail",
- "minecraft:redstone_ore",
- "minecraft:sandstone",
- "minecraft:chiseled_sandstone",
- "minecraft:cut_sandstone",
- "minecraft:chiseled_red_sandstone",
- "minecraft:cut_red_sandstone",
- "minecraft:red_sandstone",
- "minecraft:stone",
- "minecraft:granite",
- "minecraft:polished_granite",
- "minecraft:diorite",
- "minecraft:polished_diorite",
- "minecraft:andesite",
- "minecraft:polished_andesite",
- "minecraft:stone_slab",
- "minecraft:smooth_stone_slab",
- "minecraft:sandstone_slab",
- "minecraft:petrified_oak_slab",
- "minecraft:cobblestone_slab",
- "minecraft:brick_slab",
- "minecraft:stone_brick_slab",
- "minecraft:nether_brick_slab",
- "minecraft:quartz_slab",
- "minecraft:red_sandstone_slab",
- "minecraft:purpur_slab",
- "minecraft:smooth_quartz",
- "minecraft:smooth_red_sandstone",
- "minecraft:smooth_sandstone",
- "minecraft:smooth_stone",
- "minecraft:stone_button",
- "minecraft:stone_pressure_plate",
- "minecraft:polished_granite_slab",
- "minecraft:smooth_red_sandstone_slab",
- "minecraft:mossy_stone_brick_slab",
- "minecraft:polished_diorite_slab",
- "minecraft:mossy_cobblestone_slab",
- "minecraft:end_stone_brick_slab",
- "minecraft:smooth_sandstone_slab",
- "minecraft:smooth_quartz_slab",
- "minecraft:granite_slab",
- "minecraft:andesite_slab",
- "minecraft:red_nether_brick_slab",
- "minecraft:polished_andesite_slab",
- "minecraft:diorite_slab",
- "minecraft:shulker_box",
- "minecraft:black_shulker_box",
- "minecraft:blue_shulker_box",
- "minecraft:brown_shulker_box",
- "minecraft:cyan_shulker_box",
- "minecraft:gray_shulker_box",
- "minecraft:green_shulker_box",
- "minecraft:light_blue_shulker_box",
- "minecraft:light_gray_shulker_box",
- "minecraft:lime_shulker_box",
- "minecraft:magenta_shulker_box",
- "minecraft:orange_shulker_box",
- "minecraft:pink_shulker_box",
- "minecraft:purple_shulker_box",
- "minecraft:red_shulker_box",
- "minecraft:white_shulker_box",
- "minecraft:yellow_shulker_box",
- "minecraft:piston",
- "minecraft:sticky_piston",
- "minecraft:piston_head"
- ],
- "speed": 4.0
- }
- ]
- },
- {
- "item": "minecraft:iron_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:emerald_block",
- "minecraft:emerald_ore",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:redstone_ore",
- "-minecraft:obsidian",
- "-minecraft:crying_obsidian",
- "-minecraft:netherite_block",
- "-minecraft:ancient_debris",
- "-minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:activator_rail",
- "minecraft:coal_ore",
- "minecraft:cobblestone",
- "minecraft:detector_rail",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:powered_rail",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:nether_gold_ore",
- "minecraft:ice",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:mossy_cobblestone",
- "minecraft:netherrack",
- "minecraft:packed_ice",
- "minecraft:blue_ice",
- "minecraft:rail",
- "minecraft:redstone_ore",
- "minecraft:sandstone",
- "minecraft:chiseled_sandstone",
- "minecraft:cut_sandstone",
- "minecraft:chiseled_red_sandstone",
- "minecraft:cut_red_sandstone",
- "minecraft:red_sandstone",
- "minecraft:stone",
- "minecraft:granite",
- "minecraft:polished_granite",
- "minecraft:diorite",
- "minecraft:polished_diorite",
- "minecraft:andesite",
- "minecraft:polished_andesite",
- "minecraft:stone_slab",
- "minecraft:smooth_stone_slab",
- "minecraft:sandstone_slab",
- "minecraft:petrified_oak_slab",
- "minecraft:cobblestone_slab",
- "minecraft:brick_slab",
- "minecraft:stone_brick_slab",
- "minecraft:nether_brick_slab",
- "minecraft:quartz_slab",
- "minecraft:red_sandstone_slab",
- "minecraft:purpur_slab",
- "minecraft:smooth_quartz",
- "minecraft:smooth_red_sandstone",
- "minecraft:smooth_sandstone",
- "minecraft:smooth_stone",
- "minecraft:stone_button",
- "minecraft:stone_pressure_plate",
- "minecraft:polished_granite_slab",
- "minecraft:smooth_red_sandstone_slab",
- "minecraft:mossy_stone_brick_slab",
- "minecraft:polished_diorite_slab",
- "minecraft:mossy_cobblestone_slab",
- "minecraft:end_stone_brick_slab",
- "minecraft:smooth_sandstone_slab",
- "minecraft:smooth_quartz_slab",
- "minecraft:granite_slab",
- "minecraft:andesite_slab",
- "minecraft:red_nether_brick_slab",
- "minecraft:polished_andesite_slab",
- "minecraft:diorite_slab",
- "minecraft:shulker_box",
- "minecraft:black_shulker_box",
- "minecraft:blue_shulker_box",
- "minecraft:brown_shulker_box",
- "minecraft:cyan_shulker_box",
- "minecraft:gray_shulker_box",
- "minecraft:green_shulker_box",
- "minecraft:light_blue_shulker_box",
- "minecraft:light_gray_shulker_box",
- "minecraft:lime_shulker_box",
- "minecraft:magenta_shulker_box",
- "minecraft:orange_shulker_box",
- "minecraft:pink_shulker_box",
- "minecraft:purple_shulker_box",
- "minecraft:red_shulker_box",
- "minecraft:white_shulker_box",
- "minecraft:yellow_shulker_box",
- "minecraft:piston",
- "minecraft:sticky_piston",
- "minecraft:piston_head"
- ],
- "speed": 6.0
- }
- ]
- },
- {
- "item": "minecraft:golden_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "-minecraft:iron_block",
- "-minecraft:iron_ore",
- "-minecraft:lapis_block",
- "-minecraft:lapis_ore",
- "-minecraft:diamond_block",
- "-minecraft:diamond_ore",
- "-minecraft:emerald_block",
- "-minecraft:emerald_ore",
- "-minecraft:gold_block",
- "-minecraft:gold_ore",
- "-minecraft:redstone_ore",
- "-minecraft:obsidian",
- "-minecraft:crying_obsidian",
- "-minecraft:netherite_block",
- "-minecraft:ancient_debris",
- "-minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:activator_rail",
- "minecraft:coal_ore",
- "minecraft:cobblestone",
- "minecraft:detector_rail",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:powered_rail",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:nether_gold_ore",
- "minecraft:ice",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:mossy_cobblestone",
- "minecraft:netherrack",
- "minecraft:packed_ice",
- "minecraft:blue_ice",
- "minecraft:rail",
- "minecraft:redstone_ore",
- "minecraft:sandstone",
- "minecraft:chiseled_sandstone",
- "minecraft:cut_sandstone",
- "minecraft:chiseled_red_sandstone",
- "minecraft:cut_red_sandstone",
- "minecraft:red_sandstone",
- "minecraft:stone",
- "minecraft:granite",
- "minecraft:polished_granite",
- "minecraft:diorite",
- "minecraft:polished_diorite",
- "minecraft:andesite",
- "minecraft:polished_andesite",
- "minecraft:stone_slab",
- "minecraft:smooth_stone_slab",
- "minecraft:sandstone_slab",
- "minecraft:petrified_oak_slab",
- "minecraft:cobblestone_slab",
- "minecraft:brick_slab",
- "minecraft:stone_brick_slab",
- "minecraft:nether_brick_slab",
- "minecraft:quartz_slab",
- "minecraft:red_sandstone_slab",
- "minecraft:purpur_slab",
- "minecraft:smooth_quartz",
- "minecraft:smooth_red_sandstone",
- "minecraft:smooth_sandstone",
- "minecraft:smooth_stone",
- "minecraft:stone_button",
- "minecraft:stone_pressure_plate",
- "minecraft:polished_granite_slab",
- "minecraft:smooth_red_sandstone_slab",
- "minecraft:mossy_stone_brick_slab",
- "minecraft:polished_diorite_slab",
- "minecraft:mossy_cobblestone_slab",
- "minecraft:end_stone_brick_slab",
- "minecraft:smooth_sandstone_slab",
- "minecraft:smooth_quartz_slab",
- "minecraft:granite_slab",
- "minecraft:andesite_slab",
- "minecraft:red_nether_brick_slab",
- "minecraft:polished_andesite_slab",
- "minecraft:diorite_slab",
- "minecraft:shulker_box",
- "minecraft:black_shulker_box",
- "minecraft:blue_shulker_box",
- "minecraft:brown_shulker_box",
- "minecraft:cyan_shulker_box",
- "minecraft:gray_shulker_box",
- "minecraft:green_shulker_box",
- "minecraft:light_blue_shulker_box",
- "minecraft:light_gray_shulker_box",
- "minecraft:lime_shulker_box",
- "minecraft:magenta_shulker_box",
- "minecraft:orange_shulker_box",
- "minecraft:pink_shulker_box",
- "minecraft:purple_shulker_box",
- "minecraft:red_shulker_box",
- "minecraft:white_shulker_box",
- "minecraft:yellow_shulker_box",
- "minecraft:piston",
- "minecraft:sticky_piston",
- "minecraft:piston_head"
- ],
- "speed": 12.0
- }
- ]
- },
- {
- "item": "minecraft:diamond_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:emerald_block",
- "minecraft:emerald_ore",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:redstone_ore",
- "minecraft:obsidian",
- "minecraft:crying_obsidian",
- "minecraft:netherite_block",
- "minecraft:ancient_debris",
- "minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:activator_rail",
- "minecraft:coal_ore",
- "minecraft:cobblestone",
- "minecraft:detector_rail",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:powered_rail",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:nether_gold_ore",
- "minecraft:ice",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:mossy_cobblestone",
- "minecraft:netherrack",
- "minecraft:packed_ice",
- "minecraft:blue_ice",
- "minecraft:rail",
- "minecraft:redstone_ore",
- "minecraft:sandstone",
- "minecraft:chiseled_sandstone",
- "minecraft:cut_sandstone",
- "minecraft:chiseled_red_sandstone",
- "minecraft:cut_red_sandstone",
- "minecraft:red_sandstone",
- "minecraft:stone",
- "minecraft:granite",
- "minecraft:polished_granite",
- "minecraft:diorite",
- "minecraft:polished_diorite",
- "minecraft:andesite",
- "minecraft:polished_andesite",
- "minecraft:stone_slab",
- "minecraft:smooth_stone_slab",
- "minecraft:sandstone_slab",
- "minecraft:petrified_oak_slab",
- "minecraft:cobblestone_slab",
- "minecraft:brick_slab",
- "minecraft:stone_brick_slab",
- "minecraft:nether_brick_slab",
- "minecraft:quartz_slab",
- "minecraft:red_sandstone_slab",
- "minecraft:purpur_slab",
- "minecraft:smooth_quartz",
- "minecraft:smooth_red_sandstone",
- "minecraft:smooth_sandstone",
- "minecraft:smooth_stone",
- "minecraft:stone_button",
- "minecraft:stone_pressure_plate",
- "minecraft:polished_granite_slab",
- "minecraft:smooth_red_sandstone_slab",
- "minecraft:mossy_stone_brick_slab",
- "minecraft:polished_diorite_slab",
- "minecraft:mossy_cobblestone_slab",
- "minecraft:end_stone_brick_slab",
- "minecraft:smooth_sandstone_slab",
- "minecraft:smooth_quartz_slab",
- "minecraft:granite_slab",
- "minecraft:andesite_slab",
- "minecraft:red_nether_brick_slab",
- "minecraft:polished_andesite_slab",
- "minecraft:diorite_slab",
- "minecraft:shulker_box",
- "minecraft:black_shulker_box",
- "minecraft:blue_shulker_box",
- "minecraft:brown_shulker_box",
- "minecraft:cyan_shulker_box",
- "minecraft:gray_shulker_box",
- "minecraft:green_shulker_box",
- "minecraft:light_blue_shulker_box",
- "minecraft:light_gray_shulker_box",
- "minecraft:lime_shulker_box",
- "minecraft:magenta_shulker_box",
- "minecraft:orange_shulker_box",
- "minecraft:pink_shulker_box",
- "minecraft:purple_shulker_box",
- "minecraft:red_shulker_box",
- "minecraft:white_shulker_box",
- "minecraft:yellow_shulker_box",
- "minecraft:piston",
- "minecraft:sticky_piston",
- "minecraft:piston_head"
- ],
- "speed": 8.0
- }
- ]
- },
- {
- "item": "minecraft:netherite_pickaxe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:nether_gold_ore",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:emerald_block",
- "minecraft:emerald_ore",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:redstone_ore",
- "minecraft:obsidian",
- "minecraft:crying_obsidian",
- "minecraft:netherite_block",
- "minecraft:ancient_debris",
- "minecraft:respawn_anchor"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "#stone",
- "#metal",
- "#repair_station",
- "minecraft:activator_rail",
- "minecraft:coal_ore",
- "minecraft:cobblestone",
- "minecraft:detector_rail",
- "minecraft:diamond_block",
- "minecraft:diamond_ore",
- "minecraft:powered_rail",
- "minecraft:gold_block",
- "minecraft:gold_ore",
- "minecraft:nether_gold_ore",
- "minecraft:ice",
- "minecraft:iron_block",
- "minecraft:iron_ore",
- "minecraft:lapis_block",
- "minecraft:lapis_ore",
- "minecraft:mossy_cobblestone",
- "minecraft:netherrack",
- "minecraft:packed_ice",
- "minecraft:blue_ice",
- "minecraft:rail",
- "minecraft:redstone_ore",
- "minecraft:sandstone",
- "minecraft:chiseled_sandstone",
- "minecraft:cut_sandstone",
- "minecraft:chiseled_red_sandstone",
- "minecraft:cut_red_sandstone",
- "minecraft:red_sandstone",
- "minecraft:stone",
- "minecraft:granite",
- "minecraft:polished_granite",
- "minecraft:diorite",
- "minecraft:polished_diorite",
- "minecraft:andesite",
- "minecraft:polished_andesite",
- "minecraft:stone_slab",
- "minecraft:smooth_stone_slab",
- "minecraft:sandstone_slab",
- "minecraft:petrified_oak_slab",
- "minecraft:cobblestone_slab",
- "minecraft:brick_slab",
- "minecraft:stone_brick_slab",
- "minecraft:nether_brick_slab",
- "minecraft:quartz_slab",
- "minecraft:red_sandstone_slab",
- "minecraft:purpur_slab",
- "minecraft:smooth_quartz",
- "minecraft:smooth_red_sandstone",
- "minecraft:smooth_sandstone",
- "minecraft:smooth_stone",
- "minecraft:stone_button",
- "minecraft:stone_pressure_plate",
- "minecraft:polished_granite_slab",
- "minecraft:smooth_red_sandstone_slab",
- "minecraft:mossy_stone_brick_slab",
- "minecraft:polished_diorite_slab",
- "minecraft:mossy_cobblestone_slab",
- "minecraft:end_stone_brick_slab",
- "minecraft:smooth_sandstone_slab",
- "minecraft:smooth_quartz_slab",
- "minecraft:granite_slab",
- "minecraft:andesite_slab",
- "minecraft:red_nether_brick_slab",
- "minecraft:polished_andesite_slab",
- "minecraft:diorite_slab",
- "minecraft:shulker_box",
- "minecraft:black_shulker_box",
- "minecraft:blue_shulker_box",
- "minecraft:brown_shulker_box",
- "minecraft:cyan_shulker_box",
- "minecraft:gray_shulker_box",
- "minecraft:green_shulker_box",
- "minecraft:light_blue_shulker_box",
- "minecraft:light_gray_shulker_box",
- "minecraft:lime_shulker_box",
- "minecraft:magenta_shulker_box",
- "minecraft:orange_shulker_box",
- "minecraft:pink_shulker_box",
- "minecraft:purple_shulker_box",
- "minecraft:red_shulker_box",
- "minecraft:white_shulker_box",
- "minecraft:yellow_shulker_box",
- "minecraft:piston",
- "minecraft:sticky_piston",
- "minecraft:piston_head"
- ],
- "speed": 9.0
- }
- ]
- },
- {
- "item": "minecraft:wooden_hoe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:sponge",
- "minecraft:birch_leaves",
- "minecraft:acacia_leaves",
- "minecraft:dried_kelp_block",
- "minecraft:target",
- "minecraft:wet_sponge",
- "minecraft:shroomlight",
- "minecraft:jungle_leaves",
- "minecraft:hay_block",
- "minecraft:oak_leaves",
- "minecraft:warped_wart_block",
- "minecraft:dark_oak_leaves",
- "minecraft:spruce_leaves",
- "minecraft:nether_wart_block"
- ],
- "speed": 2.0
- }
- ]
- },
- {
- "item": "minecraft:stone_hoe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:sponge",
- "minecraft:birch_leaves",
- "minecraft:acacia_leaves",
- "minecraft:dried_kelp_block",
- "minecraft:target",
- "minecraft:wet_sponge",
- "minecraft:shroomlight",
- "minecraft:jungle_leaves",
- "minecraft:hay_block",
- "minecraft:oak_leaves",
- "minecraft:warped_wart_block",
- "minecraft:dark_oak_leaves",
- "minecraft:spruce_leaves",
- "minecraft:nether_wart_block"
- ],
- "speed": 4.0
- }
- ]
- },
- {
- "item": "minecraft:iron_hoe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:sponge",
- "minecraft:birch_leaves",
- "minecraft:acacia_leaves",
- "minecraft:dried_kelp_block",
- "minecraft:target",
- "minecraft:wet_sponge",
- "minecraft:shroomlight",
- "minecraft:jungle_leaves",
- "minecraft:hay_block",
- "minecraft:oak_leaves",
- "minecraft:warped_wart_block",
- "minecraft:dark_oak_leaves",
- "minecraft:spruce_leaves",
- "minecraft:nether_wart_block"
- ],
- "speed": 6.0
- }
- ]
- },
- {
- "item": "minecraft:golden_hoe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:sponge",
- "minecraft:birch_leaves",
- "minecraft:acacia_leaves",
- "minecraft:dried_kelp_block",
- "minecraft:target",
- "minecraft:wet_sponge",
- "minecraft:shroomlight",
- "minecraft:jungle_leaves",
- "minecraft:hay_block",
- "minecraft:oak_leaves",
- "minecraft:warped_wart_block",
- "minecraft:dark_oak_leaves",
- "minecraft:spruce_leaves",
- "minecraft:nether_wart_block"
- ],
- "speed": 12.0
- }
- ]
- },
- {
- "item": "minecraft:diamond_hoe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:sponge",
- "minecraft:birch_leaves",
- "minecraft:acacia_leaves",
- "minecraft:dried_kelp_block",
- "minecraft:target",
- "minecraft:wet_sponge",
- "minecraft:shroomlight",
- "minecraft:jungle_leaves",
- "minecraft:hay_block",
- "minecraft:oak_leaves",
- "minecraft:warped_wart_block",
- "minecraft:dark_oak_leaves",
- "minecraft:spruce_leaves",
- "minecraft:nether_wart_block"
- ],
- "speed": 8.0
- }
- ]
- },
- {
- "item": "minecraft:netherite_hoe",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:sponge",
- "minecraft:birch_leaves",
- "minecraft:acacia_leaves",
- "minecraft:dried_kelp_block",
- "minecraft:target",
- "minecraft:wet_sponge",
- "minecraft:shroomlight",
- "minecraft:jungle_leaves",
- "minecraft:hay_block",
- "minecraft:oak_leaves",
- "minecraft:warped_wart_block",
- "minecraft:dark_oak_leaves",
- "minecraft:spruce_leaves",
- "minecraft:nether_wart_block"
- ],
- "speed": 9.0
- }
- ]
- },
- {
- "item": "minecraft:wooden_shovel",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "minecraft:snow",
- "minecraft:snow_block"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:grass_block",
- "minecraft:blue_concrete_powder",
- "minecraft:white_concrete_powder",
- "minecraft:brown_concrete_powder",
- "minecraft:orange_concrete_powder",
- "minecraft:green_concrete_powder",
- "minecraft:magenta_concrete_powder",
- "minecraft:farmland",
- "minecraft:snow_block",
- "minecraft:soul_soil",
- "minecraft:gray_concrete_powder",
- "minecraft:podzol",
- "minecraft:dirt_path",
- "minecraft:light_blue_concrete_powder",
- "minecraft:light_gray_concrete_powder",
- "minecraft:mycelium",
- "minecraft:red_sand",
- "minecraft:soul_sand",
- "minecraft:clay",
- "minecraft:yellow_concrete_powder",
- "minecraft:cyan_concrete_powder",
- "minecraft:sand",
- "minecraft:snow",
- "minecraft:gravel",
- "minecraft:lime_concrete_powder",
- "minecraft:coarse_dirt",
- "minecraft:red_concrete_powder",
- "minecraft:black_concrete_powder",
- "minecraft:dirt",
- "minecraft:purple_concrete_powder",
- "minecraft:pink_concrete_powder"
- ],
- "speed": 2.0
- }
- ]
- },
- {
- "item": "minecraft:stone_shovel",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "minecraft:snow",
- "minecraft:snow_block"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:grass_block",
- "minecraft:blue_concrete_powder",
- "minecraft:white_concrete_powder",
- "minecraft:brown_concrete_powder",
- "minecraft:orange_concrete_powder",
- "minecraft:green_concrete_powder",
- "minecraft:magenta_concrete_powder",
- "minecraft:farmland",
- "minecraft:snow_block",
- "minecraft:soul_soil",
- "minecraft:gray_concrete_powder",
- "minecraft:podzol",
- "minecraft:dirt_path",
- "minecraft:light_blue_concrete_powder",
- "minecraft:light_gray_concrete_powder",
- "minecraft:mycelium",
- "minecraft:red_sand",
- "minecraft:soul_sand",
- "minecraft:clay",
- "minecraft:yellow_concrete_powder",
- "minecraft:cyan_concrete_powder",
- "minecraft:sand",
- "minecraft:snow",
- "minecraft:gravel",
- "minecraft:lime_concrete_powder",
- "minecraft:coarse_dirt",
- "minecraft:red_concrete_powder",
- "minecraft:black_concrete_powder",
- "minecraft:dirt",
- "minecraft:purple_concrete_powder",
- "minecraft:pink_concrete_powder"
- ],
- "speed": 4.0
- }
- ]
- },
- {
- "item": "minecraft:iron_shovel",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "minecraft:snow",
- "minecraft:snow_block"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:grass_block",
- "minecraft:blue_concrete_powder",
- "minecraft:white_concrete_powder",
- "minecraft:brown_concrete_powder",
- "minecraft:orange_concrete_powder",
- "minecraft:green_concrete_powder",
- "minecraft:magenta_concrete_powder",
- "minecraft:farmland",
- "minecraft:snow_block",
- "minecraft:soul_soil",
- "minecraft:gray_concrete_powder",
- "minecraft:podzol",
- "minecraft:dirt_path",
- "minecraft:light_blue_concrete_powder",
- "minecraft:light_gray_concrete_powder",
- "minecraft:mycelium",
- "minecraft:red_sand",
- "minecraft:soul_sand",
- "minecraft:clay",
- "minecraft:yellow_concrete_powder",
- "minecraft:cyan_concrete_powder",
- "minecraft:sand",
- "minecraft:snow",
- "minecraft:gravel",
- "minecraft:lime_concrete_powder",
- "minecraft:coarse_dirt",
- "minecraft:red_concrete_powder",
- "minecraft:black_concrete_powder",
- "minecraft:dirt",
- "minecraft:purple_concrete_powder",
- "minecraft:pink_concrete_powder"
- ],
- "speed": 6.0
- }
- ]
- },
- {
- "item": "minecraft:golden_shovel",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "minecraft:snow",
- "minecraft:snow_block"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:grass_block",
- "minecraft:blue_concrete_powder",
- "minecraft:white_concrete_powder",
- "minecraft:brown_concrete_powder",
- "minecraft:orange_concrete_powder",
- "minecraft:green_concrete_powder",
- "minecraft:magenta_concrete_powder",
- "minecraft:farmland",
- "minecraft:snow_block",
- "minecraft:soul_soil",
- "minecraft:gray_concrete_powder",
- "minecraft:podzol",
- "minecraft:dirt_path",
- "minecraft:light_blue_concrete_powder",
- "minecraft:light_gray_concrete_powder",
- "minecraft:mycelium",
- "minecraft:red_sand",
- "minecraft:soul_sand",
- "minecraft:clay",
- "minecraft:yellow_concrete_powder",
- "minecraft:cyan_concrete_powder",
- "minecraft:sand",
- "minecraft:snow",
- "minecraft:gravel",
- "minecraft:lime_concrete_powder",
- "minecraft:coarse_dirt",
- "minecraft:red_concrete_powder",
- "minecraft:black_concrete_powder",
- "minecraft:dirt",
- "minecraft:purple_concrete_powder",
- "minecraft:pink_concrete_powder"
- ],
- "speed": 12.0
- }
- ]
- },
- {
- "item": "minecraft:diamond_shovel",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "minecraft:snow",
- "minecraft:snow_block"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:grass_block",
- "minecraft:blue_concrete_powder",
- "minecraft:white_concrete_powder",
- "minecraft:brown_concrete_powder",
- "minecraft:orange_concrete_powder",
- "minecraft:green_concrete_powder",
- "minecraft:magenta_concrete_powder",
- "minecraft:farmland",
- "minecraft:snow_block",
- "minecraft:soul_soil",
- "minecraft:gray_concrete_powder",
- "minecraft:podzol",
- "minecraft:dirt_path",
- "minecraft:light_blue_concrete_powder",
- "minecraft:light_gray_concrete_powder",
- "minecraft:mycelium",
- "minecraft:red_sand",
- "minecraft:soul_sand",
- "minecraft:clay",
- "minecraft:yellow_concrete_powder",
- "minecraft:cyan_concrete_powder",
- "minecraft:sand",
- "minecraft:snow",
- "minecraft:gravel",
- "minecraft:lime_concrete_powder",
- "minecraft:coarse_dirt",
- "minecraft:red_concrete_powder",
- "minecraft:black_concrete_powder",
- "minecraft:dirt",
- "minecraft:purple_concrete_powder",
- "minecraft:pink_concrete_powder"
- ],
- "speed": 8.0
- }
- ]
- },
- {
- "item": "minecraft:netherite_shovel",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "minecraft:snow",
- "minecraft:snow_block"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:grass_block",
- "minecraft:blue_concrete_powder",
- "minecraft:white_concrete_powder",
- "minecraft:brown_concrete_powder",
- "minecraft:orange_concrete_powder",
- "minecraft:green_concrete_powder",
- "minecraft:magenta_concrete_powder",
- "minecraft:farmland",
- "minecraft:snow_block",
- "minecraft:soul_soil",
- "minecraft:gray_concrete_powder",
- "minecraft:podzol",
- "minecraft:dirt_path",
- "minecraft:light_blue_concrete_powder",
- "minecraft:light_gray_concrete_powder",
- "minecraft:mycelium",
- "minecraft:red_sand",
- "minecraft:soul_sand",
- "minecraft:clay",
- "minecraft:yellow_concrete_powder",
- "minecraft:cyan_concrete_powder",
- "minecraft:sand",
- "minecraft:snow",
- "minecraft:gravel",
- "minecraft:lime_concrete_powder",
- "minecraft:coarse_dirt",
- "minecraft:red_concrete_powder",
- "minecraft:black_concrete_powder",
- "minecraft:dirt",
- "minecraft:purple_concrete_powder",
- "minecraft:pink_concrete_powder"
- ],
- "speed": 9.0
- }
- ]
- },
- {
- "item": "minecraft:shears",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "minecraft:redstone_wire",
- "minecraft:tripwire",
- "minecraft:cobweb"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:white_wool",
- "minecraft:pink_wool",
- "minecraft:yellow_wool",
- "minecraft:brown_wool",
- "minecraft:blue_wool",
- "minecraft:magenta_wool",
- "minecraft:lime_wool",
- "minecraft:gray_wool",
- "minecraft:light_gray_wool",
- "minecraft:green_wool",
- "minecraft:light_blue_wool",
- "minecraft:purple_wool",
- "minecraft:orange_wool",
- "minecraft:red_wool",
- "minecraft:black_wool",
- "minecraft:cyan_wool"
- ],
- "speed": 5.0
- },
- {
- "blocks": [
- "minecraft:jungle_leaves",
- "minecraft:birch_leaves",
- "minecraft:acacia_leaves",
- "minecraft:oak_leaves",
- "minecraft:cobweb",
- "minecraft:dark_oak_leaves",
- "minecraft:spruce_leaves"
- ],
- "speed": 15.0
- }
- ]
- }
- ],
- "1.20.4": [
- {
- "item": "minecraft:shears",
- "default_mining_speed": 1.0,
- "damage_per_block": 1,
- "suitable_for": [
- "minecraft:redstone_wire",
- "minecraft:tripwire",
- "minecraft:cobweb"
- ],
- "mining_speeds": [
- {
- "blocks": [
- "minecraft:vine",
- "minecraft:glow_lichen"
- ],
- "speed": 2.0
- },
- {
- "blocks": [
- "minecraft:white_wool",
- "minecraft:pink_wool",
- "minecraft:yellow_wool",
- "minecraft:brown_wool",
- "minecraft:blue_wool",
- "minecraft:magenta_wool",
- "minecraft:lime_wool",
- "minecraft:gray_wool",
- "minecraft:light_gray_wool",
- "minecraft:green_wool",
- "minecraft:light_blue_wool",
- "minecraft:purple_wool",
- "minecraft:orange_wool",
- "minecraft:red_wool",
- "minecraft:black_wool",
- "minecraft:cyan_wool"
- ],
- "speed": 5.0
- },
- {
- "blocks": [
- "minecraft:jungle_leaves",
- "minecraft:flowering_azalea_leaves",
- "minecraft:mangrove_leaves",
- "minecraft:birch_leaves",
- "minecraft:cherry_leaves",
- "minecraft:azalea_leaves",
- "minecraft:acacia_leaves",
- "minecraft:oak_leaves",
- "minecraft:cobweb",
- "minecraft:dark_oak_leaves",
- "minecraft:spruce_leaves"
- ],
- "speed": 15.0
- }
- ]
- }
- ]
-}
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/data/materials-1.19.4.json b/ViaProxy/src/main/resources/assets/viaproxy/data/materials-1.19.4.json
deleted file mode 100644
index eecd775..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/data/materials-1.19.4.json
+++ /dev/null
@@ -1,3417 +0,0 @@
-{
- "materials": {
- "air": {
- "blocksMovement": false,
- "burnable": false,
- "liquid": false,
- "blocksLight": false,
- "replaceable": true,
- "solid": false
- },
- "structure_void": {
- "blocksMovement": false,
- "burnable": false,
- "liquid": false,
- "blocksLight": false,
- "replaceable": true,
- "solid": false
- },
- "portal": {
- "blocksMovement": false,
- "burnable": false,
- "liquid": false,
- "blocksLight": false,
- "replaceable": false,
- "solid": false
- },
- "carpet": {
- "blocksMovement": false,
- "burnable": true,
- "liquid": false,
- "blocksLight": false,
- "replaceable": false,
- "solid": false
- },
- "plant": {
- "blocksMovement": false,
- "burnable": false,
- "liquid": false,
- "blocksLight": false,
- "replaceable": false,
- "solid": false
- },
- "underwater_plant": {
- "blocksMovement": false,
- "burnable": false,
- "liquid": false,
- "blocksLight": false,
- "replaceable": false,
- "solid": false
- },
- "replaceable_plant": {
- "blocksMovement": false,
- "burnable": true,
- "liquid": false,
- "blocksLight": false,
- "replaceable": true,
- "solid": false
- },
- "nether_shoots": {
- "blocksMovement": false,
- "burnable": false,
- "liquid": false,
- "blocksLight": false,
- "replaceable": true,
- "solid": false
- },
- "replaceable_underwater_plant": {
- "blocksMovement": false,
- "burnable": false,
- "liquid": false,
- "blocksLight": false,
- "replaceable": true,
- "solid": false
- },
- "water": {
- "blocksMovement": false,
- "burnable": false,
- "liquid": true,
- "blocksLight": false,
- "replaceable": true,
- "solid": false
- },
- "bubble_column": {
- "blocksMovement": false,
- "burnable": false,
- "liquid": true,
- "blocksLight": false,
- "replaceable": true,
- "solid": false
- },
- "lava": {
- "blocksMovement": false,
- "burnable": false,
- "liquid": true,
- "blocksLight": false,
- "replaceable": true,
- "solid": false
- },
- "snow_layer": {
- "blocksMovement": false,
- "burnable": false,
- "liquid": false,
- "blocksLight": false,
- "replaceable": true,
- "solid": false
- },
- "fire": {
- "blocksMovement": false,
- "burnable": false,
- "liquid": false,
- "blocksLight": false,
- "replaceable": true,
- "solid": false
- },
- "decoration": {
- "blocksMovement": false,
- "burnable": false,
- "liquid": false,
- "blocksLight": false,
- "replaceable": false,
- "solid": false
- },
- "cobweb": {
- "blocksMovement": false,
- "burnable": false,
- "liquid": false,
- "blocksLight": false,
- "replaceable": false,
- "solid": true
- },
- "sculk": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "redstone_lamp": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "organic_product": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "soil": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "solid_organic": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "dense_ice": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "aggregate": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "sponge": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "shulker_box": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "wood": {
- "blocksMovement": true,
- "burnable": true,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "nether_wood": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "bamboo_sapling": {
- "blocksMovement": false,
- "burnable": true,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "bamboo": {
- "blocksMovement": true,
- "burnable": true,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "wool": {
- "blocksMovement": true,
- "burnable": true,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "tnt": {
- "blocksMovement": true,
- "burnable": true,
- "liquid": false,
- "blocksLight": false,
- "replaceable": false,
- "solid": true
- },
- "leaves": {
- "blocksMovement": true,
- "burnable": true,
- "liquid": false,
- "blocksLight": false,
- "replaceable": false,
- "solid": true
- },
- "glass": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": false,
- "replaceable": false,
- "solid": true
- },
- "ice": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": false,
- "replaceable": false,
- "solid": true
- },
- "cactus": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": false,
- "replaceable": false,
- "solid": true
- },
- "stone": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "metal": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "snow_block": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "repair_station": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "barrier": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "piston": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "moss_block": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "gourd": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "egg": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "cake": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "amethyst": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "powder_snow": {
- "blocksMovement": false,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": false
- },
- "frogspawn": {
- "blocksMovement": false,
- "burnable": false,
- "liquid": false,
- "blocksLight": false,
- "replaceable": false,
- "solid": false
- },
- "froglight": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- },
- "decorated_pot": {
- "blocksMovement": true,
- "burnable": false,
- "liquid": false,
- "blocksLight": true,
- "replaceable": false,
- "solid": true
- }
- },
- "blocks": {
- "minecraft:spruce_trapdoor": {
- "1.19.4": "wood"
- },
- "minecraft:sculk_sensor": {
- "1.19.4": "sculk"
- },
- "minecraft:waxed_oxidized_cut_copper_slab": {
- "1.19.4": "metal"
- },
- "minecraft:tuff": {
- "1.19.4": "stone"
- },
- "minecraft:chorus_flower": {
- "1.19.4": "plant"
- },
- "minecraft:rooted_dirt": {
- "1.19.4": "soil"
- },
- "minecraft:end_stone": {
- "1.19.4": "stone"
- },
- "minecraft:chiseled_deepslate": {
- "1.19.4": "stone"
- },
- "minecraft:exposed_cut_copper_stairs": {
- "1.19.4": "metal"
- },
- "minecraft:deepslate_brick_slab": {
- "1.19.4": "stone"
- },
- "minecraft:cherry_leaves": {
- "1.19.4": "leaves"
- },
- "minecraft:cyan_bed": {
- "1.19.4": "wool"
- },
- "minecraft:sponge": {
- "1.19.4": "sponge"
- },
- "minecraft:lime_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:granite_wall": {
- "1.19.4": "stone"
- },
- "minecraft:white_tulip": {
- "1.19.4": "plant"
- },
- "minecraft:dispenser": {
- "1.19.4": "stone"
- },
- "minecraft:warped_fungus": {
- "1.19.4": "plant"
- },
- "minecraft:conduit": {
- "1.19.4": "glass"
- },
- "minecraft:mud_brick_wall": {
- "1.19.4": "stone"
- },
- "minecraft:green_shulker_box": {
- "1.13.2": "stone",
- "1.19.4": "shulker_box"
- },
- "minecraft:smooth_quartz": {
- "1.19.4": "stone"
- },
- "minecraft:calcite": {
- "1.19.4": "stone"
- },
- "minecraft:peony": {
- "1.19.4": "replaceable_plant"
- },
- "minecraft:honeycomb_block": {
- "1.19.4": "organic_product"
- },
- "minecraft:blue_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:cherry_planks": {
- "1.19.4": "wood"
- },
- "minecraft:polished_andesite": {
- "1.19.4": "stone"
- },
- "minecraft:potatoes": {
- "1.19.4": "plant"
- },
- "minecraft:dark_oak_sapling": {
- "1.19.4": "plant"
- },
- "minecraft:stone_button": {
- "1.19.4": "decoration"
- },
- "minecraft:blast_furnace": {
- "1.19.4": "stone"
- },
- "minecraft:cracked_deepslate_tiles": {
- "1.19.4": "stone"
- },
- "minecraft:orange_concrete_powder": {
- "1.19.4": "aggregate"
- },
- "minecraft:cracked_nether_bricks": {
- "1.19.4": "stone"
- },
- "minecraft:melon_stem": {
- "1.19.4": "plant"
- },
- "minecraft:mangrove_wall_sign": {
- "1.19.4": "wood"
- },
- "minecraft:lever": {
- "1.19.4": "decoration"
- },
- "minecraft:gray_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:cartography_table": {
- "1.19.4": "wood"
- },
- "minecraft:mangrove_propagule": {
- "1.19.4": "plant"
- },
- "minecraft:gray_stained_glass": {
- "1.19.4": "glass"
- },
- "minecraft:deepslate_iron_ore": {
- "1.19.4": "stone"
- },
- "minecraft:brick_slab": {
- "1.19.4": "stone"
- },
- "minecraft:birch_fence_gate": {
- "1.19.4": "wood"
- },
- "minecraft:nether_brick_wall": {
- "1.19.4": "stone"
- },
- "minecraft:vine": {
- "1.19.4": "replaceable_plant"
- },
- "minecraft:stripped_jungle_wood": {
- "1.19.4": "wood"
- },
- "minecraft:oak_leaves": {
- "1.19.4": "leaves"
- },
- "minecraft:wither_rose": {
- "1.19.4": "plant"
- },
- "minecraft:infested_cracked_stone_bricks": {
- "1.19.4": "organic_product"
- },
- "minecraft:mangrove_roots": {
- "1.19.4": "wood"
- },
- "minecraft:gray_wool": {
- "1.19.4": "wool"
- },
- "minecraft:stripped_oak_log": {
- "1.19.4": "wood"
- },
- "minecraft:red_sandstone_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:bamboo_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:brain_coral_fan": {
- "1.19.4": "underwater_plant"
- },
- "minecraft:light_gray_candle_cake": {
- "1.19.4": "cake"
- },
- "minecraft:black_banner": {
- "1.19.4": "wood"
- },
- "minecraft:pink_wall_banner": {
- "1.19.4": "wood"
- },
- "minecraft:enchanting_table": {
- "1.19.4": "stone"
- },
- "minecraft:pearlescent_froglight": {
- "1.19.4": "froglight"
- },
- "minecraft:bamboo": {
- "1.19.4": "bamboo"
- },
- "minecraft:acacia_planks": {
- "1.19.4": "wood"
- },
- "minecraft:dead_brain_coral_wall_fan": {
- "1.19.4": "stone"
- },
- "minecraft:warped_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:potted_dead_bush": {
- "1.19.4": "decoration"
- },
- "minecraft:white_concrete": {
- "1.19.4": "stone"
- },
- "minecraft:birch_wood": {
- "1.19.4": "wood"
- },
- "minecraft:warped_stairs": {
- "1.19.4": "nether_wood"
- },
- "minecraft:purpur_block": {
- "1.19.4": "stone"
- },
- "minecraft:sandstone_wall": {
- "1.19.4": "stone"
- },
- "minecraft:powder_snow_cauldron": {
- "1.19.4": "metal"
- },
- "minecraft:polished_blackstone": {
- "1.19.4": "stone"
- },
- "minecraft:blue_stained_glass": {
- "1.19.4": "glass"
- },
- "minecraft:infested_chiseled_stone_bricks": {
- "1.19.4": "organic_product"
- },
- "minecraft:deepslate_copper_ore": {
- "1.19.4": "stone"
- },
- "minecraft:pink_bed": {
- "1.19.4": "wool"
- },
- "minecraft:light_blue_stained_glass_pane": {
- "1.19.4": "glass"
- },
- "minecraft:purple_stained_glass": {
- "1.19.4": "glass"
- },
- "minecraft:sea_lantern": {
- "1.19.4": "glass"
- },
- "minecraft:grass_block": {
- "1.19.4": "solid_organic"
- },
- "minecraft:pink_tulip": {
- "1.19.4": "plant"
- },
- "minecraft:birch_pressure_plate": {
- "1.19.4": "wood"
- },
- "minecraft:blue_orchid": {
- "1.19.4": "plant"
- },
- "minecraft:red_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:ancient_debris": {
- "1.19.4": "metal"
- },
- "minecraft:tinted_glass": {
- "1.19.4": "glass"
- },
- "minecraft:black_wool": {
- "1.19.4": "wool"
- },
- "minecraft:damaged_anvil": {
- "1.19.4": "repair_station"
- },
- "minecraft:coal_block": {
- "1.19.4": "stone"
- },
- "minecraft:yellow_candle_cake": {
- "1.19.4": "cake"
- },
- "minecraft:piglin_head": {
- "1.19.4": "decoration"
- },
- "minecraft:light_gray_bed": {
- "1.19.4": "wool"
- },
- "minecraft:blue_bed": {
- "1.19.4": "wool"
- },
- "minecraft:infested_cobblestone": {
- "1.19.4": "organic_product"
- },
- "minecraft:potted_oak_sapling": {
- "1.19.4": "decoration"
- },
- "minecraft:deepslate_tile_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:birch_fence": {
- "1.19.4": "wood"
- },
- "minecraft:bamboo_fence": {
- "1.19.4": "wood"
- },
- "minecraft:acacia_wall_sign": {
- "1.19.4": "wood"
- },
- "minecraft:snow_block": {
- "1.19.4": "snow_block"
- },
- "minecraft:copper_block": {
- "1.19.4": "metal"
- },
- "minecraft:mangrove_door": {
- "1.19.4": "wood"
- },
- "minecraft:cut_red_sandstone_slab": {
- "1.19.4": "stone"
- },
- "minecraft:honey_block": {
- "1.19.4": "organic_product"
- },
- "minecraft:lime_candle": {
- "1.19.4": "decoration"
- },
- "minecraft:brown_carpet": {
- "1.19.4": "carpet"
- },
- "minecraft:dragon_egg": {
- "1.19.4": "egg"
- },
- "minecraft:warped_fence": {
- "1.19.4": "nether_wood"
- },
- "minecraft:command_block": {
- "1.19.4": "metal"
- },
- "minecraft:light_blue_banner": {
- "1.19.4": "wood"
- },
- "minecraft:light_gray_wall_banner": {
- "1.19.4": "wood"
- },
- "minecraft:potted_white_tulip": {
- "1.19.4": "decoration"
- },
- "minecraft:dandelion": {
- "1.19.4": "plant"
- },
- "minecraft:red_nether_bricks": {
- "1.19.4": "stone"
- },
- "minecraft:brick_wall": {
- "1.19.4": "stone"
- },
- "minecraft:redstone_torch": {
- "1.19.4": "decoration"
- },
- "minecraft:dragon_wall_head": {
- "1.19.4": "decoration"
- },
- "minecraft:soul_soil": {
- "1.19.4": "soil"
- },
- "minecraft:oak_sign": {
- "1.19.4": "wood"
- },
- "minecraft:red_nether_brick_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:bamboo_block": {
- "1.19.4": "wood"
- },
- "minecraft:stone_pressure_plate": {
- "1.19.4": "stone"
- },
- "minecraft:cobblestone_slab": {
- "1.19.4": "stone"
- },
- "minecraft:polished_diorite_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:prismarine_brick_slab": {
- "1.19.4": "stone"
- },
- "minecraft:terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:repeating_command_block": {
- "1.19.4": "metal"
- },
- "minecraft:cracked_deepslate_bricks": {
- "1.19.4": "stone"
- },
- "minecraft:barrier": {
- "1.19.4": "barrier"
- },
- "minecraft:jungle_wall_sign": {
- "1.19.4": "wood"
- },
- "minecraft:andesite_slab": {
- "1.19.4": "stone"
- },
- "minecraft:brown_banner": {
- "1.19.4": "wood"
- },
- "minecraft:cyan_wool": {
- "1.19.4": "wool"
- },
- "minecraft:purple_wool": {
- "1.19.4": "wool"
- },
- "minecraft:pink_carpet": {
- "1.19.4": "carpet"
- },
- "minecraft:brain_coral": {
- "1.19.4": "underwater_plant"
- },
- "minecraft:bamboo_mosaic_slab": {
- "1.19.4": "wood"
- },
- "minecraft:yellow_wool": {
- "1.19.4": "wool"
- },
- "minecraft:cobbled_deepslate_slab": {
- "1.19.4": "stone"
- },
- "minecraft:suspicious_sand": {
- "1.19.4": "aggregate"
- },
- "minecraft:potted_cherry_sapling": {
- "1.19.4": "decoration"
- },
- "minecraft:black_stained_glass_pane": {
- "1.19.4": "glass"
- },
- "minecraft:jungle_fence": {
- "1.19.4": "wood"
- },
- "minecraft:cave_vines_plant": {
- "1.19.4": "plant"
- },
- "minecraft:diorite": {
- "1.19.4": "stone"
- },
- "minecraft:jungle_button": {
- "1.19.4": "decoration"
- },
- "minecraft:blackstone_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:brown_candle": {
- "1.19.4": "decoration"
- },
- "minecraft:waxed_exposed_copper": {
- "1.19.4": "metal"
- },
- "minecraft:crimson_door": {
- "1.19.4": "nether_wood"
- },
- "minecraft:redstone_lamp": {
- "1.19.4": "redstone_lamp"
- },
- "minecraft:crimson_button": {
- "1.19.4": "decoration"
- },
- "minecraft:muddy_mangrove_roots": {
- "1.19.4": "soil"
- },
- "minecraft:birch_sapling": {
- "1.19.4": "plant"
- },
- "minecraft:black_concrete_powder": {
- "1.19.4": "aggregate"
- },
- "minecraft:fire_coral_block": {
- "1.19.4": "stone"
- },
- "minecraft:jungle_stairs": {
- "1.19.4": "wood"
- },
- "minecraft:dark_oak_button": {
- "1.19.4": "decoration"
- },
- "minecraft:weeping_vines_plant": {
- "1.19.4": "plant"
- },
- "minecraft:cherry_wood": {
- "1.19.4": "wood"
- },
- "minecraft:oxeye_daisy": {
- "1.19.4": "plant"
- },
- "minecraft:lectern": {
- "1.19.4": "wood"
- },
- "minecraft:potted_crimson_fungus": {
- "1.19.4": "decoration"
- },
- "minecraft:chiseled_polished_blackstone": {
- "1.19.4": "stone"
- },
- "minecraft:spruce_door": {
- "1.19.4": "wood"
- },
- "minecraft:bamboo_mosaic_stairs": {
- "1.19.4": "wood"
- },
- "minecraft:white_shulker_box": {
- "1.13.2": "stone",
- "1.19.4": "shulker_box"
- },
- "minecraft:lime_wall_banner": {
- "1.19.4": "wood"
- },
- "minecraft:quartz_pillar": {
- "1.19.4": "stone"
- },
- "minecraft:mangrove_slab": {
- "1.19.4": "wood"
- },
- "minecraft:smooth_basalt": {
- "1.19.4": "stone"
- },
- "minecraft:lime_stained_glass": {
- "1.19.4": "glass"
- },
- "minecraft:polished_blackstone_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:kelp": {
- "1.19.4": "underwater_plant"
- },
- "minecraft:raw_copper_block": {
- "1.19.4": "stone"
- },
- "minecraft:acacia_fence": {
- "1.19.4": "wood"
- },
- "minecraft:orange_candle": {
- "1.19.4": "decoration"
- },
- "minecraft:powered_rail": {
- "1.19.4": "decoration"
- },
- "minecraft:anvil": {
- "1.19.4": "repair_station"
- },
- "minecraft:rose_bush": {
- "1.19.4": "replaceable_plant"
- },
- "minecraft:stone_brick_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:spruce_leaves": {
- "1.19.4": "leaves"
- },
- "minecraft:black_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:green_concrete": {
- "1.19.4": "stone"
- },
- "minecraft:fire": {
- "1.19.4": "fire"
- },
- "minecraft:lime_bed": {
- "1.19.4": "wool"
- },
- "minecraft:dark_prismarine": {
- "1.19.4": "stone"
- },
- "minecraft:jungle_wood": {
- "1.19.4": "wood"
- },
- "minecraft:light_gray_banner": {
- "1.19.4": "wood"
- },
- "minecraft:dark_oak_leaves": {
- "1.19.4": "leaves"
- },
- "minecraft:potted_cactus": {
- "1.19.4": "decoration"
- },
- "minecraft:acacia_button": {
- "1.19.4": "decoration"
- },
- "minecraft:rail": {
- "1.19.4": "decoration"
- },
- "minecraft:dark_prismarine_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:light_blue_candle_cake": {
- "1.19.4": "cake"
- },
- "minecraft:mud": {
- "1.19.4": "soil"
- },
- "minecraft:daylight_detector": {
- "1.19.4": "wood"
- },
- "minecraft:dead_tube_coral_wall_fan": {
- "1.19.4": "stone"
- },
- "minecraft:acacia_leaves": {
- "1.19.4": "leaves"
- },
- "minecraft:cyan_glazed_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:waxed_exposed_cut_copper_slab": {
- "1.19.4": "metal"
- },
- "minecraft:spruce_fence_gate": {
- "1.19.4": "wood"
- },
- "minecraft:dark_oak_wall_sign": {
- "1.19.4": "wood"
- },
- "minecraft:mangrove_button": {
- "1.19.4": "decoration"
- },
- "minecraft:brown_concrete": {
- "1.19.4": "stone"
- },
- "minecraft:trapped_chest": {
- "1.19.4": "wood"
- },
- "minecraft:red_carpet": {
- "1.19.4": "carpet"
- },
- "minecraft:birch_sign": {
- "1.19.4": "wood"
- },
- "minecraft:birch_stairs": {
- "1.19.4": "wood"
- },
- "minecraft:dead_horn_coral": {
- "1.19.4": "stone"
- },
- "minecraft:crimson_roots": {
- "1.19.4": "nether_shoots"
- },
- "minecraft:deepslate_tile_wall": {
- "1.19.4": "stone"
- },
- "minecraft:brewing_stand": {
- "1.19.4": "metal"
- },
- "minecraft:chain_command_block": {
- "1.19.4": "metal"
- },
- "minecraft:black_stained_glass": {
- "1.19.4": "glass"
- },
- "minecraft:pink_candle": {
- "1.19.4": "decoration"
- },
- "minecraft:white_carpet": {
- "1.19.4": "carpet"
- },
- "minecraft:crimson_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:light_blue_carpet": {
- "1.19.4": "carpet"
- },
- "minecraft:sandstone_slab": {
- "1.19.4": "stone"
- },
- "minecraft:dark_oak_fence": {
- "1.19.4": "wood"
- },
- "minecraft:podzol": {
- "1.19.4": "soil"
- },
- "minecraft:crimson_wall_sign": {
- "1.19.4": "nether_wood"
- },
- "minecraft:brick_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:blackstone_wall": {
- "1.19.4": "stone"
- },
- "minecraft:light_blue_glazed_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:potted_blue_orchid": {
- "1.19.4": "decoration"
- },
- "minecraft:zombie_head": {
- "1.19.4": "decoration"
- },
- "minecraft:orange_carpet": {
- "1.19.4": "carpet"
- },
- "minecraft:crimson_fungus": {
- "1.19.4": "plant"
- },
- "minecraft:lightning_rod": {
- "1.19.4": "metal"
- },
- "minecraft:farmland": {
- "1.19.4": "soil"
- },
- "minecraft:stone_bricks": {
- "1.19.4": "stone"
- },
- "minecraft:fletching_table": {
- "1.19.4": "wood"
- },
- "minecraft:candle": {
- "1.19.4": "decoration"
- },
- "minecraft:pink_candle_cake": {
- "1.19.4": "cake"
- },
- "minecraft:dark_oak_wood": {
- "1.19.4": "wood"
- },
- "minecraft:potted_red_mushroom": {
- "1.19.4": "decoration"
- },
- "minecraft:potted_spruce_sapling": {
- "1.19.4": "decoration"
- },
- "minecraft:red_sandstone": {
- "1.19.4": "stone"
- },
- "minecraft:polished_blackstone_bricks": {
- "1.19.4": "stone"
- },
- "minecraft:white_stained_glass": {
- "1.19.4": "glass"
- },
- "minecraft:red_nether_brick_wall": {
- "1.19.4": "stone"
- },
- "minecraft:oak_fence": {
- "1.19.4": "wood"
- },
- "minecraft:dead_bubble_coral_block": {
- "1.19.4": "stone"
- },
- "minecraft:bubble_coral_block": {
- "1.19.4": "stone"
- },
- "minecraft:cobblestone_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:brown_bed": {
- "1.19.4": "wool"
- },
- "minecraft:raw_gold_block": {
- "1.19.4": "stone"
- },
- "minecraft:acacia_sign": {
- "1.19.4": "wood"
- },
- "minecraft:oak_fence_gate": {
- "1.19.4": "wood"
- },
- "minecraft:black_bed": {
- "1.19.4": "wool"
- },
- "minecraft:sugar_cane": {
- "1.19.4": "plant"
- },
- "minecraft:potted_oxeye_daisy": {
- "1.19.4": "decoration"
- },
- "minecraft:diorite_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:allium": {
- "1.19.4": "plant"
- },
- "minecraft:birch_button": {
- "1.19.4": "decoration"
- },
- "minecraft:carved_pumpkin": {
- "1.19.4": "gourd"
- },
- "minecraft:granite_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:horn_coral": {
- "1.19.4": "underwater_plant"
- },
- "minecraft:yellow_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:birch_wall_hanging_sign": {
- "1.19.4": "aggregate"
- },
- "minecraft:iron_door": {
- "1.19.4": "metal"
- },
- "minecraft:purpur_pillar": {
- "1.19.4": "stone"
- },
- "minecraft:stone_slab": {
- "1.19.4": "stone"
- },
- "minecraft:deepslate_bricks": {
- "1.19.4": "stone"
- },
- "minecraft:nether_wart": {
- "1.19.4": "plant"
- },
- "minecraft:warped_fence_gate": {
- "1.19.4": "nether_wood"
- },
- "minecraft:acacia_sapling": {
- "1.19.4": "plant"
- },
- "minecraft:potted_poppy": {
- "1.19.4": "decoration"
- },
- "minecraft:light_blue_candle": {
- "1.19.4": "decoration"
- },
- "minecraft:oak_sapling": {
- "1.19.4": "plant"
- },
- "minecraft:pink_glazed_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:birch_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:nether_brick_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:purple_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:mossy_stone_brick_slab": {
- "1.19.4": "stone"
- },
- "minecraft:blue_concrete_powder": {
- "1.19.4": "aggregate"
- },
- "minecraft:mangrove_fence_gate": {
- "1.19.4": "wood"
- },
- "minecraft:polished_deepslate": {
- "1.19.4": "stone"
- },
- "minecraft:stripped_birch_wood": {
- "1.19.4": "wood"
- },
- "minecraft:cherry_wall_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:magenta_banner": {
- "1.19.4": "wood"
- },
- "minecraft:magenta_candle": {
- "1.19.4": "decoration"
- },
- "minecraft:pink_petals": {
- "1.19.4": "plant"
- },
- "minecraft:acacia_wood": {
- "1.19.4": "wood"
- },
- "minecraft:cobweb": {
- "1.19.4": "cobweb"
- },
- "minecraft:magenta_concrete": {
- "1.19.4": "stone"
- },
- "minecraft:oxidized_cut_copper_slab": {
- "1.19.4": "metal"
- },
- "minecraft:tube_coral": {
- "1.19.4": "underwater_plant"
- },
- "minecraft:mangrove_sign": {
- "1.19.4": "wood"
- },
- "minecraft:soul_torch": {
- "1.19.4": "decoration"
- },
- "minecraft:lava_cauldron": {
- "1.19.4": "metal"
- },
- "minecraft:yellow_glazed_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:red_wool": {
- "1.19.4": "wool"
- },
- "minecraft:tnt": {
- "1.19.4": "tnt"
- },
- "minecraft:prismarine_bricks": {
- "1.19.4": "stone"
- },
- "minecraft:tube_coral_fan": {
- "1.19.4": "underwater_plant"
- },
- "minecraft:light_gray_wool": {
- "1.19.4": "wool"
- },
- "minecraft:sweet_berry_bush": {
- "1.19.4": "plant"
- },
- "minecraft:magenta_candle_cake": {
- "1.19.4": "cake"
- },
- "minecraft:gray_candle_cake": {
- "1.19.4": "cake"
- },
- "minecraft:birch_slab": {
- "1.19.4": "wood"
- },
- "minecraft:dropper": {
- "1.19.4": "stone"
- },
- "minecraft:cave_air": {
- "1.19.4": "air"
- },
- "minecraft:dark_oak_wall_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:glass_pane": {
- "1.19.4": "glass"
- },
- "minecraft:mangrove_leaves": {
- "1.19.4": "leaves"
- },
- "minecraft:sandstone_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:weathered_cut_copper_stairs": {
- "1.19.4": "metal"
- },
- "minecraft:glowstone": {
- "1.19.4": "glass"
- },
- "minecraft:mangrove_trapdoor": {
- "1.19.4": "wood"
- },
- "minecraft:brown_glazed_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:exposed_cut_copper": {
- "1.19.4": "metal"
- },
- "minecraft:stripped_dark_oak_wood": {
- "1.19.4": "wood"
- },
- "minecraft:weeping_vines": {
- "1.19.4": "plant"
- },
- "minecraft:warped_button": {
- "1.19.4": "decoration"
- },
- "minecraft:iron_trapdoor": {
- "1.19.4": "metal"
- },
- "minecraft:red_mushroom_block": {
- "1.19.4": "wood"
- },
- "minecraft:loom": {
- "1.19.4": "wood"
- },
- "minecraft:brown_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:potted_azure_bluet": {
- "1.19.4": "decoration"
- },
- "minecraft:stripped_cherry_wood": {
- "1.19.4": "wood"
- },
- "minecraft:blue_concrete": {
- "1.19.4": "stone"
- },
- "minecraft:dark_oak_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:pink_concrete": {
- "1.19.4": "stone"
- },
- "minecraft:smooth_quartz_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:polished_granite": {
- "1.19.4": "stone"
- },
- "minecraft:acacia_pressure_plate": {
- "1.19.4": "wood"
- },
- "minecraft:green_candle": {
- "1.19.4": "decoration"
- },
- "minecraft:medium_amethyst_bud": {
- "1.19.4": "amethyst"
- },
- "minecraft:gray_banner": {
- "1.19.4": "wood"
- },
- "minecraft:crimson_nylium": {
- "1.19.4": "stone"
- },
- "minecraft:spruce_planks": {
- "1.19.4": "wood"
- },
- "minecraft:polished_blackstone_brick_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:red_glazed_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:blue_wool": {
- "1.19.4": "wool"
- },
- "minecraft:creeper_wall_head": {
- "1.19.4": "decoration"
- },
- "minecraft:red_tulip": {
- "1.19.4": "plant"
- },
- "minecraft:blue_ice": {
- "1.19.4": "dense_ice"
- },
- "minecraft:warped_sign": {
- "1.19.4": "nether_wood"
- },
- "minecraft:player_wall_head": {
- "1.19.4": "decoration"
- },
- "minecraft:lapis_block": {
- "1.19.4": "metal"
- },
- "minecraft:white_wall_banner": {
- "1.19.4": "wood"
- },
- "minecraft:orange_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:potted_warped_fungus": {
- "1.19.4": "decoration"
- },
- "minecraft:mangrove_wall_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:oak_wood": {
- "1.19.4": "wood"
- },
- "minecraft:sunflower": {
- "1.19.4": "replaceable_plant"
- },
- "minecraft:dragon_head": {
- "1.19.4": "decoration"
- },
- "minecraft:fire_coral": {
- "1.19.4": "underwater_plant"
- },
- "minecraft:waxed_copper_block": {
- "1.19.4": "metal"
- },
- "minecraft:oak_button": {
- "1.19.4": "decoration"
- },
- "minecraft:white_stained_glass_pane": {
- "1.19.4": "glass"
- },
- "minecraft:light_blue_wall_banner": {
- "1.19.4": "wood"
- },
- "minecraft:red_bed": {
- "1.19.4": "wool"
- },
- "minecraft:potted_azalea_bush": {
- "1.19.4": "decoration"
- },
- "minecraft:birch_planks": {
- "1.19.4": "wood"
- },
- "minecraft:spruce_wood": {
- "1.19.4": "wood"
- },
- "minecraft:light_gray_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:skeleton_wall_skull": {
- "1.19.4": "decoration"
- },
- "minecraft:clay": {
- "1.19.4": "organic_product"
- },
- "minecraft:deepslate_redstone_ore": {
- "1.19.4": "stone"
- },
- "minecraft:activator_rail": {
- "1.19.4": "decoration"
- },
- "minecraft:red_wall_banner": {
- "1.19.4": "wood"
- },
- "minecraft:potted_fern": {
- "1.19.4": "decoration"
- },
- "minecraft:blue_candle": {
- "1.19.4": "decoration"
- },
- "minecraft:bell": {
- "1.19.4": "metal"
- },
- "minecraft:potted_jungle_sapling": {
- "1.19.4": "decoration"
- },
- "minecraft:smoker": {
- "1.19.4": "stone"
- },
- "minecraft:polished_deepslate_wall": {
- "1.19.4": "stone"
- },
- "minecraft:chiseled_bookshelf": {
- "1.19.4": "wood"
- },
- "minecraft:lime_concrete_powder": {
- "1.19.4": "aggregate"
- },
- "minecraft:polished_basalt": {
- "1.19.4": "stone"
- },
- "minecraft:bamboo_trapdoor": {
- "1.19.4": "wood"
- },
- "minecraft:blue_shulker_box": {
- "1.13.2": "stone",
- "1.19.4": "shulker_box"
- },
- "minecraft:waxed_weathered_copper": {
- "1.19.4": "metal"
- },
- "minecraft:spruce_button": {
- "1.19.4": "decoration"
- },
- "minecraft:dark_prismarine_slab": {
- "1.19.4": "stone"
- },
- "minecraft:note_block": {
- "1.19.4": "wood"
- },
- "minecraft:jungle_trapdoor": {
- "1.19.4": "wood"
- },
- "minecraft:potted_crimson_roots": {
- "1.19.4": "decoration"
- },
- "minecraft:blue_wall_banner": {
- "1.19.4": "wood"
- },
- "minecraft:sculk_catalyst": {
- "1.19.4": "sculk"
- },
- "minecraft:gravel": {
- "1.19.4": "aggregate"
- },
- "minecraft:dark_oak_fence_gate": {
- "1.19.4": "wood"
- },
- "minecraft:blue_stained_glass_pane": {
- "1.19.4": "glass"
- },
- "minecraft:beetroots": {
- "1.19.4": "plant"
- },
- "minecraft:player_head": {
- "1.19.4": "decoration"
- },
- "minecraft:cake": {
- "1.19.4": "cake"
- },
- "minecraft:wither_skeleton_skull": {
- "1.19.4": "decoration"
- },
- "minecraft:orange_glazed_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:sculk_shrieker": {
- "1.19.4": "sculk"
- },
- "minecraft:petrified_oak_slab": {
- "1.19.4": "stone"
- },
- "minecraft:cut_sandstone": {
- "1.19.4": "stone"
- },
- "minecraft:warped_wall_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:azalea": {
- "1.19.4": "plant"
- },
- "minecraft:deepslate": {
- "1.19.4": "stone"
- },
- "minecraft:waxed_exposed_cut_copper": {
- "1.19.4": "metal"
- },
- "minecraft:gray_glazed_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:green_carpet": {
- "1.19.4": "carpet"
- },
- "minecraft:gray_candle": {
- "1.19.4": "decoration"
- },
- "minecraft:sticky_piston": {
- "1.19.4": "piston"
- },
- "minecraft:oak_stairs": {
- "1.19.4": "wood"
- },
- "minecraft:green_stained_glass_pane": {
- "1.19.4": "glass"
- },
- "minecraft:cyan_wall_banner": {
- "1.19.4": "wood"
- },
- "minecraft:mossy_stone_brick_wall": {
- "1.19.4": "stone"
- },
- "minecraft:jungle_pressure_plate": {
- "1.19.4": "wood"
- },
- "minecraft:stone": {
- "1.19.4": "stone"
- },
- "minecraft:crimson_hyphae": {
- "1.19.4": "nether_wood"
- },
- "minecraft:gray_bed": {
- "1.19.4": "wool"
- },
- "minecraft:white_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:bookshelf": {
- "1.19.4": "wood"
- },
- "minecraft:crimson_stairs": {
- "1.19.4": "nether_wood"
- },
- "minecraft:light_gray_stained_glass_pane": {
- "1.19.4": "glass"
- },
- "minecraft:gilded_blackstone": {
- "1.19.4": "stone"
- },
- "minecraft:polished_blackstone_wall": {
- "1.19.4": "stone"
- },
- "minecraft:waxed_weathered_cut_copper": {
- "1.19.4": "metal"
- },
- "minecraft:stripped_mangrove_wood": {
- "1.19.4": "wood"
- },
- "minecraft:magenta_wool": {
- "1.19.4": "wool"
- },
- "minecraft:polished_granite_slab": {
- "1.19.4": "stone"
- },
- "minecraft:exposed_cut_copper_slab": {
- "1.19.4": "metal"
- },
- "minecraft:mangrove_log": {
- "1.19.4": "wood"
- },
- "minecraft:lodestone": {
- "1.19.4": "repair_station"
- },
- "minecraft:horn_coral_wall_fan": {
- "1.19.4": "underwater_plant"
- },
- "minecraft:spruce_wall_sign": {
- "1.19.4": "wood"
- },
- "minecraft:magenta_stained_glass_pane": {
- "1.19.4": "glass"
- },
- "minecraft:dead_horn_coral_wall_fan": {
- "1.19.4": "stone"
- },
- "minecraft:brown_stained_glass_pane": {
- "1.19.4": "glass"
- },
- "minecraft:jungle_wall_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:redstone_wall_torch": {
- "1.19.4": "decoration"
- },
- "minecraft:magenta_bed": {
- "1.19.4": "wool"
- },
- "minecraft:brown_mushroom": {
- "1.19.4": "plant"
- },
- "minecraft:horn_coral_block": {
- "1.19.4": "stone"
- },
- "minecraft:cherry_sapling": {
- "1.19.4": "plant"
- },
- "minecraft:blue_banner": {
- "1.19.4": "wood"
- },
- "minecraft:slime_block": {
- "1.19.4": "organic_product"
- },
- "minecraft:bamboo_sapling": {
- "1.19.4": "bamboo_sapling"
- },
- "minecraft:tube_coral_block": {
- "1.19.4": "stone"
- },
- "minecraft:birch_leaves": {
- "1.19.4": "leaves"
- },
- "minecraft:andesite_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:cherry_door": {
- "1.19.4": "wood"
- },
- "minecraft:purple_concrete_powder": {
- "1.19.4": "aggregate"
- },
- "minecraft:crimson_stem": {
- "1.19.4": "nether_wood"
- },
- "minecraft:infested_deepslate": {
- "1.19.4": "organic_product"
- },
- "minecraft:deepslate_tiles": {
- "1.19.4": "stone"
- },
- "minecraft:iron_block": {
- "1.19.4": "metal"
- },
- "minecraft:prismarine_slab": {
- "1.19.4": "stone"
- },
- "minecraft:gray_shulker_box": {
- "1.13.2": "stone",
- "1.19.4": "shulker_box"
- },
- "minecraft:green_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:dead_fire_coral_block": {
- "1.19.4": "stone"
- },
- "minecraft:cherry_button": {
- "1.19.4": "decoration"
- },
- "minecraft:waxed_oxidized_copper": {
- "1.19.4": "metal"
- },
- "minecraft:waxed_weathered_cut_copper_stairs": {
- "1.19.4": "metal"
- },
- "minecraft:mangrove_pressure_plate": {
- "1.19.4": "wood"
- },
- "minecraft:warped_wall_sign": {
- "1.19.4": "nether_wood"
- },
- "minecraft:warped_wart_block": {
- "1.19.4": "solid_organic"
- },
- "minecraft:spore_blossom": {
- "1.19.4": "plant"
- },
- "minecraft:diamond_ore": {
- "1.19.4": "stone"
- },
- "minecraft:melon": {
- "1.19.4": "gourd"
- },
- "minecraft:yellow_concrete_powder": {
- "1.19.4": "aggregate"
- },
- "minecraft:cherry_trapdoor": {
- "1.19.4": "wood"
- },
- "minecraft:weathered_cut_copper": {
- "1.19.4": "metal"
- },
- "minecraft:warped_door": {
- "1.19.4": "nether_wood"
- },
- "minecraft:stripped_spruce_log": {
- "1.19.4": "wood"
- },
- "minecraft:lime_concrete": {
- "1.19.4": "stone"
- },
- "minecraft:target": {
- "1.19.4": "solid_organic"
- },
- "minecraft:end_stone_brick_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:light_blue_shulker_box": {
- "1.13.2": "stone",
- "1.19.4": "shulker_box"
- },
- "minecraft:torch": {
- "1.19.4": "decoration"
- },
- "minecraft:yellow_stained_glass": {
- "1.19.4": "glass"
- },
- "minecraft:yellow_stained_glass_pane": {
- "1.19.4": "glass"
- },
- "minecraft:composter": {
- "1.19.4": "wood"
- },
- "minecraft:gray_stained_glass_pane": {
- "1.19.4": "glass"
- },
- "minecraft:birch_trapdoor": {
- "1.19.4": "wood"
- },
- "minecraft:pink_concrete_powder": {
- "1.19.4": "aggregate"
- },
- "minecraft:crimson_sign": {
- "1.19.4": "nether_wood"
- },
- "minecraft:stripped_mangrove_log": {
- "1.19.4": "wood"
- },
- "minecraft:quartz_block": {
- "1.19.4": "stone"
- },
- "minecraft:dark_oak_door": {
- "1.19.4": "wood"
- },
- "minecraft:lime_wool": {
- "1.19.4": "wool"
- },
- "minecraft:jungle_leaves": {
- "1.19.4": "leaves"
- },
- "minecraft:small_amethyst_bud": {
- "1.19.4": "amethyst"
- },
- "minecraft:spawner": {
- "1.19.4": "stone"
- },
- "minecraft:potted_lily_of_the_valley": {
- "1.19.4": "decoration"
- },
- "minecraft:spruce_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:green_wool": {
- "1.19.4": "wool"
- },
- "minecraft:oak_wall_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:spruce_log": {
- "1.19.4": "wood"
- },
- "minecraft:bamboo_fence_gate": {
- "1.19.4": "wood"
- },
- "minecraft:end_rod": {
- "1.19.4": "decoration"
- },
- "minecraft:jungle_fence_gate": {
- "1.19.4": "wood"
- },
- "minecraft:comparator": {
- "1.19.4": "decoration"
- },
- "minecraft:deepslate_brick_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:white_bed": {
- "1.19.4": "wool"
- },
- "minecraft:bamboo_slab": {
- "1.19.4": "wood"
- },
- "minecraft:green_glazed_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:barrel": {
- "1.19.4": "wood"
- },
- "minecraft:soul_fire": {
- "1.19.4": "fire"
- },
- "minecraft:oak_planks": {
- "1.19.4": "wood"
- },
- "minecraft:potted_cornflower": {
- "1.19.4": "decoration"
- },
- "minecraft:bubble_coral_fan": {
- "1.19.4": "underwater_plant"
- },
- "minecraft:piston_head": {
- "1.19.4": "piston"
- },
- "minecraft:warped_planks": {
- "1.19.4": "nether_wood"
- },
- "minecraft:furnace": {
- "1.19.4": "stone"
- },
- "minecraft:red_sandstone_wall": {
- "1.19.4": "stone"
- },
- "minecraft:stripped_crimson_stem": {
- "1.19.4": "nether_wood"
- },
- "minecraft:netherrack": {
- "1.19.4": "stone"
- },
- "minecraft:dead_fire_coral_fan": {
- "1.19.4": "stone"
- },
- "minecraft:crafting_table": {
- "1.19.4": "wood"
- },
- "minecraft:ochre_froglight": {
- "1.19.4": "froglight"
- },
- "minecraft:acacia_fence_gate": {
- "1.19.4": "wood"
- },
- "minecraft:acacia_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:lilac": {
- "1.19.4": "replaceable_plant"
- },
- "minecraft:cherry_stairs": {
- "1.19.4": "wood"
- },
- "minecraft:lime_carpet": {
- "1.19.4": "carpet"
- },
- "minecraft:purple_candle_cake": {
- "1.19.4": "cake"
- },
- "minecraft:small_dripleaf": {
- "1.19.4": "plant"
- },
- "minecraft:light_gray_concrete_powder": {
- "1.19.4": "aggregate"
- },
- "minecraft:light_gray_carpet": {
- "1.19.4": "carpet"
- },
- "minecraft:gray_concrete_powder": {
- "1.19.4": "aggregate"
- },
- "minecraft:red_concrete_powder": {
- "1.19.4": "aggregate"
- },
- "minecraft:candle_cake": {
- "1.19.4": "cake"
- },
- "minecraft:bubble_coral_wall_fan": {
- "1.19.4": "underwater_plant"
- },
- "minecraft:polished_deepslate_slab": {
- "1.19.4": "stone"
- },
- "minecraft:jungle_planks": {
- "1.19.4": "wood"
- },
- "minecraft:jungle_door": {
- "1.19.4": "wood"
- },
- "minecraft:void_air": {
- "1.19.4": "air"
- },
- "minecraft:iron_ore": {
- "1.19.4": "stone"
- },
- "minecraft:light_weighted_pressure_plate": {
- "1.19.4": "metal"
- },
- "minecraft:cyan_carpet": {
- "1.19.4": "carpet"
- },
- "minecraft:light_blue_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:purple_carpet": {
- "1.19.4": "carpet"
- },
- "minecraft:warped_trapdoor": {
- "1.19.4": "nether_wood"
- },
- "minecraft:cherry_sign": {
- "1.19.4": "wood"
- },
- "minecraft:weathered_copper": {
- "1.19.4": "metal"
- },
- "minecraft:glow_lichen": {
- "1.19.4": "replaceable_plant"
- },
- "minecraft:blue_candle_cake": {
- "1.19.4": "cake"
- },
- "minecraft:redstone_block": {
- "1.19.4": "metal"
- },
- "minecraft:cracked_stone_bricks": {
- "1.19.4": "stone"
- },
- "minecraft:mossy_cobblestone_wall": {
- "1.19.4": "stone"
- },
- "minecraft:magenta_wall_banner": {
- "1.19.4": "wood"
- },
- "minecraft:polished_blackstone_slab": {
- "1.19.4": "stone"
- },
- "minecraft:cornflower": {
- "1.19.4": "plant"
- },
- "minecraft:yellow_banner": {
- "1.19.4": "wood"
- },
- "minecraft:mossy_cobblestone": {
- "1.19.4": "stone"
- },
- "minecraft:azalea_leaves": {
- "1.19.4": "leaves"
- },
- "minecraft:blue_carpet": {
- "1.19.4": "carpet"
- },
- "minecraft:dead_tube_coral": {
- "1.19.4": "stone"
- },
- "minecraft:flowering_azalea_leaves": {
- "1.19.4": "leaves"
- },
- "minecraft:infested_stone_bricks": {
- "1.19.4": "organic_product"
- },
- "minecraft:mossy_cobblestone_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:blue_glazed_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:red_shulker_box": {
- "1.13.2": "stone",
- "1.19.4": "shulker_box"
- },
- "minecraft:jungle_slab": {
- "1.19.4": "wood"
- },
- "minecraft:bamboo_wall_sign": {
- "1.19.4": "wood"
- },
- "minecraft:smithing_table": {
- "1.19.4": "wood"
- },
- "minecraft:redstone_wire": {
- "1.19.4": "decoration"
- },
- "minecraft:dried_kelp_block": {
- "1.19.4": "solid_organic"
- },
- "minecraft:warped_slab": {
- "1.19.4": "nether_wood"
- },
- "minecraft:warped_hyphae": {
- "1.19.4": "nether_wood"
- },
- "minecraft:chest": {
- "1.19.4": "wood"
- },
- "minecraft:warped_nylium": {
- "1.19.4": "stone"
- },
- "minecraft:cyan_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:dead_horn_coral_fan": {
- "1.19.4": "stone"
- },
- "minecraft:blackstone": {
- "1.19.4": "stone"
- },
- "minecraft:stripped_acacia_log": {
- "1.19.4": "wood"
- },
- "minecraft:oak_slab": {
- "1.19.4": "wood"
- },
- "minecraft:cut_copper": {
- "1.19.4": "metal"
- },
- "minecraft:moving_piston": {
- "1.19.4": "piston"
- },
- "minecraft:bubble_column": {
- "1.19.4": "bubble_column"
- },
- "minecraft:crimson_trapdoor": {
- "1.19.4": "nether_wood"
- },
- "minecraft:polished_blackstone_brick_slab": {
- "1.19.4": "stone"
- },
- "minecraft:granite": {
- "1.19.4": "stone"
- },
- "minecraft:deepslate_lapis_ore": {
- "1.19.4": "stone"
- },
- "minecraft:oak_door": {
- "1.19.4": "wood"
- },
- "minecraft:smooth_red_sandstone_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:cobbled_deepslate_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:polished_andesite_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:gray_wall_banner": {
- "1.19.4": "wood"
- },
- "minecraft:waxed_oxidized_cut_copper": {
- "1.19.4": "metal"
- },
- "minecraft:sandstone": {
- "1.19.4": "stone"
- },
- "minecraft:pink_banner": {
- "1.19.4": "wood"
- },
- "minecraft:dead_brain_coral_block": {
- "1.19.4": "stone"
- },
- "minecraft:chipped_anvil": {
- "1.19.4": "repair_station"
- },
- "minecraft:red_sandstone_slab": {
- "1.19.4": "stone"
- },
- "minecraft:prismarine": {
- "1.19.4": "stone"
- },
- "minecraft:cocoa": {
- "1.19.4": "plant"
- },
- "minecraft:spruce_slab": {
- "1.19.4": "wood"
- },
- "minecraft:deepslate_emerald_ore": {
- "1.19.4": "stone"
- },
- "minecraft:tall_seagrass": {
- "1.19.4": "replaceable_underwater_plant"
- },
- "minecraft:soul_lantern": {
- "1.19.4": "metal"
- },
- "minecraft:lava": {
- "1.19.4": "lava"
- },
- "minecraft:green_candle_cake": {
- "1.19.4": "cake"
- },
- "minecraft:chain": {
- "1.19.4": "metal"
- },
- "minecraft:cauldron": {
- "1.19.4": "metal"
- },
- "minecraft:raw_iron_block": {
- "1.19.4": "stone"
- },
- "minecraft:cherry_wall_sign": {
- "1.19.4": "wood"
- },
- "minecraft:mangrove_fence": {
- "1.19.4": "wood"
- },
- "minecraft:waxed_cut_copper": {
- "1.19.4": "metal"
- },
- "minecraft:big_dripleaf_stem": {
- "1.19.4": "plant"
- },
- "minecraft:fire_coral_fan": {
- "1.19.4": "underwater_plant"
- },
- "minecraft:cactus": {
- "1.19.4": "cactus"
- },
- "minecraft:pink_shulker_box": {
- "1.13.2": "stone",
- "1.19.4": "shulker_box"
- },
- "minecraft:nether_gold_ore": {
- "1.19.4": "stone"
- },
- "minecraft:black_concrete": {
- "1.19.4": "stone"
- },
- "minecraft:potted_pink_tulip": {
- "1.19.4": "decoration"
- },
- "minecraft:deepslate_diamond_ore": {
- "1.19.4": "stone"
- },
- "minecraft:orange_shulker_box": {
- "1.13.2": "stone",
- "1.19.4": "shulker_box"
- },
- "minecraft:red_nether_brick_slab": {
- "1.19.4": "stone"
- },
- "minecraft:quartz_bricks": {
- "1.19.4": "stone"
- },
- "minecraft:green_banner": {
- "1.19.4": "wood"
- },
- "minecraft:dirt_path": {
- "1.19.4": "soil"
- },
- "minecraft:white_glazed_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:light_blue_concrete": {
- "1.19.4": "stone"
- },
- "minecraft:pointed_dripstone": {
- "1.19.4": "stone"
- },
- "minecraft:glass": {
- "1.19.4": "glass"
- },
- "minecraft:diamond_block": {
- "1.19.4": "metal"
- },
- "minecraft:azure_bluet": {
- "1.19.4": "plant"
- },
- "minecraft:andesite_wall": {
- "1.19.4": "stone"
- },
- "minecraft:infested_mossy_stone_bricks": {
- "1.19.4": "organic_product"
- },
- "minecraft:prismarine_brick_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:nether_brick_fence": {
- "1.19.4": "stone"
- },
- "minecraft:purple_wall_banner": {
- "1.19.4": "wood"
- },
- "minecraft:cyan_stained_glass_pane": {
- "1.19.4": "glass"
- },
- "minecraft:potted_birch_sapling": {
- "1.19.4": "decoration"
- },
- "minecraft:cracked_polished_blackstone_bricks": {
- "1.19.4": "stone"
- },
- "minecraft:tripwire": {
- "1.19.4": "decoration"
- },
- "minecraft:nether_brick_slab": {
- "1.19.4": "stone"
- },
- "minecraft:red_candle": {
- "1.19.4": "decoration"
- },
- "minecraft:smooth_red_sandstone": {
- "1.19.4": "stone"
- },
- "minecraft:amethyst_block": {
- "1.19.4": "amethyst"
- },
- "minecraft:birch_door": {
- "1.19.4": "wood"
- },
- "minecraft:moss_block": {
- "1.19.4": "moss_block"
- },
- "minecraft:polished_blackstone_button": {
- "1.19.4": "decoration"
- },
- "minecraft:potted_torchflower": {
- "1.19.4": "decoration"
- },
- "minecraft:brown_wool": {
- "1.19.4": "wool"
- },
- "minecraft:bamboo_button": {
- "1.19.4": "decoration"
- },
- "minecraft:red_stained_glass_pane": {
- "1.19.4": "glass"
- },
- "minecraft:chiseled_stone_bricks": {
- "1.19.4": "stone"
- },
- "minecraft:cyan_stained_glass": {
- "1.19.4": "glass"
- },
- "minecraft:light_blue_wool": {
- "1.19.4": "wool"
- },
- "minecraft:sea_pickle": {
- "1.19.4": "underwater_plant"
- },
- "minecraft:flower_pot": {
- "1.19.4": "decoration"
- },
- "minecraft:crimson_fence_gate": {
- "1.19.4": "nether_wood"
- },
- "minecraft:andesite": {
- "1.19.4": "stone"
- },
- "minecraft:wither_skeleton_wall_skull": {
- "1.19.4": "decoration"
- },
- "minecraft:purple_shulker_box": {
- "1.13.2": "stone",
- "1.19.4": "shulker_box"
- },
- "minecraft:seagrass": {
- "1.19.4": "replaceable_underwater_plant"
- },
- "minecraft:shulker_box": {
- "1.13.2": "stone",
- "1.19.4": "shulker_box"
- },
- "minecraft:warped_pressure_plate": {
- "1.19.4": "nether_wood"
- },
- "minecraft:lime_glazed_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:green_concrete_powder": {
- "1.19.4": "aggregate"
- },
- "minecraft:black_carpet": {
- "1.19.4": "carpet"
- },
- "minecraft:cobbled_deepslate_wall": {
- "1.19.4": "stone"
- },
- "minecraft:red_sand": {
- "1.19.4": "aggregate"
- },
- "minecraft:budding_amethyst": {
- "1.19.4": "amethyst"
- },
- "minecraft:obsidian": {
- "1.19.4": "stone"
- },
- "minecraft:waxed_weathered_cut_copper_slab": {
- "1.19.4": "metal"
- },
- "minecraft:potted_dandelion": {
- "1.19.4": "decoration"
- },
- "minecraft:hopper": {
- "1.19.4": "metal"
- },
- "minecraft:water_cauldron": {
- "1.19.4": "metal"
- },
- "minecraft:purple_concrete": {
- "1.19.4": "stone"
- },
- "minecraft:bamboo_wall_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:amethyst_cluster": {
- "1.19.4": "amethyst"
- },
- "minecraft:dark_oak_planks": {
- "1.19.4": "wood"
- },
- "minecraft:magenta_glazed_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:stripped_birch_log": {
- "1.19.4": "wood"
- },
- "minecraft:waxed_cut_copper_stairs": {
- "1.19.4": "metal"
- },
- "minecraft:orange_wool": {
- "1.19.4": "wool"
- },
- "minecraft:dead_brain_coral": {
- "1.19.4": "stone"
- },
- "minecraft:powder_snow": {
- "1.19.4": "powder_snow"
- },
- "minecraft:waxed_exposed_cut_copper_stairs": {
- "1.19.4": "metal"
- },
- "minecraft:jungle_log": {
- "1.19.4": "wood"
- },
- "minecraft:mangrove_stairs": {
- "1.19.4": "wood"
- },
- "minecraft:white_candle": {
- "1.19.4": "decoration"
- },
- "minecraft:twisting_vines_plant": {
- "1.19.4": "plant"
- },
- "minecraft:yellow_concrete": {
- "1.19.4": "stone"
- },
- "minecraft:cherry_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:end_stone_brick_slab": {
- "1.19.4": "stone"
- },
- "minecraft:water": {
- "1.19.4": "water"
- },
- "minecraft:lily_of_the_valley": {
- "1.19.4": "plant"
- },
- "minecraft:shroomlight": {
- "1.19.4": "solid_organic"
- },
- "minecraft:ladder": {
- "1.19.4": "decoration"
- },
- "minecraft:potted_wither_rose": {
- "1.19.4": "decoration"
- },
- "minecraft:magenta_concrete_powder": {
- "1.19.4": "aggregate"
- },
- "minecraft:dark_oak_log": {
- "1.19.4": "wood"
- },
- "minecraft:packed_ice": {
- "1.19.4": "dense_ice"
- },
- "minecraft:bee_nest": {
- "1.19.4": "wood"
- },
- "minecraft:observer": {
- "1.19.4": "stone"
- },
- "minecraft:brown_shulker_box": {
- "1.13.2": "stone",
- "1.19.4": "shulker_box"
- },
- "minecraft:crimson_wall_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:coal_ore": {
- "1.19.4": "stone"
- },
- "minecraft:jungle_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:dead_bubble_coral_wall_fan": {
- "1.19.4": "stone"
- },
- "minecraft:hay_block": {
- "1.19.4": "solid_organic"
- },
- "minecraft:black_candle": {
- "1.19.4": "decoration"
- },
- "minecraft:bamboo_stairs": {
- "1.19.4": "wood"
- },
- "minecraft:orange_wall_banner": {
- "1.19.4": "wood"
- },
- "minecraft:acacia_log": {
- "1.19.4": "wood"
- },
- "minecraft:white_concrete_powder": {
- "1.19.4": "aggregate"
- },
- "minecraft:mangrove_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:nether_bricks": {
- "1.19.4": "stone"
- },
- "minecraft:lantern": {
- "1.19.4": "metal"
- },
- "minecraft:heavy_weighted_pressure_plate": {
- "1.19.4": "metal"
- },
- "minecraft:sculk_vein": {
- "1.19.4": "sculk"
- },
- "minecraft:cobbled_deepslate": {
- "1.19.4": "stone"
- },
- "minecraft:gold_ore": {
- "1.19.4": "stone"
- },
- "minecraft:snow": {
- "1.19.4": "snow_layer"
- },
- "minecraft:spruce_sapling": {
- "1.19.4": "plant"
- },
- "minecraft:soul_sand": {
- "1.19.4": "aggregate"
- },
- "minecraft:emerald_ore": {
- "1.19.4": "stone"
- },
- "minecraft:quartz_slab": {
- "1.19.4": "stone"
- },
- "minecraft:attached_pumpkin_stem": {
- "1.19.4": "plant"
- },
- "minecraft:cobblestone_wall": {
- "1.19.4": "stone"
- },
- "minecraft:cherry_fence_gate": {
- "1.19.4": "wood"
- },
- "minecraft:crimson_pressure_plate": {
- "1.19.4": "nether_wood"
- },
- "minecraft:stripped_warped_stem": {
- "1.19.4": "nether_wood"
- },
- "minecraft:bedrock": {
- "1.19.4": "stone"
- },
- "minecraft:end_portal": {
- "1.19.4": "portal"
- },
- "minecraft:torchflower_crop": {
- "1.19.4": "plant"
- },
- "minecraft:wet_sponge": {
- "1.19.4": "sponge"
- },
- "minecraft:frogspawn": {
- "1.19.4": "frogspawn"
- },
- "minecraft:potted_mangrove_propagule": {
- "1.19.4": "decoration"
- },
- "minecraft:soul_wall_torch": {
- "1.19.4": "decoration"
- },
- "minecraft:stone_brick_slab": {
- "1.19.4": "stone"
- },
- "minecraft:jungle_sign": {
- "1.19.4": "wood"
- },
- "minecraft:cyan_concrete_powder": {
- "1.19.4": "aggregate"
- },
- "minecraft:diorite_slab": {
- "1.19.4": "stone"
- },
- "minecraft:orange_banner": {
- "1.19.4": "wood"
- },
- "minecraft:oak_log": {
- "1.19.4": "wood"
- },
- "minecraft:orange_bed": {
- "1.19.4": "wool"
- },
- "minecraft:purple_banner": {
- "1.19.4": "wood"
- },
- "minecraft:purple_bed": {
- "1.19.4": "wool"
- },
- "minecraft:reinforced_deepslate": {
- "1.19.4": "stone"
- },
- "minecraft:yellow_wall_banner": {
- "1.19.4": "wood"
- },
- "minecraft:dead_tube_coral_block": {
- "1.19.4": "stone"
- },
- "minecraft:stone_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:mangrove_planks": {
- "1.19.4": "wood"
- },
- "minecraft:smooth_quartz_slab": {
- "1.19.4": "stone"
- },
- "minecraft:stripped_crimson_hyphae": {
- "1.19.4": "nether_wood"
- },
- "minecraft:chiseled_nether_bricks": {
- "1.19.4": "stone"
- },
- "minecraft:moss_carpet": {
- "1.19.4": "plant"
- },
- "minecraft:green_bed": {
- "1.19.4": "wool"
- },
- "minecraft:light_gray_concrete": {
- "1.19.4": "stone"
- },
- "minecraft:oxidized_cut_copper": {
- "1.19.4": "metal"
- },
- "minecraft:brown_stained_glass": {
- "1.19.4": "glass"
- },
- "minecraft:green_stained_glass": {
- "1.19.4": "glass"
- },
- "minecraft:skeleton_skull": {
- "1.19.4": "decoration"
- },
- "minecraft:cherry_log": {
- "1.19.4": "wood"
- },
- "minecraft:beacon": {
- "1.19.4": "glass"
- },
- "minecraft:jungle_sapling": {
- "1.19.4": "plant"
- },
- "minecraft:mud_brick_slab": {
- "1.19.4": "stone"
- },
- "minecraft:spruce_sign": {
- "1.19.4": "wood"
- },
- "minecraft:lime_shulker_box": {
- "1.13.2": "stone",
- "1.19.4": "shulker_box"
- },
- "minecraft:purpur_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:mossy_cobblestone_slab": {
- "1.19.4": "stone"
- },
- "minecraft:deepslate_coal_ore": {
- "1.19.4": "stone"
- },
- "minecraft:dark_oak_pressure_plate": {
- "1.19.4": "wood"
- },
- "minecraft:cut_copper_stairs": {
- "1.19.4": "metal"
- },
- "minecraft:polished_andesite_slab": {
- "1.19.4": "stone"
- },
- "minecraft:acacia_wall_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:polished_diorite": {
- "1.19.4": "stone"
- },
- "minecraft:potted_allium": {
- "1.19.4": "decoration"
- },
- "minecraft:end_gateway": {
- "1.19.4": "portal"
- },
- "minecraft:stonecutter": {
- "1.19.4": "stone"
- },
- "minecraft:white_wool": {
- "1.19.4": "wool"
- },
- "minecraft:smooth_stone_slab": {
- "1.19.4": "stone"
- },
- "minecraft:light_gray_stained_glass": {
- "1.19.4": "glass"
- },
- "minecraft:yellow_shulker_box": {
- "1.13.2": "stone",
- "1.19.4": "shulker_box"
- },
- "minecraft:lime_candle_cake": {
- "1.19.4": "cake"
- },
- "minecraft:spruce_wall_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:potted_warped_roots": {
- "1.19.4": "decoration"
- },
- "minecraft:acacia_trapdoor": {
- "1.19.4": "wood"
- },
- "minecraft:pink_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:cave_vines": {
- "1.19.4": "plant"
- },
- "minecraft:cut_sandstone_slab": {
- "1.19.4": "stone"
- },
- "minecraft:dirt": {
- "1.19.4": "soil"
- },
- "minecraft:deepslate_tile_slab": {
- "1.19.4": "stone"
- },
- "minecraft:stripped_acacia_wood": {
- "1.19.4": "wood"
- },
- "minecraft:stripped_cherry_log": {
- "1.19.4": "wood"
- },
- "minecraft:mossy_stone_brick_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:kelp_plant": {
- "1.19.4": "underwater_plant"
- },
- "minecraft:spruce_pressure_plate": {
- "1.19.4": "wood"
- },
- "minecraft:crimson_planks": {
- "1.19.4": "nether_wood"
- },
- "minecraft:potted_orange_tulip": {
- "1.19.4": "decoration"
- },
- "minecraft:potted_brown_mushroom": {
- "1.19.4": "decoration"
- },
- "minecraft:dead_tube_coral_fan": {
- "1.19.4": "stone"
- },
- "minecraft:brown_mushroom_block": {
- "1.19.4": "wood"
- },
- "minecraft:tripwire_hook": {
- "1.19.4": "decoration"
- },
- "minecraft:black_glazed_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:crimson_slab": {
- "1.19.4": "nether_wood"
- },
- "minecraft:polished_deepslate_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:torchflower": {
- "1.19.4": "plant"
- },
- "minecraft:prismarine_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:magenta_stained_glass": {
- "1.19.4": "glass"
- },
- "minecraft:acacia_slab": {
- "1.19.4": "wood"
- },
- "minecraft:smooth_red_sandstone_slab": {
- "1.19.4": "stone"
- },
- "minecraft:lime_banner": {
- "1.19.4": "wood"
- },
- "minecraft:stripped_bamboo_block": {
- "1.19.4": "wood"
- },
- "minecraft:potted_acacia_sapling": {
- "1.19.4": "decoration"
- },
- "minecraft:stripped_jungle_log": {
- "1.19.4": "wood"
- },
- "minecraft:pink_stained_glass_pane": {
- "1.19.4": "glass"
- },
- "minecraft:black_wall_banner": {
- "1.19.4": "wood"
- },
- "minecraft:horn_coral_fan": {
- "1.19.4": "underwater_plant"
- },
- "minecraft:nether_wart_block": {
- "1.19.4": "solid_organic"
- },
- "minecraft:campfire": {
- "1.19.4": "wood"
- },
- "minecraft:light_blue_bed": {
- "1.19.4": "wool"
- },
- "minecraft:light_gray_shulker_box": {
- "1.13.2": "stone",
- "1.19.4": "shulker_box"
- },
- "minecraft:jack_o_lantern": {
- "1.19.4": "gourd"
- },
- "minecraft:pink_stained_glass": {
- "1.19.4": "glass"
- },
- "minecraft:cyan_concrete": {
- "1.19.4": "stone"
- },
- "minecraft:cyan_candle_cake": {
- "1.19.4": "cake"
- },
- "minecraft:wall_torch": {
- "1.19.4": "decoration"
- },
- "minecraft:gray_carpet": {
- "1.19.4": "carpet"
- },
- "minecraft:beehive": {
- "1.19.4": "wood"
- },
- "minecraft:mud_bricks": {
- "1.19.4": "stone"
- },
- "minecraft:white_banner": {
- "1.19.4": "wood"
- },
- "minecraft:bone_block": {
- "1.19.4": "stone"
- },
- "minecraft:smooth_sandstone_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:netherite_block": {
- "1.19.4": "metal"
- },
- "minecraft:cyan_banner": {
- "1.19.4": "wood"
- },
- "minecraft:diorite_wall": {
- "1.19.4": "stone"
- },
- "minecraft:jigsaw": {
- "1.19.4": "metal"
- },
- "minecraft:weathered_cut_copper_slab": {
- "1.19.4": "metal"
- },
- "minecraft:red_stained_glass": {
- "1.19.4": "glass"
- },
- "minecraft:chiseled_red_sandstone": {
- "1.19.4": "stone"
- },
- "minecraft:yellow_candle": {
- "1.19.4": "decoration"
- },
- "minecraft:granite_slab": {
- "1.19.4": "stone"
- },
- "minecraft:cyan_candle": {
- "1.19.4": "decoration"
- },
- "minecraft:yellow_bed": {
- "1.19.4": "wool"
- },
- "minecraft:mud_brick_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:lime_stained_glass_pane": {
- "1.19.4": "glass"
- },
- "minecraft:black_candle_cake": {
- "1.19.4": "cake"
- },
- "minecraft:potted_flowering_azalea_bush": {
- "1.19.4": "decoration"
- },
- "minecraft:warped_stem": {
- "1.19.4": "nether_wood"
- },
- "minecraft:crimson_fence": {
- "1.19.4": "nether_wood"
- },
- "minecraft:creeper_head": {
- "1.19.4": "decoration"
- },
- "minecraft:oxidized_copper": {
- "1.19.4": "metal"
- },
- "minecraft:dead_bush": {
- "1.19.4": "replaceable_plant"
- },
- "minecraft:lily_pad": {
- "1.19.4": "plant"
- },
- "minecraft:potted_red_tulip": {
- "1.19.4": "decoration"
- },
- "minecraft:birch_log": {
- "1.19.4": "wood"
- },
- "minecraft:spruce_stairs": {
- "1.19.4": "wood"
- },
- "minecraft:chiseled_quartz_block": {
- "1.19.4": "stone"
- },
- "minecraft:dead_fire_coral_wall_fan": {
- "1.19.4": "stone"
- },
- "minecraft:tube_coral_wall_fan": {
- "1.19.4": "underwater_plant"
- },
- "minecraft:dark_oak_slab": {
- "1.19.4": "wood"
- },
- "minecraft:orange_candle_cake": {
- "1.19.4": "cake"
- },
- "minecraft:smooth_sandstone_slab": {
- "1.19.4": "stone"
- },
- "minecraft:bamboo_pressure_plate": {
- "1.19.4": "wood"
- },
- "minecraft:smooth_stone": {
- "1.19.4": "stone"
- },
- "minecraft:cobblestone": {
- "1.19.4": "stone"
- },
- "minecraft:deepslate_gold_ore": {
- "1.19.4": "stone"
- },
- "minecraft:light": {
- "1.19.4": "air"
- },
- "minecraft:prismarine_wall": {
- "1.19.4": "stone"
- },
- "minecraft:yellow_carpet": {
- "1.19.4": "carpet"
- },
- "minecraft:detector_rail": {
- "1.19.4": "decoration"
- },
- "minecraft:cherry_pressure_plate": {
- "1.19.4": "wood"
- },
- "minecraft:verdant_froglight": {
- "1.19.4": "froglight"
- },
- "minecraft:dead_bubble_coral": {
- "1.19.4": "stone"
- },
- "minecraft:grindstone": {
- "1.19.4": "repair_station"
- },
- "minecraft:stripped_warped_hyphae": {
- "1.19.4": "nether_wood"
- },
- "minecraft:waxed_cut_copper_slab": {
- "1.19.4": "metal"
- },
- "minecraft:acacia_stairs": {
- "1.19.4": "wood"
- },
- "minecraft:orange_stained_glass": {
- "1.19.4": "glass"
- },
- "minecraft:magenta_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:mangrove_wood": {
- "1.19.4": "wood"
- },
- "minecraft:mossy_stone_bricks": {
- "1.19.4": "stone"
- },
- "minecraft:chorus_plant": {
- "1.19.4": "plant"
- },
- "minecraft:deepslate_brick_wall": {
- "1.19.4": "stone"
- },
- "minecraft:zombie_wall_head": {
- "1.19.4": "decoration"
- },
- "minecraft:large_fern": {
- "1.19.4": "replaceable_plant"
- },
- "minecraft:polished_blackstone_brick_wall": {
- "1.19.4": "stone"
- },
- "minecraft:sculk": {
- "1.19.4": "sculk"
- },
- "minecraft:gray_concrete": {
- "1.19.4": "stone"
- },
- "minecraft:pumpkin_stem": {
- "1.19.4": "plant"
- },
- "minecraft:dead_fire_coral": {
- "1.19.4": "stone"
- },
- "minecraft:hanging_roots": {
- "1.19.4": "replaceable_plant"
- },
- "minecraft:tall_grass": {
- "1.19.4": "replaceable_plant"
- },
- "minecraft:white_candle_cake": {
- "1.19.4": "cake"
- },
- "minecraft:polished_diorite_slab": {
- "1.19.4": "stone"
- },
- "minecraft:jukebox": {
- "1.19.4": "wood"
- },
- "minecraft:light_gray_glazed_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:dead_brain_coral_fan": {
- "1.19.4": "stone"
- },
- "minecraft:waxed_oxidized_cut_copper_stairs": {
- "1.19.4": "metal"
- },
- "minecraft:structure_block": {
- "1.19.4": "metal"
- },
- "minecraft:quartz_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:brown_wall_banner": {
- "1.19.4": "wood"
- },
- "minecraft:dead_bubble_coral_fan": {
- "1.19.4": "stone"
- },
- "minecraft:fire_coral_wall_fan": {
- "1.19.4": "underwater_plant"
- },
- "minecraft:basalt": {
- "1.19.4": "stone"
- },
- "minecraft:polished_blackstone_pressure_plate": {
- "1.19.4": "stone"
- },
- "minecraft:piston": {
- "1.19.4": "piston"
- },
- "minecraft:crying_obsidian": {
- "1.19.4": "stone"
- },
- "minecraft:mushroom_stem": {
- "1.19.4": "wood"
- },
- "minecraft:bamboo_planks": {
- "1.19.4": "wood"
- },
- "minecraft:end_stone_bricks": {
- "1.19.4": "stone"
- },
- "minecraft:cyan_shulker_box": {
- "1.13.2": "stone",
- "1.19.4": "shulker_box"
- },
- "minecraft:red_mushroom": {
- "1.19.4": "plant"
- },
- "minecraft:brown_candle_cake": {
- "1.19.4": "cake"
- },
- "minecraft:gold_block": {
- "1.19.4": "metal"
- },
- "minecraft:respawn_anchor": {
- "1.19.4": "stone"
- },
- "minecraft:infested_stone": {
- "1.19.4": "organic_product"
- },
- "minecraft:black_shulker_box": {
- "1.13.2": "stone",
- "1.19.4": "shulker_box"
- },
- "minecraft:purple_glazed_terracotta": {
- "1.19.4": "stone"
- },
- "minecraft:cherry_slab": {
- "1.19.4": "wood"
- },
- "minecraft:flowering_azalea": {
- "1.19.4": "plant"
- },
- "minecraft:stripped_spruce_wood": {
- "1.19.4": "wood"
- },
- "minecraft:brain_coral_block": {
- "1.19.4": "stone"
- },
- "minecraft:light_blue_concrete_powder": {
- "1.19.4": "aggregate"
- },
- "minecraft:oak_trapdoor": {
- "1.19.4": "wood"
- },
- "minecraft:blackstone_slab": {
- "1.19.4": "stone"
- },
- "minecraft:wheat": {
- "1.19.4": "plant"
- },
- "minecraft:scaffolding": {
- "1.19.4": "decoration"
- },
- "minecraft:polished_granite_stairs": {
- "1.19.4": "stone"
- },
- "minecraft:orange_stained_glass_pane": {
- "1.19.4": "glass"
- },
- "minecraft:emerald_block": {
- "1.19.4": "metal"
- },
- "minecraft:stripped_oak_wood": {
- "1.19.4": "wood"
- },
- "minecraft:potted_bamboo": {
- "1.19.4": "decoration"
- },
- "minecraft:red_candle_cake": {
- "1.19.4": "cake"
- },
- "minecraft:iron_bars": {
- "1.19.4": "metal"
- },
- "minecraft:sand": {
- "1.19.4": "aggregate"
- },
- "minecraft:oak_hanging_sign": {
- "1.19.4": "wood"
- },
- "minecraft:chiseled_sandstone": {
- "1.19.4": "stone"
- },
- "minecraft:air": {
- "1.19.4": "air"
- },
- "minecraft:magma_block": {
- "1.19.4": "stone"
- },
- "minecraft:redstone_ore": {
- "1.19.4": "stone"
- },
- "minecraft:oxidized_cut_copper_stairs": {
- "1.19.4": "metal"
- },
- "minecraft:dead_horn_coral_block": {
- "1.19.4": "stone"
- },
- "minecraft:acacia_door": {
- "1.19.4": "wood"
- },
- "minecraft:dark_oak_sign": {
- "1.19.4": "wood"
- },
- "minecraft:exposed_copper": {
- "1.19.4": "metal"
- },
- "minecraft:brown_concrete_powder": {
- "1.19.4": "aggregate"
- },
- "minecraft:poppy": {
- "1.19.4": "plant"
- },
- "minecraft:cut_red_sandstone": {
- "1.19.4": "stone"
- },
- "minecraft:lapis_ore": {
- "1.19.4": "stone"
- },
- "minecraft:smooth_sandstone": {
- "1.19.4": "stone"
- },
- "minecraft:turtle_egg": {
- "1.19.4": "egg"
- },
- "minecraft:bamboo_door": {
- "1.19.4": "wood"
- },
- "minecraft:dark_oak_trapdoor": {
- "1.19.4": "wood"
- },
- "minecraft:purple_stained_glass_pane": {
- "1.19.4": "glass"
- },
- "minecraft:attached_melon_stem": {
- "1.19.4": "plant"
- },
- "minecraft:piglin_wall_head": {
- "1.19.4": "decoration"
- },
- "minecraft:dark_oak_stairs": {
- "1.19.4": "wood"
- },
- "minecraft:orange_tulip": {
- "1.19.4": "plant"
- },
- "minecraft:copper_ore": {
- "1.19.4": "stone"
- },
- "minecraft:packed_mud": {
- "1.19.4": "soil"
- },
- "minecraft:mycelium": {
- "1.19.4": "solid_organic"
- },
- "minecraft:short_grass": {
- "1.19.4": "replaceable_plant"
- },
- "minecraft:warped_roots": {
- "1.19.4": "nether_shoots"
- },
- "minecraft:frosted_ice": {
- "1.19.4": "ice"
- },
- "minecraft:bricks": {
- "1.19.4": "stone"
- },
- "minecraft:oak_pressure_plate": {
- "1.19.4": "wood"
- },
- "minecraft:magenta_carpet": {
- "1.19.4": "carpet"
- },
- "minecraft:decorated_pot": {
- "1.19.4": "decorated_pot"
- },
- "minecraft:purpur_slab": {
- "1.19.4": "stone"
- },
- "minecraft:stone_brick_wall": {
- "1.19.4": "stone"
- },
- "minecraft:structure_void": {
- "1.19.4": "structure_void"
- },
- "minecraft:magenta_shulker_box": {
- "1.13.2": "stone",
- "1.19.4": "shulker_box"
- },
- "minecraft:brain_coral_wall_fan": {
- "1.19.4": "underwater_plant"
- },
- "minecraft:ender_chest": {
- "1.19.4": "stone"
- },
- "minecraft:orange_concrete": {
- "1.19.4": "stone"
- },
- "minecraft:end_stone_brick_wall": {
- "1.19.4": "stone"
- },
- "minecraft:big_dripleaf": {
- "1.19.4": "plant"
- },
- "minecraft:green_wall_banner": {
- "1.19.4": "wood"
- },
- "minecraft:red_concrete": {
- "1.19.4": "stone"
- },
- "minecraft:nether_portal": {
- "1.19.4": "portal"
- },
- "minecraft:fern": {
- "1.19.4": "replaceable_plant"
- },
- "minecraft:nether_quartz_ore": {
- "1.19.4": "stone"
- },
- "minecraft:soul_campfire": {
- "1.19.4": "wood"
- },
- "minecraft:red_banner": {
- "1.19.4": "wood"
- },
- "minecraft:repeater": {
- "1.19.4": "decoration"
- },
- "minecraft:dripstone_block": {
- "1.19.4": "stone"
- },
- "minecraft:pink_wool": {
- "1.19.4": "wool"
- },
- "minecraft:carrots": {
- "1.19.4": "plant"
- },
- "minecraft:light_blue_stained_glass": {
- "1.19.4": "glass"
- },
- "minecraft:purple_candle": {
- "1.19.4": "decoration"
- },
- "minecraft:birch_wall_sign": {
- "1.19.4": "wood"
- },
- "minecraft:nether_sprouts": {
- "1.19.4": "nether_shoots"
- },
- "minecraft:light_gray_candle": {
- "1.19.4": "decoration"
- },
- "minecraft:stripped_dark_oak_log": {
- "1.19.4": "wood"
- },
- "minecraft:potted_dark_oak_sapling": {
- "1.19.4": "decoration"
- },
- "minecraft:cut_copper_slab": {
- "1.19.4": "metal"
- },
- "minecraft:oak_wall_sign": {
- "1.19.4": "wood"
- },
- "minecraft:bubble_coral": {
- "1.19.4": "underwater_plant"
- },
- "minecraft:bamboo_mosaic": {
- "1.19.4": "wood"
- },
- "minecraft:twisting_vines": {
- "1.19.4": "plant"
- },
- "minecraft:pumpkin": {
- "1.19.4": "gourd"
- },
- "minecraft:spruce_fence": {
- "1.19.4": "wood"
- },
- "minecraft:bamboo_sign": {
- "1.19.4": "wood"
- },
- "minecraft:ice": {
- "1.19.4": "ice"
- },
- "minecraft:large_amethyst_bud": {
- "1.19.4": "amethyst"
- },
- "minecraft:coarse_dirt": {
- "1.19.4": "soil"
- },
- "minecraft:cherry_fence": {
- "1.19.4": "wood"
- },
- "minecraft:end_portal_frame": {
- "1.19.4": "stone"
- }
- }
-}
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/icons/icon.png b/ViaProxy/src/main/resources/assets/viaproxy/icons/icon.png
deleted file mode 100644
index ea90f52..0000000
Binary files a/ViaProxy/src/main/resources/assets/viaproxy/icons/icon.png and /dev/null differ
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/af_ZA.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/af_ZA.properties
deleted file mode 100644
index b1e9b04..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/language/af_ZA.properties
+++ /dev/null
@@ -1,97 +0,0 @@
-language.name=Afrikaans (Suid-Afrika)
-generic.cancel=Kanselleer
-generic.could_not_open_url=Kon nie die skakel oopmaak nie: %s
-tab.general.name=Algemeen
-tab.general.server_address.label=Serveradres:
-tab.general.server_address.tooltip=Ondersteunde formate:\n - adres\n - adres:poort\n - ClassiCube Direct URL
-tab.general.server_version.label=Server Weergawe:
-tab.general.minecraft_account.label=Minecraft-rekening:
-tab.general.minecraft_account.option_no_account=Gebruik geen rekening nie
-tab.general.minecraft_account.option_select_account=Gebruik geselekteerde rekening
-tab.general.betacraft_auth.label=BetaCraft-autentikasie (Klassiek)
-tab.general.betacraft_auth.tooltip=Die aktivering van BetaCraft-autentikasie stel jou in staat om by klassieke bedieners aan te sluit wat aanlynmodus geaktiveer het.
-tab.general.state.loading=Laai ViaProxy...
-tab.general.state.start=Begin
-tab.general.state.starting=Begin...
-tab.general.state.stop=Stop
-tab.general.state.running=ViaProxy is aan die loop! Koppel met Minecraft %s aan %s
-tab.general.warning.ban_warning.line1=ViaProxy kan anti-cheat-stelsels aktiveer weens verskille in blokke, items, beweging en ander aspekte tussen weergawes.
-tab.general.warning.bedrock_warning.line1=ViaBedrock is tans in 'n baie vroeë ontwikkelingsfase en is nog nie gereed vir algemene gebruik nie.
-tab.general.warning.risk=Gebruik op eie risiko!
-tab.general.error.no_server_version_selected=Kies asseblief 'n bedienerweergawe!
-tab.general.error.invalid_classicube_url=Ongeldige ClassiCube Direct URL!
-tab.general.error.invalid_server_address=Ongeldige bedieneradres!
-tab.general.error.invalid_bind_address=Ongeldige bindadres!
-tab.general.error.invalid_proxy_url=Ongeldige proxy-URL!
-tab.general.error.failed_to_start=Kon ViaProxy nie begin nie! Maak seker dat die plaaslike poort nie reeds in gebruik is nie en probeer weer.
-tab.advanced.name=Gevorderd
-tab.advanced.bind_address.label=Bindadres:
-tab.advanced.bind_address.tooltip=Die adres waar ViaProxy inkomende verbindings moet aanvaar.
-tab.advanced.proxy_url.label=Proxy-URL:
-tab.advanced.proxy_url.tooltip=URL van 'n SOCKS(4/5)/HTTP(S)-proxy wat vir TCP-verbindings gebruik sal word.\nOndersteunde formate:\n - tipe://adres:poort\n - tipe://gebruikersnaam:wagwoord@adres:poort
-tab.advanced.proxy_online_mode.label=Proxy-aanlynmodus
-tab.advanced.proxy_online_mode.tooltip=Die aktivering van Proxy-aanlynmodus vereis dat jou kliënt 'n geldige Minecraft-rekening het.\nProxy-aanlynmodus stel jou in staat om velde op aanlynmodus-bedieners te sien en die ondertekende gespreksfunksies te gebruik.
-tab.advanced.legacy_skin_loading.label=Verouderde Veldlaaiing
-tab.advanced.legacy_skin_loading.tooltip=Die aktivering van Verouderde Veldlaaiing stel jou in staat om velde op bedieners van weergawe <= 1.6.4 te sien.
-tab.advanced.chat_signing.label=Gesprekondertekening
-tab.advanced.chat_signing.tooltip=Aktiveer die stuur van ondertekende gesprekboodskappe op >= 1.19 bedieners.
-tab.advanced.ignore_packet_translation_errors.label=Ignoreer pakketvertalingsfoute
-tab.advanced.ignore_packet_translation_errors.tooltip=Die aktivering hiervan sal voorkom dat jy van die bediener ontkoppel word wanneer 'n pakketvertalingsfout voorkom, en sal eerder net die fout in die konsole afdruk.\nDit kan probleme veroorsaak, afhangende van die tipe pakket wat nie vertaal kon word nie.
-tab.advanced.allow_beta_pinging.label=Laat <= b1.7.3-pinging toe
-tab.advanced.allow_beta_pinging.tooltip=Die aktivering hiervan sal jou toelaat om <= b1.7.3-bedieners te ping. Dit kan probleme veroorsaak met bedieners wat te gereelde verbindings blokkeer.
-tab.advanced.simple_voice_chat_support.label=Eenvoudige Stemgesprek-ondersteuning
-tab.advanced.simple_voice_chat_support.tooltip=Aktiveer die hantering en herskryf van Simple Voice Chat-mod-pakkette.
-tab.advanced.fake_accept_resource_packs.label=Vervaardig aanvaarding van hulpbronpakkette
-tab.advanced.fake_accept_resource_packs.tooltip=Aanvaar hulpbronpakkette van die bediener sonder om 'n vra aan die kliënt te vertoon.\nDit is nodig vir bedieners wat 'n hulpbronpak vereis, maar die kliënt kan dit nie laai weens weergaweverskille nie.
-tab.advanced.create_viaversion_dump.label=Skep ViaVersion-afvoer
-tab.advanced.create_viaversion_dump.success=ViaVersion-afvoerskakel na knipbord gekopieer.
-tab.advanced.upload_latest_log.label=Laai nuutste loglêer op
-tab.advanced.upload_latest_log.success=Loglêer op %s opgelaai (na knipbord gekopieer)
-tab.advanced.upload_latest_log.error_generic=Die loglêer kon nie opgelaai word nie: %s
-tab.advanced.upload_latest_log.error_not_found=Die loglêer kon nie gevind word nie.
-tab.accounts.name=Rekeninge
-tab.accounts.description.line1=Om by aanlynmodus-bedieners aan te sluit, moet jy 'n Minecraft-rekening byvoeg vir ViaProxy om te gebruik. Jy kan 'n rekening kies deur regs daarop te klik. Standaard sal die eerste een gebruik word.
-tab.accounts.list.context_menu.select=Kies Rekening
-tab.accounts.list.context_menu.remove=Verwyder
-tab.accounts.list.context_menu.move_up=Skuif op ↑
-tab.accounts.list.context_menu.move_down=Skuif af ↓
-tab.accounts.add.title=Voeg Rekening By
-tab.accounts.add_offline.label=Aflyn-rekening
-tab.accounts.add_offline.enter_username=Voer jou aflynmodus-gebruikersnaam in:
-tab.accounts.add_microsoft.label=Microsoft-rekening
-tab.accounts.add_bedrock.label=Bedrock-rekening
-tab.accounts.add.success=Die rekening %s is suksesvol bygevoeg.
-tab.accounts.add.timeout=Die aanmeldversoek het uitgetree.\nMeld asseblief binne %s sekondes aan.
-tab.realms.name=Realms
-tab.realms.error_generic=Realms-versoek kon nie hanteer word nie: %s
-tab.realms.error_generic_label=An Onbekende fout het voorgekom
-tab.realms.error_account=Kon nie die geselekteerde rekening verfris nie. Dit kan veroorsaak word deur verouderde rekeningtokens of tempobeperkings. Wag 'n paar sekondes en probeer weer. As die probleem voortduur, verwyder en voeg jou rekening weer by.
-tab.realms.error_account_label=Rekeningfout
-tab.realms.no_account=Geen rekening gekies nie
-tab.realms.unsupported_account=Nie-ondersteunde rekening gekies
-tab.realms.refreshing_account=Rekening word verfris...
-tab.realms.availability_check=Beskikbaarheid word nagegaan...
-tab.realms.unavailable=Jou ViaProxy is verouderd en nie versoenbaar met Minecraft Realms nie.\nGebruik asseblief die nuutste weergawe van ViaProxy.
-tab.realms.loading_worlds=Laai wêrelde...
-tab.realms.no_worlds=Geen wêrelde gevind nie
-tab.realms.account=Rekening: %s
-tab.realms.release=Vrystelling
-tab.realms.snapshot=Momentopname
-tab.realms.join=Sluit aan
-tab.realms.joining=Sluit aan...
-tab.realms.accept_tos=Om Minecraft Realms te gebruik, moet jy die Diensvoorwaardes aanvaar: %s
-tab.realms.expired=Hierdie Realm is verval
-tab.realms.incompatible=Hierdie Realms-weergawe van Minecraft is te oud of te nuut
-tab.ui_settings.name=UI-instellings
-tab.ui_settings.language.label=Taal:
-tab.ui_settings.language.completion=%s vertaal
-tab.ui_settings.language.success=Taal is verander na %s (%s). ViaProxy sal nou herbegin!
-tab.ui_settings.crowdin.info=Ontbreek jou taal of is dit onvolledig? Help ons om ViaProxy op Crowdin te vertaal!
-tab.ui_settings.crowdin.link=Klik hier om na Crowdin te gaan
-popup.login_account.title=Voeg Rekening By
-popup.login_account.instructions.browser=Maak asseblief die volgende URL in jou blaaier oop:
-popup.login_account.instructions.close=Die opspringvenster sal outomaties sluit nadat jy aangemeld is.
-popup.download.title=Laai af...
-popup.update.info=Jy gebruik 'n verouderde weergawe van ViaProxy!\nHuidige weergawe: %s\nNuutste weergawe: %s
-popup.update.question=Wil jy opdater?
-popup.update.success=Die nuutste weergawe van ViaProxy is afgelaai. ViaProxy sal nou herbegin!
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/ar_SA.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/ar_SA.properties
deleted file mode 100644
index 2ea3637..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/language/ar_SA.properties
+++ /dev/null
@@ -1,95 +0,0 @@
-language.name=العربية (العالم العربي)
-generic.cancel=إلغاء
-generic.could_not_open_url=لم يمكن فتح الرابط: %s
-tab.general.name=عام
-tab.general.server_address.label=عنوان الخادم:
-tab.general.server_address.tooltip=الصيغ المدعومة:\n- عنوان\n- عنوان:منفذ\n- رابط ClassiCube مباشر
-tab.general.server_version.label=إصدار الخادم:
-tab.general.minecraft_account.label=حساب Minecraft:
-tab.general.minecraft_account.option_no_account=لا تستعمل حساب
-tab.general.minecraft_account.option_select_account=استعمل الحساب المُحدد
-tab.general.betacraft_auth.label=مصادقة BetaCraft (كلاسيك)
-tab.general.betacraft_auth.tooltip=تفعيل مصادقة BetaCraft حتى تتمكن من الدخول لسيرفَرات الكلاسيك الذي تستعمل online mode.
-tab.general.state.loading=تحميل ViaProxy...
-tab.general.state.start=إبدأ
-tab.general.state.starting=جارٍ البدء...
-tab.general.state.stop=إيقاف
-tab.general.state.running=ViaProxy يعمل حالياً! اتصل باستخدام Minecraft %s إلى %s
-tab.general.warning.ban_warning.line1=قد يقوم ViaProxy بإثارة الـanti-cheats, بسبب الإختلافات ما بين الإصدارات.
-tab.general.warning.bedrock_warning.line1=ViaBedrock حاليًا في حالة تطوير مبكرة جدًا وليس جاهز للاستخدام العام.
-tab.general.warning.risk=استخدمه على مسؤوليتك الشخصية!
-tab.general.error.no_server_version_selected=يرجى اختيار إصدار السيرفَر!
-tab.general.error.invalid_classicube_url=رابط ClassiCube مباشر خير صحيح!
-tab.general.error.invalid_server_address=عنوان سيرفَر غير صحيح!
-tab.general.error.invalid_bind_address=عنوان الربط غير صحيح!
-tab.general.error.invalid_proxy_url=عنوان بروكسي غير صحيح!
-tab.general.error.failed_to_start=فشل بدأ ViaProxy! تأكد أن المنفذ المحلي ليس قيد الاستخدام بالفعل وحاول مرة أخرى.
-tab.advanced.name=إعدادات متقدمة
-tab.advanced.bind_address.label=عنوان الربط:
-tab.advanced.bind_address.tooltip=العنوان الذي يجب استقبال اتصالات ViaProxy من خلاله.
-tab.advanced.proxy_url.label=عنوان البروكسي:
-tab.advanced.proxy_url.tooltip=رابط بروكسي من النوع SOCKS(4/5)/HTTP(s) الذي سيُستخدم لإتصالات TCP.\nالصيغ المدعومة:\n- النوع://عنوان:منفذ\n- النوع://اسم مستخدم:باسوُرد@عنوان:منفذ
-tab.advanced.proxy_online_mode.label=امرار Online Mode
-tab.advanced.proxy_online_mode.tooltip=تفعيل امرار Online Mode يتطلب من العميل أن يكون لديه حساب Minecraft صالح.\nامرار Online Mode يسمح لك برؤية جلود اللاعبين على سيرفَرات التي تستعمل Online Mode ويسمح لك بإستعمال مميزات الدردشة الموقعة.
-tab.advanced.legacy_skin_loading.label=تحميل الجلود التراثية
-tab.advanced.legacy_skin_loading.tooltip=تفعيل تحميل الجلود التراثية يسمح لك برؤية جلود اللاعبين على سيرفَرات 1.6.4 أو أقدم.
-tab.advanced.chat_signing.label=الدردشة الموقعة
-tab.advanced.chat_signing.tooltip=يسمح بإرسال رسائل الدردشة الموقعة على سيرفَرات 1.19 أو أحدث.
-tab.advanced.ignore_packet_translation_errors.label=تجاهل أخطاء ترجمة الحزم
-tab.advanced.ignore_packet_translation_errors.tooltip=تمكين هذا سيمنع الانفصال عن الخادم عندما يحدث خطأ في ترجمة الحزمة، وبدلاً من ذلك سيتم فقط طباعة الخطأ في وحدة التحكم.\nقد يسبب هذا مشاكل حسب نوع الحزمة التي فشلت في الترجمة.
-tab.advanced.simple_voice_chat_support.label=دعم Simple Voice Chat
-tab.advanced.simple_voice_chat_support.tooltip=يسمح بمعالجة وإعادة كتابة حزم مود Simple Voice Chat.
-tab.advanced.fake_accept_resource_packs.label=قبول مزيف لحزم الموارد
-tab.advanced.fake_accept_resource_packs.tooltip=يقبل حزم الموارد من الخادم بدون إظهار رسالة تأكيد للعميل.\nهذا مطلوب للخوادم التي تتطلب حزمة موارد، لكن العميل لا يستطيع تحميلها بسبب اختلاف الإصدارات.
-tab.advanced.create_viaversion_dump.label=إنشاء تفريغ ViaVersion
-tab.advanced.create_viaversion_dump.success=تم نسخ رابط تفريغ ViaVersion إلى الحافظة.
-tab.advanced.upload_latest_log.label=رفع أحدث ملف سجل
-tab.advanced.upload_latest_log.success=تم رفع ملف السجل إلى %s (تم نسخه إلى الحافظة)
-tab.advanced.upload_latest_log.error_generic=لم يتمكن من رفع ملف السجل: %s
-tab.advanced.upload_latest_log.error_not_found=لم يتم العثور على ملف السجل.
-tab.accounts.name=الحسابات
-tab.accounts.description.line1=للانضمام إلى خوادم الوضع الأونلاين، يجب إضافة حساب ماينكرافت ليستخدمه ViaProxy. يمكنك اختيار حساب بالنقر بزر الفأرة الأيمن عليه. بشكل افتراضي، سيتم استخدام الحساب الأول.
-tab.accounts.list.context_menu.select=اختر الحساب
-tab.accounts.list.context_menu.remove=حذف
-tab.accounts.list.context_menu.move_up=تحريك ﻷعلى ↑
-tab.accounts.list.context_menu.move_down=تحريك ﻷسفل ↓
-tab.accounts.add.title=إضافة حساب
-tab.accounts.add_offline.label=حساب Offline
-tab.accounts.add_offline.enter_username=أدخل اسم المستخدم الـOffline:
-tab.accounts.add_microsoft.label=حساب مايكروسوفت
-tab.accounts.add_bedrock.label=حساب Bedrock
-tab.accounts.add.success=تم إضافة الحساب %s بنجاح.
-tab.accounts.add.timeout=طلب تسجيل الدخول قد انتهى صلاحيته.\nيرجى تسجيل الدخول مرة أخري خلال %s ثواني.
-tab.realms.name=Realms
-tab.realms.error_generic=طلب الـRealm لم يمكن التعامل معه: %s
-tab.realms.error_generic_label=حصل خطأ غير معروف
-tab.realms.error_account=لم يتمكن من تحديث الحساب المختار. قد يكون السبب رموز الحساب القديمة أو حدود السرعة. انتظر بضع ثوانٍ وحاول مرة أخرى. إذا استمرت المشكلة، احذف الحساب وأعد إضافته.
-tab.realms.error_account_label=خطأ بالحساب
-tab.realms.no_account=لم يتم اختيار حساب
-tab.realms.unsupported_account=تم اختيار حساب غير مدعوم
-tab.realms.refreshing_account=جاري تحديث الحساب...
-tab.realms.availability_check=التحقّق من التّوافر...
-tab.realms.unavailable=اصدار ViaProxy خاصتك قديم ولا يعمل مع Minecraft Realms.\nيرجى استعمال احدث إصدار من ViaProxy.
-tab.realms.loading_worlds=جاري تحميل العوالم...
-tab.realms.no_worlds=لا يمكن العثور على عوالم
-tab.realms.account=الحساب: %s
-tab.realms.release=حديث
-tab.realms.snapshot=إصدار مبدئي
-tab.realms.join=إنضمام
-tab.realms.joining=جاري الانضمام...
-tab.realms.accept_tos=لاستخدام ماينكرافت ريالمز يجب قبول شروط الخدمة: %s
-tab.realms.expired=هذا الـRealm منتهي الصلاحية
-tab.realms.incompatible=إصدار Minecraft لهذا الـRealm قديم جدًا أو حديث جدًا
-tab.ui_settings.name=إعدادات الواجهة
-tab.ui_settings.language.label=اللغة:
-tab.ui_settings.language.completion=%s مترجم
-tab.ui_settings.language.success=تم تغيير اللغة إلى %s (%s) سيتم. سيتم إعادة تشغيل ViaProxy!
-tab.ui_settings.crowdin.info=هل لغتك غير موجودة أو غير مكتملة؟ ساعدنا بترجمة ViaProxy على Crowdin!
-tab.ui_settings.crowdin.link=إضغط هنا للذهاب إلى Crowdin
-popup.login_account.title=إضافة حساب
-popup.login_account.instructions.browser=يرجى فتح الرابط المباشر الآتي في متَصَفِحك:
-popup.login_account.instructions.close=سيتم إغلاق النافذة بعد أن يتم تسجيل الدخول.
-popup.download.title=جاري التنزيل...
-popup.update.info=انت تستعمل إصدار قديم من ViaProxy!\nالإصدار الحالي: %s\nاحدث إصدار: %s
-popup.update.question=هل تريد التحديث؟
-popup.update.success=تم تنزيل احدث إصدار لـViaProxy. سيتم إعادة تشغيل ViaProxy!
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/bg_BG.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/bg_BG.properties
deleted file mode 100644
index e69de29..0000000
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/ca_ES.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/ca_ES.properties
deleted file mode 100644
index e69de29..0000000
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/cs_CZ.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/cs_CZ.properties
deleted file mode 100644
index 4d541c3..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/language/cs_CZ.properties
+++ /dev/null
@@ -1,86 +0,0 @@
-language.name=Čeština (Česko)
-generic.cancel=Zrušit
-generic.could_not_open_url=Nelze otevřít odkaz: %s
-tab.general.name=Obecné
-tab.general.server_address.label=Adresa serveru:
-tab.general.server_address.tooltip=Podporované formáty:\n- adresa\n- addresa:port\n- ClassiCube Přímá URL
-tab.general.server_version.label=Verze serveru:
-tab.general.minecraft_account.label=Minecraft Účet:
-tab.general.minecraft_account.option_no_account=Nepoužívat účet
-tab.general.minecraft_account.option_select_account=Použít vybraný účet
-tab.general.betacraft_auth.label=BetaCraft Auth (Classic)
-tab.general.betacraft_auth.tooltip=Povolování BetaCraft Authentikace vám umožní připojit se na BetaCraft servery se zapnutým online módem.
-tab.general.state.loading=Načítání ViaProxy...
-tab.general.state.start=Start
-tab.general.state.starting=Startování...
-tab.general.state.stop=Zastavit
-tab.general.state.running=ViaProxy beží! Připojte se s Minecraftem %s na %s
-tab.general.warning.ban_warning.line1=ViaProxy může způsobit problém s Anti-Cheaty, kvůli blockům, itemům, pohybu a jinýmy rozdíly mezi verzemi.
-tab.general.warning.bedrock_warning.line1=ViaBedrock je momentálně velmi brzo ve vývojovém procesu a není vhoden pro obecné použití.
-tab.general.warning.risk=Používejte na vlastní nebezpečí!
-tab.general.error.no_server_version_selected=Prosím vyberte verzi serveru!
-tab.general.error.invalid_classicube_url=Neplatná ClassiCube URL!
-tab.general.error.invalid_server_address=Neplatná server adresa!
-tab.general.error.invalid_proxy_url=Neplatná proxy URL!
-tab.general.error.failed_to_start=Nebylo možné spustit ViaProxy! Ujistěte se že vybraný port není používaný a zkuste to znovu.
-tab.advanced.name=Pokročilé
-tab.advanced.proxy_url.label=Proxy URL:
-tab.advanced.proxy_url.tooltip=URL SOCKS(4/5)/HTTP(S) proxy, která bude používána pro TCP připojení.\nPodporované formáty:\n- typ://addresa:port\n- typ://uzivatelske_jmeno:heslo@addresa:port
-tab.advanced.proxy_online_mode.label=Proxy Online Mód
-tab.advanced.proxy_online_mode.tooltip=Povolání Online Proxy módu vyžaduje aby váš client měl Minecraft klient používal platný Minecraft účet.\nProxy Online Mode vám umožňuje vidět skiny hráčů a používát 'signed chat' funkce.
-tab.advanced.legacy_skin_loading.label=Načítání skinů hráčů na zastaralých verzích
-tab.advanced.legacy_skin_loading.tooltip=Povolování načítání skinů hráčů na zastaralých verzích vám umožní vidět skiny hráčů na verzi 1.6.5 a verzemi před ní.
-tab.advanced.chat_signing.label='Signed chat' funkce
-tab.advanced.chat_signing.tooltip=Povoluje způsob odesílání zpráv na verzích od 1.19, který podepíše zprávy unikátním klíčem.
-tab.advanced.ignore_packet_translation_errors.label=Ignorovat chyby při překládaní packetů
-tab.advanced.ignore_packet_translation_errors.tooltip=Povolování tohoto způsobí že při jakékoliv chybě při překládání packetů nebudete vyhozeni ze hry, ale jenom bude chyba vypsaná do konzole.\nMůže způsovat problémy, zaležíjic na tom jaký packet a jaká chyba byla ignorována.
-tab.advanced.create_viaversion_dump.label=Vytvořit ViaVersion dump
-tab.advanced.create_viaversion_dump.success=Zkopíruje link na ViaVersion dump
-tab.advanced.upload_latest_log.label=Nahrát nejnovější log
-tab.advanced.upload_latest_log.success=Log byl nahrán na %s (zkopírované)
-tab.advanced.upload_latest_log.error_generic=Log nebylo možno nahrát: %s
-tab.advanced.upload_latest_log.error_not_found=Log soubor nebyl nalezen.
-tab.accounts.name=Účty
-tab.accounts.description.line1=Pro připojení na online servery musíte přidat Microsoft účet. Můžete vybrat účet tím že na něj kliknete pravým tlačítkem myši. Vy výchozím nastavení bude vybrán první účet.
-tab.accounts.list.context_menu.select=Vybrat účet
-tab.accounts.list.context_menu.remove=Vymazat
-tab.accounts.list.context_menu.move_up=Posunout nahoru ↑
-tab.accounts.list.context_menu.move_down=Posunout dolů ↓
-tab.accounts.add.title=Přidat účet
-tab.accounts.add_offline.label=Offline účet
-tab.accounts.add_offline.enter_username=Napište prosím jméno svého offline účtu:
-tab.accounts.add_microsoft.label=Microsoft Účet
-tab.accounts.add_bedrock.label=Bedrock Účet
-tab.accounts.add.success=Přidán účet %s.
-tab.accounts.add.timeout=Čas na pokus o přihlášení vypršel.\nProsím přihlašte se do %s sekund.
-tab.realms.name=Realms
-tab.realms.error_generic=Realms požadavek nebylo možné zpracovat: %s
-tab.realms.error_generic_label=Došlo k neznámé chybě
-tab.realms.error_account=Nebylo možné obnovit vybraný účet. Toto je způsobeno zastaralým tokenem nebo rate limity. Počkejte několik sekund a zkuste to znovu. Pokud problém zůstane, vymažte svůj účet a přidejte ho zpět.
-tab.realms.error_account_label=Chyba v účtu
-tab.realms.no_account=Nebyl vybrán žádný účet
-tab.realms.unsupported_account=Byl vybrán nepodporovaný účet
-tab.realms.refreshing_account=Obnova účtu...
-tab.realms.availability_check=Kontrola dostupnosti...
-tab.realms.unavailable=Vaše ViaProxy je zastaralá a nekompatibilní s Realms.\nProsím použíjte nejnovější verzi ViaProxy.
-tab.realms.loading_worlds=Načítání světů...
-tab.realms.no_worlds=Žádně světy nebyly nalezeny
-tab.realms.account=Účet: %s
-tab.realms.release=Vydání
-tab.realms.snapshot=Snapshot
-tab.realms.join=Připojit
-tab.realms.joining=Připojování...
-tab.realms.accept_tos=Pro použití Minecraft Realms musíte souhlasit s Terms of Service: %s
-tab.realms.expired=Tato Realm vyprchala
-tab.realms.incompatible=Tato verze Realms Minecraft version je buď moc stará nebo moc nová
-tab.ui_settings.name=UI Nastavení
-tab.ui_settings.language.label=Jazyk:
-tab.ui_settings.language.completion=%s přeloženo
-tab.ui_settings.language.success=Jazyk změněn na %s (%s). ViaProxy se nyní restartuje!
-popup.login_account.title=Přidat Účet
-popup.login_account.instructions.browser=Prosím otevřete následujcí URL ve svém prohlížeči:
-popup.login_account.instructions.close=Tato okno se automaticky zavře, potom co jste se přihlásili.
-popup.download.title=Stahování...
-popup.update.info=Používáte zastaralou verzi ViaProxy!\nPoužitá version: %s\nNejnovější version: %s
-popup.update.question=Chcete spustit update?
-popup.update.success=Stažena nejnovější verze ViaProxy. ViaProxy se nyní restartuje!
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/da_DK.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/da_DK.properties
deleted file mode 100644
index e69de29..0000000
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/de_DE.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/de_DE.properties
deleted file mode 100644
index de6ba93..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/language/de_DE.properties
+++ /dev/null
@@ -1,97 +0,0 @@
-language.name=Deutsch (Deutschland)
-generic.cancel=Abbrechen
-generic.could_not_open_url=Der Link konnte nicht geöffnet werden: %s
-tab.general.name=Standard
-tab.general.server_address.label=Server Adresse:
-tab.general.server_address.tooltip=Unterstützte Formate:\n- Adresse\n- Adresse:Port\n- ClassiCube Direct URL
-tab.general.server_version.label=Server Version:
-tab.general.minecraft_account.label=Minecraft Konto:
-tab.general.minecraft_account.option_no_account=Kein Konto verwenden
-tab.general.minecraft_account.option_select_account=Ausgewähltes Konto verwenden
-tab.general.betacraft_auth.label=BetaCraft Authentifizierung (Classic)
-tab.general.betacraft_auth.tooltip=Wenn du die BetaCraft Authentifizierung aktivierst, kannst du auf Classic Server, die Online Mode aktiviert haben joinen.
-tab.general.state.loading=Lade ViaProxy...
-tab.general.state.start=Start
-tab.general.state.starting=Starte...
-tab.general.state.stop=Stop
-tab.general.state.running=ViaProxy läuft! Verbinde dich mit Minecraft %s zu %s
-tab.general.warning.ban_warning.line1=ViaProxy könnte Anti-Cheats flaggen aufgrund der Block-, Item- und Bewegungsunterschieden zwischen Versionen.
-tab.general.warning.bedrock_warning.line1=ViaBedrock ist aktuell noch sehr früh in der Entwicklung und ist nicht für normale Verwendung gedacht.
-tab.general.warning.risk=Verwendung auf eigene Gefahr!
-tab.general.error.no_server_version_selected=Bitte wähle eine Server Version aus!
-tab.general.error.invalid_classicube_url=Ungültige ClassiCube Direct URL!
-tab.general.error.invalid_server_address=Ungültige Server Adresse!
-tab.general.error.invalid_bind_address=Ungültige Lokale Adresse!
-tab.general.error.invalid_proxy_url=Ungültige proxy URL!
-tab.general.error.failed_to_start=ViaProxy konnte nicht starten! Sorge dafür, dass der lokale Port nicht bereits belegt ist und versuche es nochmal.
-tab.advanced.name=Erweitert
-tab.advanced.bind_address.label=Lokale Adresse:
-tab.advanced.bind_address.tooltip=Die lokale Adresse, auf der ViaProxy Verbindungen entgegen nehmen soll.
-tab.advanced.proxy_url.label=Proxy URL:
-tab.advanced.proxy_url.tooltip=URL von einem SOCKS(4/5)/HTTP(S) Proxy der für TCP Verbindungen verwendet werden soll.\nUnterstützte Formate:\n- Typ://Adresse:Port\n- Typ://Benutzername:Passwort@Adresse:Port
-tab.advanced.proxy_online_mode.label=Proxy Online Mode
-tab.advanced.proxy_online_mode.tooltip=Wenn du Proxy Online Mode aktivierst, muss dein Client in ein gültiges Minecraft Konto eingeloggt sein.\nProxy Online Mode erlaubt es dir Skins auf Online Mode Servern zu sehen und signierten Chat zu verwenden.
-tab.advanced.legacy_skin_loading.label=Alte Skins laden
-tab.advanced.legacy_skin_loading.tooltip=Wenn du diese Option aktivierst, kannst du Skins auf <= 1.6.4 Servern sehen.
-tab.advanced.chat_signing.label=Chat Signatur
-tab.advanced.chat_signing.tooltip=Aktiviert das Senden von signierten Chat Nachrichten auf >= 1.19 Servern.
-tab.advanced.ignore_packet_translation_errors.label=Datenpaket Übersetzungsfehler ignorieren
-tab.advanced.ignore_packet_translation_errors.tooltip=Wenn du diese Option aktivierst, wirst du nicht mehr vom Server gekickt, wenn es einen Datenpaket Übersetzungsfehler gibt, sondern der Fehler wird nur in der Konsole angezeigt.\nDiese Option könnte abhängig vom Datenpaket, welches nicht übersetzt werden konnte, Folgeprobleme verursachen.
-tab.advanced.allow_beta_pinging.label=Aktiviere Pings für <= b1.7.3
-tab.advanced.allow_beta_pinging.tooltip=Aktiviert das Pingen für <= b1.7.3 Server. Das könnte zu Problemen bei Servern, welche zu schnelle Verbindungen blockieren führen.
-tab.advanced.simple_voice_chat_support.label=Simple Voice Chat Unterstützung
-tab.advanced.simple_voice_chat_support.tooltip=Aktiviert lesen und ändern der Simple Voice Chat Mod Pakete.
-tab.advanced.fake_accept_resource_packs.label=Überspringe Resourcenpakete
-tab.advanced.fake_accept_resource_packs.tooltip=Akzeptiere Resourcenpakete ohne diese dem Client zu senden.\nDiese Option ist erforderlich um auf Servern zu spielen, welche Resourcenpakete benötigen, diese aber vom Client aufgrund der unterschiedlichen Version nicht geladen werden können.
-tab.advanced.create_viaversion_dump.label=ViaVersion Dump erstellen
-tab.advanced.create_viaversion_dump.success=Der ViaVersion Dump Link wurde in die Zwischenablage kopiert.
-tab.advanced.upload_latest_log.label=Neueste Log-Datei hochladen
-tab.advanced.upload_latest_log.success=Log-Datei wurde hochgeladen: %s (In die Zwischenablage kopiert)
-tab.advanced.upload_latest_log.error_generic=Die Log-Datei konnte nicht hochgeladen werden: %s
-tab.advanced.upload_latest_log.error_not_found=Die Log-Datei konnte nicht gefunden werden.
-tab.accounts.name=Konten
-tab.accounts.description.line1=Um auf Online Mode Server zu joinen musst du ein Minecraft Konto im ViaProxy hinzufügen. Du kannst ein Konto auswählen indem du es rechtsklickst. Standardmäßig wird das erste verwendet.
-tab.accounts.list.context_menu.select=Konto auswählen
-tab.accounts.list.context_menu.remove=Löschen
-tab.accounts.list.context_menu.move_up=Nach oben schieben ↑
-tab.accounts.list.context_menu.move_down=Nach unten schieben ↓
-tab.accounts.add.title=Konto hinzufügen
-tab.accounts.add_offline.label=Offline Konto
-tab.accounts.add_offline.enter_username=Gib deinen gewünschten Benutzername ein:
-tab.accounts.add_microsoft.label=Microsoft Konto
-tab.accounts.add_bedrock.label=Bedrock Konto
-tab.accounts.add.success=Das Konto %s wurde erfolgreich hinzugefügt.
-tab.accounts.add.timeout=Der Login Prozess ist abgelaufen.\nBitte logge dich innerhalb von %s Sekunden ein.
-tab.realms.name=Realms
-tab.realms.error_generic=Realms Anfrage konnte nicht verarbeitet werden: %s
-tab.realms.error_generic_label=Ein unbekannter Fehler ist aufgetreten
-tab.realms.error_account=Das Konto konnte nicht aktualisiert werden. Das könnte durch alte Account-Tokens oder Rate-Limits verursacht sein. Warte ein paar Sekunden und probiere es dann erneut. Sollte das Problem nicht behoben sein, entferne das Konto und füge es neu hinzu.
-tab.realms.error_account_label=Konto Fehler
-tab.realms.no_account=Kein Konto ausgewählt
-tab.realms.unsupported_account=Das ausgewählte Konto wird nicht unterstützt
-tab.realms.refreshing_account=Aktualisiere Konto...
-tab.realms.availability_check=Prüfe Verfügbarkeit...
-tab.realms.unavailable=Deine ViaProxy ist veraltet und nicht kompatibel mit Minecraft Realms.\nBitte nutze die neuste ViaProxy Version.
-tab.realms.loading_worlds=Lade Welten...
-tab.realms.no_worlds=Keine Welten gefunden
-tab.realms.account=Konto: %s
-tab.realms.release=Vollversion
-tab.realms.snapshot=Entwicklungsversion
-tab.realms.join=Beitreten
-tab.realms.joining=Trete bei...
-tab.realms.accept_tos=Um Minecraft Realms zu verwenden musst du die Nutzungsbedingungen akzeptieren: %s
-tab.realms.expired=Dieser Realm ist abgelaufen
-tab.realms.incompatible=Die Minecraft Version dieses Realms ist zu alt oder zu neu
-tab.ui_settings.name=Benutzeroberflächeneinstellungen
-tab.ui_settings.language.label=Sprache:
-tab.ui_settings.language.completion=%s übersetzt
-tab.ui_settings.language.success=Die Sprache wurde zu %s (%s) geändert. ViaProxy startet jetzt neu!
-tab.ui_settings.crowdin.info=Fehlt deine Sprache oder ist sie unvollständig? Hilf uns ViaProxy auf Crowdin zu übersetzen!
-tab.ui_settings.crowdin.link=Klick hier um Crowdin zu öffnen
-popup.login_account.title=Konto hinzufügen
-popup.login_account.instructions.browser=Bitte öffne folgende URL in deinem Browser:
-popup.login_account.instructions.close=Das Popup schließt sich automatisch, nachdem du angemeldet wurdest.
-popup.download.title=Lade herunter...
-popup.update.info=Du verwendest eine alte Version von ViaProxy!\nAktuelle Version: %s\nNeueste Version: %s
-popup.update.question=Möchtest du aktualisieren?
-popup.update.success=Die neueste Version wurde heruntergeladen. ViaProxy startet jetzt neu!
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/el_GR.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/el_GR.properties
deleted file mode 100644
index e69de29..0000000
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/en_US.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/en_US.properties
deleted file mode 100644
index c80445b..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/language/en_US.properties
+++ /dev/null
@@ -1,97 +0,0 @@
-language.name=English (United States)
-generic.cancel=Cancel
-generic.could_not_open_url=Couldn't open the link: %s
-tab.general.name=General
-tab.general.server_address.label=Server Address:
-tab.general.server_address.tooltip=Supported formats:\n- address\n- address:port\n- ClassiCube Direct URL
-tab.general.server_version.label=Server Version:
-tab.general.minecraft_account.label=Minecraft Account:
-tab.general.minecraft_account.option_no_account=Use no account
-tab.general.minecraft_account.option_select_account=Use selected account
-tab.general.betacraft_auth.label=BetaCraft Auth (Classic)
-tab.general.betacraft_auth.tooltip=Enabling BetaCraft Auth allows you to join classic servers which have online mode enabled.
-tab.general.state.loading=Loading ViaProxy...
-tab.general.state.start=Start
-tab.general.state.starting=Starting...
-tab.general.state.stop=Stop
-tab.general.state.running=ViaProxy is running! Connect with Minecraft %s to %s
-tab.general.warning.ban_warning.line1=ViaProxy may trigger anti-cheats, due to block, item, movement and other differences between versions.
-tab.general.warning.bedrock_warning.line1=ViaBedrock is currently in very early development and not ready for general use.
-tab.general.warning.risk=Use at your own risk!
-tab.general.error.no_server_version_selected=Please select a server version!
-tab.general.error.invalid_classicube_url=Invalid ClassiCube Direct URL!
-tab.general.error.invalid_server_address=Invalid server address!
-tab.general.error.invalid_bind_address=Invalid bind address!
-tab.general.error.invalid_proxy_url=Invalid proxy URL!
-tab.general.error.failed_to_start=Failed to start ViaProxy! Ensure that the local port is not already in use and try again.
-tab.advanced.name=Advanced
-tab.advanced.bind_address.label=Bind Address:
-tab.advanced.bind_address.tooltip=The address ViaProxy should accept incoming connections on.
-tab.advanced.proxy_url.label=Proxy URL:
-tab.advanced.proxy_url.tooltip=URL of a SOCKS(4/5)/HTTP(S) proxy which will be used for TCP connections.\nSupported formats:\n- type://address:port\n- type://username:password@address:port
-tab.advanced.proxy_online_mode.label=Proxy Online Mode
-tab.advanced.proxy_online_mode.tooltip=Enabling Proxy Online Mode requires your client to have a valid minecraft account.\nProxy Online Mode allows you to see skins on online mode servers and use the signed chat features.
-tab.advanced.legacy_skin_loading.label=Legacy Skin Loading
-tab.advanced.legacy_skin_loading.tooltip=Enabling Legacy Skin Loading allows you to see skins on <= 1.6.4 servers.
-tab.advanced.chat_signing.label=Chat signing
-tab.advanced.chat_signing.tooltip=Enables sending signed chat messages on >= 1.19 servers.
-tab.advanced.ignore_packet_translation_errors.label=Ignore packet translation errors
-tab.advanced.ignore_packet_translation_errors.tooltip=Enabling this will prevent getting disconnected from the server when a packet translation error occurs and instead only print the error in the console.\nThis may cause issues depending on the type of packet which failed to translate.
-tab.advanced.allow_beta_pinging.label=Allow <= b1.7.3 pinging
-tab.advanced.allow_beta_pinging.tooltip=Enabling this will allow you to ping <= b1.7.3 servers. This may cause issues with servers that block too frequent connections.
-tab.advanced.simple_voice_chat_support.label=Simple Voice Chat Support
-tab.advanced.simple_voice_chat_support.tooltip=Enables handling and rewriting of Simple Voice Chat mod packets.
-tab.advanced.fake_accept_resource_packs.label=Fake accept resource packs
-tab.advanced.fake_accept_resource_packs.tooltip=Accepts resource packs from the server without showing a prompt to the client.\nThis is required for servers that require a resource pack, but the client can't load it due to version differences.
-tab.advanced.create_viaversion_dump.label=Create ViaVersion dump
-tab.advanced.create_viaversion_dump.success=Copied ViaVersion dump link to clipboard.
-tab.advanced.upload_latest_log.label=Upload latest log file
-tab.advanced.upload_latest_log.success=Uploaded log file to %s (copied to clipboard)
-tab.advanced.upload_latest_log.error_generic=The log file could not be uploaded: %s
-tab.advanced.upload_latest_log.error_not_found=The log file could not be found.
-tab.accounts.name=Accounts
-tab.accounts.description.line1=To join online mode servers you have to add a minecraft account for ViaProxy to use. You can select an account by right clicking it. By default the first one will be used.
-tab.accounts.list.context_menu.select=Select Account
-tab.accounts.list.context_menu.remove=Remove
-tab.accounts.list.context_menu.move_up=Move up ↑
-tab.accounts.list.context_menu.move_down=Move down ↓
-tab.accounts.add.title=Add Account
-tab.accounts.add_offline.label=Offline Account
-tab.accounts.add_offline.enter_username=Enter your offline mode username:
-tab.accounts.add_microsoft.label=Microsoft Account
-tab.accounts.add_bedrock.label=Bedrock Account
-tab.accounts.add.success=The account %s was added successfully.
-tab.accounts.add.timeout=The login request timed out.\nPlease login within %s seconds.
-tab.realms.name=Realms
-tab.realms.error_generic=Realms request could not be handled: %s
-tab.realms.error_generic_label=An unknown error occurred
-tab.realms.error_account=Could not refresh the selected account. This might be caused by outdated account tokens or rate limits. Wait a couple of seconds and try again. If the problem persists, remove and re-add your account.
-tab.realms.error_account_label=Account error
-tab.realms.no_account=No account selected
-tab.realms.unsupported_account=Unsupported account selected
-tab.realms.refreshing_account=Refreshing account...
-tab.realms.availability_check=Checking availability...
-tab.realms.unavailable=Your ViaProxy is outdated and not compatible with Minecraft Realms.\nPlease use the latest version of ViaProxy.
-tab.realms.loading_worlds=Loading worlds...
-tab.realms.no_worlds=No worlds found
-tab.realms.account=Account: %s
-tab.realms.release=Release
-tab.realms.snapshot=Snapshot
-tab.realms.join=Join
-tab.realms.joining=Joining...
-tab.realms.accept_tos=To use Minecraft Realms you have to accept the Terms of Service: %s
-tab.realms.expired=This Realm is expired
-tab.realms.incompatible=This Realms Minecraft version is too old or too new
-tab.ui_settings.name=UI Settings
-tab.ui_settings.language.label=Language:
-tab.ui_settings.language.completion=%s translated
-tab.ui_settings.language.success=Language changed to %s (%s). ViaProxy will now restart!
-tab.ui_settings.crowdin.info=Is your language missing or incomplete? Help us to translate ViaProxy on Crowdin!
-tab.ui_settings.crowdin.link=Click here to go to Crowdin
-popup.login_account.title=Add Account
-popup.login_account.instructions.browser=Please open the following URL in your browser:
-popup.login_account.instructions.close=The popup will close automatically after you have been logged in.
-popup.download.title=Downloading...
-popup.update.info=You are running an outdated version of ViaProxy!\nCurrent version: %s\nLatest version: %s
-popup.update.question=Do you want to update?
-popup.update.success=Downloaded the latest version of ViaProxy. ViaProxy will now restart!
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/es_ES.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/es_ES.properties
deleted file mode 100644
index 2d50378..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/language/es_ES.properties
+++ /dev/null
@@ -1,54 +0,0 @@
-language.name=Español (España)
-generic.cancel=Cancelar
-generic.could_not_open_url=No se puede abrir el enlace %s
-tab.general.name=General
-tab.general.server_address.label=Dirección del servidor:
-tab.general.server_address.tooltip=Formatos soportados\n- dirección\n- dirección:puerto\n- URL directa de ClassiCube
-tab.general.server_version.label=Versión del servidor:
-tab.general.minecraft_account.label=Cuenta de Minecraft:
-tab.general.minecraft_account.option_no_account=No utilizar ninguna cuenta
-tab.general.minecraft_account.option_select_account=Utilizar la cuenta seleccionada
-tab.general.betacraft_auth.label=BetaCraft Auth (Clásico)
-tab.general.betacraft_auth.tooltip=Activar "BetaCraft Auth" te permite unirte a servidores clásicos que tengan activado el modo online.
-tab.general.state.loading=Cargando ViaProxy...
-tab.general.state.start=Iniciar
-tab.general.state.starting=Iniciando...
-tab.general.state.stop=Detener
-tab.general.state.running=¡ViaProxy está en funcionamiento! Conéctate con Minecraft %s a %s
-tab.general.warning.ban_warning.line1=ViaProxy puede activar sistemas anti-trampa, debido a las diferencias en bloques, objetos, movimiento y otras variaciones entre versiones.
-tab.general.warning.bedrock_warning.line1=ViaBedrock se encuentra actualmente en desarrollo muy temprano y no está listo para su uso general.
-tab.general.warning.risk=¡Usa bajo tu propio riesgo!
-tab.general.error.no_server_version_selected=¡Por favor seleccione una versión de servidor!
-tab.general.error.invalid_server_address=¡Dirección del servidor inválida!
-tab.advanced.ignore_packet_translation_errors.tooltip=Habilitar esto evitará que te desconectes del servidor cuando ocurra un error de traducción de paquete y, en su lugar, solo imprimirá el error en la consola. Esto podría causar problemas dependiendo del tipo de paquete que no se haya podido traducir.
-tab.advanced.allow_beta_pinging.label=Permitir <= b1.7.3 pinging
-tab.advanced.allow_beta_pinging.tooltip=Habilitar esto te permitirá hacer ping a servidores <= b1.7.3. Esto podría causar problemas con servidores que bloquean conexiones demasiado frecuentes.
-tab.advanced.simple_voice_chat_support.label=Soporte para Simple Voice Chat
-tab.accounts.add_bedrock.label=Cuenta de Bedrock
-tab.realms.name=Realms
-tab.realms.no_account=Ninguna cuenta seleccionada
-tab.realms.unsupported_account=Cuenta no soportada seleccionada
-tab.realms.refreshing_account=Actualizando cuenta...
-tab.realms.availability_check=Comprobando disponibilidad...
-tab.realms.unavailable=Tu ViaProxy está desactualizado y no es compatible con Minecraft Realms. Por favor, usa la última versión de ViaProxy.
-tab.realms.loading_worlds=Cargando mundos...
-tab.realms.no_worlds=No se encontraron mundos
-tab.realms.account=Cuenta: %s
-tab.realms.snapshot=Snapshot
-tab.realms.join=Unirse
-tab.realms.joining=Uniéndose...
-tab.realms.accept_tos=Para usar Minecraft Realms debes aceptar los Términos del Servicio: %s
-tab.realms.expired=Este Realm ha caducado
-tab.realms.incompatible=Esta versión de Realms de Minecraft es demasiado antigua o demasiado nueva
-tab.ui_settings.language.label=Idioma:
-tab.ui_settings.language.completion=%s traducido
-tab.ui_settings.language.success=Idioma cambiado a %s (%s). ¡ViaProxy se reiniciará ahora!
-tab.ui_settings.crowdin.info=¿Falta o está incompleto tu idioma? ¡Ayúdanos a traducir ViaProxy en Crowdin!
-tab.ui_settings.crowdin.link=Haz clic aquí para ir a Crowdin
-popup.login_account.title=Añadir cuenta
-popup.login_account.instructions.browser=Por favor, abre la siguiente URL en tu navegador:
-popup.login_account.instructions.close=El popup se cerrará automáticamente después de que hayas iniciado sesión.
-popup.download.title=Descargando...
-popup.update.info=¡Estás utilizando una versión desactualizada de ViaProxy!\nVersión actual: %s\nÚltima versión: %s
-popup.update.question=¿Quieres actualizar ViaProxy?
-popup.update.success=Se descargó la última versión de ViaProxy. ¡ViaProxy se reiniciará ahora!
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/fi_FI.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/fi_FI.properties
deleted file mode 100644
index e69de29..0000000
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/fr_FR.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/fr_FR.properties
deleted file mode 100644
index 4c17b8b..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/language/fr_FR.properties
+++ /dev/null
@@ -1,97 +0,0 @@
-language.name=Français (France)
-generic.cancel=Annuler
-generic.could_not_open_url=Impossible d'ouvrir le lien: %s
-tab.general.name=Général
-tab.general.server_address.label=Adresse du serveur:
-tab.general.server_address.tooltip=Formats supportés\n- adresse\n- adresse:port\n- Adresse direct ClassiCube
-tab.general.server_version.label=Version du serveur:
-tab.general.minecraft_account.label=Compte Minecraft:
-tab.general.minecraft_account.option_no_account=Pas de compte
-tab.general.minecraft_account.option_select_account=Compte sélectionné
-tab.general.betacraft_auth.label=BetaCraft Auth (Classic)
-tab.general.betacraft_auth.tooltip=Activer BetaCraft Auth vous permet de vous connecter à des serveurs classiques qui ont le mode en ligne activé.
-tab.general.state.loading=Chargement de ViaProxy...
-tab.general.state.start=Lancer
-tab.general.state.starting=Lancement...
-tab.general.state.stop=Arrêter
-tab.general.state.running=ViaProxy est lancé ! Connectez-vous avec Minecraft %s à l'adresse %s
-tab.general.warning.ban_warning.line1=ViaProxy risque de déclencher des anti-cheats, à cause de blocs, objets et d'autres différences entre les versions.
-tab.general.warning.bedrock_warning.line1=ViaBedrock est en début de développement et n'est pas prêt pour un usage normal.
-tab.general.warning.risk=Utilisez à vos risques et périls !
-tab.general.error.no_server_version_selected=Veuillez sélectionner une version de serveur !
-tab.general.error.invalid_classicube_url=Adresse directe ClassiCube invalide !
-tab.general.error.invalid_server_address=Adresse du serveur invalide !
-tab.general.error.invalid_bind_address=Adresse de liaison invalide !
-tab.general.error.invalid_proxy_url=Adresse du Proxy invalide !
-tab.general.error.failed_to_start=Impossible de lancer ViaProxy ! Assurez-vous que le port n'est pas déjà utilisé et réessayez.
-tab.advanced.name=Avancé
-tab.advanced.bind_address.label=Adresse de liaison:
-tab.advanced.bind_address.tooltip=L'adresse sur laquelle ViaProxy accepte les connections entrantes.
-tab.advanced.proxy_url.label=Adresse du Proxy:
-tab.advanced.proxy_url.tooltip=Adresse d'un proxy SOCKS(4/5)/HTTP(S) qui sera utilisé pour les connexions TCP.\nFormats supportés:\n- type://adresse:port\n- type://dentifiant:motdepasse@adresse:port
-tab.advanced.proxy_online_mode.label=Mode Proxy en Ligne
-tab.advanced.proxy_online_mode.tooltip=Activer le Mode Proxy en Ligne nécessite que le client ait un compte minecraft valide.\nLe Mode Proxy en Ligne permet de voir les skins sur les serveurs en mode en ligne et d'utiliser la fonction des messages signés.
-tab.advanced.legacy_skin_loading.label=Chargement des Skins Classiques
-tab.advanced.legacy_skin_loading.tooltip=Activer le Chargement des Skins Classiques permet de voir les skins sur les serveurs <= 1.6.4
-tab.advanced.chat_signing.label=Messages signés
-tab.advanced.chat_signing.tooltip=Active l'envoi de messages signés sur les serveurs >= 1.19
-tab.advanced.ignore_packet_translation_errors.label=Ignore les erreurs de traduction
-tab.advanced.ignore_packet_translation_errors.tooltip=Activer cela évite de se faire déconnecter du serveur quand il y a une erreur de traduction de paquet, et l'écrit dans le chat à la place.\nCela peut poser des problèmes selon le paquet dont la traduction a raté.
-tab.advanced.allow_beta_pinging.label=Ping des serveurs <= b1.7.3
-tab.advanced.allow_beta_pinging.tooltip=Activer cela permet de ping des serveurs <= b1.7.3. Cela peut poser des problèmes avec les serveurs qui bloquent les connexions trop fréquentes.
-tab.advanced.simple_voice_chat_support.label=Support pour Simple Voice Chat
-tab.advanced.simple_voice_chat_support.tooltip=Active la prise en charge et la réécriture des paquets du mod Simple Voice Chat.
-tab.advanced.fake_accept_resource_packs.label=Faussement accepte les packs de ressources
-tab.advanced.fake_accept_resource_packs.tooltip=Accepte les packs de ressources du serveur sans ouvrir de pop-up sur le client.\nNécessaire pour les serveurs qui nécessitent un pack de ressource mais que le client ne peut pas charger dû aux différences des versions.
-tab.advanced.create_viaversion_dump.label=Créer un dump ViaVersion
-tab.advanced.create_viaversion_dump.success=Le lien du dump ViaVersion a été copié dans le presse-papier.
-tab.advanced.upload_latest_log.label=Mettre en ligne le dernier fichier log
-tab.advanced.upload_latest_log.success=Le dernier fichier log a bien été mis en ligne à %s (copié dans le presse-papier)
-tab.advanced.upload_latest_log.error_generic=Le fichier de log n'as pas pu etre chargé: %s
-tab.advanced.upload_latest_log.error_not_found=Le fichier de log est introuvable.
-tab.accounts.name=Comptes
-tab.accounts.description.line1=Pour rejoindre un serveur en ligne, ViaProxy a besoin d'un compre microsoft. Vous pouver selectionner un compte en faisant un clique droit dessu. Par default, le premier est selectionné.
-tab.accounts.list.context_menu.select=Selectioner ce compte
-tab.accounts.list.context_menu.remove=Enlever
-tab.accounts.list.context_menu.move_up=Envoyer vers le haut
-tab.accounts.list.context_menu.move_down=Envoyer vers le bas
-tab.accounts.add.title=Ajouter un compte
-tab.accounts.add_offline.label=Compte hors ligne
-tab.accounts.add_offline.enter_username=Entrer votre nom d'utilisateur hors ligne:
-tab.accounts.add_microsoft.label=Compte Microsoft
-tab.accounts.add_bedrock.label=Compte Bedrock
-tab.accounts.add.success=Le compte %s a été ajouté
-tab.accounts.add.timeout=La requette de connexion est trop lente.\nMerci de se connecter dans les %s secondes.
-tab.realms.name=Realms
-tab.realms.error_generic=La requette du Realm n'as pas pu etre prise en charge: %s
-tab.realms.error_generic_label=Erreur inconnue
-tab.realms.error_account=Impossible d'actualiser le compte selectionné. Cela peut etre causé par des token trop ancient ou des limites de rafraichissement. attendez quelques secondes et reessayez. Si le probleme pressiste, retirer et re-ajoutez votre compte.
-tab.realms.error_account_label=Erreur de compte
-tab.realms.no_account=Pas de compte selectioné
-tab.realms.unsupported_account=Compte non supporté
-tab.realms.refreshing_account=Rafraichissement du compte...
-tab.realms.availability_check=Verification de la disponibilité
-tab.realms.unavailable=Votre vertion de ViaProxy n'est pas a jour et n'est pas compatible avec Minecraft Realms.\nVeuillez utiliser la derniere vertion de ViaProxy.
-tab.realms.loading_worlds=Chargement des mondes...
-tab.realms.no_worlds=Aucun monde trouvé
-tab.realms.account=Compte: %s
-tab.realms.release=Release
-tab.realms.snapshot=Snapshot
-tab.realms.join=Rejoindre
-tab.realms.joining=Connection...
-tab.realms.accept_tos=Pour utiliser Minecraft Realms vous devez accepter les Conditions d'Utilisations: %s
-tab.realms.expired=Ce Realms a expiré
-tab.realms.incompatible=Cette vertion du Realms Minecraft est trop ancienne ou trop récente
-tab.ui_settings.name=Apparence
-tab.ui_settings.language.label=Langue:
-tab.ui_settings.language.completion=%s traduit
-tab.ui_settings.language.success=Langue changée a %s (%s). ViaProxy vas redémarer!
-tab.ui_settings.crowdin.info=Ta langue est manquante ou incomplète ? Aide-nous à traduire ViaProxy sur Crowdin !
-tab.ui_settings.crowdin.link=Clique ici pour aller sur Crowdin
-popup.login_account.title=Ajouter un compte
-popup.login_account.instructions.browser=Ouvrez ce lien dans votre navigateur:
-popup.login_account.instructions.close=Cette fenetre se fermera automatiquement une fois connecté.
-popup.download.title=Telechargement...
-popup.update.info=Une nouvelle vertion est disponible!\nVertion actuelle: %s\nDerniere Vertion: %s
-popup.update.question=Mettre a jour ?
-popup.update.success=Derniere vertion de ViaProxy Telechargée. ViaProxy vas maintenant redemarer!
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/he_IL.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/he_IL.properties
deleted file mode 100644
index e69de29..0000000
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/hi_IN.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/hi_IN.properties
deleted file mode 100644
index e69de29..0000000
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/hu_HU.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/hu_HU.properties
deleted file mode 100644
index 32a7525..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/language/hu_HU.properties
+++ /dev/null
@@ -1,97 +0,0 @@
-language.name=Magyar (Magyarország)
-generic.cancel=Mégsem
-generic.could_not_open_url=Nem lehet meg nyitni a linket: %s
-tab.general.name=Általános
-tab.general.server_address.label=Szerver IP Cím:
-tab.general.server_address.tooltip=Támogatott Cím:\n- address\n- address:port\n- ClassiCube Direct URL cím
-tab.general.server_version.label=Szerver Verzió:
-tab.general.minecraft_account.label=Minecraft Fiók:
-tab.general.minecraft_account.option_no_account=Ne használj semmilyen fiókot
-tab.general.minecraft_account.option_select_account=Kiválasztott fiók használata
-tab.general.betacraft_auth.label=BetaCraft Auth(Classic)
-tab.general.betacraft_auth.tooltip=BetaCraft bekapcsolása. Fel enged Classic minecraft szerverekre.
-tab.general.state.loading=ViaProxy Betöltése...
-tab.general.state.start=Indít
-tab.general.state.starting=Indítás...
-tab.general.state.stop=Leállitás
-tab.general.state.running=ViaProxy Fut! Lépj fel ezzel a minecraft íp címmel: %s to %s
-tab.general.warning.ban_warning.line1=ViaProxy lehet hogy flaghez fog vezetni újjab verziós szervereken a mozgás, blokkok miatt.
-tab.general.warning.bedrock_warning.line1=ViaBedrock még nagyon Alpha és még nincs készen a használatra.
-tab.general.warning.risk=Használd a saját kockázatodon!
-tab.general.error.no_server_version_selected=Kérlek válaszd ki a szerver verziót!
-tab.general.error.invalid_classicube_url=Hibás ClassiCube Direct URL cím!
-tab.general.error.invalid_server_address=Hibás szerver íp!
-tab.general.error.invalid_bind_address=Hibás bind cím!
-tab.general.error.invalid_proxy_url=Hibás Proxy URL cím!
-tab.general.error.failed_to_start=ViaProxy elinditása sikertelen! Bizonyulj meg arról hogy a locális port nem fut.
-tab.advanced.name=Speciális
-tab.advanced.bind_address.label=Bind Cím:
-tab.advanced.bind_address.tooltip=A cím, amelyen a ViaProxy fogadjon bejövő kapcsolatokat.
-tab.advanced.proxy_url.label=Proxy URL cím:
-tab.advanced.proxy_url.tooltip=A TCP kapcsolatokhoz használt SOCKS(4/5)/HTTP(S) proxy URL címe.\nTámogatott formátumok:\n- type://address:port\n- type://username:password@address:port
-tab.advanced.proxy_online_mode.label=Proxy Online mód
-tab.advanced.proxy_online_mode.tooltip=A Proxy Online mód engedélyezéséhez a kliensednek érvényes minecraft fiókkal kell rendelkeznie.\nA Proxy Online mód lehetővé teszi, hogy lásd a skineket az online mód szerverein és használd az aláírt chat funkciókat.
-tab.advanced.legacy_skin_loading.label=Legacy Skin betöltése
-tab.advanced.legacy_skin_loading.tooltip=Ea Legacy Skin Loading engedélyezése lehetővé teszi a <= 1.6.4 szervereken lévő skinek megjelenítését.
-tab.advanced.chat_signing.label=Chat aláírása
-tab.advanced.chat_signing.tooltip=Lehetővé teszi az aláírt csevegőüzenetek küldését >= 1.19 szervereken.
-tab.advanced.ignore_packet_translation_errors.label=Csomagfordítási hibák figyelmen kívül hagyása
-tab.advanced.ignore_packet_translation_errors.tooltip=Ennek engedélyezése megakadályozza, hogy a kiszolgálótól megszakadjon a kapcsolat, amikor csomagfordítási hiba lép fel, és ehelyett csak a hibát írja ki a konzolra.\nEz problémákat okozhat attól függően, hogy milyen típusú csomagot nem sikerült lefordítani.
-tab.advanced.allow_beta_pinging.label=<= b1.7.3 pingelés engedélyezése
-tab.advanced.allow_beta_pinging.tooltip=Ennek engedélyezése lehetővé teszi a <= b1.7.3 szerverek pingelését. Ez problémákat okozhat olyan szervereknél, amelyek túl gyakori kapcsolatokat blokkolnak
-tab.advanced.simple_voice_chat_support.label=Simple Voice Chat Support
-tab.advanced.simple_voice_chat_support.tooltip=Simple VoiceChat Mod packetjeinek kezelését és átirását lehetővé teszi.
-tab.advanced.fake_accept_resource_packs.label=Hamis forrás csomag elfogadás
-tab.advanced.fake_accept_resource_packs.tooltip=Elfogadja az forráscsomagokat a szervertől anélkül, hogy kérdést jelenítene meg a kliensnek. Ez olyan szervereknél szükséges, amelyek forráscsomagot igényelnek, de a kliens verziókülönbségek miatt nem tudja betölteni.
-tab.advanced.create_viaversion_dump.label=ViaVersion dump létrehozása
-tab.advanced.create_viaversion_dump.success=ViaVersion dump linket a vágólapra másoltam.
-tab.advanced.upload_latest_log.label=Legújabb naplófájl feltöltése
-tab.advanced.upload_latest_log.success=Naplófájl feltöltése a %s címre (a vágólapra másolva)
-tab.advanced.upload_latest_log.error_generic=A naplófájlt nem sikerült feltölteni: %s
-tab.advanced.upload_latest_log.error_not_found=A naplófájl nem található.
-tab.accounts.name=Fiókok
-tab.accounts.description.line1=Az online módú szerverekhez való csatlakozáshoz hozzá kell adnod egy minecraft fiókot, hogy a ViaProxy használhassa. A fiókot jobb egérgombbal kattintva választhatod ki. Alapértelmezés szerint az elsőt fogja használni.
-tab.accounts.list.context_menu.select=Fiók kiválasztása
-tab.accounts.list.context_menu.remove=Törlés
-tab.accounts.list.context_menu.move_up=Feljebb lépés ↑
-tab.accounts.list.context_menu.move_down=Lejjebb Lépés ↓
-tab.accounts.add.title=Fiók hozzáadása
-tab.accounts.add_offline.label=Offline Fiók
-tab.accounts.add_offline.enter_username=Adja meg az offline üzemmódban használt felhasználónevét:
-tab.accounts.add_microsoft.label=Microsoft Fiók
-tab.accounts.add_bedrock.label=Bedrock Fiók
-tab.accounts.add.success=A %s fiókot sikeresen hozzáadtuk.
-tab.accounts.add.timeout=A bejelentkezési kérelem időzített.\nKérem, jelentkezzen be %s másodpercen belül.
-tab.realms.name=Realms
-tab.realms.error_generic=A birodalmak kérését nem lehetett kezelni: %s
-tab.realms.error_generic_label=Ismeretlen hiba történt
-tab.realms.error_account=Nem sikerült frissíteni a kiválasztott fiókot. Ennek oka lehet az elavult számlatoken vagy a díjkorlátozás. Várjon néhány másodpercet, és próbálja meg újra. Ha a probléma továbbra is fennáll, távolítsa el és adja hozzá újra a fiókját.
-tab.realms.error_account_label=Fiók hiba
-tab.realms.no_account=Nincs fiók ki választva
-tab.realms.unsupported_account=Nem támogatott fiók kiválasztva
-tab.realms.refreshing_account=Fiók frissítése...
-tab.realms.availability_check=Elérhetőség ellenőrzése...
-tab.realms.unavailable=A ViaProxy-od elavult és nem kompatibilis a Minecraft Realms-szal.\nKérlek, használd a ViaProxy legújabb verzióját!.
-tab.realms.loading_worlds=Világok betöltése...
-tab.realms.no_worlds=Nem találtunk világokat
-tab.realms.account=Fiók: %s
-tab.realms.release=Kiadás
-tab.realms.snapshot=Snapshot
-tab.realms.join=Fellépés
-tab.realms.joining=Fellépés...
-tab.realms.accept_tos=A Minecraft Realms használatához el kell fogadnia a Felhasználási feltételeket.: %s
-tab.realms.expired=Ez a birodalom lejárt
-tab.realms.incompatible=TEz a Realms Minecraft verzió túl régi vagy túl új
-tab.ui_settings.name=UI beállítások
-tab.ui_settings.language.label=Nylev:
-tab.ui_settings.language.completion=%s fordította le
-tab.ui_settings.language.success=A nyelv %s-re változott (%s). A ViaProxy most újraindul!
-tab.ui_settings.crowdin.info=Nincs bent a te nyelved a ViaProxyban vagy nincs kész? Segits nekünk leforditani a ViaProxyt Crowdinen!
-tab.ui_settings.crowdin.link=Kattints ide hogy Crowdinre menj
-popup.login_account.title=Fiók hozzáadása
-popup.login_account.instructions.browser=Kérjük, nyissa meg az alábbi URL-t a böngészőjében:
-popup.login_account.instructions.close=A felugró ablak automatikusan bezárul, miután bejelentkezett.
-popup.download.title=Letöltés...
-popup.update.info=Ön a ViaProxy egy elavult verzióját futtatja!\nA jelenlegi verzió: %s\nLegújabb verzió: %s
-popup.update.question=Szeretné frissíteni?
-popup.update.success=Letöltötte a ViaProxy legújabb verzióját. A ViaProxy most újraindul!
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/it_IT.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/it_IT.properties
deleted file mode 100644
index b13ae51..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/language/it_IT.properties
+++ /dev/null
@@ -1,94 +0,0 @@
-language.name=Italiano (Italia)
-generic.cancel=Annulla
-generic.could_not_open_url=Impossibile aprire il link: %s
-tab.general.name=Generale
-tab.general.server_address.label=Indirizzo server:
-tab.general.server_address.tooltip=Formati supportati:\n- indirizzo\n- indirizzo:porta\n- URL Diretto ClassiCube
-tab.general.server_version.label=Versione server:
-tab.general.minecraft_account.label=Account di Minecraft:
-tab.general.minecraft_account.option_no_account=Non utilizzare account
-tab.general.minecraft_account.option_select_account=Usa l'account selezionato
-tab.general.betacraft_auth.label=Autenticazione BetaCraft (Classica)
-tab.general.state.loading=Caricamento di ViaProxy...
-tab.general.state.start=Avvia
-tab.general.state.starting=Avvio in corso...
-tab.general.state.stop=Arresta
-tab.general.state.running=ViaProxy è in esecuzione! Connettiti con Minecraft %s a %s
-tab.general.warning.ban_warning.line1=ViaProxy potrebbe far scattare degli anti-trucchi a causa di blocchi, oggetti, movimenti e altre differenze tra versioni.
-tab.general.warning.bedrock_warning.line1=ViaBedrock è attualmente in una fase di sviluppo iniziale e non è pronto per uso generale.
-tab.general.warning.risk=Usa a tuo rischio e pericolo!
-tab.general.error.no_server_version_selected=Selezionare una versione del server!
-tab.general.error.invalid_classicube_url=URL Diretto ClassiCube non valido!
-tab.general.error.invalid_server_address=Indirizzo del server non valido!
-tab.general.error.invalid_bind_address=Indirizzo di bind non valido!
-tab.general.error.invalid_proxy_url=URL del proxy non valido!
-tab.general.error.failed_to_start=Impossibile avviare ViaProxy! Assicurati che la porta locale non sia già utilizzata e riprova.
-tab.advanced.name=Avanzate
-tab.advanced.bind_address.label=Indirizzo di Bind:
-tab.advanced.bind_address.tooltip=L'indirizzo dal quale ViaProxy dovrebbe accettare connessioni in arrivo.
-tab.advanced.proxy_url.label=URL del Proxy:
-tab.advanced.proxy_url.tooltip=URL di un proxy SOCKS(4/5)/HTTP(S) che verrà usato per connessioni TCP.\nFormati supportati:\n- type://address:port\n- type://username:password@address:port
-tab.advanced.proxy_online_mode.label=Modalità Online del Proxy
-tab.advanced.proxy_online_mode.tooltip=Abilitare la modalità online del proxy richiede che il tuo client abbia un account Minecraft valido.\nLa modalità online del proxy ti permette di vedere skin in un server con modalità online e usare le funzionalità della chat firmata.
-tab.advanced.legacy_skin_loading.label=Caricamento Skin Classica
-tab.advanced.legacy_skin_loading.tooltip=Abilitare Caricamento Skin Classica ti permette di vedere skin su server <= 1.6.4.
-tab.advanced.chat_signing.label=Chat firmata
-tab.advanced.chat_signing.tooltip=Abilita l'invio di messaggi firmati in chat su server >= 1.19.
-tab.advanced.ignore_packet_translation_errors.label=Ignora errori di traduzione dei pacchetti
-tab.advanced.ignore_packet_translation_errors.tooltip=Abilitare questa opzione eviterà una disconnessione dal server quando si verifica un errore su una traduzione di un pacchetto e invece stampa solamente un errore nella console.\nQuesto potrebbe causare problemi a seconda del tipo di pacchetto che non è stato tradotto.
-tab.advanced.allow_beta_pinging.label=Permetti il pinging <= b1.7.3
-tab.advanced.simple_voice_chat_support.label=Supporto per Simple Voice Chat
-tab.advanced.simple_voice_chat_support.tooltip=Abilita la gestione e la riscrittura dei pacchetti relativi alla mod Simple Voice Chat.
-tab.advanced.fake_accept_resource_packs.label=Fingi di accettare i pacchetti di risorse
-tab.advanced.fake_accept_resource_packs.tooltip=Accetta i pacchetti di risorse dal server senza mostrare un avviso al client.\nQuesto è richiesto da server che richiedono un pacchetto di risorse, ma il client non può caricarlo a causa di una differenza di versioni.
-tab.advanced.create_viaversion_dump.label=Crea un dump di ViaVersion
-tab.advanced.create_viaversion_dump.success=Copiato il link al dump di ViaVersion nella clipboard.
-tab.advanced.upload_latest_log.label=Carica l'ultimo file di log
-tab.advanced.upload_latest_log.success=Caricato file di log su %s (copiato nella clipboard)
-tab.advanced.upload_latest_log.error_generic=Il file di log non può essere caricato: %s
-tab.advanced.upload_latest_log.error_not_found=Il file di log non è stato trovato.
-tab.accounts.name=Accounts
-tab.accounts.description.line1=Per entrare in server con modalità online devi aggiungere un account Minecraft per farlo usare da ViaProxy. Puoi selezionare un account facendo clic destro su di esso. Di default il primo verrà usato.
-tab.accounts.list.context_menu.select=Seleziona Account
-tab.accounts.list.context_menu.remove=Rimuovi
-tab.accounts.list.context_menu.move_up=Muovi su ↑
-tab.accounts.list.context_menu.move_down=Muovi giù ↓
-tab.accounts.add.title=Aggiungi Account
-tab.accounts.add_offline.label=Account Offline
-tab.accounts.add_offline.enter_username=Inserisci il tuo nome utente per la modalità offline:
-tab.accounts.add_microsoft.label=Account Microsoft
-tab.accounts.add_bedrock.label=Account Bedrock
-tab.accounts.add.success=L'account %s è stato aggiunto con successo.
-tab.accounts.add.timeout=La richiesta di accesso è scaduta.\nRieseguire l'accesso entro %s secondi.
-tab.realms.name=Realms
-tab.realms.error_generic=La richiesta a Realms non può essere gestita: %s
-tab.realms.error_generic_label=Si è verificato un errore sconosciuto
-tab.realms.error_account=Impossibile aggiornare l'account selezionato. Questo potrebbe essere causato da token di account obsoleti oppure limiti di rate. Aspetta qualche secondo e riprova. Se il problema persiste, rimuovi e riaggiungi il tuo account.
-tab.realms.error_account_label=Errore account
-tab.realms.no_account=Nessun account selezionato
-tab.realms.unsupported_account=L'account selezionato non è supportato
-tab.realms.refreshing_account=Aggiornamento account...
-tab.realms.availability_check=Controllando la disponibilità...
-tab.realms.unavailable=La tua versione di ViaProxy è obsoleta e non è compatibile con Minecraft Realms.\nUsa l'ultima versione di ViaProxy.
-tab.realms.loading_worlds=Caricamento dei mondi in corso...
-tab.realms.no_worlds=Nessun mondo trovato
-tab.realms.account=Account: %s
-tab.realms.release=Versione
-tab.realms.snapshot=Snapshot
-tab.realms.join=Entra
-tab.realms.joining=Ti stai unendo...
-tab.realms.accept_tos=Per usare Minecraft Realms devi accettare i Termini di Servizio: %s
-tab.realms.expired=Questo Realm è scaduto
-tab.ui_settings.name=Impostazioni UI
-tab.ui_settings.language.label=Lingua:
-tab.ui_settings.language.completion=%s tradotto
-tab.ui_settings.language.success=Lingua cambiata in %s (%s). ViaProxy verrà riavviato!
-tab.ui_settings.crowdin.info=La traduzione nella tua lingua è mancante o incompleta? Aiutaci a tradurre ViaProxy su Crowdin!
-tab.ui_settings.crowdin.link=Clicca qui per andare su Crowdin
-popup.login_account.title=Aggiungi Account
-popup.login_account.instructions.browser=Per favore apri il seguente link nel tuo browser:
-popup.login_account.instructions.close=Il popup si chiuderà automaticamente dopo che avrai eseguito l'accesso.
-popup.download.title=Scaricando...
-popup.update.info=Sei su una versione obsoleta di ViaProxy!\nVersione corrente: %s\nUltima versione: %s
-popup.update.question=Vuoi aggiornare all'ultima versione?
-popup.update.success=È stata scaricata l'ultima versione di ViaProxy. ViaProxy verrà ora riavviato!
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/ja_JP.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/ja_JP.properties
deleted file mode 100644
index 1f3abaa..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/language/ja_JP.properties
+++ /dev/null
@@ -1,97 +0,0 @@
-language.name=日本語 (日本)
-generic.cancel=キャンセル
-generic.could_not_open_url=次のリンクを開けませんでした: %s
-tab.general.name=全般
-tab.general.server_address.label=サーバーアドレス:
-tab.general.server_address.tooltip=サポートされている形式:\n- アドレス\n- アドレス:ポート番号\n- ClassiCubeのDirect URL
-tab.general.server_version.label=サーバーバージョン:
-tab.general.minecraft_account.label=Minecraftアカウント:
-tab.general.minecraft_account.option_no_account=アカウントを使用しない
-tab.general.minecraft_account.option_select_account=選択したアカウントを使用する
-tab.general.betacraft_auth.label=BetaCraft Auth (クラシック)
-tab.general.betacraft_auth.tooltip=BetaCraft Authを有効にすると、オンラインモード(認証モード)が有効化されたクラシックサーバーに参加できるようになります。
-tab.general.state.loading=ViaProxyをロードしています…
-tab.general.state.start=起動
-tab.general.state.starting=起動中…
-tab.general.state.stop=停止
-tab.general.state.running=ViaProxyが起動しました!Minecraft %sを使用して%sに接続してください
-tab.general.warning.ban_warning.line1=ViaProxyはバージョンの違いによるアイテムやブロック、動きの違いでアンチチートをトリガーすることがあります。
-tab.general.warning.bedrock_warning.line1=ViaBedrockは現在初期開発段階であり一般的な使用には向いていません。
-tab.general.warning.risk=自己の責任において使用してください!
-tab.general.error.no_server_version_selected=サーバーバージョンを選択してください!
-tab.general.error.invalid_classicube_url=ClassiCubeのDirect URLが無効です!
-tab.general.error.invalid_server_address=サーバーアドレスが無効です!
-tab.general.error.invalid_bind_address=バインドアドレスが無効です!
-tab.general.error.invalid_proxy_url=プロキシーのURLが無効です!
-tab.general.error.failed_to_start=ViaProxyの起動に失敗しました!指定されたローカルポートがすでに使われていないことを確認してからもう一度試してください。
-tab.advanced.name=詳細設定
-tab.advanced.bind_address.label=バインドアドレス:
-tab.advanced.bind_address.tooltip=ViaProxyが接続を受け付けるアドレス
-tab.advanced.proxy_url.label=プロキシのURL:
-tab.advanced.proxy_url.tooltip=TCP接続に使われるSOCKS(4/5)/HTTP(S)プロキシのURL\nサポートされている形式:\n- type://address:port\n- type://username:password@address:port
-tab.advanced.proxy_online_mode.label=プロキシのオンラインモード(認証モード)の有効化
-tab.advanced.proxy_online_mode.tooltip=プロキシのオンラインモードを有効にすることでクライアントで有効なMinecraftアカウントでログインすることが必要になります。\n有効にすることで、オンラインサーバー上でスキンと署名付きメッセージの使用が可能になります。
-tab.advanced.legacy_skin_loading.label=レガシースキンの読み込みの有効化
-tab.advanced.legacy_skin_loading.tooltip=レガシースキンの読み込みを有効化することで1.6.4以下のサーバーでスキンの使用が可能になります。
-tab.advanced.chat_signing.label=署名付きメッセージの有効化
-tab.advanced.chat_signing.tooltip=1.19以上のサーバーで署名付きメッセージを送信することを有効化します。
-tab.advanced.ignore_packet_translation_errors.label=パケットの変換エラーを無視
-tab.advanced.ignore_packet_translation_errors.tooltip=これを有効にすることでパケットの変化ネラーが発生した際、ただコンソールにエラーを吐くだけではなくクライアントが切断されることを防ぎます。\nこの機能を有効化すると変換に失敗したパケットの種類のよって問題が発生することがあります。
-tab.advanced.allow_beta_pinging.label=b1.7.3以下のバージョンでのサーバーピングを許可
-tab.advanced.allow_beta_pinging.tooltip=これを有効にすることでb1.7.3以下のサーバーでピングを送信します。頻繁な接続をブロックするサーバーでは問題が発生することがあります。
-tab.advanced.simple_voice_chat_support.label=Simple Voice Chatサポート
-tab.advanced.simple_voice_chat_support.tooltip=Simple Voice Chatのパケットを処理および書き換える機能を有効にします。
-tab.advanced.fake_accept_resource_packs.label=リソースパックを受け入れたと偽装する
-tab.advanced.fake_accept_resource_packs.tooltip=サーバーからのリソースパックをクライアントにプロンプトを表示せずに受け入れます。\nリソースパックが必須だが、バージョンの違いでクライアントが読み込めない場合に必要です。
-tab.advanced.create_viaversion_dump.label=ViaVersionのダンプデーターを作成
-tab.advanced.create_viaversion_dump.success=ViaVersionのダンプデーターのリンクをクリップボードにコピーしました。
-tab.advanced.upload_latest_log.label=最新のログファイルをアップロード
-tab.advanced.upload_latest_log.success=ログファイルを%sにアップロードしました(クリップボードにコピーしました)。
-tab.advanced.upload_latest_log.error_generic=ログファイルをアップロードできませんでした: %s
-tab.advanced.upload_latest_log.error_not_found=ログファイルが見つかりませんでした。
-tab.accounts.name=アカウント
-tab.accounts.description.line1=オンラインモードが有効化されたサーバーにViaProxyで参加するにはMinecraftアカウントでログインしている必要があります。使用したいアカウントを右クリックすることで選択できます。デフォルトでは一番最初のものが使用されます。
-tab.accounts.list.context_menu.select=アカウントを選択
-tab.accounts.list.context_menu.remove=削除
-tab.accounts.list.context_menu.move_up=上に上げる↑
-tab.accounts.list.context_menu.move_down=下に下げる↓
-tab.accounts.add.title=アカウントを追加
-tab.accounts.add_offline.label=オフラインアカウント
-tab.accounts.add_offline.enter_username=オフラインアカウントのユーザー名を入力してください:
-tab.accounts.add_microsoft.label=Microsoftアカウント
-tab.accounts.add_bedrock.label=統合版アカウント
-tab.accounts.add.success=アカウント「 %s 」を正常に追加しました。
-tab.accounts.add.timeout=ログイン要求がタイムアウトしました。\n%s秒以内にログインしてください。
-tab.realms.name=Realms
-tab.realms.error_generic=Realmsリクエストを処理できませんでした: %s
-tab.realms.error_generic_label=不明なエラーが発生しました。
-tab.realms.error_account=選択されたアカウントをリフレッシュできませんでした。これは有効期限を過ぎたトークンを使用しているか回数制限に達したアカウントを使用しているせいかもしれません。少し時間をおいた後もう一度試してください。問題が解決しない場合は、一度アカウントを削除してもう一度追加してください。
-tab.realms.error_account_label=アカウントエラー
-tab.realms.no_account=アカウントが選択されていません。
-tab.realms.unsupported_account=サポートされていないアカウントが選択されています。
-tab.realms.refreshing_account=アカウントをリフレッシュしています…
-tab.realms.availability_check=利用が可能か確認しています…
-tab.realms.unavailable=あなたの使用しているViaProxyのバージョンが古くMinecraft Realmsと互換性がありません。\n最新版のViaProxyを使用してください。
-tab.realms.loading_worlds=ワールドを読み込み中です…
-tab.realms.no_worlds=ワールドが見つかりませんでした。
-tab.realms.account=アカウント: %s
-tab.realms.release=リリース
-tab.realms.snapshot=スナップショット
-tab.realms.join=参加
-tab.realms.joining=参加中…
-tab.realms.accept_tos=Minecraft Realmsを使用するには利用規約に同意してください: %s
-tab.realms.expired=このRealmは期限切れです。
-tab.realms.incompatible=このRealmのMinecraftバージョンが古すぎるか新しすぎます。
-tab.ui_settings.name=UI設定
-tab.ui_settings.language.label=言語:
-tab.ui_settings.language.completion=%s翻訳済み
-tab.ui_settings.language.success=言語が%s (%s)に変更されました。ViaProxyを再起動します!
-tab.ui_settings.crowdin.info=ViaProxyの翻訳をCrowdinで手伝ってください!
-tab.ui_settings.crowdin.link=こちらをクリックしてCrowdinを開く
-popup.login_account.title=アカウントを追加
-popup.login_account.instructions.browser=以下のURLをブラウザで開いてください:
-popup.login_account.instructions.close=ログイン後、このポップアップは自動的に閉じられます。
-popup.download.title=ダウンロード中…
-popup.update.info=あなたの使用しているViaProxyは古いバージョンです!\n使用しているバージョン: %s\n最新バージョン: %s
-popup.update.question=アップデートしますか?
-popup.update.success=最新バージョンのViaProxyをダウンロードしました。ViaProxyを再起動します!
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/ko_KR.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/ko_KR.properties
deleted file mode 100644
index c6d045e..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/language/ko_KR.properties
+++ /dev/null
@@ -1,97 +0,0 @@
-language.name=한국어 (대한민국)
-generic.cancel=취소
-generic.could_not_open_url=링크를 열 수 없습니다: %s
-tab.general.name=일반
-tab.general.server_address.label=서버 주소:
-tab.general.server_address.tooltip=지원하는 주소 양식 목록:\n- 서버아이피\n- 서버아이피:서버포트\n- ClassiCube 직접 연결형 주소
-tab.general.server_version.label=서버 버전:
-tab.general.minecraft_account.label=마인크래프트 계정:
-tab.general.minecraft_account.option_no_account=계정 사용 안함
-tab.general.minecraft_account.option_select_account=선택된 계정 사용
-tab.general.betacraft_auth.label=Betacraft 인증(클래식)
-tab.general.betacraft_auth.tooltip=Betacraft 인증을 활성화하면 클래식 정품 서버에 접속하실 수 있습니다.
-tab.general.state.loading=ViaProxy를 불러오는 중...
-tab.general.state.start=시작
-tab.general.state.starting=시작하는 중...
-tab.general.state.stop=멈춤
-tab.general.state.running=ViaProxy가 구동되고 있습니다. Minecraft 버전 %s에서 %s로 연결하세요.
-tab.general.warning.ban_warning.line1=ViaProxy는 블록, 아이템, 움직임등을 해당 버전에 알맞게 변환하지 못하여 핵방지 플러그인을 사용하는 서버에서 차단당할수 있습니다.
-tab.general.warning.bedrock_warning.line1=ViaBedrock은 아직 개발 단계이며 일반 사용자에게 부적합합니다.
-tab.general.warning.risk=책임을 각오하고 사용하십시오.
-tab.general.error.no_server_version_selected=서버 버전을 선택해주세요!
-tab.general.error.invalid_classicube_url=잘못된 ClassiCube 직접 연결형 URL 주소입니다!
-tab.general.error.invalid_server_address=잘못된 서버 주소입니다!
-tab.general.error.invalid_bind_address=잘못된 외부 접근 허용 주소입니다!
-tab.general.error.invalid_proxy_url=잘못된 프록시 URL입니다!
-tab.general.error.failed_to_start=ViaProxy를 시작할 수 없습니다! 사용할 포트를 다른 프로그램이 사용 중인지 아닌지 확인하고 다시 시도하세요.
-tab.advanced.name=고급
-tab.advanced.bind_address.label=외부 접근 허용 주소:
-tab.advanced.bind_address.tooltip=ViaProxy가 외부 접근을 허용할 아이피 주소입니다.
-tab.advanced.proxy_url.label=프록시 URL:
-tab.advanced.proxy_url.tooltip=TCP 연결을 허용할 SOCKS(4/5)/HTTP(S)링크입니다. \n지원 양식:\n- type://프록시아이피:프록시포트\n- type://유저네임:암호@프록시아이피:프록시포트
-tab.advanced.proxy_online_mode.label=프록시 온라인 모드
-tab.advanced.proxy_online_mode.tooltip=프록시 온라인 모드가 켜져 있으면 구매된 계정이 필요합니다.\n프록시 온라인 모드를 사용하면 스킨을 온라인 모드 서버에서 보거나 서명된 채팅을 보낼 수 있습니다.
-tab.advanced.legacy_skin_loading.label=구버전 서버에서 스킨 불러오기
-tab.advanced.legacy_skin_loading.tooltip=구버전 서버에서 스킨 불러오기 옵션을 활성화하면 1.6.4 이하 서버에서 스킨이 불러와집니다.
-tab.advanced.chat_signing.label=채팅 서명
-tab.advanced.chat_signing.tooltip=이 옵션이 활성화되면 1.19 이상 서버에서 서명된 채팅 메시지를 보낼 수 있습니다.
-tab.advanced.ignore_packet_translation_errors.label=패킷 번역 오류 무시
-tab.advanced.ignore_packet_translation_errors.tooltip=이 옵션을 활성화 할 경우, 플레이어가 패킷 번역 오류가 발생할 때 추방되지 않으며 콘솔에만 이 오류가 로그됩니다.\n번역 오류가 발생한 패킷에 따라 오류가 발생할 수 있습니다.
-tab.advanced.allow_beta_pinging.label=베타 1.7.3 이하 서버 접근 확인 허용
-tab.advanced.allow_beta_pinging.tooltip=활성화되면 베타 1.7.3 전용 서버 접근이 되는지 확인할수 있습니다. 연결 속도를 제한하는 서버인 경우 오류가 발생할 수 있습니다.
-tab.advanced.simple_voice_chat_support.label=Simple Voice Chat 지원
-tab.advanced.simple_voice_chat_support.tooltip=Simple Voice Chat 모드 패킷 재작성과 처리를 활성화합니다.
-tab.advanced.fake_accept_resource_packs.label=리소스 팩을 다운로드하는 척하기
-tab.advanced.fake_accept_resource_packs.tooltip=리소스 팩을 다운로드 받지만 프롬포트가 출력되지 않습니다.\n버전 차이로 인해 리소스 팩이 필요한 서버에서 리소스 팩을 다운받을 수 없는 경우 필요합니다.
-tab.advanced.create_viaversion_dump.label=ViaVersion 덤프 생성
-tab.advanced.create_viaversion_dump.success=ViaVersion 덤프 링크를 클립보드에 복사했습니다.
-tab.advanced.upload_latest_log.label=최신 로그 파일 업로드
-tab.advanced.upload_latest_log.success=로그파일을 %s에 업로드했습니다. (클립보드에 복사되었습니다.)
-tab.advanced.upload_latest_log.error_generic=로그파일을 업로드할 수 없습니다: %s
-tab.advanced.upload_latest_log.error_not_found=로그파일을 찾을 수 없습니다.
-tab.accounts.name=계정
-tab.accounts.description.line1=온라인 모드 서버를 플레이하려면 이 목록에서 계정을 선택해야 합니다. 오른쪽 마우스 클릭으로 계정을 선택할 수 있습니다. 기본적으로는 첫 번째 계정이 사용됩니다.
-tab.accounts.list.context_menu.select=계정 선택
-tab.accounts.list.context_menu.remove=계정 제거
-tab.accounts.list.context_menu.move_up=위 ↑
-tab.accounts.list.context_menu.move_down=아래 ↓
-tab.accounts.add.title=계정 추가
-tab.accounts.add_offline.label=오프라인 계정
-tab.accounts.add_offline.enter_username=오프라인 모드 사용자명을 입력하세요:
-tab.accounts.add_microsoft.label=마이크로소프트 계정
-tab.accounts.add_bedrock.label=포켓 에디션 계정
-tab.accounts.add.success=계정 %s이(가) 성공적으로 추가되었습니다.
-tab.accounts.add.timeout=로그인 요청이 시간 초과 되었습니다.\n%s초 안에 로그인해주세요.
-tab.realms.name=Realms 서비스
-tab.realms.error_generic=Realms 가입 요청을 처리할 수 없습니다: %s
-tab.realms.error_generic_label=알 수 없는 오류가 발생했습니다.
-tab.realms.error_account=선택된 계정을 불러오는 데 실패했습니다. 발급받은 토큰이 만료되었거나 연결 속도 제한이 걸려있어 문제가 발생한 것일수도 있습니다. 몇 초 기다린 뒤 다시 시도하세요. 문제가 지속되면 계정 제거후 다시 추가하세요.
-tab.realms.error_account_label=계정 오류
-tab.realms.no_account=계정이 선택되지 않았습니다.
-tab.realms.unsupported_account=지원하지 않는 계정을 선택했습니다.
-tab.realms.refreshing_account=계정 불러오는 중...
-tab.realms.availability_check=사용 가능 여부 확인 중...
-tab.realms.unavailable=ViaProxy가 구버전이라서 Minecraft Realms과 호환이 되지 않습니다.\nViaProxy 최신 버전을 사용해주세요.
-tab.realms.loading_worlds=월드 로딩 중...
-tab.realms.no_worlds=월드 없음
-tab.realms.account=계정: %s
-tab.realms.release=정식 출시 버전
-tab.realms.snapshot=스냅샷 버전
-tab.realms.join=참가
-tab.realms.joining=참가 중...
-tab.realms.accept_tos=마인크래프트 Realms을 사용하려면 이용약관에 동의해야합니다: %s
-tab.realms.expired=이 Realms은 만료된 Realms입니다.
-tab.realms.incompatible=이 Realms의 Minecraft 버전이 너무 구버전이거나 너무 최신 버전입니다.
-tab.ui_settings.name=UI 설정
-tab.ui_settings.language.label=언어 선택:
-tab.ui_settings.language.completion=%s 번역됨
-tab.ui_settings.language.success=%s (%s)으로 언어 변경에 성공했습니다. ViaProxy가 곧 재시작합니다.
-tab.ui_settings.crowdin.info=언어가 없거나 미완성되었나요? Crowdin에서 ViaProxy 번역에 도움을 주실 수 있어요!
-tab.ui_settings.crowdin.link=클릭해서 Crowdin 가기
-popup.login_account.title=계정 추가
-popup.login_account.instructions.browser=브라우저에서 이 링크를 열어주세요:
-popup.login_account.instructions.close=이 창은 당신이 로그인한 뒤 자동으로 닫힙니다.
-popup.download.title=다운로드 중...
-popup.update.info=ViaProxy의 구버전을 사용하고 있습니다!\n현재 버전: %s\n최신 버전: %s
-popup.update.question=업데이트 하시겠습니까?
-popup.update.success=ViaProxy 최신 버전이 다운로드되었습니다. ViaProxy가 곧 재시작합니다.
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/nl_NL.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/nl_NL.properties
deleted file mode 100644
index e69de29..0000000
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/no_NO.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/no_NO.properties
deleted file mode 100644
index e69de29..0000000
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/pl_PL.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/pl_PL.properties
deleted file mode 100644
index 70aa594..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/language/pl_PL.properties
+++ /dev/null
@@ -1,97 +0,0 @@
-language.name=Polski (Polska)
-generic.cancel=Anuluj
-generic.could_not_open_url=Nie można otworzyć odnośnika %s
-tab.general.name=Ogólne
-tab.general.server_address.label=Adres Serwera:
-tab.general.server_address.tooltip=Format:\n- host\n- host:port\n- Odnośnik ClassiCube
-tab.general.server_version.label=Wersja Serwera:
-tab.general.minecraft_account.label=Konto Minecraft:
-tab.general.minecraft_account.option_no_account=Nie używaj konta.
-tab.general.minecraft_account.option_select_account=Użyj wybranego konta.
-tab.general.betacraft_auth.label=Autoryzacja BetaCraft (Classic)
-tab.general.betacraft_auth.tooltip=Włączenie autoryzacji BetaCraft pozwoli tobie na dołączenie do serwerów klasycznych które posiadają włączony tryb online.
-tab.general.state.loading=Ładowanie ViaProxy...
-tab.general.state.start=Start
-tab.general.state.starting=Uruchamianie...
-tab.general.state.stop=Zatrzymaj
-tab.general.state.running=Uruchomiono! Połącz się używając wersji %s z serwerem %s.
-tab.general.warning.ban_warning.line1=ViaProxy może powodować problemy z zabezpieczeniami AntiCheat na serwerze.
-tab.general.warning.bedrock_warning.line1=ViaBedrock jest aktualnie we wczesnym etapie produkcji i nie jest w pełni gotowa.
-tab.general.warning.risk=Używasz na własne ryzyko!
-tab.general.error.no_server_version_selected=Wybierz wersję serwera.
-tab.general.error.invalid_classicube_url=Nieprawidłowy odnośnik ClassiCube!
-tab.general.error.invalid_server_address=Nieprawidłowy adres serwera.
-tab.general.error.invalid_bind_address=Nieprawidłowy adres powiązania!
-tab.general.error.invalid_proxy_url=Nieprawidłowy adres serwera proxy.
-tab.general.error.failed_to_start=Nie można uruchomić ViaProxy! Upewnij się że port nie jest już zajęty i spróbuj ponownie.
-tab.advanced.name=Zaawansowane
-tab.advanced.bind_address.label=Adres powiązania:
-tab.advanced.bind_address.tooltip=Adres ViaProxy powinien zaakceptować przychodzące połączenia na.
-tab.advanced.proxy_url.label=Adres Proxy:
-tab.advanced.proxy_url.tooltip=Adres SOCKS(4/5)/HTTP(S) proxy.\nFormat:\n- typ://adres:port\n- typ://użytkownik:hasło@adres:port
-tab.advanced.proxy_online_mode.label=Tryb Online
-tab.advanced.proxy_online_mode.tooltip=Włączenie trybu online spowoduje że osoba łącząca się do proxy będzie musiała posiadać zakupioną kopię Minecrafta.\nTryb online pozwala tobie na zobaczenie skórek na serwerach oraz używać funkcji podpisanego czatu.
-tab.advanced.legacy_skin_loading.label=Pierwotne ładowanie skórek
-tab.advanced.legacy_skin_loading.tooltip=Włączenie pierwotnego ładowania skórek pozwoli tobie zobaczyć skórkę na serwerach których wersja jest niższa niż 1.6.4.
-tab.advanced.chat_signing.label=Podpisywanie Czatu
-tab.advanced.chat_signing.tooltip=Włącza podpisywanie czatu na serwerach których wersja jest wyższa niż 1.19.
-tab.advanced.ignore_packet_translation_errors.label=Ignoruj błędy tłumaczeń pakietów.
-tab.advanced.ignore_packet_translation_errors.tooltip=Włączenie tego spowoduje brak rozłączeń w przypadku błędu tłumaczenia pakietów.\nMoże to spowodować problemy w zależności od pakietu który nie został przetłumaczony.
-tab.advanced.allow_beta_pinging.label=Zezwól na pingowanie z <= b1.7.3
-tab.advanced.allow_beta_pinging.tooltip=Włączenie tej opcji pozwoli na pingowanie serwerów w wersji <= b1.7.3. Może to powodować problemy z serwerami, które blokują zbyt częste połączenia.
-tab.advanced.simple_voice_chat_support.label=Obsługa Simple Voice Chat
-tab.advanced.simple_voice_chat_support.tooltip=Włącza obsługę i modyfikację pakietów moda Simple Voice Chat.
-tab.advanced.fake_accept_resource_packs.label=Fałszywe akceptowanie paczek zasobów
-tab.advanced.fake_accept_resource_packs.tooltip=Akceptuje paczki zasobów od serwera bez wyświetlania komunikatu dla klienta.\nJest to wymagane dla serwerów, które wymagają paczki zasobów, gdy klient nie może jej załadować z powodu różnic wersji.
-tab.advanced.create_viaversion_dump.label=Utwórz zrzut pamięci ViaVersion
-tab.advanced.create_viaversion_dump.success=Skopiowano odnośnik zrzutu pamięci do schowka.
-tab.advanced.upload_latest_log.label=Prześlij ostatni plik dziennika.
-tab.advanced.upload_latest_log.success=Przesłano ostatni plik dziennika do %s (skopiowano do schowka)
-tab.advanced.upload_latest_log.error_generic=Plik dziennika nie może zostać przesłany: %s
-tab.advanced.upload_latest_log.error_not_found=Plik dziennika nie został znaleziony.
-tab.accounts.name=Konta
-tab.accounts.description.line1=Aby dołączyć do serwerów które mają tryb online, musisz dodać oryginalne konto Minecraft. Konto możesz wybrać klikając na nie prawym przyciskiem, domyślnie pierwsze konto jest używane.
-tab.accounts.list.context_menu.select=Wybierz Konto
-tab.accounts.list.context_menu.remove=Usuń
-tab.accounts.list.context_menu.move_up=Góra ↑
-tab.accounts.list.context_menu.move_down=Dół ↓
-tab.accounts.add.title=Dodaj Konto
-tab.accounts.add_offline.label=Konto Offline
-tab.accounts.add_offline.enter_username=Podaj nazwę użytkownika:
-tab.accounts.add_microsoft.label=Konto Microsoft
-tab.accounts.add_bedrock.label=Konto Bedrock
-tab.accounts.add.success=Konto %s zostało dodane.
-tab.accounts.add.timeout=Zapytanie logowania się przedawniło.\nZaloguj się w ciągu %s sekund.
-tab.realms.name=Realms
-tab.realms.error_generic=Zapytanie nie może zostac obsłużone: %s
-tab.realms.error_generic_label=Wystąpił nieoczekiwany problem.
-tab.realms.error_account=Nie można odświeżyc wybranego konta, może to być spowodowane przez wygaśnięty token konta bądź limity zapytań. Odczekaj chwilę i spróbuj ponownie, jeśli problem zostanie usuń i dodaj konto ponownie.
-tab.realms.error_account_label=Problem z kontem
-tab.realms.no_account=Brak wybranego konta
-tab.realms.unsupported_account=Niewspierane konto zostało wybrane
-tab.realms.refreshing_account=Odświeżanie konta...
-tab.realms.availability_check=Sprawdzanie dostępności...
-tab.realms.unavailable=Twoja wersja ViaProxy jest przedawniona i jest niekompatybilna z Minecraft Realms.\nZaktualizuj ViaProxy do najnowszej wersji.
-tab.realms.loading_worlds=Ładowanie światów...
-tab.realms.no_worlds=Nie znaleziono dostępnych światów
-tab.realms.account=Konto: %s
-tab.realms.release=Release
-tab.realms.snapshot=Snapshot
-tab.realms.join=Dołącz
-tab.realms.joining=Dołączanie...
-tab.realms.accept_tos=Aby używać Minecraft Realms musisz zaakceptować warunki: %s
-tab.realms.expired=Ten świat Realm wygasł.
-tab.realms.incompatible=Ta wersja Mniecraft Realms jest zbyt nowa lub zbyt stara.
-tab.ui_settings.name=Ustawienia Interfejsu
-tab.ui_settings.language.label=Język:
-tab.ui_settings.language.completion=Przetłumaczone w %s
-tab.ui_settings.language.success=Język został zmieniony na %s (%s), aplikacja zostanie uruchomiona ponownie.
-tab.ui_settings.crowdin.info=Brakuje Twojego języka lub jest on niekompletny? Pomóż nam przetłumaczyć ViaProxy na Crowdin!
-tab.ui_settings.crowdin.link=Kliknij tutaj, aby przejść do Crowdin
-popup.login_account.title=Dodaj Konto
-popup.login_account.instructions.browser=Otwórz odnośnik w swojej przeglądarce:
-popup.login_account.instructions.close=Okienko zostanie zamknięte automatycznie po zalogowaniu.
-popup.download.title=Pobieranie...
-popup.update.info=Twoja wersja ViaProxy jest nieaktualna.\nTwoja Wersja: %s\nNajnowsza Wersja: %s
-popup.update.question=Czy chcesz zaktualizować ViaProxy do najnowszej wersji?
-popup.update.success=Pobrano aktualizację ViaProxy, wymagane jest ponownie uruchomienie aplikacji.
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/pt_BR.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/pt_BR.properties
deleted file mode 100644
index 373d41e..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/language/pt_BR.properties
+++ /dev/null
@@ -1,76 +0,0 @@
-language.name=Português (Brasil)
-generic.cancel=Cancelar
-generic.could_not_open_url=Não foi possível abrir o link: %s
-tab.general.name=Geral
-tab.general.server_address.label=Endereço de servidor:
-tab.general.server_address.tooltip=Formato suportados\n-endereço\n-endereço:porta\n-Link do ClassiCube
-tab.general.server_version.label=Versão do servidor:
-tab.general.minecraft_account.label=Conta Minecraft:
-tab.general.minecraft_account.option_no_account=Usar sem conta
-tab.general.minecraft_account.option_select_account=Usar conta selecionada
-tab.general.betacraft_auth.label=Autenticação BetaCraft (Clássico)
-tab.general.betacraft_auth.tooltip=Ativando a autenticação BetaCraft permite que você entre em servidor clássicos estando com o modo online ligado.
-tab.general.state.loading=Carregando ViaProxy...
-tab.general.state.start=Ligar
-tab.general.state.starting=Ligando...
-tab.general.state.stop=Parar
-tab.general.state.running=ViaProxy foi iniciado! Conectado ao Minecraft %s para %s
-tab.general.warning.ban_warning.line1=O ViaProxy pode acionar anti-cheats devido aos blocos, itens, movimentação e outras diferenças entre versões.
-tab.general.warning.bedrock_warning.line1=ViaBedrock ainda está sendo desenvolvido no estado inicial e não está pronto para um uso geral.
-tab.general.warning.risk=Use por sua conta e risco!
-tab.general.error.no_server_version_selected=Por favor, selecione uma versão para o servidor!
-tab.general.error.invalid_classicube_url=ClassiCube Direct URL está inválido!
-tab.general.error.invalid_server_address=Endereço do servidor está inválido!
-tab.general.error.invalid_bind_address=Endereço de vinculação está inválido!
-tab.general.error.invalid_proxy_url=URL de Proxy invalida!
-tab.general.error.failed_to_start=O ViaProxy falhou ao iniciar! Certifique-se de que a porta local não está em uso e tente novamente.
-tab.advanced.name=Avançado
-tab.advanced.bind_address.label=Endereço de vinculação:
-tab.advanced.bind_address.tooltip=O endereço ViaProxy deve aceitar conexões de entrada.
-tab.advanced.proxy_url.label=URL do proxy:
-tab.advanced.proxy_url.tooltip=URL do SOCKS(4/5)/HTTPS(S) o proxy será usado para conexões TCP\n-digite://endereço:porta\n-digite://nomedousuario:senha@endereço:porta
-tab.advanced.proxy_online_mode.label=Modo Online em proxy
-tab.advanced.proxy_online_mode.tooltip=Ativar o Modo Online do Proxy exige que seu cliente possua uma conta válida de Minecraft.\nO Modo Online do Proxy permite ver skins em servidores no modo online e usar os recursos de chat assinado.
-tab.advanced.legacy_skin_loading.label=Carregamento de skin de legado
-tab.advanced.legacy_skin_loading.tooltip=Ligando o carregamento de skin de legado permite que você veja skins de servidores 1.6.4 para baixo.
-tab.advanced.chat_signing.tooltip=Ativa o envio de mensagens assinadas no chat em servidores maiores ou iguais a 1.19.
-tab.advanced.ignore_packet_translation_errors.label=Ignorar erros de tradução de pacote
-tab.advanced.allow_beta_pinging.label=Permitir marcação da b1.7.3 para baixo
-tab.advanced.allow_beta_pinging.tooltip=Ligando isso permite que você marque em servidores b1.7.3 para baixo. Talvez isso possa causar problemas com servidores com bloqueios frequentes de conexões.
-tab.advanced.simple_voice_chat_support.label=Suporte ao Simple Voice Chat
-tab.advanced.simple_voice_chat_support.tooltip=Permite o manuseio e a reescrita de pacotes do mod Simple Voice Chat.
-tab.advanced.fake_accept_resource_packs.label=Falsificar aceitação do pacote de textura
-tab.advanced.fake_accept_resource_packs.tooltip=Aceita pacotes de recursos do servidor sem exibir um prompt ao cliente.\nIsso é necessário para servidores que exigem um pacote de recursos, mas o cliente não consegue carregá-lo devido a diferenças de versão.
-tab.advanced.create_viaversion_dump.label=Gerar dump do ViaVersion
-tab.advanced.create_viaversion_dump.success=Copiado ViaVersion dump para a área de transferência.
-tab.advanced.upload_latest_log.label=Enviar o arquivo de registro mais recente
-tab.advanced.upload_latest_log.success=Arquivo de registro foi enviado para %s (copiado para a área de transferência)
-tab.advanced.upload_latest_log.error_generic=O arquivo de registro não pôde ser enviado: %s
-tab.advanced.upload_latest_log.error_not_found=O arquivo de log. não pôde ser encontrado.
-tab.accounts.name=Contas
-tab.accounts.description.line1=Para entrar em servidores no modo online, você precisa adicionar uma conta Minecraft para o ViaProxy usar. Você pode selecionar uma conta clicando nela com o botão direito. Por padrão, a primeira conta será usada.
-tab.accounts.list.context_menu.select=Selecionar Conta
-tab.accounts.list.context_menu.remove=Remover
-tab.accounts.list.context_menu.move_up=Mover para cima ↑
-tab.accounts.list.context_menu.move_down=Mover para baixo ↓
-tab.accounts.add.title=Adicionar Conta
-tab.accounts.add_offline.label=Conta Offline
-tab.accounts.add_offline.enter_username=Coloque seu nome de usuário para o modo offline:
-tab.accounts.add_microsoft.label=Conta da Microsoft
-tab.accounts.add_bedrock.label=Conta do Bedrock
-tab.accounts.add.success=A conta %s foi adicionada com sucesso.
-tab.accounts.add.timeout=O tempo do pedido de registro expirou.\nPor favor registre-se em %s segundos.
-tab.realms.name=Realms
-tab.realms.error_generic_label=Houve um erro desconhecido
-tab.realms.error_account_label=Erro de Conta
-tab.realms.no_account=Nenhuma conta selecionada
-tab.realms.unsupported_account=Conta selecionada não é suportada
-tab.realms.refreshing_account=Atualizando conta...
-tab.realms.snapshot=Versão Experimental
-tab.realms.join=Entrar
-tab.realms.joining=Entrando...
-tab.ui_settings.name=Configurações da Interface do Usuário
-tab.ui_settings.language.label=Linguagem:
-popup.login_account.title=Adicionar Conta
-popup.update.question=Você deseja atualizar?
-popup.update.success=Baixada a versão mais recente do ViaProxy. O ViaProxy será reiniciado agora!
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/pt_PT.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/pt_PT.properties
deleted file mode 100644
index 86af3bf..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/language/pt_PT.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-language.name=Português (Portugal)
-generic.cancel=Cancelar
-generic.could_not_open_url=Não foi possível estabelecer uma conexão:%s
-tab.general.name=Geral
-tab.general.server_address.label=Endereço do servidor:
-tab.general.server_address.tooltip=endereço\nendereço:porta\nURL direta do ClassiCube
-tab.general.server_version.label=Versão do servidor:
-tab.general.minecraft_account.label=Conta Minecraft:
-tab.general.minecraft_account.option_no_account=Não usar conta
-tab.general.minecraft_account.option_select_account=Usar conta selecionada
-tab.general.betacraft_auth.label=Usar autenticação Betacraft (Clássica)
-tab.general.betacraft_auth.tooltip=Ligando a autenticação BetaCraft permite que entre em servidores com modo online ativo.
-tab.general.state.loading=Carregando o ViaProxy...
-tab.general.state.start=Começar
-tab.general.state.starting=Começando...
-tab.general.state.stop=Parar
-tab.general.state.running=ViaProxy está rodando! Conecte com o Minecraft %s na %s
-tab.general.warning.ban_warning.line1=ViaProxy talvez possa ativar anti trapaças, ao botar blocos, movimento de ‘item’ e também outras diferenças entre versões.
-tab.general.warning.bedrock_warning.line1=O ViaBedrock está atualmente no início do desenvolvimento e não está pronto para uso geral.
-tab.general.warning.risk=Use por sua conta e risco!
-tab.general.error.no_server_version_selected=Por favor, selecione a versão do servidor!
-tab.general.error.invalid_classicube_url=URL direta do ClassiCube invalida!
-tab.general.error.invalid_server_address=Endereço invalido do servidor!
-tab.general.error.invalid_bind_address=Endereço vinculado invalido!
-tab.general.error.invalid_proxy_url=Proxy e URL invalida!
-tab.general.error.failed_to_start=Falha ao começar o ViaProxy! Garanta que a porta local não esteja em uso ou tente novamente.
-tab.advanced.name=Avançado
-tab.advanced.bind_address.label=Vincular Endereço:
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/ro_RO.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/ro_RO.properties
deleted file mode 100644
index e69de29..0000000
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/ru_RU.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/ru_RU.properties
deleted file mode 100644
index 42e3daa..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/language/ru_RU.properties
+++ /dev/null
@@ -1,97 +0,0 @@
-language.name=Русский (Россия)
-generic.cancel=Отменить
-generic.could_not_open_url=Не удалось открыть ссылку: %s
-tab.general.name=Общие
-tab.general.server_address.label=Адрес сервера:
-tab.general.server_address.tooltip=Поддерживаемые форматы:\n- адрес\n- адрес:порт\n- ClassiCube Direct URL
-tab.general.server_version.label=Версия сервера:
-tab.general.minecraft_account.label=Учётная запись Minecraft:
-tab.general.minecraft_account.option_no_account=Не использовать
-tab.general.minecraft_account.option_select_account=Использовать выбранную
-tab.general.betacraft_auth.label=Авторизация BetaCraft (Classic)
-tab.general.betacraft_auth.tooltip=Включение авторизации BetaCraft позволяет присоединяться\nк серверам Classic с включённой проверкой лицензии.
-tab.general.state.loading=Загрузка ViaProxy...
-tab.general.state.start=Запуск
-tab.general.state.starting=Запуск...
-tab.general.state.stop=Остановить
-tab.general.state.running=ViaProxy запущен. Подключитесь к %2$s через Minecraft %1$s.
-tab.general.warning.ban_warning.line1=ViaProxy может привести к срабатыванию античитов из-за различий между версиями в блоках, предметах, управлении и других вещах.
-tab.general.warning.bedrock_warning.line1=ViaBedrock ещё на ранней стадии разработки и не подходит для обычной игры.
-tab.general.warning.risk=Используйте на свой страх и риск!
-tab.general.error.no_server_version_selected=Укажите версию сервера.
-tab.general.error.invalid_classicube_url=Неверный ClassiCube Direct URL.
-tab.general.error.invalid_server_address=Неверный адрес сервера.
-tab.general.error.invalid_bind_address=Неверный внутренний порт.
-tab.general.error.invalid_proxy_url=Неверный адрес прокси-сервера.
-tab.general.error.failed_to_start=Не удалось запустить ViaProxy. Убедитесь, что локальный порт не используется и попробуйте снова.
-tab.advanced.name=Дополнительные
-tab.advanced.bind_address.label=Внутренний порт:
-tab.advanced.bind_address.tooltip=Адрес для входящих подключений, принимаемых ViaProxy.
-tab.advanced.proxy_url.label=Адрес прокси-сервера:
-tab.advanced.proxy_url.tooltip=Адрес прокси-сервера с SOCKS(4/5)/HTTP(S) для TCP-подключений.\nПоддерживаемые форматы:\n- протокол://адрес:порт\n- протокол://имя_пользователя:пароль@адрес:порт
-tab.advanced.proxy_online_mode.label=Поддержка лицензии
-tab.advanced.proxy_online_mode.tooltip=Позволяет полноценно общаться в режиме защищённого чата\nи видеть скины на серверах, использующих проверку лицензии.\nТребуется учётная запись с действующей лицензией.
-tab.advanced.legacy_skin_loading.label=Скины старых версий
-tab.advanced.legacy_skin_loading.tooltip=Позволяет видеть скины на серверах версии 1.6.4 и ниже.
-tab.advanced.chat_signing.label=Защищённый чат
-tab.advanced.chat_signing.tooltip=Позволяет отправлять подписанные сообщения на серверах версии 1.19 и выше.
-tab.advanced.ignore_packet_translation_errors.label=Пропуск ошибок обработки
-tab.advanced.ignore_packet_translation_errors.tooltip=Выводит в терминал сообщение об ошибке обработки пакета вместо отключения.\nМожет вызывать различные проблемы в зависимости от значимости пакета.
-tab.advanced.allow_beta_pinging.label=Проверка соединения ≤b1.7.3
-tab.advanced.allow_beta_pinging.tooltip=Позволяет пинговать серверы версии b1.7.3 и ниже. Может привести\nк проблемам с серверами, блокирующими слишком частые запросы.
-tab.advanced.simple_voice_chat_support.label=Поддержка Simple Voice Chat
-tab.advanced.simple_voice_chat_support.tooltip=Позволяет принимать и обрабатывать пакеты мода Simple Voice Chat.
-tab.advanced.fake_accept_resource_packs.label=Обход загрузки наборов ресурсов
-tab.advanced.fake_accept_resource_packs.tooltip=Позволяет пропускать загрузку обязательных наборов ресурсов без уведомления клиента. Необходимо для игры на серверах с наборами, которые невозможно использовать из-за различий между версиями.
-tab.advanced.create_viaversion_dump.label=Создать дамп ViaVersion
-tab.advanced.create_viaversion_dump.success=Ссылка на дамп ViaVersion скопирована в буфер обмена.
-tab.advanced.upload_latest_log.label=Поделиться журналом
-tab.advanced.upload_latest_log.success=Журнал загружен на %s (ссылка скопирована в буфер обмена).
-tab.advanced.upload_latest_log.error_generic=Не удалось загрузить файл журнала: %s
-tab.advanced.upload_latest_log.error_not_found=Не удалось найти файл журнала.
-tab.accounts.name=Учётные записи
-tab.accounts.description.line1=Добавьте в ViaProxy учётную запись Minecraft, чтобы присоединяться к серверам с проверкой лицензии. Учётную запись можно выбрать двойным щелчком или в контекстном меню. По умолчанию будет использоваться верхняя позиция.
-tab.accounts.list.context_menu.select=Выбрать
-tab.accounts.list.context_menu.remove=Удалить
-tab.accounts.list.context_menu.move_up=↑ Вверх
-tab.accounts.list.context_menu.move_down=↓ Вниз
-tab.accounts.add.title=Добавление учётной записи
-tab.accounts.add_offline.label=Локальная
-tab.accounts.add_offline.enter_username=Введите имя пользователя:
-tab.accounts.add_microsoft.label=Microsoft
-tab.accounts.add_bedrock.label=Bedrock
-tab.accounts.add.success=Учётная запись %s успешно добавлена.
-tab.accounts.add.timeout=Время ожидания входа истекло.\nНеобходимо авторизоваться в течение %s секунд.
-tab.realms.name=Realms
-tab.realms.error_generic=Не удалось обработать запрос Realms: %s
-tab.realms.error_generic_label=Произошла ошибка
-tab.realms.error_account=Не удалось обновить учётную запись. Это может быть вызвано устаревшим токеном или слишком частыми запросами. Подождите несколько секунд и попробуйте снова. Если проблема сохраняется, удалите учётную запись и добавьте её снова.
-tab.realms.error_account_label=Ошибка учётной записи
-tab.realms.no_account=Не выбрана учётная запись
-tab.realms.unsupported_account=Текущая учётная запись не поддерживается
-tab.realms.refreshing_account=Обновление учётной записи...
-tab.realms.availability_check=Проверка доступности...
-tab.realms.unavailable=Версия ViaProxy устарела и не работает с Minecraft Realms.\nИспользуйте новейшую версию ViaProxy.
-tab.realms.loading_worlds=Загрузка миров...
-tab.realms.no_worlds=Миры не обнаружены
-tab.realms.account=Учётная запись: %s
-tab.realms.release=Релиз
-tab.realms.snapshot=Предварительная версия
-tab.realms.join=Присоединиться
-tab.realms.joining=Подключение...
-tab.realms.accept_tos=Примите пользовательское соглашение, чтобы использовать Minecraft Realms: %s
-tab.realms.expired=Этот реалм просрочен
-tab.realms.incompatible=Версия этого реалма слишком старая или слишком новая
-tab.ui_settings.name=Интерфейс
-tab.ui_settings.language.label=Язык:
-tab.ui_settings.language.completion=переведено %s
-tab.ui_settings.language.success=Язык ViaProxy изменён на %s (%s). Требуется перезапуск.
-tab.ui_settings.crowdin.info=Перевод неполон или неточен? Помогите улучшить локализацию ViaProxy на Crowdin!
-tab.ui_settings.crowdin.link=Нажмите для перехода на Crowdin
-popup.login_account.title=Добавление учётной записи
-popup.login_account.instructions.browser=Откройте этот адрес в браузере:
-popup.login_account.instructions.close=После успешной авторизации окно закроется автоматически.
-popup.download.title=Загрузка...
-popup.update.info=Вы используете устаревшую версию ViaProxy.\nТекущая версия: %s\nНовейшая версия: %s
-popup.update.question=Установить обновление?
-popup.update.success=Последняя версия ViaProxy загружена. Требуется перезапуск.
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/sr_SP.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/sr_SP.properties
deleted file mode 100644
index e69de29..0000000
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/sv_SE.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/sv_SE.properties
deleted file mode 100644
index e69de29..0000000
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/tr_TR.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/tr_TR.properties
deleted file mode 100644
index 655d07f..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/language/tr_TR.properties
+++ /dev/null
@@ -1,97 +0,0 @@
-language.name=Türkçe (Türkiye)
-generic.cancel=İptal
-generic.could_not_open_url=Link açılamadı: %s
-tab.general.name=Genel
-tab.general.server_address.label=Sunucu Adresi:
-tab.general.server_address.tooltip=Desteklenen formatlar:\n- adres\n- adres:port\n- ClassiCube Doğrudan URL
-tab.general.server_version.label=Sunucu Sürümü:
-tab.general.minecraft_account.label=Minecraft Hesabı:
-tab.general.minecraft_account.option_no_account=Hesap kullanmayın
-tab.general.minecraft_account.option_select_account=Seçili hesabı kullan
-tab.general.betacraft_auth.label=BetaCraft Doğrulama (Klasik)
-tab.general.betacraft_auth.tooltip=BetaCraft doğrulamayı etkinleştirmek sizin online modu açık klasik sunuculara katılmanızı sağlar.
-tab.general.state.loading=ViaProxy Yükleniyor...
-tab.general.state.start=Başlat
-tab.general.state.starting=Başlatılıyor...
-tab.general.state.stop=Durdur
-tab.general.state.running=ViaProxy çalışıyor! Minecraft %s ile %s arası sürümlerden bağlanabilirsin
-tab.general.warning.ban_warning.line1=ViaProxy blok, eşya, hareket ve diğer sürüm farklılıklarından dolayı bazı anti hilelere takılabilir.
-tab.general.warning.bedrock_warning.line1=ViaBedrock şu anlık çok erken geliştirme aşamasında olup genel kullanıma hazır değildir.
-tab.general.warning.risk=Kullanımlar sizin sorumluluğunuzdur!
-tab.general.error.no_server_version_selected=Lütfen bir sunucu sürümü seçin!
-tab.general.error.invalid_classicube_url=Geçersiz ClassiCube URL'si!
-tab.general.error.invalid_server_address=Geçersiz sunucu adresi!
-tab.general.error.invalid_bind_address=Geçersiz bağlantı adresi!
-tab.general.error.invalid_proxy_url=Geçersiz proxy URL'si!
-tab.general.error.failed_to_start=ViaProxy başlatılamadı! Lütfen yerel portun kullanımda olmadığından emin olup tekrar deneyin.
-tab.advanced.name=Gelişmiş
-tab.advanced.bind_address.label=Bağlantı Adresi:
-tab.advanced.bind_address.tooltip=ViaProxy'nin gelen bağlantıları kabul edeceği adres.
-tab.advanced.proxy_url.label=Proxy URL'si:
-tab.advanced.proxy_url.tooltip=TCP bağlantıları için kullanılacak proxy'nin SOCKS(4/5)/HTTP(S) URL'si.\nDesteklenen formatlar:\n- tür://adres:port\n- tür://kullanıcıadı:şifre@adres:port
-tab.advanced.proxy_online_mode.label=Proxy Online Modu
-tab.advanced.proxy_online_mode.tooltip=Proxy Online modunu aktive etmek geçerli bir minecraft hesabı gerektirir.\nProxy Online modu online mod sunucularda skinleri görmenizi ve imzalı sohbet özelliklerini kullanmanıza olanak tanır.
-tab.advanced.legacy_skin_loading.label=Eski Skin Yükleme
-tab.advanced.legacy_skin_loading.tooltip=Eski Skin Yüklemeyi etkinleştirerek 1.6.4 ve daha eski sunucularda skinleri görmenizi sağlar.
-tab.advanced.chat_signing.label=Sohbet imzalama
-tab.advanced.chat_signing.tooltip=1.19 ve daha güncel sürümlerde imzalı mesaj göndermenizi sağlar.
-tab.advanced.ignore_packet_translation_errors.label=Paket çeviri hatalarını görmezden gel
-tab.advanced.ignore_packet_translation_errors.tooltip=Bu özelliği açmanız paket hatalarında sunucudan atılmanızı engeller. Bunun yerine konsola hatayı yazdırır.\nBu özellik çeviri hatası bulunan paketin türüne göre hatalar oluşturabilir.
-tab.advanced.allow_beta_pinging.label=b1.7.3 ve öncesi pinglere izin ver
-tab.advanced.allow_beta_pinging.tooltip=Bu özelliği açmanız b1.7.3 ve öncesi sunucularda ping özelliğine izin verir. Bu özellik çok sıklıklı bağlantıları engelleyen sunucularda sorun oluşturabilir.
-tab.advanced.simple_voice_chat_support.label=Basit Sesli Sohbet Özelliği
-tab.advanced.simple_voice_chat_support.tooltip=Basit Sesli Sohbet moduna ait paketlerin işlenmesine izin verir.
-tab.advanced.fake_accept_resource_packs.label=Kaynak paketlerini kabul et(sahte)
-tab.advanced.fake_accept_resource_packs.tooltip=Bu özellik kaynak paketlerini kullanıcıya sormadan doğrudan kabul eder.\nKaynak paketi gerektiren ancak istemcinin sürüm farklılıkları nedeniyle yükleyemeyen sunucular için gereklidir.
-tab.advanced.create_viaversion_dump.label=ViaVersion dökümü oluştur
-tab.advanced.create_viaversion_dump.success=ViaVersion dökümü adresi panoya kopyalandı.
-tab.advanced.upload_latest_log.label=Son kütük dosyasını yükle
-tab.advanced.upload_latest_log.success=Kütük dosyası %s adresine yüklendi (panoya kopyalandı)
-tab.advanced.upload_latest_log.error_generic=Kütük dosyası yüklenemedi: %s
-tab.advanced.upload_latest_log.error_not_found=Kütük dosyası bulunamadı.
-tab.accounts.name=Hesaplar
-tab.accounts.description.line1=Online mod sunuculara katılabilmek için ViaProxy'nin kullanabileceği bir minecraft hesabı eklemeniz gerekmektedir. Hesabı sağ tıklayarak seçebilirsin. Varsayılan olarak ilk seçenek kullanılacaktır.
-tab.accounts.list.context_menu.select=Hesap Seç
-tab.accounts.list.context_menu.remove=Kaldır
-tab.accounts.list.context_menu.move_up=Yukarı taşı ↑
-tab.accounts.list.context_menu.move_down=Aşağı taşı ↓
-tab.accounts.add.title=Hesap Ekle
-tab.accounts.add_offline.label=Offline Hesap
-tab.accounts.add_offline.enter_username=Offline mod kullanıcı adınızı girin:
-tab.accounts.add_microsoft.label=Microsoft Hesabı
-tab.accounts.add_bedrock.label=Bedrock Hesabı
-tab.accounts.add.success=%s hesabı başarıyla eklendi.
-tab.accounts.add.timeout=Giriş isteği zaman aşımına uğradı.\nLütfen %s saniye içerisinde giriş yapın.
-tab.realms.name=Realms
-tab.realms.error_generic=Realms isteği işlenemedi: %s
-tab.realms.error_generic_label=Bilinmeyen bir hata oluştu
-tab.realms.error_account=Seçili hesap yenilenemedi. Bu durum süresi dolmuş hesap tokenleri veya sınırlı oranın aşılmasından dolayı olmuş olabilir. Birkaç saniye bekledikten sonra tekrar deneyin. Eğer problem devam ediyorsa hesabı kaldırıp tekrardan ekleyin.
-tab.realms.error_account_label=Hesap hatası
-tab.realms.no_account=Hesap seçilmedi
-tab.realms.unsupported_account=Desteklenmeyen hesap seçildi
-tab.realms.refreshing_account=Hesap yenileniyor...
-tab.realms.availability_check=Kullanılabilirlik kontrol ediliyor...
-tab.realms.unavailable=ViaProxy çok eski ve Realms le uyumlu değil.\nLütfen ViaProxy'nin son sürümünü kullanın.
-tab.realms.loading_worlds=Dünyalar yükleniyor...
-tab.realms.no_worlds=Dünya bulunamadı
-tab.realms.account=Hesap: %s
-tab.realms.release=Kararlı
-tab.realms.snapshot=Snapshot
-tab.realms.join=Katıl
-tab.realms.joining=Katılıyor...
-tab.realms.accept_tos=Minecraft Realm'leri kullanmak için Hizmet Şartları'nı kabul etmeniz gerekiyor: %s
-tab.realms.expired=Bu Realm'in süresi doldu
-tab.realms.incompatible=Bu Realm'in Minecraft sürümü çok eski veya çok yeni
-tab.ui_settings.name=UI Ayarları
-tab.ui_settings.language.label=Dil:
-tab.ui_settings.language.completion=%s çevrildi
-tab.ui_settings.language.success=Dil %s (%s) olarak değiştirildi. ViaProxy yeniden başlatılacak!
-tab.ui_settings.crowdin.info=Diliniz eksik veya tamamlanmamış mı? Crowdin üzerinden ViaProxy'nin çevrilmesine yardım edin!
-tab.ui_settings.crowdin.link=Crowdin'e gitmek için buraya basın
-popup.login_account.title=Hesap Ekle
-popup.login_account.instructions.browser=Lütfen bu URL'i tarayıcınızda açın:
-popup.login_account.instructions.close=Bu açılır pencere giriş yaptıktan sonra otomatik kapanacaktır.
-popup.download.title=İndiriliyor...
-popup.update.info=ViaProxy'nin eski bir sürümünü kullanıyorsunuz!\nŞu anki sürüm: %s\nSon sürüm: %s
-popup.update.question=Güncellemek ister misiniz?
-popup.update.success=ViaProxy'nin son sürümü indirildi. ViaProxy yeniden başlatılacaktır!
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/uk_UA.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/uk_UA.properties
deleted file mode 100644
index eb7a8d5..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/language/uk_UA.properties
+++ /dev/null
@@ -1,97 +0,0 @@
-language.name=Українська (Україна)
-generic.cancel=Скасувати
-generic.could_not_open_url=Неможливо відкрити посилання: %s
-tab.general.name=Загальна
-tab.general.server_address.label=Адрес Сервера:
-tab.general.server_address.tooltip=Підтримувані формати:\n- address\n- address:port\n- ClassiCube Direct URL
-tab.general.server_version.label=Версія сервера:
-tab.general.minecraft_account.label=Акаунт Minecraft:
-tab.general.minecraft_account.option_no_account=Не використовувати акаунт
-tab.general.minecraft_account.option_select_account=Використовувати вибраний акаунт
-tab.general.betacraft_auth.label=Авторизація BetaCraft (Класичне)
-tab.general.betacraft_auth.tooltip=С включеним авторизаціям BetaCraft дозволяє вам зайти на класичні сервери які мають онлайн режим включеним.
-tab.general.state.loading=Завантаження ViaProxy...
-tab.general.state.start=Запустити
-tab.general.state.starting=Запуск...
-tab.general.state.stop=Зупинити
-tab.general.state.running=ViaProxy запущена! Поєднайтесь с Minecraft %s в %s
-tab.general.warning.ban_warning.line1=ViaProxy може викликати Анті-чит, із-за того як, блоки, предмети, рух і інші відмінності меж версіями.
-tab.general.warning.bedrock_warning.line1=ViaBedrock зараз знаходиться на дуже ранній стадії розробки й не готовий до загального використання.
-tab.general.warning.risk=Використовуйте на свій страх і ризик!
-tab.general.error.no_server_version_selected=Виберіть версію сервера!
-tab.general.error.invalid_classicube_url=Недійсна ClassiCube Direct URL!
-tab.general.error.invalid_server_address=Недійсних адрес сервера!
-tab.general.error.invalid_bind_address=Недійсна адреса прив'язки!
-tab.general.error.invalid_proxy_url=Недійсне проксі посилання!
-tab.general.error.failed_to_start=Помилка запуску ViaProxy! Впевніться що цей локальний порт не використовується та повторіть спробу.
-tab.advanced.name=Додатково
-tab.advanced.bind_address.label=Призначена адреса:
-tab.advanced.bind_address.tooltip=Адреса, на якій ViaProxy повинен приймати вхідні з'єднання.
-tab.advanced.proxy_url.label=Проксі посилання:
-tab.advanced.proxy_url.tooltip=Посилання на проксі SOCKS(4/5)/HTTP(S), який буде використовуватися для TCP-з'єднань.\nПідтримувані формати:\n- type://address:port\n- type://username:password@address:port
-tab.advanced.proxy_online_mode.label=Проксі онлайн-режим
-tab.advanced.proxy_online_mode.tooltip=Для увімкнення Proxy онлайн-режиму ваш клієнт має мати дійсний обліковий запис Minecraft.\nProxy онлайн-режим дозволяє бачити скіни на серверах в онлайн-режимі та користуватися функціями підписання чату.
-tab.advanced.legacy_skin_loading.label=Завантаження старих скінів
-tab.advanced.legacy_skin_loading.tooltip=Увімкнення завантаження старих скінів дозволяє бачити скіни на <= 1.6.4 серверах.
-tab.advanced.chat_signing.label=Підписування чату
-tab.advanced.chat_signing.tooltip=Дозволяє надсилати підписані повідомлення чату на >= 1.19 серверах.
-tab.advanced.ignore_packet_translation_errors.label=Ігнорувати помилки перекладу пакетів
-tab.advanced.ignore_packet_translation_errors.tooltip=Увімкнення цієї опції запобіжить відключенню від сервера у разі виникнення помилки перекладу пакета і замість цього лише виведе помилку в консолі.\nЦе може спричинити проблеми залежно від типу пакета, який не вдалося перекласти.
-tab.advanced.allow_beta_pinging.label=Дозволити <= b1.7.3 ping-запити
-tab.advanced.allow_beta_pinging.tooltip=Увімкнення цієї опції дозволить вам виконувати ping-запити до серверів <= b1.7.3. Це може спричинити проблеми з серверами, які блокують занадто часті підключення.
-tab.advanced.simple_voice_chat_support.label=Підтримка Simple Voice Chat
-tab.advanced.simple_voice_chat_support.tooltip=Дозволяє обробляти та переписувати пакети модифікації Simple Voice Chat.
-tab.advanced.fake_accept_resource_packs.label=Фальшиве прийняття пакету ресурсів
-tab.advanced.fake_accept_resource_packs.tooltip=Приймає пакети ресурсів із сервера без показу запиту клієнту.\nЦе потрібно для серверів, які вимагають пакет ресурсів, але клієнт не може його завантажити через різницю у версіях.
-tab.advanced.create_viaversion_dump.label=Створити ViaVersion dump
-tab.advanced.create_viaversion_dump.success=Скопійовано ViaVersion dump посилання до буфера обміну.
-tab.advanced.upload_latest_log.label=Завантажити останній файл журналу
-tab.advanced.upload_latest_log.success=Завантажено файл журналу до %s (скопійовано до буфера обміну)
-tab.advanced.upload_latest_log.error_generic=Не вдалося завантажити файл журналу: %s
-tab.advanced.upload_latest_log.error_not_found=Не вдалося знайти файл журналу.
-tab.accounts.name=Облікові записи
-tab.accounts.description.line1=Щоб приєднатися до серверів в онлайн-режимі, вам потрібно додати обліковий запис Minecraft для ViaProxy. Ви можете обрати обліковий запис, клацнувши на ньому правою кнопкою миші. За замовчуванням буде використано перший обліковий запис.
-tab.accounts.list.context_menu.select=Обрати обліковий запис
-tab.accounts.list.context_menu.remove=Видалити
-tab.accounts.list.context_menu.move_up=Рухатись вверх ↑
-tab.accounts.list.context_menu.move_down=Рухатись вниз ↓
-tab.accounts.add.title=Додати обліковий запис
-tab.accounts.add_offline.label=Автономний обліковий запис
-tab.accounts.add_offline.enter_username=Введіть ім'я користувача для автономного режиму:
-tab.accounts.add_microsoft.label=Обліковий запис Microsoft
-tab.accounts.add_bedrock.label=Обліковий запис Bedrock
-tab.accounts.add.success=Обліковий запис %s додано успішно.
-tab.accounts.add.timeout=Час очікування запиту на вхід закінчився.\nБудь ласка, увійдіть протягом %s секунд.
-tab.realms.name=Realms
-tab.realms.error_generic=Неможливо обробити запит Realms: %s
-tab.realms.error_generic_label=Сталася невідома помилка
-tab.realms.error_account=Не вдалося оновити обраний обліковий запис. Це може бути спричинено застарілими токенами облікового запису або обмеженнями швидкості. Зачекайте кілька секунд і спробуйте ще раз. Якщо проблема не зникне, видаліть і знову додайте свій обліковий запис.
-tab.realms.error_account_label=Помилка облікового запису
-tab.realms.no_account=Обліковий запис не обрано
-tab.realms.unsupported_account=Обрано непідтримуваний обліковий запис
-tab.realms.refreshing_account=Оновлюється обліковий запис...
-tab.realms.availability_check=Перевірка доступності...
-tab.realms.unavailable=Ваш ViaProxy застарів та несумісний з Minecraft Realms.\nБудь ласка, використовуйте останню версію ViaProxy.
-tab.realms.loading_worlds=Завантаження світів...
-tab.realms.no_worlds=Світи не знайдено
-tab.realms.account=Облікові записи: %s
-tab.realms.release=Випуск
-tab.realms.snapshot=Знімок
-tab.realms.join=Приєднатися
-tab.realms.joining=Приєднання...
-tab.realms.accept_tos=Щоб користуватися Minecraft Realms, ви повинні прийняти Умови надання послуг: %s
-tab.realms.expired=Цей Realm скінчився
-tab.realms.incompatible=Ця Realms Minecraft версія надто нова або надто стара
-tab.ui_settings.name=UI налаштування
-tab.ui_settings.language.label=Мова:
-tab.ui_settings.language.completion=%s перекладено
-tab.ui_settings.language.success=Мову змінено на %s (%s). ViaProxy буде перезавантажено!
-tab.ui_settings.crowdin.info=Ваша мова відсутня або неповна? Допоможіть нам перекласти ViaProxy на Crowdin!
-tab.ui_settings.crowdin.link=Натисніть тут, щоб перейти до Crowdin
-popup.login_account.title=Додати обліковий запис
-popup.login_account.instructions.browser=Будь ласка, відкрийте наступне посилання у своєму браузері:
-popup.login_account.instructions.close=Спливаюче вікно закриється автоматично після того, як ви увійдете.
-popup.download.title=Завантаження...
-popup.update.info=Ви використовуєте застарілу версію ViaProxy!\nПоточна версія: %s\nОстання версія: %s
-popup.update.question=Ви бажаєте оновитися?
-popup.update.success=Завантажено останню версію ViaProxy. ViaProxy буде перезапущено!
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/vi_VN.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/vi_VN.properties
deleted file mode 100644
index 0efe058..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/language/vi_VN.properties
+++ /dev/null
@@ -1,95 +0,0 @@
-language.name=Tiếng Việt (Việt Nam)
-generic.cancel=Hủy
-generic.could_not_open_url=Không thể mở link: %s
-tab.general.name=Tổng quan
-tab.general.server_address.label=Địa chỉ server:
-tab.general.server_address.tooltip=Định dạng hỗ trợ:\n- ip\n- ip:port\n- Link ClassiCube
-tab.general.server_version.label=Phiên bản:
-tab.general.minecraft_account.label=Tài khoản Minecraft:
-tab.general.minecraft_account.option_no_account=Không dùng tài khoản
-tab.general.minecraft_account.option_select_account=Dùng tài khoản đã chọn
-tab.general.betacraft_auth.label=BetaCraft Auth (Classic)
-tab.general.betacraft_auth.tooltip=Bật BetaCraft Auth cho phép bạn tham gia các server classic (<=1.7x) bằng tài khoản chính thức.
-tab.general.state.loading=Đang tải...
-tab.general.state.start=Khởi chạy
-tab.general.state.starting=Đang khởi động...
-tab.general.state.stop=Dừng
-tab.general.state.running=ViaProxy đang hoạt động! Vào server bằng Minecraft %s với địa chỉ: %s
-tab.general.warning.ban_warning.line1=ViaProxy có thể làm anticheat flag bạn do các block, vật phẩm, chuyển động và những thứ khác giữa các phiên bản Minecraft.
-tab.general.warning.bedrock_warning.line1=ViaBedrock hiện còn đang trong giai đoạn phát triển và chưa sẵn sàng để sử dụng rộng rãi.
-tab.general.warning.risk=Người dùng tự chịu rủi ro!
-tab.general.error.no_server_version_selected=Hãy chọn một phiên bản Minecraft!
-tab.general.error.invalid_classicube_url=ClassiCube Direct URL không hợp lệ!
-tab.general.error.invalid_server_address=Địa chỉ server không hợp lệ!
-tab.general.error.invalid_bind_address=Địa chỉ bind không hợp lệ!
-tab.general.error.invalid_proxy_url=Địa chỉ proxy không hợp lệ!
-tab.general.error.failed_to_start=Không thể bắt đầu ViaProxy! Đảm bảo rằng port chưa bị chiếm và thử lại.
-tab.advanced.name=Chi tiết
-tab.advanced.bind_address.label=Địa chỉ Bind:
-tab.advanced.bind_address.tooltip=Địa chỉ để bạn vào ViaProxy.
-tab.advanced.proxy_url.label=Địa chỉ Proxy:
-tab.advanced.proxy_url.tooltip=URL của proxy SOCKS(4/5)/HTTP(S) sẽ được sử dụng cho kết nối TCP tới server.\nCác định dạng được hỗ trợ:\n- type://address:port\n- type://username:password@address:port
-tab.advanced.proxy_online_mode.tooltip=Bật Proxy Online Mode bắt buộc bạn phải có một tài khoản Minecraft.\nProxy Online Mode cho phép bạn xem được skins trên server và sử dụng các tính năng chat đã được xác thực.
-tab.advanced.legacy_skin_loading.label=Hỗ trợ Skin Legacy
-tab.advanced.legacy_skin_loading.tooltip=Bật Hỗ trợ Skin Legacy cho phép bạn xem được skin trên server <= 1.6.4.
-tab.advanced.chat_signing.label=Xác thực chat
-tab.advanced.chat_signing.tooltip=Bật tính năng xác thực chat cho server >= 1.19.
-tab.advanced.ignore_packet_translation_errors.label=Bỏ qua những lỗi của packet dịch thuật
-tab.advanced.ignore_packet_translation_errors.tooltip=Bật tính năng này sẽ làm bạn tránh bị mất kết nối với máy chủ khi có lỗi gói dịch và chỉ in trong bảng điều khiển.\nTính năng này có thể gây một số vấn đề phụ thuộc vào gói bị lỗi khi dịch.
-tab.advanced.allow_beta_pinging.label=Cho phép ping server <= b1.7.3
-tab.advanced.allow_beta_pinging.tooltip=Bật tính năng này sẽ cho phép ping những server <= b1.7.3. Tính năng này có thể gây một số lỗi với những server chặn kết nối quá nhiều.
-tab.advanced.simple_voice_chat_support.label=Hỗ trợ Simple Voice Chat
-tab.advanced.simple_voice_chat_support.tooltip=Cho phép xử lý và viết lại các packet của mod Simple Voice Chat.
-tab.advanced.fake_accept_resource_packs.label=Giả vờ chấp nhận gói tài nguyên (resource pack)
-tab.advanced.fake_accept_resource_packs.tooltip=Chấp nhận gói tài nguyên từ máy chủ mà không hiển thị yêu cầu chấp nhận tới người dùng.\nBắt buộc bật tính năng này nếu server bắt buộc phải sử dụng gói tài nguyên nếu Minecraft của bạn quá cũ để sử dụng gói tài nguyên.
-tab.advanced.create_viaversion_dump.label=Tạo ViaVersion dump
-tab.advanced.create_viaversion_dump.success=Đã sao chép Viaversion dump vào bộ nhớ tạm.
-tab.advanced.upload_latest_log.label=Tải lên tệp tin nhật kí
-tab.advanced.upload_latest_log.success=Đã tải lên tệp tin nhật kí %s (đã sao chép vào bộ nhớ tạm)
-tab.advanced.upload_latest_log.error_generic=Không thể tải lên tập tin nhật kí: %s
-tab.advanced.upload_latest_log.error_not_found=Không tìm được tập tin nhật kí.
-tab.accounts.name=Tài khoản
-tab.accounts.description.line1=Để tham gia server Minecraft chính chủ, bạn phải thêm tài khoản vào ViaProxy để chơi. Bạn có thể nhấn chuột phải vào tài khoản để chọn. Theo mặc định tài khoản đầu tiên sẽ được sử dụng.
-tab.accounts.list.context_menu.select=Chọn tài khoản
-tab.accounts.list.context_menu.remove=Loại bỏ
-tab.accounts.list.context_menu.move_up=lên ↑
-tab.accounts.list.context_menu.move_down=xuống ↓
-tab.accounts.add.title=Thêm tài khoản
-tab.accounts.add_offline.label=Tài khoản offline
-tab.accounts.add_offline.enter_username=Tên tài khoản offline:
-tab.accounts.add_microsoft.label=Tài khoản Microsoft
-tab.accounts.add_bedrock.label=Tài khoản Bedrock
-tab.accounts.add.success=Thêm tài khoản %s thành công.
-tab.accounts.add.timeout=Yêu cầu đăng nhập đã hết thời gian.\nVui lòng đăng nhập trong %s giây.
-tab.realms.name=Realms
-tab.realms.error_generic=Yêu cầu Realms không thể được xử lý: %s
-tab.realms.error_generic_label=Lỗi không xác định
-tab.realms.error_account=Không thể làm mới tài khoản đã chọn. Điều này có thể do token của tài khoản đã hết hạn hoặc quá giới hạn. Đợi một vài giây rồi thử lại. Nếu vẫn gặp vấn đề, xóa tài khoản và thêm lại.
-tab.realms.error_account_label=Lỗi tài khoản
-tab.realms.no_account=Chưa chọn tài khoản
-tab.realms.unsupported_account=Tài khoản không được hỗ tro trợ
-tab.realms.refreshing_account=Đang làm mới tài khoản...
-tab.realms.availability_check=Đang kiểm tra tính khả dụng...
-tab.realms.unavailable=ViaProxy của bạn quá cũ và không tương thích với Minecraft Realms.\nXin hãy sử dụng phiên bản ViaProxy mới nhất.
-tab.realms.loading_worlds=Đang tải thế giới...
-tab.realms.no_worlds=Không tìm được world
-tab.realms.account=Tài khoản: %s
-tab.realms.release=Release
-tab.realms.snapshot=Snapshot
-tab.realms.join=Tham gia
-tab.realms.joining=Đang vào...
-tab.realms.accept_tos=Để sử dụng Minecraft Realms bạn phải chấp nhận Điều khoản dịch vụ: %s
-tab.realms.expired=Realm hết hạn
-tab.realms.incompatible=Phiên bản Realm này quá cũ hoặc quá mới
-tab.ui_settings.name=Cài đặt giao diện
-tab.ui_settings.language.label=Ngôn ngữ:
-tab.ui_settings.language.success=Đã đổi ngôn ngữ sang %s (%s). ViaProxy sẽ khởi động lại!
-tab.ui_settings.crowdin.info=Ngôn ngữ của bạn bị thiếu hoặc chưa hoàn thành? Giúp chúng tôi dịch ViaProxy trên Crowdin!
-tab.ui_settings.crowdin.link=Nhấn đây để đi tới Crowdin
-popup.login_account.title=Thêm tài khoản
-popup.login_account.instructions.browser=Hãy mở URL này trong trình duyệt của bạn:
-popup.login_account.instructions.close=Cửa sổ bật lên sẽ tự động đóng sau khi bạn đăng nhập.
-popup.download.title=Đang tải...
-popup.update.info=Phiên bản ViaProxy của bạn quá cũ!\nPhiên bản hiện tại: %s\nLatest version: %s
-popup.update.question=Bạn có muốn cập nhật?
-popup.update.success=Đã tải phiên bản ViaProxy mới nhất. ViaProxy sẽ khởi động lại!
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/zh_CN.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/zh_CN.properties
deleted file mode 100644
index 4b65474..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/language/zh_CN.properties
+++ /dev/null
@@ -1,97 +0,0 @@
-language.name=简体中文(中国大陆)
-generic.cancel=取消
-generic.could_not_open_url=无法打开链接:%s
-tab.general.name=常规
-tab.general.server_address.label=服务器地址:
-tab.general.server_address.tooltip=支持的格式:\n- address\n- address:port\n- ClassiCube Direct URL
-tab.general.server_version.label=服务器版本:
-tab.general.minecraft_account.label=Minecraft账户:
-tab.general.minecraft_account.option_no_account=不使用账户
-tab.general.minecraft_account.option_select_account=使用选定账户
-tab.general.betacraft_auth.label=BetaCraft验证(Classic)
-tab.general.betacraft_auth.tooltip=启用BetaCraft验证可以让你加入启用在线模式的Classic服务器。
-tab.general.state.loading=正在加载ViaProxy…
-tab.general.state.start=启动
-tab.general.state.starting=启动中…
-tab.general.state.stop=停止
-tab.general.state.running=ViaProxy正在运行!使用Minecraft %s连接至%s
-tab.general.warning.ban_warning.line1=ViaProxy可能会触发反作弊,因为版本间在方块、物品、移动等方面存在差异。
-tab.general.warning.bedrock_warning.line1=ViaBedrock目前处于非常早期的开发阶段,尚不适用于日常使用。
-tab.general.warning.risk=风险自负!
-tab.general.error.no_server_version_selected=请选择服务器版本!
-tab.general.error.invalid_classicube_url=无效的ClassiCube Direct URL!
-tab.general.error.invalid_server_address=无效的服务器地址!
-tab.general.error.invalid_bind_address=无效的绑定地址!
-tab.general.error.invalid_proxy_url=无效的代理URL!
-tab.general.error.failed_to_start=无法启动ViaProxy!请确保本地端口未被占用后重试。
-tab.advanced.name=高级
-tab.advanced.bind_address.label=绑定地址:
-tab.advanced.bind_address.tooltip=ViaProxy应接受传入连接的地址。
-tab.advanced.proxy_url.label=代理URL:
-tab.advanced.proxy_url.tooltip=用于TCP连接的SOCKS(4/5)/HTTP(S)代理的URL。\n支持的格式:\n- type://address:port\n- type://username:password@address:port
-tab.advanced.proxy_online_mode.label=代理在线模式
-tab.advanced.proxy_online_mode.tooltip=启用代理在线模式需要在客户端登录有效的Minecraft账户。\n代理在线模式可以让你在在线模式服务器上看到皮肤并使用聊天签名功能。
-tab.advanced.legacy_skin_loading.label=传统皮肤加载
-tab.advanced.legacy_skin_loading.tooltip=启用传统皮肤加载可以让你在版本<= 1.6.4的服务器上看到皮肤。
-tab.advanced.chat_signing.label=聊天签名
-tab.advanced.chat_signing.tooltip=在版本>= 1.19的服务器上启用发送签名的聊天消息。
-tab.advanced.ignore_packet_translation_errors.label=忽略数据包转换错误
-tab.advanced.ignore_packet_translation_errors.tooltip=如果发生数据包转译错误,启用此项可以防止与服务器断开连接,并且仅在控制台中输出错误。\n这可能会导致问题,具体取决于转译失败的数据包类型。
-tab.advanced.allow_beta_pinging.label=允许版本<= b1.7.3的Ping
-tab.advanced.allow_beta_pinging.tooltip=启用此项可以对版本<= b1.7.3的服务器发出Ping。这可能会使阻止频繁连接的服务器出现问题。
-tab.advanced.simple_voice_chat_support.label=Simple Voice Chat模组支持
-tab.advanced.simple_voice_chat_support.tooltip=启用处理和重写Simple Voice Chat模组数据包。
-tab.advanced.fake_accept_resource_packs.label=伪接受资源包
-tab.advanced.fake_accept_resource_packs.tooltip=从服务器接受资源包而不向客户端显示提示。\n这对要求资源包,但客户端因版本差异而无法加载的服务器很有用。
-tab.advanced.create_viaversion_dump.label=创建ViaVersion转储
-tab.advanced.create_viaversion_dump.success=已复制ViaVersion转储链接到剪贴板。
-tab.advanced.upload_latest_log.label=上传最新日志文件
-tab.advanced.upload_latest_log.success=已上传日志文件至%s(已复制到剪贴板)
-tab.advanced.upload_latest_log.error_generic=无法上传日志文件:%s
-tab.advanced.upload_latest_log.error_not_found=找不到日志文件。
-tab.accounts.name=账户
-tab.accounts.description.line1=要加入在线模式服务器,你必须为ViaProxy添加一个Minecraft账户。可以通过右键点击选择账户。默认会使用首个账户。
-tab.accounts.list.context_menu.select=选择账户
-tab.accounts.list.context_menu.remove=移除
-tab.accounts.list.context_menu.move_up=上移 ↑
-tab.accounts.list.context_menu.move_down=下移 ↓
-tab.accounts.add.title=添加账户
-tab.accounts.add_offline.label=离线账户
-tab.accounts.add_offline.enter_username=输入离线模式用户名:
-tab.accounts.add_microsoft.label=微软账户
-tab.accounts.add_bedrock.label=基岩版账户
-tab.accounts.add.success=账户%s添加成功。
-tab.accounts.add.timeout=登录请求超时。\n请在%s秒内登录。
-tab.realms.name=Realms
-tab.realms.error_generic=无法处理Realms请求:%s
-tab.realms.error_generic_label=发生未知错误
-tab.realms.error_account=无法刷新选择的账户。这可能是由过期的账户令牌或速率限制引起的。请等待几秒后再试。如果问题仍然存在,请移除并重新添加账户。
-tab.realms.error_account_label=账户错误
-tab.realms.no_account=未选择账户
-tab.realms.unsupported_account=选择的账户不受支持
-tab.realms.refreshing_account=刷新账户中…
-tab.realms.availability_check=检查可用性中…
-tab.realms.unavailable=ViaProxy已过时,与Minecraft Realms不兼容。\n请使用最新版本的ViaProxy。
-tab.realms.loading_worlds=加载世界中…
-tab.realms.no_worlds=未找到世界
-tab.realms.account=账户:%s
-tab.realms.release=正式版
-tab.realms.snapshot=快照
-tab.realms.join=加入
-tab.realms.joining=加入中…
-tab.realms.accept_tos=要使用Minecraft Realms,你必须接受服务条款:%s
-tab.realms.expired=此Realm已过期
-tab.realms.incompatible=此Realm的Minecraft版本过旧或过新
-tab.ui_settings.name=界面设置
-tab.ui_settings.language.label=语言:
-tab.ui_settings.language.completion=已翻译%s
-tab.ui_settings.language.success=语言已更改为%s(%s)。ViaProxy即将重新启动!
-tab.ui_settings.crowdin.info=你的语言是否缺失或不完整?帮助我们在Crowdin上翻译 ViaProxy!
-tab.ui_settings.crowdin.link=单击此处前往Crowdin
-popup.login_account.title=添加账户
-popup.login_account.instructions.browser=请在浏览器中打开以下URL:
-popup.login_account.instructions.close=登录后,弹窗将自动关闭。
-popup.download.title=正在下载…
-popup.update.info=你正在使用过时的ViaProxy版本!\n当前版本:%s\n最新版本:%s
-popup.update.question=是否更新?
-popup.update.success=已下载最新版本的ViaProxy。ViaProxy即将重新启动!
diff --git a/ViaProxy/src/main/resources/assets/viaproxy/language/zh_TW.properties b/ViaProxy/src/main/resources/assets/viaproxy/language/zh_TW.properties
deleted file mode 100644
index 3bfbdaa..0000000
--- a/ViaProxy/src/main/resources/assets/viaproxy/language/zh_TW.properties
+++ /dev/null
@@ -1,97 +0,0 @@
-language.name=繁體中文(臺灣)
-generic.cancel=取消
-generic.could_not_open_url=無法開啟連結:%s
-tab.general.name=一般
-tab.general.server_address.label=伺服器位址:
-tab.general.server_address.tooltip=支援的格式:\n- address\n- address:port\n- ClassiCube Direct URL
-tab.general.server_version.label=伺服器版本:
-tab.general.minecraft_account.label=Minecraft帳號:
-tab.general.minecraft_account.option_no_account=不使用帳號
-tab.general.minecraft_account.option_select_account=使用選擇的帳號
-tab.general.betacraft_auth.label=BetaCraft 驗證 (經典)
-tab.general.betacraft_auth.tooltip=啟用 BetaCraft Auth 可以讓你加入啟用線上模式的 Classic 伺服器。
-tab.general.state.loading=正在載入 ViaProxy...
-tab.general.state.start=啟動
-tab.general.state.starting=正在啟動...
-tab.general.state.stop=停止
-tab.general.state.running=ViaProxy 正在執行!使用 Minecraft %s 連線至 %s
-tab.general.warning.ban_warning.line1=由於版本之間的方塊、物品、移動以及其他差異,ViaProxy 可能觸發反作弊機制。
-tab.general.warning.bedrock_warning.line1=ViaBedrock 目前處於非常早期的開發階段,尚不適合一般使用。
-tab.general.warning.risk=風險自負!
-tab.general.error.no_server_version_selected=請選擇伺服器版本!
-tab.general.error.invalid_classicube_url=無效的 ClassiCube Direct URL!
-tab.general.error.invalid_server_address=無效的伺服器位址!
-tab.general.error.invalid_bind_address=無效的綁定位址!
-tab.general.error.invalid_proxy_url=無效的 Proxy URL!
-tab.general.error.failed_to_start=無法啟動 ViaProxy!請在確保本地埠未被使用後重試。
-tab.advanced.name=進階
-tab.advanced.bind_address.label=綁定位址:
-tab.advanced.bind_address.tooltip=ViaProxy 應接受傳入連線的位址。
-tab.advanced.proxy_url.label=Proxy URL:
-tab.advanced.proxy_url.tooltip=用於 TCP 連線的 SOCKS(4/5)/HTTP(S)Proxy 的 URL。\n支援的格式:\n- type://address:port\n- type://username:password@address:port
-tab.advanced.proxy_online_mode.label=Proxy 線上模式
-tab.advanced.proxy_online_mode.tooltip=啟用 Proxy 線上模組需要在用戶端登入有效的 Minecraft 帳號。\nProxy 線上模式可以讓你在線上模式伺服器中使用外觀和聊天簽章功能。
-tab.advanced.legacy_skin_loading.label=傳統外觀載入
-tab.advanced.legacy_skin_loading.tooltip=啟用傳統外觀載入可以讓你在版本 ≤ 1.6.4 的伺服器中使用外觀。
-tab.advanced.chat_signing.label=聊天簽章
-tab.advanced.chat_signing.tooltip=在 ≥ 1.19 的伺服器中啟用傳送簽章的聊天訊息。
-tab.advanced.ignore_packet_translation_errors.label=忽略封包翻譯錯誤
-tab.advanced.ignore_packet_translation_errors.tooltip=如果發生封包翻譯錯誤,啟用此選項可以防止你從伺服器中斷連線,並且只會在控制台中輸出錯誤。\n這可能會因未能翻譯的封包類型造成問題。
-tab.advanced.allow_beta_pinging.label=允許 Ping 版本 ≤ b1.7.3 的伺服器
-tab.advanced.allow_beta_pinging.tooltip=啟用此選項將允許你 Ping ≤ b1.7.3 伺服器。這可能會導致伺服器阻止過於頻繁的連線。
-tab.advanced.simple_voice_chat_support.label=Simple Voice Chat 支援
-tab.advanced.simple_voice_chat_support.tooltip=啟用處理和重寫 Simple Voice Chat 模組封包。
-tab.advanced.fake_accept_resource_packs.label=假裝接受資源包
-tab.advanced.fake_accept_resource_packs.tooltip=從伺服器接受資源包請求,但不會向客戶端顯示提示。\n這對強制要求資源包,但客戶端因為版本而無法載入的伺服器很有用。
-tab.advanced.create_viaversion_dump.label=建立 ViaVersion 傾印
-tab.advanced.create_viaversion_dump.success=已將 ViaVersion 傾印連結複製到剪貼簿。
-tab.advanced.upload_latest_log.label=上傳最新記錄檔
-tab.advanced.upload_latest_log.success=已上傳記錄檔至 %s(已複製到剪貼簿)
-tab.advanced.upload_latest_log.error_generic=無法上傳記錄檔:%s
-tab.advanced.upload_latest_log.error_not_found=找不到記錄檔。
-tab.accounts.name=帳號
-tab.accounts.description.line1=要加入線上模式伺服器,你必須為 ViaProxy 新增一個 Minecraft 帳號。你可以對帳號按右鍵來選擇帳號。在預設情況下,會使用第一個帳號。
-tab.accounts.list.context_menu.select=選擇帳號
-tab.accounts.list.context_menu.remove=移除
-tab.accounts.list.context_menu.move_up=向上移動 ↑
-tab.accounts.list.context_menu.move_down=向下移動 ↓
-tab.accounts.add.title=新增帳號
-tab.accounts.add_offline.label=離線帳號
-tab.accounts.add_offline.enter_username=輸入離線模式使用者名稱:
-tab.accounts.add_microsoft.label=Microsoft 帳號
-tab.accounts.add_bedrock.label=Bedrock 版帳號
-tab.accounts.add.success=已成功新增帳號 %s。
-tab.accounts.add.timeout=登入請求逾時。\n請在 %s 秒內登入。
-tab.realms.name=Realms
-tab.realms.error_generic=無法處理 Realms 請求:%s
-tab.realms.error_generic_label=發生未知錯誤
-tab.realms.error_account=無法重新整理選擇的帳號。這可能是由於逾期的帳號權杖或速率限制造成的。請稍後數秒後再試。如果問題仍然存在,請移除並重新新增帳號。
-tab.realms.error_account_label=帳號錯誤
-tab.realms.no_account=未選擇帳號
-tab.realms.unsupported_account=選擇的帳號不受支援
-tab.realms.refreshing_account=正在重新整理帳號...
-tab.realms.availability_check=檢查可用度...
-tab.realms.unavailable=你的 ViaProxy 太舊了,並且與 Minecraft Realms 不相容。\n請使用 ViaProxy 的最新版本。
-tab.realms.loading_worlds=正在載入世界...
-tab.realms.no_worlds=找不到世界
-tab.realms.account=帳號:%s
-tab.realms.release=正式版
-tab.realms.snapshot=快照
-tab.realms.join=加入
-tab.realms.joining=正在加入...
-tab.realms.accept_tos=要使用 Minecraft Realms,你必須接受《服務條款》:%s
-tab.realms.expired=這個 Realm 已到期
-tab.realms.incompatible=這個 Realm 的 Minecraft 版本太舊或太新
-tab.ui_settings.name=介面
-tab.ui_settings.language.label=語言:
-tab.ui_settings.language.completion=已翻譯 %s
-tab.ui_settings.language.success=語言已變更為%s(%s)。ViaProxy 即將重新啟動!
-tab.ui_settings.crowdin.info=你使用的語言有缺失嗎? 在Crowdin上幫助ViaProxy翻譯吧!
-tab.ui_settings.crowdin.link=點這裡前往Crowdin
-popup.login_account.title=新增帳號
-popup.login_account.instructions.browser=請在瀏覽器中開啟以下 URL:
-popup.login_account.instructions.close=登入後,彈出式視窗將自動關閉。
-popup.download.title=正在下載...
-popup.update.info=你正在使用的 ViaProxy 版本太舊!\n目前版本:%s\n最新版本:%s
-popup.update.question=你想要更新嗎?
-popup.update.success=已下載 ViaProxy 的最新版本。ViaProxy 即將重新啟動!
diff --git a/ViaProxy/src/main/resources/log4j2.xml b/ViaProxy/src/main/resources/log4j2.xml
deleted file mode 100644
index 2d7f074..0000000
--- a/ViaProxy/src/main/resources/log4j2.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/autoreconnect.rs b/src/autoreconnect.rs
new file mode 100644
index 0000000..e95b501
--- /dev/null
+++ b/src/autoreconnect.rs
@@ -0,0 +1,179 @@
+use std::time::{Duration, Instant};
+
+use bevy_app::prelude::*;
+
+use azalea::{
+ account::Account,
+ disconnect::DisconnectEvent,
+ ecs::prelude::*,
+ join::{ConnectOpts, ConnectionFailedEvent, StartJoinServerEvent},
+ packet::login::ReceiveHelloEvent,
+ prelude::*,
+};
+
+/// Default base delay for reconnecting
+pub const DEFAULT_RECONNECT_DELAY: Duration = Duration::from_secs(5);
+/// Maximum delay for exponential backoff
+pub const MAX_RECONNECT_DELAY: Duration = Duration::from_secs(300); // 5 minutes
+/// Backoff multiplier (2 = double each time)
+pub const BACKOFF_MULTIPLIER: u64 = 2;
+
+/// Component that tracks exponential backoff state
+#[derive(Clone, Component, Debug)]
+pub struct ExponentialBackoff {
+ pub attempts: u32,
+ pub base_delay: Duration,
+ pub max_delay: Duration,
+}
+
+impl ExponentialBackoff {
+ pub fn new(base_delay: Duration, max_delay: Duration) -> Self {
+ Self {
+ attempts: 0,
+ base_delay,
+ max_delay,
+ }
+ }
+
+ pub fn next_delay(&self) -> Duration {
+ let delay_secs = self
+ .base_delay
+ .as_secs()
+ .saturating_mul(BACKOFF_MULTIPLIER.pow(self.attempts));
+ Duration::from_secs(delay_secs.min(self.max_delay.as_secs()))
+ }
+
+ pub fn increment(&mut self) {
+ self.attempts += 1;
+ }
+
+ pub fn reset(&mut self) {
+ self.attempts = 0;
+ }
+}
+
+pub struct ExponentialBackoffAutoReconnect;
+impl Plugin for ExponentialBackoffAutoReconnect {
+ fn build(&self, app: &mut App) {
+ app.insert_resource(AutoReconnectDelay::new(DEFAULT_RECONNECT_DELAY))
+ .add_systems(
+ Update,
+ (start_rejoin_on_disconnect, rejoin_after_delay)
+ .chain()
+ .before(azalea::join::handle_start_join_server_event),
+ );
+ }
+}
+
+/*pub fn reset_backoff_on_success(
+ mut backoff_query: Query<&mut ExponentialBackoff>,
+ mut join_success_events: MessageReader,
+) {
+ for entity in join_success_events.read().map(|e| e.entity) {
+ if let Ok(mut backoff) = backoff_query.get_mut(e) {
+ backoff.reset();
+ }
+ }
+}*/
+
+pub fn start_rejoin_on_disconnect(
+ mut commands: Commands,
+ mut disconnect_events: MessageReader,
+ mut connection_failed_events: MessageReader,
+ auto_reconnect_delay_res: Option>,
+ auto_reconnect_delay_query: Query<&AutoReconnectDelay>,
+ mut backoff_query: Query<&mut ExponentialBackoff>,
+) {
+ for entity in disconnect_events
+ .read()
+ .map(|e| e.entity)
+ .chain(connection_failed_events.read().map(|e| e.entity))
+ {
+ let delay = if let Ok(mut backoff) = backoff_query.get_mut(entity) {
+ let next_delay = backoff.next_delay();
+ backoff.increment();
+ next_delay
+ } else if let Some(delay) = get_delay(
+ &auto_reconnect_delay_res,
+ auto_reconnect_delay_query,
+ entity,
+ ) {
+ delay
+ } else {
+ continue;
+ };
+
+ let reconnect_after = Instant::now() + delay;
+
+ commands
+ .entity(entity)
+ .insert(InternalReconnectAfter {
+ instant: reconnect_after,
+ })
+ // ensure exponential backoff component exists
+ .insert(ExponentialBackoff::new(delay, MAX_RECONNECT_DELAY));
+ }
+}
+
+fn get_delay(
+ auto_reconnect_delay_res: &Option>,
+ auto_reconnect_delay_query: Query<&AutoReconnectDelay>,
+ entity: Entity,
+) -> Option {
+ let delay = if let Ok(c) = auto_reconnect_delay_query.get(entity) {
+ Some(c.delay)
+ } else {
+ auto_reconnect_delay_res.as_ref().map(|r| r.delay)
+ };
+
+ if delay == Some(Duration::MAX) {
+ return None;
+ }
+ delay
+}
+
+pub fn rejoin_after_delay(
+ mut commands: Commands,
+ mut join_events: MessageWriter,
+ mut query: Query<(
+ Entity,
+ &InternalReconnectAfter,
+ &Account,
+ &ConnectOpts,
+ &mut ExponentialBackoff,
+ )>,
+) {
+ for (entity, reconnect_after, account, connect_opts, mut backoff) in query.iter_mut() {
+ if Instant::now() >= reconnect_after.instant {
+ commands.entity(entity).remove::();
+
+ // write join event
+ join_events.write(StartJoinServerEvent {
+ account: account.clone(),
+ connect_opts: connect_opts.clone(),
+ start_join_callback_tx: None,
+ });
+
+ // increment backoff attempts
+ backoff.increment();
+ }
+ }
+}
+
+/// Resource & component for global reconnect delay
+#[derive(Clone, Component, Debug, Resource)]
+pub struct AutoReconnectDelay {
+ pub delay: Duration,
+}
+
+impl AutoReconnectDelay {
+ pub fn new(delay: Duration) -> Self {
+ Self { delay }
+ }
+}
+
+/// Component for scheduling reconnects
+#[derive(Clone, Component, Debug)]
+pub struct InternalReconnectAfter {
+ pub instant: Instant,
+}
diff --git a/src/main.rs b/src/main.rs
index 4810158..ab69238 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,14 +1,134 @@
+mod autoreconnect;
mod mfc;
mod viaversion;
use azalea::prelude::*;
use bevy_app::PluginGroup;
-use lazy_regex::regex_replace_all;
+use dotenv::dotenv;
+use ferrisbox::{
+ packets::{
+ client::tell::TellPacket,
+ server::{PacketType, events::EventType},
+ },
+ *,
+};
-use std::env;
+use futures_util::StreamExt;
+use lazy_regex::regex_replace_all;
+use tokio::sync::{Mutex, mpsc};
+
+use std::{
+ env,
+ path::PathBuf,
+ sync::{LazyLock, OnceLock},
+};
+
+use crate::viaversion::ViaVersionOpts;
+
+static BOT_TX: OnceLock> = OnceLock::new();
+static BOT_RX: OnceLock>> = OnceLock::new();
+
+pub static USERS: LazyLock> = LazyLock::new(|| {
+ env::var("USERS")
+ .expect("USERS environment variable missing")
+ .split_terminator(',')
+ .map(|s| s.to_string())
+ .collect()
+});
+
+async fn reply(client: &ChatboxClientInstance, user: &str, text: impl Into) {
+ client
+ .tell(TellPacket {
+ name: Some("git.sad.ovh/sophie/rcc-bot".to_string()),
+ user: user.to_string(),
+ text: text.into(),
+ mode: Some("markdown".to_string()),
+ })
+ .await;
+}
+
+async fn usage(client: &ChatboxClientInstance, user: &str, usage: &str) {
+ reply(client, user, format!("Usage: `{usage}`")).await;
+}
+
+fn is_allowed(user: &str) -> bool {
+ USERS.contains(&user.to_string())
+}
#[tokio::main]
-async fn main() -> AppExit {
+async fn main() {
+ let (bot_tx, bot_rx) = mpsc::unbounded_channel();
+
+ BOT_TX.set(bot_tx).unwrap();
+ BOT_RX.set(Mutex::new(bot_rx)).unwrap();
+
+ dotenv().ok();
+
+ let mut client = ChatboxClientInstance::new(
+ env::var("CHATBOX_LICENSE").expect("no CHATBOX_LICENSE found!"),
+ None,
+ )
+ .await;
+
+ let packet_loop = async {
+ while let Some(server_packet) = client.1.next().await {
+ if let PacketType::Event(event_packet) = &server_packet.packet_type {
+ if let EventType::Command(cmd) = &event_packet.event {
+ if cmd.command == "sethome" {
+ if cmd.args.is_empty() {
+ usage(&client.0, &cmd.user.name, "\\sethome ").await;
+ return;
+ }
+
+ if !is_allowed(&cmd.user.name) {
+ reply(
+ &client.0,
+ &cmd.user.name,
+ "You are not allowed to use this command!",
+ )
+ .await;
+ return;
+ }
+
+ BOT_TX
+ .get()
+ .unwrap()
+ .send(format!("/sethome {}", cmd.args.get(0).unwrap()))
+ .unwrap();
+ } else if cmd.command == "home" {
+ if cmd.args.is_empty() {
+ usage(&client.0, &cmd.user.name, "\\home ").await;
+ return;
+ }
+
+ if !is_allowed(&cmd.user.name) {
+ reply(
+ &client.0,
+ &cmd.user.name,
+ "You are not allowed to use this command!",
+ )
+ .await;
+ return;
+ }
+
+ BOT_TX
+ .get()
+ .unwrap()
+ .send(format!("/home {}", cmd.args.get(0).unwrap()))
+ .unwrap();
+ }
+ }
+ }
+ }
+ };
+
+ let bot_loop = async {
+ run_bot().await;
+ };
+
+ tokio::join!(packet_loop, bot_loop);
+}
+pub async fn run_bot() {
let account = Account::microsoft(env::var("EMAIL").expect("no EMAIL found!").as_str())
.await
.unwrap();
@@ -19,18 +139,44 @@ async fn main() -> AppExit {
.build()
.disable::(),
)
- .add_plugins(azalea::bot::DefaultBotPlugins)
+ .add_plugins(
+ azalea::bot::DefaultBotPlugins
+ .build()
+ .disable::(),
+ )
+ .add_plugins(crate::autoreconnect::ExponentialBackoffAutoReconnect)
.add_plugins(crate::mfc::MFCBrandPlugin)
- .add_plugins(crate::viaversion::ViaVersionPlugin::start("1.20.1").await)
- .set_handler(handle)
+ .add_plugins(
+ crate::viaversion::ViaVersionPlugin::start_with_opts(
+ "1.20.1",
+ ViaVersionOpts {
+ viaproxy_args: vec![
+ "--suppress-client-protocol-errors".to_string(),
+ "true".to_string(),
+ ],
+ viaproxy_autoinstaller: Some(false),
+ bind_addr: None,
+ proxy: None,
+ viaproxy_data_path: Some(env::current_dir().unwrap().join(".viaproxy")),
+ },
+ )
+ .await,
+ )
+ .set_handler(handle) // just handle normal events
.start(account, "bot.reconnected.cc")
- .await
+ .await;
}
#[derive(Default, Clone, Component)]
pub struct State {}
async fn handle(bot: Client, event: Event, state: State) -> anyhow::Result<()> {
+ let mut rx = BOT_RX.get().unwrap().lock().await;
+
+ while let Ok(msg) = rx.try_recv() {
+ bot.chat(msg);
+ }
+
match event {
Event::Chat(m) => {
let message = m.message().to_string();
@@ -38,21 +184,22 @@ async fn handle(bot: Client, event: Event, state: State) -> anyhow::Result<()> {
let parts: Vec<&str> = message.split_terminator(":").collect();
println!("{:?}", parts);
- if parts[0].starts_with("Tip!") {
- // ignore
- } else if parts[0].starts_with("\u{e009}") {
- let username = parts[0].replace("\u{e009} ", "");
- let message = parts[1].trim();
-
- //bot.chat(format!("DISCORD({}): {}", username, message));
- } else if parts[0].contains("requested to teleport to you.\n") {
+ if parts[0].contains("requested to teleport to you.\n") {
let username = parts[0]
.split_terminator("\n")
.next()
.unwrap()
.replace("requested to teleport to you.", "");
- bot.chat(format!("tpa: {}", username.trim()));
+ if !is_allowed(&username.trim()) {
+ bot.chat(format!(
+ "/msg {} You are not allowed to use this command!",
+ username
+ ));
+ return Ok(());
+ }
+
+ bot.chat("/tpaccept")
} else if parts[0].contains("requested you to teleport to them.\n") {
let username = parts[0]
.split_terminator("\n")
@@ -60,20 +207,15 @@ async fn handle(bot: Client, event: Event, state: State) -> anyhow::Result<()> {
.unwrap()
.replace("requested you to teleport to them.", "");
- bot.chat(format!("tpahere: {}", username.trim()));
- } else {
- if parts.len() >= 2 {
- let username = regex_replace_all!(
- r#"\[[^]]*\]"#m, // removes all [BOT] [ALT] [CLANKER] et cetera
- parts[0].trim_ascii_start(), // removes all icons (like \u{e009})
- |_| ""
- );
-
- let joined_message = parts[1..].join(":");
- let message = joined_message.trim();
-
- println!("MC {}: {}", username.trim(), message)
+ if !is_allowed(&username.trim()) {
+ bot.chat(format!(
+ "/msg {} You are not allowed to use this command!",
+ username
+ ));
+ return Ok(());
}
+
+ bot.chat("/tpaccept")
}
}
_ => {}
diff --git a/src/viaversion.rs b/src/viaversion/mod.rs
similarity index 74%
rename from src/viaversion.rs
rename to src/viaversion/mod.rs
index 9832b6d..388f811 100644
--- a/src/viaversion.rs
+++ b/src/viaversion/mod.rs
@@ -1,5 +1,11 @@
-#![allow(dead_code)]
-use std::{io::Cursor, net::SocketAddr, path::Path, process::Stdio};
+mod opts;
+
+use std::{
+ io::Cursor,
+ net::SocketAddr,
+ path::{Path, PathBuf},
+ process::Stdio,
+};
use anyhow::{Context, Result};
use azalea::{
@@ -33,6 +39,8 @@ use tokio::{
};
use tracing::{error, trace, warn};
+pub use crate::viaversion::opts::ViaVersionOpts;
+
const JAVA_DOWNLOAD_URL: &str = "https://adoptium.net/installation";
const VIA_OAUTH_VERSION: Version = Version::new(1, 0, 2);
// https://github.com/ViaVersion/ViaProxy/releases
@@ -43,6 +51,10 @@ pub struct ViaVersionPlugin {
bind_addr: SocketAddr,
mc_version: String,
proxy: Option,
+ viaproxy_args: Vec,
+ viaproxy_jar_path: PathBuf,
+ viaproxy_data_path: PathBuf,
+ viaproxy_autoinstaller: Option,
}
impl Plugin for ViaVersionPlugin {
@@ -67,31 +79,20 @@ impl ViaVersionPlugin {
///
/// # Panics
///
- /// Will panic if Java fails to parse, files fail to download, or ViaProxy
- /// fails to start.
+ /// Will panic if Java fails to parse, files fail to download, or if
+ /// ViaProxy fails to start.
pub async fn start(mc_version: impl ToString) -> Self {
- let bind_addr = try_find_free_addr().await.expect("Failed to bind");
- let mc_version = mc_version.to_string();
-
- let plugin = Self {
- bind_addr,
- mc_version,
- proxy: None,
- };
- plugin.start_with_self().await
+ Self::start_with_opts(mc_version, ViaVersionOpts::new()).await
}
- /// Same as [`Self::start`], but allows you to pass any proxy that ViaProxy
- /// supports (SOCKS4, SOCKS5, HTTP, HTTPS). Supported formats:
- /// - type://address:port
- /// - type://username:password@address:port
+ /// Same as [`Self::start`], but allows you to pass extra options, including
+ /// any proxy that ViaProxy supports.
///
- /// This is necessary if you want to use Azalea with a proxy and ViaVersion
- /// at the same time. This is incompatible with `JoinOpts::proxy`.
+ /// See [`ViaVersionOpts`] for more details.
///
/// ```no_run
/// # use azalea::{prelude::*, protocol::connect::Proxy};
- /// # use azalea_viaversion::ViaVersionPlugin;
+ /// # use azalea_viaversion::{ViaVersionPlugin, ViaVersionOpts};
/// #[tokio::main]
/// async fn main() {
/// let account = Account::offline("bot");
@@ -99,77 +100,109 @@ impl ViaVersionPlugin {
/// ClientBuilder::new()
/// .set_handler(handle)
/// .add_plugins(
- /// ViaVersionPlugin::start_with_proxy("1.21.5", "socks5://10.124.1.186:1080").await,
+ /// ViaVersionPlugin::start_with_opts(
+ /// "1.21.5",
+ /// ViaVersionOpts::new().proxy("socks5://10.124.1.186:1080"),
+ /// )
+ /// .await,
/// )
/// .start(account, "6.tcp.ngrok.io:14910")
/// .await;
/// }
/// # async fn handle(mut bot: Client, event: Event, state: azalea::NoState) { }
/// ```
- pub async fn start_with_proxy(mc_version: impl ToString, proxy: &str) -> Self {
- let bind_addr = try_find_free_addr().await.expect("Failed to bind");
+ ///
+ /// # Panics
+ ///
+ /// Will panic if Java fails to parse, files fail to download, or ViaProxy
+ /// fails to start.
+ pub async fn start_with_opts(mc_version: impl ToString, opts: ViaVersionOpts) -> Self {
let mc_version = mc_version.to_string();
- let plugin = Self {
- bind_addr,
- mc_version,
- proxy: Some(proxy.to_string()),
+ let bind_addr = match opts.bind_addr {
+ Some(a) => a,
+ None => try_find_free_addr().await.expect("Failed to bind"),
};
- plugin.start_with_self().await
- }
- async fn start_with_self(self) -> Self {
let Some(java_version) = try_find_java_version().await.expect("Failed to parse") else {
panic!(
"Java installation not found! Please download Java from {JAVA_DOWNLOAD_URL} or use your system's package manager."
);
};
- trace!("via version starting");
- let mc_path = minecraft_folder_path::minecraft_dir().expect("Unsupported Platform");
+ let viaproxy_data_path = opts
+ .viaproxy_data_path
+ .unwrap_or_else(|| default_viaproxy_path());
- #[rustfmt::skip]
- let via_proxy_ext = if java_version.major < 17 { "+java8.jar" } else { ".jar" };
- let via_proxy_name = format!("ViaProxy-{VIA_PROXY_VERSION}{via_proxy_ext}");
- let via_proxy_path = mc_path.join("azalea-viaversion");
- let via_proxy_url = format!(
- "https://github.com/ViaVersion/ViaProxy/releases/download/v{VIA_PROXY_VERSION}/{via_proxy_name}"
- );
- try_download_file(via_proxy_url, &via_proxy_path, &via_proxy_name)
- .await
- .expect("Failed to download ViaProxy");
+ let viaproxy_jar_path: PathBuf;
- let via_oauth_name = format!("ViaProxyOpenAuthMod-{VIA_OAUTH_VERSION}.jar");
- let via_oauth_path = via_proxy_path.join("plugins");
- let via_oauth_url = format!(
- "https://github.com/ViaVersionAddons/ViaProxyOpenAuthMod/releases/download/v{VIA_OAUTH_VERSION}/{via_oauth_name}"
- );
- try_download_file(via_oauth_url, &via_oauth_path, &via_oauth_name)
- .await
- .expect("Failed to download ViaProxyOpenAuthMod");
+ if opts.viaproxy_autoinstaller.is_none()
+ || opts.viaproxy_autoinstaller.is_some_and(|x| x == true)
+ {
+ viaproxy_jar_path = download_viaproxy(&java_version, &viaproxy_data_path).await;
+ } else {
+ viaproxy_jar_path = viaproxy_data_path.join("ViaProxy.jar");
+ if !viaproxy_jar_path.exists() {
+ panic!("Autoinstaller disabled, but missing ViaProxy.jar in data path!")
+ }
+
+ if !viaproxy_data_path
+ .join("plugins")
+ .join("ViaProxyOpenAuthMod.jar")
+ .exists()
+ {
+ panic!(
+ "Autoinstaller disabled, but missing plugins/ViaProxyOpenAuthMod.jar in data path!"
+ )
+ }
+ }
+
+ Self {
+ bind_addr,
+ mc_version,
+ proxy: opts.proxy,
+ viaproxy_args: opts.viaproxy_args,
+ viaproxy_jar_path,
+ viaproxy_data_path,
+ viaproxy_autoinstaller: opts.viaproxy_autoinstaller,
+ }
+ .start_with_self()
+ .await
+ }
+
+ #[deprecated = "replaced with `ViaVersionPlugin::start_with_opts`."]
+ #[doc(hidden)]
+ pub async fn start_with_proxy(mc_version: impl ToString, proxy: &str) -> Self {
+ Self::start_with_opts(mc_version, ViaVersionOpts::new().proxy(proxy)).await
+ }
+
+ async fn start_with_self(self) -> Self {
let mut command = Command::new("java");
command
- /* Java Args */
- .args(["-jar", &via_proxy_name])
- /* ViaProxy Args */
+ // java args
+ .arg("-jar")
+ .arg(&self.viaproxy_jar_path)
+ // viaproxy args
.arg("cli")
.args(["--auth-method", "OPENAUTHMOD"])
.args(["--bind-address", &self.bind_addr.to_string()])
.args(["--target-address", "127.0.0.1:0"])
.args(["--target-version", &self.mc_version])
- .args(["--wildcard-domain-handling", "INTERNAL"])
- .args(["--suppress-client-protocol-errors", "true"]);
+ .args(["--wildcard-domain-handling", "INTERNAL"]);
if let Some(proxy) = &self.proxy {
trace!("Starting ViaProxy with proxy: {proxy}");
command.args(["--backend-proxy-url", proxy]);
}
+ for extra_arg in &self.viaproxy_args {
+ command.arg(extra_arg);
+ }
+
let mut child = command
- .current_dir(via_proxy_path)
+ .current_dir(&self.viaproxy_data_path)
.stdout(Stdio::piped())
- //.stderr(Stdio::piped())
.spawn()
.expect("Failed to spawn");
@@ -182,16 +215,16 @@ impl ViaVersionPlugin {
loop {
line.clear();
reader.read_line(&mut line).await.expect("Failed to read");
+ if line.is_empty() {
+ warn!("ViaProxy closed. Check trace logs for more info.");
+ break;
+ }
let line = line.trim();
// strip ansi escape codes
let line = regex_replace_all!(r"(\x1b\[[0-9;]*m)", line, |_, _| "");
- if line.contains("/WARN]")
- && !line.contains("Missing 1.20.2 blockstate")
- && !line.contains("Missing 1.20.2 item")
- && !line.contains("Missing 1.20.2 block")
- {
+ if line.contains("/WARN]") {
warn!("{line}");
} else {
trace!("{line}");
@@ -214,7 +247,7 @@ impl ViaVersionPlugin {
let ServerAddr { host, port } = server;
// sadly, the first part of the resolved address is unused as viaproxy will
- // resolve it on its own more info: https://github.com/ViaVersion/ViaProxy/issues/338
+ // resolve it on its own. more info: https://github.com/ViaVersion/ViaProxy/issues/338
let data_after_null_byte = host.split_once('\x07').map(|(_, data)| data);
let mut connection_host = format!(
@@ -234,7 +267,7 @@ impl ViaVersionPlugin {
socket: plugin.bind_addr,
};
- /* Must wait to be written until after reading above */
+ // Must wait to be written until after reading above
}
pub fn handle_oauth(
@@ -341,6 +374,38 @@ impl ViaVersionPlugin {
}
}
+fn default_viaproxy_path() -> PathBuf {
+ let mc_path = minecraft_folder_path::minecraft_dir().expect("Unsupported Platform");
+ mc_path.join("azalea-viaversion")
+}
+
+async fn download_viaproxy(java_version: &Version, viaproxy_path: &PathBuf) -> PathBuf {
+ let via_proxy_ext = if java_version.major < 17 {
+ "+java8.jar"
+ } else {
+ ".jar"
+ };
+
+ let viaproxy_name = format!("ViaProxy-{VIA_PROXY_VERSION}{via_proxy_ext}");
+ let via_proxy_url = format!(
+ "https://github.com/ViaVersion/ViaProxy/releases/download/v{VIA_PROXY_VERSION}/{viaproxy_name}"
+ );
+ try_download_file(via_proxy_url, &viaproxy_path, &viaproxy_name)
+ .await
+ .expect("Failed to download ViaProxy");
+
+ let via_oauth_name = format!("ViaProxyOpenAuthMod-{VIA_OAUTH_VERSION}.jar");
+ let via_oauth_path = viaproxy_path.join("plugins");
+ let via_oauth_url = format!(
+ "https://github.com/ViaVersionAddons/ViaProxyOpenAuthMod/releases/download/v{VIA_OAUTH_VERSION}/{via_oauth_name}"
+ );
+ try_download_file(via_oauth_url, &via_oauth_path, &via_oauth_name)
+ .await
+ .expect("Failed to download ViaProxyOpenAuthMod");
+
+ viaproxy_path.join(viaproxy_name)
+}
+
#[derive(Component)]
pub struct OpenAuthModJoinTask(Task