diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..bb05378 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,32 @@ +name: Build api8 + +on: + push: + branches: [ api8 ] + pull_request: + branches: [ api8 ] + +jobs: + build: + name: Build + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + name: Checkout repo + + - name: Set up JDK 11 (LTS) + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + cache: gradle + + - name: Build with Gradle + run: gradle build + + - uses: actions/upload-artifact@v2 + name: Upload Artifact + with: + name: PacketGate.jar + path: build/libs/PacketGate-*.jar diff --git a/.gitignore b/.gitignore index db35524..6143cab 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,76 @@ -# Intellij project files -*.iml -*.ipr -*.iws -.idea/ +# Build # +######### +MANIFEST.MF +dependency-reduced-pom.xml + +# Compiled # +############ +/bin +/build +/dist +/lib +/out +/run +/target +*.com +*.class +*.dll +*.exe +*.o +*.so + +# Databases # +############# +*.db +*.sql +*.sqlite + +# Packages # +############ +*.7z +*.dmg +*.gz +*.iso +*.rar +*.tar +*.zip -#Gradle -.gradletasknamecache -.gradle/ -build/ -bin/ +# Repository # +############## +.git +# Logging # +########### +/logs +*.log + +# Misc # +######## +*.bak + +# System # +########## .DS_Store +ehthumbs.db +Thumbs.db + +# Project # +########### +.classpath +.externalToolBuilders +/.gradle +.idea +.project +.settings +.factorypath +/eclipse +nbproject +atlassian-ide-plugin.xml +build.xml +nb-configuration.xml +*.iml +*.ipr +*.iws +/.apt_generated/ +*.launch +/.nb-gradle/ diff --git a/README.md b/README.md index 05c602e..333fe53 100644 --- a/README.md +++ b/README.md @@ -28,16 +28,9 @@ dependencies { The `PacketGate` library provides a `PacketGate` class that acts as the registry for `PacketListener`s and provides `PacketConnection`s for all online players. -You can get an instance of PacketGate using Sponge's `ServiceManager`: +You can get an instance of PacketGate using `PacketGateAPI`: ```java -Optional optional = Sponge.getServiceManager().provide(PacketGate.class); -if (optional.isPresent()) { - PacketGate packetGate = optional.get(); - // use PacketGate -} else { - // the PacketGate plugin is not installed on the server -} - +PacketGate packetGate = PacketGateAPI.get(); ``` ### Writing a PacketListener The `PacketListener` interface exposes two methods: `onPacketWrite` and `onPacketRead` which @@ -54,15 +47,15 @@ public class SwearWordListener extends PacketListenerAdapter { @Override public void onPacketRead(PacketEvent event, PacketConnection connection) { - if (!(event.getPacket() instanceof CPacketChatMessage)) return; - CPacketChatMessage packet = (CPacketChatMessage)event.getPacket(); + if (!(event.packet() instanceof ServerboundChatPacket)) return; + ServerboundChatPacket packet = (ServerboundChatPacket) event.packet(); if (packet.getMessage().contains("shit") || packet.getMessage().contains("damn")) { // cancel the event so the server will act like the client never sent it event.setCancelled(true); // get a Sponge player from the PacketConnection - Player player = Sponge.getServer().getPlayer(connection.getPlayerUUID()); + Player player = Sponge.getServer().getPlayer(connection.playerUniqueId()); // send the player some warning words player.sendMessage(Text.of("Please don't swear!")); @@ -74,7 +67,7 @@ public class SwearWordListener extends PacketListenerAdapter { You can also modify the packet instead of cancelling it, for example: ```java String censored = packet.getMessage().replaceAll("shit|damn", "****"); -event.setPacket(new CPacketChatMessage(censored)); +event.setPacket(new ServerboundChatPacket(censored)); ``` ### Registering a PacketListener @@ -84,10 +77,9 @@ the listener should listen to: ```java packetGate.registerListener( new ExampleListener(), - ListenerPriority.DEFAULT, - CPacketChatMessage.class, - SPacketChat.class); - + ListenerPriority.DEFAULT, + ServerboundChatPacket.class +); ``` A `PacketListener` can be registered globally or for a certain `PacketConnection` only. @@ -95,14 +87,13 @@ To retrieve the `PacketConnection` instance for a certain player, use `PacketGat ```java public void registerSwearWordListener(Player player) { - Sponge.getServiceManager().provide(PacketGate.class).ifPresent(packetGate -> { - PacketConnection connection = packetGate.connectionByPlayer(player).get(); - packetGate.registerListener( - new SwearWordListener(), - ListenerPriority.DEFAULT, - connection, - CPacketChatMessage.class); - } + PacketGate packetGate = PacketGateAPI.get(); + PacketConnection connection = packetGate.connectionByPlayer(player).get(); + packetGate.registerListener( + new SwearWordListener(), + ListenerPriority.DEFAULT, + connection, + CPacketChatMessage.class); } ``` diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 3aab966..0000000 --- a/build.gradle +++ /dev/null @@ -1,45 +0,0 @@ -buildscript { - repositories { - maven { - name = 'forge' - url = 'http://files.minecraftforge.net/maven' - } - } - - dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' - } -} - -plugins { - id 'org.spongepowered.plugin' version '0.8.1' - id 'net.minecrell.vanillagradle.server' version '2.2-6' - id 'maven' -} - -group = 'eu.crushedpixel.sponge' -version = '0.1.2' - -sourceCompatibility = 1.8 -targetCompatibility = 1.8 - -dependencies { - compile 'org.spongepowered:spongeapi:7.1.0' -} - -minecraft { - version = '1.12.2' - mappings = 'snapshot_20180131' - makeObfSourceJar = false -} - -jar { - manifest.attributes( - 'FMLAT': 'packetgate_at.cfg', - 'ForceLoadAsMod': true - ) -} - -install { - dependsOn ':reobfJar' -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..f7e3043 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,77 @@ +import org.spongepowered.gradle.plugin.config.PluginLoaders +import org.spongepowered.gradle.vanilla.repository.MinecraftPlatform +import org.spongepowered.plugin.metadata.model.PluginDependency + +plugins { + `maven-publish` + `java-library` + id("org.spongepowered.gradle.plugin") version "2.0.0" + id("org.spongepowered.gradle.vanilla") version "0.2" +} + +group = "eu.crushedpixel.sponge" +version = "0.2.0" + +repositories { + mavenCentral() +} + +dependencies { + compileOnly("org.spongepowered:mixin:0.8.3") +} + +minecraft { + version("1.16.5") + platform(MinecraftPlatform.SERVER) + injectRepositories(false) +} + +sponge { + apiVersion("8.0.0") + license("NO_LICENCE_YET") + plugin("packetgate") { + loader { + name(PluginLoaders.JAVA_PLAIN) + version("1.0") + } + displayName("PacketGate") + entrypoint("eu.crushedpixel.sponge.packetgate.plugin.PluginPacketGate") + description("Sponge library to manipulate incoming and outgoing Packets. ") + links { + homepage("https://github.com/CrushedPixel/PacketGate") + source("https://github.com/CrushedPixel/PacketGate") + issues("https://github.com/CrushedPixel/PacketGate/issues") + } + contributor("CrushedPixel") { + description("Lead developer") + } + contributor("Masa") { + description("API8 port") + } + dependency("spongeapi") { + loadOrder(PluginDependency.LoadOrder.AFTER) + optional(false) + } + } +} + +tasks.withType { + manifest { + attributes["MixinConfigs"] = "mixins.packetgate.json" + } +} + +tasks.withType(JavaCompile::class).configureEach { + options.apply { + encoding = "utf-8" // Consistent source file encoding + if (JavaVersion.current().isJava10Compatible) { + release.set(11) + } + } +} + +// Make sure all tasks which produce archives (jar, sources jar, javadoc jar, etc) produce more consistent output +tasks.withType(AbstractArchiveTask::class).configureEach { + isReproducibleFileOrder = true + isPreserveFileTimestamps = false +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 41d78d8..e018203 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip diff --git a/src/main/java/eu/crushedpixel/sponge/packetgate/api/PacketGateAPI.java b/src/main/java/eu/crushedpixel/sponge/packetgate/api/PacketGateAPI.java new file mode 100644 index 0000000..6bc4fa6 --- /dev/null +++ b/src/main/java/eu/crushedpixel/sponge/packetgate/api/PacketGateAPI.java @@ -0,0 +1,17 @@ +package eu.crushedpixel.sponge.packetgate.api; + +import eu.crushedpixel.sponge.packetgate.api.registry.PacketGate; +import eu.crushedpixel.sponge.packetgate.plugin.PluginPacketGate; + +public class PacketGateAPI { + + /** + * Get {@link PacketGate} + * + * @return PacketGate instance to use + */ + public static PacketGate get() { + return PluginPacketGate.packetGate; + } + +} diff --git a/src/main/java/eu/crushedpixel/sponge/packetgate/api/event/PacketEvent.java b/src/main/java/eu/crushedpixel/sponge/packetgate/api/event/PacketEvent.java index 105741b..2e2fce8 100644 --- a/src/main/java/eu/crushedpixel/sponge/packetgate/api/event/PacketEvent.java +++ b/src/main/java/eu/crushedpixel/sponge/packetgate/api/event/PacketEvent.java @@ -1,25 +1,26 @@ package eu.crushedpixel.sponge.packetgate.api.event; -import net.minecraft.network.Packet; + +import net.minecraft.network.protocol.Packet; public class PacketEvent { - public PacketEvent(Packet packet, boolean outgoing) { + public PacketEvent(Packet packet, boolean outgoing) { this.packet = packet; this.outgoing = outgoing; } - private Packet packet; + private Packet packet; private boolean cancelled = false; private final boolean outgoing; - public Packet getPacket() { + public Packet packet() { return packet; } - public void setPacket(Packet packet) { + public void setPacket(Packet packet) { this.packet = packet; } diff --git a/src/main/java/eu/crushedpixel/sponge/packetgate/api/registry/ListenerOwner.java b/src/main/java/eu/crushedpixel/sponge/packetgate/api/registry/ListenerOwner.java index b64f7cd..82a4121 100644 --- a/src/main/java/eu/crushedpixel/sponge/packetgate/api/registry/ListenerOwner.java +++ b/src/main/java/eu/crushedpixel/sponge/packetgate/api/registry/ListenerOwner.java @@ -11,10 +11,10 @@ public abstract class ListenerOwner { - protected final Map> packetListeners = new ConcurrentHashMap<>(); + protected final Map, List> packetListeners = new ConcurrentHashMap<>(); - void register(PacketListenerData packetListenerData, Class... classes) { - for (Class clazz : classes) { + void register(PacketListenerData packetListenerData, Class... classes) { + for (Class clazz : classes) { List list = packetListeners.get(clazz); if (list == null) list = new CopyOnWriteArrayList<>(); list.add(packetListenerData); diff --git a/src/main/java/eu/crushedpixel/sponge/packetgate/api/registry/PacketConnection.java b/src/main/java/eu/crushedpixel/sponge/packetgate/api/registry/PacketConnection.java index 220da7d..18853ed 100644 --- a/src/main/java/eu/crushedpixel/sponge/packetgate/api/registry/PacketConnection.java +++ b/src/main/java/eu/crushedpixel/sponge/packetgate/api/registry/PacketConnection.java @@ -4,8 +4,8 @@ import eu.crushedpixel.sponge.packetgate.api.listener.PacketListener; import eu.crushedpixel.sponge.packetgate.api.listener.PacketListener.PacketListenerData; import io.netty.channel.Channel; -import net.minecraft.network.Packet; -import org.slf4j.Logger; +import net.minecraft.network.protocol.Packet; +import org.apache.logging.log4j.Logger; import java.util.List; import java.util.UUID; @@ -16,19 +16,19 @@ public class PacketConnection extends ListenerOwner { private final Channel channel; - private UUID playerUUID; + private UUID playerUniqueId; public PacketConnection(Logger logger, Channel channel) { this.logger = logger; this.channel = channel; } - public void sendPacket(Packet packet) { + public void sendPacket(Packet packet) { channel.write(packet); } public void handlePacketEvent(PacketEvent event) { - List list = packetListeners.get(event.getPacket().getClass()); + List list = packetListeners.get(event.packet().getClass()); if (list == null) return; for (PacketListenerData data : list) { @@ -42,15 +42,19 @@ public void handlePacketEvent(PacketEvent event) { } } - public Channel getChannel() { + public Channel channel() { return channel; } - public UUID getPlayerUUID() { - return playerUUID; + public UUID playerUniqueId() { + return playerUniqueId; } - public void setPlayerUUID(UUID playerUUID) { - this.playerUUID = playerUUID; + public void setPlayerUniqueId(UUID playerUUID) { + this.playerUniqueId = playerUUID; } + + public Logger getLogger() { + return logger; + } } diff --git a/src/main/java/eu/crushedpixel/sponge/packetgate/api/registry/PacketGate.java b/src/main/java/eu/crushedpixel/sponge/packetgate/api/registry/PacketGate.java index 215ab07..6ff8e37 100644 --- a/src/main/java/eu/crushedpixel/sponge/packetgate/api/registry/PacketGate.java +++ b/src/main/java/eu/crushedpixel/sponge/packetgate/api/registry/PacketGate.java @@ -1,28 +1,28 @@ package eu.crushedpixel.sponge.packetgate.api.registry; -import com.google.common.base.Preconditions; -import com.google.common.collect.BiMap; -import eu.crushedpixel.sponge.packetgate.api.listener.PacketListener; -import eu.crushedpixel.sponge.packetgate.api.listener.PacketListener.ListenerPriority; -import eu.crushedpixel.sponge.packetgate.api.listener.PacketListener.PacketListenerData; -import eu.crushedpixel.sponge.packetgate.plugin.PluginPacketGate; -import net.minecraft.network.EnumConnectionState; -import net.minecraft.network.EnumPacketDirection; -import net.minecraft.network.Packet; -import org.spongepowered.api.entity.living.player.Player; - import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.UUID; +import org.spongepowered.api.entity.living.player.Player; + +import com.google.common.base.Preconditions; + +import eu.crushedpixel.sponge.packetgate.api.listener.PacketListener; +import eu.crushedpixel.sponge.packetgate.api.listener.PacketListener.ListenerPriority; +import eu.crushedpixel.sponge.packetgate.api.listener.PacketListener.PacketListenerData; +import eu.crushedpixel.sponge.packetgate.plugin.mixin.ConnectionProtocolFlowAccessor; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import net.minecraft.network.ConnectionProtocol; +import net.minecraft.network.protocol.Packet; + public class PacketGate extends ListenerOwner { - private Set connections = new HashSet<>(); + private final Set connections = new HashSet<>(); public void registerConnection(PacketConnection connection) { // register all global packet listeners to the connection @@ -38,48 +38,48 @@ public void unregisterConnection(PacketConnection connection) { } public Optional connectionByPlayer(Player player) { - return connectionByUniqueId(player.getUniqueId()); + return connectionByUniqueId(player.uniqueId()); } public Optional connectionByUniqueId(UUID uniqueId) { return connections .stream() - .filter(connection -> uniqueId.equals(connection.getPlayerUUID())) + .filter(connection -> uniqueId.equals(connection.playerUniqueId())) .findFirst(); } public void registerListener(PacketListener packetListener, ListenerPriority priority, - Class... packetClasses) { + Class... packetClasses) { registerListener(packetListener, priority, null, packetClasses); } - public void registerListener(PacketListener packetListener, ListenerPriority priority, + @SuppressWarnings("unchecked") + public void registerListener(PacketListener packetListener, ListenerPriority priority, PacketConnection connection, - Class... packetClasses) { - List classes = new ArrayList<>(); + Class... packetClasses) { + List> classes = new ArrayList<>(); // if no classes are specified, apply the listener to all Minecraft packet classes if (packetClasses.length == 0) { - for (EnumConnectionState state : EnumConnectionState.values()) { - try { - Field f = state.getClass().getDeclaredField("field_179247_h"); - f.setAccessible(true); - Map>>> directionMaps = - (Map>>>) f.get(state); - directionMaps.forEach((enumPacketDirection, integerClassBiMap) -> { - integerClassBiMap.forEach((id, clazz) -> { - classes.add(clazz); - }); - }); - } catch (NoSuchFieldException | IllegalAccessException ex) { - System.out.println(ex.getMessage()); - } + ConnectionProtocolFlowAccessor[] list = (ConnectionProtocolFlowAccessor[]) (Object) ConnectionProtocol.values(); + for (ConnectionProtocolFlowAccessor state : list) { + state.accessor$flows().forEach((enumPacketDirection, val) -> { + try { + Field classIdField = val.getClass().getDeclaredField("classToId"); + classIdField.setAccessible(true); + ((Object2IntMap>) classIdField.get(val)).forEach((clazz, id) -> { + classes.add(clazz); + }); + } catch(Exception e) { + e.printStackTrace(); + } + }); } } else { // check if packet classes are valid - for (Class clazz : packetClasses) { + for (Class clazz : packetClasses) { Preconditions.checkArgument(Packet.class.isAssignableFrom(clazz), - "Packet classes have to be subclasses of net.minecraft.network.Packet"); + "Packet classes have to be subclasses of net.minecraft.network.protocol.Packet"); classes.add(clazz); } @@ -87,7 +87,7 @@ public void registerListener(PacketListener packetListener, ListenerPriority pri PacketListenerData packetListenerData = new PacketListenerData(packetListener, priority); - Class[] array = classes.toArray(new Class[classes.size()]); + Class[] array = classes.toArray(new Class[classes.size()]); if (connection != null) { connection.register(packetListenerData, array); @@ -105,7 +105,7 @@ public void unregisterListener(PacketListener packetListener) { } @Override - void register(PacketListenerData packetListenerData, Class... classes) { + void register(PacketListenerData packetListenerData, Class... classes) { super.register(packetListenerData, classes); connections.forEach(packetConnection -> packetConnection.register(packetListenerData, classes)); } diff --git a/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/PluginPacketGate.java b/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/PluginPacketGate.java index 47e4c21..e3586dc 100644 --- a/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/PluginPacketGate.java +++ b/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/PluginPacketGate.java @@ -1,47 +1,46 @@ package eu.crushedpixel.sponge.packetgate.plugin; +import java.util.List; + +import org.apache.logging.log4j.Logger; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.Order; +import org.spongepowered.api.event.lifecycle.LoadedGameEvent; +import org.spongepowered.plugin.builtin.jvm.Plugin; + import com.google.inject.Inject; + import eu.crushedpixel.sponge.packetgate.api.registry.PacketGate; +import eu.crushedpixel.sponge.packetgate.plugin.mixin.ConnectionListenerAccessor; import eu.crushedpixel.sponge.packetgate.plugin.netty.CustomChannelInitializer; import io.netty.channel.ChannelFuture; -import net.minecraft.network.NetworkSystem; import net.minecraft.server.MinecraftServer; -import org.slf4j.Logger; -import org.spongepowered.api.Sponge; -import org.spongepowered.api.event.Listener; -import org.spongepowered.api.event.Order; -import org.spongepowered.api.event.game.state.GameInitializationEvent; -import org.spongepowered.api.plugin.Plugin; - -import java.lang.reflect.Field; -import java.util.List; -@Plugin(id = PluginPacketGate.ID, version = PluginPacketGate.VERSION) +@Plugin("packetgate") public class PluginPacketGate { - static final String ID = "packetgate"; - static final String VERSION = "0.1.1"; - @Inject private Logger logger; + private static PluginPacketGate instance; + public static PacketGate packetGate = new PacketGate(); + + public static Logger getLogger() { + return instance.logger; + } + + public PluginPacketGate() { + instance = this; + } + @Listener(order = Order.FIRST) - public void init(GameInitializationEvent event) { - PacketGate packetGate = new PacketGate(); - Sponge.getServiceManager().setProvider(this, PacketGate.class, packetGate); - - NetworkSystem networkSystem = ((MinecraftServer) Sponge.getServer()).getNetworkSystem(); - try { - Field f = networkSystem.getClass().getDeclaredField("field_151274_e"); - f.setAccessible(true); - List endpoints = (List) f.get(networkSystem); - endpoints.forEach(channelFuture -> { - channelFuture.channel().pipeline().addFirst(new CustomChannelInitializer(logger, packetGate)); - logger.info("Successfully injected channel initializer into endpoint"); - }); - } catch (NoSuchFieldException | IllegalAccessException ex) { - System.out.println(ex.getMessage()); - } + public void init(final LoadedGameEvent event) { + ConnectionListenerAccessor connection = (ConnectionListenerAccessor) ((MinecraftServer) Sponge.server()).getConnection(); + List channels = connection.accessor$channels(); + channels.forEach(channelFuture -> { + channelFuture.channel().pipeline().addFirst(new CustomChannelInitializer(logger, packetGate)); + logger.info("Successfully injected channel initializer into endpoint"); + }); } - } \ No newline at end of file diff --git a/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/mixin/ClientboundGameProfilePacketAccessor.java b/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/mixin/ClientboundGameProfilePacketAccessor.java new file mode 100644 index 0000000..d295c2e --- /dev/null +++ b/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/mixin/ClientboundGameProfilePacketAccessor.java @@ -0,0 +1,13 @@ +package eu.crushedpixel.sponge.packetgate.plugin.mixin; + +import com.mojang.authlib.GameProfile; +import net.minecraft.network.protocol.login.ClientboundGameProfilePacket; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ClientboundGameProfilePacket.class) +public interface ClientboundGameProfilePacketAccessor { + + @Accessor("gameProfile") GameProfile accessor$gameProfile(); + +} diff --git a/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/mixin/ConnectionListenerAccessor.java b/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/mixin/ConnectionListenerAccessor.java new file mode 100644 index 0000000..4f74b6c --- /dev/null +++ b/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/mixin/ConnectionListenerAccessor.java @@ -0,0 +1,20 @@ +package eu.crushedpixel.sponge.packetgate.plugin.mixin; + +import io.netty.channel.ChannelFuture; +import net.minecraft.network.Connection; +import net.minecraft.server.network.ServerConnectionListener; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; + +@Mixin(ServerConnectionListener.class) +public interface ConnectionListenerAccessor { + + @Accessor("channels") + List accessor$channels(); + + @Accessor("connections") + List accessor$connections(); + +} diff --git a/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/mixin/ConnectionProtocolFlowAccessor.java b/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/mixin/ConnectionProtocolFlowAccessor.java new file mode 100644 index 0000000..e318cfd --- /dev/null +++ b/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/mixin/ConnectionProtocolFlowAccessor.java @@ -0,0 +1,15 @@ +package eu.crushedpixel.sponge.packetgate.plugin.mixin; + +import net.minecraft.network.ConnectionProtocol; +import net.minecraft.network.protocol.PacketFlow; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Map; + +@Mixin(ConnectionProtocol.class) +public interface ConnectionProtocolFlowAccessor { + + @Accessor("flows") Map accessor$flows(); + +} diff --git a/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/netty/ConnectionHandler.java b/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/netty/ConnectionHandler.java index dd4f4ae..f9c50dc 100644 --- a/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/netty/ConnectionHandler.java +++ b/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/netty/ConnectionHandler.java @@ -1,15 +1,13 @@ package eu.crushedpixel.sponge.packetgate.plugin.netty; -import com.mojang.authlib.GameProfile; import eu.crushedpixel.sponge.packetgate.api.registry.PacketConnection; import eu.crushedpixel.sponge.packetgate.api.registry.PacketGate; +import eu.crushedpixel.sponge.packetgate.plugin.mixin.ClientboundGameProfilePacketAccessor; import io.netty.channel.ChannelDuplexHandler; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPromise; -import net.minecraft.network.login.server.SPacketLoginSuccess; - -import java.lang.reflect.Field; +import net.minecraft.network.protocol.login.ClientboundGameProfilePacket; @ChannelHandler.Sharable class ConnectionHandler extends ChannelDuplexHandler { @@ -43,12 +41,9 @@ public void channelActive(ChannelHandlerContext ctx) throws Exception { @Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { - if (msg instanceof SPacketLoginSuccess) { - SPacketLoginSuccess packetLoginSuccess = (SPacketLoginSuccess)msg; - Field f = packetLoginSuccess.getClass().getDeclaredField("field_149602_a"); - f.setAccessible(true); - GameProfile profile = (GameProfile) f.get(packetLoginSuccess); - connection.setPlayerUUID(profile.getId()); + if (msg instanceof ClientboundGameProfilePacket) { + ClientboundGameProfilePacketAccessor packet = (ClientboundGameProfilePacketAccessor) msg; + connection.setPlayerUniqueId(packet.accessor$gameProfile().getId()); } super.write(ctx, msg, promise); } diff --git a/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/netty/CustomChannelInitializer.java b/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/netty/CustomChannelInitializer.java index b16f0d3..15411f2 100644 --- a/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/netty/CustomChannelInitializer.java +++ b/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/netty/CustomChannelInitializer.java @@ -5,7 +5,8 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; -import org.slf4j.Logger; + +import org.apache.logging.log4j.Logger; public class CustomChannelInitializer extends ChannelInboundHandlerAdapter { diff --git a/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/netty/IncomingPacketHandler.java b/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/netty/IncomingPacketHandler.java index 5d6eb9c..67a36a2 100644 --- a/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/netty/IncomingPacketHandler.java +++ b/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/netty/IncomingPacketHandler.java @@ -4,7 +4,7 @@ import eu.crushedpixel.sponge.packetgate.api.registry.PacketConnection; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; -import net.minecraft.network.Packet; +import net.minecraft.network.protocol.Packet; class IncomingPacketHandler extends ChannelInboundHandlerAdapter { @@ -17,7 +17,7 @@ public IncomingPacketHandler(PacketConnection packetConnection) { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { if (msg instanceof Packet) { - PacketEvent event = new PacketEvent((Packet)msg, false); + PacketEvent event = new PacketEvent((Packet) msg, false); try { packetConnection.handlePacketEvent(event); @@ -26,7 +26,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception } if (event.isCancelled()) return; - msg = event.getPacket(); + msg = event.packet(); } super.channelRead(ctx, msg); diff --git a/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/netty/OutgoingPacketHandler.java b/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/netty/OutgoingPacketHandler.java index 83f5fb0..0a19e8b 100644 --- a/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/netty/OutgoingPacketHandler.java +++ b/src/main/java/eu/crushedpixel/sponge/packetgate/plugin/netty/OutgoingPacketHandler.java @@ -5,7 +5,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelOutboundHandlerAdapter; import io.netty.channel.ChannelPromise; -import net.minecraft.network.Packet; +import net.minecraft.network.protocol.Packet; class OutgoingPacketHandler extends ChannelOutboundHandlerAdapter { @@ -18,7 +18,7 @@ public OutgoingPacketHandler(PacketConnection packetConnection) { @Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { if (msg instanceof Packet) { - PacketEvent event = new PacketEvent((Packet)msg, true); + PacketEvent event = new PacketEvent((Packet) msg, true); try { packetConnection.handlePacketEvent(event); @@ -27,7 +27,7 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) } if (event.isCancelled()) return; - msg = event.getPacket(); + msg = event.packet(); } super.write(ctx, msg, promise); diff --git a/src/main/resources/META-INF/packetgate_at.cfg b/src/main/resources/META-INF/packetgate_at.cfg deleted file mode 100644 index b4021f6..0000000 --- a/src/main/resources/META-INF/packetgate_at.cfg +++ /dev/null @@ -1,3 +0,0 @@ -public-f net.minecraft.network.NetworkSystem field_151274_e # endpoints -public-f net.minecraft.network.EnumConnectionState field_179247_h # directionMaps -public net.minecraft.network.login.server.SPacketLoginSuccess field_149602_a # profile \ No newline at end of file diff --git a/src/main/resources/mixins.packetgate.json b/src/main/resources/mixins.packetgate.json new file mode 100644 index 0000000..3212782 --- /dev/null +++ b/src/main/resources/mixins.packetgate.json @@ -0,0 +1,18 @@ +{ + "required": true, + "minVersion": "0.8.3", + "package": "eu.crushedpixel.sponge.packetgate.plugin.mixin", + "refmap": "mixins.packetgate.refmap.json", + "target": "@env(DEFAULT)", + "compatibilityLevel": "JAVA_11", + "server": [ + "ConnectionListenerAccessor", + "ConnectionProtocolFlowAccessor" + ], + "injectors": { + "defaultRequire": 1 + }, + "mixins": [ + "ClientboundGameProfilePacketAccessor" + ] +}