1
0
mirror of https://github.com/GeyserMC/Floodgate.git synced 2025-12-19 14:59:20 +00:00

Update cloud to 2.0, update to Floodgate 2.2.3, support 1.20.5 (#115)

* Update for floodgate 2.2.2-SNAPSHOT

* Fix spacing on //no-op comment

* Add jitpack repo and target floodgat-master

* update gradle, loom, shade + relocate old version of cloud

* exclude meta-inf too

* - Update to Floodgate 2.2.3
- Update bstats properly to fix shutdown bug
- Move to kts build/settings file
- Fix command permission issues
- Update to cloud 2.0

* prepare for 1.20.5

* 1.20.5.. i dislike this

* also register channels to send packets

* update cloud, use jitpack to pull in floodgate

* some minor stuff

* proper permissions check

* update dependencies, finally

* update modrinth version

---------

Co-authored-by: Konicai <71294714+Konicai@users.noreply.github.com>
This commit is contained in:
chris
2024-04-28 23:57:07 +02:00
committed by GitHub
parent 046311de09
commit f05ed8cd2f
22 changed files with 382 additions and 263 deletions

View File

@@ -1,166 +0,0 @@
import net.fabricmc.loom.task.RemapJarTask
plugins {
id 'com.github.johnrengelman.shadow' version '7.0.0'
id 'fabric-loom' version '1.0-SNAPSHOT'
id 'java'
id 'maven-publish'
id "com.modrinth.minotaur" version "2.+"
}
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
archivesBaseName = project.archives_base_name
version = project.mod_version
group = project.maven_group
loom {
accessWidenerPath = file("src/main/resources/floodgate.accesswidener")
}
dependencies {
//to change the versions see the gradle.properties file
minecraft "com.mojang:minecraft:${project.minecraft_version}"
mappings loom.officialMojangMappings()
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
// Fabric API. This is technically optional, but you probably want it anyway.
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
// PSA: Some older mods, compiled on Loom 0.2.1, might have outdated Maven POMs.
// You may need to force-disable transitiveness on them.
// Base Floodgate
implementation("org.geysermc.floodgate:core:${project.mod_version}")
shadow("org.geysermc.floodgate:core:${project.mod_version}") {
exclude group: "cloud.commandframework", module: "*" // Cloud is included jar-in-jar
exclude group: "org.geysermc.floodgate", module: "api"
exclude group: 'com.google.guava', module: "guava"
exclude group: 'com.google.code.gson', module: "gson"
exclude group: 'org.slf4j', module: "slf4j-api"
exclude group: 'it.unimi.dsi.fastutil', module: "*"
}
shadow(implementation("org.geysermc.floodgate:api:${project.mod_version}")) {
exclude group: 'com.google.guava', module: "guava"
exclude group: 'com.google.code.gson', module: "gson"
exclude group: "org.ow2.asm", module: "*" // From Events lib
}
include(modImplementation('cloud.commandframework:cloud-fabric:1.8.4') {
because "Commands library implementation for Fabric"
})
// Lombok
compileOnly "org.projectlombok:lombok:${project.lombok_version}"
annotationProcessor "org.projectlombok:lombok:${project.lombok_version}"
}
repositories {
//mavenLocal()
maven {
url = 'https://oss.sonatype.org/content/repositories/snapshots'
}
// Standard OpenCollab repositories
maven {
name = 'opencollab-release-repo'
url = 'https://repo.opencollab.dev/maven-releases/'
//TODO set as releases
}
maven {
name = 'opencollab-snapshot-repo'
url = 'https://repo.opencollab.dev/maven-snapshots/'
}
}
processResources {
inputs.property "version", project.version
filesMatching("fabric.mod.json") {
expand "version": project.version
}
}
// ensure that the encoding is set to UTF-8, no matter what the system default is
// this fixes some edge cases with special characters not displaying correctly
// see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
java {
// Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
// if it is present.
// If you remove this line, sources will not be generated.
withSourcesJar()
}
shadowJar {
configurations = [project.configurations.shadow]
// TODO this is temporary until Floodgate's dev branch is merged
relocate("com.google.inject", "org.geysermc.floodgate.shadow.guice")
relocate("org.yaml.snakeyaml", "org.geysermc.floodgate.shadow.snakeyaml") //relocate snakeyaml to avoid conflicts with other mods
exclude([
'cloud/**',
'com/google/common/**', 'com/google/errorprone/**', 'com/google/gson/**', 'com/google/j2objc/**', 'com/google/thirdparty/**',
'it/unimi/**',
'org/slf4j/**'
])
}
task remappedShadowJar(type: RemapJarTask) {
dependsOn tasks.shadowJar
input = tasks.shadowJar.archiveFile
addNestedDependencies = true
archiveName = "floodgate-fabric.jar"
}
task remappedModrinthJar(type: RemapJarTask) {
dependsOn tasks.shadowJar
input = tasks.shadowJar.archiveFile
addNestedDependencies = true
version = "${project.mod_version}+build.${System.getenv("GITHUB_RUN_NUMBER")}"
}
tasks.assemble.dependsOn tasks.remappedShadowJar
artifacts {
archives remappedShadowJar
shadow shadowJar
}
// configure the maven publication
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
}
}
// select the repositories you want to publish to
repositories {
mavenLocal()
}
}
tasks.modrinth.dependsOn tasks.remappedModrinthJar
modrinth {
token = System.getenv('MODRINTH_TOKEN') // Prevent GitHub Actions from caching empty Modrinth token
projectId = "bWrNNfkb"
versionNumber = project.version as String + "-" + System.getenv("GITHUB_RUN_NUMBER")
versionType = "beta"
changelog = "A changelog can be found at https://github.com/GeyserMC/Floodgate-Fabric/commits"
syncBodyFrom = rootProject.file("README.md").text
uploadFile = tasks.getByPath("remappedModrinthJar")
gameVersions.addAll("1.20.2", "1.20.4")
loaders = ["fabric"]
dependencies {
required.project "fabric-api"
}
}

144
build.gradle.kts Normal file
View File

@@ -0,0 +1,144 @@
import net.fabricmc.loom.task.RemapJarTask
plugins {
id("com.github.johnrengelman.shadow") version "8.1.1"
id("fabric-loom") version "1.6-SNAPSHOT"
id("java")
id("maven-publish")
id("com.modrinth.minotaur") version "2.+"
}
loom {
accessWidenerPath = file("src/main/resources/floodgate.accesswidener")
}
dependencies {
//to change the versions see the gradle.properties file
minecraft("com.mojang:minecraft:1.20.5")
mappings(loom.officialMojangMappings())
modImplementation("net.fabricmc:fabric-loader:0.15.10")
// Fabric API. This is technically optional, but you probably want it anyway.
modImplementation("net.fabricmc.fabric-api:fabric-api:0.97.6+1.20.5")
// Base Floodgate
implementation("org.geysermc.floodgate:core:2.2.3-SNAPSHOT")
shadow("org.geysermc.floodgate:core:2.2.3-SNAPSHOT") { isTransitive = false }
shadow("org.geysermc.floodgate:api:2.2.3-SNAPSHOT") { isTransitive = false }
// Requires relocation
shadow("org.bstats:bstats-base:3.0.2")
// Shadow & relocate these since the (indirectly) depend on quite old dependencies
shadow("com.google.inject:guice:6.0.0") { isTransitive = false }
shadow("org.geysermc.configutils:configutils:1.0-SNAPSHOT") {
exclude("org.checkerframework")
exclude("com.google.errorprone")
exclude("com.github.spotbugs")
exclude("com.nukkitx.fastutil")
}
include("aopalliance:aopalliance:1.0")
include("javax.inject:javax.inject:1")
include("jakarta.inject:jakarta.inject-api:2.0.1")
include("org.java-websocket:Java-WebSocket:1.5.2")
// Just like Geyser, include these
include("org.geysermc.geyser", "common", "2.2.3-SNAPSHOT")
include("org.geysermc.cumulus", "cumulus", "1.1.2")
include("org.geysermc.event", "events", "1.1-SNAPSHOT")
include("org.lanternpowered", "lmbda", "2.0.0") // used in events
// cloud
include("org.incendo:cloud-fabric:2.0.0-SNAPSHOT")
modImplementation("org.incendo:cloud-fabric:2.0.0-SNAPSHOT")
// Lombok
compileOnly("org.projectlombok:lombok:1.18.32")
annotationProcessor("org.projectlombok:lombok:1.18.32")
}
repositories {
//mavenLocal()
mavenCentral()
maven("https://maven.fabricmc.net/")
maven("https://repo.opencollab.dev/main/")
maven("https://jitpack.io") {
content {
includeGroupByRegex("com.github.*")
}
}
maven("https://oss.sonatype.org/content/repositories/snapshots/")
maven("https://s01.oss.sonatype.org/content/repositories/snapshots/")
}
java {
withSourcesJar()
}
tasks {
shadowJar {
configurations = listOf(project.configurations.shadow.get())
relocate("org.bstats", "org.geysermc.floodgate.shadow.bstats")
relocate("com.google.inject", "org.geysermc.floodgate.shadow.google.inject")
relocate("org.yaml", "org.geysermc.floodgate.shadow.org.yaml")
}
processResources {
filesMatching("fabric.mod.json") {
expand("version" to project.version)
}
}
remapJar {
dependsOn(shadowJar)
mustRunAfter(shadowJar)
inputFile.set(shadowJar.get().archiveFile)
addNestedDependencies = true // todo?
archiveFileName.set("floodgate-fabric.jar")
}
register("remapModrinthJar", RemapJarTask::class) {
dependsOn(shadowJar)
inputFile.set(remapJar.get().archiveFile)
addNestedDependencies = true
archiveVersion.set(project.version.toString() + "+build." + System.getenv("GITHUB_RUN_NUMBER"))
archiveClassifier.set("")
}
}
publishing {
publications {
register("publish", MavenPublication::class) {
from(project.components["java"])
// skip shadow jar from publishing. Workaround for https://github.com/johnrengelman/shadow/issues/651
val javaComponent = project.components["java"] as AdhocComponentWithVariants
javaComponent.withVariantsFromConfiguration(configurations["shadowRuntimeElements"]) { skip() }
}
}
repositories {
mavenLocal()
}
}
modrinth {
token.set(System.getenv("MODRINTH_TOKEN")) // Prevent GitHub Actions from caching empty Modrinth token
projectId.set("bWrNNfkb")
versionNumber.set(project.version as String + "-" + System.getenv("GITHUB_RUN_NUMBER"))
versionType.set("beta")
changelog.set("A changelog can be found at https://github.com/GeyserMC/Floodgate-Fabric/commits")
syncBodyFrom.set(rootProject.file("README.md").readText())
uploadFile.set(tasks.named("remapModrinthJar"))
gameVersions.addAll("1.20.5")
loaders.add("fabric")
dependencies {
required.project("fabric-api")
}
}

View File

@@ -1,15 +1,6 @@
# Done to increase the memory available to gradle.
org.gradle.jvmargs=-Xmx2G
# Fabric Properties
# check these on https://modmuss50.me/fabric.html
minecraft_version=1.20.4
loader_version=0.15.2
# Mod Properties
mod_version=2.2.0-SNAPSHOT
maven_group=org.geysermc.floodgate
version=2.2.3-SNAPSHOT
group=org.geysermc.floodgate
archives_base_name=floodgate-fabric
# Dependencies
# check this on https://modmuss50.me/fabric.html
fabric_version=0.91.2+1.20.4
# Our stuff
lombok_version=1.18.20

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

10
gradlew vendored
View File

@@ -1,7 +1,7 @@
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
# Copyright <EFBFBD> 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -32,10 +32,10 @@
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
# * expansions <EFBFBD>$var<EFBFBD>, <EFBFBD>${var}<EFBFBD>, <EFBFBD>${var:-default}<EFBFBD>, <EFBFBD>${var+SET}<EFBFBD>,
# <EFBFBD>${var#prefix}<EFBFBD>, <EFBFBD>${var%suffix}<EFBFBD>, and <EFBFBD>$( cmd )<EFBFBD>;
# * compound commands having a testable exit status, especially <EFBFBD>case<EFBFBD>;
# * various built-in commands including <EFBFBD>command<EFBFBD>, <EFBFBD>set<EFBFBD>, and <EFBFBD>ulimit<EFBFBD>.
#
# Important for patching:
#

View File

@@ -1,10 +0,0 @@
pluginManagement {
repositories {
jcenter()
maven {
name = 'Fabric'
url = 'https://maven.fabricmc.net/'
}
gradlePluginPortal()
}
}

8
settings.gradle.kts Normal file
View File

@@ -0,0 +1,8 @@
pluginManagement {
repositories {
//mavenLocal()
mavenCentral()
gradlePluginPortal()
maven("https://maven.fabricmc.net/")
}
}

View File

@@ -19,7 +19,7 @@ public class FabricMod implements ModInitializer {
new FabricPlatformModule()
);
FabricPlatform platform = injector.getInstance(FabricPlatform.class);
FloodgatePlatform platform = injector.getInstance(FloodgatePlatform.class);
platform.enable(new FabricCommandModule());

View File

@@ -1,14 +0,0 @@
package org.geysermc.floodgate;
import com.google.inject.Inject;
import com.google.inject.Injector;
import org.geysermc.floodgate.api.FloodgateApi;
import org.geysermc.floodgate.api.inject.PlatformInjector;
import org.geysermc.floodgate.api.logger.FloodgateLogger;
public final class FabricPlatform extends FloodgatePlatform {
@Inject
public FabricPlatform(FloodgateApi api, PlatformInjector platformInjector, FloodgateLogger logger, Injector guice) {
super(api, platformInjector, logger, guice);
}
}

View File

@@ -3,6 +3,7 @@ package org.geysermc.floodgate.inject.fabric;
import io.netty.channel.*;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.floodgate.inject.CommonPlatformInjector;
@RequiredArgsConstructor
@@ -12,23 +13,23 @@ public final class FabricInjector extends CommonPlatformInjector {
@Getter private final boolean injected = true;
@Override
public boolean inject() throws Exception {
return true;
public void inject() throws Exception {
//no-op
}
public void injectClient(ChannelFuture future) {
future.channel().pipeline().addFirst("floodgate-init", new ChannelInboundHandlerAdapter() {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
public void channelRead(@NonNull ChannelHandlerContext ctx, @NonNull Object msg) throws Exception {
super.channelRead(ctx, msg);
if (!(msg instanceof Channel channel)) {
return;
}
channel.pipeline().addLast(new ChannelInitializer<Channel>() {
channel.pipeline().addLast(new ChannelInitializer<>() {
@Override
protected void initChannel(Channel channel) {
protected void initChannel(@NonNull Channel channel) {
injectAddonsCall(channel, false);
addInjectedClient(channel);
channel.closeFuture().addListener(listener -> {
@@ -42,8 +43,8 @@ public final class FabricInjector extends CommonPlatformInjector {
}
@Override
public boolean removeInjection() throws Exception {
return true;
public void removeInjection() throws Exception {
//no-op
}
public static FabricInjector getInstance() {

View File

@@ -1,18 +1,31 @@
package org.geysermc.floodgate.logger;
import lombok.RequiredArgsConstructor;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.inject.name.Named;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.Configurator;
import org.geysermc.floodgate.api.logger.FloodgateLogger;
import org.geysermc.floodgate.config.FloodgateConfig;
import org.geysermc.floodgate.util.LanguageManager;
import static org.geysermc.floodgate.util.MessageFormatter.format;
@RequiredArgsConstructor
@Singleton
public final class Log4jFloodgateLogger implements FloodgateLogger {
private final Logger logger;
private final LanguageManager languageManager;
@Inject
@Named("logger")
private Logger logger;
private LanguageManager languageManager;
@Inject
private void init(LanguageManager languageManager, FloodgateConfig config) {
this.languageManager = languageManager;
if (config.isDebug() && !logger.isDebugEnabled()) {
Configurator.setLevel(logger.getName(), Level.DEBUG);
}
}
@Override
public void error(String message, Object... args) {
@@ -49,20 +62,6 @@ public final class Log4jFloodgateLogger implements FloodgateLogger {
logger.trace(message, args);
}
@Override
public void enableDebug() {
if (!logger.isDebugEnabled()) {
Configurator.setLevel(logger.getName(), Level.DEBUG);
}
}
@Override
public void disableDebug() {
if (logger.isDebugEnabled()) {
Configurator.setLevel(logger.getName(), Level.INFO);
}
}
@Override
public boolean isDebug() {
return logger.isDebugEnabled();

View File

@@ -1,9 +1,5 @@
package org.geysermc.floodgate.module;
import cloud.commandframework.CommandManager;
import cloud.commandframework.execution.CommandExecutionCoordinator;
import cloud.commandframework.fabric.FabricCommandManager;
import cloud.commandframework.fabric.FabricServerCommandManager;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import lombok.SneakyThrows;
@@ -11,6 +7,11 @@ import net.minecraft.commands.CommandSourceStack;
import org.geysermc.floodgate.platform.command.CommandUtil;
import org.geysermc.floodgate.player.FloodgateCommandPreprocessor;
import org.geysermc.floodgate.player.UserAudience;
import org.geysermc.floodgate.player.audience.FloodgateSenderMapper;
import org.incendo.cloud.CommandManager;
import org.incendo.cloud.execution.ExecutionCoordinator;
import org.incendo.cloud.fabric.FabricCommandManager;
import org.incendo.cloud.fabric.FabricServerCommandManager;
public final class FabricCommandModule extends CommandModule {
@Provides
@@ -18,9 +19,8 @@ public final class FabricCommandModule extends CommandModule {
@SneakyThrows
public CommandManager<UserAudience> commandManager(CommandUtil commandUtil) {
FabricCommandManager<UserAudience, CommandSourceStack> commandManager = new FabricServerCommandManager<>(
CommandExecutionCoordinator.simpleCoordinator(),
commandUtil::getUserAudience,
audience -> (CommandSourceStack) audience.source()
ExecutionCoordinator.simpleCoordinator(),
new FloodgateSenderMapper<>(commandUtil)
);
commandManager.registerCommandPreProcessor(new FloodgateCommandPreprocessor<>(commandUtil));
return commandManager;

View File

@@ -1,5 +1,7 @@
package org.geysermc.floodgate.module;
import com.google.inject.name.Names;
import org.apache.logging.log4j.Logger;
import org.geysermc.floodgate.inject.fabric.FabricInjector;
import org.geysermc.floodgate.listener.FabricEventListener;
import org.geysermc.floodgate.listener.FabricEventRegistration;
@@ -32,12 +34,8 @@ public final class FabricPlatformModule extends AbstractModule {
@Override
protected void configure() {
bind(PlatformUtils.class).to(FabricPlatformUtils.class);
}
@Provides
@Singleton
public FloodgateLogger floodgateLogger(LanguageManager languageManager) {
return new Log4jFloodgateLogger(LogManager.getLogger("floodgate"), languageManager);
bind(Logger.class).annotatedWith(Names.named("logger")).toInstance(LogManager.getLogger("floodgate"));
bind(FloodgateLogger.class).to(Log4jFloodgateLogger.class);
}
@Provides

View File

@@ -1,16 +1,53 @@
package org.geysermc.floodgate.pluginmessage;
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.minecraft.resources.ResourceLocation;
import org.geysermc.floodgate.pluginmessage.payloads.FormPayload;
import org.geysermc.floodgate.pluginmessage.payloads.PacketPayload;
import org.geysermc.floodgate.pluginmessage.payloads.SkinPayload;
import org.geysermc.floodgate.pluginmessage.payloads.TransferPayload;
public class FabricPluginMessageRegistration implements PluginMessageRegistration {
@Override
public void register(PluginMessageChannel channel) {
ServerPlayNetworking.registerGlobalReceiver(new ResourceLocation(channel.getIdentifier()),
(server, player, handler, buf, responseSender) -> {
byte[] bytes = new byte[buf.readableBytes()];
buf.readBytes(bytes);
channel.handleServerCall(bytes, player.getUUID(), player.getGameProfile().getName());
});
switch (channel.getIdentifier()) {
case "floodgate:form" -> {
PayloadTypeRegistry.playC2S().register(FormPayload.TYPE, FormPayload.STREAM_CODEC);
PayloadTypeRegistry.playS2C().register(FormPayload.TYPE, FormPayload.STREAM_CODEC);
ServerPlayNetworking.registerGlobalReceiver(FormPayload.TYPE,
((payload, context) -> channel.handleServerCall(
payload.data(),
context.player().getUUID(),
context.player().getGameProfile().getName())));
}
case "floodgate:packet" -> {
PayloadTypeRegistry.playC2S().register(PacketPayload.TYPE, PacketPayload.STREAM_CODEC);
PayloadTypeRegistry.playS2C().register(PacketPayload.TYPE, PacketPayload.STREAM_CODEC);
ServerPlayNetworking.registerGlobalReceiver(PacketPayload.TYPE,
((payload, context) -> channel.handleServerCall(
payload.data(),
context.player().getUUID(),
context.player().getGameProfile().getName())));
}
case "floodgate:skin" -> {
PayloadTypeRegistry.playC2S().register(SkinPayload.TYPE, SkinPayload.STREAM_CODEC);
PayloadTypeRegistry.playS2C().register(SkinPayload.TYPE, SkinPayload.STREAM_CODEC);
ServerPlayNetworking.registerGlobalReceiver(SkinPayload.TYPE,
((payload, context) -> channel.handleServerCall(
payload.data(),
context.player().getUUID(),
context.player().getGameProfile().getName())));
}
case "floodgate:transfer" -> {
PayloadTypeRegistry.playC2S().register(TransferPayload.TYPE, TransferPayload.STREAM_CODEC);
PayloadTypeRegistry.playS2C().register(TransferPayload.TYPE, TransferPayload.STREAM_CODEC);
ServerPlayNetworking.registerGlobalReceiver(TransferPayload.TYPE,
((payload, context) -> channel.handleServerCall(
payload.data(),
context.player().getUUID(),
context.player().getGameProfile().getName())));
}
default -> throw new IllegalArgumentException("unknown channel: " + channel);
}
}
}

View File

@@ -1,13 +1,23 @@
package org.geysermc.floodgate.pluginmessage;
import io.netty.buffer.Unpooled;
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer;
import org.geysermc.floodgate.MinecraftServerHolder;
import org.geysermc.floodgate.api.FloodgateApi;
import org.geysermc.floodgate.api.InstanceHolder;
import org.geysermc.floodgate.platform.pluginmessage.PluginMessageUtils;
import org.geysermc.floodgate.pluginmessage.payloads.FormPayload;
import org.geysermc.floodgate.pluginmessage.payloads.PacketPayload;
import org.geysermc.floodgate.pluginmessage.payloads.SkinPayload;
import org.geysermc.floodgate.pluginmessage.payloads.TransferPayload;
import java.util.Objects;
import java.util.UUID;
public class FabricPluginMessageUtils extends PluginMessageUtils {
@@ -16,9 +26,17 @@ public class FabricPluginMessageUtils extends PluginMessageUtils {
public boolean sendMessage(UUID uuid, String channel, byte[] data) {
try {
ServerPlayer player = MinecraftServerHolder.get().getPlayerList().getPlayer(uuid);
ResourceLocation resource = new ResourceLocation(channel); // automatically splits over the :
FriendlyByteBuf dataBuffer = new FriendlyByteBuf(Unpooled.wrappedBuffer(data));
ServerPlayNetworking.send(player, resource, dataBuffer);
final CustomPacketPayload payload;
switch (channel) {
case "floodgate:form" -> payload = new FormPayload(data);
case "floodgate:packet" -> payload = new PacketPayload(data);
case "floodgate:skin" -> payload = new SkinPayload(data);
case "floodgate:transfer" -> payload = new TransferPayload(data);
default -> throw new IllegalArgumentException("unknown channel: " + channel);
}
Objects.requireNonNull(player);
ServerPlayNetworking.send(player, payload);
} catch (Exception e) {
e.printStackTrace();
return false;

View File

@@ -7,18 +7,20 @@ import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket;
import net.minecraft.server.level.ChunkMap;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.floodgate.MinecraftServerHolder;
import org.geysermc.floodgate.api.player.FloodgatePlayer;
import org.geysermc.floodgate.mixin.ChunkMapMixin;
import org.geysermc.floodgate.skin.SkinApplier;
import org.geysermc.floodgate.skin.SkinData;
import static org.geysermc.floodgate.api.event.skin.SkinApplyEvent.SkinData;
import java.util.Collections;
public final class FabricSkinApplier implements SkinApplier {
@Override
public void applySkin(FloodgatePlayer floodgatePlayer, SkinData skinData) {
public void applySkin(@NonNull FloodgatePlayer floodgatePlayer, @NonNull SkinData skinData) {
MinecraftServerHolder.get().execute(() -> {
ServerPlayer bedrockPlayer = MinecraftServerHolder.get().getPlayerList()
.getPlayer(floodgatePlayer.getCorrectUniqueId());
@@ -31,7 +33,7 @@ public final class FabricSkinApplier implements SkinApplier {
PropertyMap properties = bedrockPlayer.getGameProfile().getProperties();
properties.removeAll("textures");
properties.put("textures", new Property("textures", skinData.getValue(), skinData.getSignature()));
properties.put("textures", new Property("textures", skinData.value(), skinData.signature()));
ChunkMap tracker = ((ServerLevel) bedrockPlayer.level).getChunkSource().chunkMap;
ChunkMap.TrackedEntity entry = ((ChunkMapMixin) tracker).getEntityMap().get(bedrockPlayer.getId());

View File

@@ -0,0 +1,27 @@
package org.geysermc.floodgate.pluginmessage.payloads;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import org.checkerframework.checker.nullness.qual.NonNull;
public record FormPayload(byte[] data) implements CustomPacketPayload {
public static final StreamCodec<FriendlyByteBuf, FormPayload> STREAM_CODEC = CustomPacketPayload.codec(FormPayload::write, FormPayload::new);
public static final CustomPacketPayload.Type<FormPayload> TYPE = CustomPacketPayload.createType("floodgate:form");
private FormPayload(FriendlyByteBuf friendlyByteBuf) {
this(friendlyByteBuf.readByteArray());
}
private void write(FriendlyByteBuf friendlyByteBuf) {
friendlyByteBuf.writeByteArray(this.data);
}
public CustomPacketPayload.@NonNull Type<FormPayload> type() {
return TYPE;
}
public byte[] data() {
return this.data;
}
}

View File

@@ -0,0 +1,27 @@
package org.geysermc.floodgate.pluginmessage.payloads;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import org.checkerframework.checker.nullness.qual.NonNull;
public record PacketPayload(byte[] data) implements CustomPacketPayload {
public static final StreamCodec<FriendlyByteBuf, PacketPayload> STREAM_CODEC = CustomPacketPayload.codec(PacketPayload::write, PacketPayload::new);
public static final CustomPacketPayload.Type<PacketPayload> TYPE = CustomPacketPayload.createType("floodgate:packet");
private PacketPayload(FriendlyByteBuf friendlyByteBuf) {
this(friendlyByteBuf.readByteArray());
}
private void write(FriendlyByteBuf friendlyByteBuf) {
friendlyByteBuf.writeByteArray(this.data);
}
public CustomPacketPayload.@NonNull Type<PacketPayload> type() {
return TYPE;
}
public byte[] data() {
return this.data;
}
}

View File

@@ -0,0 +1,27 @@
package org.geysermc.floodgate.pluginmessage.payloads;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import org.checkerframework.checker.nullness.qual.NonNull;
public record SkinPayload(byte[] data) implements CustomPacketPayload {
public static final StreamCodec<FriendlyByteBuf, SkinPayload> STREAM_CODEC = CustomPacketPayload.codec(SkinPayload::write, SkinPayload::new);
public static final CustomPacketPayload.Type<SkinPayload> TYPE = CustomPacketPayload.createType("floodgate:skin");
private SkinPayload(FriendlyByteBuf friendlyByteBuf) {
this(friendlyByteBuf.readByteArray());
}
private void write(FriendlyByteBuf friendlyByteBuf) {
friendlyByteBuf.writeByteArray(this.data);
}
public CustomPacketPayload.@NonNull Type<SkinPayload> type() {
return TYPE;
}
public byte[] data() {
return this.data;
}
}

View File

@@ -0,0 +1,27 @@
package org.geysermc.floodgate.pluginmessage.payloads;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import org.checkerframework.checker.nullness.qual.NonNull;
public record TransferPayload(byte[] data) implements CustomPacketPayload {
public static final StreamCodec<FriendlyByteBuf, TransferPayload> STREAM_CODEC = CustomPacketPayload.codec(TransferPayload::write, TransferPayload::new);
public static final CustomPacketPayload.Type<TransferPayload> TYPE = CustomPacketPayload.createType("floodgate:transfer");
private TransferPayload(FriendlyByteBuf friendlyByteBuf) {
this(friendlyByteBuf.readByteArray());
}
private void write(FriendlyByteBuf friendlyByteBuf) {
friendlyByteBuf.writeByteArray(this.data);
}
public CustomPacketPayload.@NonNull Type<TransferPayload> type() {
return TYPE;
}
public byte[] data() {
return this.data;
}
}

View File

@@ -2,6 +2,7 @@ package org.geysermc.floodgate.util;
import com.mojang.authlib.GameProfile;
import me.lucko.fabric.api.permissions.v0.Permissions;
import net.minecraft.commands.CommandSource;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.SharedSuggestionProvider;
import net.minecraft.network.chat.Component;
@@ -15,6 +16,7 @@ import org.geysermc.floodgate.platform.command.CommandUtil;
import org.geysermc.floodgate.player.UserAudience;
import java.util.*;
import java.util.logging.Logger;
public final class FabricCommandUtil extends CommandUtil {
private final FloodgateLogger logger;
@@ -26,7 +28,7 @@ public final class FabricCommandUtil extends CommandUtil {
}
@Override
public UserAudience getUserAudience(final @NonNull Object sourceObj) {
public @NonNull UserAudience getUserAudience(final @NonNull Object sourceObj) {
if (!(sourceObj instanceof CommandSourceStack stack)) {
throw new IllegalArgumentException();
}
@@ -71,7 +73,8 @@ public final class FabricCommandUtil extends CommandUtil {
@Override
public boolean hasPermission(Object source, String permission) {
return Permissions.check((SharedSuggestionProvider) source, permission);
return Permissions.check((SharedSuggestionProvider) source,
permission, MinecraftServerHolder.get().getOperatorUserPermissionLevel());
}
@Override

View File

@@ -24,8 +24,8 @@
"floodgate.mixins.json"
],
"depends": {
"fabricloader": ">=0.14.22",
"fabricloader": ">=0.15.10",
"fabric": "*",
"minecraft": ">=1.20.2"
"minecraft": ">=1.20.5"
}
}