This commit is contained in:
Camotoy 2022-07-09 18:39:02 -04:00
parent f9fd7cb831
commit 897c4dcfec
No known key found for this signature in database
GPG Key ID: 7EEFB66FE798081F
30 changed files with 144 additions and 528 deletions

View File

@ -35,7 +35,6 @@ import org.geysermc.geyser.api.event.EventBus;
import org.geysermc.geyser.api.extension.ExtensionManager;
import org.geysermc.geyser.api.network.BedrockListener;
import org.geysermc.geyser.api.network.RemoteServer;
import org.geysermc.geyser.api.provider.ProviderManager;
import java.util.List;
import java.util.UUID;
@ -44,24 +43,6 @@ import java.util.UUID;
* Represents the API used in Geyser.
*/
public interface GeyserApi extends GeyserApiBase {
/**
* Shuts down the current Geyser instance.
*/
void shutdown();
/**
* Reloads the current Geyser instance.
*/
void reload();
/**
* Gets if this Geyser instance is running in an IDE. This only needs to be used in cases where files
* expected to be in a jarfile are not present.
*
* @return if we are in a production environment
*/
boolean isProductionEnvironment();
/**
* {@inheritDoc}
*/
@ -101,11 +82,15 @@ public interface GeyserApi extends GeyserApiBase {
CommandManager commandManager();
/**
* Gets the {@link ProviderManager}.
* Provides an implementation for the specified API type.
*
* @return the provider manager
* @param apiClass the builder class
* @param <R> the implementation type
* @param <T> the API type
* @return the builder instance
*/
ProviderManager providerManager();
@NonNull
<R extends T, T> R provider(@NonNull Class<T> apiClass, @Nullable Object... args);
/**
* Gets the {@link EventBus} for handling
@ -131,15 +116,6 @@ public interface GeyserApi extends GeyserApiBase {
*/
BedrockListener bedrockListener();
/**
* Gets the maximum number of players that
* can join this Geyser instance.
*
* @return the maximum number of players that
* can join this Geyser instance
*/
int maxPlayers();
/**
* Gets the current {@link GeyserApiBase} instance.
*

View File

@ -105,7 +105,7 @@ public interface Command {
}
static <T extends CommandSource> Command.Builder<T> builder(Class<T> sourceType) {
return GeyserApi.api().providerManager().builderProvider().provideBuilder(Builder.class, sourceType);
return GeyserApi.api().provider(Builder.class, sourceType);
}
interface Builder<T extends CommandSource> {

View File

@ -45,9 +45,10 @@ public class ServerDefineCommandsEvent extends ConnectionEvent implements Cancel
}
/**
* A mutable collection of the commands sent over.
* A collection of commands sent from the server. Any element in this collection can be removed, but no element can
* be added.
*
* @return a mutable collection of the commands sent over
* @return a collection of the commands sent over
*/
@NonNull
public Set<? extends CommandInfo> commands() {
@ -65,7 +66,6 @@ public class ServerDefineCommandsEvent extends ConnectionEvent implements Cancel
}
public interface CommandInfo {
/**
* Gets the name of the command.
*

View File

@ -83,7 +83,7 @@ public interface CustomItemData {
@Nullable CustomRenderOffsets renderOffsets();
static CustomItemData.Builder builder() {
return GeyserApi.api().providerManager().builderProvider().provideBuilder(CustomItemData.Builder.class);
return GeyserApi.api().provider(CustomItemData.Builder.class);
}
interface Builder {

View File

@ -68,7 +68,7 @@ public interface CustomItemOptions {
}
static CustomItemOptions.Builder builder() {
return GeyserApi.api().providerManager().builderProvider().provideBuilder(CustomItemOptions.Builder.class);
return GeyserApi.api().provider(CustomItemOptions.Builder.class);
}
interface Builder {

View File

@ -137,7 +137,7 @@ public interface NonVanillaCustomItemData extends CustomItemData {
boolean isTool();
static NonVanillaCustomItemData.Builder builder() {
return GeyserApi.api().providerManager().builderProvider().provideBuilder(NonVanillaCustomItemData.Builder.class);
return GeyserApi.api().provider(NonVanillaCustomItemData.Builder.class);
}
interface Builder extends CustomItemData.Builder {

View File

@ -25,16 +25,22 @@
package org.geysermc.geyser.api.network;
import java.util.Locale;
/**
* The authentication types that a Java server can be on connection.
*/
public enum AuthType {
OFFLINE,
ONLINE,
/**
* The internal name for connecting to an online mode server without needing a Java account. The presence of this
* authentication type does not necessarily mean the Floodgate plugin is installed; it only means that this
* authentication type will be attempted.
*/
FLOODGATE;
public static final AuthType[] VALUES = values();
public static AuthType getById(int id) {
return id < VALUES.length ? VALUES[id] : OFFLINE;
}
private static final AuthType[] VALUES = values();
/**
* Convert the AuthType string (from config) to the enum, ONLINE on fail
@ -44,7 +50,7 @@ public enum AuthType {
* @return The converted AuthType
*/
public static AuthType getByName(String name) {
String upperCase = name.toUpperCase();
String upperCase = name.toUpperCase(Locale.ROOT);
for (AuthType type : VALUES) {
if (type.name().equals(upperCase)) {
return type;

View File

@ -48,7 +48,7 @@ public interface BedrockListener {
int port();
/**
* Gets the primary MOTD shown to Bedrock players.
* Gets the primary MOTD shown to Bedrock players if a ping passthrough setting is not enabled.
* <p>
* This is the first line that will be displayed.
*
@ -57,7 +57,7 @@ public interface BedrockListener {
String primaryMotd();
/**
* Gets the secondary MOTD shown to Bedrock players.
* Gets the secondary MOTD shown to Bedrock players if a ping passthrough setting is not enabled.
* <p>
* This is the second line that will be displayed.
*

View File

@ -1,47 +0,0 @@
/*
* Copyright (c) 2019-2022 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.geyser.api.provider;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
/**
* Allows for obtaining instances of a builder that are
* used for constructing various data.
*/
public interface BuilderProvider extends Provider {
/**
* Provides a builder for the specified builder type.
*
* @param builderClass the builder class
* @param <B> the resulting type
* @param <T> the builder type
* @return the builder instance
*/
@NonNull
<B extends T, T> B provideBuilder(@NonNull Class<T> builderClass, @Nullable Object... args);
}

View File

@ -1,29 +0,0 @@
/*
* Copyright (c) 2019-2022 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.geyser.api.provider;
public interface Provider {
}

View File

@ -1,41 +0,0 @@
/*
* Copyright (c) 2019-2022 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.geyser.api.provider;
/**
* Holds a record of every {@link Provider} available
* that allows for accessing various information throughout
* the API.
*/
public interface ProviderManager {
/**
* Returns the {@link BuilderProvider}.
*
* @return the builder provider
*/
BuilderProvider builderProvider();
}

View File

@ -197,7 +197,7 @@ public class GeyserStandaloneBootstrap implements GeyserBootstrap {
handleArgsConfigOptions();
if (this.geyserConfig.getRemote().getAddress().equalsIgnoreCase("auto")) {
if (this.geyserConfig.getRemote().address().equalsIgnoreCase("auto")) {
geyserConfig.setAutoconfiguredRemote(true); // Doesn't really need to be set but /shrug
geyserConfig.getRemote().setAddress("127.0.0.1");
}

View File

@ -34,7 +34,7 @@ import java.nio.file.Path;
public class FloodgateKeyLoader {
public static Path getKeyPath(GeyserJacksonConfiguration config, Path floodgateDataFolder, Path geyserDataFolder, GeyserLogger logger) {
if (config.getRemote().getAuthType() != AuthType.FLOODGATE) {
if (config.getRemote().authType() != AuthType.FLOODGATE) {
return geyserDataFolder.resolve(config.getFloodgateKeyFile());
}

View File

@ -64,14 +64,10 @@ import org.geysermc.geyser.entity.EntityDefinitions;
import org.geysermc.geyser.event.GeyserEventBus;
import org.geysermc.geyser.extension.GeyserExtensionManager;
import org.geysermc.geyser.level.WorldManager;
import org.geysermc.geyser.network.BedrockListenerImpl;
import org.geysermc.geyser.network.ConnectorServerEventHandler;
import org.geysermc.geyser.network.GameProtocol;
import org.geysermc.geyser.network.RemoteServerImpl;
import org.geysermc.geyser.pack.ResourcePack;
import org.geysermc.geyser.registry.BlockRegistries;
import org.geysermc.geyser.registry.Registries;
import org.geysermc.geyser.registry.provider.GeyserProviderManager;
import org.geysermc.geyser.scoreboard.ScoreboardUpdater;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.PendingMicrosoftAuthentication;
@ -90,7 +86,6 @@ import javax.naming.directory.InitialDirContext;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
@ -148,10 +143,6 @@ public class GeyserImpl implements GeyserApi {
private final EventBus eventBus;
private final GeyserExtensionManager extensionManager;
private final GeyserProviderManager providerManager = new GeyserProviderManager();
private final RemoteServer remoteServer;
private final BedrockListener bedrockListener;
private Metrics metrics;
@ -215,22 +206,6 @@ public class GeyserImpl implements GeyserApi {
}
}
this.remoteServer = new RemoteServerImpl(
config.getRemote().getAddress(),
config.getRemote().getPort(),
GameProtocol.getJavaProtocolVersion(),
GameProtocol.getJavaMinecraftVersion(),
config.getRemote().getAuthType()
);
this.bedrockListener = new BedrockListenerImpl(
config.getBedrock().getAddress(),
config.getBedrock().getPort(),
config.getBedrock().getMotd1(),
config.getBedrock().getMotd2(),
config.getBedrock().getServerName()
);
double completeTime = (System.currentTimeMillis() - startupTime) / 1000D;
String message = GeyserLocale.getLocaleStringLog("geyser.core.finish.done", new DecimalFormat("#.###").format(completeTime)) + " ";
if (isGui) {
@ -243,7 +218,7 @@ public class GeyserImpl implements GeyserApi {
if (platformType == PlatformType.STANDALONE) {
logger.warning(GeyserLocale.getLocaleStringLog("geyser.core.movement_warn"));
} else if (config.getRemote().getAuthType() == AuthType.FLOODGATE) {
} else if (config.getRemote().authType() == AuthType.FLOODGATE) {
VersionCheckUtils.checkForOutdatedFloodgate(logger);
}
}
@ -260,7 +235,7 @@ public class GeyserImpl implements GeyserApi {
ResourcePack.loadPacks();
if (platformType != PlatformType.STANDALONE && config.getRemote().getAddress().equals("auto")) {
if (platformType != PlatformType.STANDALONE && config.getRemote().address().equals("auto")) {
// Set the remote address to localhost since that is where we are always connecting
try {
config.getRemote().setAddress(InetAddress.getLocalHost().getHostAddress());
@ -272,7 +247,7 @@ public class GeyserImpl implements GeyserApi {
config.getRemote().setAddress(InetAddress.getLoopbackAddress().getHostAddress());
}
}
String remoteAddress = config.getRemote().getAddress();
String remoteAddress = config.getRemote().address();
// Filters whether it is not an IP address or localhost, because otherwise it is not possible to find out an SRV entry.
if (!remoteAddress.matches(IP_REGEX) && !remoteAddress.equalsIgnoreCase("localhost")) {
int remotePort;
@ -298,24 +273,6 @@ public class GeyserImpl implements GeyserApi {
// Ensure that PacketLib does not create an event loop for handling packets; we'll do that ourselves
TcpSession.USE_EVENT_LOOP_FOR_PACKETS = false;
String branch = "unknown";
int buildNumber = -1;
if (this.isProductionEnvironment()) {
try (InputStream stream = bootstrap.getResource("git.properties")) {
Properties gitProperties = new Properties();
gitProperties.load(stream);
branch = gitProperties.getProperty("git.branch");
String build = gitProperties.getProperty("git.build.number");
if (build != null) {
buildNumber = Integer.parseInt(build);
}
} catch (Throwable e) {
logger.error("Failed to read git.properties", e);
}
} else {
logger.debug("Not getting git properties for the news handler as we are in a development environment.");
}
pendingMicrosoftAuthentication = new PendingMicrosoftAuthentication(config.getPendingAuthenticationTimeout());
this.newsHandler = new NewsHandler(BRANCH, this.buildNumber());
@ -335,7 +292,7 @@ public class GeyserImpl implements GeyserApi {
boolean enableProxyProtocol = config.getBedrock().isEnableProxyProtocol();
bedrockServer = new BedrockServer(
new InetSocketAddress(config.getBedrock().getAddress(), config.getBedrock().getPort()),
new InetSocketAddress(config.getBedrock().address(), config.getBedrock().port()),
bedrockThreadCount,
EventLoops.commonGroup(),
enableProxyProtocol
@ -358,11 +315,11 @@ public class GeyserImpl implements GeyserApi {
if (shouldStartListener) {
bedrockServer.bind().whenComplete((avoid, throwable) -> {
if (throwable == null) {
logger.info(GeyserLocale.getLocaleStringLog("geyser.core.start", config.getBedrock().getAddress(),
String.valueOf(config.getBedrock().getPort())));
logger.info(GeyserLocale.getLocaleStringLog("geyser.core.start", config.getBedrock().address(),
String.valueOf(config.getBedrock().port())));
} else {
String address = config.getBedrock().getAddress();
int port = config.getBedrock().getPort();
String address = config.getBedrock().address();
int port = config.getBedrock().port();
logger.severe(GeyserLocale.getLocaleStringLog("geyser.core.fail", address, String.valueOf(port)));
if (!"0.0.0.0".equals(address)) {
logger.info(ChatColor.GREEN + "Suggestion: try setting `address` under `bedrock` in the Geyser config back to 0.0.0.0");
@ -372,7 +329,7 @@ public class GeyserImpl implements GeyserApi {
}).join();
}
if (config.getRemote().getAuthType() == AuthType.FLOODGATE) {
if (config.getRemote().authType() == AuthType.FLOODGATE) {
try {
Key key = new AesKeyProducer().produceFrom(config.getFloodgateKeyPath());
cipher = new AesCipher(new Base64Topping());
@ -390,7 +347,7 @@ public class GeyserImpl implements GeyserApi {
metrics = new Metrics(this, "GeyserMC", config.getMetrics().getUniqueId(), false, java.util.logging.Logger.getLogger(""));
metrics.addCustomChart(new Metrics.SingleLineChart("players", sessionManager::size));
// Prevent unwanted words best we can
metrics.addCustomChart(new Metrics.SimplePie("authMode", () -> config.getRemote().getAuthType().toString().toLowerCase(Locale.ROOT)));
metrics.addCustomChart(new Metrics.SimplePie("authMode", () -> config.getRemote().authType().toString().toLowerCase(Locale.ROOT)));
metrics.addCustomChart(new Metrics.SimplePie("platform", platformType::getPlatformName));
metrics.addCustomChart(new Metrics.SimplePie("defaultLocale", GeyserLocale::getDefaultLocale));
metrics.addCustomChart(new Metrics.SimplePie("version", () -> GeyserImpl.VERSION));
@ -474,7 +431,7 @@ public class GeyserImpl implements GeyserApi {
metrics = null;
}
if (config.getRemote().getAuthType() == AuthType.ONLINE) {
if (config.getRemote().authType() == AuthType.ONLINE) {
if (config.getUserAuths() != null && !config.getUserAuths().isEmpty()) {
getLogger().warning("The 'userAuths' config section is now deprecated, and will be removed in the near future! " +
"Please migrate to the new 'saved-user-logins' config option: " +
@ -552,7 +509,6 @@ public class GeyserImpl implements GeyserApi {
return null;
}
@Override
public void shutdown() {
bootstrap.getGeyserLogger().info(GeyserLocale.getLocaleStringLog("geyser.core.shutdown"));
shuttingDown = true;
@ -579,7 +535,6 @@ public class GeyserImpl implements GeyserApi {
bootstrap.getGeyserLogger().info(GeyserLocale.getLocaleStringLog("geyser.core.shutdown.done"));
}
@Override
public void reload() {
shutdown();
this.extensionManager.enableExtensions();
@ -592,10 +547,10 @@ public class GeyserImpl implements GeyserApi {
*
* @return true if the version number is not 'DEV'.
*/
@Override
public boolean isProductionEnvironment() {
// First is if Blossom runs, second is if Blossom doesn't run
// noinspection ConstantConditions - changes in production
return !"git-local/dev-0000000".equals(GeyserImpl.GIT_VERSION);
return !("git-local/dev-0000000".equals(GeyserImpl.GIT_VERSION) || "${gitVersion}".equals(GeyserImpl.GIT_VERSION));
}
@Override
@ -609,8 +564,8 @@ public class GeyserImpl implements GeyserApi {
}
@Override
public GeyserProviderManager providerManager() {
return this.providerManager;
public <R extends T, T> @NonNull R provider(@NonNull Class<T> apiClass, @Nullable Object... args) {
return (R) Registries.PROVIDERS.get(apiClass).create(args);
}
@Override
@ -619,17 +574,12 @@ public class GeyserImpl implements GeyserApi {
}
public RemoteServer defaultRemoteServer() {
return this.remoteServer;
return getConfig().getRemote();
}
@Override
public BedrockListener bedrockListener() {
return this.bedrockListener;
}
@Override
public int maxPlayers() {
return this.getConfig().getMaxPlayers();
return getConfig().getBedrock();
}
public int buildNumber() {

View File

@ -27,8 +27,10 @@ package org.geysermc.geyser.configuration;
import com.fasterxml.jackson.annotation.JsonIgnore;
import org.geysermc.geyser.GeyserLogger;
import org.geysermc.geyser.api.network.AuthType;
import org.geysermc.geyser.api.network.BedrockListener;
import org.geysermc.geyser.api.network.RemoteServer;
import org.geysermc.geyser.network.CIDRMatcher;
import org.geysermc.geyser.network.GameProtocol;
import org.geysermc.geyser.text.GeyserLocale;
import java.nio.file.Path;
@ -109,20 +111,10 @@ public interface GeyserConfiguration {
int getPendingAuthenticationTimeout();
interface IBedrockConfiguration {
String getAddress();
int getPort();
interface IBedrockConfiguration extends BedrockListener {
boolean isCloneRemotePort();
String getMotd1();
String getMotd2();
String getServerName();
int getCompressionLevel();
boolean isEnableProxyProtocol();
@ -135,23 +127,25 @@ public interface GeyserConfiguration {
List<CIDRMatcher> getWhitelistedIPsMatchers();
}
interface IRemoteConfiguration {
String getAddress();
int getPort();
interface IRemoteConfiguration extends RemoteServer {
void setAddress(String address);
void setPort(int port);
AuthType getAuthType();
boolean isPasswordAuthentication();
boolean isUseProxyProtocol();
boolean isForwardHost();
default String minecraftVersion() {
return GameProtocol.getJavaMinecraftVersion();
}
default int protocolVersion() {
return GameProtocol.getJavaProtocolVersion();
}
}
interface IUserAuthenticationInfo {

View File

@ -153,24 +153,50 @@ public abstract class GeyserJacksonConfiguration implements GeyserConfiguration
@JsonProperty("pending-authentication-timeout")
private int pendingAuthenticationTimeout = 120;
@Getter
@JsonIgnoreProperties(ignoreUnknown = true)
public static class BedrockConfiguration implements IBedrockConfiguration {
@AsteriskSerializer.Asterisk(isIp = true)
private String address = "0.0.0.0";
@Override
public String address() {
return address;
}
@Setter
private int port = 19132;
@Override
public int port() {
return port;
}
@Getter
@JsonProperty("clone-remote-port")
private boolean cloneRemotePort = false;
private String motd1 = "GeyserMC";
@Override
public String primaryMotd() {
return motd1;
}
private String motd2 = "Geyser";
@Override
public String secondaryMotd() {
return motd2;
}
@JsonProperty("server-name")
private String serverName = GeyserImpl.NAME;
@Override
public String serverName() {
return serverName;
}
@JsonProperty("compression-level")
private int compressionLevel = 6;
@ -178,9 +204,11 @@ public abstract class GeyserJacksonConfiguration implements GeyserConfiguration
return Math.max(-1, Math.min(compressionLevel, 9));
}
@Getter
@JsonProperty("enable-proxy-protocol")
private boolean enableProxyProtocol = false;
@Getter
@JsonProperty("proxy-protocol-whitelisted-ips")
private List<String> proxyProtocolWhitelistedIPs = Collections.emptyList();
@ -202,28 +230,45 @@ public abstract class GeyserJacksonConfiguration implements GeyserConfiguration
}
}
@Getter
@JsonIgnoreProperties(ignoreUnknown = true)
public static class RemoteConfiguration implements IRemoteConfiguration {
@Setter
@AsteriskSerializer.Asterisk(isIp = true)
private String address = "auto";
@Override
public String address() {
return address;
}
@JsonDeserialize(using = PortDeserializer.class)
@Setter
private int port = 25565;
@Override
public int port() {
return port;
}
@Setter
@JsonDeserialize(using = AuthTypeDeserializer.class)
@JsonProperty("auth-type")
private AuthType authType = AuthType.ONLINE;
@Override
public AuthType authType() {
return authType;
}
@Getter
@JsonProperty("allow-password-authentication")
private boolean passwordAuthentication = true;
@Getter
@JsonProperty("use-proxy-protocol")
private boolean useProxyProtocol = false;
@Getter
@JsonProperty("forward-hostname")
private boolean forwardHost = false;
}

View File

@ -1,31 +0,0 @@
/*
* Copyright (c) 2019-2022 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.geyser.network;
import org.geysermc.geyser.api.network.BedrockListener;
public record BedrockListenerImpl(String address, int port, String primaryMotd, String secondaryMotd, String serverName) implements BedrockListener {
}

View File

@ -108,7 +108,7 @@ public class ConnectorServerEventHandler implements BedrockServerEventHandler {
pong.setNintendoLimited(false);
pong.setProtocolVersion(GameProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion());
pong.setVersion(GameProtocol.DEFAULT_BEDROCK_CODEC.getMinecraftVersion()); // Required to not be empty as of 1.16.210.59. Can only contain . and numbers.
pong.setIpv4Port(config.getBedrock().getPort());
pong.setIpv4Port(config.getBedrock().port());
if (config.isPassthroughMotd() && pingInfo != null && pingInfo.getDescription() != null) {
String[] motd = MessageTranslator.convertMessageLenient(pingInfo.getDescription()).split("\n");
@ -118,8 +118,8 @@ public class ConnectorServerEventHandler implements BedrockServerEventHandler {
pong.setMotd(mainMotd.trim());
pong.setSubMotd(subMotd.trim()); // Trimmed to shift it to the left, prevents the universe from collapsing on us just because we went 2 characters over the text box's limit.
} else {
pong.setMotd(config.getBedrock().getMotd1());
pong.setSubMotd(config.getBedrock().getMotd2());
pong.setMotd(config.getBedrock().primaryMotd());
pong.setSubMotd(config.getBedrock().secondaryMotd());
}
if (config.isPassthroughPlayerCounts() && pingInfo != null) {

View File

@ -151,7 +151,7 @@ public class QueryPacketHandler {
String[] javaMotd = MessageTranslator.convertMessageLenient(pingInfo.getDescription()).split("\n");
motd = javaMotd[0].trim(); // First line of the motd.
} else {
motd = geyser.getConfig().getBedrock().getMotd1();
motd = geyser.getConfig().getBedrock().primaryMotd();
}
// If passthrough player counts is enabled lets get players from the server
@ -180,8 +180,8 @@ public class QueryPacketHandler {
gameData.put("map", map);
gameData.put("numplayers", currentPlayerCount);
gameData.put("maxplayers", maxPlayerCount);
gameData.put("hostport", String.valueOf(geyser.getConfig().getBedrock().getPort()));
gameData.put("hostip", geyser.getConfig().getBedrock().getAddress());
gameData.put("hostport", String.valueOf(geyser.getConfig().getBedrock().port()));
gameData.put("hostip", geyser.getConfig().getBedrock().address());
try {
writeString(query, "GeyserMC");

View File

@ -1,32 +0,0 @@
/*
* Copyright (c) 2019-2022 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.geyser.network;
import org.geysermc.geyser.api.network.AuthType;
import org.geysermc.geyser.api.network.RemoteServer;
public record RemoteServerImpl(String address, int port, int protocolVersion, String minecraftVersion, AuthType authType) implements RemoteServer {
}

View File

@ -31,7 +31,6 @@ import com.nukkitx.protocol.bedrock.data.ExperimentData;
import com.nukkitx.protocol.bedrock.data.ResourcePackType;
import com.nukkitx.protocol.bedrock.packet.*;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.session.PendingMicrosoftAuthentication;
import org.geysermc.geyser.api.network.AuthType;
import org.geysermc.geyser.configuration.GeyserConfiguration;
import org.geysermc.geyser.pack.ResourcePack;
@ -39,6 +38,7 @@ import org.geysermc.geyser.pack.ResourcePackManifest;
import org.geysermc.geyser.registry.BlockRegistries;
import org.geysermc.geyser.registry.Registries;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.PendingMicrosoftAuthentication;
import org.geysermc.geyser.text.GeyserLocale;
import org.geysermc.geyser.util.LoginEncryptionUtils;
import org.geysermc.geyser.util.MathUtils;
@ -119,7 +119,7 @@ public class UpstreamPacketHandler extends LoggingPacketHandler {
public boolean handle(ResourcePackClientResponsePacket packet) {
switch (packet.getStatus()) {
case COMPLETED:
if (geyser.getConfig().getRemote().getAuthType() != AuthType.ONLINE) {
if (geyser.getConfig().getRemote().authType() != AuthType.ONLINE) {
session.authenticate(session.getAuthData().name());
} else if (!couldLoginUserByName(session.getAuthData().name())) {
// We must spawn the white world

View File

@ -76,8 +76,8 @@ public class GeyserLegacyPingPassthrough implements IGeyserPingPassthrough, Runn
public void run() {
try {
Socket socket = new Socket();
String address = geyser.getConfig().getRemote().getAddress();
int port = geyser.getConfig().getRemote().getPort();
String address = geyser.getConfig().getRemote().address();
int port = geyser.getConfig().getRemote().port();
socket.connect(new InetSocketAddress(address, port), 5000);
ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream();

View File

@ -1,42 +0,0 @@
/*
* Copyright (c) 2019-2022 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.geyser.registry;
import org.geysermc.geyser.api.provider.Provider;
import org.geysermc.geyser.registry.loader.ProviderRegistryLoader;
import org.geysermc.geyser.registry.provider.GeyserBuilderProvider;
import org.geysermc.geyser.registry.provider.ProviderSupplier;
/**
* Holds registries for the available {@link Provider}s
*/
public class ProviderRegistries {
/**
* A registry containing all the providers for builders.
*/
public static final SimpleMappedRegistry<Class<?>, ProviderSupplier> BUILDERS = SimpleMappedRegistry.create(GeyserBuilderProvider.INSTANCE, ProviderRegistryLoader::new);
}

View File

@ -40,8 +40,6 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2IntMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import net.kyori.adventure.key.Key;
import org.geysermc.geyser.api.extension.ExtensionLoader;
import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.inventory.item.Enchantment.JavaEnchantment;
import org.geysermc.geyser.inventory.recipe.GeyserRecipe;
@ -49,6 +47,7 @@ import org.geysermc.geyser.registry.loader.*;
import org.geysermc.geyser.registry.populator.ItemRegistryPopulator;
import org.geysermc.geyser.registry.populator.PacketRegistryPopulator;
import org.geysermc.geyser.registry.populator.RecipeRegistryPopulator;
import org.geysermc.geyser.registry.provider.ProviderSupplier;
import org.geysermc.geyser.registry.type.EnchantmentData;
import org.geysermc.geyser.registry.type.ItemMappings;
import org.geysermc.geyser.registry.type.ParticleMapping;
@ -59,10 +58,7 @@ import org.geysermc.geyser.translator.level.event.LevelEventTranslator;
import org.geysermc.geyser.translator.sound.SoundInteractionTranslator;
import org.geysermc.geyser.translator.sound.SoundTranslator;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
/**
* Holds all the common registries in Geyser.
@ -140,6 +136,11 @@ public final class Registries {
*/
public static final SimpleRegistry<Set<PotionMixData>> POTION_MIXES;
/**
* A registry holding all the
*/
public static final SimpleMappedRegistry<Class<?>, ProviderSupplier> PROVIDERS = SimpleMappedRegistry.create(new IdentityHashMap<>(), ProviderRegistryLoader::new);
/**
* A versioned registry holding all the recipes, with the net ID being the key, and {@link GeyserRecipe} as the value.
*/

View File

@ -25,21 +25,32 @@
package org.geysermc.geyser.registry.loader;
import org.geysermc.geyser.registry.provider.AbstractProvider;
import org.geysermc.geyser.api.command.Command;
import org.geysermc.geyser.api.command.CommandSource;
import org.geysermc.geyser.api.item.custom.CustomItemData;
import org.geysermc.geyser.api.item.custom.CustomItemOptions;
import org.geysermc.geyser.api.item.custom.NonVanillaCustomItemData;
import org.geysermc.geyser.command.GeyserCommandManager;
import org.geysermc.geyser.item.GeyserCustomItemData;
import org.geysermc.geyser.item.GeyserCustomItemOptions;
import org.geysermc.geyser.item.GeyserNonVanillaCustomItemData;
import org.geysermc.geyser.registry.provider.ProviderSupplier;
import java.util.IdentityHashMap;
import java.util.Map;
/**
* Registers the provider data from the provider.
*/
public class ProviderRegistryLoader implements RegistryLoader<AbstractProvider, Map<Class<?>, ProviderSupplier>> {
public class ProviderRegistryLoader implements RegistryLoader<Map<Class<?>, ProviderSupplier>, Map<Class<?>, ProviderSupplier>> {
@SuppressWarnings("unchecked")
@Override
public Map<Class<?>, ProviderSupplier> load(AbstractProvider input) {
Map<Class<?>, ProviderSupplier> providers = new IdentityHashMap<>();
input.registerProviders(providers);
public Map<Class<?>, ProviderSupplier> load(Map<Class<?>, ProviderSupplier> providers) {
providers.put(Command.Builder.class, args -> new GeyserCommandManager.CommandBuilder<>((Class<? extends CommandSource>) args[0]));
providers.put(CustomItemData.Builder.class, args -> new GeyserCustomItemData.CustomItemDataBuilder());
providers.put(CustomItemOptions.Builder.class, args -> new GeyserCustomItemOptions.CustomItemOptionsBuilder());
providers.put(NonVanillaCustomItemData.Builder.class, args -> new GeyserNonVanillaCustomItemData.NonVanillaCustomItemDataBuilder());
return providers;
}
}

View File

@ -1,39 +0,0 @@
/*
* Copyright (c) 2019-2022 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.geyser.registry.provider;
import lombok.RequiredArgsConstructor;
import org.geysermc.geyser.api.provider.Provider;
import org.geysermc.geyser.registry.SimpleMappedRegistry;
import java.util.Map;
@RequiredArgsConstructor
public abstract class AbstractProvider implements Provider {
public abstract void registerProviders(Map<Class<?>, ProviderSupplier> providers);
public abstract SimpleMappedRegistry<Class<?>, ProviderSupplier> providerRegistry();
}

View File

@ -1,70 +0,0 @@
/*
* Copyright (c) 2019-2022 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.geyser.registry.provider;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.api.command.Command;
import org.geysermc.geyser.api.command.CommandSource;
import org.geysermc.geyser.api.item.custom.CustomItemData;
import org.geysermc.geyser.api.item.custom.CustomItemOptions;
import org.geysermc.geyser.api.item.custom.NonVanillaCustomItemData;
import org.geysermc.geyser.api.provider.BuilderProvider;
import org.geysermc.geyser.command.GeyserCommandManager;
import org.geysermc.geyser.item.GeyserCustomItemData;
import org.geysermc.geyser.item.GeyserCustomItemOptions;
import org.geysermc.geyser.item.GeyserNonVanillaCustomItemData;
import org.geysermc.geyser.registry.ProviderRegistries;
import org.geysermc.geyser.registry.SimpleMappedRegistry;
import java.util.Map;
public class GeyserBuilderProvider extends AbstractProvider implements BuilderProvider {
public static GeyserBuilderProvider INSTANCE = new GeyserBuilderProvider();
private GeyserBuilderProvider() {
}
@SuppressWarnings("unchecked")
@Override
public void registerProviders(Map<Class<?>, ProviderSupplier> providers) {
providers.put(Command.Builder.class, args -> new GeyserCommandManager.CommandBuilder<>((Class<? extends CommandSource>) args[0]));
providers.put(CustomItemData.Builder.class, args -> new GeyserCustomItemData.CustomItemDataBuilder());
providers.put(CustomItemOptions.Builder.class, args -> new GeyserCustomItemOptions.CustomItemOptionsBuilder());
providers.put(NonVanillaCustomItemData.Builder.class, args -> new GeyserNonVanillaCustomItemData.NonVanillaCustomItemDataBuilder());
}
@Override
public SimpleMappedRegistry<Class<?>, ProviderSupplier> providerRegistry() {
return ProviderRegistries.BUILDERS;
}
@SuppressWarnings("unchecked")
@Override
public <B extends T, T> @NonNull B provideBuilder(@NonNull Class<T> builderClass, @Nullable Object... args) {
return (B) this.providerRegistry().get(builderClass).create(args);
}
}

View File

@ -1,36 +0,0 @@
/*
* Copyright (c) 2019-2022 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.geyser.registry.provider;
import org.geysermc.geyser.api.provider.ProviderManager;
public class GeyserProviderManager implements ProviderManager {
@Override
public GeyserBuilderProvider builderProvider() {
return GeyserBuilderProvider.INSTANCE;
}
}

View File

@ -581,7 +581,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
disconnect(message);
});
this.remoteServer = geyser.getRemoteServer();
this.remoteServer = geyser.defaultRemoteServer();
}
/**
@ -1457,7 +1457,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
startGamePacket.setFromWorldTemplate(false);
startGamePacket.setWorldTemplateOptionLocked(false);
String serverName = geyser.getConfig().getBedrock().getServerName();
String serverName = geyser.getConfig().getBedrock().serverName();
startGamePacket.setLevelId(serverName);
startGamePacket.setLevelName(serverName);

View File

@ -286,7 +286,7 @@ public class SkinManager {
String skinUrl = isAlex ? SkinProvider.EMPTY_SKIN_ALEX.getTextureUrl() : SkinProvider.EMPTY_SKIN.getTextureUrl();
String capeUrl = SkinProvider.EMPTY_CAPE.getTextureUrl();
if (("steve".equals(skinUrl) || "alex".equals(skinUrl)) && GeyserImpl.getInstance().getConfig().getRemote().getAuthType() != AuthType.ONLINE) {
if (("steve".equals(skinUrl) || "alex".equals(skinUrl)) && GeyserImpl.getInstance().getConfig().getRemote().authType() != AuthType.ONLINE) {
GeyserSession session = GeyserImpl.getInstance().connectionByUuid(uuid);
if (session != null) {