forked from git-mirrors/GeyserConnect
Add auto start of Geyser and transfer of user
This commit is contained in:
parent
ba036ee3dd
commit
507f1ae26b
10 changed files with 298 additions and 7 deletions
|
@ -0,0 +1,17 @@
|
|||
package org.geysermc.connector.network.remote;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
/**
|
||||
* This is super hacky but I guess it works
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
@AllArgsConstructor
|
||||
public class RemoteServer {
|
||||
|
||||
private String address;
|
||||
private int port;
|
||||
}
|
|
@ -38,6 +38,7 @@ public class PacketHandler implements BedrockPacketHandler {
|
|||
|
||||
public void disconnect(DisconnectReason reason) {
|
||||
if (player != null) {
|
||||
player.onDisconnect();
|
||||
masterServer.getLogger().info(player.getDisplayName() + " has disconnected (" + reason + ")");
|
||||
masterServer.getPlayers().remove(session.getAddress());
|
||||
}
|
||||
|
|
|
@ -0,0 +1,81 @@
|
|||
package org.geysermc.multi.proxy;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
|
||||
import org.geysermc.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.ping.IGeyserPingPassthrough;
|
||||
import org.geysermc.connector.ping.GeyserLegacyPingPassthrough;
|
||||
import org.geysermc.connector.utils.FileUtils;
|
||||
import org.geysermc.multi.MasterServer;
|
||||
import org.geysermc.multi.utils.Logger;
|
||||
import org.geysermc.multi.utils.Server;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
public class GeyserProxyBootstrap implements GeyserBootstrap {
|
||||
|
||||
private GeyserProxyCommandManager geyserCommandManager;
|
||||
private GeyserProxyConfiguration geyserConfig;
|
||||
private Logger geyserLogger;
|
||||
private IGeyserPingPassthrough geyserPingPassthrough;
|
||||
|
||||
private GeyserConnector connector;
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
geyserLogger = MasterServer.getInstance().getLogger();
|
||||
|
||||
try {
|
||||
InputStream configFile = GeyserProxyBootstrap.class.getClassLoader().getResourceAsStream("proxy_config.yml");
|
||||
ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
|
||||
geyserConfig = objectMapper.readValue(configFile, GeyserProxyConfiguration.class);
|
||||
} catch (IOException ex) {
|
||||
geyserLogger.severe("Failed to read proxy_config.yml! Make sure it's up to date and/or readable+writable!", ex);
|
||||
return;
|
||||
}
|
||||
GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger);
|
||||
|
||||
connector = GeyserConnector.start(PlatformType.STANDALONE, this);
|
||||
geyserCommandManager = new GeyserProxyCommandManager(connector);
|
||||
|
||||
geyserPingPassthrough = GeyserLegacyPingPassthrough.init(connector);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
connector.shutdown();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GeyserConfiguration getGeyserConfig() {
|
||||
return geyserConfig;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Logger getGeyserLogger() {
|
||||
return geyserLogger;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandManager getGeyserCommandManager() {
|
||||
return geyserCommandManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IGeyserPingPassthrough getGeyserPingPassthrough() {
|
||||
return geyserPingPassthrough;
|
||||
}
|
||||
|
||||
public void setServer(Server server) {
|
||||
geyserLogger.debug("Updated remote server info");
|
||||
connector.getRemoteServer().setAddress(server.getAddress());
|
||||
connector.getRemoteServer().setPort(server.getPort());
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
* 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.multi.proxy;
|
||||
|
||||
import org.geysermc.connector.GeyserConnector;
|
||||
import org.geysermc.connector.command.CommandManager;
|
||||
|
||||
public class GeyserProxyCommandManager extends CommandManager {
|
||||
|
||||
public GeyserProxyCommandManager(GeyserConnector connector) {
|
||||
super(connector);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription(String command) {
|
||||
return ""; // this is not sent over the protocol, so we return none
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
package org.geysermc.multi.proxy;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import lombok.Getter;
|
||||
import org.geysermc.connector.configuration.GeyserJacksonConfiguration;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
|
||||
@Getter
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
public class GeyserProxyConfiguration extends GeyserJacksonConfiguration {
|
||||
|
||||
@JsonProperty("floodgate-key-file")
|
||||
private String floodgateKeyFile = "";
|
||||
|
||||
@Override
|
||||
public Path getFloodgateKeyFile() {
|
||||
return Paths.get(floodgateKeyFile);
|
||||
}
|
||||
}
|
|
@ -27,10 +27,7 @@ public class UIHandler {
|
|||
MasterServer.getInstance().getLogger().debug(data.getClickedButton().getText());
|
||||
|
||||
Server server = player.getServers().get(data.getClickedButtonId());
|
||||
|
||||
TransferPacket transferPacket = new TransferPacket();
|
||||
transferPacket.setAddress(server.getAddress());
|
||||
transferPacket.setPort(server.getPort());
|
||||
player.getSession().sendPacket(transferPacket);
|
||||
player.createGeyserProxy(server);
|
||||
player.connectToProxy();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,10 +4,11 @@ import lombok.extern.log4j.Log4j2;
|
|||
import net.minecrell.terminalconsole.SimpleTerminalConsole;
|
||||
import org.apache.logging.log4j.core.config.Configurator;
|
||||
import org.geysermc.common.ChatColor;
|
||||
import org.geysermc.connector.GeyserLogger;
|
||||
import org.geysermc.multi.MasterServer;
|
||||
|
||||
@Log4j2
|
||||
public class Logger extends SimpleTerminalConsole {
|
||||
public class Logger extends SimpleTerminalConsole implements GeyserLogger {
|
||||
|
||||
private boolean colored = true;
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ import com.nukkitx.protocol.bedrock.data.*;
|
|||
import com.nukkitx.protocol.bedrock.packet.*;
|
||||
import lombok.Getter;
|
||||
import org.geysermc.common.window.FormWindow;
|
||||
import org.geysermc.multi.proxy.GeyserProxyBootstrap;
|
||||
import org.geysermc.multi.ui.FormID;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
@ -29,6 +30,8 @@ public class Player {
|
|||
private FormWindow currentWindow;
|
||||
private FormID currentWindowId;
|
||||
|
||||
private GeyserProxyBootstrap geyserProxy;
|
||||
|
||||
public Player(JsonNode extraData, BedrockServerSession session) {
|
||||
this.xuid = extraData.get("XUID").asText();
|
||||
this.identity = UUID.fromString(extraData.get("identity").asText());
|
||||
|
@ -118,6 +121,13 @@ public class Player {
|
|||
session.sendPacket(setEntityMotionPacket);
|
||||
}
|
||||
|
||||
public void onDisconnect() {
|
||||
if (geyserProxy != null) {
|
||||
//geyserProxy.onDisable();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void sendWindow(FormID id, FormWindow window) {
|
||||
this.currentWindow = window;
|
||||
this.currentWindowId = id;
|
||||
|
@ -131,4 +141,20 @@ public class Player {
|
|||
public void resendWindow() {
|
||||
sendWindow(currentWindowId, currentWindow);
|
||||
}
|
||||
|
||||
public void createGeyserProxy(Server server) {
|
||||
if (this.geyserProxy == null) {
|
||||
this.geyserProxy = new GeyserProxyBootstrap();
|
||||
geyserProxy.onEnable();
|
||||
}
|
||||
|
||||
geyserProxy.setServer(server);
|
||||
}
|
||||
|
||||
public void connectToProxy() {
|
||||
TransferPacket transferPacket = new TransferPacket();
|
||||
transferPacket.setAddress("127.0.0.1");
|
||||
transferPacket.setPort(geyserProxy.getGeyserConfig().getBedrock().getPort());
|
||||
session.sendPacket(transferPacket);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@ package org.geysermc.multi.utils;
|
|||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
|
|
106
src/main/resources/proxy_config.yml
Normal file
106
src/main/resources/proxy_config.yml
Normal file
|
@ -0,0 +1,106 @@
|
|||
# --------------------------------
|
||||
# Geyser Configuration File
|
||||
#
|
||||
# A bridge between Minecraft: Bedrock Edition and Minecraft: Java Edition.
|
||||
#
|
||||
# GitHub: https://github.com/GeyserMC/Geyser
|
||||
# Discord: https://discord.geysermc.org/
|
||||
# --------------------------------
|
||||
|
||||
bedrock:
|
||||
# The IP address that will listen for connections
|
||||
address: 0.0.0.0
|
||||
# The port that will listen for connections
|
||||
port: 19133
|
||||
# The MOTD that will be broadcasted to Minecraft: Bedrock Edition clients. Irrelevant if "passthrough-motd" is set to true
|
||||
motd1: "GeyserMC"
|
||||
motd2: "Another GeyserMC forced host."
|
||||
remote:
|
||||
# The IP address of the remote (Java Edition) server
|
||||
address: 127.0.0.1
|
||||
# The port of the remote (Java Edition) server
|
||||
port: 25565
|
||||
# Authentication type. Can be offline, online, or floodgate (see https://github.com/GeyserMC/Geyser/wiki/Floodgate).
|
||||
auth-type: online
|
||||
|
||||
# Floodgate uses encryption to ensure use from authorised sources.
|
||||
# This should point to the public key generated by Floodgate (Bungee or CraftBukkit)
|
||||
# You can ignore this when not using Floodgate.
|
||||
floodgate-key-file: public-key.pem
|
||||
|
||||
## the Xbox/MCPE username is the key for the Java server auth-info
|
||||
## this allows automatic configuration/login to the remote Java server
|
||||
## if you are brave/stupid enough to put your Mojang account info into
|
||||
## a config file
|
||||
#userAuths:
|
||||
# bluerkelp2: # MCPE/Xbox username
|
||||
# email: not_really_my_email_address_mr_minecrafter53267@gmail.com # Mojang account email address
|
||||
# password: "this isn't really my password"
|
||||
#
|
||||
# herpderp40300499303040503030300500293858393589:
|
||||
# email: herpderp@derpherp.com
|
||||
# password: dooooo
|
||||
|
||||
# Bedrock clients can freeze when opening up the command prompt for the first time if given a lot of commands.
|
||||
# Disabling this will prevent command suggestions from being sent and solve freezing for Bedrock clients.
|
||||
command-suggestions: false
|
||||
|
||||
# The following two options enable "ping passthrough" - the MOTD and/or player count gets retrieved from the Java server.
|
||||
# Relay the MOTD from the remote server to Bedrock players.
|
||||
passthrough-motd: false
|
||||
# Relay the player count and max players from the remote server to Bedrock players.
|
||||
passthrough-player-counts: false
|
||||
# Enable LEGACY ping passthrough. There is no need to enable this unless your MOTD or player count does not appear properly.
|
||||
# This option does nothing on standalone.
|
||||
legacy-ping-passthrough: false
|
||||
# How often to ping the remote server, in seconds. Only relevant for standalone or legacy ping passthrough.
|
||||
# Increase if you are getting BrokenPipe errors.
|
||||
ping-passthrough-interval: 3
|
||||
|
||||
# Maximum amount of players that can connect
|
||||
max-players: 100
|
||||
|
||||
# If debug messages should be sent through console
|
||||
debug-mode: false
|
||||
|
||||
# Thread pool size
|
||||
general-thread-pool: 32
|
||||
|
||||
# Allow third party capes to be visible. Currently allowing:
|
||||
# OptiFine capes, LabyMod capes, 5Zig capes and MinecraftCapes
|
||||
allow-third-party-capes: true
|
||||
|
||||
# Allow third party deadmau5 ears to be visible. Currently allowing:
|
||||
# MinecraftCapes
|
||||
allow-third-party-ears: false
|
||||
|
||||
# The default locale if we dont have the one the client requested
|
||||
default-locale: en_us
|
||||
|
||||
# Configures if chunk caching should be enabled or not. This keeps an individual
|
||||
# record of each block the client loads in. While this feature does allow for a few
|
||||
# things such as block break animations to show up in creative mode and among others,
|
||||
# it is HIGHLY recommended you disable this on a production environment as it can eat
|
||||
# up a lot of RAM. However, when using the Bukkit version of Geyser, support for features
|
||||
# or implementations this allows is automatically enabled without the additional caching as
|
||||
# Geyser has direct access to the server itself.
|
||||
cache-chunks: false
|
||||
|
||||
# Bedrock prevents building and displaying blocks above Y127 in the Nether -
|
||||
# enabling this config option works around that by changing the Nether dimension ID
|
||||
# to the End ID. The main downside to this is that the sky will resemble that of
|
||||
# the end sky in the nether, but ultimately it's the only way for this feature to work.
|
||||
above-bedrock-nether-building: false
|
||||
|
||||
# bStats is a stat tracker that is entirely anonymous and tracks only basic information
|
||||
# about Geyser, such as how many people are online, how many servers are using Geyser,
|
||||
# what OS is being used, etc. You can learn more about bStats here: https://bstats.org/.
|
||||
# https://bstats.org/plugin/server-implementation/GeyserMC
|
||||
metrics:
|
||||
# If metrics should be enabled
|
||||
enabled: false
|
||||
# UUID of server, don't change!
|
||||
uuid: generateduuid
|
||||
|
||||
# DO NOT TOUCH!
|
||||
config-version: 3
|
Loading…
Add table
Reference in a new issue