Merge branch 'GeyserMC:master' into rp

This commit is contained in:
chris 2024-08-12 00:24:20 +02:00 committed by GitHub
commit 20e49192f1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
20 changed files with 174 additions and 129 deletions

4
.gitignore vendored
View file

@ -249,6 +249,8 @@ locales/
/packs/
/dump.json
/saved-refresh-tokens.json
/saved-auth-chains.json
/custom_mappings/
/languages/
/custom-skulls.yml
/custom-skulls.yml
/permissions.yml

View file

@ -15,7 +15,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 joined us here!
## Supported Versions
Geyser is currently supporting Minecraft Bedrock 1.20.80 - 1.21.3 and Minecraft Java Server 1.21. For more info please see [here](https://geysermc.org/wiki/geyser/supported-versions/).
Geyser is currently supporting Minecraft Bedrock 1.20.80 - 1.21.3 and Minecraft Java Server 1.21/1.21.1. For more info please see [here](https://geysermc.org/wiki/geyser/supported-versions/).
## Setting Up
Take a look [here](https://geysermc.org/wiki/geyser/setup/) for how to set up Geyser.

View file

@ -71,9 +71,6 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap {
private IGeyserPingPassthrough geyserBungeePingPassthrough;
private GeyserImpl geyser;
// We can't disable the plugin; hence we need to keep track of it manually
private boolean disabled;
@Override
public void onLoad() {
onGeyserInitialize();
@ -98,7 +95,6 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap {
}
if (!this.loadConfig()) {
disabled = true;
return;
}
this.geyserLogger.setDebug(geyserConfig.isDebugMode());
@ -112,7 +108,7 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap {
@Override
public void onEnable() {
if (disabled) {
if (geyser == null) {
return; // Config did not load properly!
}
// Big hack - Bungee does not provide us an event to listen to, so schedule a repeating

View file

@ -89,6 +89,11 @@ public abstract class GeyserModBootstrap implements GeyserBootstrap {
}
public void onGeyserEnable() {
// "Disabling" a mod isn't possible; so if we fail to initialize we need to manually stop here
if (geyser == null) {
return;
}
if (GeyserImpl.getInstance().isReloading()) {
if (!loadConfig()) {
return;

View file

@ -81,5 +81,7 @@ tasks.withType<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar> {
modrinth {
uploadFile.set(tasks.getByPath("shadowJar"))
gameVersions.addAll("1.16.5", "1.17", "1.17.1", "1.18", "1.18.1", "1.18.2", "1.19",
"1.19.1", "1.19.2", "1.19.3", "1.19.4", "1.20", "1.20.1", "1.20.2", "1.20.3", "1.20.4", "1.20.5", "1.20.6")
loaders.addAll("spigot", "paper")
}

View file

@ -117,7 +117,6 @@ public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap {
geyserLogger.error(GeyserLocale.getLocaleStringLog("geyser.bootstrap.unsupported_server.message", "1.13.2"));
geyserLogger.error("");
geyserLogger.error("*********************************************");
Bukkit.getPluginManager().disablePlugin(this);
return;
}
@ -131,7 +130,6 @@ public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap {
geyserLogger.error(GeyserLocale.getLocaleStringLog("geyser.bootstrap.unsupported_server_type.message", "Paper"));
geyserLogger.error("");
geyserLogger.error("*********************************************");
Bukkit.getPluginManager().disablePlugin(this);
return;
}
}
@ -144,10 +142,25 @@ public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap {
geyserLogger.error("This version of Spigot is using an outdated version of netty. Please use Paper instead!");
geyserLogger.error("");
geyserLogger.error("*********************************************");
Bukkit.getPluginManager().disablePlugin(this);
return;
}
try {
// Check spigot config for BungeeCord mode
if (Bukkit.getServer().spigot().getConfig().getBoolean("settings.bungeecord")) {
warnInvalidProxySetups("BungeeCord");
return;
}
// Now: Check for velocity mode - deliberately after checking bungeecord because this is a paper only option
if (Bukkit.getServer().spigot().getPaperConfig().getBoolean("proxies.velocity.enabled")) {
warnInvalidProxySetups("Velocity");
return;
}
} catch (NoSuchMethodError e) {
// no-op
}
if (!loadConfig()) {
return;
}
@ -162,6 +175,11 @@ public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap {
@Override
public void onEnable() {
// Disabling the plugin in onLoad() is not supported; we need to manually stop here
if (geyser == null) {
return;
}
// Create command manager early so we can add Geyser extension commands
var sourceConverter = new CommandSourceConverter<>(
CommandSender.class,
@ -458,4 +476,13 @@ public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap {
return true;
}
private void warnInvalidProxySetups(String platform) {
geyserLogger.error("*********************************************");
geyserLogger.error("");
geyserLogger.error(GeyserLocale.getLocaleStringLog("geyser.bootstrap.unsupported_proxy_backend", platform));
geyserLogger.error(GeyserLocale.getLocaleStringLog("geyser.bootstrap.setup_guide", "https://geysermc.org/wiki/geyser/setup/"));
geyserLogger.error("");
geyserLogger.error("*********************************************");
}
}

View file

@ -113,6 +113,10 @@ public class GeyserVelocityPlugin implements GeyserBootstrap {
@Override
public void onGeyserEnable() {
// If e.g. the config failed to load, GeyserImpl was not loaded and we cannot start
if (geyser == null) {
return;
}
if (GeyserImpl.getInstance().isReloading()) {
if (!loadConfig()) {
return;

View file

@ -132,6 +132,10 @@ public class GeyserViaProxyPlugin extends ViaProxyPlugin implements GeyserBootst
@Override
public void onGeyserEnable() {
// If e.g. the config failed to load, GeyserImpl was not loaded and we cannot start
if (geyser == null) {
return;
}
boolean reloading = geyser.isReloading();
if (reloading) {
if (!this.loadConfig()) {
@ -155,6 +159,9 @@ public class GeyserViaProxyPlugin extends ViaProxyPlugin implements GeyserBootst
// Only initialize the ping passthrough if the protocol version is above beta 1.7.3, as that's when the status protocol was added
this.pingPassthrough = GeyserLegacyPingPassthrough.init(this.geyser);
}
if (this.config.getRemote().authType() == AuthType.FLOODGATE) {
ViaProxy.getConfig().setPassthroughBungeecordPlayerInfo(true);
}
}
@Override

View file

@ -2,4 +2,4 @@ name: "${name}-ViaProxy"
version: "${version}"
author: "${author}"
main: "org.geysermc.geyser.platform.viaproxy.GeyserViaProxyPlugin"
min-version: "3.2.1"
min-version: "3.3.2"

View file

@ -0,0 +1,45 @@
repositories {
// mavenLocal()
mavenCentral()
// Floodgate, Cumulus etc.
maven("https://repo.opencollab.dev/main")
// Paper, Velocity
maven("https://repo.papermc.io/repository/maven-public")
// Spigot
maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots") {
mavenContent { snapshotsOnly() }
}
// BungeeCord
maven("https://oss.sonatype.org/content/repositories/snapshots") {
mavenContent { snapshotsOnly() }
}
// NeoForge
maven("https://maven.neoforged.net/releases") {
mavenContent { releasesOnly() }
}
// Minecraft
maven("https://libraries.minecraft.net") {
name = "minecraft"
mavenContent { releasesOnly() }
}
// ViaVersion
maven("https://repo.viaversion.com") {
name = "viaversion"
}
// Jitpack for e.g. MCPL
maven("https://jitpack.io") {
content { includeGroupByRegex("com\\.github\\..*") }
}
// For Adventure snapshots
maven("https://s01.oss.sonatype.org/content/repositories/snapshots/")
}

View file

@ -5,6 +5,7 @@ import org.gradle.kotlin.dsl.dependencies
import org.gradle.kotlin.dsl.maven
plugins {
id("geyser.build-logic")
id("geyser.publish-conventions")
id("architectury-plugin")
id("dev.architectury.loom")
@ -116,12 +117,3 @@ dependencies {
minecraft(libs.minecraft)
mappings(loom.officialMojangMappings())
}
repositories {
// mavenLocal()
maven("https://repo.opencollab.dev/main")
maven("https://jitpack.io")
maven("https://oss.sonatype.org/content/repositories/snapshots/")
maven("https://s01.oss.sonatype.org/content/repositories/snapshots/")
maven("https://maven.neoforged.net/releases")
}

View file

@ -11,8 +11,8 @@ modrinth {
versionNumber.set(project.version as String + "-" + System.getenv("BUILD_NUMBER"))
versionType.set("beta")
changelog.set(System.getenv("CHANGELOG") ?: "")
gameVersions.add(libs.minecraft.get().version as String)
gameVersions.addAll("1.21", libs.minecraft.get().version as String)
failSilently.set(true)
syncBodyFrom.set(rootProject.file("README.md").readText())
}
}

View file

@ -157,12 +157,6 @@ public class GeyserImpl implements GeyserApi, EventRegistrar {
private final SessionManager sessionManager = new SessionManager();
/**
* This is used in GeyserConnect to stop the bedrock server binding to a port
*/
@Setter
private static boolean shouldStartListener = true;
private FloodgateCipher cipher;
private FloodgateSkinUploader skinUploader;
private NewsHandler newsHandler;
@ -436,24 +430,27 @@ public class GeyserImpl implements GeyserApi, EventRegistrar {
bedrockThreadCount = Math.max(1, SystemPropertyUtil.getInt("io.netty.eventLoopThreads", NettyRuntime.availableProcessors() * 2));
}
if (shouldStartListener) {
this.geyserServer = new GeyserServer(this, bedrockThreadCount);
this.geyserServer.bind(new InetSocketAddress(config.getBedrock().address(), config.getBedrock().port()))
.whenComplete((avoid, throwable) -> {
if (throwable == null) {
logger.info(GeyserLocale.getLocaleStringLog("geyser.core.start", config.getBedrock().address(),
String.valueOf(config.getBedrock().port())));
this.geyserServer = new GeyserServer(this, bedrockThreadCount);
this.geyserServer.bind(new InetSocketAddress(config.getBedrock().address(), config.getBedrock().port()))
.whenComplete((avoid, throwable) -> {
String address = config.getBedrock().address();
String port = String.valueOf(config.getBedrock().port()); // otherwise we get commas
if (throwable == null) {
if ("0.0.0.0".equals(address)) {
// basically just hide it in the log because some people get confused and try to change it
logger.info(GeyserLocale.getLocaleStringLog("geyser.core.start.ip_suppressed", port));
} else {
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(Component.text("Suggestion: try setting `address` under `bedrock` in the Geyser config back to 0.0.0.0", NamedTextColor.GREEN));
logger.info(Component.text("Then, restart this server.", NamedTextColor.GREEN));
}
logger.info(GeyserLocale.getLocaleStringLog("geyser.core.start", address, port));
}
}).join();
}
} else {
logger.severe(GeyserLocale.getLocaleStringLog("geyser.core.fail", address, port));
if (!"0.0.0.0".equals(address)) {
logger.info(Component.text("Suggestion: try setting `address` under `bedrock` in the Geyser config back to 0.0.0.0", NamedTextColor.GREEN));
logger.info(Component.text("Then, restart this server.", NamedTextColor.GREEN));
}
}
}).join();
if (config.getRemote().authType() == AuthType.FLOODGATE) {
try {

View file

@ -63,31 +63,31 @@ public class DumpCommand extends GeyserCommand {
this.geyser = geyser;
}
@Override
public void register(CommandManager<GeyserCommandSource> manager) {
manager.command(baseBuilder(manager)
.optional(ARGUMENTS, stringArrayParser(), SuggestionProvider.blockingStrings((ctx, input) -> {
// parse suggestions here
List<String> inputs = new ArrayList<>();
while (input.hasRemainingInput()) {
inputs.add(input.readStringSkipWhitespace());
}
@Override
public void register(CommandManager<GeyserCommandSource> manager) {
manager.command(baseBuilder(manager)
.optional(ARGUMENTS, stringArrayParser(), SuggestionProvider.blockingStrings((ctx, input) -> {
// parse suggestions here
List<String> inputs = new ArrayList<>();
while (input.hasRemainingInput()) {
inputs.add(input.readStringSkipWhitespace());
}
if (inputs.size() <= 2) {
return SUGGESTIONS; // only `geyser dump` was typed (2 literals)
}
if (inputs.size() <= 2) {
return SUGGESTIONS; // only `geyser dump` was typed (2 literals)
}
// the rest of the input after `geyser dump` is for this argument
inputs = inputs.subList(2, inputs.size());
// the rest of the input after `geyser dump` is for this argument
inputs = inputs.subList(2, inputs.size());
// don't suggest any words they have already typed
List<String> suggestions = new ArrayList<>();
SUGGESTIONS.forEach(suggestions::add);
suggestions.removeAll(inputs);
return suggestions;
}))
.handler(this::execute));
}
// don't suggest any words they have already typed
List<String> suggestions = new ArrayList<>();
SUGGESTIONS.forEach(suggestions::add);
suggestions.removeAll(inputs);
return suggestions;
}))
.handler(this::execute));
}
@Override
public void execute(CommandContext<GeyserCommandSource> context) {
@ -113,13 +113,15 @@ public class DumpCommand extends GeyserCommand {
source.sendMessage(GeyserLocale.getPlayerLocaleString("geyser.commands.dump.collecting", source.locale()));
String dumpData;
try {
DumpInfo dump = new DumpInfo(geyser, addLog);
if (offlineDump) {
DefaultPrettyPrinter prettyPrinter = new DefaultPrettyPrinter();
// Make arrays easier to read
prettyPrinter.indentArraysWith(new DefaultIndenter(" ", "\n"));
dumpData = MAPPER.writer(prettyPrinter).writeValueAsString(new DumpInfo(addLog));
dumpData = MAPPER.writer(prettyPrinter).writeValueAsString(dump);
} else {
dumpData = MAPPER.writeValueAsString(new DumpInfo(addLog));
dumpData = MAPPER.writeValueAsString(dump);
}
} catch (IOException e) {
source.sendMessage(ChatColor.RED + GeyserLocale.getPlayerLocaleString("geyser.commands.dump.collect_error", source.locale()));

View file

@ -81,7 +81,7 @@ public class DumpInfo {
private final FlagsInfo flagsInfo;
private final List<ExtensionInfo> extensionInfo;
public DumpInfo(boolean addLog) {
public DumpInfo(GeyserImpl geyser, boolean addLog) {
this.versionInfo = new VersionInfo();
this.cpuCount = Runtime.getRuntime().availableProcessors();
@ -91,7 +91,7 @@ public class DumpInfo {
this.gitInfo = new GitInfo(GeyserImpl.BUILD_NUMBER, GeyserImpl.COMMIT.substring(0, 7), GeyserImpl.COMMIT, GeyserImpl.BRANCH, GeyserImpl.REPOSITORY);
this.config = GeyserImpl.getInstance().getConfig();
this.config = geyser.getConfig();
this.floodgate = new Floodgate();
String md5Hash = "unknown";
@ -107,7 +107,7 @@ public class DumpInfo {
//noinspection UnstableApiUsage
sha256Hash = byteSource.hash(Hashing.sha256()).toString();
} catch (Exception e) {
if (GeyserImpl.getInstance().getConfig().isDebugMode()) {
if (this.config.isDebugMode()) {
e.printStackTrace();
}
}
@ -116,18 +116,22 @@ public class DumpInfo {
this.ramInfo = new RamInfo();
if (addLog) {
this.logsInfo = new LogsInfo();
this.logsInfo = new LogsInfo(geyser);
}
this.userPlatforms = new Object2IntOpenHashMap<>();
for (GeyserSession session : GeyserImpl.getInstance().getSessionManager().getAllSessions()) {
for (GeyserSession session : geyser.getSessionManager().getAllSessions()) {
DeviceOs device = session.getClientData().getDeviceOs();
userPlatforms.put(device, userPlatforms.getOrDefault(device, 0) + 1);
}
this.connectionAttempts = GeyserImpl.getInstance().getGeyserServer().getConnectionAttempts();
if (geyser.getGeyserServer() != null) {
this.connectionAttempts = geyser.getGeyserServer().getConnectionAttempts();
} else {
this.connectionAttempts = 0; // Fallback if Geyser failed to fully startup
}
this.bootstrapInfo = GeyserImpl.getInstance().getBootstrap().getDumpInfo();
this.bootstrapInfo = geyser.getBootstrap().getDumpInfo();
this.flagsInfo = new FlagsInfo();
@ -244,10 +248,10 @@ public class DumpInfo {
public static class LogsInfo {
private String link;
public LogsInfo() {
public LogsInfo(GeyserImpl geyser) {
try {
Map<String, String> fields = new HashMap<>();
fields.put("content", FileUtils.readAllLines(GeyserImpl.getInstance().getBootstrap().getLogsPath()).collect(Collectors.joining("\n")));
fields.put("content", FileUtils.readAllLines(geyser.getBootstrap().getLogsPath()).collect(Collectors.joining("\n")));
JsonNode logData = GeyserImpl.JSON_MAPPER.readTree(WebUtils.postForm("https://api.mclo.gs/1/log", fields));

View file

@ -150,7 +150,7 @@ public class GeyserLocale {
} else {
if (!validLocalLanguage) {
// Don't warn on missing locales if a local file has been found
bootstrap.getGeyserLogger().warning("Missing locale: " + locale);
bootstrap.getGeyserLogger().debug("Missing locale: " + locale);
}
}

View file

@ -76,6 +76,9 @@ public class JavaCommandsTranslator extends PacketTranslator<ClientboundCommands
@Override
public int hashCode(BedrockCommandInfo o) {
int paramHash = Arrays.deepHashCode(o.paramData());
if ("help".equals(o.name())) {
paramHash = 31 * paramHash + 1;
}
return 31 * paramHash + o.description().hashCode();
}
@ -83,6 +86,11 @@ public class JavaCommandsTranslator extends PacketTranslator<ClientboundCommands
public boolean equals(BedrockCommandInfo a, BedrockCommandInfo b) {
if (a == b) return true;
if (a == null || b == null) return false;
if ("help".equals(a.name()) && !"help".equals(b.name())) {
// Merging this causes Bedrock to fallback to its own help command
// https://github.com/GeyserMC/Geyser/issues/2573
return false;
}
if (!a.description().equals(b.description())) return false;
if (a.paramData().length != b.paramData().length) return false;
for (int i = 0; i < a.paramData().length; i++) {

@ -1 +1 @@
Subproject commit 60b20023a92f084aba895ab0336e70fa7fb311fb
Subproject commit 7499daf712ad6de70a07fba471b51b4ad92315c5

View file

@ -12,7 +12,7 @@ gson = "2.3.1" # Provided by Spigot 1.8.8
websocket = "1.5.1"
protocol = "3.0.0.Beta2-20240704.153116-14"
raknet = "1.0.0.CR3-20240416.144209-1"
minecraftauth = "4.1.0"
minecraftauth = "4.1.1-20240806.235051-7"
mcprotocollib = "1.21-20240725.013034-16"
adventure = "4.14.0"
adventure-platform = "4.3.0"
@ -30,13 +30,13 @@ cloud-minecraft-modded = "2.0.0-beta.7"
commodore = "2.2"
bungeecord = "a7c6ede"
velocity = "3.3.0-SNAPSHOT"
viaproxy = "3.2.1"
viaproxy = "3.3.2-SNAPSHOT"
fabric-loader = "0.15.11"
fabric-api = "0.100.1+1.21"
neoforge-minecraft = "21.0.0-beta"
neoforge-minecraft = "21.1.1"
mixin = "0.8.5"
mixinextras = "0.3.5"
minecraft = "1.21"
minecraft = "1.21.1"
# plugin versions
indra = "3.1.3"

View file

@ -2,52 +2,6 @@
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
dependencyResolutionManagement {
repositories {
// mavenLocal()
// Floodgate, Cumulus etc.
maven("https://repo.opencollab.dev/main")
// Paper, Velocity
maven("https://repo.papermc.io/repository/maven-public")
// Spigot
maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots") {
mavenContent { snapshotsOnly() }
}
// BungeeCord
maven("https://oss.sonatype.org/content/repositories/snapshots") {
mavenContent { snapshotsOnly() }
}
// NeoForge
maven("https://maven.neoforged.net/releases") {
mavenContent { releasesOnly() }
}
// Minecraft
maven("https://libraries.minecraft.net") {
name = "minecraft"
mavenContent { releasesOnly() }
}
mavenCentral()
// ViaVersion
maven("https://repo.viaversion.com") {
name = "viaversion"
}
maven("https://jitpack.io") {
content { includeGroupByRegex("com\\.github\\..*") }
}
// For Adventure snapshots
maven("https://s01.oss.sonatype.org/content/repositories/snapshots/")
}
}
pluginManagement {
repositories {
gradlePluginPortal()