diff --git a/.github/workflows/pullrequest.yml b/.github/workflows/pullrequest.yml
index 7f941da6b32..9cb0726ca08 100644
--- a/.github/workflows/pullrequest.yml
+++ b/.github/workflows/pullrequest.yml
@@ -8,8 +8,8 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v1
- - uses: actions/cache@v1
+ - uses: actions/checkout@v2
+ - uses: actions/cache@v2
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
@@ -24,31 +24,31 @@ jobs:
- name: Build with Maven
run: mvn -B package
- name: Archive artifacts (Geyser Standalone)
- uses: actions/upload-artifact@v1
+ uses: actions/upload-artifact@v2
if: success()
with:
name: Geyser Standalone
path: bootstrap/standalone/target/Geyser.jar
- - name: Archive artifacts (Geyser Bukkit)
- uses: actions/upload-artifact@v1
+ - name: Archive artifacts (Geyser Spigot)
+ uses: actions/upload-artifact@v2
if: success()
with:
- name: Geyser Bukkit
- path: bootstrap/bukkit/target/Geyser-Bukkit.jar
+ name: Geyser Spigot
+ path: bootstrap/spigot/target/Geyser-Spigot.jar
- name: Archive artifacts (Geyser BungeeCord)
- uses: actions/upload-artifact@v1
+ uses: actions/upload-artifact@v2
if: success()
with:
name: Geyser BungeeCord
path: bootstrap/bungeecord/target/Geyser-BungeeCord.jar
- name: Archive artifacts (Geyser Sponge)
- uses: actions/upload-artifact@v1
+ uses: actions/upload-artifact@v2
if: success()
with:
name: Geyser Sponge
path: bootstrap/sponge/target/Geyser-Sponge.jar
- name: Archive artifacts (Geyser Velocity)
- uses: actions/upload-artifact@v1
+ uses: actions/upload-artifact@v2
if: success()
with:
name: Geyser Velocity
diff --git a/.gitmodules b/.gitmodules
index 0090e64ab87..207825e83fb 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,4 @@
[submodule "connector/src/main/resources/mappings"]
path = connector/src/main/resources/mappings
url = https://github.com/GeyserMC/mappings.git
+ branch = feature/1.16
diff --git a/README.md b/README.md
index 874c79f33a2..5cf34473de1 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-
+
[![forthebadge made-with-java](http://ForTheBadge.com/images/badges/made-with-java.svg)](https://java.com/)
@@ -17,7 +17,7 @@ The ultimate goal of this project is to allow Minecraft: Bedrock Edition users t
Special thanks to the DragonProxy project for being a trailblazer in protocol translation and for all the team members who have now joined us here!
-### Currently supporting Minecraft Bedrock v1.14.6(0) and Minecraft Java v1.15.2.
+### Currently supporting Minecraft Bedrock v1.16.0 and Minecraft Java v1.16.1.
## Setting Up
Take a look [here](https://github.com/GeyserMC/Geyser/wiki#Setup) for how to set up Geyser.
@@ -37,7 +37,6 @@ Take a look [here](https://github.com/GeyserMC/Geyser/wiki#Setup) for how to set
- [ ] Beacon
- [ ] Cartography Table
- [ ] Stonecutter
- - [ ] Villager Trading
- Some Entity Flags
## Compiling
diff --git a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitConfiguration.java b/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitConfiguration.java
deleted file mode 100644
index df98b408dba..00000000000
--- a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitConfiguration.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Copyright (c) 2019-2020 GeyserMC. http://geysermc.org
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @author GeyserMC
- * @link https://github.com/GeyserMC/Geyser
- */
-
-package org.geysermc.platform.bukkit;
-
-import org.bukkit.Bukkit;
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.plugin.Plugin;
-import org.geysermc.connector.FloodgateKeyLoader;
-import org.geysermc.connector.GeyserConfiguration;
-
-import java.io.File;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.HashMap;
-import java.util.Map;
-
-public class GeyserBukkitConfiguration implements GeyserConfiguration {
-
- private FileConfiguration config;
- private File dataFolder;
-
- private BukkitBedrockConfiguration bedrockConfig;
- private BukkitRemoteConfiguration remoteConfig;
- private BukkitMetricsInfo metricsInfo;
-
- private Map userAuthInfo = new HashMap<>();
-
- private Path floodgateKey;
-
- public GeyserBukkitConfiguration(File dataFolder, FileConfiguration config) {
- this.dataFolder = dataFolder;
- this.config = config;
-
- bedrockConfig = new BukkitBedrockConfiguration();
- remoteConfig = new BukkitRemoteConfiguration();
- metricsInfo = new BukkitMetricsInfo();
-
- if (!config.contains("userAuths"))
- return;
-
- for (String key : config.getConfigurationSection("userAuths").getKeys(false)) {
- userAuthInfo.put(key, new BukkitUserAuthenticationInfo(key));
- }
- }
-
- public void loadFloodgate(GeyserBukkitPlugin plugin) {
- Plugin floodgate = Bukkit.getPluginManager().getPlugin("floodgate-bukkit");
- floodgateKey = FloodgateKeyLoader.getKey(plugin.getGeyserLogger(), this, Paths.get(dataFolder.toString(), config.getString("floodgate-key-file", "public-key.pem")), floodgate, floodgate != null ? floodgate.getDataFolder().toPath() : null);
- }
-
- @Override
- public IBedrockConfiguration getBedrock() {
- return bedrockConfig;
- }
-
- @Override
- public IRemoteConfiguration getRemote() {
- return remoteConfig;
- }
-
- @Override
- public Map getUserAuths() {
- return userAuthInfo;
- }
-
- @Override
- public boolean isCommandSuggestions() {
- return config.getBoolean("command-suggestions", true);
- }
-
- @Override
- public boolean isPassthroughMotd() {
- return config.getBoolean("passthrough-motd", false);
- }
-
- @Override
- public boolean isPassthroughPlayerCounts() {
- return config.getBoolean("passthrough-player-counts", false);
- }
-
- @Override
- public boolean isLegacyPingPassthrough() {
- return config.getBoolean("legacy-ping-passthrough", false);
- }
-
- @Override
- public int getPingPassthroughInterval() {
- return config.getInt("ping-passthrough-interval", 3);
- }
-
- @Override
- public int getMaxPlayers() {
- return config.getInt("max-players", 10);
- }
-
- @Override
- public boolean isDebugMode() {
- return config.getBoolean("debug-mode", false);
- }
-
- @Override
- public int getGeneralThreadPool() {
- return config.getInt("general-thread-pool", 32);
- }
-
- @Override
- public boolean isAllowThirdPartyCapes() {
- return config.getBoolean("allow-third-party-capes", true);
- }
-
- @Override
- public boolean isAllowThirdPartyEars() {
- return config.getBoolean("allow-third-party-ears", false);
- }
-
- @Override
- public String getDefaultLocale() {
- return config.getString("default-locale", "en_us");
- }
-
- @Override
- public Path getFloodgateKeyFile() {
- return floodgateKey;
- }
-
- @Override
- public boolean isCacheChunks() {
- return true; // We override this as with Bukkit, we have direct access to the server implementation
- }
-
- @Override
- public boolean isAboveBedrockNetherBuilding() {
- return config.getBoolean("above-bedrock-nether-building", false);
- }
-
- @Override
- public IMetricsInfo getMetrics() {
- return metricsInfo;
- }
-
- public class BukkitBedrockConfiguration implements IBedrockConfiguration {
-
- @Override
- public String getAddress() {
- return config.getString("bedrock.address", "0.0.0.0");
- }
-
- @Override
- public int getPort() {
- return config.getInt("bedrock.port", 25565);
- }
-
- @Override
- public String getMotd1() {
- return config.getString("bedrock.motd1", "GeyserMC");
- }
-
- @Override
- public String getMotd2() {
- return config.getString("bedrock.motd2", "GeyserMC");
- }
- }
-
- public class BukkitRemoteConfiguration implements IRemoteConfiguration {
-
- @Override
- public String getAddress() {
- return config.getString("remote.address", "127.0.0.1");
- }
-
- @Override
- public int getPort() {
- return config.getInt("remote.port", 25565);
- }
-
- @Override
- public String getAuthType() {
- return config.getString("remote.auth-type", "online");
- }
- }
-
- public class BukkitUserAuthenticationInfo implements IUserAuthenticationInfo {
-
- private String key;
-
- public BukkitUserAuthenticationInfo(String key) {
- this.key = key;
- }
-
- @Override
- public String getEmail() {
- return config.getString("userAuths." + key + ".email");
- }
-
- @Override
- public String getPassword() {
- return config.getString("userAuths." + key + ".password");
- }
- }
-
- public class BukkitMetricsInfo implements IMetricsInfo {
-
- @Override
- public boolean isEnabled() {
- return config.getBoolean("metrics.enabled", true);
- }
-
- @Override
- public String getUniqueId() {
- return config.getString("metrics.uuid", "generateduuid");
- }
- }
-
- @Override
- public int getConfigVersion() {
- return config.getInt("config-version", 0);
- }
-}
diff --git a/bootstrap/bungeecord/pom.xml b/bootstrap/bungeecord/pom.xml
index dd66db322ac..875991fa0e6 100644
--- a/bootstrap/bungeecord/pom.xml
+++ b/bootstrap/bungeecord/pom.xml
@@ -65,6 +65,10 @@
io.netty
org.geysermc.platform.bungeecord.shaded.netty
+
+ org.reflections.reflections
+ org.geysermc.platform.bungeecord.shaded.reflections
+
diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeeConfiguration.java b/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeeConfiguration.java
index d983aec1c0d..839fc185de6 100644
--- a/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeeConfiguration.java
+++ b/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeeConfiguration.java
@@ -25,216 +25,29 @@
package org.geysermc.platform.bungeecord;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Getter;
import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.config.Configuration;
import org.geysermc.connector.FloodgateKeyLoader;
-import org.geysermc.connector.GeyserConfiguration;
+import org.geysermc.connector.configuration.GeyserJacksonConfiguration;
-import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.util.HashMap;
-import java.util.Map;
-public class GeyserBungeeConfiguration implements GeyserConfiguration {
-
- private File dataFolder;
- private Configuration config;
-
- private BungeeBedrockConfiguration bedrockConfig;
- private BungeeRemoteConfiguration remoteConfig;
- private BungeeMetricsInfo metricsInfo;
-
- private Map userAuthInfo = new HashMap<>();
+@Getter
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class GeyserBungeeConfiguration extends GeyserJacksonConfiguration {
private Path floodgateKey;
- public GeyserBungeeConfiguration(File dataFolder, Configuration config) {
- this.dataFolder = dataFolder;
- this.config = config;
-
- bedrockConfig = new BungeeBedrockConfiguration();
- remoteConfig = new BungeeRemoteConfiguration();
- metricsInfo = new BungeeMetricsInfo();
-
- if (!config.contains("userAuths"))
- return;
-
- for (String key : config.getSection("userAuths").getKeys()) {
- userAuthInfo.put(key, new BungeeUserAuthenticationInfo(key));
- }
- }
-
- public void loadFloodgate(GeyserBungeePlugin plugin) {
+ public void loadFloodgate(GeyserBungeePlugin plugin, Configuration configuration) {
Plugin floodgate = plugin.getProxy().getPluginManager().getPlugin("floodgate-bungee");
- floodgateKey = FloodgateKeyLoader.getKey(plugin.getGeyserLogger(), this, Paths.get(dataFolder.toString(), config.getString("floodgate-key-file", "public-key.pem")), floodgate, floodgate != null ? floodgate.getDataFolder().toPath() : null);
- }
-
- @Override
- public BungeeBedrockConfiguration getBedrock() {
- return bedrockConfig;
- }
-
- @Override
- public BungeeRemoteConfiguration getRemote() {
- return remoteConfig;
- }
-
- @Override
- public Map getUserAuths() {
- return userAuthInfo;
- }
-
- @Override
- public boolean isCommandSuggestions() {
- return config.getBoolean("command-suggestions", true);
- }
-
- @Override
- public boolean isPassthroughMotd() {
- return config.getBoolean("passthrough-motd", false);
- }
-
- @Override
- public boolean isPassthroughPlayerCounts() {
- return config.getBoolean("passthrough-player-counts", false);
- }
-
- @Override
- public boolean isLegacyPingPassthrough() {
- return config.getBoolean("legacy-ping-passthrough", false);
- }
-
- @Override
- public int getPingPassthroughInterval() {
- return config.getInt("ping-passthrough-interval", 3);
- }
-
- @Override
- public int getMaxPlayers() {
- return config.getInt("max-players", 10);
- }
-
- @Override
- public boolean isDebugMode() {
- return config.getBoolean("debug-mode", false);
- }
-
- @Override
- public int getGeneralThreadPool() {
- return config.getInt("general-thread-pool", 32);
- }
-
- @Override
- public boolean isAllowThirdPartyCapes() {
- return config.getBoolean("allow-third-party-capes", true);
- }
-
- @Override
- public boolean isAllowThirdPartyEars() {
- return config.getBoolean("allow-third-party-ears", false);
- }
-
- @Override
- public String getDefaultLocale() {
- return config.getString("default-locale", "en_us");
+ floodgateKey = FloodgateKeyLoader.getKey(plugin.getGeyserLogger(), this, Paths.get(plugin.getDataFolder().toString(), configuration.getString("floodgate-key-file"), "public-key.pem"), floodgate, floodgate != null ? floodgate.getDataFolder().toPath() : null);
}
@Override
public Path getFloodgateKeyFile() {
return floodgateKey;
}
-
- @Override
- public boolean isCacheChunks() {
- return config.getBoolean("cache-chunks", false);
- }
-
- @Override
- public boolean isAboveBedrockNetherBuilding() {
- return config.getBoolean("above-bedrock-nether-building", false);
- }
-
- @Override
- public BungeeMetricsInfo getMetrics() {
- return metricsInfo;
- }
-
- public class BungeeBedrockConfiguration implements IBedrockConfiguration {
-
- @Override
- public String getAddress() {
- return config.getString("bedrock.address", "0.0.0.0");
- }
-
- @Override
- public int getPort() {
- return config.getInt("bedrock.port", 25565);
- }
-
- @Override
- public String getMotd1() {
- return config.getString("bedrock.motd1", "GeyserMC");
- }
-
- @Override
- public String getMotd2() {
- return config.getString("bedrock.motd2", "GeyserMC");
- }
- }
-
- public class BungeeRemoteConfiguration implements IRemoteConfiguration {
-
- @Override
- public String getAddress() {
- return config.getString("remote.address", "127.0.0.1");
- }
-
- @Override
- public int getPort() {
- return config.getInt("remote.port", 25565);
- }
-
- @Override
- public String getAuthType() {
- return config.getString("remote.auth-type", "online");
- }
- }
-
- public class BungeeUserAuthenticationInfo implements IUserAuthenticationInfo {
-
- private String key;
-
- public BungeeUserAuthenticationInfo(String key) {
- this.key = key;
- }
-
- @Override
- public String getEmail() {
- return config.getString("userAuths." + key + ".email");
- }
-
- @Override
- public String getPassword() {
- return config.getString("userAuths." + key + ".password");
- }
- }
-
- public class BungeeMetricsInfo implements IMetricsInfo {
-
- @Override
- public boolean isEnabled() {
- return config.getBoolean("metrics.enabled", true);
- }
-
- @Override
- public String getUniqueId() {
- return config.getString("metrics.uuid", "generateduuid");
- }
- }
-
- @Override
- public int getConfigVersion() {
- return config.getInt("config-version", 0);
- }
}
diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeeDumpInfo.java b/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeeDumpInfo.java
new file mode 100644
index 00000000000..54701116276
--- /dev/null
+++ b/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeeDumpInfo.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2019-2020 GeyserMC. http://geysermc.org
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @author GeyserMC
+ * @link https://github.com/GeyserMC/Geyser
+ *
+ */
+
+package org.geysermc.platform.bungeecord;
+
+import lombok.Getter;
+import net.md_5.bungee.api.ProxyServer;
+import net.md_5.bungee.api.plugin.Plugin;
+import org.geysermc.connector.dump.BootstrapDumpInfo;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@Getter
+public class GeyserBungeeDumpInfo extends BootstrapDumpInfo {
+
+ private String platformName;
+ private String platformVersion;
+ private boolean onlineMode;
+ private List listeners;
+ private List plugins;
+
+ GeyserBungeeDumpInfo(ProxyServer proxy) {
+ super();
+ this.platformName = proxy.getName();
+ this.platformVersion = proxy.getVersion();
+ this.onlineMode = proxy.getConfig().isOnlineMode();
+ this.listeners = new ArrayList<>();
+ this.plugins = new ArrayList<>();
+
+ for (net.md_5.bungee.api.config.ListenerInfo listener : proxy.getConfig().getListeners()) {
+ this.listeners.add(new ListenerInfo(listener.getHost().getHostString(), listener.getHost().getPort()));
+ }
+
+ for (Plugin plugin : proxy.getPluginManager().getPlugins()) {
+ this.plugins.add(new PluginInfo(true, plugin.getDescription().getName(), plugin.getDescription().getVersion(), plugin.getDescription().getMain(), Arrays.asList(plugin.getDescription().getAuthor())));
+ }
+ }
+}
diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeeMain.java b/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeeMain.java
index eabbcc6984b..999b29eaffc 100644
--- a/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeeMain.java
+++ b/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeeMain.java
@@ -26,7 +26,7 @@
package org.geysermc.platform.bungeecord;
-import org.geysermc.common.main.IGeyserMain;
+import org.geysermc.connector.common.main.IGeyserMain;
public class GeyserBungeeMain extends IGeyserMain {
diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeePingPassthrough.java b/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeePingPassthrough.java
index c7f8f276296..ab400052092 100644
--- a/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeePingPassthrough.java
+++ b/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeePingPassthrough.java
@@ -35,7 +35,7 @@
import net.md_5.bungee.api.event.ProxyPingEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.protocol.ProtocolConstants;
-import org.geysermc.common.ping.GeyserPingInfo;
+import org.geysermc.connector.common.ping.GeyserPingInfo;
import org.geysermc.connector.ping.IGeyserPingPassthrough;
import java.net.Inet4Address;
diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeePlugin.java b/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeePlugin.java
index 525b9b6db42..ac718cbaee2 100644
--- a/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeePlugin.java
+++ b/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeePlugin.java
@@ -30,21 +30,22 @@
import net.md_5.bungee.config.Configuration;
import net.md_5.bungee.config.ConfigurationProvider;
import net.md_5.bungee.config.YamlConfiguration;
-import org.geysermc.common.PlatformType;
-import org.geysermc.connector.GeyserConfiguration;
+import org.geysermc.connector.common.PlatformType;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.bootstrap.GeyserBootstrap;
import org.geysermc.connector.command.CommandManager;
+import org.geysermc.connector.configuration.GeyserConfiguration;
+import org.geysermc.connector.dump.BootstrapDumpInfo;
import org.geysermc.connector.ping.GeyserLegacyPingPassthrough;
import org.geysermc.connector.ping.IGeyserPingPassthrough;
+import org.geysermc.connector.utils.FileUtils;
import org.geysermc.platform.bungeecord.command.GeyserBungeeCommandExecutor;
import org.geysermc.platform.bungeecord.command.GeyserBungeeCommandManager;
import java.io.File;
import java.io.IOException;
-import java.io.InputStream;
import java.net.InetSocketAddress;
-import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.UUID;
import java.util.logging.Level;
@@ -62,32 +63,18 @@ public void onEnable() {
if (!getDataFolder().exists())
getDataFolder().mkdir();
- File file = new File(getDataFolder(), "config.yml");
Configuration configuration = null;
-
- if (!file.exists()) {
- try (InputStream in = getResourceAsStream("config.yml")) {
- Files.copy(in, file.toPath());
- } catch (IOException ex) {
- getLogger().log(Level.SEVERE, "Failed to read/create config.yml! Make sure it's up to date and/or readable+writable!", ex);
- return;
- }
- }
try {
+ if (!getDataFolder().exists())
+ getDataFolder().mkdir();
+ File configFile = FileUtils.fileOrCopiedFromResource(new File(getDataFolder(), "config.yml"), "config.yml", (x) -> x.replaceAll("generateduuid", UUID.randomUUID().toString()));
+ this.geyserConfig = FileUtils.loadConfig(configFile, GeyserBungeeConfiguration.class);
configuration = ConfigurationProvider.getProvider(YamlConfiguration.class).load(new File(getDataFolder(), "config.yml"));
- } catch(IOException e) {
- e.printStackTrace();
- }
-
- if (configuration == null) {
- getLogger().severe("Failed to read/create config.yml! Make sure it's up to date and/or readable+writable!");
- return;
+ } catch (IOException ex) {
+ getLogger().log(Level.WARNING, "Failed to read/create config.yml! Make sure it's up to date and/or readable+writable!", ex);
+ ex.printStackTrace();
}
- this.geyserConfig = new GeyserBungeeConfiguration(getDataFolder(), configuration);
-
- boolean configHasChanged = false;
-
if (getProxy().getConfig().getListeners().size() == 1) {
ListenerInfo listener = getProxy().getConfig().getListeners().toArray(new ListenerInfo[0])[0];
@@ -96,33 +83,21 @@ public void onEnable() {
// Don't change the ip if its listening on all interfaces
// By default this should be 127.0.0.1 but may need to be changed in some circumstances
if (!javaAddr.getHostString().equals("0.0.0.0") && !javaAddr.getHostString().equals("")) {
- configuration.set("remote.address", javaAddr.getHostString());
+ this.geyserConfig.getRemote().setAddress(javaAddr.getHostString());
}
- configuration.set("remote.port", javaAddr.getPort());
-
- configHasChanged = true;
- }
-
- if (geyserConfig.getMetrics().getUniqueId().equals("generateduuid")) {
- configuration.set("metrics.uuid", UUID.randomUUID().toString());
-
- configHasChanged = true;
- }
-
- if (configHasChanged) {
- try {
- ConfigurationProvider.getProvider(YamlConfiguration.class).save(configuration, new File(getDataFolder(), "config.yml"));
- } catch (IOException ex) {
- getLogger().log(Level.SEVERE, "Failed to read/create config.yml! Make sure it's up to date and/or readable+writable!", ex);
- return;
- }
+ this.geyserConfig.getRemote().setPort(javaAddr.getPort());
}
this.geyserLogger = new GeyserBungeeLogger(getLogger(), geyserConfig.isDebugMode());
GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger);
- geyserConfig.loadFloodgate(this);
+ if (geyserConfig.getRemote().getAuthType().equals("floodgate") && getProxy().getPluginManager().getPlugin("floodgate-bungee") == null) {
+ geyserLogger.severe("Auth type set to Floodgate but Floodgate not found! Disabling...");
+ return;
+ }
+
+ geyserConfig.loadFloodgate(this, configuration);
this.connector = GeyserConnector.start(PlatformType.BUNGEECORD, this);
@@ -161,4 +136,14 @@ public CommandManager getGeyserCommandManager() {
public IGeyserPingPassthrough getGeyserPingPassthrough() {
return geyserBungeePingPassthrough;
}
+
+ @Override
+ public Path getConfigFolder() {
+ return getDataFolder().toPath();
+ }
+
+ @Override
+ public BootstrapDumpInfo getDumpInfo() {
+ return new GeyserBungeeDumpInfo(getProxy());
+ }
}
diff --git a/bootstrap/pom.xml b/bootstrap/pom.xml
index 6d12b6732d4..87302d4d82c 100644
--- a/bootstrap/pom.xml
+++ b/bootstrap/pom.xml
@@ -35,8 +35,8 @@
- bukkit
bungeecord
+ spigot
sponge
standalone
velocity
diff --git a/bootstrap/bukkit/pom.xml b/bootstrap/spigot/pom.xml
similarity index 78%
rename from bootstrap/bukkit/pom.xml
rename to bootstrap/spigot/pom.xml
index 1f831d6733a..6439eb23326 100644
--- a/bootstrap/bukkit/pom.xml
+++ b/bootstrap/spigot/pom.xml
@@ -9,7 +9,7 @@
1.0-SNAPSHOT
../
- bootstrap-bukkit
+ bootstrap-spigot
org.geysermc
@@ -26,12 +26,12 @@
us.myles
viaversion
- 3.0.0-SNAPSHOT
+ 3.0.1
provided
- ${outputName}-Bukkit
+ ${outputName}-Spigot
src/main/resources/
@@ -46,7 +46,7 @@
- org.geysermc.platform.bukkit.GeyserBukkitMain
+ org.geysermc.platform.spigot.GeyserSpigotMain
@@ -65,11 +65,19 @@
io.netty
- org.geysermc.platform.bukkit.shaded.netty
+ org.geysermc.platform.spigot.shaded.netty
it.unimi.dsi.fastutil
- org.geysermc.platform.bukkit.shaded.fastutil
+ org.geysermc.platform.spigot.shaded.fastutil
+
+
+ com.fasterxml.jackson
+ org.geysermc.platform.spigot.shaded.jackson
+
+
+ org.reflections.reflections
+ org.geysermc.platform.spigot.shaded.reflections
diff --git a/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/GeyserSpigotConfiguration.java b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/GeyserSpigotConfiguration.java
new file mode 100644
index 00000000000..9a681156299
--- /dev/null
+++ b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/GeyserSpigotConfiguration.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2019-2020 GeyserMC. http://geysermc.org
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @author GeyserMC
+ * @link https://github.com/GeyserMC/Geyser
+ */
+
+package org.geysermc.platform.spigot;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Getter;
+import org.bukkit.Bukkit;
+import org.bukkit.plugin.Plugin;
+import org.geysermc.connector.FloodgateKeyLoader;
+import org.geysermc.connector.configuration.GeyserJacksonConfiguration;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+@Getter
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class GeyserSpigotConfiguration extends GeyserJacksonConfiguration {
+
+ @JsonProperty("floodgate-key-file")
+ private String floodgateKeyFile;
+
+ private Path floodgateKey;
+
+ public void loadFloodgate(GeyserSpigotPlugin plugin) {
+ Plugin floodgate = Bukkit.getPluginManager().getPlugin("floodgate-bukkit");
+ floodgateKey = FloodgateKeyLoader.getKey(plugin.getGeyserLogger(), this, Paths.get(plugin.getDataFolder().toString(), plugin.getConfig().getString("floodgate-key-file", "public-key.pem")), floodgate, floodgate != null ? floodgate.getDataFolder().toPath() : null);
+ }
+
+ @Override
+ public Path getFloodgateKeyFile() {
+ return floodgateKey;
+ }
+
+ @Override
+ public boolean isCacheChunks() {
+ return true; // We override this as with Bukkit, we have direct access to the server implementation
+ }
+}
diff --git a/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/GeyserSpigotDumpInfo.java b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/GeyserSpigotDumpInfo.java
new file mode 100644
index 00000000000..01d513fa85c
--- /dev/null
+++ b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/GeyserSpigotDumpInfo.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2019-2020 GeyserMC. http://geysermc.org
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @author GeyserMC
+ * @link https://github.com/GeyserMC/Geyser
+ *
+ */
+
+package org.geysermc.platform.spigot;
+
+import lombok.Getter;
+import org.bukkit.Bukkit;
+import org.bukkit.plugin.Plugin;
+import org.geysermc.connector.dump.BootstrapDumpInfo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Getter
+public class GeyserSpigotDumpInfo extends BootstrapDumpInfo {
+
+ private String platformName;
+ private String platformVersion;
+ private String platformAPIVersion;
+ private boolean onlineMode;
+ private String serverIP;
+ private int serverPort;
+ private List plugins;
+
+ GeyserSpigotDumpInfo() {
+ super();
+ this.platformName = Bukkit.getName();
+ this.platformVersion = Bukkit.getVersion();
+ this.platformAPIVersion = Bukkit.getBukkitVersion();
+ this.onlineMode = Bukkit.getOnlineMode();
+ this.serverIP = Bukkit.getIp();
+ this.serverPort = Bukkit.getPort();
+ this.plugins = new ArrayList<>();
+
+ for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
+ this.plugins.add(new PluginInfo(plugin.isEnabled(), plugin.getName(), plugin.getDescription().getVersion(), plugin.getDescription().getMain(), plugin.getDescription().getAuthors()));
+ }
+ }
+}
diff --git a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitLogger.java b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/GeyserSpigotLogger.java
similarity index 95%
rename from bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitLogger.java
rename to bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/GeyserSpigotLogger.java
index 08822568c44..252d6bbed33 100644
--- a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitLogger.java
+++ b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/GeyserSpigotLogger.java
@@ -23,7 +23,7 @@
* @link https://github.com/GeyserMC/Geyser
*/
-package org.geysermc.platform.bukkit;
+package org.geysermc.platform.spigot;
import lombok.AllArgsConstructor;
@@ -33,7 +33,7 @@
import java.util.logging.Logger;
@AllArgsConstructor
-public class GeyserBukkitLogger implements GeyserLogger {
+public class GeyserSpigotLogger implements GeyserLogger {
private Logger logger;
private boolean debugMode;
diff --git a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitMain.java b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/GeyserSpigotMain.java
similarity index 88%
rename from bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitMain.java
rename to bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/GeyserSpigotMain.java
index b6da66c1b59..15826d334fe 100644
--- a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitMain.java
+++ b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/GeyserSpigotMain.java
@@ -24,14 +24,14 @@
*
*/
-package org.geysermc.platform.bukkit;
+package org.geysermc.platform.spigot;
-import org.geysermc.common.main.IGeyserMain;
+import org.geysermc.connector.common.main.IGeyserMain;
-public class GeyserBukkitMain extends IGeyserMain {
+public class GeyserSpigotMain extends IGeyserMain {
public static void main(String[] args) {
- new GeyserBukkitMain().displayMessage();
+ new GeyserSpigotMain().displayMessage();
}
public String getPluginType() {
diff --git a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitPingPassthrough.java b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/GeyserSpigotPingPassthrough.java
similarity index 93%
rename from bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitPingPassthrough.java
rename to bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/GeyserSpigotPingPassthrough.java
index 812467be785..07999d87617 100644
--- a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitPingPassthrough.java
+++ b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/GeyserSpigotPingPassthrough.java
@@ -24,14 +24,14 @@
*
*/
-package org.geysermc.platform.bukkit;
+package org.geysermc.platform.spigot;
import lombok.AllArgsConstructor;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.server.ServerListPingEvent;
import org.bukkit.util.CachedServerIcon;
-import org.geysermc.common.ping.GeyserPingInfo;
+import org.geysermc.connector.common.ping.GeyserPingInfo;
import org.geysermc.connector.ping.IGeyserPingPassthrough;
import java.net.InetAddress;
@@ -39,9 +39,9 @@
import java.util.Iterator;
@AllArgsConstructor
-public class GeyserBukkitPingPassthrough implements IGeyserPingPassthrough {
+public class GeyserSpigotPingPassthrough implements IGeyserPingPassthrough {
- private final GeyserBukkitLogger logger;
+ private final GeyserSpigotLogger logger;
@Override
public GeyserPingInfo getPingInformation() {
diff --git a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitPlugin.java b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/GeyserSpigotPlugin.java
similarity index 55%
rename from bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitPlugin.java
rename to bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/GeyserSpigotPlugin.java
index 5f0e967a2f2..de2b7186c5e 100644
--- a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitPlugin.java
+++ b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/GeyserSpigotPlugin.java
@@ -23,106 +23,119 @@
* @link https://github.com/GeyserMC/Geyser
*/
-package org.geysermc.platform.bukkit;
+package org.geysermc.platform.spigot;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
-import org.geysermc.common.PlatformType;
-import org.geysermc.connector.GeyserConfiguration;
+import org.geysermc.connector.common.PlatformType;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.bootstrap.GeyserBootstrap;
import org.geysermc.connector.command.CommandManager;
+import org.geysermc.connector.configuration.GeyserConfiguration;
+import org.geysermc.connector.dump.BootstrapDumpInfo;
import org.geysermc.connector.network.translators.world.WorldManager;
import org.geysermc.connector.ping.GeyserLegacyPingPassthrough;
import org.geysermc.connector.ping.IGeyserPingPassthrough;
-import org.geysermc.platform.bukkit.command.GeyserBukkitCommandExecutor;
-import org.geysermc.platform.bukkit.command.GeyserBukkitCommandManager;
-import org.geysermc.platform.bukkit.world.GeyserBukkitBlockPlaceListener;
-import org.geysermc.platform.bukkit.world.GeyserBukkitWorldManager;
-import us.myles.ViaVersion.api.Via;
-
+import org.geysermc.connector.utils.FileUtils;
+import org.geysermc.platform.spigot.command.GeyserSpigotCommandExecutor;
+import org.geysermc.platform.spigot.command.GeyserSpigotCommandManager;
+import org.geysermc.platform.spigot.world.GeyserSpigotBlockPlaceListener;
+import org.geysermc.platform.spigot.world.GeyserSpigotWorldManager;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.UUID;
+import java.util.logging.Level;
-public class GeyserBukkitPlugin extends JavaPlugin implements GeyserBootstrap {
+public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap {
- private GeyserBukkitCommandManager geyserCommandManager;
- private GeyserBukkitConfiguration geyserConfig;
- private GeyserBukkitLogger geyserLogger;
- private IGeyserPingPassthrough geyserBukkitPingPassthrough;
- private GeyserBukkitBlockPlaceListener blockPlaceListener;
- private GeyserBukkitWorldManager geyserWorldManager;
+ private GeyserSpigotCommandManager geyserCommandManager;
+ private GeyserSpigotConfiguration geyserConfig;
+ private GeyserSpigotLogger geyserLogger;
+ private IGeyserPingPassthrough geyserSpigotPingPassthrough;
+ private GeyserSpigotBlockPlaceListener blockPlaceListener;
+ private GeyserSpigotWorldManager geyserWorldManager;
private GeyserConnector connector;
@Override
public void onEnable() {
- saveDefaultConfig();
-
- this.geyserConfig = new GeyserBukkitConfiguration(getDataFolder(), getConfig());
- if (geyserConfig.getMetrics().getUniqueId().equals("generateduuid")) {
- getConfig().set("metrics.uuid", UUID.randomUUID().toString());
- saveConfig();
+ // This is manually done instead of using Bukkit methods to save the config because otherwise comments get removed
+ try {
+ if (!getDataFolder().exists()) {
+ getDataFolder().mkdir();
+ File bukkitConfig = new File("plugins/Geyser-Bukkit/config.yml");
+ if (bukkitConfig.exists()) { // Copy over old configs
+ getLogger().log(Level.INFO, "Existing config found in the Geyser-Bukkit folder; copying over...");
+ Files.copy(bukkitConfig.toPath(), new File(getDataFolder().toString() + "/config.yml").toPath());
+ getLogger().log(Level.INFO, "Copied!");
+ }
+ }
+ File configFile = FileUtils.fileOrCopiedFromResource(new File(getDataFolder(), "config.yml"), "config.yml", (x) -> x.replaceAll("generateduuid", UUID.randomUUID().toString()));
+ this.geyserConfig = FileUtils.loadConfig(configFile, GeyserSpigotConfiguration.class);
+ } catch (IOException ex) {
+ getLogger().log(Level.WARNING, "Failed to read/create config.yml! Make sure it's up to date and/or readable+writable!", ex);
+ ex.printStackTrace();
}
// Don't change the ip if its listening on all interfaces
// By default this should be 127.0.0.1 but may need to be changed in some circumstances
if (!Bukkit.getIp().equals("0.0.0.0") && !Bukkit.getIp().equals("")) {
- getConfig().set("remote.address", Bukkit.getIp());
+ geyserConfig.getRemote().setAddress(Bukkit.getIp());
}
- getConfig().set("remote.port", Bukkit.getPort());
- saveConfig();
+ geyserConfig.getRemote().setPort(Bukkit.getPort());
- this.geyserLogger = new GeyserBukkitLogger(getLogger(), geyserConfig.isDebugMode());
+ this.geyserLogger = new GeyserSpigotLogger(getLogger(), geyserConfig.isDebugMode());
GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger);
+ if (geyserConfig.getRemote().getAuthType().equals("floodgate") && Bukkit.getPluginManager().getPlugin("floodgate-bukkit") == null) {
+ geyserLogger.severe("Auth type set to Floodgate but Floodgate not found! Disabling...");
+ this.getPluginLoader().disablePlugin(this);
+ return;
+ }
+
geyserConfig.loadFloodgate(this);
- this.connector = GeyserConnector.start(PlatformType.BUKKIT, this);
+ this.connector = GeyserConnector.start(PlatformType.SPIGOT, this);
if (geyserConfig.isLegacyPingPassthrough()) {
- this.geyserBukkitPingPassthrough = GeyserLegacyPingPassthrough.init(connector);
+ this.geyserSpigotPingPassthrough = GeyserLegacyPingPassthrough.init(connector);
} else {
- this.geyserBukkitPingPassthrough = new GeyserBukkitPingPassthrough(geyserLogger);
+ this.geyserSpigotPingPassthrough = new GeyserSpigotPingPassthrough(geyserLogger);
}
- this.geyserCommandManager = new GeyserBukkitCommandManager(this, connector);
+ this.geyserCommandManager = new GeyserSpigotCommandManager(this, connector);
- boolean isViaVersion = false;
+ boolean isViaVersion = (Bukkit.getPluginManager().getPlugin("ViaVersion") != null);
// Used to determine if Block.getBlockData() is present.
boolean isLegacy = !isCompatible(Bukkit.getServer().getVersion(), "1.13.0");
if (isLegacy)
geyserLogger.debug("Legacy version of Minecraft (1.12.2 or older) detected.");
- if (Bukkit.getPluginManager().getPlugin("ViaVersion") != null) {
- // TODO: Update when ViaVersion updates
- // API changes between 2.2.3 and 3.0.0-SNAPSHOT require this check
- if (!Via.getAPI().getVersion().equals("3.0.0-SNAPSHOT") && isLegacy) {
- geyserLogger.info("ViaVersion detected but not ViaVersion-ABSTRACTION. Please update your ViaVersion plugin for compatibility with Geyser.");
- } else {
- isViaVersion = true;
- }
- }
+ this.geyserWorldManager = new GeyserSpigotWorldManager(isLegacy, isViaVersion);
+ this.blockPlaceListener = new GeyserSpigotBlockPlaceListener(connector, isLegacy, isViaVersion);
- this.geyserWorldManager = new GeyserBukkitWorldManager(isLegacy, isViaVersion);
- this.blockPlaceListener = new GeyserBukkitBlockPlaceListener(connector, isLegacy, isViaVersion);
Bukkit.getServer().getPluginManager().registerEvents(blockPlaceListener, this);
- this.getCommand("geyser").setExecutor(new GeyserBukkitCommandExecutor(connector));
+ this.getCommand("geyser").setExecutor(new GeyserSpigotCommandExecutor(connector));
}
@Override
public void onDisable() {
- connector.shutdown();
+ if (connector != null)
+ connector.shutdown();
}
@Override
- public GeyserBukkitConfiguration getGeyserConfig() {
+ public GeyserSpigotConfiguration getGeyserConfig() {
return geyserConfig;
}
@Override
- public GeyserBukkitLogger getGeyserLogger() {
+ public GeyserSpigotLogger getGeyserLogger() {
return geyserLogger;
}
@@ -133,7 +146,7 @@ public CommandManager getGeyserCommandManager() {
@Override
public IGeyserPingPassthrough getGeyserPingPassthrough() {
- return geyserBukkitPingPassthrough;
+ return geyserSpigotPingPassthrough;
}
@Override
@@ -141,6 +154,11 @@ public WorldManager getWorldManager() {
return this.geyserWorldManager;
}
+ @Override
+ public Path getConfigFolder() {
+ return getDataFolder().toPath();
+ }
+
public boolean isCompatible(String version, String whichVersion) {
int[] currentVersion = parseVersion(version);
int[] otherVersion = parseVersion(whichVersion);
@@ -174,4 +192,9 @@ private int[] parseVersion(String versionParam) {
}
return temp;
}
+
+ @Override
+ public BootstrapDumpInfo getDumpInfo() {
+ return new GeyserSpigotDumpInfo();
+ }
}
diff --git a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/command/GeyserBukkitCommandExecutor.java b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/command/GeyserSpigotCommandExecutor.java
similarity index 91%
rename from bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/command/GeyserBukkitCommandExecutor.java
rename to bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/command/GeyserSpigotCommandExecutor.java
index d2603f7c59e..b956a0d8428 100644
--- a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/command/GeyserBukkitCommandExecutor.java
+++ b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/command/GeyserSpigotCommandExecutor.java
@@ -23,7 +23,7 @@
* @link https://github.com/GeyserMC/Geyser
*/
-package org.geysermc.platform.bukkit.command;
+package org.geysermc.platform.spigot.command;
import lombok.AllArgsConstructor;
@@ -39,7 +39,7 @@
import java.util.List;
@AllArgsConstructor
-public class GeyserBukkitCommandExecutor implements TabExecutor {
+public class GeyserSpigotCommandExecutor implements TabExecutor {
private GeyserConnector connector;
@@ -51,11 +51,11 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
sender.sendMessage(ChatColor.RED + "You do not have permission to execute this command!");
return true;
}
- getCommand(args[0]).execute(new BukkitCommandSender(sender), args);
+ getCommand(args[0]).execute(new SpigotCommandSender(sender), args);
return true;
}
} else {
- getCommand("help").execute(new BukkitCommandSender(sender), args);
+ getCommand("help").execute(new SpigotCommandSender(sender), args);
return true;
}
return true;
diff --git a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/command/GeyserBukkitCommandManager.java b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/command/GeyserSpigotCommandManager.java
similarity index 88%
rename from bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/command/GeyserBukkitCommandManager.java
rename to bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/command/GeyserSpigotCommandManager.java
index b826ab1f58d..2fbec1562ed 100644
--- a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/command/GeyserBukkitCommandManager.java
+++ b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/command/GeyserSpigotCommandManager.java
@@ -23,18 +23,18 @@
* @link https://github.com/GeyserMC/Geyser
*/
-package org.geysermc.platform.bukkit.command;
+package org.geysermc.platform.spigot.command;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandMap;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.command.CommandManager;
-import org.geysermc.platform.bukkit.GeyserBukkitPlugin;
+import org.geysermc.platform.spigot.GeyserSpigotPlugin;
import java.lang.reflect.Field;
-public class GeyserBukkitCommandManager extends CommandManager {
+public class GeyserSpigotCommandManager extends CommandManager {
private static CommandMap COMMAND_MAP;
@@ -48,9 +48,9 @@ public class GeyserBukkitCommandManager extends CommandManager {
}
}
- private GeyserBukkitPlugin plugin;
+ private GeyserSpigotPlugin plugin;
- public GeyserBukkitCommandManager(GeyserBukkitPlugin plugin, GeyserConnector connector) {
+ public GeyserSpigotCommandManager(GeyserSpigotPlugin plugin, GeyserConnector connector) {
super(connector);
this.plugin = plugin;
diff --git a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/command/BukkitCommandSender.java b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/command/SpigotCommandSender.java
similarity index 94%
rename from bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/command/BukkitCommandSender.java
rename to bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/command/SpigotCommandSender.java
index 05e371e5aa8..55475a3037f 100644
--- a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/command/BukkitCommandSender.java
+++ b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/command/SpigotCommandSender.java
@@ -23,7 +23,7 @@
* @link https://github.com/GeyserMC/Geyser
*/
-package org.geysermc.platform.bukkit.command;
+package org.geysermc.platform.spigot.command;
import lombok.AllArgsConstructor;
@@ -31,7 +31,7 @@
import org.geysermc.connector.command.CommandSender;
@AllArgsConstructor
-public class BukkitCommandSender implements CommandSender {
+public class SpigotCommandSender implements CommandSender {
private org.bukkit.command.CommandSender handle;
diff --git a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/world/GeyserBukkitBlockPlaceListener.java b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/world/GeyserSpigotBlockPlaceListener.java
similarity index 95%
rename from bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/world/GeyserBukkitBlockPlaceListener.java
rename to bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/world/GeyserSpigotBlockPlaceListener.java
index 76d1564ea9d..f17a97e3766 100644
--- a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/world/GeyserBukkitBlockPlaceListener.java
+++ b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/world/GeyserSpigotBlockPlaceListener.java
@@ -24,7 +24,7 @@
*
*/
-package org.geysermc.platform.bukkit.world;
+package org.geysermc.platform.spigot.world;
import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.SoundEvent;
@@ -39,7 +39,7 @@
import org.geysermc.connector.network.translators.world.block.BlockTranslator;
@AllArgsConstructor
-public class GeyserBukkitBlockPlaceListener implements Listener {
+public class GeyserSpigotBlockPlaceListener implements Listener {
private final GeyserConnector connector;
private final boolean isLegacy;
@@ -55,7 +55,7 @@ public void place(final BlockPlaceEvent event) {
placeBlockSoundPacket.setBabySound(false);
String javaBlockId;
if (isLegacy) {
- javaBlockId = BlockTranslator.getJavaIdBlockMap().inverse().get(GeyserBukkitWorldManager.getLegacyBlock(session,
+ javaBlockId = BlockTranslator.getJavaIdBlockMap().inverse().get(GeyserSpigotWorldManager.getLegacyBlock(session,
event.getBlockPlaced().getX(), event.getBlockPlaced().getY(), event.getBlockPlaced().getZ(), isViaVersion));
} else {
javaBlockId = event.getBlockPlaced().getBlockData().getAsString();
diff --git a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/world/GeyserBukkitWorldManager.java b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/world/GeyserSpigotWorldManager.java
similarity index 83%
rename from bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/world/GeyserBukkitWorldManager.java
rename to bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/world/GeyserSpigotWorldManager.java
index fbdf2a47b32..d785fabca6a 100644
--- a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/world/GeyserBukkitWorldManager.java
+++ b/bootstrap/spigot/src/main/java/org/geysermc/platform/spigot/world/GeyserSpigotWorldManager.java
@@ -24,23 +24,19 @@
*
*/
-package org.geysermc.platform.bukkit.world;
-
-import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
+package org.geysermc.platform.spigot.world;
import lombok.AllArgsConstructor;
-import lombok.Getter;
import org.bukkit.Bukkit;
import org.bukkit.block.Block;
import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.world.WorldManager;
import org.geysermc.connector.network.translators.world.block.BlockTranslator;
-import org.geysermc.platform.bukkit.GeyserBukkitPlugin;
import us.myles.ViaVersion.protocols.protocol1_13_1to1_13.Protocol1_13_1To1_13;
-import us.myles.ViaVersion.protocols.protocol1_15to1_14_4.data.MappingData;
+import us.myles.ViaVersion.protocols.protocol1_16to1_15_2.data.MappingData;
@AllArgsConstructor
-public class GeyserBukkitWorldManager extends WorldManager {
+public class GeyserSpigotWorldManager extends WorldManager {
private final boolean isLegacy;
// You need ViaVersion to connect to an older server with Geyser.
@@ -48,7 +44,7 @@ public class GeyserBukkitWorldManager extends WorldManager {
private final boolean isViaVersion;
@Override
- public BlockState getBlockAt(GeyserSession session, int x, int y, int z) {
+ public int getBlockAt(GeyserSession session, int x, int y, int z) {
if (session.getPlayerEntity() == null) {
return BlockTranslator.AIR;
}
@@ -59,16 +55,17 @@ public BlockState getBlockAt(GeyserSession session, int x, int y, int z) {
}
@SuppressWarnings("deprecation")
- public static BlockState getLegacyBlock(GeyserSession session, int x, int y, int z, boolean isViaVersion) {
+ public static int getLegacyBlock(GeyserSession session, int x, int y, int z, boolean isViaVersion) {
if (isViaVersion) {
Block block = Bukkit.getPlayer(session.getPlayerEntity().getUsername()).getWorld().getBlockAt(x, y, z);
// Black magic that gets the old block state ID
int oldBlockId = (block.getType().getId() << 4) | (block.getData() & 0xF);
- // Convert block state from old version -> 1.13 -> 1.13.1 -> 1.14 -> 1.15
+ // Convert block state from old version -> 1.13 -> 1.13.1 -> 1.14 -> 1.15 -> 1.16
int thirteenBlockId = us.myles.ViaVersion.protocols.protocol1_13to1_12_2.data.MappingData.blockMappings.getNewId(oldBlockId);
int thirteenPointOneBlockId = Protocol1_13_1To1_13.getNewBlockStateId(thirteenBlockId);
int fourteenBlockId = us.myles.ViaVersion.protocols.protocol1_14to1_13_2.data.MappingData.blockStateMappings.getNewId(thirteenPointOneBlockId);
- return new BlockState(MappingData.blockStateMappings.getNewId(fourteenBlockId));
+ int fifteenBlockId = us.myles.ViaVersion.protocols.protocol1_15to1_14_4.data.MappingData.blockStateMappings.getNewId(fourteenBlockId);
+ return MappingData.blockStateMappings.getNewId(fifteenBlockId);
} else {
return BlockTranslator.AIR;
}
diff --git a/bootstrap/bukkit/src/main/resources/plugin.yml b/bootstrap/spigot/src/main/resources/plugin.yml
similarity index 74%
rename from bootstrap/bukkit/src/main/resources/plugin.yml
rename to bootstrap/spigot/src/main/resources/plugin.yml
index 89c90789e74..fee71ab1f08 100644
--- a/bootstrap/bukkit/src/main/resources/plugin.yml
+++ b/bootstrap/spigot/src/main/resources/plugin.yml
@@ -1,5 +1,5 @@
-main: org.geysermc.platform.bukkit.GeyserBukkitPlugin
-name: ${outputName}-Bukkit
+main: org.geysermc.platform.spigot.GeyserSpigotPlugin
+name: ${outputName}-Spigot
author: ${project.organization.name}
website: ${project.organization.url}
version: ${project.version}
diff --git a/bootstrap/sponge/pom.xml b/bootstrap/sponge/pom.xml
index c9abbe3eda5..4a995711a83 100644
--- a/bootstrap/sponge/pom.xml
+++ b/bootstrap/sponge/pom.xml
@@ -69,6 +69,10 @@
it.unimi.dsi.fastutil
org.geysermc.platform.sponge.shaded.fastutil
+
+ org.reflections.reflections
+ org.geysermc.platform.sponge.shaded.reflections
+
diff --git a/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeConfiguration.java b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeConfiguration.java
index fc14847081b..79e7621cca1 100644
--- a/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeConfiguration.java
+++ b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeConfiguration.java
@@ -29,7 +29,7 @@
import ninja.leaping.configurate.ConfigurationNode;
-import org.geysermc.connector.GeyserConfiguration;
+import org.geysermc.connector.configuration.GeyserConfiguration;
import java.io.File;
import java.nio.file.Path;
@@ -129,6 +129,11 @@ public boolean isAllowThirdPartyEars() {
return node.getNode("allow-third-party-ears").getBoolean(false);
}
+ @Override
+ public boolean isShowCooldown() {
+ return node.getNode("show-cooldown").getBoolean(true);
+ }
+
@Override
public String getDefaultLocale() {
return node.getNode("default-locale").getString("en_us");
diff --git a/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeDumpInfo.java b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeDumpInfo.java
new file mode 100644
index 00000000000..e8f0feaef2c
--- /dev/null
+++ b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeDumpInfo.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2019-2020 GeyserMC. http://geysermc.org
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @author GeyserMC
+ * @link https://github.com/GeyserMC/Geyser
+ *
+ */
+
+package org.geysermc.platform.sponge;
+
+import lombok.Getter;
+import org.geysermc.connector.dump.BootstrapDumpInfo;
+import org.spongepowered.api.Platform;
+import org.spongepowered.api.Sponge;
+import org.spongepowered.api.plugin.PluginContainer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Getter
+public class GeyserSpongeDumpInfo extends BootstrapDumpInfo {
+
+ private String platformName;
+ private String platformVersion;
+ private boolean onlineMode;
+ private String serverIP;
+ private int serverPort;
+ private List plugins;
+
+ GeyserSpongeDumpInfo() {
+ super();
+ PluginContainer container = Sponge.getPlatform().getContainer(Platform.Component.IMPLEMENTATION);
+ this.platformName = container.getName();
+ this.platformVersion = container.getVersion().get();
+ this.onlineMode = Sponge.getServer().getOnlineMode();
+ this.serverIP = Sponge.getServer().getBoundAddress().get().getHostString();
+ this.serverPort = Sponge.getServer().getBoundAddress().get().getPort();
+ this.plugins = new ArrayList<>();
+
+ for (PluginContainer plugin : Sponge.getPluginManager().getPlugins()) {
+ String pluginClass = plugin.getInstance().map((pl) -> pl.getClass().getName()).orElse("unknown");
+ this.plugins.add(new PluginInfo(true, plugin.getName(), plugin.getVersion().get(), pluginClass, plugin.getAuthors()));
+ }
+ }
+}
diff --git a/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeMain.java b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeMain.java
index 11b9583f9f8..1c9605d0ab7 100644
--- a/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeMain.java
+++ b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeMain.java
@@ -26,7 +26,7 @@
package org.geysermc.platform.sponge;
-import org.geysermc.common.main.IGeyserMain;
+import org.geysermc.connector.common.main.IGeyserMain;
public class GeyserSpongeMain extends IGeyserMain {
diff --git a/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongePingPassthrough.java b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongePingPassthrough.java
index 31b6dc7fba5..99e8ed2f26b 100644
--- a/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongePingPassthrough.java
+++ b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongePingPassthrough.java
@@ -26,7 +26,7 @@
package org.geysermc.platform.sponge;
-import org.geysermc.common.ping.GeyserPingInfo;
+import org.geysermc.connector.common.ping.GeyserPingInfo;
import org.geysermc.connector.ping.IGeyserPingPassthrough;
import org.spongepowered.api.MinecraftVersion;
import org.spongepowered.api.Sponge;
diff --git a/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongePlugin.java b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongePlugin.java
index d226add77cc..4214255e830 100644
--- a/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongePlugin.java
+++ b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongePlugin.java
@@ -29,11 +29,12 @@
import ninja.leaping.configurate.ConfigurationNode;
import ninja.leaping.configurate.loader.ConfigurationLoader;
import ninja.leaping.configurate.yaml.YAMLConfigurationLoader;
-import org.geysermc.common.PlatformType;
-import org.geysermc.connector.GeyserConfiguration;
+import org.geysermc.connector.common.PlatformType;
+import org.geysermc.connector.configuration.GeyserConfiguration;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.bootstrap.GeyserBootstrap;
import org.geysermc.connector.command.CommandManager;
+import org.geysermc.connector.dump.BootstrapDumpInfo;
import org.geysermc.connector.ping.GeyserLegacyPingPassthrough;
import org.geysermc.connector.ping.IGeyserPingPassthrough;
import org.geysermc.connector.utils.FileUtils;
@@ -50,6 +51,7 @@
import java.io.File;
import java.io.IOException;
import java.net.InetSocketAddress;
+import java.nio.file.Path;
import java.util.UUID;
@Plugin(id = "geyser", name = GeyserConnector.NAME + "-Sponge", version = GeyserConnector.VERSION, url = "https://geysermc.org", authors = "GeyserMC")
@@ -147,6 +149,11 @@ public IGeyserPingPassthrough getGeyserPingPassthrough() {
return geyserSpongePingPassthrough;
}
+ @Override
+ public Path getConfigFolder() {
+ return configDir.toPath();
+ }
+
@Listener
public void onServerStart(GameStartedServerEvent event) {
onEnable();
@@ -156,4 +163,9 @@ public void onServerStart(GameStartedServerEvent event) {
public void onServerStop(GameStoppedEvent event) {
onDisable();
}
+
+ @Override
+ public BootstrapDumpInfo getDumpInfo() {
+ return new GeyserSpongeDumpInfo();
+ }
}
diff --git a/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/command/GeyserSpongeCommandExecutor.java b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/command/GeyserSpongeCommandExecutor.java
index 91cb59b0f70..8f857b66553 100644
--- a/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/command/GeyserSpongeCommandExecutor.java
+++ b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/command/GeyserSpongeCommandExecutor.java
@@ -27,7 +27,7 @@
import lombok.AllArgsConstructor;
-import org.geysermc.common.ChatColor;
+import org.geysermc.connector.common.ChatColor;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.command.GeyserCommand;
import org.spongepowered.api.command.CommandCallable;
diff --git a/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneBootstrap.java b/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneBootstrap.java
index aa0d2392e5a..3fb561a1d22 100644
--- a/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneBootstrap.java
+++ b/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneBootstrap.java
@@ -25,18 +25,21 @@
package org.geysermc.platform.standalone;
-import org.geysermc.common.PlatformType;
-import org.geysermc.connector.ping.GeyserLegacyPingPassthrough;
-import org.geysermc.connector.GeyserConfiguration;
-import org.geysermc.connector.bootstrap.GeyserBootstrap;
+import org.geysermc.connector.common.PlatformType;
import org.geysermc.connector.GeyserConnector;
+import org.geysermc.connector.bootstrap.GeyserBootstrap;
+import org.geysermc.connector.configuration.GeyserConfiguration;
import org.geysermc.connector.command.CommandManager;
+import org.geysermc.connector.dump.BootstrapDumpInfo;
import org.geysermc.connector.ping.IGeyserPingPassthrough;
+import org.geysermc.connector.ping.GeyserLegacyPingPassthrough;
import org.geysermc.connector.utils.FileUtils;
import org.geysermc.platform.standalone.command.GeyserCommandManager;
import java.io.File;
import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.UUID;
public class GeyserStandaloneBootstrap implements GeyserBootstrap {
@@ -100,4 +103,15 @@ public CommandManager getGeyserCommandManager() {
public IGeyserPingPassthrough getGeyserPingPassthrough() {
return geyserPingPassthrough;
}
+
+ @Override
+ public Path getConfigFolder() {
+ // Return the current working directory
+ return Paths.get(System.getProperty("user.dir"));
+ }
+
+ @Override
+ public BootstrapDumpInfo getDumpInfo() {
+ return new BootstrapDumpInfo();
+ }
}
diff --git a/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneConfiguration.java b/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneConfiguration.java
index bd0292040e2..29e18d08f50 100644
--- a/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneConfiguration.java
+++ b/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneConfiguration.java
@@ -27,110 +27,21 @@
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
-
import lombok.Getter;
-import org.geysermc.connector.GeyserConfiguration;
+import org.geysermc.connector.configuration.GeyserJacksonConfiguration;
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.util.Map;
-@JsonIgnoreProperties(ignoreUnknown = true)
@Getter
-public class GeyserStandaloneConfiguration implements GeyserConfiguration {
-
- private BedrockConfiguration bedrock;
- private RemoteConfiguration remote;
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class GeyserStandaloneConfiguration extends GeyserJacksonConfiguration {
@JsonProperty("floodgate-key-file")
private String floodgateKeyFile;
- private Map userAuths;
-
- @JsonProperty("command-suggestions")
- private boolean isCommandSuggestions;
-
- @JsonProperty("passthrough-motd")
- private boolean isPassthroughMotd;
-
- @JsonProperty("passthrough-player-counts")
- private boolean isPassthroughPlayerCounts;
-
- @JsonProperty("legacy-ping-passthrough")
- private boolean isLegacyPingPassthrough;
-
- @JsonProperty("ping-passthrough-interval")
- private int pingPassthroughInterval;
-
- @JsonProperty("max-players")
- private int maxPlayers;
-
- @JsonProperty("debug-mode")
- private boolean debugMode;
-
- @JsonProperty("general-thread-pool")
- private int generalThreadPool;
-
- @JsonProperty("allow-third-party-capes")
- private boolean allowThirdPartyCapes;
-
- @JsonProperty("allow-third-party-ears")
- private boolean allowThirdPartyEars;
-
- @JsonProperty("default-locale")
- private String defaultLocale;
-
- @JsonProperty("cache-chunks")
- private boolean cacheChunks;
-
- @JsonProperty("above-bedrock-nether-building")
- private boolean isAboveBedrockNetherBuilding;
-
- private MetricsInfo metrics;
-
@Override
public Path getFloodgateKeyFile() {
return Paths.get(floodgateKeyFile);
}
-
- @Getter
- public static class BedrockConfiguration implements IBedrockConfiguration {
-
- private String address;
- private int port;
-
- private String motd1;
- private String motd2;
- }
-
- @Getter
- public static class RemoteConfiguration implements IRemoteConfiguration {
-
- private String address;
- private int port;
-
- private String motd1;
- private String motd2;
-
- @JsonProperty("auth-type")
- private String authType;
- }
-
- @Getter
- public static class UserAuthenticationInfo implements IUserAuthenticationInfo {
- private String email;
- private String password;
- }
-
- @Getter
- public static class MetricsInfo implements IMetricsInfo {
-
- private boolean enabled;
-
- @JsonProperty("uuid")
- private String uniqueId;
- }
-
- @JsonProperty("config-version")
- private int configVersion;
}
diff --git a/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneLogger.java b/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneLogger.java
index ffb252b2ef9..ae7f1871841 100644
--- a/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneLogger.java
+++ b/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneLogger.java
@@ -31,7 +31,7 @@
import net.minecrell.terminalconsole.SimpleTerminalConsole;
import org.apache.logging.log4j.core.config.Configurator;
-import org.geysermc.common.ChatColor;
+import org.geysermc.connector.common.ChatColor;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.command.CommandSender;
@@ -82,7 +82,7 @@ public void warning(String message) {
@Override
public void info(String message) {
- log.info(printConsole(ChatColor.WHITE + message, colored));
+ log.info(printConsole(ChatColor.RESET + ChatColor.BOLD + message, colored));
}
@Override
diff --git a/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/LoopbackUtil.java b/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/LoopbackUtil.java
index 03c49705dee..00ff14de731 100644
--- a/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/LoopbackUtil.java
+++ b/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/LoopbackUtil.java
@@ -5,7 +5,7 @@
import java.nio.file.OpenOption;
import java.nio.file.Paths;
-import org.geysermc.common.ChatColor;
+import org.geysermc.connector.common.ChatColor;
public class LoopbackUtil {
private static final String checkExemption = "powershell -Command \"CheckNetIsolation LoopbackExempt -s\""; // Java's Exec feature runs as CMD, NetIsolation is only accessible from PowerShell.
diff --git a/bootstrap/velocity/pom.xml b/bootstrap/velocity/pom.xml
index fb06767e0af..78f21973138 100644
--- a/bootstrap/velocity/pom.xml
+++ b/bootstrap/velocity/pom.xml
@@ -61,6 +61,10 @@
it.unimi.dsi.fastutil
org.geysermc.platform.velocity.shaded.fastutil
+
+ org.reflections.reflections
+ org.geysermc.platform.velocity.shaded.reflections
+
diff --git a/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityConfiguration.java b/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityConfiguration.java
index aef0edaa5c8..574941c4805 100644
--- a/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityConfiguration.java
+++ b/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityConfiguration.java
@@ -30,122 +30,30 @@
import com.velocitypowered.api.plugin.PluginContainer;
import com.velocitypowered.api.proxy.ProxyServer;
import lombok.Getter;
-import lombok.Setter;
import org.geysermc.connector.FloodgateKeyLoader;
-import org.geysermc.connector.GeyserConfiguration;
+import org.geysermc.connector.configuration.GeyserJacksonConfiguration;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.util.Map;
import java.util.Optional;
-@JsonIgnoreProperties(ignoreUnknown = true)
@Getter
-public class GeyserVelocityConfiguration implements GeyserConfiguration {
-
- private BedrockConfiguration bedrock;
- private RemoteConfiguration remote;
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class GeyserVelocityConfiguration extends GeyserJacksonConfiguration {
@JsonProperty("floodgate-key-file")
private String floodgateKeyFile;
- private Map userAuths;
-
- @JsonProperty("command-suggestions")
- private boolean commandSuggestions;
-
- @JsonProperty("passthrough-motd")
- private boolean isPassthroughMotd;
-
- @JsonProperty("passthrough-player-counts")
- private boolean isPassthroughPlayerCounts;
-
- @JsonProperty("legacy-ping-passthrough")
- private boolean isLegacyPingPassthrough;
-
- @JsonProperty("ping-passthrough-interval")
- private int pingPassthroughInterval;
-
- @JsonProperty("max-players")
- private int maxPlayers;
-
- @JsonProperty("debug-mode")
- private boolean debugMode;
-
- @JsonProperty("general-thread-pool")
- private int generalThreadPool;
-
- @JsonProperty("allow-third-party-capes")
- private boolean allowThirdPartyCapes;
-
- @JsonProperty("allow-third-party-ears")
- private boolean allowThirdPartyEars;
-
- @JsonProperty("default-locale")
- private String defaultLocale;
-
- @JsonProperty("cache-chunks")
- private boolean cacheChunks;
-
- @JsonProperty("above-bedrock-nether-building")
- private boolean aboveBedrockNetherBuilding;
-
- private MetricsInfo metrics;
-
private Path floodgateKey;
- public void loadFloodgate(GeyserVelocityPlugin plugin, ProxyServer proxyServer, File dataFolder) {
- Optional floodgate = proxyServer.getPluginManager().getPlugin("floodgate");
- floodgate.ifPresent(it -> floodgateKey = FloodgateKeyLoader.getKey(plugin.getGeyserLogger(), this, Paths.get(dataFolder.toString(), floodgateKeyFile.isEmpty() ? floodgateKeyFile : "public-key.pem"), it, Paths.get("plugins/floodgate/")));
- }
-
@Override
public Path getFloodgateKeyFile() {
return floodgateKey;
}
- @Getter
- public static class BedrockConfiguration implements IBedrockConfiguration {
-
- private String address;
- private int port;
-
- private String motd1;
- private String motd2;
- }
-
- @Getter
- public static class RemoteConfiguration implements IRemoteConfiguration {
-
- @Setter
- private String address;
-
- @Setter
- private int port;
-
- private String motd1;
- private String motd2;
-
- @JsonProperty("auth-type")
- private String authType;
- }
-
- @Getter
- public static class UserAuthenticationInfo implements IUserAuthenticationInfo {
- private String email;
- private String password;
- }
-
- @Getter
- public static class MetricsInfo implements IMetricsInfo {
-
- private boolean enabled;
-
- @JsonProperty("uuid")
- private String uniqueId;
+ public void loadFloodgate(GeyserVelocityPlugin plugin, ProxyServer proxyServer, File dataFolder) {
+ Optional floodgate = proxyServer.getPluginManager().getPlugin("floodgate");
+ floodgate.ifPresent(it -> floodgateKey = FloodgateKeyLoader.getKey(plugin.getGeyserLogger(), this, Paths.get(dataFolder.toString(), floodgateKeyFile.isEmpty() ? floodgateKeyFile : "public-key.pem"), it, Paths.get("plugins/floodgate/")));
}
-
- @JsonProperty("config-version")
- private int configVersion;
}
diff --git a/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityDumpInfo.java b/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityDumpInfo.java
new file mode 100644
index 00000000000..906a0414247
--- /dev/null
+++ b/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityDumpInfo.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2019-2020 GeyserMC. http://geysermc.org
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @author GeyserMC
+ * @link https://github.com/GeyserMC/Geyser
+ *
+ */
+
+package org.geysermc.platform.velocity;
+
+import com.velocitypowered.api.plugin.PluginContainer;
+import com.velocitypowered.api.proxy.ProxyServer;
+import lombok.Getter;
+import org.geysermc.connector.dump.BootstrapDumpInfo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Getter
+public class GeyserVelocityDumpInfo extends BootstrapDumpInfo {
+
+ private String platformName;
+ private String platformVersion;
+ private String platformVendor;
+ private boolean onlineMode;
+ private String serverIP;
+ private int serverPort;
+ private List plugins;
+
+ GeyserVelocityDumpInfo(ProxyServer proxy) {
+ super();
+ this.platformName = proxy.getVersion().getName();
+ this.platformVersion = proxy.getVersion().getVersion();
+ this.platformVendor = proxy.getVersion().getVendor();
+ this.onlineMode = proxy.getConfiguration().isOnlineMode();
+ this.serverIP = proxy.getBoundAddress().getHostString();
+ this.serverPort = proxy.getBoundAddress().getPort();
+ this.plugins = new ArrayList<>();
+
+ for (PluginContainer plugin : proxy.getPluginManager().getPlugins()) {
+ String pluginClass = plugin.getInstance().map((pl) -> pl.getClass().getName()).orElse("unknown");
+ this.plugins.add(new PluginInfo(true, plugin.getDescription().getName().get(), plugin.getDescription().getVersion().get(), pluginClass, plugin.getDescription().getAuthors()));
+ }
+ }
+}
diff --git a/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityMain.java b/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityMain.java
index 73eaddf09c8..b5c79cc2b99 100644
--- a/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityMain.java
+++ b/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityMain.java
@@ -26,7 +26,7 @@
package org.geysermc.platform.velocity;
-import org.geysermc.common.main.IGeyserMain;
+import org.geysermc.connector.common.main.IGeyserMain;
public class GeyserVelocityMain extends IGeyserMain {
diff --git a/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityPingPassthrough.java b/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityPingPassthrough.java
index 01be949b828..934c577405c 100644
--- a/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityPingPassthrough.java
+++ b/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityPingPassthrough.java
@@ -32,9 +32,8 @@
import com.velocitypowered.api.proxy.ProxyServer;
import com.velocitypowered.api.proxy.server.ServerPing;
import lombok.AllArgsConstructor;
-import net.kyori.text.TextComponent;
import net.kyori.text.serializer.legacy.LegacyComponentSerializer;
-import org.geysermc.common.ping.GeyserPingInfo;
+import org.geysermc.connector.common.ping.GeyserPingInfo;
import org.geysermc.connector.ping.IGeyserPingPassthrough;
import java.net.Inet4Address;
diff --git a/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityPlugin.java b/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityPlugin.java
index e7b44da53ab..f00119ca932 100644
--- a/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityPlugin.java
+++ b/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityPlugin.java
@@ -34,10 +34,12 @@
import com.velocitypowered.api.plugin.Plugin;
import com.velocitypowered.api.proxy.ProxyServer;
-import org.geysermc.common.PlatformType;
-import org.geysermc.connector.GeyserConfiguration;
+import lombok.Getter;
+import org.geysermc.connector.common.PlatformType;
+import org.geysermc.connector.configuration.GeyserConfiguration;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.bootstrap.GeyserBootstrap;
+import org.geysermc.connector.dump.BootstrapDumpInfo;
import org.geysermc.connector.ping.GeyserLegacyPingPassthrough;
import org.geysermc.connector.ping.IGeyserPingPassthrough;
import org.geysermc.connector.utils.FileUtils;
@@ -48,6 +50,8 @@
import java.io.File;
import java.io.IOException;
import java.net.InetSocketAddress;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.UUID;
@Plugin(id = "geyser", name = GeyserConnector.NAME + "-Velocity", version = GeyserConnector.VERSION, url = "https://geysermc.org", authors = "GeyserMC")
@@ -69,14 +73,16 @@ public class GeyserVelocityPlugin implements GeyserBootstrap {
private GeyserConnector connector;
+ @Getter
+ private final Path configFolder = Paths.get("plugins/" + GeyserConnector.NAME + "-Velocity/");
+
@Override
public void onEnable() {
- File configDir = new File("plugins/" + GeyserConnector.NAME + "-Velocity/");
-
try {
- if (!configDir.exists())
- configDir.mkdir();
- File configFile = FileUtils.fileOrCopiedFromResource(new File(configDir, "config.yml"), "config.yml", (x) -> x.replaceAll("generateduuid", UUID.randomUUID().toString()));
+ if (!configFolder.toFile().exists())
+ //noinspection ResultOfMethodCallIgnored
+ configFolder.toFile().mkdirs();
+ File configFile = FileUtils.fileOrCopiedFromResource(configFolder.resolve("config.yml").toFile(), "config.yml", (x) -> x.replaceAll("generateduuid", UUID.randomUUID().toString()));
this.geyserConfig = FileUtils.loadConfig(configFile, GeyserVelocityConfiguration.class);
} catch (IOException ex) {
logger.warn("Failed to read/create config.yml! Make sure it's up to date and/or readable+writable!", ex);
@@ -96,7 +102,12 @@ public void onEnable() {
this.geyserLogger = new GeyserVelocityLogger(logger, geyserConfig.isDebugMode());
GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger);
- geyserConfig.loadFloodgate(this, proxyServer, configDir);
+ if (geyserConfig.getRemote().getAuthType().equals("floodgate") && !proxyServer.getPluginManager().getPlugin("floodgate").isPresent()) {
+ geyserLogger.severe("Auth type set to Floodgate but Floodgate not found! Disabling...");
+ return;
+ }
+
+ geyserConfig.loadFloodgate(this, proxyServer, configFolder.toFile());
this.connector = GeyserConnector.start(PlatformType.VELOCITY, this);
@@ -143,4 +154,9 @@ public void onInit(ProxyInitializeEvent event) {
public void onShutdown(ProxyShutdownEvent event) {
onDisable();
}
+
+ @Override
+ public BootstrapDumpInfo getDumpInfo() {
+ return new GeyserVelocityDumpInfo(proxyServer);
+ }
}
diff --git a/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/command/GeyserVelocityCommandExecutor.java b/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/command/GeyserVelocityCommandExecutor.java
index 940c52244cd..4632f4404bf 100644
--- a/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/command/GeyserVelocityCommandExecutor.java
+++ b/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/command/GeyserVelocityCommandExecutor.java
@@ -32,7 +32,7 @@
import net.kyori.text.TextComponent;
-import org.geysermc.common.ChatColor;
+import org.geysermc.connector.common.ChatColor;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.command.GeyserCommand;
diff --git a/common/src/main/java/org/geysermc/common/AuthType.java b/common/src/main/java/org/geysermc/common/AuthType.java
deleted file mode 100644
index 8edbc4d5561..00000000000
--- a/common/src/main/java/org/geysermc/common/AuthType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.geysermc.common;
-
-import lombok.Getter;
-
-@Getter
-public enum AuthType {
- OFFLINE,
- ONLINE,
- FLOODGATE;
-
- public static final AuthType[] VALUES = values();
-
- public static AuthType getById(int id) {
- return id < VALUES.length ? VALUES[id] : OFFLINE;
- }
-
- /**
- * Convert the AuthType string (from config) to the enum, OFFLINE on fail
- *
- * @param name AuthType string
- *
- * @return The converted AuthType
- */
- public static AuthType getByName(String name) {
- String upperCase = name.toUpperCase();
- for (AuthType type : VALUES) {
- if (type.name().equals(upperCase)) {
- return type;
- }
- }
- return OFFLINE;
- }
-}
\ No newline at end of file
diff --git a/common/src/main/java/org/geysermc/common/PlatformType.java b/common/src/main/java/org/geysermc/common/PlatformType.java
deleted file mode 100644
index fa6f57fda8d..00000000000
--- a/common/src/main/java/org/geysermc/common/PlatformType.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.geysermc.common;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-@Getter
-@AllArgsConstructor
-public enum PlatformType {
-
- BUKKIT("Bukkit"),
- BUNGEECORD("BungeeCord"),
- SPONGE("Sponge"),
- STANDALONE("Standalone"),
- VELOCITY("Velocity");
-
- private String platformName;
-}
diff --git a/common/src/main/java/org/geysermc/common/window/button/FormImage.java b/common/src/main/java/org/geysermc/common/window/button/FormImage.java
index b700b046b1c..72579f7acfc 100644
--- a/common/src/main/java/org/geysermc/common/window/button/FormImage.java
+++ b/common/src/main/java/org/geysermc/common/window/button/FormImage.java
@@ -32,14 +32,14 @@ public class FormImage {
@Getter
@Setter
- private FormImageType type;
+ private String type;
@Getter
@Setter
private String data;
public FormImage(FormImageType type, String data) {
- this.type = type;
+ this.type = type.getName();
this.data = data;
}
diff --git a/common/src/main/java/org/geysermc/common/window/component/ToggleComponent.java b/common/src/main/java/org/geysermc/common/window/component/ToggleComponent.java
index 50a5c631a9c..f972d590685 100644
--- a/common/src/main/java/org/geysermc/common/window/component/ToggleComponent.java
+++ b/common/src/main/java/org/geysermc/common/window/component/ToggleComponent.java
@@ -25,9 +25,17 @@
package org.geysermc.common.window.component;
+import lombok.Getter;
+import lombok.Setter;
+
public class ToggleComponent extends FormComponent {
+ @Getter
+ @Setter
private String text;
+
+ @Getter
+ @Setter
private boolean defaultValue;
public ToggleComponent(String text) {
diff --git a/connector/pom.xml b/connector/pom.xml
index 5743c0c6351..ddc62bf2a17 100644
--- a/connector/pom.xml
+++ b/connector/pom.xml
@@ -31,9 +31,9 @@
compile
- com.nukkitx.protocol
- bedrock-v390
- 2.5.6-SNAPSHOT
+ com.github.bundabrg.Protocol
+ bedrock-v407
+ feature~1.16-protocol-SNAPSHOT
compile
@@ -66,6 +66,12 @@
8.3.1
compile
+
+ com.nukkitx.fastutil
+ fastutil-int-byte-maps
+ 8.3.1
+ compile
+
com.nukkitx.fastutil
fastutil-int-double-maps
@@ -97,15 +103,9 @@
compile
- com.github.steveice10
- opennbt
- 1.4-SNAPSHOT
- compile
-
-
- com.github.steveice10
- packetlib
- 1.6-SNAPSHOT
+ com.github.GeyserMC
+ MCProtocolLib
+ feature~1.16-1.12.1-1-g74ee57a-310
compile
@@ -115,31 +115,11 @@
- com.github.steveice10
- mcauthlib
- 1.3-SNAPSHOT
+ io.netty
+ netty-resolver-dns
+ 4.1.43.Final
compile
-
- com.github.steveice10
- mcprotocollib
- 1.15.2-1-SNAPSHOT
- compile
-
-
- com.github.steveice10
- opennbt
-
-
- com.github.steveice10
- packetlib
-
-
- com.github.steveice10
- mcauthlib
-
-
-
org.reflections
reflections
@@ -190,6 +170,11 @@
false
git.user.*
+ git.*.user.*
+ git.closest.*
+ git.commit.id.describe
+ git.commit.id.describe-short
+ git.commit.message.short
flat
diff --git a/connector/src/main/java/org/geysermc/connector/FloodgateKeyLoader.java b/connector/src/main/java/org/geysermc/connector/FloodgateKeyLoader.java
index 0b631b2d2ad..617ac83eb3f 100644
--- a/connector/src/main/java/org/geysermc/connector/FloodgateKeyLoader.java
+++ b/connector/src/main/java/org/geysermc/connector/FloodgateKeyLoader.java
@@ -26,6 +26,8 @@
package org.geysermc.connector;
+import org.geysermc.connector.configuration.GeyserConfiguration;
+
import java.nio.file.Files;
import java.nio.file.Path;
diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java
index 02e0c500360..20a7712665b 100644
--- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java
+++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java
@@ -29,12 +29,14 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.nukkitx.protocol.bedrock.BedrockPacketCodec;
import com.nukkitx.protocol.bedrock.BedrockServer;
-import com.nukkitx.protocol.bedrock.v390.Bedrock_v390;
+import com.nukkitx.protocol.bedrock.v407.Bedrock_v407;
import lombok.Getter;
-import org.geysermc.common.AuthType;
-import org.geysermc.common.PlatformType;
+import lombok.Setter;
+import org.geysermc.connector.common.AuthType;
+import org.geysermc.connector.common.PlatformType;
import org.geysermc.connector.bootstrap.GeyserBootstrap;
import org.geysermc.connector.command.CommandManager;
+import org.geysermc.connector.configuration.GeyserConfiguration;
import org.geysermc.connector.metrics.Metrics;
import org.geysermc.connector.network.ConnectorServerEventHandler;
import org.geysermc.connector.network.remote.RemoteServer;
@@ -68,7 +70,7 @@ public class GeyserConnector {
public static final ObjectMapper JSON_MAPPER = new ObjectMapper().disable(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES);
- public static final BedrockPacketCodec BEDROCK_PACKET_CODEC = Bedrock_v390.V390_CODEC;
+ public static final BedrockPacketCodec BEDROCK_PACKET_CODEC = Bedrock_v407.V407_CODEC;
public static final String NAME = "Geyser";
public static final String VERSION = "DEV"; // A fallback for running in IDEs
@@ -78,6 +80,7 @@ public class GeyserConnector {
private static GeyserConnector instance;
private RemoteServer remoteServer;
+ @Setter
private AuthType authType;
private boolean shuttingDown = false;
diff --git a/connector/src/main/java/org/geysermc/connector/bootstrap/GeyserBootstrap.java b/connector/src/main/java/org/geysermc/connector/bootstrap/GeyserBootstrap.java
index 24ce81cfd42..f089350fb58 100644
--- a/connector/src/main/java/org/geysermc/connector/bootstrap/GeyserBootstrap.java
+++ b/connector/src/main/java/org/geysermc/connector/bootstrap/GeyserBootstrap.java
@@ -26,13 +26,16 @@
package org.geysermc.connector.bootstrap;
+import org.geysermc.connector.dump.BootstrapDumpInfo;
import org.geysermc.connector.ping.IGeyserPingPassthrough;
-import org.geysermc.connector.GeyserConfiguration;
+import org.geysermc.connector.configuration.GeyserConfiguration;
import org.geysermc.connector.GeyserLogger;
import org.geysermc.connector.command.CommandManager;
import org.geysermc.connector.network.translators.world.CachedChunkManager;
import org.geysermc.connector.network.translators.world.WorldManager;
+import java.nio.file.Path;
+
public interface GeyserBootstrap {
CachedChunkManager DEFAULT_CHUNK_MANAGER = new CachedChunkManager();
@@ -83,4 +86,18 @@ public interface GeyserBootstrap {
default WorldManager getWorldManager() {
return DEFAULT_CHUNK_MANAGER;
}
+
+ /**
+ * Return the data folder where files get stored
+ *
+ * @return Path location of data folder
+ */
+ Path getConfigFolder();
+
+ /**
+ * Information used for the bootstrap section of the debug dump
+ *
+ * @return The info about the bootstrap
+ */
+ BootstrapDumpInfo getDumpInfo();
}
diff --git a/connector/src/main/java/org/geysermc/connector/command/CommandManager.java b/connector/src/main/java/org/geysermc/connector/command/CommandManager.java
index 88b9e795de7..217a9df1fa3 100644
--- a/connector/src/main/java/org/geysermc/connector/command/CommandManager.java
+++ b/connector/src/main/java/org/geysermc/connector/command/CommandManager.java
@@ -49,6 +49,7 @@ public CommandManager(GeyserConnector connector) {
registerCommand(new ReloadCommand(connector, "reload", "Reloads the Geyser configurations. Kicks all players when used!", "geyser.command.reload"));
registerCommand(new StopCommand(connector, "stop", "Shuts down Geyser.", "geyser.command.stop"));
registerCommand(new OffhandCommand(connector, "offhand", "Puts an items in your offhand.", "geyser.command.offhand"));
+ registerCommand(new DumpCommand(connector, "dump", "Dumps Geyser debug infomation for bug reports.", "geyser.command.dump"));
}
public void registerCommand(GeyserCommand command) {
@@ -75,7 +76,7 @@ public void runCommand(CommandSender sender, String command) {
args = new String[0];
} else {
label = command.substring(0, command.indexOf(" ")).toLowerCase();
- String argLine = command.substring(command.indexOf(" " + 1));
+ String argLine = command.substring(command.indexOf(" ") + 1);
args = argLine.contains(" ") ? argLine.split(" ") : new String[] { argLine };
}
diff --git a/connector/src/main/java/org/geysermc/connector/command/defaults/DumpCommand.java b/connector/src/main/java/org/geysermc/connector/command/defaults/DumpCommand.java
new file mode 100644
index 00000000000..617c9d43644
--- /dev/null
+++ b/connector/src/main/java/org/geysermc/connector/command/defaults/DumpCommand.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2019-2020 GeyserMC. http://geysermc.org
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @author GeyserMC
+ * @link https://github.com/GeyserMC/Geyser
+ */
+
+package org.geysermc.connector.command.defaults;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
+import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
+import org.geysermc.connector.common.ChatColor;
+import org.geysermc.connector.GeyserConnector;
+import org.geysermc.connector.command.CommandSender;
+import org.geysermc.connector.command.GeyserCommand;
+import org.geysermc.connector.dump.DumpInfo;
+import org.geysermc.connector.utils.WebUtils;
+
+import java.io.IOException;
+
+public class DumpCommand extends GeyserCommand {
+
+ private final GeyserConnector connector;
+ private static final ObjectMapper MAPPER = new ObjectMapper();
+ private static final String DUMP_URL = "https://dump.geysermc.org/";
+
+ public DumpCommand(GeyserConnector connector, String name, String description, String permission) {
+ super(name, description, permission);
+
+ this.connector = connector;
+
+ final SimpleFilterProvider filter = new SimpleFilterProvider();
+ filter.addFilter("dump_user_auth", SimpleBeanPropertyFilter.serializeAllExcept(new String[] {"password"}));
+
+ MAPPER.setFilterProvider(filter);
+ }
+
+ @Override
+ public void execute(CommandSender sender, String[] args) {
+ sender.sendMessage("Collecting dump info");
+ String dumpData = "";
+ try {
+ dumpData = MAPPER.writeValueAsString(new DumpInfo());
+ } catch (IOException e) {
+ sender.sendMessage(ChatColor.RED + "Failed to collect dump info, check console for more information");
+ connector.getLogger().error("Failed to collect dump info", e);
+ return;
+ }
+
+ sender.sendMessage("Uploading dump");
+ String response;
+ JsonNode responseNode;
+ try {
+ response = WebUtils.post(DUMP_URL + "documents", dumpData);
+ responseNode = MAPPER.readTree(response);
+ } catch (IOException e) {
+ sender.sendMessage(ChatColor.RED + "Failed to upload dump, check console for more information");
+ connector.getLogger().error("Failed to upload dump", e);
+ return;
+ }
+
+ if (!responseNode.has("key")) {
+ sender.sendMessage(ChatColor.RED + "Failed to upload dump: " + (responseNode.has("message") ? responseNode.get("message").asText() : response));
+ return;
+ }
+
+ String uploadedDumpUrl = DUMP_URL + responseNode.get("key").asText();
+ sender.sendMessage("We've made a dump with useful information, report your issue and provide this url: " + ChatColor.DARK_AQUA + uploadedDumpUrl);
+ if (!sender.isConsole()) {
+ connector.getLogger().info(sender.getName() + " created a GeyserDump at " + uploadedDumpUrl);
+ }
+ }
+}
diff --git a/connector/src/main/java/org/geysermc/connector/command/defaults/HelpCommand.java b/connector/src/main/java/org/geysermc/connector/command/defaults/HelpCommand.java
index 6acb7822bb1..a5942ee6b90 100644
--- a/connector/src/main/java/org/geysermc/connector/command/defaults/HelpCommand.java
+++ b/connector/src/main/java/org/geysermc/connector/command/defaults/HelpCommand.java
@@ -25,7 +25,7 @@
package org.geysermc.connector.command.defaults;
-import org.geysermc.common.ChatColor;
+import org.geysermc.connector.common.ChatColor;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.command.CommandSender;
import org.geysermc.connector.command.GeyserCommand;
diff --git a/connector/src/main/java/org/geysermc/connector/command/defaults/ListCommand.java b/connector/src/main/java/org/geysermc/connector/command/defaults/ListCommand.java
index 21fa425354c..99845ee9419 100644
--- a/connector/src/main/java/org/geysermc/connector/command/defaults/ListCommand.java
+++ b/connector/src/main/java/org/geysermc/connector/command/defaults/ListCommand.java
@@ -25,7 +25,7 @@
package org.geysermc.connector.command.defaults;
-import org.geysermc.common.ChatColor;
+import org.geysermc.connector.common.ChatColor;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.command.CommandSender;
import org.geysermc.connector.command.GeyserCommand;
diff --git a/connector/src/main/java/org/geysermc/connector/command/defaults/ReloadCommand.java b/connector/src/main/java/org/geysermc/connector/command/defaults/ReloadCommand.java
index c38a0c23de9..2ddd61ed8a9 100644
--- a/connector/src/main/java/org/geysermc/connector/command/defaults/ReloadCommand.java
+++ b/connector/src/main/java/org/geysermc/connector/command/defaults/ReloadCommand.java
@@ -25,8 +25,8 @@
package org.geysermc.connector.command.defaults;
-import org.geysermc.common.ChatColor;
-import org.geysermc.common.PlatformType;
+import org.geysermc.connector.common.ChatColor;
+import org.geysermc.connector.common.PlatformType;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.command.CommandSender;
import org.geysermc.connector.command.GeyserCommand;
diff --git a/connector/src/main/java/org/geysermc/connector/command/defaults/StopCommand.java b/connector/src/main/java/org/geysermc/connector/command/defaults/StopCommand.java
index 2222cdef546..636058a02f1 100644
--- a/connector/src/main/java/org/geysermc/connector/command/defaults/StopCommand.java
+++ b/connector/src/main/java/org/geysermc/connector/command/defaults/StopCommand.java
@@ -25,7 +25,7 @@
package org.geysermc.connector.command.defaults;
-import org.geysermc.common.PlatformType;
+import org.geysermc.connector.common.PlatformType;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.command.CommandSender;
import org.geysermc.connector.command.GeyserCommand;
diff --git a/connector/src/main/java/org/geysermc/connector/common/AuthType.java b/connector/src/main/java/org/geysermc/connector/common/AuthType.java
new file mode 100644
index 00000000000..f15e3ff586a
--- /dev/null
+++ b/connector/src/main/java/org/geysermc/connector/common/AuthType.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2019-2020 GeyserMC. http://geysermc.org
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @author GeyserMC
+ * @link https://github.com/GeyserMC/Geyser
+ *
+ */
+
+package org.geysermc.connector.common;
+
+import lombok.Getter;
+
+@Getter
+public enum AuthType {
+ OFFLINE,
+ ONLINE,
+ FLOODGATE;
+
+ public static final AuthType[] VALUES = values();
+
+ public static AuthType getById(int id) {
+ return id < VALUES.length ? VALUES[id] : OFFLINE;
+ }
+
+ /**
+ * Convert the AuthType string (from config) to the enum, OFFLINE on fail
+ *
+ * @param name AuthType string
+ *
+ * @return The converted AuthType
+ */
+ public static AuthType getByName(String name) {
+ String upperCase = name.toUpperCase();
+ for (AuthType type : VALUES) {
+ if (type.name().equals(upperCase)) {
+ return type;
+ }
+ }
+ return OFFLINE;
+ }
+}
\ No newline at end of file
diff --git a/common/src/main/java/org/geysermc/common/ChatColor.java b/connector/src/main/java/org/geysermc/connector/common/ChatColor.java
similarity index 75%
rename from common/src/main/java/org/geysermc/common/ChatColor.java
rename to connector/src/main/java/org/geysermc/connector/common/ChatColor.java
index 8868b063c0f..1397f88cf51 100644
--- a/common/src/main/java/org/geysermc/common/ChatColor.java
+++ b/connector/src/main/java/org/geysermc/connector/common/ChatColor.java
@@ -1,29 +1,30 @@
/*
* Copyright (c) 2019-2020 GeyserMC. http://geysermc.org
*
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
*
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
*
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @author GeyserMC
+ * @link https://github.com/GeyserMC/Geyser
*
- * @author GeyserMC
- * @link https://github.com/GeyserMC/Geyser
*/
-package org.geysermc.common;
+package org.geysermc.connector.common;
public class ChatColor {
diff --git a/connector/src/main/java/org/geysermc/connector/common/PlatformType.java b/connector/src/main/java/org/geysermc/connector/common/PlatformType.java
new file mode 100644
index 00000000000..ee68b6d7b1a
--- /dev/null
+++ b/connector/src/main/java/org/geysermc/connector/common/PlatformType.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2019-2020 GeyserMC. http://geysermc.org
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @author GeyserMC
+ * @link https://github.com/GeyserMC/Geyser
+ *
+ */
+
+package org.geysermc.connector.common;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum PlatformType {
+
+ BUNGEECORD("BungeeCord"),
+ SPIGOT("Spigot"),
+ SPONGE("Sponge"),
+ STANDALONE("Standalone"),
+ VELOCITY("Velocity");
+
+ private String platformName;
+}
diff --git a/common/src/main/java/org/geysermc/common/main/IGeyserMain.java b/connector/src/main/java/org/geysermc/connector/common/main/IGeyserMain.java
similarity index 98%
rename from common/src/main/java/org/geysermc/common/main/IGeyserMain.java
rename to connector/src/main/java/org/geysermc/connector/common/main/IGeyserMain.java
index 75da4e6b930..906bd7865ef 100644
--- a/common/src/main/java/org/geysermc/common/main/IGeyserMain.java
+++ b/connector/src/main/java/org/geysermc/connector/common/main/IGeyserMain.java
@@ -24,7 +24,7 @@
*
*/
-package org.geysermc.common.main;
+package org.geysermc.connector.common.main;
import javax.swing.*;
import java.io.InputStream;
diff --git a/common/src/main/java/org/geysermc/common/ping/GeyserPingInfo.java b/connector/src/main/java/org/geysermc/connector/common/ping/GeyserPingInfo.java
similarity index 97%
rename from common/src/main/java/org/geysermc/common/ping/GeyserPingInfo.java
rename to connector/src/main/java/org/geysermc/connector/common/ping/GeyserPingInfo.java
index 40ef6da62be..69b24ea1e1d 100644
--- a/common/src/main/java/org/geysermc/common/ping/GeyserPingInfo.java
+++ b/connector/src/main/java/org/geysermc/connector/common/ping/GeyserPingInfo.java
@@ -24,7 +24,7 @@
*
*/
-package org.geysermc.common.ping;
+package org.geysermc.connector.common.ping;
import lombok.Data;
import lombok.Getter;
diff --git a/connector/src/main/java/org/geysermc/connector/common/serializer/AsteriskSerializer.java b/connector/src/main/java/org/geysermc/connector/common/serializer/AsteriskSerializer.java
new file mode 100644
index 00000000000..3fac2e08a29
--- /dev/null
+++ b/connector/src/main/java/org/geysermc/connector/common/serializer/AsteriskSerializer.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2019-2020 GeyserMC. http://geysermc.org
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @author GeyserMC
+ * @link https://github.com/GeyserMC/Geyser
+ *
+ */
+
+package org.geysermc.connector.common.serializer;
+
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.BeanProperty;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.ContextualSerializer;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+
+import java.io.IOException;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.Optional;
+
+public class AsteriskSerializer extends StdSerializer