diff --git a/libraries/networking-impl/gradle.properties b/libraries/networking-impl/gradle.properties index 1b783988..a23f1171 100644 --- a/libraries/networking-impl/gradle.properties +++ b/libraries/networking-impl/gradle.properties @@ -6,4 +6,4 @@ library_version = 0.1.1 entrypoint_init = net.ornithemc.osl.networking.impl.Networking entrypoint_client_init = net.ornithemc.osl.networking.impl.Networking entrypoint_server_init = net.ornithemc.osl.networking.impl.Networking -osl_dependencies = core:>=0.7.0,entrypoints:>=0.5.0,lifecycle-events:>=0.6.0,networking:>=0.9.0 +osl_dependencies = core:>=0.7.0,entrypoints:>=0.5.0,lifecycle-events:>=0.6.0,executors:>=0.1.0,text-components:>=0.1.0-,networking:>=0.9.0 diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/Networking.java b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/Networking.java index 6748a0b3..dfa03a6d 100644 --- a/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/Networking.java +++ b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/Networking.java @@ -13,8 +13,11 @@ import net.ornithemc.osl.networking.api.StringChannelIdentifierParser; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; public class Networking implements ModInitializer, ClientModInitializer, ServerModInitializer { @@ -29,8 +32,11 @@ public void init() { // send channel registration data as a response to receiving client channel registration data ServerPlayNetworkingImpl.sendNoCheck(context.player(), HandshakePayload.CHANNEL, HandshakePayload.server()); - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ServerConnectionEvents.PLAY_READY.invoker().accept(context.server(), context.player()); + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) context.networkHandler(); + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ServerConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } @@ -41,8 +47,11 @@ public void initClient() { ClientPlayNetworkingImpl.setUpPacketFactory((channel, data) -> new CustomPayloadC2SPacket(StringChannelIdentifierParser.toString(channel), PacketBuffers.unwrapped(data))); ClientPlayNetworkingImpl.registerListener(HandshakePayload.CHANNEL, HandshakePayload::new, (context, payload) -> { - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ClientConnectionEvents.PLAY_READY.invoker().accept(context.minecraft()); + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) context.networkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ClientConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java new file mode 100644 index 00000000..e067a183 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +public interface ClientNetworkHandlerAccess extends NetworkHandlerAccess { + + ClientConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java new file mode 100644 index 00000000..1d596400 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +public interface ServerNetworkHandlerAccess extends NetworkHandlerAccess { + + ServerConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java index ef5dbdfb..e43da06c 100644 --- a/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -1,5 +1,6 @@ package net.ornithemc.osl.networking.impl.mixin.client; +import java.net.SocketAddress; import java.util.LinkedHashSet; import java.util.Set; @@ -13,23 +14,36 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.network.handler.ClientPlayNetworkHandler; +import net.minecraft.network.Connection; import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; +import net.minecraft.network.packet.s2c.play.DisconnectS2CPacket; +import net.minecraft.server.integrated.IntegratedServer; +import net.minecraft.text.Text; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.AddressParser; import net.ornithemc.osl.networking.impl.HandshakePayload; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ClientPlayNetworkHandler.class) -public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { +public class ClientPlayNetworkHandlerMixin implements ClientNetworkHandlerAccess { - @Shadow @Final private Minecraft minecraft; + @Shadow @Final + private Minecraft minecraft; + @Shadow @Final + private Connection connection; + @Unique + private ClientConnectionContext connectionContext; /** * Channels that the server is listening to. */ - @Unique private Set serverChannels; + @Unique + private Set serverChannels; @Inject( method = "handleLogin", @@ -38,10 +52,34 @@ public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { ) ) private void osl$networking$handleLogin(CallbackInfo ci) { + if (minecraft.isIntegratedServerRunning()) { + IntegratedServer server = minecraft.getServer(); + String worldName = server.getWorldName(); + + connectionContext = new ClientConnectionContext(minecraft, worldName); + } else { + SocketAddress address = connection.getAddress(); + + String serverAddress = AddressParser.getAddress(address); + int serverPort = AddressParser.getPort(address); + + connectionContext = new ClientConnectionContext(minecraft, serverAddress, serverPort); + } + // send channel registration data as soon as login occurs ClientPlayNetworkingImpl.sendNoCheck(HandshakePayload.CHANNEL, HandshakePayload.client()); - ClientConnectionEvents.LOGIN.invoker().accept(minecraft); + ClientConnectionEvents.LOGIN.invoker().accept(connectionContext); + } + + @Inject( + method = "handleDisconnect", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(DisconnectS2CPacket packet, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(packet.getReason())); } @Inject( @@ -50,9 +88,8 @@ public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ClientConnectionEvents.DISCONNECT.invoker().accept(minecraft); - serverChannels = null; + private void osl$networking$handleDisconnect(Text reason, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(reason)); } @Inject( @@ -68,6 +105,11 @@ public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { } } + @Override + public ClientConnectionContext osl$networking$connectionContext() { + return connectionContext; + } + @Override public boolean osl$networking$isPlayReady() { return serverChannels != null; diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java index 1b011d9d..bc5386d1 100644 --- a/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java +++ b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java @@ -1,18 +1,41 @@ package net.ornithemc.osl.networking.impl.mixin.client; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.client.Minecraft; -import net.minecraft.util.BlockableEventLoop; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.network.handler.ClientPlayNetworkHandler; +import net.minecraft.client.world.ClientWorld; -import net.ornithemc.osl.networking.impl.access.TaskRunnerAccess; +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; @Mixin(Minecraft.class) -public abstract class MinecraftMixin implements BlockableEventLoop, TaskRunnerAccess { +public class MinecraftMixin { - @Override - public boolean osl$networking$submit(Runnable task) { - this.executeTask(task); - return true; + @Shadow + private ClientWorld world; + + @Shadow + private ClientPlayNetworkHandler getNetworkHandler() { return null; } + + @Inject( + method = "setWorld(Lnet/minecraft/client/world/ClientWorld;Lnet/minecraft/client/gui/screen/Screen;)V", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$disconnect(ClientWorld world, Screen screen, CallbackInfo ci) { + if (this.world != null && world == null) { + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) getNetworkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ClientConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } } } diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java deleted file mode 100644 index acd027e0..00000000 --- a/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.ornithemc.osl.networking.impl.mixin.common; - -import org.spongepowered.asm.mixin.Mixin; - -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.BlockableEventLoop; - -import net.ornithemc.osl.networking.impl.access.TaskRunnerAccess; - -@Mixin(MinecraftServer.class) -public abstract class MinecraftServerMixin implements BlockableEventLoop, TaskRunnerAccess { - - @Override - public boolean osl$networking$submit(Runnable task) { - this.executeTask(task); - return true; - } -} diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java index e88d1f5a..463dde8b 100644 --- a/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java +++ b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java @@ -9,13 +9,16 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.network.Connection; +import com.llamalad7.mixinextras.sugar.Local; + import net.minecraft.server.MinecraftServer; import net.minecraft.server.PlayerManager; import net.minecraft.server.entity.living.player.ServerPlayerEntity; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; import net.ornithemc.osl.networking.impl.access.PlayerManagerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; @Mixin(PlayerManager.class) public class PlayerManagerMixin implements PlayerManagerAccess { @@ -29,8 +32,24 @@ public class PlayerManagerMixin implements PlayerManagerAccess { value = "TAIL" ) ) - private void osl$networking$handleLogin(Connection connection, ServerPlayerEntity player, CallbackInfo ci) { - ServerConnectionEvents.LOGIN.invoker().accept(server, player); + private void osl$networking$handleLogin(CallbackInfo ci, @Local ServerPlayerEntity player) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.LOGIN.invoker().accept(connectionContext); + } + + @Inject( + method = "remove", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(CallbackInfo ci, @Local ServerPlayerEntity player) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.DISCONNECT.invoker().accept(connectionContext); } @Override diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java index ac66d440..270f4b80 100644 --- a/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java @@ -15,22 +15,40 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.entity.living.player.ServerPlayerEntity; import net.minecraft.server.network.handler.ServerPlayNetworkHandler; +import net.minecraft.text.Text; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; -import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ServerPlayNetworkHandler.class) -public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { +public class ServerPlayNetworkHandlerMixin implements ServerNetworkHandlerAccess { - @Shadow @Final private MinecraftServer server; - @Shadow @Final private ServerPlayerEntity player; + @Shadow @Final + private MinecraftServer server; + @Shadow + private ServerPlayerEntity player; + + @Unique + private ServerConnectionContext connectionContext; /** * Channels that the client is listening to. */ - @Unique private Set clientChannels; + @Unique + private Set clientChannels; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$networking$initConnectionContext(CallbackInfo ci) { + connectionContext = new ServerConnectionContext(server, (ServerPlayNetworkHandler) (Object) this); + } @Inject( method = "onDisconnect", @@ -38,9 +56,8 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ServerConnectionEvents.DISCONNECT.invoker().accept(server, player); - clientChannels = null; + private void osl$networking$handleDisconnect(Text reason, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(reason)); } @Inject( @@ -56,6 +73,11 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { } } + @Override + public ServerConnectionContext osl$networking$connectionContext() { + return connectionContext; + } + @Override public boolean osl$networking$isPlayReady() { return clientChannels != null; diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/MinecraftServerMixin.java b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/MinecraftServerMixin.java new file mode 100644 index 00000000..3c389c76 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/MinecraftServerMixin.java @@ -0,0 +1,42 @@ +package net.ornithemc.osl.networking.impl.mixin.server; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.entity.living.player.ServerPlayerEntity; + +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; +import net.ornithemc.osl.networking.impl.access.PlayerManagerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin { + + @Shadow + private PlayerManager playerManager; + + @Inject( + method = "stop", + at = @At( + value = "TAIL" + ) + ) + private void osl$networking$stop(CallbackInfo ci) { + List players = ((PlayerManagerAccess) this.playerManager).osl$networking$getAll(); + + for (ServerPlayerEntity player : players) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/resources/fabric.mod.json b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/resources/fabric.mod.json index 0da0ddaa..738808f8 100644 --- a/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/resources/fabric.mod.json +++ b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/resources/fabric.mod.json @@ -23,6 +23,8 @@ "osl-core": "\u003e\u003d0.7.0", "osl-entrypoints": "\u003e\u003d0.5.0", "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.9.0" }, "name": "OSL Networking Implementation", diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/resources/osl.networking-impl.mixins.json b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/resources/osl.networking-impl.mixins.json index f64bbc23..4c0a97f4 100644 --- a/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/resources/osl.networking-impl.mixins.json +++ b/libraries/networking-impl/networking-impl-mc1.13-pre3-mc1.13-pre3/src/main/resources/osl.networking-impl.mixins.json @@ -6,7 +6,6 @@ "mixins": [ "common.CustomPayloadC2SPacketMixin", "common.CustomPayloadS2CPacketMixin", - "common.MinecraftServerMixin", "common.PlayerManagerMixin", "common.ServerPlayNetworkHandlerMixin" ], @@ -15,6 +14,7 @@ "client.MinecraftMixin" ], "server": [ + "server.MinecraftServerMixin" ], "injectors": { "defaultRequire": 1 diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/Networking.java b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/Networking.java index 2785b5e8..9bc0ddf8 100644 --- a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/Networking.java +++ b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/Networking.java @@ -12,8 +12,11 @@ import net.ornithemc.osl.networking.api.PacketBuffers; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; public class Networking implements ModInitializer, ClientModInitializer, ServerModInitializer { @@ -28,8 +31,11 @@ public void init() { // send channel registration data as a response to receiving client channel registration data ServerPlayNetworkingImpl.sendNoCheck(context.player(), HandshakePayload.CHANNEL, HandshakePayload.server()); - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ServerConnectionEvents.PLAY_READY.invoker().accept(context.server(), context.player()); + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) context.networkHandler(); + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ServerConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } @@ -40,8 +46,11 @@ public void initClient() { ClientPlayNetworkingImpl.setUpPacketFactory((channel, data) -> new CustomPayloadC2SPacket(IdentifierChannelIdentifierParser.toIdentifier(channel), PacketBuffers.unwrapped(data))); ClientPlayNetworkingImpl.registerListener(HandshakePayload.CHANNEL, HandshakePayload::new, (context, payload) -> { - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ClientConnectionEvents.PLAY_READY.invoker().accept(context.minecraft()); + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) context.networkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ClientConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/NetworkingMixinPlugin.java b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/NetworkingMixinPlugin.java new file mode 100644 index 00000000..608aea8b --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/NetworkingMixinPlugin.java @@ -0,0 +1,54 @@ +package net.ornithemc.osl.networking.impl; + +import java.util.List; +import java.util.Set; + +import org.objectweb.asm.tree.ClassNode; + +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import net.ornithemc.osl.core.impl.util.MinecraftVersion; + +public class NetworkingMixinPlugin implements IMixinConfigPlugin { + + public static final boolean MINECRAFT_SET_WORLD_HAS_NETWORK_ID_PARAMETER = MinecraftVersion.resolve().compareTo("18w30b") == 0; + + @Override + public void onLoad(String mixinPackage) { + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + if ("net.ornithemc.osl.networking.impl.mixin.client.MinecraftMixin".equals(mixinClassName)) { + return !MINECRAFT_SET_WORLD_HAS_NETWORK_ID_PARAMETER; + } + if ("net.ornithemc.osl.networking.impl.mixin.client.MinecraftMixin18w30b".equals(mixinClassName)) { + return MINECRAFT_SET_WORLD_HAS_NETWORK_ID_PARAMETER; + } + + return true; + } + + @Override + public void acceptTargets(Set myTargets, Set otherTargets) { + } + + @Override + public List getMixins() { + return null; + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + } + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + } +} diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java new file mode 100644 index 00000000..e067a183 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +public interface ClientNetworkHandlerAccess extends NetworkHandlerAccess { + + ClientConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java new file mode 100644 index 00000000..1d596400 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +public interface ServerNetworkHandlerAccess extends NetworkHandlerAccess { + + ServerConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java index ef5dbdfb..e43da06c 100644 --- a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -1,5 +1,6 @@ package net.ornithemc.osl.networking.impl.mixin.client; +import java.net.SocketAddress; import java.util.LinkedHashSet; import java.util.Set; @@ -13,23 +14,36 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.network.handler.ClientPlayNetworkHandler; +import net.minecraft.network.Connection; import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; +import net.minecraft.network.packet.s2c.play.DisconnectS2CPacket; +import net.minecraft.server.integrated.IntegratedServer; +import net.minecraft.text.Text; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.AddressParser; import net.ornithemc.osl.networking.impl.HandshakePayload; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ClientPlayNetworkHandler.class) -public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { +public class ClientPlayNetworkHandlerMixin implements ClientNetworkHandlerAccess { - @Shadow @Final private Minecraft minecraft; + @Shadow @Final + private Minecraft minecraft; + @Shadow @Final + private Connection connection; + @Unique + private ClientConnectionContext connectionContext; /** * Channels that the server is listening to. */ - @Unique private Set serverChannels; + @Unique + private Set serverChannels; @Inject( method = "handleLogin", @@ -38,10 +52,34 @@ public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { ) ) private void osl$networking$handleLogin(CallbackInfo ci) { + if (minecraft.isIntegratedServerRunning()) { + IntegratedServer server = minecraft.getServer(); + String worldName = server.getWorldName(); + + connectionContext = new ClientConnectionContext(minecraft, worldName); + } else { + SocketAddress address = connection.getAddress(); + + String serverAddress = AddressParser.getAddress(address); + int serverPort = AddressParser.getPort(address); + + connectionContext = new ClientConnectionContext(minecraft, serverAddress, serverPort); + } + // send channel registration data as soon as login occurs ClientPlayNetworkingImpl.sendNoCheck(HandshakePayload.CHANNEL, HandshakePayload.client()); - ClientConnectionEvents.LOGIN.invoker().accept(minecraft); + ClientConnectionEvents.LOGIN.invoker().accept(connectionContext); + } + + @Inject( + method = "handleDisconnect", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(DisconnectS2CPacket packet, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(packet.getReason())); } @Inject( @@ -50,9 +88,8 @@ public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ClientConnectionEvents.DISCONNECT.invoker().accept(minecraft); - serverChannels = null; + private void osl$networking$handleDisconnect(Text reason, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(reason)); } @Inject( @@ -68,6 +105,11 @@ public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { } } + @Override + public ClientConnectionContext osl$networking$connectionContext() { + return connectionContext; + } + @Override public boolean osl$networking$isPlayReady() { return serverChannels != null; diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java index 1b011d9d..bc5386d1 100644 --- a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java +++ b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java @@ -1,18 +1,41 @@ package net.ornithemc.osl.networking.impl.mixin.client; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.client.Minecraft; -import net.minecraft.util.BlockableEventLoop; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.network.handler.ClientPlayNetworkHandler; +import net.minecraft.client.world.ClientWorld; -import net.ornithemc.osl.networking.impl.access.TaskRunnerAccess; +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; @Mixin(Minecraft.class) -public abstract class MinecraftMixin implements BlockableEventLoop, TaskRunnerAccess { +public class MinecraftMixin { - @Override - public boolean osl$networking$submit(Runnable task) { - this.executeTask(task); - return true; + @Shadow + private ClientWorld world; + + @Shadow + private ClientPlayNetworkHandler getNetworkHandler() { return null; } + + @Inject( + method = "setWorld(Lnet/minecraft/client/world/ClientWorld;Lnet/minecraft/client/gui/screen/Screen;)V", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$disconnect(ClientWorld world, Screen screen, CallbackInfo ci) { + if (this.world != null && world == null) { + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) getNetworkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ClientConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } } } diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin18w30b.java b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin18w30b.java new file mode 100644 index 00000000..e0d53ec6 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin18w30b.java @@ -0,0 +1,41 @@ +package net.ornithemc.osl.networking.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.network.handler.ClientPlayNetworkHandler; +import net.minecraft.client.world.ClientWorld; + +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +@Mixin(Minecraft.class) +public class MinecraftMixin18w30b { + + @Shadow + private ClientWorld world; + + @Shadow + private ClientPlayNetworkHandler getNetworkHandler() { return null; } + + @Inject( + method = "m_62116716", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$disconnect(ClientWorld world, Screen screen, int networkId, CallbackInfo ci) { + if (this.world != null && world == null) { + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) getNetworkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ClientConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java deleted file mode 100644 index acd027e0..00000000 --- a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.ornithemc.osl.networking.impl.mixin.common; - -import org.spongepowered.asm.mixin.Mixin; - -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.BlockableEventLoop; - -import net.ornithemc.osl.networking.impl.access.TaskRunnerAccess; - -@Mixin(MinecraftServer.class) -public abstract class MinecraftServerMixin implements BlockableEventLoop, TaskRunnerAccess { - - @Override - public boolean osl$networking$submit(Runnable task) { - this.executeTask(task); - return true; - } -} diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java index e88d1f5a..463dde8b 100644 --- a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java +++ b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java @@ -9,13 +9,16 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.network.Connection; +import com.llamalad7.mixinextras.sugar.Local; + import net.minecraft.server.MinecraftServer; import net.minecraft.server.PlayerManager; import net.minecraft.server.entity.living.player.ServerPlayerEntity; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; import net.ornithemc.osl.networking.impl.access.PlayerManagerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; @Mixin(PlayerManager.class) public class PlayerManagerMixin implements PlayerManagerAccess { @@ -29,8 +32,24 @@ public class PlayerManagerMixin implements PlayerManagerAccess { value = "TAIL" ) ) - private void osl$networking$handleLogin(Connection connection, ServerPlayerEntity player, CallbackInfo ci) { - ServerConnectionEvents.LOGIN.invoker().accept(server, player); + private void osl$networking$handleLogin(CallbackInfo ci, @Local ServerPlayerEntity player) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.LOGIN.invoker().accept(connectionContext); + } + + @Inject( + method = "remove", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(CallbackInfo ci, @Local ServerPlayerEntity player) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.DISCONNECT.invoker().accept(connectionContext); } @Override diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java index ac66d440..270f4b80 100644 --- a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java @@ -15,22 +15,40 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.entity.living.player.ServerPlayerEntity; import net.minecraft.server.network.handler.ServerPlayNetworkHandler; +import net.minecraft.text.Text; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; -import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ServerPlayNetworkHandler.class) -public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { +public class ServerPlayNetworkHandlerMixin implements ServerNetworkHandlerAccess { - @Shadow @Final private MinecraftServer server; - @Shadow @Final private ServerPlayerEntity player; + @Shadow @Final + private MinecraftServer server; + @Shadow + private ServerPlayerEntity player; + + @Unique + private ServerConnectionContext connectionContext; /** * Channels that the client is listening to. */ - @Unique private Set clientChannels; + @Unique + private Set clientChannels; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$networking$initConnectionContext(CallbackInfo ci) { + connectionContext = new ServerConnectionContext(server, (ServerPlayNetworkHandler) (Object) this); + } @Inject( method = "onDisconnect", @@ -38,9 +56,8 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ServerConnectionEvents.DISCONNECT.invoker().accept(server, player); - clientChannels = null; + private void osl$networking$handleDisconnect(Text reason, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(reason)); } @Inject( @@ -56,6 +73,11 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { } } + @Override + public ServerConnectionContext osl$networking$connectionContext() { + return connectionContext; + } + @Override public boolean osl$networking$isPlayReady() { return clientChannels != null; diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/MinecraftServerMixin.java b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/MinecraftServerMixin.java new file mode 100644 index 00000000..3c389c76 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/MinecraftServerMixin.java @@ -0,0 +1,42 @@ +package net.ornithemc.osl.networking.impl.mixin.server; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.entity.living.player.ServerPlayerEntity; + +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; +import net.ornithemc.osl.networking.impl.access.PlayerManagerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin { + + @Shadow + private PlayerManager playerManager; + + @Inject( + method = "stop", + at = @At( + value = "TAIL" + ) + ) + private void osl$networking$stop(CallbackInfo ci) { + List players = ((PlayerManagerAccess) this.playerManager).osl$networking$getAll(); + + for (ServerPlayerEntity player : players) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/resources/fabric.mod.json b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/resources/fabric.mod.json index 82188a84..89358be7 100644 --- a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/resources/fabric.mod.json +++ b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/resources/fabric.mod.json @@ -23,6 +23,8 @@ "osl-core": "\u003e\u003d0.7.0", "osl-entrypoints": "\u003e\u003d0.5.0", "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.9.0" }, "name": "OSL Networking Implementation", diff --git a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/resources/osl.networking-impl.mixins.json b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/resources/osl.networking-impl.mixins.json index f64bbc23..a8084bf8 100644 --- a/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/resources/osl.networking-impl.mixins.json +++ b/libraries/networking-impl/networking-impl-mc1.13-pre4-mc1.13.2/src/main/resources/osl.networking-impl.mixins.json @@ -3,18 +3,20 @@ "minVersion": "0.8", "package": "net.ornithemc.osl.networking.impl.mixin", "compatibilityLevel": "JAVA_8", + "plugin": "net.ornithemc.osl.networking.impl.NetworkingMixinPlugin", "mixins": [ "common.CustomPayloadC2SPacketMixin", "common.CustomPayloadS2CPacketMixin", - "common.MinecraftServerMixin", "common.PlayerManagerMixin", "common.ServerPlayNetworkHandlerMixin" ], "client": [ "client.ClientPlayNetworkHandlerMixin", - "client.MinecraftMixin" + "client.MinecraftMixin", + "client.MinecraftMixin18w30b" ], "server": [ + "server.MinecraftServerMixin" ], "injectors": { "defaultRequire": 1 diff --git a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/Networking.java b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/Networking.java index 08410b9e..89ea1e8c 100644 --- a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/Networking.java +++ b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/Networking.java @@ -1,6 +1,7 @@ package net.ornithemc.osl.networking.impl; import net.minecraft.network.packet.CustomPayloadPacket; + import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.entrypoints.api.ModInitializer; import net.ornithemc.osl.entrypoints.api.client.ClientModInitializer; @@ -10,8 +11,11 @@ import net.ornithemc.osl.networking.api.StringChannelIdentifierParser; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; public class Networking implements ModInitializer, ClientModInitializer, ServerModInitializer { @@ -27,8 +31,11 @@ public void initClient() { MinecraftClientEvents.STOP.register(ClientPlayNetworkingImpl::destroy); ClientPlayNetworkingImpl.setUpPacketFactory(Networking::newCustomPayloadPacket); ClientPlayNetworkingImpl.registerListener(HandshakePayload.CHANNEL, HandshakePayload::new, (context, payload) -> { - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ClientConnectionEvents.PLAY_READY.invoker().accept(context.minecraft()); + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) context.networkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ClientConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } @@ -41,8 +48,11 @@ public void initServer() { // send channel registration data as a response to receiving client channel registration data ServerPlayNetworkingImpl.sendNoCheck(context.player(), HandshakePayload.CHANNEL, HandshakePayload.server()); - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ServerConnectionEvents.PLAY_READY.invoker().accept(context.server(), context.player()); + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) context.networkHandler(); + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ServerConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } diff --git a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java new file mode 100644 index 00000000..e067a183 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +public interface ClientNetworkHandlerAccess extends NetworkHandlerAccess { + + ClientConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/interfaces/mixin/INetworkHandler.java b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/access/PacketHandlerAccess.java similarity index 58% rename from libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/interfaces/mixin/INetworkHandler.java rename to libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/access/PacketHandlerAccess.java index 47f751c1..995b1149 100644 --- a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/interfaces/mixin/INetworkHandler.java +++ b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/access/PacketHandlerAccess.java @@ -1,8 +1,8 @@ -package net.ornithemc.osl.networking.impl.interfaces.mixin; +package net.ornithemc.osl.networking.impl.access; import net.minecraft.network.packet.CustomPayloadPacket; -public interface INetworkHandler { +public interface PacketHandlerAccess { boolean osl$networking$handleCustomPayload(CustomPayloadPacket packet); diff --git a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java new file mode 100644 index 00000000..1d596400 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +public interface ServerNetworkHandlerAccess extends NetworkHandlerAccess { + + ServerConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java index 6faff580..83a73afb 100644 --- a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java @@ -1,8 +1,10 @@ package net.ornithemc.osl.networking.impl.mixin.client; +import java.net.SocketAddress; import java.util.LinkedHashSet; import java.util.Set; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -13,25 +15,37 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.network.handler.ClientNetworkHandler; import net.minecraft.client.world.MultiplayerWorld; +import net.minecraft.network.Connection; import net.minecraft.network.packet.CustomPayloadPacket; +import net.minecraft.network.packet.DisconnectPacket; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.AddressParser; import net.ornithemc.osl.networking.impl.HandshakePayload; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.PacketHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; -import net.ornithemc.osl.networking.impl.interfaces.mixin.INetworkHandler; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ClientNetworkHandler.class) -public class ClientNetworkHandlerMixin implements NetworkHandlerAccess, INetworkHandler { +public class ClientNetworkHandlerMixin implements ClientNetworkHandlerAccess, PacketHandlerAccess { - @Shadow private Minecraft minecraft; - @Shadow private MultiplayerWorld world; + @Shadow @Final + private Minecraft minecraft; + @Shadow @Final + private MultiplayerWorld world; + @Shadow @Final + private Connection connection; + @Unique + private ClientConnectionContext connectionContext; /** * Channels that the server is listening to. */ - @Unique private Set serverChannels; + @Unique + private Set serverChannels; @Inject( method = "handleLogin", @@ -40,10 +54,29 @@ public class ClientNetworkHandlerMixin implements NetworkHandlerAccess, INetwork ) ) private void osl$networking$handleLogin(CallbackInfo ci) { + { + SocketAddress address = connection.socket.getRemoteSocketAddress(); + + String serverAddress = AddressParser.getAddress(address); + int serverPort = AddressParser.getPort(address); + + connectionContext = new ClientConnectionContext(minecraft, serverAddress, serverPort); + } + // send channel registration data as soon as login occurs ClientPlayNetworkingImpl.sendNoCheck(HandshakePayload.CHANNEL, HandshakePayload.client()); - ClientConnectionEvents.LOGIN.invoker().accept(minecraft); + ClientConnectionEvents.LOGIN.invoker().accept(connectionContext); + } + + @Inject( + method = "handleDisconnect", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(DisconnectPacket packet, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(packet.reason)); } @Inject( @@ -52,9 +85,15 @@ public class ClientNetworkHandlerMixin implements NetworkHandlerAccess, INetwork value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ClientConnectionEvents.DISCONNECT.invoker().accept(minecraft); - serverChannels = null; + private void osl$networking$handleDisconnect(String reason, Object[] args, CallbackInfo ci) { + connectionContext.offerDisconnectReason(args == null + ? TextComponents.translatable(reason) + : TextComponents.translatable(reason, args)); + } + + @Override + public ClientConnectionContext osl$networking$connectionContext() { + return connectionContext; } @Override diff --git a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java new file mode 100644 index 00000000..6600fd99 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java @@ -0,0 +1,41 @@ +package net.ornithemc.osl.networking.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.network.handler.ClientNetworkHandler; +import net.minecraft.client.world.MultiplayerWorld; +import net.minecraft.world.World; + +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +@Mixin(Minecraft.class) +public class MinecraftMixin { + + @Shadow + private World world; + + @Shadow + private ClientNetworkHandler getNetworkHandler() { return null; } + + @Inject( + method = "setWorld(Lnet/minecraft/world/World;Ljava/lang/String;)V", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$disconnect(World world, String title, CallbackInfo ci) { + if (this.world != null && this.world instanceof MultiplayerWorld && world == null) { + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) getNetworkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ClientConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PacketHandlerMixin.java b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PacketHandlerMixin.java index 310e1e82..1b5d4a10 100644 --- a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PacketHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PacketHandlerMixin.java @@ -8,7 +8,7 @@ import net.minecraft.network.PacketHandler; import net.minecraft.network.packet.CustomPayloadPacket; -import net.ornithemc.osl.networking.impl.interfaces.mixin.INetworkHandler; +import net.ornithemc.osl.networking.impl.access.PacketHandlerAccess; @Mixin(PacketHandler.class) public class PacketHandlerMixin { @@ -21,7 +21,7 @@ public class PacketHandlerMixin { ) ) private void osl$networking$handleCustomPayload(CustomPayloadPacket packet, CallbackInfo ci) { - if (this instanceof INetworkHandler && ((INetworkHandler)this).osl$networking$handleCustomPayload(packet)) { + if (this instanceof PacketHandlerAccess && ((PacketHandlerAccess) this).osl$networking$handleCustomPayload(packet)) { ci.cancel(); } } diff --git a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/PlayerManagerMixin.java b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/PlayerManagerMixin.java new file mode 100644 index 00000000..445e1c41 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/PlayerManagerMixin.java @@ -0,0 +1,37 @@ +package net.ornithemc.osl.networking.impl.mixin.server; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.entity.mob.player.ServerPlayerEntity; + +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +@Mixin(PlayerManager.class) +public class PlayerManagerMixin { + + @Shadow @Final private MinecraftServer server; + + @Inject( + method = "remove", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(CallbackInfo ci, @Local ServerPlayerEntity player) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } +} diff --git a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerLoginNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerLoginNetworkHandlerMixin.java index bf2aedb7..0b2b7052 100644 --- a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerLoginNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerLoginNetworkHandlerMixin.java @@ -14,6 +14,8 @@ import net.minecraft.server.network.handler.ServerLoginNetworkHandler; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; @Mixin(ServerLoginNetworkHandler.class) public class ServerLoginNetworkHandlerMixin { @@ -28,7 +30,10 @@ public class ServerLoginNetworkHandlerMixin { ) private void osl$networking$handleLogin(CallbackInfo ci, @Local ServerPlayerEntity player) { if (player != null) { - ServerConnectionEvents.LOGIN.invoker().accept(server, player); + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.LOGIN.invoker().accept(connectionContext); } } } diff --git a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerPlayNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerPlayNetworkHandlerMixin.java index fd9e42b4..6ce6f6ee 100644 --- a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerPlayNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerPlayNetworkHandlerMixin.java @@ -3,6 +3,7 @@ import java.util.LinkedHashSet; import java.util.Set; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -11,26 +12,54 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.network.packet.CustomPayloadPacket; +import net.minecraft.network.packet.DisconnectPacket; import net.minecraft.server.MinecraftServer; import net.minecraft.server.entity.mob.player.ServerPlayerEntity; import net.minecraft.server.network.handler.ServerPlayNetworkHandler; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; -import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; -import net.ornithemc.osl.networking.impl.interfaces.mixin.INetworkHandler; +import net.ornithemc.osl.networking.impl.access.PacketHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ServerPlayNetworkHandler.class) -public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess, INetworkHandler { +public class ServerPlayNetworkHandlerMixin implements ServerNetworkHandlerAccess, PacketHandlerAccess { - @Shadow private MinecraftServer server; - @Shadow private ServerPlayerEntity player; + @Shadow @Final + private MinecraftServer server; + @Shadow + private ServerPlayerEntity player; + + @Unique + private ServerConnectionContext connectionContext; /** * Channels that the client is listening to. */ - @Unique private Set clientChannels; + @Unique + private Set clientChannels; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$networking$initConnectionContext(CallbackInfo ci) { + connectionContext = new ServerConnectionContext(server, (ServerPlayNetworkHandler) (Object) this); + } + + @Inject( + method = "handleDisconnect", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(DisconnectPacket packet, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(packet.reason)); + } @Inject( method = "onDisconnect", @@ -38,9 +67,15 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess, INet value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ServerConnectionEvents.DISCONNECT.invoker().accept(server, player); - clientChannels = null; + private void osl$networking$handleDisconnect(String reason, Object[] args, CallbackInfo ci) { + connectionContext.offerDisconnectReason(args == null + ? TextComponents.translatable(reason) + : TextComponents.translatable(reason, args)); + } + + @Override + public ServerConnectionContext osl$networking$connectionContext() { + return connectionContext; } @Override diff --git a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/resources/fabric.mod.json b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/resources/fabric.mod.json index 225ab3c4..7309aa67 100644 --- a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/resources/fabric.mod.json +++ b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/resources/fabric.mod.json @@ -23,6 +23,8 @@ "osl-core": "\u003e\u003d0.7.0", "osl-entrypoints": "\u003e\u003d0.5.0", "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.9.0" }, "name": "OSL Networking Implementation", diff --git a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/resources/osl.networking-impl.classtweaker b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/resources/osl.networking-impl.classtweaker new file mode 100644 index 00000000..938816a7 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/resources/osl.networking-impl.classtweaker @@ -0,0 +1,3 @@ +classTweaker v1 named + +accessible field net/minecraft/network/Connection socket Ljava/net/Socket; \ No newline at end of file diff --git a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/resources/osl.networking-impl.mixins.json b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/resources/osl.networking-impl.mixins.json index b8b71777..4799bb11 100644 --- a/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/resources/osl.networking-impl.mixins.json +++ b/libraries/networking-impl/networking-impl-mc11w49a-mc12w16a/src/main/resources/osl.networking-impl.mixins.json @@ -9,9 +9,11 @@ "common.PacketHandlerMixin" ], "client": [ - "client.ClientNetworkHandlerMixin" + "client.ClientNetworkHandlerMixin", + "client.MinecraftMixin" ], "server": [ + "server.PlayerManagerMixin", "server.ServerLoginNetworkHandlerMixin", "server.ServerPlayNetworkHandlerMixin" ], diff --git a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/Networking.java b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/Networking.java index 68d5629c..89ea1e8c 100644 --- a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/Networking.java +++ b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/Networking.java @@ -11,8 +11,11 @@ import net.ornithemc.osl.networking.api.StringChannelIdentifierParser; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; public class Networking implements ModInitializer, ClientModInitializer, ServerModInitializer { @@ -28,8 +31,11 @@ public void initClient() { MinecraftClientEvents.STOP.register(ClientPlayNetworkingImpl::destroy); ClientPlayNetworkingImpl.setUpPacketFactory(Networking::newCustomPayloadPacket); ClientPlayNetworkingImpl.registerListener(HandshakePayload.CHANNEL, HandshakePayload::new, (context, payload) -> { - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ClientConnectionEvents.PLAY_READY.invoker().accept(context.minecraft()); + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) context.networkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ClientConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } @@ -42,8 +48,11 @@ public void initServer() { // send channel registration data as a response to receiving client channel registration data ServerPlayNetworkingImpl.sendNoCheck(context.player(), HandshakePayload.CHANNEL, HandshakePayload.server()); - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ServerConnectionEvents.PLAY_READY.invoker().accept(context.server(), context.player()); + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) context.networkHandler(); + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ServerConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } diff --git a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java new file mode 100644 index 00000000..e067a183 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +public interface ClientNetworkHandlerAccess extends NetworkHandlerAccess { + + ClientConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/interfaces/mixin/INetworkHandler.java b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/access/PacketHandlerAccess.java similarity index 58% rename from libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/interfaces/mixin/INetworkHandler.java rename to libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/access/PacketHandlerAccess.java index 47f751c1..995b1149 100644 --- a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/interfaces/mixin/INetworkHandler.java +++ b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/access/PacketHandlerAccess.java @@ -1,8 +1,8 @@ -package net.ornithemc.osl.networking.impl.interfaces.mixin; +package net.ornithemc.osl.networking.impl.access; import net.minecraft.network.packet.CustomPayloadPacket; -public interface INetworkHandler { +public interface PacketHandlerAccess { boolean osl$networking$handleCustomPayload(CustomPayloadPacket packet); diff --git a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java new file mode 100644 index 00000000..1d596400 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +public interface ServerNetworkHandlerAccess extends NetworkHandlerAccess { + + ServerConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java index 6faff580..83a73afb 100644 --- a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java @@ -1,8 +1,10 @@ package net.ornithemc.osl.networking.impl.mixin.client; +import java.net.SocketAddress; import java.util.LinkedHashSet; import java.util.Set; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -13,25 +15,37 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.network.handler.ClientNetworkHandler; import net.minecraft.client.world.MultiplayerWorld; +import net.minecraft.network.Connection; import net.minecraft.network.packet.CustomPayloadPacket; +import net.minecraft.network.packet.DisconnectPacket; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.AddressParser; import net.ornithemc.osl.networking.impl.HandshakePayload; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.PacketHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; -import net.ornithemc.osl.networking.impl.interfaces.mixin.INetworkHandler; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ClientNetworkHandler.class) -public class ClientNetworkHandlerMixin implements NetworkHandlerAccess, INetworkHandler { +public class ClientNetworkHandlerMixin implements ClientNetworkHandlerAccess, PacketHandlerAccess { - @Shadow private Minecraft minecraft; - @Shadow private MultiplayerWorld world; + @Shadow @Final + private Minecraft minecraft; + @Shadow @Final + private MultiplayerWorld world; + @Shadow @Final + private Connection connection; + @Unique + private ClientConnectionContext connectionContext; /** * Channels that the server is listening to. */ - @Unique private Set serverChannels; + @Unique + private Set serverChannels; @Inject( method = "handleLogin", @@ -40,10 +54,29 @@ public class ClientNetworkHandlerMixin implements NetworkHandlerAccess, INetwork ) ) private void osl$networking$handleLogin(CallbackInfo ci) { + { + SocketAddress address = connection.socket.getRemoteSocketAddress(); + + String serverAddress = AddressParser.getAddress(address); + int serverPort = AddressParser.getPort(address); + + connectionContext = new ClientConnectionContext(minecraft, serverAddress, serverPort); + } + // send channel registration data as soon as login occurs ClientPlayNetworkingImpl.sendNoCheck(HandshakePayload.CHANNEL, HandshakePayload.client()); - ClientConnectionEvents.LOGIN.invoker().accept(minecraft); + ClientConnectionEvents.LOGIN.invoker().accept(connectionContext); + } + + @Inject( + method = "handleDisconnect", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(DisconnectPacket packet, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(packet.reason)); } @Inject( @@ -52,9 +85,15 @@ public class ClientNetworkHandlerMixin implements NetworkHandlerAccess, INetwork value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ClientConnectionEvents.DISCONNECT.invoker().accept(minecraft); - serverChannels = null; + private void osl$networking$handleDisconnect(String reason, Object[] args, CallbackInfo ci) { + connectionContext.offerDisconnectReason(args == null + ? TextComponents.translatable(reason) + : TextComponents.translatable(reason, args)); + } + + @Override + public ClientConnectionContext osl$networking$connectionContext() { + return connectionContext; } @Override diff --git a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java new file mode 100644 index 00000000..6600fd99 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java @@ -0,0 +1,41 @@ +package net.ornithemc.osl.networking.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.network.handler.ClientNetworkHandler; +import net.minecraft.client.world.MultiplayerWorld; +import net.minecraft.world.World; + +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +@Mixin(Minecraft.class) +public class MinecraftMixin { + + @Shadow + private World world; + + @Shadow + private ClientNetworkHandler getNetworkHandler() { return null; } + + @Inject( + method = "setWorld(Lnet/minecraft/world/World;Ljava/lang/String;)V", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$disconnect(World world, String title, CallbackInfo ci) { + if (this.world != null && this.world instanceof MultiplayerWorld && world == null) { + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) getNetworkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ClientConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PacketHandlerMixin.java b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PacketHandlerMixin.java index 310e1e82..1b5d4a10 100644 --- a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PacketHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PacketHandlerMixin.java @@ -8,7 +8,7 @@ import net.minecraft.network.PacketHandler; import net.minecraft.network.packet.CustomPayloadPacket; -import net.ornithemc.osl.networking.impl.interfaces.mixin.INetworkHandler; +import net.ornithemc.osl.networking.impl.access.PacketHandlerAccess; @Mixin(PacketHandler.class) public class PacketHandlerMixin { @@ -21,7 +21,7 @@ public class PacketHandlerMixin { ) ) private void osl$networking$handleCustomPayload(CustomPayloadPacket packet, CallbackInfo ci) { - if (this instanceof INetworkHandler && ((INetworkHandler)this).osl$networking$handleCustomPayload(packet)) { + if (this instanceof PacketHandlerAccess && ((PacketHandlerAccess) this).osl$networking$handleCustomPayload(packet)) { ci.cancel(); } } diff --git a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/PlayerManagerMixin.java b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/PlayerManagerMixin.java new file mode 100644 index 00000000..445e1c41 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/PlayerManagerMixin.java @@ -0,0 +1,37 @@ +package net.ornithemc.osl.networking.impl.mixin.server; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.entity.mob.player.ServerPlayerEntity; + +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +@Mixin(PlayerManager.class) +public class PlayerManagerMixin { + + @Shadow @Final private MinecraftServer server; + + @Inject( + method = "remove", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(CallbackInfo ci, @Local ServerPlayerEntity player) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } +} diff --git a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerLoginNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerLoginNetworkHandlerMixin.java index bf2aedb7..0b2b7052 100644 --- a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerLoginNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerLoginNetworkHandlerMixin.java @@ -14,6 +14,8 @@ import net.minecraft.server.network.handler.ServerLoginNetworkHandler; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; @Mixin(ServerLoginNetworkHandler.class) public class ServerLoginNetworkHandlerMixin { @@ -28,7 +30,10 @@ public class ServerLoginNetworkHandlerMixin { ) private void osl$networking$handleLogin(CallbackInfo ci, @Local ServerPlayerEntity player) { if (player != null) { - ServerConnectionEvents.LOGIN.invoker().accept(server, player); + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.LOGIN.invoker().accept(connectionContext); } } } diff --git a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerPlayNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerPlayNetworkHandlerMixin.java index a07c8490..9b1e6ce4 100644 --- a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerPlayNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerPlayNetworkHandlerMixin.java @@ -3,6 +3,7 @@ import java.util.LinkedHashSet; import java.util.Set; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -16,21 +17,38 @@ import net.minecraft.server.network.handler.ServerPlayNetworkHandler; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; -import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; -import net.ornithemc.osl.networking.impl.interfaces.mixin.INetworkHandler; +import net.ornithemc.osl.networking.impl.access.PacketHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ServerPlayNetworkHandler.class) -public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess, INetworkHandler { +public class ServerPlayNetworkHandlerMixin implements ServerNetworkHandlerAccess, PacketHandlerAccess { - @Shadow private MinecraftServer server; - @Shadow private ServerPlayerEntity player; + @Shadow @Final + private MinecraftServer server; + @Shadow + private ServerPlayerEntity player; + + @Unique + private ServerConnectionContext connectionContext; /** * Channels that the client is listening to. */ - @Unique private Set clientChannels; + @Unique + private Set clientChannels; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$networking$initConnectionContext(CallbackInfo ci) { + connectionContext = new ServerConnectionContext(server, (ServerPlayNetworkHandler) (Object) this); + } @Inject( method = "onDisconnect", @@ -38,9 +56,10 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess, INet value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ServerConnectionEvents.DISCONNECT.invoker().accept(server, player); - clientChannels = null; + private void osl$networking$handleDisconnect(String reason, Object[] args, CallbackInfo ci) { + connectionContext.offerDisconnectReason(args == null + ? TextComponents.translatable(reason) + : TextComponents.translatable(reason, args)); } @Inject( @@ -56,6 +75,11 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess, INet } } + @Override + public ServerConnectionContext osl$networking$connectionContext() { + return connectionContext; + } + @Override public boolean osl$networking$canRunOffMainThread() { return true; diff --git a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/resources/fabric.mod.json b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/resources/fabric.mod.json index 15de3ea6..f240f699 100644 --- a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/resources/fabric.mod.json +++ b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/resources/fabric.mod.json @@ -23,6 +23,8 @@ "osl-core": "\u003e\u003d0.7.0", "osl-entrypoints": "\u003e\u003d0.5.0", "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.9.0" }, "name": "OSL Networking Implementation", diff --git a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/resources/osl.networking-impl.classtweaker b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/resources/osl.networking-impl.classtweaker new file mode 100644 index 00000000..938816a7 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/resources/osl.networking-impl.classtweaker @@ -0,0 +1,3 @@ +classTweaker v1 named + +accessible field net/minecraft/network/Connection socket Ljava/net/Socket; \ No newline at end of file diff --git a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/resources/osl.networking-impl.mixins.json b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/resources/osl.networking-impl.mixins.json index b8b71777..4799bb11 100644 --- a/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/resources/osl.networking-impl.mixins.json +++ b/libraries/networking-impl/networking-impl-mc12w17a-mc12w17a/src/main/resources/osl.networking-impl.mixins.json @@ -9,9 +9,11 @@ "common.PacketHandlerMixin" ], "client": [ - "client.ClientNetworkHandlerMixin" + "client.ClientNetworkHandlerMixin", + "client.MinecraftMixin" ], "server": [ + "server.PlayerManagerMixin", "server.ServerLoginNetworkHandlerMixin", "server.ServerPlayNetworkHandlerMixin" ], diff --git a/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/Networking.java b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/Networking.java index f97e0a06..77c8c039 100644 --- a/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/Networking.java +++ b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/Networking.java @@ -11,8 +11,11 @@ import net.ornithemc.osl.networking.api.StringChannelIdentifierParser; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; public class Networking implements ModInitializer, ClientModInitializer, ServerModInitializer { @@ -26,8 +29,11 @@ public void init() { // send channel registration data as a response to receiving client channel registration data ServerPlayNetworkingImpl.sendNoCheck(context.player(), HandshakePayload.CHANNEL, HandshakePayload.server()); - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ServerConnectionEvents.PLAY_READY.invoker().accept(context.server(), context.player()); + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) context.networkHandler(); + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ServerConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } @@ -37,8 +43,11 @@ public void initClient() { MinecraftClientEvents.STOP.register(ClientPlayNetworkingImpl::destroy); ClientPlayNetworkingImpl.setUpPacketFactory(Networking::newCustomPayloadPacket); ClientPlayNetworkingImpl.registerListener(HandshakePayload.CHANNEL, HandshakePayload::new, (context, payload) -> { - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ClientConnectionEvents.PLAY_READY.invoker().accept(context.minecraft()); + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) context.networkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ClientConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } diff --git a/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java new file mode 100644 index 00000000..e067a183 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +public interface ClientNetworkHandlerAccess extends NetworkHandlerAccess { + + ClientConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/access/LocalServerAccess.java b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/access/LocalServerAccess.java new file mode 100644 index 00000000..2537236c --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/access/LocalServerAccess.java @@ -0,0 +1,7 @@ +package net.ornithemc.osl.networking.impl.access; + +public interface LocalServerAccess { + + String osl$networking$worldSaveName(); + +} diff --git a/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java new file mode 100644 index 00000000..1d596400 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +public interface ServerNetworkHandlerAccess extends NetworkHandlerAccess { + + ServerConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java index a5a8a07b..d61a4420 100644 --- a/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java @@ -1,8 +1,10 @@ package net.ornithemc.osl.networking.impl.mixin.client; +import java.net.SocketAddress; import java.util.LinkedHashSet; import java.util.Set; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -13,24 +15,37 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.network.handler.ClientNetworkHandler; import net.minecraft.client.world.ClientWorld; +import net.minecraft.network.Connection; import net.minecraft.network.packet.CustomPayloadPacket; +import net.minecraft.network.packet.DisconnectPacket; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.AddressParser; import net.ornithemc.osl.networking.impl.HandshakePayload; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; +import net.ornithemc.osl.networking.impl.access.LocalServerAccess; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ClientNetworkHandler.class) -public class ClientNetworkHandlerMixin implements NetworkHandlerAccess { +public class ClientNetworkHandlerMixin implements ClientNetworkHandlerAccess { - @Shadow private Minecraft minecraft; - @Shadow private ClientWorld world; + @Shadow @Final + private Minecraft minecraft; + @Shadow @Final + private ClientWorld world; + @Shadow @Final + private Connection connection; + @Unique + private ClientConnectionContext connectionContext; /** * Channels that the server is listening to. */ - @Unique private Set serverChannels; + @Unique + private Set serverChannels; @Inject( method = "handleLogin", @@ -39,10 +54,34 @@ public class ClientNetworkHandlerMixin implements NetworkHandlerAccess { ) ) private void osl$networking$handleLogin(CallbackInfo ci) { + if (minecraft.getLocalServer().isRunning()) { + LocalServerAccess server = (LocalServerAccess) minecraft.getLocalServer(); + String worldName = server.osl$networking$worldSaveName(); + + connectionContext = new ClientConnectionContext(minecraft, worldName); + } else { + SocketAddress address = connection.getAddress(); + + String serverAddress = AddressParser.getAddress(address); + int serverPort = AddressParser.getPort(address); + + connectionContext = new ClientConnectionContext(minecraft, serverAddress, serverPort); + } + // send channel registration data as soon as login occurs ClientPlayNetworkingImpl.sendNoCheck(HandshakePayload.CHANNEL, HandshakePayload.client()); - ClientConnectionEvents.LOGIN.invoker().accept(minecraft); + ClientConnectionEvents.LOGIN.invoker().accept(connectionContext); + } + + @Inject( + method = "handleDisconnect", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(DisconnectPacket packet, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(packet.reason)); } @Inject( @@ -51,9 +90,10 @@ public class ClientNetworkHandlerMixin implements NetworkHandlerAccess { value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ClientConnectionEvents.DISCONNECT.invoker().accept(minecraft); - serverChannels = null; + private void osl$networking$handleDisconnect(String reason, Object[] args, CallbackInfo ci) { + connectionContext.offerDisconnectReason(args == null + ? TextComponents.translatable(reason) + : TextComponents.translatable(reason, args)); } @Inject( @@ -69,6 +109,11 @@ public class ClientNetworkHandlerMixin implements NetworkHandlerAccess { } } + @Override + public ClientConnectionContext osl$networking$connectionContext() { + return connectionContext; + } + @Override public boolean osl$networking$canRunOffMainThread() { return minecraft != null && minecraft.world != null && minecraft.player != null && world != null; diff --git a/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/LocalServerMixin.java b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/LocalServerMixin.java new file mode 100644 index 00000000..12b4690c --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/LocalServerMixin.java @@ -0,0 +1,35 @@ +package net.ornithemc.osl.networking.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.client.server.LocalServer; + +import net.ornithemc.osl.networking.impl.access.LocalServerAccess; + +@Mixin(LocalServer.class) +public class LocalServerMixin implements LocalServerAccess { + + @Unique + private String worldSaveName; + + @Inject( + method = "start", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$start(CallbackInfo ci, @Local String worldSaveName) { + this.worldSaveName = worldSaveName; + } + + @Override + public String osl$networking$worldSaveName() { + return this.worldSaveName; + } +} diff --git a/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java new file mode 100644 index 00000000..6f698974 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java @@ -0,0 +1,40 @@ +package net.ornithemc.osl.networking.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.network.handler.ClientNetworkHandler; +import net.minecraft.client.world.ClientWorld; + +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +@Mixin(Minecraft.class) +public class MinecraftMixin { + + @Shadow + private ClientWorld world; + + @Shadow + private ClientNetworkHandler getNetworkHandler() { return null; } + + @Inject( + method = "setWorld(Lnet/minecraft/client/world/ClientWorld;Ljava/lang/String;)V", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$disconnect(ClientWorld world, String title, CallbackInfo ci) { + if (this.world != null && world == null) { + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) getNetworkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ClientConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java new file mode 100644 index 00000000..32ec4bae --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java @@ -0,0 +1,37 @@ +package net.ornithemc.osl.networking.impl.mixin.common; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.entity.mob.player.ServerPlayerEntity; + +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +@Mixin(PlayerManager.class) +public class PlayerManagerMixin { + + @Shadow @Final private MinecraftServer server; + + @Inject( + method = "remove", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(CallbackInfo ci, @Local ServerPlayerEntity player) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } +} diff --git a/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerLoginNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerLoginNetworkHandlerMixin.java index bcdecf70..2f4e70f3 100644 --- a/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerLoginNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerLoginNetworkHandlerMixin.java @@ -14,6 +14,8 @@ import net.minecraft.server.network.handler.ServerLoginNetworkHandler; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; @Mixin(ServerLoginNetworkHandler.class) public class ServerLoginNetworkHandlerMixin { @@ -28,7 +30,10 @@ public class ServerLoginNetworkHandlerMixin { ) private void osl$networking$handleLogin(CallbackInfo ci, @Local ServerPlayerEntity player) { if (player != null) { - ServerConnectionEvents.LOGIN.invoker().accept(server, player); + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.LOGIN.invoker().accept(connectionContext); } } } diff --git a/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java index c05277df..5fb807bd 100644 --- a/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java @@ -3,6 +3,7 @@ import java.util.LinkedHashSet; import java.util.Set; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -16,20 +17,37 @@ import net.minecraft.server.network.handler.ServerPlayNetworkHandler; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; -import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ServerPlayNetworkHandler.class) -public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { +public class ServerPlayNetworkHandlerMixin implements ServerNetworkHandlerAccess { - @Shadow private MinecraftServer server; - @Shadow private ServerPlayerEntity player; + @Shadow @Final + private MinecraftServer server; + @Shadow + private ServerPlayerEntity player; + + @Unique + private ServerConnectionContext connectionContext; /** * Channels that the client is listening to. */ - @Unique private Set clientChannels; + @Unique + private Set clientChannels; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$networking$initConnectionContext(CallbackInfo ci) { + connectionContext = new ServerConnectionContext(server, (ServerPlayNetworkHandler) (Object) this); + } @Inject( method = "onDisconnect", @@ -37,9 +55,10 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ServerConnectionEvents.DISCONNECT.invoker().accept(server, player); - clientChannels = null; + private void osl$networking$handleDisconnect(String reason, Object[] args, CallbackInfo ci) { + connectionContext.offerDisconnectReason(args == null + ? TextComponents.translatable(reason) + : TextComponents.translatable(reason, args)); } @Inject( @@ -55,6 +74,11 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { } } + @Override + public ServerConnectionContext osl$networking$connectionContext() { + return connectionContext; + } + @Override public boolean osl$networking$canRunOffMainThread() { return true; diff --git a/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/resources/fabric.mod.json b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/resources/fabric.mod.json index f58bac87..59343247 100644 --- a/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/resources/fabric.mod.json +++ b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/resources/fabric.mod.json @@ -23,6 +23,8 @@ "osl-core": "\u003e\u003d0.7.0", "osl-entrypoints": "\u003e\u003d0.5.0", "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.9.0" }, "name": "OSL Networking Implementation", diff --git a/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/resources/osl.networking-impl.mixins.json b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/resources/osl.networking-impl.mixins.json index 6e7aac37..7239176e 100644 --- a/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/resources/osl.networking-impl.mixins.json +++ b/libraries/networking-impl/networking-impl-mc12w18a-mc12w19a/src/main/resources/osl.networking-impl.mixins.json @@ -10,7 +10,9 @@ "common.ServerPlayNetworkHandlerMixin" ], "client": [ - "client.ClientNetworkHandlerMixin" + "client.ClientNetworkHandlerMixin", + "client.LocalServerAccess", + "client.MinecraftMixin" ], "server": [ ], diff --git a/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/Networking.java b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/Networking.java index f97e0a06..77c8c039 100644 --- a/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/Networking.java +++ b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/Networking.java @@ -11,8 +11,11 @@ import net.ornithemc.osl.networking.api.StringChannelIdentifierParser; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; public class Networking implements ModInitializer, ClientModInitializer, ServerModInitializer { @@ -26,8 +29,11 @@ public void init() { // send channel registration data as a response to receiving client channel registration data ServerPlayNetworkingImpl.sendNoCheck(context.player(), HandshakePayload.CHANNEL, HandshakePayload.server()); - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ServerConnectionEvents.PLAY_READY.invoker().accept(context.server(), context.player()); + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) context.networkHandler(); + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ServerConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } @@ -37,8 +43,11 @@ public void initClient() { MinecraftClientEvents.STOP.register(ClientPlayNetworkingImpl::destroy); ClientPlayNetworkingImpl.setUpPacketFactory(Networking::newCustomPayloadPacket); ClientPlayNetworkingImpl.registerListener(HandshakePayload.CHANNEL, HandshakePayload::new, (context, payload) -> { - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ClientConnectionEvents.PLAY_READY.invoker().accept(context.minecraft()); + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) context.networkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ClientConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } diff --git a/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/NetworkingMixinPlugin.java b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/NetworkingMixinPlugin.java new file mode 100644 index 00000000..5ca85f59 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/NetworkingMixinPlugin.java @@ -0,0 +1,54 @@ +package net.ornithemc.osl.networking.impl; + +import java.util.List; +import java.util.Set; + +import org.objectweb.asm.tree.ClassNode; + +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import net.ornithemc.osl.core.impl.util.MinecraftVersion; + +public class NetworkingMixinPlugin implements IMixinConfigPlugin { + + public static final boolean PACKET_READ_QUEUE_IS_LIST = MinecraftVersion.resolve().compareTo("1.6.1") <= 0; + + @Override + public void onLoad(String mixinPackage) { + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + if ("net.ornithemc.osl.networking.impl.mixin.common.RemoteConnectionMixinNew".equals(mixinClassName)) { + return !PACKET_READ_QUEUE_IS_LIST; + } + if ("net.ornithemc.osl.networking.impl.mixin.common.RemoteConnectionMixinOld".equals(mixinClassName)) { + return PACKET_READ_QUEUE_IS_LIST; + } + + return true; + } + + @Override + public void acceptTargets(Set myTargets, Set otherTargets) { + } + + @Override + public List getMixins() { + return null; + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + } + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + } +} diff --git a/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java new file mode 100644 index 00000000..e067a183 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +public interface ClientNetworkHandlerAccess extends NetworkHandlerAccess { + + ClientConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java new file mode 100644 index 00000000..1d596400 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +public interface ServerNetworkHandlerAccess extends NetworkHandlerAccess { + + ServerConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java index a5a8a07b..67a6060c 100644 --- a/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java @@ -1,8 +1,10 @@ package net.ornithemc.osl.networking.impl.mixin.client; +import java.net.SocketAddress; import java.util.LinkedHashSet; import java.util.Set; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -13,24 +15,37 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.network.handler.ClientNetworkHandler; import net.minecraft.client.world.ClientWorld; +import net.minecraft.network.Connection; import net.minecraft.network.packet.CustomPayloadPacket; +import net.minecraft.network.packet.DisconnectPacket; +import net.minecraft.server.integrated.IntegratedServer; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.AddressParser; import net.ornithemc.osl.networking.impl.HandshakePayload; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ClientNetworkHandler.class) -public class ClientNetworkHandlerMixin implements NetworkHandlerAccess { +public class ClientNetworkHandlerMixin implements ClientNetworkHandlerAccess { - @Shadow private Minecraft minecraft; - @Shadow private ClientWorld world; + @Shadow @Final + private Minecraft minecraft; + @Shadow @Final + private ClientWorld world; + @Shadow @Final + private Connection connection; + @Unique + private ClientConnectionContext connectionContext; /** * Channels that the server is listening to. */ - @Unique private Set serverChannels; + @Unique + private Set serverChannels; @Inject( method = "handleLogin", @@ -39,10 +54,34 @@ public class ClientNetworkHandlerMixin implements NetworkHandlerAccess { ) ) private void osl$networking$handleLogin(CallbackInfo ci) { + if (minecraft.isIntegratedServerRunning()) { + IntegratedServer server = minecraft.getServer(); + String worldName = server.getWorldName(); + + connectionContext = new ClientConnectionContext(minecraft, worldName); + } else { + SocketAddress address = connection.getAddress(); + + String serverAddress = AddressParser.getAddress(address); + int serverPort = AddressParser.getPort(address); + + connectionContext = new ClientConnectionContext(minecraft, serverAddress, serverPort); + } + // send channel registration data as soon as login occurs ClientPlayNetworkingImpl.sendNoCheck(HandshakePayload.CHANNEL, HandshakePayload.client()); - ClientConnectionEvents.LOGIN.invoker().accept(minecraft); + ClientConnectionEvents.LOGIN.invoker().accept(connectionContext); + } + + @Inject( + method = "handleDisconnect", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(DisconnectPacket packet, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(packet.reason)); } @Inject( @@ -51,9 +90,10 @@ public class ClientNetworkHandlerMixin implements NetworkHandlerAccess { value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ClientConnectionEvents.DISCONNECT.invoker().accept(minecraft); - serverChannels = null; + private void osl$networking$handleDisconnect(String reason, Object[] args, CallbackInfo ci) { + connectionContext.offerDisconnectReason(args == null + ? TextComponents.translatable(reason) + : TextComponents.translatable(reason, args)); } @Inject( @@ -69,6 +109,11 @@ public class ClientNetworkHandlerMixin implements NetworkHandlerAccess { } } + @Override + public ClientConnectionContext osl$networking$connectionContext() { + return connectionContext; + } + @Override public boolean osl$networking$canRunOffMainThread() { return minecraft != null && minecraft.world != null && minecraft.player != null && world != null; diff --git a/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java new file mode 100644 index 00000000..6f698974 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java @@ -0,0 +1,40 @@ +package net.ornithemc.osl.networking.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.network.handler.ClientNetworkHandler; +import net.minecraft.client.world.ClientWorld; + +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +@Mixin(Minecraft.class) +public class MinecraftMixin { + + @Shadow + private ClientWorld world; + + @Shadow + private ClientNetworkHandler getNetworkHandler() { return null; } + + @Inject( + method = "setWorld(Lnet/minecraft/client/world/ClientWorld;Ljava/lang/String;)V", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$disconnect(ClientWorld world, String title, CallbackInfo ci) { + if (this.world != null && world == null) { + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) getNetworkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ClientConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java new file mode 100644 index 00000000..718f04e3 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java @@ -0,0 +1,42 @@ +package net.ornithemc.osl.networking.impl.mixin.common; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.entity.mob.player.ServerPlayerEntity; + +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin { + + @Shadow + private PlayerManager playerManager; + + @Inject( + method = "stop", + at = @At( + value = "TAIL" + ) + ) + private void osl$networking$stop(CallbackInfo ci) { + @SuppressWarnings("unchecked") + List players = (List) this.playerManager.players; + + for (ServerPlayerEntity player : players) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java index 524a0e78..6fc5bdde 100644 --- a/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java +++ b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java @@ -7,12 +7,15 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.network.Connection; +import com.llamalad7.mixinextras.sugar.Local; + import net.minecraft.server.MinecraftServer; import net.minecraft.server.PlayerManager; import net.minecraft.server.entity.mob.player.ServerPlayerEntity; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; @Mixin(PlayerManager.class) public class PlayerManagerMixin { @@ -25,7 +28,23 @@ public class PlayerManagerMixin { value = "TAIL" ) ) - private void osl$networking$handleLogin(Connection connection, ServerPlayerEntity player, CallbackInfo ci) { - ServerConnectionEvents.LOGIN.invoker().accept(server, player); + private void osl$networking$handleLogin(CallbackInfo ci, @Local ServerPlayerEntity player) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.LOGIN.invoker().accept(connectionContext); + } + + @Inject( + method = "remove", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(CallbackInfo ci, @Local ServerPlayerEntity player) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.DISCONNECT.invoker().accept(connectionContext); } } diff --git a/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/RemoteConnectionMixin.java b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/RemoteConnectionMixinNew.java similarity index 60% rename from libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/RemoteConnectionMixin.java rename to libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/RemoteConnectionMixinNew.java index dcf4301b..e481b3fc 100644 --- a/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/RemoteConnectionMixin.java +++ b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/RemoteConnectionMixinNew.java @@ -15,35 +15,19 @@ import net.ornithemc.osl.networking.impl.Connections; @Mixin(RemoteConnection.class) -public class RemoteConnectionMixin { +public class RemoteConnectionMixinNew { @Shadow private PacketHandler listener; @Inject( method = "read", cancellable = true, - require = 0, // will fail in 1.6.2+ - at = @At( - value = "INVOKE", - target = "Ljava/util/List;add(Ljava/lang/Object;)Z" - ) - ) - private void osl$networking$asyncCustomPayloads1(CallbackInfoReturnable cir, @Local Packet packet) { - if (Connections.handleAsyncPacket(packet, listener)) { - cir.setReturnValue(true); - } - } - - @Inject( - method = "read", - cancellable = true, - require = 0, // will fail in 1.6.1- at = @At( value = "INVOKE", target = "Ljava/util/Queue;add(Ljava/lang/Object;)Z" ) ) - private void osl$networking$asyncCustomPayloads2(CallbackInfoReturnable cir, @Local Packet packet) { + private void osl$networking$asyncCustomPayloads(CallbackInfoReturnable cir, @Local Packet packet) { if (Connections.handleAsyncPacket(packet, listener)) { cir.setReturnValue(true); } diff --git a/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/RemoteConnectionMixinOld.java b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/RemoteConnectionMixinOld.java new file mode 100644 index 00000000..b47de07d --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/RemoteConnectionMixinOld.java @@ -0,0 +1,35 @@ +package net.ornithemc.osl.networking.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.network.PacketHandler; +import net.minecraft.network.RemoteConnection; +import net.minecraft.network.packet.Packet; + +import net.ornithemc.osl.networking.impl.Connections; + +@Mixin(RemoteConnection.class) +public class RemoteConnectionMixinOld { + + @Shadow private PacketHandler listener; + + @Inject( + method = "read", + cancellable = true, + at = @At( + value = "INVOKE", + target = "Ljava/util/List;add(Ljava/lang/Object;)Z" + ) + ) + private void osl$networking$asyncCustomPayloads(CallbackInfoReturnable cir, @Local Packet packet) { + if (Connections.handleAsyncPacket(packet, listener)) { + cir.setReturnValue(true); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java index c05277df..5fb807bd 100644 --- a/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java @@ -3,6 +3,7 @@ import java.util.LinkedHashSet; import java.util.Set; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -16,20 +17,37 @@ import net.minecraft.server.network.handler.ServerPlayNetworkHandler; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; -import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ServerPlayNetworkHandler.class) -public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { +public class ServerPlayNetworkHandlerMixin implements ServerNetworkHandlerAccess { - @Shadow private MinecraftServer server; - @Shadow private ServerPlayerEntity player; + @Shadow @Final + private MinecraftServer server; + @Shadow + private ServerPlayerEntity player; + + @Unique + private ServerConnectionContext connectionContext; /** * Channels that the client is listening to. */ - @Unique private Set clientChannels; + @Unique + private Set clientChannels; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$networking$initConnectionContext(CallbackInfo ci) { + connectionContext = new ServerConnectionContext(server, (ServerPlayNetworkHandler) (Object) this); + } @Inject( method = "onDisconnect", @@ -37,9 +55,10 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ServerConnectionEvents.DISCONNECT.invoker().accept(server, player); - clientChannels = null; + private void osl$networking$handleDisconnect(String reason, Object[] args, CallbackInfo ci) { + connectionContext.offerDisconnectReason(args == null + ? TextComponents.translatable(reason) + : TextComponents.translatable(reason, args)); } @Inject( @@ -55,6 +74,11 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { } } + @Override + public ServerConnectionContext osl$networking$connectionContext() { + return connectionContext; + } + @Override public boolean osl$networking$canRunOffMainThread() { return true; diff --git a/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/resources/fabric.mod.json b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/resources/fabric.mod.json index 2a1b77d2..dfa09175 100644 --- a/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/resources/fabric.mod.json +++ b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/resources/fabric.mod.json @@ -23,6 +23,8 @@ "osl-core": "\u003e\u003d0.7.0", "osl-entrypoints": "\u003e\u003d0.5.0", "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.9.0" }, "name": "OSL Networking Implementation", diff --git a/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/resources/osl.networking-impl.mixins.json b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/resources/osl.networking-impl.mixins.json index bfb2c375..b739362a 100644 --- a/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/resources/osl.networking-impl.mixins.json +++ b/libraries/networking-impl/networking-impl-mc12w21a-mc13w39b/src/main/resources/osl.networking-impl.mixins.json @@ -3,15 +3,19 @@ "minVersion": "0.8", "package": "net.ornithemc.osl.networking.impl.mixin", "compatibilityLevel": "JAVA_8", + "plugin": "net.ornithemc.osl.networking.impl.NetworkingMixinPlugin", "mixins": [ "common.CustomPayloadPacketMixin", + "common.MinecraftServerMixin", "common.PlayerManagerMixin", - "common.RemoteConnectionMixin", + "common.RemoteConnectionMixinNew", + "common.RemoteConnectionMixinOld", "common.ServerPlayNetworkHandlerMixin" ], "client": [ "client.ClientNetworkHandlerMixin", - "client.LocalConnectionMixin" + "client.LocalConnectionMixin", + "client.MinecraftMixin" ], "server": [ ], diff --git a/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/Networking.java b/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/Networking.java index 10f44a33..3aea1c46 100644 --- a/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/Networking.java +++ b/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/Networking.java @@ -12,8 +12,11 @@ import net.ornithemc.osl.networking.api.StringChannelIdentifierParser; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; public class Networking implements ModInitializer, ClientModInitializer, ServerModInitializer { @@ -28,8 +31,11 @@ public void init() { // send channel registration data as a response to receiving client channel registration data ServerPlayNetworkingImpl.sendNoCheck(context.player(), HandshakePayload.CHANNEL, HandshakePayload.server()); - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ServerConnectionEvents.PLAY_READY.invoker().accept(context.server(), context.player()); + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) context.networkHandler(); + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ServerConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } @@ -40,8 +46,11 @@ public void initClient() { ClientPlayNetworkingImpl.setUpPacketFactory((channel, data) -> new CustomPayloadC2SPacket(StringChannelIdentifierParser.toString(channel), PacketBuffers.unwrapped(data))); ClientPlayNetworkingImpl.registerListener(HandshakePayload.CHANNEL, HandshakePayload::new, (context, payload) -> { - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ClientConnectionEvents.PLAY_READY.invoker().accept(context.minecraft()); + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) context.networkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ClientConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } diff --git a/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java new file mode 100644 index 00000000..e067a183 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +public interface ClientNetworkHandlerAccess extends NetworkHandlerAccess { + + ClientConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java new file mode 100644 index 00000000..1d596400 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +public interface ServerNetworkHandlerAccess extends NetworkHandlerAccess { + + ServerConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java index ef5dbdfb..e43da06c 100644 --- a/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -1,5 +1,6 @@ package net.ornithemc.osl.networking.impl.mixin.client; +import java.net.SocketAddress; import java.util.LinkedHashSet; import java.util.Set; @@ -13,23 +14,36 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.network.handler.ClientPlayNetworkHandler; +import net.minecraft.network.Connection; import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; +import net.minecraft.network.packet.s2c.play.DisconnectS2CPacket; +import net.minecraft.server.integrated.IntegratedServer; +import net.minecraft.text.Text; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.AddressParser; import net.ornithemc.osl.networking.impl.HandshakePayload; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ClientPlayNetworkHandler.class) -public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { +public class ClientPlayNetworkHandlerMixin implements ClientNetworkHandlerAccess { - @Shadow @Final private Minecraft minecraft; + @Shadow @Final + private Minecraft minecraft; + @Shadow @Final + private Connection connection; + @Unique + private ClientConnectionContext connectionContext; /** * Channels that the server is listening to. */ - @Unique private Set serverChannels; + @Unique + private Set serverChannels; @Inject( method = "handleLogin", @@ -38,10 +52,34 @@ public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { ) ) private void osl$networking$handleLogin(CallbackInfo ci) { + if (minecraft.isIntegratedServerRunning()) { + IntegratedServer server = minecraft.getServer(); + String worldName = server.getWorldName(); + + connectionContext = new ClientConnectionContext(minecraft, worldName); + } else { + SocketAddress address = connection.getAddress(); + + String serverAddress = AddressParser.getAddress(address); + int serverPort = AddressParser.getPort(address); + + connectionContext = new ClientConnectionContext(minecraft, serverAddress, serverPort); + } + // send channel registration data as soon as login occurs ClientPlayNetworkingImpl.sendNoCheck(HandshakePayload.CHANNEL, HandshakePayload.client()); - ClientConnectionEvents.LOGIN.invoker().accept(minecraft); + ClientConnectionEvents.LOGIN.invoker().accept(connectionContext); + } + + @Inject( + method = "handleDisconnect", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(DisconnectS2CPacket packet, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(packet.getReason())); } @Inject( @@ -50,9 +88,8 @@ public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ClientConnectionEvents.DISCONNECT.invoker().accept(minecraft); - serverChannels = null; + private void osl$networking$handleDisconnect(Text reason, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(reason)); } @Inject( @@ -68,6 +105,11 @@ public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { } } + @Override + public ClientConnectionContext osl$networking$connectionContext() { + return connectionContext; + } + @Override public boolean osl$networking$isPlayReady() { return serverChannels != null; diff --git a/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java b/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java new file mode 100644 index 00000000..a53f875a --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java @@ -0,0 +1,40 @@ +package net.ornithemc.osl.networking.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.network.handler.ClientPlayNetworkHandler; +import net.minecraft.client.world.ClientWorld; + +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +@Mixin(Minecraft.class) +public class MinecraftMixin { + + @Shadow + private ClientWorld world; + + @Shadow + private ClientPlayNetworkHandler getNetworkHandler() { return null; } + + @Inject( + method = "setWorld(Lnet/minecraft/client/world/ClientWorld;Ljava/lang/String;)V", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$disconnect(ClientWorld world, String title, CallbackInfo ci) { + if (this.world != null && world == null) { + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) getNetworkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ClientConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java b/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java new file mode 100644 index 00000000..7f4d6740 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java @@ -0,0 +1,50 @@ +package net.ornithemc.osl.networking.impl.mixin.common; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.entity.living.player.ServerPlayerEntity; + +import net.ornithemc.osl.core.impl.util.MinecraftVersion; +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin { + + private static final boolean INTEGRATED_SERVER_REMOVES_PLAYERS_ON_STOP = MinecraftVersion.resolve().compareTo("14w06a") >= 0; + + @Shadow + private PlayerManager playerManager; + + @Shadow + private boolean isDedicated() { return false; } + + @Inject( + method = "stop", + at = @At( + value = "TAIL" + ) + ) + private void osl$networking$stop(CallbackInfo ci) { + if (!INTEGRATED_SERVER_REMOVES_PLAYERS_ON_STOP || this.isDedicated()) { + @SuppressWarnings("unchecked") + List players = (List) this.playerManager.players; + + for (ServerPlayerEntity player : players) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } + } +} diff --git a/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java b/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java index 77688e80..463dde8b 100644 --- a/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java +++ b/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java @@ -1,5 +1,7 @@ package net.ornithemc.osl.networking.impl.mixin.common; +import java.util.List; + import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -14,11 +16,15 @@ import net.minecraft.server.entity.living.player.ServerPlayerEntity; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; +import net.ornithemc.osl.networking.impl.access.PlayerManagerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; @Mixin(PlayerManager.class) -public class PlayerManagerMixin { +public class PlayerManagerMixin implements PlayerManagerAccess { @Shadow @Final private MinecraftServer server; + @Shadow @Final private List players; @Inject( method = "onLogin", @@ -27,6 +33,27 @@ public class PlayerManagerMixin { ) ) private void osl$networking$handleLogin(CallbackInfo ci, @Local ServerPlayerEntity player) { - ServerConnectionEvents.LOGIN.invoker().accept(server, player); + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.LOGIN.invoker().accept(connectionContext); + } + + @Inject( + method = "remove", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(CallbackInfo ci, @Local ServerPlayerEntity player) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + + @Override + public List osl$networking$getAll() { + return players; } } diff --git a/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java index ac66d440..270f4b80 100644 --- a/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java @@ -15,22 +15,40 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.entity.living.player.ServerPlayerEntity; import net.minecraft.server.network.handler.ServerPlayNetworkHandler; +import net.minecraft.text.Text; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; -import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ServerPlayNetworkHandler.class) -public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { +public class ServerPlayNetworkHandlerMixin implements ServerNetworkHandlerAccess { - @Shadow @Final private MinecraftServer server; - @Shadow @Final private ServerPlayerEntity player; + @Shadow @Final + private MinecraftServer server; + @Shadow + private ServerPlayerEntity player; + + @Unique + private ServerConnectionContext connectionContext; /** * Channels that the client is listening to. */ - @Unique private Set clientChannels; + @Unique + private Set clientChannels; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$networking$initConnectionContext(CallbackInfo ci) { + connectionContext = new ServerConnectionContext(server, (ServerPlayNetworkHandler) (Object) this); + } @Inject( method = "onDisconnect", @@ -38,9 +56,8 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ServerConnectionEvents.DISCONNECT.invoker().accept(server, player); - clientChannels = null; + private void osl$networking$handleDisconnect(Text reason, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(reason)); } @Inject( @@ -56,6 +73,11 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { } } + @Override + public ServerConnectionContext osl$networking$connectionContext() { + return connectionContext; + } + @Override public boolean osl$networking$isPlayReady() { return clientChannels != null; diff --git a/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/resources/fabric.mod.json b/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/resources/fabric.mod.json index 7a03c9bf..b5b15263 100644 --- a/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/resources/fabric.mod.json +++ b/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/resources/fabric.mod.json @@ -23,6 +23,8 @@ "osl-core": "\u003e\u003d0.7.0", "osl-entrypoints": "\u003e\u003d0.5.0", "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.9.0" }, "name": "OSL Networking Implementation", diff --git a/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/resources/osl.networking-impl.mixins.json b/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/resources/osl.networking-impl.mixins.json index 24982b35..7d6b73fe 100644 --- a/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/resources/osl.networking-impl.mixins.json +++ b/libraries/networking-impl/networking-impl-mc13w41a-mc14w20b/src/main/resources/osl.networking-impl.mixins.json @@ -7,11 +7,13 @@ "common.ConnectionMixin", "common.CustomPayloadC2SPacketMixin", "common.CustomPayloadS2CPacketMixin", + "common.MinecraftServerMixin", "common.PlayerManagerMixin", "common.ServerPlayNetworkHandlerMixin" ], "client": [ - "client.ClientPlayNetworkHandlerMixin" + "client.ClientPlayNetworkHandlerMixin", + "client.MinecraftMixin" ], "server": [ ], diff --git a/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/Networking.java b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/Networking.java index 10f44a33..3aea1c46 100644 --- a/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/Networking.java +++ b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/Networking.java @@ -12,8 +12,11 @@ import net.ornithemc.osl.networking.api.StringChannelIdentifierParser; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; public class Networking implements ModInitializer, ClientModInitializer, ServerModInitializer { @@ -28,8 +31,11 @@ public void init() { // send channel registration data as a response to receiving client channel registration data ServerPlayNetworkingImpl.sendNoCheck(context.player(), HandshakePayload.CHANNEL, HandshakePayload.server()); - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ServerConnectionEvents.PLAY_READY.invoker().accept(context.server(), context.player()); + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) context.networkHandler(); + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ServerConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } @@ -40,8 +46,11 @@ public void initClient() { ClientPlayNetworkingImpl.setUpPacketFactory((channel, data) -> new CustomPayloadC2SPacket(StringChannelIdentifierParser.toString(channel), PacketBuffers.unwrapped(data))); ClientPlayNetworkingImpl.registerListener(HandshakePayload.CHANNEL, HandshakePayload::new, (context, payload) -> { - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ClientConnectionEvents.PLAY_READY.invoker().accept(context.minecraft()); + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) context.networkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ClientConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } diff --git a/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java new file mode 100644 index 00000000..e067a183 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +public interface ClientNetworkHandlerAccess extends NetworkHandlerAccess { + + ClientConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java new file mode 100644 index 00000000..1d596400 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +public interface ServerNetworkHandlerAccess extends NetworkHandlerAccess { + + ServerConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java index ef5dbdfb..e43da06c 100644 --- a/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -1,5 +1,6 @@ package net.ornithemc.osl.networking.impl.mixin.client; +import java.net.SocketAddress; import java.util.LinkedHashSet; import java.util.Set; @@ -13,23 +14,36 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.network.handler.ClientPlayNetworkHandler; +import net.minecraft.network.Connection; import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; +import net.minecraft.network.packet.s2c.play.DisconnectS2CPacket; +import net.minecraft.server.integrated.IntegratedServer; +import net.minecraft.text.Text; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.AddressParser; import net.ornithemc.osl.networking.impl.HandshakePayload; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ClientPlayNetworkHandler.class) -public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { +public class ClientPlayNetworkHandlerMixin implements ClientNetworkHandlerAccess { - @Shadow @Final private Minecraft minecraft; + @Shadow @Final + private Minecraft minecraft; + @Shadow @Final + private Connection connection; + @Unique + private ClientConnectionContext connectionContext; /** * Channels that the server is listening to. */ - @Unique private Set serverChannels; + @Unique + private Set serverChannels; @Inject( method = "handleLogin", @@ -38,10 +52,34 @@ public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { ) ) private void osl$networking$handleLogin(CallbackInfo ci) { + if (minecraft.isIntegratedServerRunning()) { + IntegratedServer server = minecraft.getServer(); + String worldName = server.getWorldName(); + + connectionContext = new ClientConnectionContext(minecraft, worldName); + } else { + SocketAddress address = connection.getAddress(); + + String serverAddress = AddressParser.getAddress(address); + int serverPort = AddressParser.getPort(address); + + connectionContext = new ClientConnectionContext(minecraft, serverAddress, serverPort); + } + // send channel registration data as soon as login occurs ClientPlayNetworkingImpl.sendNoCheck(HandshakePayload.CHANNEL, HandshakePayload.client()); - ClientConnectionEvents.LOGIN.invoker().accept(minecraft); + ClientConnectionEvents.LOGIN.invoker().accept(connectionContext); + } + + @Inject( + method = "handleDisconnect", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(DisconnectS2CPacket packet, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(packet.getReason())); } @Inject( @@ -50,9 +88,8 @@ public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ClientConnectionEvents.DISCONNECT.invoker().accept(minecraft); - serverChannels = null; + private void osl$networking$handleDisconnect(Text reason, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(reason)); } @Inject( @@ -68,6 +105,11 @@ public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { } } + @Override + public ClientConnectionContext osl$networking$connectionContext() { + return connectionContext; + } + @Override public boolean osl$networking$isPlayReady() { return serverChannels != null; diff --git a/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java index 1b011d9d..a53f875a 100644 --- a/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java +++ b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java @@ -1,18 +1,40 @@ package net.ornithemc.osl.networking.impl.mixin.client; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.client.Minecraft; -import net.minecraft.util.BlockableEventLoop; +import net.minecraft.client.network.handler.ClientPlayNetworkHandler; +import net.minecraft.client.world.ClientWorld; -import net.ornithemc.osl.networking.impl.access.TaskRunnerAccess; +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; @Mixin(Minecraft.class) -public abstract class MinecraftMixin implements BlockableEventLoop, TaskRunnerAccess { +public class MinecraftMixin { - @Override - public boolean osl$networking$submit(Runnable task) { - this.executeTask(task); - return true; + @Shadow + private ClientWorld world; + + @Shadow + private ClientPlayNetworkHandler getNetworkHandler() { return null; } + + @Inject( + method = "setWorld(Lnet/minecraft/client/world/ClientWorld;Ljava/lang/String;)V", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$disconnect(ClientWorld world, String title, CallbackInfo ci) { + if (this.world != null && world == null) { + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) getNetworkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ClientConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } } } diff --git a/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java deleted file mode 100644 index acd027e0..00000000 --- a/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.ornithemc.osl.networking.impl.mixin.common; - -import org.spongepowered.asm.mixin.Mixin; - -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.BlockableEventLoop; - -import net.ornithemc.osl.networking.impl.access.TaskRunnerAccess; - -@Mixin(MinecraftServer.class) -public abstract class MinecraftServerMixin implements BlockableEventLoop, TaskRunnerAccess { - - @Override - public boolean osl$networking$submit(Runnable task) { - this.executeTask(task); - return true; - } -} diff --git a/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java index e88d1f5a..463dde8b 100644 --- a/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java +++ b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java @@ -9,13 +9,16 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.network.Connection; +import com.llamalad7.mixinextras.sugar.Local; + import net.minecraft.server.MinecraftServer; import net.minecraft.server.PlayerManager; import net.minecraft.server.entity.living.player.ServerPlayerEntity; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; import net.ornithemc.osl.networking.impl.access.PlayerManagerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; @Mixin(PlayerManager.class) public class PlayerManagerMixin implements PlayerManagerAccess { @@ -29,8 +32,24 @@ public class PlayerManagerMixin implements PlayerManagerAccess { value = "TAIL" ) ) - private void osl$networking$handleLogin(Connection connection, ServerPlayerEntity player, CallbackInfo ci) { - ServerConnectionEvents.LOGIN.invoker().accept(server, player); + private void osl$networking$handleLogin(CallbackInfo ci, @Local ServerPlayerEntity player) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.LOGIN.invoker().accept(connectionContext); + } + + @Inject( + method = "remove", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(CallbackInfo ci, @Local ServerPlayerEntity player) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.DISCONNECT.invoker().accept(connectionContext); } @Override diff --git a/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java index ac66d440..270f4b80 100644 --- a/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java @@ -15,22 +15,40 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.entity.living.player.ServerPlayerEntity; import net.minecraft.server.network.handler.ServerPlayNetworkHandler; +import net.minecraft.text.Text; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; -import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ServerPlayNetworkHandler.class) -public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { +public class ServerPlayNetworkHandlerMixin implements ServerNetworkHandlerAccess { - @Shadow @Final private MinecraftServer server; - @Shadow @Final private ServerPlayerEntity player; + @Shadow @Final + private MinecraftServer server; + @Shadow + private ServerPlayerEntity player; + + @Unique + private ServerConnectionContext connectionContext; /** * Channels that the client is listening to. */ - @Unique private Set clientChannels; + @Unique + private Set clientChannels; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$networking$initConnectionContext(CallbackInfo ci) { + connectionContext = new ServerConnectionContext(server, (ServerPlayNetworkHandler) (Object) this); + } @Inject( method = "onDisconnect", @@ -38,9 +56,8 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ServerConnectionEvents.DISCONNECT.invoker().accept(server, player); - clientChannels = null; + private void osl$networking$handleDisconnect(Text reason, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(reason)); } @Inject( @@ -56,6 +73,11 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { } } + @Override + public ServerConnectionContext osl$networking$connectionContext() { + return connectionContext; + } + @Override public boolean osl$networking$isPlayReady() { return clientChannels != null; diff --git a/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/MinecraftServerMixin.java b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/MinecraftServerMixin.java new file mode 100644 index 00000000..cc6cfb48 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/MinecraftServerMixin.java @@ -0,0 +1,42 @@ +package net.ornithemc.osl.networking.impl.mixin.server; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.entity.living.player.ServerPlayerEntity; + +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin { + + @Shadow + private PlayerManager playerManager; + + @Inject( + method = "stop", + at = @At( + value = "TAIL" + ) + ) + private void osl$networking$stop(CallbackInfo ci) { + @SuppressWarnings("unchecked") + List players = (List) this.playerManager.players; + + for (ServerPlayerEntity player : players) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/resources/fabric.mod.json b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/resources/fabric.mod.json index ed03b064..074ccede 100644 --- a/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/resources/fabric.mod.json +++ b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/resources/fabric.mod.json @@ -23,6 +23,8 @@ "osl-core": "\u003e\u003d0.7.0", "osl-entrypoints": "\u003e\u003d0.5.0", "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.9.0" }, "name": "OSL Networking Implementation", diff --git a/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/resources/osl.networking-impl.mixins.json b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/resources/osl.networking-impl.mixins.json index f64bbc23..4c0a97f4 100644 --- a/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/resources/osl.networking-impl.mixins.json +++ b/libraries/networking-impl/networking-impl-mc14w21a-mc14w30c/src/main/resources/osl.networking-impl.mixins.json @@ -6,7 +6,6 @@ "mixins": [ "common.CustomPayloadC2SPacketMixin", "common.CustomPayloadS2CPacketMixin", - "common.MinecraftServerMixin", "common.PlayerManagerMixin", "common.ServerPlayNetworkHandlerMixin" ], @@ -15,6 +14,7 @@ "client.MinecraftMixin" ], "server": [ + "server.MinecraftServerMixin" ], "injectors": { "defaultRequire": 1 diff --git a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/Networking.java b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/Networking.java index 10f44a33..3aea1c46 100644 --- a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/Networking.java +++ b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/Networking.java @@ -12,8 +12,11 @@ import net.ornithemc.osl.networking.api.StringChannelIdentifierParser; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; public class Networking implements ModInitializer, ClientModInitializer, ServerModInitializer { @@ -28,8 +31,11 @@ public void init() { // send channel registration data as a response to receiving client channel registration data ServerPlayNetworkingImpl.sendNoCheck(context.player(), HandshakePayload.CHANNEL, HandshakePayload.server()); - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ServerConnectionEvents.PLAY_READY.invoker().accept(context.server(), context.player()); + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) context.networkHandler(); + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ServerConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } @@ -40,8 +46,11 @@ public void initClient() { ClientPlayNetworkingImpl.setUpPacketFactory((channel, data) -> new CustomPayloadC2SPacket(StringChannelIdentifierParser.toString(channel), PacketBuffers.unwrapped(data))); ClientPlayNetworkingImpl.registerListener(HandshakePayload.CHANNEL, HandshakePayload::new, (context, payload) -> { - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ClientConnectionEvents.PLAY_READY.invoker().accept(context.minecraft()); + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) context.networkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ClientConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } diff --git a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/NetworkingMixinPlugin.java b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/NetworkingMixinPlugin.java new file mode 100644 index 00000000..cbf86c51 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/NetworkingMixinPlugin.java @@ -0,0 +1,58 @@ +package net.ornithemc.osl.networking.impl; + +import java.util.List; +import java.util.Set; + +import org.objectweb.asm.tree.ClassNode; + +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import net.ornithemc.osl.core.impl.util.MinecraftVersion; + +public class NetworkingMixinPlugin implements IMixinConfigPlugin { + + public static final boolean MINECRAFT_SET_WORLD_HAS_SCREEN_PARAMETER = MinecraftVersion.resolve().compareTo("18w15a") >= 0; + public static final boolean MINECRAFT_SET_WORLD_HAS_TITLE_PARAMETER = MinecraftVersion.resolve().compareTo("17w50a") <= 0; + + @Override + public void onLoad(String mixinPackage) { + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + if ("net.ornithemc.osl.networking.impl.mixin.client.MinecraftMixinNew".equals(mixinClassName)) { + return MINECRAFT_SET_WORLD_HAS_SCREEN_PARAMETER; + } + if ("net.ornithemc.osl.networking.impl.mixin.client.MinecraftMixinMid".equals(mixinClassName)) { + return !MINECRAFT_SET_WORLD_HAS_SCREEN_PARAMETER && !MINECRAFT_SET_WORLD_HAS_TITLE_PARAMETER; + } + if ("net.ornithemc.osl.networking.impl.mixin.client.MinecraftMixinOld".equals(mixinClassName)) { + return MINECRAFT_SET_WORLD_HAS_TITLE_PARAMETER; + } + + return true; + } + + @Override + public void acceptTargets(Set myTargets, Set otherTargets) { + } + + @Override + public List getMixins() { + return null; + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + } + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + } +} diff --git a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java new file mode 100644 index 00000000..e067a183 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +public interface ClientNetworkHandlerAccess extends NetworkHandlerAccess { + + ClientConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java new file mode 100644 index 00000000..1d596400 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +public interface ServerNetworkHandlerAccess extends NetworkHandlerAccess { + + ServerConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java index ef5dbdfb..e43da06c 100644 --- a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -1,5 +1,6 @@ package net.ornithemc.osl.networking.impl.mixin.client; +import java.net.SocketAddress; import java.util.LinkedHashSet; import java.util.Set; @@ -13,23 +14,36 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.network.handler.ClientPlayNetworkHandler; +import net.minecraft.network.Connection; import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; +import net.minecraft.network.packet.s2c.play.DisconnectS2CPacket; +import net.minecraft.server.integrated.IntegratedServer; +import net.minecraft.text.Text; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.AddressParser; import net.ornithemc.osl.networking.impl.HandshakePayload; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ClientPlayNetworkHandler.class) -public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { +public class ClientPlayNetworkHandlerMixin implements ClientNetworkHandlerAccess { - @Shadow @Final private Minecraft minecraft; + @Shadow @Final + private Minecraft minecraft; + @Shadow @Final + private Connection connection; + @Unique + private ClientConnectionContext connectionContext; /** * Channels that the server is listening to. */ - @Unique private Set serverChannels; + @Unique + private Set serverChannels; @Inject( method = "handleLogin", @@ -38,10 +52,34 @@ public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { ) ) private void osl$networking$handleLogin(CallbackInfo ci) { + if (minecraft.isIntegratedServerRunning()) { + IntegratedServer server = minecraft.getServer(); + String worldName = server.getWorldName(); + + connectionContext = new ClientConnectionContext(minecraft, worldName); + } else { + SocketAddress address = connection.getAddress(); + + String serverAddress = AddressParser.getAddress(address); + int serverPort = AddressParser.getPort(address); + + connectionContext = new ClientConnectionContext(minecraft, serverAddress, serverPort); + } + // send channel registration data as soon as login occurs ClientPlayNetworkingImpl.sendNoCheck(HandshakePayload.CHANNEL, HandshakePayload.client()); - ClientConnectionEvents.LOGIN.invoker().accept(minecraft); + ClientConnectionEvents.LOGIN.invoker().accept(connectionContext); + } + + @Inject( + method = "handleDisconnect", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(DisconnectS2CPacket packet, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(packet.getReason())); } @Inject( @@ -50,9 +88,8 @@ public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ClientConnectionEvents.DISCONNECT.invoker().accept(minecraft); - serverChannels = null; + private void osl$networking$handleDisconnect(Text reason, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(reason)); } @Inject( @@ -68,6 +105,11 @@ public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { } } + @Override + public ClientConnectionContext osl$networking$connectionContext() { + return connectionContext; + } + @Override public boolean osl$networking$isPlayReady() { return serverChannels != null; diff --git a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java deleted file mode 100644 index 1b011d9d..00000000 --- a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.ornithemc.osl.networking.impl.mixin.client; - -import org.spongepowered.asm.mixin.Mixin; - -import net.minecraft.client.Minecraft; -import net.minecraft.util.BlockableEventLoop; - -import net.ornithemc.osl.networking.impl.access.TaskRunnerAccess; - -@Mixin(Minecraft.class) -public abstract class MinecraftMixin implements BlockableEventLoop, TaskRunnerAccess { - - @Override - public boolean osl$networking$submit(Runnable task) { - this.executeTask(task); - return true; - } -} diff --git a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixinMid.java b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixinMid.java new file mode 100644 index 00000000..48b12988 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixinMid.java @@ -0,0 +1,40 @@ +package net.ornithemc.osl.networking.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.network.handler.ClientPlayNetworkHandler; +import net.minecraft.client.world.ClientWorld; + +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +@Mixin(Minecraft.class) +public class MinecraftMixinMid { + + @Shadow + private ClientWorld world; + + @Shadow + private ClientPlayNetworkHandler getNetworkHandler() { return null; } + + @Inject( + method = "m_85741928", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$disconnect(ClientWorld world, CallbackInfo ci) { + if (this.world != null && world == null) { + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) getNetworkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ClientConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixinNew.java b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixinNew.java new file mode 100644 index 00000000..5b88c3f5 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixinNew.java @@ -0,0 +1,41 @@ +package net.ornithemc.osl.networking.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.network.handler.ClientPlayNetworkHandler; +import net.minecraft.client.world.ClientWorld; + +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +@Mixin(Minecraft.class) +public class MinecraftMixinNew { + + @Shadow + private ClientWorld world; + + @Shadow + private ClientPlayNetworkHandler getNetworkHandler() { return null; } + + @Inject( + method = "setWorld(Lnet/minecraft/client/world/ClientWorld;Lnet/minecraft/client/gui/screen/Screen;)V", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$disconnect(ClientWorld world, Screen screen, CallbackInfo ci) { + if (this.world != null && world == null) { + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) getNetworkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ClientConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixinOld.java b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixinOld.java new file mode 100644 index 00000000..f055ed64 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixinOld.java @@ -0,0 +1,40 @@ +package net.ornithemc.osl.networking.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.network.handler.ClientPlayNetworkHandler; +import net.minecraft.client.world.ClientWorld; + +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +@Mixin(Minecraft.class) +public class MinecraftMixinOld { + + @Shadow + private ClientWorld world; + + @Shadow + private ClientPlayNetworkHandler getNetworkHandler() { return null; } + + @Inject( + method = "m_49232044", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$disconnect(ClientWorld world, String title, CallbackInfo ci) { + if (this.world != null && world == null) { + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) getNetworkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ClientConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java deleted file mode 100644 index acd027e0..00000000 --- a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.ornithemc.osl.networking.impl.mixin.common; - -import org.spongepowered.asm.mixin.Mixin; - -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.BlockableEventLoop; - -import net.ornithemc.osl.networking.impl.access.TaskRunnerAccess; - -@Mixin(MinecraftServer.class) -public abstract class MinecraftServerMixin implements BlockableEventLoop, TaskRunnerAccess { - - @Override - public boolean osl$networking$submit(Runnable task) { - this.executeTask(task); - return true; - } -} diff --git a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java index e88d1f5a..463dde8b 100644 --- a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java +++ b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java @@ -9,13 +9,16 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.network.Connection; +import com.llamalad7.mixinextras.sugar.Local; + import net.minecraft.server.MinecraftServer; import net.minecraft.server.PlayerManager; import net.minecraft.server.entity.living.player.ServerPlayerEntity; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; import net.ornithemc.osl.networking.impl.access.PlayerManagerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; @Mixin(PlayerManager.class) public class PlayerManagerMixin implements PlayerManagerAccess { @@ -29,8 +32,24 @@ public class PlayerManagerMixin implements PlayerManagerAccess { value = "TAIL" ) ) - private void osl$networking$handleLogin(Connection connection, ServerPlayerEntity player, CallbackInfo ci) { - ServerConnectionEvents.LOGIN.invoker().accept(server, player); + private void osl$networking$handleLogin(CallbackInfo ci, @Local ServerPlayerEntity player) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.LOGIN.invoker().accept(connectionContext); + } + + @Inject( + method = "remove", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(CallbackInfo ci, @Local ServerPlayerEntity player) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.DISCONNECT.invoker().accept(connectionContext); } @Override diff --git a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java index ac66d440..270f4b80 100644 --- a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java @@ -15,22 +15,40 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.entity.living.player.ServerPlayerEntity; import net.minecraft.server.network.handler.ServerPlayNetworkHandler; +import net.minecraft.text.Text; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; -import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ServerPlayNetworkHandler.class) -public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { +public class ServerPlayNetworkHandlerMixin implements ServerNetworkHandlerAccess { - @Shadow @Final private MinecraftServer server; - @Shadow @Final private ServerPlayerEntity player; + @Shadow @Final + private MinecraftServer server; + @Shadow + private ServerPlayerEntity player; + + @Unique + private ServerConnectionContext connectionContext; /** * Channels that the client is listening to. */ - @Unique private Set clientChannels; + @Unique + private Set clientChannels; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$networking$initConnectionContext(CallbackInfo ci) { + connectionContext = new ServerConnectionContext(server, (ServerPlayNetworkHandler) (Object) this); + } @Inject( method = "onDisconnect", @@ -38,9 +56,8 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ServerConnectionEvents.DISCONNECT.invoker().accept(server, player); - clientChannels = null; + private void osl$networking$handleDisconnect(Text reason, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(reason)); } @Inject( @@ -56,6 +73,11 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { } } + @Override + public ServerConnectionContext osl$networking$connectionContext() { + return connectionContext; + } + @Override public boolean osl$networking$isPlayReady() { return clientChannels != null; diff --git a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/MinecraftServerMixin.java b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/MinecraftServerMixin.java new file mode 100644 index 00000000..3c389c76 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/MinecraftServerMixin.java @@ -0,0 +1,42 @@ +package net.ornithemc.osl.networking.impl.mixin.server; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.entity.living.player.ServerPlayerEntity; + +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; +import net.ornithemc.osl.networking.impl.access.PlayerManagerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin { + + @Shadow + private PlayerManager playerManager; + + @Inject( + method = "stop", + at = @At( + value = "TAIL" + ) + ) + private void osl$networking$stop(CallbackInfo ci) { + List players = ((PlayerManagerAccess) this.playerManager).osl$networking$getAll(); + + for (ServerPlayerEntity player : players) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/resources/fabric.mod.json b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/resources/fabric.mod.json index 34f9bebd..6bdb081e 100644 --- a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/resources/fabric.mod.json +++ b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/resources/fabric.mod.json @@ -23,6 +23,8 @@ "osl-core": "\u003e\u003d0.7.0", "osl-entrypoints": "\u003e\u003d0.5.0", "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.9.0" }, "name": "OSL Networking Implementation", diff --git a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/resources/osl.networking-impl.mixins.json b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/resources/osl.networking-impl.mixins.json index f64bbc23..d4dcc4aa 100644 --- a/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/resources/osl.networking-impl.mixins.json +++ b/libraries/networking-impl/networking-impl-mc14w31a-mc1.13-pre2/src/main/resources/osl.networking-impl.mixins.json @@ -3,18 +3,21 @@ "minVersion": "0.8", "package": "net.ornithemc.osl.networking.impl.mixin", "compatibilityLevel": "JAVA_8", + "plugin": "net.ornithemc.osl.networking.impl.NetworkingMixinPlugin", "mixins": [ "common.CustomPayloadC2SPacketMixin", "common.CustomPayloadS2CPacketMixin", - "common.MinecraftServerMixin", "common.PlayerManagerMixin", "common.ServerPlayNetworkHandlerMixin" ], "client": [ "client.ClientPlayNetworkHandlerMixin", - "client.MinecraftMixin" + "client.MinecraftMixinMid", + "client.MinecraftMixinNew", + "client.MinecraftMixinOld" ], "server": [ + "server.MinecraftServerMixin" ], "injectors": { "defaultRequire": 1 diff --git a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/Networking.java b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/Networking.java index 2785b5e8..9bc0ddf8 100644 --- a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/Networking.java +++ b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/Networking.java @@ -12,8 +12,11 @@ import net.ornithemc.osl.networking.api.PacketBuffers; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; public class Networking implements ModInitializer, ClientModInitializer, ServerModInitializer { @@ -28,8 +31,11 @@ public void init() { // send channel registration data as a response to receiving client channel registration data ServerPlayNetworkingImpl.sendNoCheck(context.player(), HandshakePayload.CHANNEL, HandshakePayload.server()); - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ServerConnectionEvents.PLAY_READY.invoker().accept(context.server(), context.player()); + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) context.networkHandler(); + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ServerConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } @@ -40,8 +46,11 @@ public void initClient() { ClientPlayNetworkingImpl.setUpPacketFactory((channel, data) -> new CustomPayloadC2SPacket(IdentifierChannelIdentifierParser.toIdentifier(channel), PacketBuffers.unwrapped(data))); ClientPlayNetworkingImpl.registerListener(HandshakePayload.CHANNEL, HandshakePayload::new, (context, payload) -> { - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ClientConnectionEvents.PLAY_READY.invoker().accept(context.minecraft()); + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) context.networkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ClientConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } diff --git a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/NetworkingMixinPlugin.java b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/NetworkingMixinPlugin.java new file mode 100644 index 00000000..0e280793 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/NetworkingMixinPlugin.java @@ -0,0 +1,54 @@ +package net.ornithemc.osl.networking.impl; + +import java.util.List; +import java.util.Set; + +import org.objectweb.asm.tree.ClassNode; + +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import net.ornithemc.osl.core.impl.util.MinecraftVersion; + +public class NetworkingMixinPlugin implements IMixinConfigPlugin { + + public static final boolean MINECRAFT_DISCONNECT_METHOD_EXISTS = MinecraftVersion.resolve().compareTo("19w06a") >= 0; + + @Override + public void onLoad(String mixinPackage) { + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + if ("net.ornithemc.osl.networking.impl.mixin.client.MinecraftMixinNew".equals(mixinClassName)) { + return MINECRAFT_DISCONNECT_METHOD_EXISTS; + } + if ("net.ornithemc.osl.networking.impl.mixin.client.MinecraftMixinOld".equals(mixinClassName)) { + return !MINECRAFT_DISCONNECT_METHOD_EXISTS; + } + + return true; + } + + @Override + public void acceptTargets(Set myTargets, Set otherTargets) { + } + + @Override + public List getMixins() { + return null; + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + } + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + } +} diff --git a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java new file mode 100644 index 00000000..e067a183 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +public interface ClientNetworkHandlerAccess extends NetworkHandlerAccess { + + ClientConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java new file mode 100644 index 00000000..1d596400 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +public interface ServerNetworkHandlerAccess extends NetworkHandlerAccess { + + ServerConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java index ef5dbdfb..e43da06c 100644 --- a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -1,5 +1,6 @@ package net.ornithemc.osl.networking.impl.mixin.client; +import java.net.SocketAddress; import java.util.LinkedHashSet; import java.util.Set; @@ -13,23 +14,36 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.network.handler.ClientPlayNetworkHandler; +import net.minecraft.network.Connection; import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; +import net.minecraft.network.packet.s2c.play.DisconnectS2CPacket; +import net.minecraft.server.integrated.IntegratedServer; +import net.minecraft.text.Text; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.AddressParser; import net.ornithemc.osl.networking.impl.HandshakePayload; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ClientPlayNetworkHandler.class) -public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { +public class ClientPlayNetworkHandlerMixin implements ClientNetworkHandlerAccess { - @Shadow @Final private Minecraft minecraft; + @Shadow @Final + private Minecraft minecraft; + @Shadow @Final + private Connection connection; + @Unique + private ClientConnectionContext connectionContext; /** * Channels that the server is listening to. */ - @Unique private Set serverChannels; + @Unique + private Set serverChannels; @Inject( method = "handleLogin", @@ -38,10 +52,34 @@ public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { ) ) private void osl$networking$handleLogin(CallbackInfo ci) { + if (minecraft.isIntegratedServerRunning()) { + IntegratedServer server = minecraft.getServer(); + String worldName = server.getWorldName(); + + connectionContext = new ClientConnectionContext(minecraft, worldName); + } else { + SocketAddress address = connection.getAddress(); + + String serverAddress = AddressParser.getAddress(address); + int serverPort = AddressParser.getPort(address); + + connectionContext = new ClientConnectionContext(minecraft, serverAddress, serverPort); + } + // send channel registration data as soon as login occurs ClientPlayNetworkingImpl.sendNoCheck(HandshakePayload.CHANNEL, HandshakePayload.client()); - ClientConnectionEvents.LOGIN.invoker().accept(minecraft); + ClientConnectionEvents.LOGIN.invoker().accept(connectionContext); + } + + @Inject( + method = "handleDisconnect", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(DisconnectS2CPacket packet, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(packet.getReason())); } @Inject( @@ -50,9 +88,8 @@ public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ClientConnectionEvents.DISCONNECT.invoker().accept(minecraft); - serverChannels = null; + private void osl$networking$handleDisconnect(Text reason, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(reason)); } @Inject( @@ -68,6 +105,11 @@ public class ClientPlayNetworkHandlerMixin implements NetworkHandlerAccess { } } + @Override + public ClientConnectionContext osl$networking$connectionContext() { + return connectionContext; + } + @Override public boolean osl$networking$isPlayReady() { return serverChannels != null; diff --git a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java deleted file mode 100644 index 2749c72d..00000000 --- a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.ornithemc.osl.networking.impl.mixin.client; - -import org.spongepowered.asm.mixin.Mixin; - -import net.minecraft.client.Minecraft; -import net.minecraft.util.BlockableEventLoop; - -import net.ornithemc.osl.networking.impl.access.TaskRunnerAccess; - -@Mixin(Minecraft.class) -public abstract class MinecraftMixin extends BlockableEventLoop implements TaskRunnerAccess { - - private MinecraftMixin(String name) { - super(name); - } - - @Override - public boolean osl$networking$submit(Runnable task) { - this.execute(task); - return true; - } -} diff --git a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixinNew.java b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixinNew.java new file mode 100644 index 00000000..c31e69f0 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixinNew.java @@ -0,0 +1,40 @@ +package net.ornithemc.osl.networking.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.network.handler.ClientPlayNetworkHandler; +import net.minecraft.client.world.ClientWorld; + +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +@Mixin(Minecraft.class) +public class MinecraftMixinNew { + + @Shadow + private ClientWorld world; + + @Shadow + private ClientPlayNetworkHandler getNetworkHandler() { return null; } + + @Inject( + method = "m_62273487", // disconnect + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$disconnect(CallbackInfo ci) { + if (world != null) { + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) getNetworkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ClientConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixinOld.java b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixinOld.java new file mode 100644 index 00000000..e01c0f43 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixinOld.java @@ -0,0 +1,41 @@ +package net.ornithemc.osl.networking.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.network.handler.ClientPlayNetworkHandler; +import net.minecraft.client.world.ClientWorld; + +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +@Mixin(Minecraft.class) +public class MinecraftMixinOld { + + @Shadow + private ClientWorld world; + + @Shadow + private ClientPlayNetworkHandler getNetworkHandler() { return null; } + + @Inject( + method = "m_62116716", // setWorld + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$disconnect(ClientWorld world, Screen screen, CallbackInfo ci) { + if (this.world != null && world == null) { + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) getNetworkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ClientConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java deleted file mode 100644 index eb2bc2be..00000000 --- a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/MinecraftServerMixin.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.ornithemc.osl.networking.impl.mixin.common; - -import org.spongepowered.asm.mixin.Mixin; - -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.BlockableEventLoop; - -import net.ornithemc.osl.networking.impl.access.TaskRunnerAccess; - -@Mixin(MinecraftServer.class) -public abstract class MinecraftServerMixin extends BlockableEventLoop implements TaskRunnerAccess { - - private MinecraftServerMixin(String name) { - super(name); - } - - @Override - public boolean osl$networking$submit(Runnable task) { - this.execute(task); - return true; - } -} diff --git a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java index eaca81eb..2f8c8bce 100644 --- a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java +++ b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/PlayerManagerMixin.java @@ -7,12 +7,15 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.network.Connection; +import com.llamalad7.mixinextras.sugar.Local; + import net.minecraft.server.MinecraftServer; import net.minecraft.server.PlayerManager; import net.minecraft.server.entity.living.player.ServerPlayerEntity; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; @Mixin(PlayerManager.class) public class PlayerManagerMixin { @@ -25,7 +28,23 @@ public class PlayerManagerMixin { value = "TAIL" ) ) - private void osl$networking$handleLogin(Connection connection, ServerPlayerEntity player, CallbackInfo ci) { - ServerConnectionEvents.LOGIN.invoker().accept(server, player); + private void osl$networking$handleLogin(CallbackInfo ci, @Local ServerPlayerEntity player) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.LOGIN.invoker().accept(connectionContext); + } + + @Inject( + method = "remove", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(CallbackInfo ci, @Local ServerPlayerEntity player) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.DISCONNECT.invoker().accept(connectionContext); } } diff --git a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java index ac66d440..270f4b80 100644 --- a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/common/ServerPlayNetworkHandlerMixin.java @@ -15,22 +15,40 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.entity.living.player.ServerPlayerEntity; import net.minecraft.server.network.handler.ServerPlayNetworkHandler; +import net.minecraft.text.Text; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; -import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ServerPlayNetworkHandler.class) -public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { +public class ServerPlayNetworkHandlerMixin implements ServerNetworkHandlerAccess { - @Shadow @Final private MinecraftServer server; - @Shadow @Final private ServerPlayerEntity player; + @Shadow @Final + private MinecraftServer server; + @Shadow + private ServerPlayerEntity player; + + @Unique + private ServerConnectionContext connectionContext; /** * Channels that the client is listening to. */ - @Unique private Set clientChannels; + @Unique + private Set clientChannels; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$networking$initConnectionContext(CallbackInfo ci) { + connectionContext = new ServerConnectionContext(server, (ServerPlayNetworkHandler) (Object) this); + } @Inject( method = "onDisconnect", @@ -38,9 +56,8 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ServerConnectionEvents.DISCONNECT.invoker().accept(server, player); - clientChannels = null; + private void osl$networking$handleDisconnect(Text reason, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(reason)); } @Inject( @@ -56,6 +73,11 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess { } } + @Override + public ServerConnectionContext osl$networking$connectionContext() { + return connectionContext; + } + @Override public boolean osl$networking$isPlayReady() { return clientChannels != null; diff --git a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/MinecraftServerMixin.java b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/MinecraftServerMixin.java new file mode 100644 index 00000000..3c389c76 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/MinecraftServerMixin.java @@ -0,0 +1,42 @@ +package net.ornithemc.osl.networking.impl.mixin.server; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.entity.living.player.ServerPlayerEntity; + +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; +import net.ornithemc.osl.networking.impl.access.PlayerManagerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin { + + @Shadow + private PlayerManager playerManager; + + @Inject( + method = "stop", + at = @At( + value = "TAIL" + ) + ) + private void osl$networking$stop(CallbackInfo ci) { + List players = ((PlayerManagerAccess) this.playerManager).osl$networking$getAll(); + + for (ServerPlayerEntity player : players) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/resources/fabric.mod.json b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/resources/fabric.mod.json index 0ab46b3f..932d872a 100644 --- a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/resources/fabric.mod.json +++ b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/resources/fabric.mod.json @@ -23,6 +23,8 @@ "osl-core": "\u003e\u003d0.7.0", "osl-entrypoints": "\u003e\u003d0.5.0", "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.9.0" }, "name": "OSL Networking Implementation", diff --git a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/resources/osl.networking-impl.mixins.json b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/resources/osl.networking-impl.mixins.json index f64bbc23..c71fb00f 100644 --- a/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/resources/osl.networking-impl.mixins.json +++ b/libraries/networking-impl/networking-impl-mc18w43a-mc1.14.4/src/main/resources/osl.networking-impl.mixins.json @@ -3,18 +3,20 @@ "minVersion": "0.8", "package": "net.ornithemc.osl.networking.impl.mixin", "compatibilityLevel": "JAVA_8", + "plugin": "net.ornithemc.osl.networking.impl.NetworkingMixinPlugin", "mixins": [ "common.CustomPayloadC2SPacketMixin", "common.CustomPayloadS2CPacketMixin", - "common.MinecraftServerMixin", "common.PlayerManagerMixin", "common.ServerPlayNetworkHandlerMixin" ], "client": [ "client.ClientPlayNetworkHandlerMixin", - "client.MinecraftMixin" + "client.MinecraftMixinNew", + "client.MinecraftMixinOld" ], "server": [ + "server.MinecraftServerMixin" ], "injectors": { "defaultRequire": 1 diff --git a/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/CustomPayloadPacket.java b/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/CustomPayloadPacket.java index eb557624..e95e2602 100644 --- a/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/CustomPayloadPacket.java +++ b/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/CustomPayloadPacket.java @@ -10,7 +10,7 @@ import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.networking.api.StringChannelIdentifierParser; import net.ornithemc.osl.networking.impl.access.CustomPayloadPacketAccess; -import net.ornithemc.osl.networking.impl.interfaces.mixin.INetworkHandler; +import net.ornithemc.osl.networking.impl.access.PacketHandlerAccess; public class CustomPayloadPacket extends Packet implements CustomPayloadPacketAccess { @@ -52,8 +52,8 @@ public void write(DataOutputStream output) throws IOException { @Override public void handle(PacketHandler handler) { - if (handler instanceof INetworkHandler) { - ((INetworkHandler)handler).osl$networking$handleCustomPayload(this); + if (handler instanceof PacketHandlerAccess) { + ((PacketHandlerAccess) handler).osl$networking$handleCustomPayload(this); } } diff --git a/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/Networking.java b/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/Networking.java index 7c0a837b..58fbbc99 100644 --- a/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/Networking.java +++ b/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/Networking.java @@ -5,8 +5,9 @@ import net.ornithemc.osl.entrypoints.api.server.ServerModInitializer; import net.ornithemc.osl.lifecycle.api.server.MinecraftServerEvents; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; import net.ornithemc.osl.networking.impl.mixin.common.PacketAccessor; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; public class Networking implements ModInitializer, ClientModInitializer, ServerModInitializer { @@ -27,8 +28,11 @@ public void initServer() { MinecraftServerEvents.STOP.register(ServerPlayNetworkingImpl::destroy); ServerPlayNetworkingImpl.setUpPacketFactory(CustomPayloadPacket::new); ServerPlayNetworkingImpl.registerListener(HandshakePayload.CHANNEL, HandshakePayload::new, (context, payload) -> { - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ServerConnectionEvents.PLAY_READY.invoker().accept(context.server(), context.player()); + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) context.networkHandler(); + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ServerConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } } diff --git a/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/interfaces/mixin/INetworkHandler.java b/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/access/PacketHandlerAccess.java similarity index 59% rename from libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/interfaces/mixin/INetworkHandler.java rename to libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/access/PacketHandlerAccess.java index 283c296d..d5dc849d 100644 --- a/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/interfaces/mixin/INetworkHandler.java +++ b/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/access/PacketHandlerAccess.java @@ -1,8 +1,8 @@ -package net.ornithemc.osl.networking.impl.interfaces.mixin; +package net.ornithemc.osl.networking.impl.access; import net.ornithemc.osl.networking.impl.CustomPayloadPacket; -public interface INetworkHandler { +public interface PacketHandlerAccess { boolean osl$networking$handleCustomPayload(CustomPayloadPacket packet); diff --git a/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java new file mode 100644 index 00000000..1d596400 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +public interface ServerNetworkHandlerAccess extends NetworkHandlerAccess { + + ServerConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/PlayerManagerMixin.java b/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/PlayerManagerMixin.java new file mode 100644 index 00000000..445e1c41 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/PlayerManagerMixin.java @@ -0,0 +1,37 @@ +package net.ornithemc.osl.networking.impl.mixin.server; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.entity.mob.player.ServerPlayerEntity; + +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +@Mixin(PlayerManager.class) +public class PlayerManagerMixin { + + @Shadow @Final private MinecraftServer server; + + @Inject( + method = "remove", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(CallbackInfo ci, @Local ServerPlayerEntity player) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } +} diff --git a/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerLoginNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerLoginNetworkHandlerMixin.java index 15b8f09f..6b80b7e9 100644 --- a/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerLoginNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerLoginNetworkHandlerMixin.java @@ -18,6 +18,8 @@ import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; import net.ornithemc.osl.networking.impl.Constants; import net.ornithemc.osl.networking.impl.HandshakePayload; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; @Mixin(ServerLoginNetworkHandler.class) @@ -28,7 +30,8 @@ public class ServerLoginNetworkHandlerMixin { /** * is the client also running OSL? */ - @Unique private boolean ornithe; + @Unique + private boolean ornithe; @Inject( method = "handleHandshake", @@ -55,7 +58,10 @@ public class ServerLoginNetworkHandlerMixin { ServerPlayNetworkingImpl.sendNoCheck(player, HandshakePayload.CHANNEL, HandshakePayload.server()); } - ServerConnectionEvents.LOGIN.invoker().accept(server, player); + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.LOGIN.invoker().accept(connectionContext); } } } diff --git a/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerPlayNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerPlayNetworkHandlerMixin.java index 381c0697..2928389b 100644 --- a/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerPlayNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerPlayNetworkHandlerMixin.java @@ -3,6 +3,7 @@ import java.util.LinkedHashSet; import java.util.Set; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -15,22 +16,39 @@ import net.minecraft.server.network.handler.ServerPlayNetworkHandler; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; -import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; import net.ornithemc.osl.networking.impl.CustomPayloadPacket; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; -import net.ornithemc.osl.networking.impl.interfaces.mixin.INetworkHandler; +import net.ornithemc.osl.networking.impl.access.PacketHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ServerPlayNetworkHandler.class) -public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess, INetworkHandler { +public class ServerPlayNetworkHandlerMixin implements ServerNetworkHandlerAccess, PacketHandlerAccess { - @Shadow private MinecraftServer server; - @Shadow private ServerPlayerEntity player; + @Shadow @Final + private MinecraftServer server; + @Shadow + private ServerPlayerEntity player; + + @Unique + private ServerConnectionContext connectionContext; /** * Channels that the client is listening to. */ - @Unique private Set clientChannels; + @Unique + private Set clientChannels; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$networking$initConnectionContext(CallbackInfo ci) { + connectionContext = new ServerConnectionContext(server, (ServerPlayNetworkHandler) (Object) this); + } @Inject( method = "onDisconnect", @@ -38,9 +56,13 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess, INet value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ServerConnectionEvents.DISCONNECT.invoker().accept(server, player); - clientChannels = null; + private void osl$networking$handleDisconnect(String reason, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(reason)); + } + + @Override + public ServerConnectionContext osl$networking$connectionContext() { + return connectionContext; } @Override diff --git a/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/resources/fabric.mod.json b/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/resources/fabric.mod.json index a277a3cb..a39a44db 100644 --- a/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/resources/fabric.mod.json +++ b/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/resources/fabric.mod.json @@ -23,6 +23,8 @@ "osl-core": "\u003e\u003d0.7.0", "osl-entrypoints": "\u003e\u003d0.5.0", "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.9.0" }, "name": "OSL Networking Implementation", diff --git a/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/resources/osl.networking-impl.mixins.json b/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/resources/osl.networking-impl.mixins.json index f0a604fc..d0d42247 100644 --- a/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/resources/osl.networking-impl.mixins.json +++ b/libraries/networking-impl/networking-impl-mca0.1.2_01-mca0.2.8/src/main/resources/osl.networking-impl.mixins.json @@ -10,6 +10,7 @@ "client": [ ], "server": [ + "server.PlayerManagerMixin", "server.ServerLoginNetworkHandlerMixin", "server.ServerPlayNetworkHandlerMixin" ], diff --git a/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/CustomPayloadPacket.java b/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/CustomPayloadPacket.java index eb557624..e95e2602 100644 --- a/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/CustomPayloadPacket.java +++ b/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/CustomPayloadPacket.java @@ -10,7 +10,7 @@ import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.networking.api.StringChannelIdentifierParser; import net.ornithemc.osl.networking.impl.access.CustomPayloadPacketAccess; -import net.ornithemc.osl.networking.impl.interfaces.mixin.INetworkHandler; +import net.ornithemc.osl.networking.impl.access.PacketHandlerAccess; public class CustomPayloadPacket extends Packet implements CustomPayloadPacketAccess { @@ -52,8 +52,8 @@ public void write(DataOutputStream output) throws IOException { @Override public void handle(PacketHandler handler) { - if (handler instanceof INetworkHandler) { - ((INetworkHandler)handler).osl$networking$handleCustomPayload(this); + if (handler instanceof PacketHandlerAccess) { + ((PacketHandlerAccess) handler).osl$networking$handleCustomPayload(this); } } diff --git a/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/Networking.java b/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/Networking.java index df5a55ff..4fd4b811 100644 --- a/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/Networking.java +++ b/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/Networking.java @@ -5,7 +5,8 @@ import net.ornithemc.osl.entrypoints.api.server.ServerModInitializer; import net.ornithemc.osl.lifecycle.api.client.MinecraftClientEvents; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; import net.ornithemc.osl.networking.impl.mixin.common.PacketAccessor; @@ -29,8 +30,11 @@ public void initClient() { // send channel registration data as a response to receiving server channel registration data ClientPlayNetworkingImpl.sendNoCheck(HandshakePayload.CHANNEL, HandshakePayload.client()); - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ClientConnectionEvents.PLAY_READY.invoker().accept(context.minecraft()); + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) context.networkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ClientConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } diff --git a/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java new file mode 100644 index 00000000..e067a183 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +public interface ClientNetworkHandlerAccess extends NetworkHandlerAccess { + + ClientConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/interfaces/mixin/INetworkHandler.java b/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/access/PacketHandlerAccess.java similarity index 59% rename from libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/interfaces/mixin/INetworkHandler.java rename to libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/access/PacketHandlerAccess.java index 283c296d..d5dc849d 100644 --- a/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/interfaces/mixin/INetworkHandler.java +++ b/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/access/PacketHandlerAccess.java @@ -1,8 +1,8 @@ -package net.ornithemc.osl.networking.impl.interfaces.mixin; +package net.ornithemc.osl.networking.impl.access; import net.ornithemc.osl.networking.impl.CustomPayloadPacket; -public interface INetworkHandler { +public interface PacketHandlerAccess { boolean osl$networking$handleCustomPayload(CustomPayloadPacket packet); diff --git a/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java index c48e552f..cf2bd322 100644 --- a/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java @@ -1,8 +1,10 @@ package net.ornithemc.osl.networking.impl.mixin.client; +import java.net.SocketAddress; import java.util.LinkedHashSet; import java.util.Set; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -13,24 +15,36 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.network.handler.ClientNetworkHandler; import net.minecraft.client.world.MultiplayerWorld; +import net.minecraft.network.Connection; +import net.minecraft.network.packet.DisconnectPacket; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.AddressParser; import net.ornithemc.osl.networking.impl.CustomPayloadPacket; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.PacketHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; -import net.ornithemc.osl.networking.impl.interfaces.mixin.INetworkHandler; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ClientNetworkHandler.class) -public class ClientNetworkHandlerMixin implements NetworkHandlerAccess, INetworkHandler { +public class ClientNetworkHandlerMixin implements ClientNetworkHandlerAccess, PacketHandlerAccess { - @Shadow private Minecraft minecraft; - @Shadow private MultiplayerWorld world; + @Shadow @Final + private Minecraft minecraft; + @Shadow @Final + private MultiplayerWorld world; + @Shadow @Final + private Connection connection; + @Unique + private ClientConnectionContext connectionContext; /** * Channels that the server is listening to. */ - @Unique private Set serverChannels; + @Unique + private Set serverChannels; @Inject( method = "handleLogin", @@ -39,7 +53,26 @@ public class ClientNetworkHandlerMixin implements NetworkHandlerAccess, INetwork ) ) private void osl$networking$handleLogin(CallbackInfo ci) { - ClientConnectionEvents.LOGIN.invoker().accept(minecraft); + { + SocketAddress address = connection.socket.getRemoteSocketAddress(); + + String serverAddress = AddressParser.getAddress(address); + int serverPort = AddressParser.getPort(address); + + connectionContext = new ClientConnectionContext(minecraft, serverAddress, serverPort); + } + + ClientConnectionEvents.LOGIN.invoker().accept(connectionContext); + } + + @Inject( + method = "handleDisconnect", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(DisconnectPacket packet, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(packet.reason)); } @Inject( @@ -48,9 +81,13 @@ public class ClientNetworkHandlerMixin implements NetworkHandlerAccess, INetwork value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ClientConnectionEvents.DISCONNECT.invoker().accept(minecraft); - serverChannels = null; + private void osl$networking$handleDisconnect(String reason, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(reason)); + } + + @Override + public ClientConnectionContext osl$networking$connectionContext() { + return connectionContext; } @Override diff --git a/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java b/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java new file mode 100644 index 00000000..4caa6dd3 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java @@ -0,0 +1,42 @@ +package net.ornithemc.osl.networking.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.mob.player.ClientPlayerEntity; +import net.minecraft.client.world.MultiplayerWorld; +import net.minecraft.world.World; + +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.LocalClientPlayerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +@Mixin(Minecraft.class) +public class MinecraftMixin { + + @Shadow + private World world; + @Shadow + private ClientPlayerEntity player; + + @Inject( + method = "setWorld(Lnet/minecraft/world/World;Ljava/lang/String;)V", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$disconnect(World world, String title, CallbackInfo ci) { + if (this.world != null && this.world instanceof MultiplayerWorld && world == null) { + LocalClientPlayerAccess player = (LocalClientPlayerAccess) this.player; + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) player.osl$networking$getNetworkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ClientConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/resources/fabric.mod.json b/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/resources/fabric.mod.json index f744be9b..fde6d33d 100644 --- a/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/resources/fabric.mod.json +++ b/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/resources/fabric.mod.json @@ -23,6 +23,8 @@ "osl-core": "\u003e\u003d0.7.0", "osl-entrypoints": "\u003e\u003d0.5.0", "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.9.0" }, "name": "OSL Networking Implementation", diff --git a/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/resources/osl.networking-impl.classtweaker b/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/resources/osl.networking-impl.classtweaker new file mode 100644 index 00000000..938816a7 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/resources/osl.networking-impl.classtweaker @@ -0,0 +1,3 @@ +classTweaker v1 named + +accessible field net/minecraft/network/Connection socket Ljava/net/Socket; \ No newline at end of file diff --git a/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/resources/osl.networking-impl.mixins.json b/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/resources/osl.networking-impl.mixins.json index c9867435..ded2c522 100644 --- a/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/resources/osl.networking-impl.mixins.json +++ b/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/resources/osl.networking-impl.mixins.json @@ -10,7 +10,8 @@ "client": [ "client.ClientNetworkHandlerMixin", "client.HandshakePacketMixin", - "client.LocalClientPlayerEntityMixin" + "client.LocalClientPlayerEntityMixin", + "client.MinecraftMixin" ], "server": [ ], diff --git a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/CustomPayloadPacket.java b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/CustomPayloadPacket.java index eb557624..e95e2602 100644 --- a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/CustomPayloadPacket.java +++ b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/CustomPayloadPacket.java @@ -10,7 +10,7 @@ import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.networking.api.StringChannelIdentifierParser; import net.ornithemc.osl.networking.impl.access.CustomPayloadPacketAccess; -import net.ornithemc.osl.networking.impl.interfaces.mixin.INetworkHandler; +import net.ornithemc.osl.networking.impl.access.PacketHandlerAccess; public class CustomPayloadPacket extends Packet implements CustomPayloadPacketAccess { @@ -52,8 +52,8 @@ public void write(DataOutputStream output) throws IOException { @Override public void handle(PacketHandler handler) { - if (handler instanceof INetworkHandler) { - ((INetworkHandler)handler).osl$networking$handleCustomPayload(this); + if (handler instanceof PacketHandlerAccess) { + ((PacketHandlerAccess) handler).osl$networking$handleCustomPayload(this); } } diff --git a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/Networking.java b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/Networking.java index 85d0270a..cc0bc48a 100644 --- a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/Networking.java +++ b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/Networking.java @@ -7,9 +7,12 @@ import net.ornithemc.osl.lifecycle.api.server.MinecraftServerEvents; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; import net.ornithemc.osl.networking.impl.mixin.common.PacketAccessor; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; public class Networking implements ModInitializer, ClientModInitializer, ServerModInitializer { @@ -32,8 +35,11 @@ public void initClient() { // send channel registration data as a response to receiving server channel registration data ClientPlayNetworkingImpl.sendNoCheck(HandshakePayload.CHANNEL, HandshakePayload.client()); - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ClientConnectionEvents.PLAY_READY.invoker().accept(context.minecraft()); + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) context.networkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ClientConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } @@ -43,8 +49,11 @@ public void initServer() { MinecraftServerEvents.STOP.register(ServerPlayNetworkingImpl::destroy); ServerPlayNetworkingImpl.setUpPacketFactory(CustomPayloadPacket::new); ServerPlayNetworkingImpl.registerListener(HandshakePayload.CHANNEL, HandshakePayload::new, (context, payload) -> { - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ServerConnectionEvents.PLAY_READY.invoker().accept(context.server(), context.player()); + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) context.networkHandler(); + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ServerConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } } diff --git a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java new file mode 100644 index 00000000..e067a183 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +public interface ClientNetworkHandlerAccess extends NetworkHandlerAccess { + + ClientConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/interfaces/mixin/INetworkHandler.java b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/access/PacketHandlerAccess.java similarity index 59% rename from libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/interfaces/mixin/INetworkHandler.java rename to libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/access/PacketHandlerAccess.java index 283c296d..d5dc849d 100644 --- a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/interfaces/mixin/INetworkHandler.java +++ b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/access/PacketHandlerAccess.java @@ -1,8 +1,8 @@ -package net.ornithemc.osl.networking.impl.interfaces.mixin; +package net.ornithemc.osl.networking.impl.access; import net.ornithemc.osl.networking.impl.CustomPayloadPacket; -public interface INetworkHandler { +public interface PacketHandlerAccess { boolean osl$networking$handleCustomPayload(CustomPayloadPacket packet); diff --git a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java new file mode 100644 index 00000000..1d596400 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +public interface ServerNetworkHandlerAccess extends NetworkHandlerAccess { + + ServerConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java index c48e552f..a660862d 100644 --- a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java @@ -1,8 +1,10 @@ package net.ornithemc.osl.networking.impl.mixin.client; +import java.net.SocketAddress; import java.util.LinkedHashSet; import java.util.Set; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -13,24 +15,36 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.network.handler.ClientNetworkHandler; import net.minecraft.client.world.MultiplayerWorld; +import net.minecraft.network.Connection; +import net.minecraft.network.packet.DisconnectPacket; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.AddressParser; import net.ornithemc.osl.networking.impl.CustomPayloadPacket; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.PacketHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; -import net.ornithemc.osl.networking.impl.interfaces.mixin.INetworkHandler; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ClientNetworkHandler.class) -public class ClientNetworkHandlerMixin implements NetworkHandlerAccess, INetworkHandler { +public class ClientNetworkHandlerMixin implements ClientNetworkHandlerAccess, PacketHandlerAccess { - @Shadow private Minecraft minecraft; - @Shadow private MultiplayerWorld world; + @Shadow @Final + private Minecraft minecraft; + @Shadow @Final + private MultiplayerWorld world; + @Shadow @Final + private Connection connection; + @Unique + private ClientConnectionContext connectionContext; /** * Channels that the server is listening to. */ - @Unique private Set serverChannels; + @Unique + private Set serverChannels; @Inject( method = "handleLogin", @@ -39,7 +53,26 @@ public class ClientNetworkHandlerMixin implements NetworkHandlerAccess, INetwork ) ) private void osl$networking$handleLogin(CallbackInfo ci) { - ClientConnectionEvents.LOGIN.invoker().accept(minecraft); + { + SocketAddress address = connection.socket.getRemoteSocketAddress(); + + String serverAddress = AddressParser.getAddress(address); + int serverPort = AddressParser.getPort(address); + + connectionContext = new ClientConnectionContext(minecraft, serverAddress, serverPort); + } + + ClientConnectionEvents.LOGIN.invoker().accept(connectionContext); + } + + @Inject( + method = "handleDisconnect", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(DisconnectPacket packet, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(packet.reason)); } @Inject( @@ -48,9 +81,15 @@ public class ClientNetworkHandlerMixin implements NetworkHandlerAccess, INetwork value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ClientConnectionEvents.DISCONNECT.invoker().accept(minecraft); - serverChannels = null; + private void osl$networking$handleDisconnect(String reason, Object[] args, CallbackInfo ci) { + connectionContext.offerDisconnectReason(args == null + ? TextComponents.translatable(reason) + : TextComponents.translatable(reason, args)); + } + + @Override + public ClientConnectionContext osl$networking$connectionContext() { + return connectionContext; } @Override diff --git a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java new file mode 100644 index 00000000..6600fd99 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java @@ -0,0 +1,41 @@ +package net.ornithemc.osl.networking.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.network.handler.ClientNetworkHandler; +import net.minecraft.client.world.MultiplayerWorld; +import net.minecraft.world.World; + +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +@Mixin(Minecraft.class) +public class MinecraftMixin { + + @Shadow + private World world; + + @Shadow + private ClientNetworkHandler getNetworkHandler() { return null; } + + @Inject( + method = "setWorld(Lnet/minecraft/world/World;Ljava/lang/String;)V", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$disconnect(World world, String title, CallbackInfo ci) { + if (this.world != null && this.world instanceof MultiplayerWorld && world == null) { + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) getNetworkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ClientConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/PlayerManagerMixin.java b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/PlayerManagerMixin.java new file mode 100644 index 00000000..445e1c41 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/PlayerManagerMixin.java @@ -0,0 +1,37 @@ +package net.ornithemc.osl.networking.impl.mixin.server; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.entity.mob.player.ServerPlayerEntity; + +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +@Mixin(PlayerManager.class) +public class PlayerManagerMixin { + + @Shadow @Final private MinecraftServer server; + + @Inject( + method = "remove", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(CallbackInfo ci, @Local ServerPlayerEntity player) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } +} diff --git a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerLoginNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerLoginNetworkHandlerMixin.java index 15b8f09f..6b80b7e9 100644 --- a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerLoginNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerLoginNetworkHandlerMixin.java @@ -18,6 +18,8 @@ import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; import net.ornithemc.osl.networking.impl.Constants; import net.ornithemc.osl.networking.impl.HandshakePayload; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; @Mixin(ServerLoginNetworkHandler.class) @@ -28,7 +30,8 @@ public class ServerLoginNetworkHandlerMixin { /** * is the client also running OSL? */ - @Unique private boolean ornithe; + @Unique + private boolean ornithe; @Inject( method = "handleHandshake", @@ -55,7 +58,10 @@ public class ServerLoginNetworkHandlerMixin { ServerPlayNetworkingImpl.sendNoCheck(player, HandshakePayload.CHANNEL, HandshakePayload.server()); } - ServerConnectionEvents.LOGIN.invoker().accept(server, player); + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.LOGIN.invoker().accept(connectionContext); } } } diff --git a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerPlayNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerPlayNetworkHandlerMixin.java index 381c0697..45a75421 100644 --- a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerPlayNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerPlayNetworkHandlerMixin.java @@ -3,6 +3,7 @@ import java.util.LinkedHashSet; import java.util.Set; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -15,22 +16,39 @@ import net.minecraft.server.network.handler.ServerPlayNetworkHandler; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; -import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; import net.ornithemc.osl.networking.impl.CustomPayloadPacket; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; -import net.ornithemc.osl.networking.impl.interfaces.mixin.INetworkHandler; +import net.ornithemc.osl.networking.impl.access.PacketHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ServerPlayNetworkHandler.class) -public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess, INetworkHandler { +public class ServerPlayNetworkHandlerMixin implements ServerNetworkHandlerAccess, PacketHandlerAccess { - @Shadow private MinecraftServer server; - @Shadow private ServerPlayerEntity player; + @Shadow @Final + private MinecraftServer server; + @Shadow + private ServerPlayerEntity player; + + @Unique + private ServerConnectionContext connectionContext; /** * Channels that the client is listening to. */ - @Unique private Set clientChannels; + @Unique + private Set clientChannels; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$networking$initConnectionContext(CallbackInfo ci) { + connectionContext = new ServerConnectionContext(server, (ServerPlayNetworkHandler) (Object) this); + } @Inject( method = "onDisconnect", @@ -38,9 +56,15 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess, INet value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ServerConnectionEvents.DISCONNECT.invoker().accept(server, player); - clientChannels = null; + private void osl$networking$handleDisconnect(String reason, Object[] args, CallbackInfo ci) { + connectionContext.offerDisconnectReason(args == null + ? TextComponents.translatable(reason) + : TextComponents.translatable(reason, args)); + } + + @Override + public ServerConnectionContext osl$networking$connectionContext() { + return connectionContext; } @Override diff --git a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/resources/fabric.mod.json b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/resources/fabric.mod.json index f89c12ae..fd4148eb 100644 --- a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/resources/fabric.mod.json +++ b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/resources/fabric.mod.json @@ -23,6 +23,8 @@ "osl-core": "\u003e\u003d0.7.0", "osl-entrypoints": "\u003e\u003d0.5.0", "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.9.0" }, "name": "OSL Networking Implementation", diff --git a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/resources/osl.networking-impl.classtweaker b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/resources/osl.networking-impl.classtweaker new file mode 100644 index 00000000..938816a7 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/resources/osl.networking-impl.classtweaker @@ -0,0 +1,3 @@ +classTweaker v1 named + +accessible field net/minecraft/network/Connection socket Ljava/net/Socket; \ No newline at end of file diff --git a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/resources/osl.networking-impl.mixins.json b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/resources/osl.networking-impl.mixins.json index 95fccaf7..4c07c796 100644 --- a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/resources/osl.networking-impl.mixins.json +++ b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/resources/osl.networking-impl.mixins.json @@ -9,9 +9,11 @@ ], "client": [ "client.ClientNetworkHandlerMixin", - "client.HandshakePacketMixin" + "client.HandshakePacketMixin", + "client.MinecraftMixin" ], "server": [ + "server.PlayerManagerMixin", "server.ServerLoginNetworkHandlerMixin", "server.ServerPlayNetworkHandlerMixin" ], diff --git a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/CustomPayloadPacket.java b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/CustomPayloadPacket.java index fd63fa5a..43bb1345 100644 --- a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/CustomPayloadPacket.java +++ b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/CustomPayloadPacket.java @@ -11,7 +11,7 @@ import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.networking.api.StringChannelIdentifierParser; import net.ornithemc.osl.networking.impl.access.CustomPayloadPacketAccess; -import net.ornithemc.osl.networking.impl.interfaces.mixin.INetworkHandler; +import net.ornithemc.osl.networking.impl.access.PacketHandlerAccess; public class CustomPayloadPacket extends Packet implements CustomPayloadPacketAccess { @@ -65,8 +65,8 @@ public void write(DataOutputStream output) { @Override public void handle(PacketHandler handler) { - if (handler instanceof INetworkHandler) { - ((INetworkHandler)handler).osl$networking$handleCustomPayload(this); + if (handler instanceof PacketHandlerAccess) { + ((PacketHandlerAccess) handler).osl$networking$handleCustomPayload(this); } } diff --git a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/Networking.java b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/Networking.java index 2bb2cf19..f5b0a2cb 100644 --- a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/Networking.java +++ b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/Networking.java @@ -7,9 +7,12 @@ import net.ornithemc.osl.lifecycle.api.server.MinecraftServerEvents; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; import net.ornithemc.osl.networking.impl.mixin.common.PacketAccessor; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; public class Networking implements ModInitializer, ClientModInitializer, ServerModInitializer { @@ -32,8 +35,11 @@ public void initClient() { // send channel registration data as a response to receiving server channel registration data ClientPlayNetworkingImpl.sendNoCheck(HandshakePayload.CHANNEL, HandshakePayload.client()); - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ClientConnectionEvents.PLAY_READY.invoker().accept(context.minecraft()); + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) context.networkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ClientConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } @@ -43,8 +49,11 @@ public void initServer() { MinecraftServerEvents.STOP.register(ServerPlayNetworkingImpl::destroy); ServerPlayNetworkingImpl.setUpPacketFactory(CustomPayloadPacket::new); ServerPlayNetworkingImpl.registerListener(HandshakePayload.CHANNEL, HandshakePayload::new, (context, payload) -> { - ((NetworkHandlerAccess)context.networkHandler()).osl$networking$registerChannels(payload.channels); - ServerConnectionEvents.PLAY_READY.invoker().accept(context.server(), context.player()); + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) context.networkHandler(); + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + networkHandler.osl$networking$registerChannels(payload.channels); + ServerConnectionEvents.PLAY_READY.invoker().accept(connectionContext); }); } } diff --git a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java new file mode 100644 index 00000000..e067a183 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +public interface ClientNetworkHandlerAccess extends NetworkHandlerAccess { + + ClientConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/interfaces/mixin/INetworkHandler.java b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/access/PacketHandlerAccess.java similarity index 59% rename from libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/interfaces/mixin/INetworkHandler.java rename to libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/access/PacketHandlerAccess.java index 283c296d..d5dc849d 100644 --- a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/interfaces/mixin/INetworkHandler.java +++ b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/access/PacketHandlerAccess.java @@ -1,8 +1,8 @@ -package net.ornithemc.osl.networking.impl.interfaces.mixin; +package net.ornithemc.osl.networking.impl.access; import net.ornithemc.osl.networking.impl.CustomPayloadPacket; -public interface INetworkHandler { +public interface PacketHandlerAccess { boolean osl$networking$handleCustomPayload(CustomPayloadPacket packet); diff --git a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java new file mode 100644 index 00000000..1d596400 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +public interface ServerNetworkHandlerAccess extends NetworkHandlerAccess { + + ServerConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java index c48e552f..a660862d 100644 --- a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/ClientNetworkHandlerMixin.java @@ -1,8 +1,10 @@ package net.ornithemc.osl.networking.impl.mixin.client; +import java.net.SocketAddress; import java.util.LinkedHashSet; import java.util.Set; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -13,24 +15,36 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.network.handler.ClientNetworkHandler; import net.minecraft.client.world.MultiplayerWorld; +import net.minecraft.network.Connection; +import net.minecraft.network.packet.DisconnectPacket; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.AddressParser; import net.ornithemc.osl.networking.impl.CustomPayloadPacket; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.access.PacketHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; import net.ornithemc.osl.networking.impl.client.ClientPlayNetworkingImpl; -import net.ornithemc.osl.networking.impl.interfaces.mixin.INetworkHandler; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ClientNetworkHandler.class) -public class ClientNetworkHandlerMixin implements NetworkHandlerAccess, INetworkHandler { +public class ClientNetworkHandlerMixin implements ClientNetworkHandlerAccess, PacketHandlerAccess { - @Shadow private Minecraft minecraft; - @Shadow private MultiplayerWorld world; + @Shadow @Final + private Minecraft minecraft; + @Shadow @Final + private MultiplayerWorld world; + @Shadow @Final + private Connection connection; + @Unique + private ClientConnectionContext connectionContext; /** * Channels that the server is listening to. */ - @Unique private Set serverChannels; + @Unique + private Set serverChannels; @Inject( method = "handleLogin", @@ -39,7 +53,26 @@ public class ClientNetworkHandlerMixin implements NetworkHandlerAccess, INetwork ) ) private void osl$networking$handleLogin(CallbackInfo ci) { - ClientConnectionEvents.LOGIN.invoker().accept(minecraft); + { + SocketAddress address = connection.socket.getRemoteSocketAddress(); + + String serverAddress = AddressParser.getAddress(address); + int serverPort = AddressParser.getPort(address); + + connectionContext = new ClientConnectionContext(minecraft, serverAddress, serverPort); + } + + ClientConnectionEvents.LOGIN.invoker().accept(connectionContext); + } + + @Inject( + method = "handleDisconnect", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(DisconnectPacket packet, CallbackInfo ci) { + connectionContext.offerDisconnectReason(TextComponents.resolve(packet.reason)); } @Inject( @@ -48,9 +81,15 @@ public class ClientNetworkHandlerMixin implements NetworkHandlerAccess, INetwork value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ClientConnectionEvents.DISCONNECT.invoker().accept(minecraft); - serverChannels = null; + private void osl$networking$handleDisconnect(String reason, Object[] args, CallbackInfo ci) { + connectionContext.offerDisconnectReason(args == null + ? TextComponents.translatable(reason) + : TextComponents.translatable(reason, args)); + } + + @Override + public ClientConnectionContext osl$networking$connectionContext() { + return connectionContext; } @Override diff --git a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java new file mode 100644 index 00000000..6600fd99 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/mixin/client/MinecraftMixin.java @@ -0,0 +1,41 @@ +package net.ornithemc.osl.networking.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.network.handler.ClientNetworkHandler; +import net.minecraft.client.world.MultiplayerWorld; +import net.minecraft.world.World; + +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ClientNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +@Mixin(Minecraft.class) +public class MinecraftMixin { + + @Shadow + private World world; + + @Shadow + private ClientNetworkHandler getNetworkHandler() { return null; } + + @Inject( + method = "setWorld(Lnet/minecraft/world/World;Ljava/lang/String;)V", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$disconnect(World world, String title, CallbackInfo ci) { + if (this.world != null && this.world instanceof MultiplayerWorld && world == null) { + ClientNetworkHandlerAccess networkHandler = (ClientNetworkHandlerAccess) getNetworkHandler(); + ClientConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ClientConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } + } +} diff --git a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/PlayerManagerMixin.java b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/PlayerManagerMixin.java new file mode 100644 index 00000000..445e1c41 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/PlayerManagerMixin.java @@ -0,0 +1,37 @@ +package net.ornithemc.osl.networking.impl.mixin.server; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.entity.mob.player.ServerPlayerEntity; + +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +@Mixin(PlayerManager.class) +public class PlayerManagerMixin { + + @Shadow @Final private MinecraftServer server; + + @Inject( + method = "remove", + at = @At( + value = "HEAD" + ) + ) + private void osl$networking$handleDisconnect(CallbackInfo ci, @Local ServerPlayerEntity player) { + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.DISCONNECT.invoker().accept(connectionContext); + } +} diff --git a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerLoginNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerLoginNetworkHandlerMixin.java index 15b8f09f..6b80b7e9 100644 --- a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerLoginNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerLoginNetworkHandlerMixin.java @@ -18,6 +18,8 @@ import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; import net.ornithemc.osl.networking.impl.Constants; import net.ornithemc.osl.networking.impl.HandshakePayload; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; @Mixin(ServerLoginNetworkHandler.class) @@ -28,7 +30,8 @@ public class ServerLoginNetworkHandlerMixin { /** * is the client also running OSL? */ - @Unique private boolean ornithe; + @Unique + private boolean ornithe; @Inject( method = "handleHandshake", @@ -55,7 +58,10 @@ public class ServerLoginNetworkHandlerMixin { ServerPlayNetworkingImpl.sendNoCheck(player, HandshakePayload.CHANNEL, HandshakePayload.server()); } - ServerConnectionEvents.LOGIN.invoker().accept(server, player); + ServerNetworkHandlerAccess networkHandler = (ServerNetworkHandlerAccess) player.networkHandler; + ServerConnectionContext connectionContext = networkHandler.osl$networking$connectionContext(); + + ServerConnectionEvents.LOGIN.invoker().accept(connectionContext); } } } diff --git a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerPlayNetworkHandlerMixin.java b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerPlayNetworkHandlerMixin.java index 381c0697..45a75421 100644 --- a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerPlayNetworkHandlerMixin.java +++ b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/mixin/server/ServerPlayNetworkHandlerMixin.java @@ -3,6 +3,7 @@ import java.util.LinkedHashSet; import java.util.Set; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -15,22 +16,39 @@ import net.minecraft.server.network.handler.ServerPlayNetworkHandler; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; -import net.ornithemc.osl.networking.api.server.ServerConnectionEvents; import net.ornithemc.osl.networking.impl.CustomPayloadPacket; -import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; -import net.ornithemc.osl.networking.impl.interfaces.mixin.INetworkHandler; +import net.ornithemc.osl.networking.impl.access.PacketHandlerAccess; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; import net.ornithemc.osl.networking.impl.server.ServerPlayNetworkingImpl; +import net.ornithemc.osl.text.api.TextComponents; @Mixin(ServerPlayNetworkHandler.class) -public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess, INetworkHandler { +public class ServerPlayNetworkHandlerMixin implements ServerNetworkHandlerAccess, PacketHandlerAccess { - @Shadow private MinecraftServer server; - @Shadow private ServerPlayerEntity player; + @Shadow @Final + private MinecraftServer server; + @Shadow + private ServerPlayerEntity player; + + @Unique + private ServerConnectionContext connectionContext; /** * Channels that the client is listening to. */ - @Unique private Set clientChannels; + @Unique + private Set clientChannels; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$networking$initConnectionContext(CallbackInfo ci) { + connectionContext = new ServerConnectionContext(server, (ServerPlayNetworkHandler) (Object) this); + } @Inject( method = "onDisconnect", @@ -38,9 +56,15 @@ public class ServerPlayNetworkHandlerMixin implements NetworkHandlerAccess, INet value = "HEAD" ) ) - private void osl$networking$handleDisconnect(CallbackInfo ci) { - ServerConnectionEvents.DISCONNECT.invoker().accept(server, player); - clientChannels = null; + private void osl$networking$handleDisconnect(String reason, Object[] args, CallbackInfo ci) { + connectionContext.offerDisconnectReason(args == null + ? TextComponents.translatable(reason) + : TextComponents.translatable(reason, args)); + } + + @Override + public ServerConnectionContext osl$networking$connectionContext() { + return connectionContext; } @Override diff --git a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/resources/fabric.mod.json b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/resources/fabric.mod.json index 76c0421a..fc81a562 100644 --- a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/resources/fabric.mod.json +++ b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/resources/fabric.mod.json @@ -23,6 +23,8 @@ "osl-core": "\u003e\u003d0.7.0", "osl-entrypoints": "\u003e\u003d0.5.0", "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.9.0" }, "name": "OSL Networking Implementation", diff --git a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/resources/osl.networking-impl.classtweaker b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/resources/osl.networking-impl.classtweaker new file mode 100644 index 00000000..938816a7 --- /dev/null +++ b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/resources/osl.networking-impl.classtweaker @@ -0,0 +1,3 @@ +classTweaker v1 named + +accessible field net/minecraft/network/Connection socket Ljava/net/Socket; \ No newline at end of file diff --git a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/resources/osl.networking-impl.mixins.json b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/resources/osl.networking-impl.mixins.json index 95fccaf7..4c07c796 100644 --- a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/resources/osl.networking-impl.mixins.json +++ b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/resources/osl.networking-impl.mixins.json @@ -9,9 +9,11 @@ ], "client": [ "client.ClientNetworkHandlerMixin", - "client.HandshakePacketMixin" + "client.HandshakePacketMixin", + "client.MinecraftMixin" ], "server": [ + "server.PlayerManagerMixin", "server.ServerLoginNetworkHandlerMixin", "server.ServerPlayNetworkHandlerMixin" ], diff --git a/libraries/networking/gradle.properties b/libraries/networking/gradle.properties index 4ea198e6..436ca4a1 100644 --- a/libraries/networking/gradle.properties +++ b/libraries/networking/gradle.properties @@ -3,4 +3,4 @@ library_name = Networking library_description = Client-server networking API and events. library_version = 0.9.0 -osl_dependencies = core:>=0.7.0,entrypoints:>=0.5.0,lifecycle-events:>=0.6.0 +osl_dependencies = core:>=0.7.0,executors:>=0.1.0,text-components:>=0.1.0- diff --git a/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/api/client/ClientConnectionEvents.java b/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/api/client/ClientConnectionEvents.java index d5adcfb8..c971cb64 100644 --- a/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/api/client/ClientConnectionEvents.java +++ b/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/api/client/ClientConnectionEvents.java @@ -5,11 +5,12 @@ import net.minecraft.client.Minecraft; import net.ornithemc.osl.core.api.events.Event; +import net.ornithemc.osl.text.api.TextComponent; /** * Events related to the client side of a client-server connection. */ -public class ClientConnectionEvents { +public final class ClientConnectionEvents { /** * This event is fired after a successful login occurs. @@ -28,13 +29,13 @@ public class ClientConnectionEvents { * *
 	 * {@code
-	 * ClientConnectionEvents.LOGIN.register(minecraft -> {
+	 * ClientConnectionEvents.LOGIN.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> LOGIN = Event.consumer(); + public static final Event> LOGIN = Event.consumer(); /** * This event is fired after login, once channel registration is complete. * @@ -51,13 +52,13 @@ public class ClientConnectionEvents { * *
 	 * {@code
-	 * ClientConnectionEvents.PLAY_READY.register(minecraft -> {
+	 * ClientConnectionEvents.PLAY_READY.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> PLAY_READY = Event.consumer(); + public static final Event> PLAY_READY = Event.consumer(); /** * This event is fired when the client disconnects from the server. * @@ -71,12 +72,67 @@ public class ClientConnectionEvents { * *
 	 * {@code
-	 * ClientConnectionEvents.DISCONNECT.register(minecraft -> {
+	 * ClientConnectionEvents.DISCONNECT.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> DISCONNECT = Event.consumer(); + public static final Event> DISCONNECT = Event.consumer(); + /** + * Common interface for connection context classes. + */ + public interface ConnectionContext { + + /** + * @return the current {@linkplain Minecraft} instance. + */ + Minecraft minecraft(); + + /** + * @return the name of the selected singleplayer world, or {@code null} if connected to a remote server. + */ + String worldName(); + + /** + * @return the address of the server logged into, or {@code null} if selected a singleplayer world. + */ + String serverAddress(); + + /** + * @return the port of the server logged into, or {@code -1} if selected a singleplayer world. + */ + int serverPort(); + + /** + * @return whether the server is a local integrated server. + */ + boolean isServerLocal(); + + } + + /** + * Access to relevant context for login events. + */ + public interface LoginContext extends ConnectionContext { + } + + /** + * Access to relevant context for play ready events. + */ + public interface PlayReadyContext extends ConnectionContext { + } + + /** + * Access to relevant context for disconnect events. + */ + public interface DisconnectContext extends ConnectionContext { + + /** + * @return the reason for the disconnect, or {@code null} if disconnected by leaving the server or closing the game. + */ + TextComponent disconnectReason(); + + } } diff --git a/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/api/server/ServerConnectionEvents.java b/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/api/server/ServerConnectionEvents.java index e248c524..83c6811c 100644 --- a/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/api/server/ServerConnectionEvents.java +++ b/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/api/server/ServerConnectionEvents.java @@ -1,16 +1,17 @@ package net.ornithemc.osl.networking.api.server; -import java.util.function.BiConsumer; +import java.util.function.Consumer; import net.minecraft.server.MinecraftServer; import net.minecraft.server.entity.living.player.ServerPlayerEntity; import net.ornithemc.osl.core.api.events.Event; +import net.ornithemc.osl.text.api.TextComponent; /** * Events related to the server side of a client-server connection. */ -public class ServerConnectionEvents { +public final class ServerConnectionEvents { /** * This event is fired after a successful login occurs. @@ -29,13 +30,13 @@ public class ServerConnectionEvents { * *
 	 * {@code
-	 * ServerConnectionEvents.LOGIN.register((server, player) -> {
+	 * ServerConnectionEvents.LOGIN.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> LOGIN = Event.biConsumer(); + public static final Event> LOGIN = Event.consumer(); /** * This event is fired after login, once channel registration is complete. * @@ -52,13 +53,13 @@ public class ServerConnectionEvents { * *
 	 * {@code
-	 * ServerConnectionEvents.PLAY_READY.register((server, player) -> {
+	 * ServerConnectionEvents.PLAY_READY.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> PLAY_READY = Event.biConsumer(); + public static final Event> PLAY_READY = Event.consumer(); /** * This event is fired when a client disconnects from the server. * @@ -72,12 +73,52 @@ public class ServerConnectionEvents { * *
 	 * {@code
-	 * ServerConnectionEvents.DISCONNECT.register((server, player) -> {
+	 * ServerConnectionEvents.DISCONNECT.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> DISCONNECT = Event.biConsumer(); + public static final Event> DISCONNECT = Event.consumer(); + /** + * Common interface for connection context classes. + */ + public interface ConnectionContext { + + /** + * @return the current {@linkplain MinecraftServer} instance. + */ + MinecraftServer server(); + + /** + * @return the current {@linkplain ServerPlayerEntity} instance. + */ + ServerPlayerEntity player(); + + } + + /** + * Access to relevant context for login events. + */ + public interface LoginContext extends ConnectionContext { + } + + /** + * Access to relevant context for play ready events. + */ + public interface PlayReadyContext extends ConnectionContext { + } + + /** + * Access to relevant context for disconnect events. + */ + public interface DisconnectContext extends ConnectionContext { + + /** + * @return the reason for the disconnect, or {@code null} if disconnected by leaving the server or closing the game. + */ + TextComponent disconnectReason(); + + } } diff --git a/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/access/TaskRunnerAccess.java b/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/access/TaskRunnerAccess.java deleted file mode 100644 index bff1ba39..00000000 --- a/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/access/TaskRunnerAccess.java +++ /dev/null @@ -1,7 +0,0 @@ -package net.ornithemc.osl.networking.impl.access; - -public interface TaskRunnerAccess { - - boolean osl$networking$submit(Runnable task); - -} diff --git a/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/client/ClientConnectionContext.java b/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/client/ClientConnectionContext.java new file mode 100644 index 00000000..9dcbf193 --- /dev/null +++ b/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/client/ClientConnectionContext.java @@ -0,0 +1,69 @@ +package net.ornithemc.osl.networking.impl.client; + +import net.minecraft.client.Minecraft; + +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents.DisconnectContext; +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents.LoginContext; +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents.PlayReadyContext; +import net.ornithemc.osl.text.api.TextComponent; + +public final class ClientConnectionContext implements LoginContext, PlayReadyContext, DisconnectContext { + + private final Minecraft minecraft; + private final String worldName; + private final String serverAddress; + private final int serverPort; + + private TextComponent disconnectReason; + + public ClientConnectionContext(Minecraft minecraft, String worldName) { + this(minecraft, worldName, null, -1); + } + + public ClientConnectionContext(Minecraft minecraft, String serverAddress, int serverPort) { + this(minecraft, null, serverAddress, serverPort); + } + + private ClientConnectionContext(Minecraft minecraft, String worldName, String serverAddress, int serverPort) { + this.minecraft = minecraft; + this.worldName = worldName; + this.serverAddress = serverAddress; + this.serverPort = serverPort; + } + + @Override + public Minecraft minecraft() { + return this.minecraft; + } + + @Override + public String worldName() { + return this.worldName; + } + + @Override + public String serverAddress() { + return this.serverAddress; + } + + @Override + public int serverPort() { + return this.serverPort; + } + + @Override + public TextComponent disconnectReason() { + return this.disconnectReason; + } + + @Override + public boolean isServerLocal() { + return this.worldName != null; + } + + public void offerDisconnectReason(TextComponent disconnectReason) { + if (this.disconnectReason == null) { + this.disconnectReason = disconnectReason; + } + } +} diff --git a/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java b/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java index 42989829..a4350530 100644 --- a/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java +++ b/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java @@ -14,6 +14,7 @@ import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.core.api.util.function.IOConsumer; +import net.ornithemc.osl.core.impl.util.MinecraftVersion; import net.ornithemc.osl.networking.api.PacketBuffer; import net.ornithemc.osl.networking.api.PacketBuffers; import net.ornithemc.osl.networking.api.PacketPayload; @@ -24,11 +25,11 @@ import net.ornithemc.osl.networking.impl.PacketFactory; import net.ornithemc.osl.networking.impl.access.CustomPayloadPacketAccess; import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; -import net.ornithemc.osl.networking.impl.access.TaskRunnerAccess; public final class ClientPlayNetworkingImpl { private static final Logger LOGGER = LogManager.getLogger("OSL|Client Play Networking"); + private static final boolean USE_EVENT_LOOP_FOR_ASYNC_HANDLING = MinecraftVersion.resolve().compareTo("14w21a") >= 0; private static PacketFactory packetFactory; private static Minecraft minecraft; @@ -117,9 +118,9 @@ public static boolean handlePacket(Minecraft minecraft, ClientPlayNetworkHandler try { handlePayload(channel, listener, ctx, data); } catch (NotOnMainThreadException e) { - if (minecraft instanceof TaskRunnerAccess) { + if (USE_EVENT_LOOP_FOR_ASYNC_HANDLING) { // use built-in task queue like other packets do (14w21a+) - ((TaskRunnerAccess) minecraft).osl$networking$submit(() -> handlePayload(channel, listener, ctx, data)); + minecraft.execute(() -> handlePayload(channel, listener, ctx, data)); } else { // rethrow so packet is added to the read queue (14w20b-) throw e; diff --git a/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/server/ServerConnectionContext.java b/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/server/ServerConnectionContext.java new file mode 100644 index 00000000..11c0dd0a --- /dev/null +++ b/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/server/ServerConnectionContext.java @@ -0,0 +1,44 @@ +package net.ornithemc.osl.networking.impl.server; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.entity.living.player.ServerPlayerEntity; +import net.minecraft.server.network.handler.ServerPlayNetworkHandler; + +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents.DisconnectContext; +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents.LoginContext; +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents.PlayReadyContext; +import net.ornithemc.osl.text.api.TextComponent; + +public final class ServerConnectionContext implements LoginContext, PlayReadyContext, DisconnectContext { + + private final MinecraftServer server; + private final ServerPlayNetworkHandler networkHandler; + + private TextComponent disconnectReason; + + public ServerConnectionContext(MinecraftServer server, ServerPlayNetworkHandler networkHandler) { + this.server = server; + this.networkHandler = networkHandler; + } + + @Override + public MinecraftServer server() { + return this.server; + } + + @Override + public ServerPlayerEntity player() { + return this.networkHandler.player; + } + + @Override + public TextComponent disconnectReason() { + return this.disconnectReason; + } + + public void offerDisconnectReason(TextComponent disconnectReason) { + if (this.disconnectReason == null) { + this.disconnectReason = disconnectReason; + } + } +} diff --git a/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/server/ServerPlayNetworkingImpl.java b/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/server/ServerPlayNetworkingImpl.java index 613dbee7..2bdfebea 100644 --- a/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/server/ServerPlayNetworkingImpl.java +++ b/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/server/ServerPlayNetworkingImpl.java @@ -18,6 +18,7 @@ import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.core.api.util.function.IOConsumer; +import net.ornithemc.osl.core.impl.util.MinecraftVersion; import net.ornithemc.osl.networking.api.PacketBuffer; import net.ornithemc.osl.networking.api.PacketBuffers; import net.ornithemc.osl.networking.api.PacketPayload; @@ -29,11 +30,11 @@ import net.ornithemc.osl.networking.impl.access.CustomPayloadPacketAccess; import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; import net.ornithemc.osl.networking.impl.access.PlayerManagerAccess; -import net.ornithemc.osl.networking.impl.access.TaskRunnerAccess; public final class ServerPlayNetworkingImpl { private static final Logger LOGGER = LogManager.getLogger("OSL|Server Play Networking"); + private static final boolean USE_EVENT_LOOP_FOR_ASYNC_HANDLING = MinecraftVersion.resolve().compareTo("14w21a") >= 0; private static PacketFactory packetFactory; private static MinecraftServer server; @@ -122,9 +123,9 @@ public static boolean handlePacket(MinecraftServer server, ServerPlayNetworkHand try { handlePayload(channel, listener, ctx, data); } catch (NotOnMainThreadException e) { - if (server instanceof TaskRunnerAccess) { + if (USE_EVENT_LOOP_FOR_ASYNC_HANDLING) { // use built-in task queue like other packets do (14w21a+) - ((TaskRunnerAccess) server).osl$networking$submit(() -> handlePayload(channel, listener, ctx, data)); + server.execute(() -> handlePayload(channel, listener, ctx, data)); } else { // rethrow so packet is added to the read queue (14w20b-) throw e; diff --git a/libraries/networking/networking-mc13w41a-mc18w30b/src/main/resources/fabric.mod.json b/libraries/networking/networking-mc13w41a-mc18w30b/src/main/resources/fabric.mod.json index 1d450016..c881348f 100644 --- a/libraries/networking/networking-mc13w41a-mc18w30b/src/main/resources/fabric.mod.json +++ b/libraries/networking/networking-mc13w41a-mc18w30b/src/main/resources/fabric.mod.json @@ -10,8 +10,8 @@ "fabricloader": "\u003e\u003d0.18.0", "minecraft": "\u003e\u003d1.7-alpha.13.41.a \u003c\u003d1.13.1-alpha.18.30.b", "osl-core": "\u003e\u003d0.7.0", - "osl-entrypoints": "\u003e\u003d0.5.0", - "osl-lifecycle-events": "\u003e\u003d0.6.0" + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-" }, "name": "OSL Networking", "description": "Client-server networking API and events.", diff --git a/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/api/client/ClientConnectionEvents.java b/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/api/client/ClientConnectionEvents.java index d5adcfb8..c971cb64 100644 --- a/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/api/client/ClientConnectionEvents.java +++ b/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/api/client/ClientConnectionEvents.java @@ -5,11 +5,12 @@ import net.minecraft.client.Minecraft; import net.ornithemc.osl.core.api.events.Event; +import net.ornithemc.osl.text.api.TextComponent; /** * Events related to the client side of a client-server connection. */ -public class ClientConnectionEvents { +public final class ClientConnectionEvents { /** * This event is fired after a successful login occurs. @@ -28,13 +29,13 @@ public class ClientConnectionEvents { * *
 	 * {@code
-	 * ClientConnectionEvents.LOGIN.register(minecraft -> {
+	 * ClientConnectionEvents.LOGIN.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> LOGIN = Event.consumer(); + public static final Event> LOGIN = Event.consumer(); /** * This event is fired after login, once channel registration is complete. * @@ -51,13 +52,13 @@ public class ClientConnectionEvents { * *
 	 * {@code
-	 * ClientConnectionEvents.PLAY_READY.register(minecraft -> {
+	 * ClientConnectionEvents.PLAY_READY.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> PLAY_READY = Event.consumer(); + public static final Event> PLAY_READY = Event.consumer(); /** * This event is fired when the client disconnects from the server. * @@ -71,12 +72,67 @@ public class ClientConnectionEvents { * *
 	 * {@code
-	 * ClientConnectionEvents.DISCONNECT.register(minecraft -> {
+	 * ClientConnectionEvents.DISCONNECT.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> DISCONNECT = Event.consumer(); + public static final Event> DISCONNECT = Event.consumer(); + /** + * Common interface for connection context classes. + */ + public interface ConnectionContext { + + /** + * @return the current {@linkplain Minecraft} instance. + */ + Minecraft minecraft(); + + /** + * @return the name of the selected singleplayer world, or {@code null} if connected to a remote server. + */ + String worldName(); + + /** + * @return the address of the server logged into, or {@code null} if selected a singleplayer world. + */ + String serverAddress(); + + /** + * @return the port of the server logged into, or {@code -1} if selected a singleplayer world. + */ + int serverPort(); + + /** + * @return whether the server is a local integrated server. + */ + boolean isServerLocal(); + + } + + /** + * Access to relevant context for login events. + */ + public interface LoginContext extends ConnectionContext { + } + + /** + * Access to relevant context for play ready events. + */ + public interface PlayReadyContext extends ConnectionContext { + } + + /** + * Access to relevant context for disconnect events. + */ + public interface DisconnectContext extends ConnectionContext { + + /** + * @return the reason for the disconnect, or {@code null} if disconnected by leaving the server or closing the game. + */ + TextComponent disconnectReason(); + + } } diff --git a/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/api/server/ServerConnectionEvents.java b/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/api/server/ServerConnectionEvents.java index e248c524..83c6811c 100644 --- a/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/api/server/ServerConnectionEvents.java +++ b/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/api/server/ServerConnectionEvents.java @@ -1,16 +1,17 @@ package net.ornithemc.osl.networking.api.server; -import java.util.function.BiConsumer; +import java.util.function.Consumer; import net.minecraft.server.MinecraftServer; import net.minecraft.server.entity.living.player.ServerPlayerEntity; import net.ornithemc.osl.core.api.events.Event; +import net.ornithemc.osl.text.api.TextComponent; /** * Events related to the server side of a client-server connection. */ -public class ServerConnectionEvents { +public final class ServerConnectionEvents { /** * This event is fired after a successful login occurs. @@ -29,13 +30,13 @@ public class ServerConnectionEvents { * *
 	 * {@code
-	 * ServerConnectionEvents.LOGIN.register((server, player) -> {
+	 * ServerConnectionEvents.LOGIN.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> LOGIN = Event.biConsumer(); + public static final Event> LOGIN = Event.consumer(); /** * This event is fired after login, once channel registration is complete. * @@ -52,13 +53,13 @@ public class ServerConnectionEvents { * *
 	 * {@code
-	 * ServerConnectionEvents.PLAY_READY.register((server, player) -> {
+	 * ServerConnectionEvents.PLAY_READY.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> PLAY_READY = Event.biConsumer(); + public static final Event> PLAY_READY = Event.consumer(); /** * This event is fired when a client disconnects from the server. * @@ -72,12 +73,52 @@ public class ServerConnectionEvents { * *
 	 * {@code
-	 * ServerConnectionEvents.DISCONNECT.register((server, player) -> {
+	 * ServerConnectionEvents.DISCONNECT.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> DISCONNECT = Event.biConsumer(); + public static final Event> DISCONNECT = Event.consumer(); + /** + * Common interface for connection context classes. + */ + public interface ConnectionContext { + + /** + * @return the current {@linkplain MinecraftServer} instance. + */ + MinecraftServer server(); + + /** + * @return the current {@linkplain ServerPlayerEntity} instance. + */ + ServerPlayerEntity player(); + + } + + /** + * Access to relevant context for login events. + */ + public interface LoginContext extends ConnectionContext { + } + + /** + * Access to relevant context for play ready events. + */ + public interface PlayReadyContext extends ConnectionContext { + } + + /** + * Access to relevant context for disconnect events. + */ + public interface DisconnectContext extends ConnectionContext { + + /** + * @return the reason for the disconnect, or {@code null} if disconnected by leaving the server or closing the game. + */ + TextComponent disconnectReason(); + + } } diff --git a/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/access/TaskRunnerAccess.java b/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/access/TaskRunnerAccess.java deleted file mode 100644 index bff1ba39..00000000 --- a/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/access/TaskRunnerAccess.java +++ /dev/null @@ -1,7 +0,0 @@ -package net.ornithemc.osl.networking.impl.access; - -public interface TaskRunnerAccess { - - boolean osl$networking$submit(Runnable task); - -} diff --git a/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/client/ClientConnectionContext.java b/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/client/ClientConnectionContext.java new file mode 100644 index 00000000..9dcbf193 --- /dev/null +++ b/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/client/ClientConnectionContext.java @@ -0,0 +1,69 @@ +package net.ornithemc.osl.networking.impl.client; + +import net.minecraft.client.Minecraft; + +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents.DisconnectContext; +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents.LoginContext; +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents.PlayReadyContext; +import net.ornithemc.osl.text.api.TextComponent; + +public final class ClientConnectionContext implements LoginContext, PlayReadyContext, DisconnectContext { + + private final Minecraft minecraft; + private final String worldName; + private final String serverAddress; + private final int serverPort; + + private TextComponent disconnectReason; + + public ClientConnectionContext(Minecraft minecraft, String worldName) { + this(minecraft, worldName, null, -1); + } + + public ClientConnectionContext(Minecraft minecraft, String serverAddress, int serverPort) { + this(minecraft, null, serverAddress, serverPort); + } + + private ClientConnectionContext(Minecraft minecraft, String worldName, String serverAddress, int serverPort) { + this.minecraft = minecraft; + this.worldName = worldName; + this.serverAddress = serverAddress; + this.serverPort = serverPort; + } + + @Override + public Minecraft minecraft() { + return this.minecraft; + } + + @Override + public String worldName() { + return this.worldName; + } + + @Override + public String serverAddress() { + return this.serverAddress; + } + + @Override + public int serverPort() { + return this.serverPort; + } + + @Override + public TextComponent disconnectReason() { + return this.disconnectReason; + } + + @Override + public boolean isServerLocal() { + return this.worldName != null; + } + + public void offerDisconnectReason(TextComponent disconnectReason) { + if (this.disconnectReason == null) { + this.disconnectReason = disconnectReason; + } + } +} diff --git a/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java b/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java index e9ba1661..42e00b83 100644 --- a/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java +++ b/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java @@ -24,7 +24,6 @@ import net.ornithemc.osl.networking.impl.PacketFactory; import net.ornithemc.osl.networking.impl.access.CustomPayloadPacketAccess; import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; -import net.ornithemc.osl.networking.impl.access.TaskRunnerAccess; public final class ClientPlayNetworkingImpl { @@ -115,7 +114,7 @@ public static boolean handlePacket(Minecraft minecraft, ClientPlayNetworkHandler try { handlePayload(channel, listener, ctx, data); } catch (NotOnMainThreadException e) { - ((TaskRunnerAccess) minecraft).osl$networking$submit(() -> handlePayload(channel, listener, ctx, data)); + minecraft.execute(() -> handlePayload(channel, listener, ctx, data)); } return true; diff --git a/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/server/ServerConnectionContext.java b/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/server/ServerConnectionContext.java new file mode 100644 index 00000000..11c0dd0a --- /dev/null +++ b/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/server/ServerConnectionContext.java @@ -0,0 +1,44 @@ +package net.ornithemc.osl.networking.impl.server; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.entity.living.player.ServerPlayerEntity; +import net.minecraft.server.network.handler.ServerPlayNetworkHandler; + +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents.DisconnectContext; +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents.LoginContext; +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents.PlayReadyContext; +import net.ornithemc.osl.text.api.TextComponent; + +public final class ServerConnectionContext implements LoginContext, PlayReadyContext, DisconnectContext { + + private final MinecraftServer server; + private final ServerPlayNetworkHandler networkHandler; + + private TextComponent disconnectReason; + + public ServerConnectionContext(MinecraftServer server, ServerPlayNetworkHandler networkHandler) { + this.server = server; + this.networkHandler = networkHandler; + } + + @Override + public MinecraftServer server() { + return this.server; + } + + @Override + public ServerPlayerEntity player() { + return this.networkHandler.player; + } + + @Override + public TextComponent disconnectReason() { + return this.disconnectReason; + } + + public void offerDisconnectReason(TextComponent disconnectReason) { + if (this.disconnectReason == null) { + this.disconnectReason = disconnectReason; + } + } +} diff --git a/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/server/ServerPlayNetworkingImpl.java b/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/server/ServerPlayNetworkingImpl.java index 647c0c11..2dc0cd7b 100644 --- a/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/server/ServerPlayNetworkingImpl.java +++ b/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/server/ServerPlayNetworkingImpl.java @@ -29,7 +29,6 @@ import net.ornithemc.osl.networking.impl.PacketFactory; import net.ornithemc.osl.networking.impl.access.CustomPayloadPacketAccess; import net.ornithemc.osl.networking.impl.access.NetworkHandlerAccess; -import net.ornithemc.osl.networking.impl.access.TaskRunnerAccess; public final class ServerPlayNetworkingImpl { @@ -120,7 +119,7 @@ public static boolean handlePacket(MinecraftServer server, ServerPlayNetworkHand try { handlePayload(channel, listener, ctx, data); } catch (NotOnMainThreadException e) { - ((TaskRunnerAccess) server).osl$networking$submit(() -> handlePayload(channel, listener, ctx, data)); + server.execute(() -> handlePayload(channel, listener, ctx, data)); } return true; diff --git a/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/resources/fabric.mod.json b/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/resources/fabric.mod.json index 883a357e..1ec6f7ee 100644 --- a/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/resources/fabric.mod.json +++ b/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/resources/fabric.mod.json @@ -10,8 +10,8 @@ "fabricloader": "\u003e\u003d0.18.0", "minecraft": "\u003e\u003d1.13.1-alpha.18.31.a \u003c\u003d1.14.4", "osl-core": "\u003e\u003d0.7.0", - "osl-entrypoints": "\u003e\u003d0.5.0", - "osl-lifecycle-events": "\u003e\u003d0.6.0" + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-" }, "name": "OSL Networking", "description": "Client-server networking API and events.", diff --git a/libraries/networking/networking-mca0.1.0-mca0.2.1/src/main/java/net/ornithemc/osl/networking/api/server/ServerConnectionEvents.java b/libraries/networking/networking-mca0.1.0-mca0.2.1/src/main/java/net/ornithemc/osl/networking/api/server/ServerConnectionEvents.java index 9d33bccf..f7c894fd 100644 --- a/libraries/networking/networking-mca0.1.0-mca0.2.1/src/main/java/net/ornithemc/osl/networking/api/server/ServerConnectionEvents.java +++ b/libraries/networking/networking-mca0.1.0-mca0.2.1/src/main/java/net/ornithemc/osl/networking/api/server/ServerConnectionEvents.java @@ -1,16 +1,17 @@ package net.ornithemc.osl.networking.api.server; -import java.util.function.BiConsumer; +import java.util.function.Consumer; import net.minecraft.server.MinecraftServer; import net.minecraft.server.entity.mob.player.ServerPlayerEntity; import net.ornithemc.osl.core.api.events.Event; +import net.ornithemc.osl.text.api.TextComponent; /** * Events related to the server side of a client-server connection. */ -public class ServerConnectionEvents { +public final class ServerConnectionEvents { /** * This event is fired after a successful login occurs. @@ -29,13 +30,13 @@ public class ServerConnectionEvents { * *
 	 * {@code
-	 * ServerConnectionEvents.LOGIN.register((server, player) -> {
+	 * ServerConnectionEvents.LOGIN.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> LOGIN = Event.biConsumer(); + public static final Event> LOGIN = Event.consumer(); /** * This event is fired after login, once channel registration is complete. * @@ -52,13 +53,13 @@ public class ServerConnectionEvents { * *
 	 * {@code
-	 * ServerConnectionEvents.PLAY_READY.register((server, player) -> {
+	 * ServerConnectionEvents.PLAY_READY.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> PLAY_READY = Event.biConsumer(); + public static final Event> PLAY_READY = Event.consumer(); /** * This event is fired when a client disconnects from the server. * @@ -72,12 +73,52 @@ public class ServerConnectionEvents { * *
 	 * {@code
-	 * ServerConnectionEvents.DISCONNECT.register((server, player) -> {
+	 * ServerConnectionEvents.DISCONNECT.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> DISCONNECT = Event.biConsumer(); + public static final Event> DISCONNECT = Event.consumer(); + /** + * Common interface for connection context classes. + */ + public interface ConnectionContext { + + /** + * @return the current {@linkplain MinecraftServer} instance. + */ + MinecraftServer server(); + + /** + * @return the current {@linkplain ServerPlayerEntity} instance. + */ + ServerPlayerEntity player(); + + } + + /** + * Access to relevant context for login events. + */ + public interface LoginContext extends ConnectionContext { + } + + /** + * Access to relevant context for play ready events. + */ + public interface PlayReadyContext extends ConnectionContext { + } + + /** + * Access to relevant context for disconnect events. + */ + public interface DisconnectContext extends ConnectionContext { + + /** + * @return the reason for the disconnect, or {@code null} if disconnected by leaving the server or closing the game. + */ + TextComponent disconnectReason(); + + } } diff --git a/libraries/networking/networking-mca0.1.0-mca0.2.1/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java b/libraries/networking/networking-mca0.1.0-mca0.2.1/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java new file mode 100644 index 00000000..95d03542 --- /dev/null +++ b/libraries/networking/networking-mca0.1.0-mca0.2.1/src/main/java/net/ornithemc/osl/networking/impl/access/ServerNetworkHandlerAccess.java @@ -0,0 +1,13 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.minecraft.server.entity.mob.player.ServerPlayerEntity; + +import net.ornithemc.osl.networking.impl.server.ServerConnectionContext; + +public interface ServerNetworkHandlerAccess extends NetworkHandlerAccess { + + ServerPlayerEntity osl$networkin$player(); + + ServerConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking/networking-mca0.1.0-mca0.2.1/src/main/java/net/ornithemc/osl/networking/impl/server/ServerConnectionContext.java b/libraries/networking/networking-mca0.1.0-mca0.2.1/src/main/java/net/ornithemc/osl/networking/impl/server/ServerConnectionContext.java new file mode 100644 index 00000000..9e0c10f6 --- /dev/null +++ b/libraries/networking/networking-mca0.1.0-mca0.2.1/src/main/java/net/ornithemc/osl/networking/impl/server/ServerConnectionContext.java @@ -0,0 +1,45 @@ +package net.ornithemc.osl.networking.impl.server; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.entity.mob.player.ServerPlayerEntity; +import net.minecraft.server.network.handler.ServerPlayNetworkHandler; + +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents.DisconnectContext; +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents.LoginContext; +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents.PlayReadyContext; +import net.ornithemc.osl.networking.impl.access.ServerNetworkHandlerAccess; +import net.ornithemc.osl.text.api.TextComponent; + +public final class ServerConnectionContext implements LoginContext, PlayReadyContext, DisconnectContext { + + private final MinecraftServer server; + private final ServerPlayNetworkHandler networkHandler; + + private TextComponent disconnectReason; + + public ServerConnectionContext(MinecraftServer server, ServerPlayNetworkHandler networkHandler) { + this.server = server; + this.networkHandler = networkHandler; + } + + @Override + public MinecraftServer server() { + return this.server; + } + + @Override + public ServerPlayerEntity player() { + return ((ServerNetworkHandlerAccess) this.networkHandler).osl$networkin$player(); + } + + @Override + public TextComponent disconnectReason() { + return this.disconnectReason; + } + + public void offerDisconnectReason(TextComponent disconnectReason) { + if (this.disconnectReason == null) { + this.disconnectReason = disconnectReason; + } + } +} diff --git a/libraries/networking/networking-mca0.1.0-mca0.2.1/src/main/resources/fabric.mod.json b/libraries/networking/networking-mca0.1.0-mca0.2.1/src/main/resources/fabric.mod.json index 98004bf7..7ecbb4d1 100644 --- a/libraries/networking/networking-mca0.1.0-mca0.2.1/src/main/resources/fabric.mod.json +++ b/libraries/networking/networking-mca0.1.0-mca0.2.1/src/main/resources/fabric.mod.json @@ -10,8 +10,8 @@ "fabricloader": "\u003e\u003d0.18.0", "minecraft": "\u003e\u003d1.0.0-alpha.1.0 \u003c\u003d1.0.0-alpha.2.1", "osl-core": "\u003e\u003d0.7.0", - "osl-entrypoints": "\u003e\u003d0.5.0", - "osl-lifecycle-events": "\u003e\u003d0.6.0" + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-" }, "name": "OSL Networking", "description": "Client-server networking API and events.", diff --git a/libraries/networking/networking-mca0.2.2-mca0.2.8/src/main/java/net/ornithemc/osl/networking/api/server/ServerConnectionEvents.java b/libraries/networking/networking-mca0.2.2-mca0.2.8/src/main/java/net/ornithemc/osl/networking/api/server/ServerConnectionEvents.java index 9d33bccf..f7c894fd 100644 --- a/libraries/networking/networking-mca0.2.2-mca0.2.8/src/main/java/net/ornithemc/osl/networking/api/server/ServerConnectionEvents.java +++ b/libraries/networking/networking-mca0.2.2-mca0.2.8/src/main/java/net/ornithemc/osl/networking/api/server/ServerConnectionEvents.java @@ -1,16 +1,17 @@ package net.ornithemc.osl.networking.api.server; -import java.util.function.BiConsumer; +import java.util.function.Consumer; import net.minecraft.server.MinecraftServer; import net.minecraft.server.entity.mob.player.ServerPlayerEntity; import net.ornithemc.osl.core.api.events.Event; +import net.ornithemc.osl.text.api.TextComponent; /** * Events related to the server side of a client-server connection. */ -public class ServerConnectionEvents { +public final class ServerConnectionEvents { /** * This event is fired after a successful login occurs. @@ -29,13 +30,13 @@ public class ServerConnectionEvents { * *
 	 * {@code
-	 * ServerConnectionEvents.LOGIN.register((server, player) -> {
+	 * ServerConnectionEvents.LOGIN.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> LOGIN = Event.biConsumer(); + public static final Event> LOGIN = Event.consumer(); /** * This event is fired after login, once channel registration is complete. * @@ -52,13 +53,13 @@ public class ServerConnectionEvents { * *
 	 * {@code
-	 * ServerConnectionEvents.PLAY_READY.register((server, player) -> {
+	 * ServerConnectionEvents.PLAY_READY.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> PLAY_READY = Event.biConsumer(); + public static final Event> PLAY_READY = Event.consumer(); /** * This event is fired when a client disconnects from the server. * @@ -72,12 +73,52 @@ public class ServerConnectionEvents { * *
 	 * {@code
-	 * ServerConnectionEvents.DISCONNECT.register((server, player) -> {
+	 * ServerConnectionEvents.DISCONNECT.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> DISCONNECT = Event.biConsumer(); + public static final Event> DISCONNECT = Event.consumer(); + /** + * Common interface for connection context classes. + */ + public interface ConnectionContext { + + /** + * @return the current {@linkplain MinecraftServer} instance. + */ + MinecraftServer server(); + + /** + * @return the current {@linkplain ServerPlayerEntity} instance. + */ + ServerPlayerEntity player(); + + } + + /** + * Access to relevant context for login events. + */ + public interface LoginContext extends ConnectionContext { + } + + /** + * Access to relevant context for play ready events. + */ + public interface PlayReadyContext extends ConnectionContext { + } + + /** + * Access to relevant context for disconnect events. + */ + public interface DisconnectContext extends ConnectionContext { + + /** + * @return the reason for the disconnect, or {@code null} if disconnected by leaving the server or closing the game. + */ + TextComponent disconnectReason(); + + } } diff --git a/libraries/networking/networking-mca0.2.2-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/server/ServerConnectionContext.java b/libraries/networking/networking-mca0.2.2-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/server/ServerConnectionContext.java new file mode 100644 index 00000000..86769405 --- /dev/null +++ b/libraries/networking/networking-mca0.2.2-mca0.2.8/src/main/java/net/ornithemc/osl/networking/impl/server/ServerConnectionContext.java @@ -0,0 +1,44 @@ +package net.ornithemc.osl.networking.impl.server; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.entity.mob.player.ServerPlayerEntity; +import net.minecraft.server.network.handler.ServerPlayNetworkHandler; + +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents.DisconnectContext; +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents.LoginContext; +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents.PlayReadyContext; +import net.ornithemc.osl.text.api.TextComponent; + +public final class ServerConnectionContext implements LoginContext, PlayReadyContext, DisconnectContext { + + private final MinecraftServer server; + private final ServerPlayNetworkHandler networkHandler; + + private TextComponent disconnectReason; + + public ServerConnectionContext(MinecraftServer server, ServerPlayNetworkHandler networkHandler) { + this.server = server; + this.networkHandler = networkHandler; + } + + @Override + public MinecraftServer server() { + return this.server; + } + + @Override + public ServerPlayerEntity player() { + return this.networkHandler.player; + } + + @Override + public TextComponent disconnectReason() { + return this.disconnectReason; + } + + public void offerDisconnectReason(TextComponent disconnectReason) { + if (this.disconnectReason == null) { + this.disconnectReason = disconnectReason; + } + } +} diff --git a/libraries/networking/networking-mca0.2.2-mca0.2.8/src/main/resources/fabric.mod.json b/libraries/networking/networking-mca0.2.2-mca0.2.8/src/main/resources/fabric.mod.json index 501017a4..37ab456f 100644 --- a/libraries/networking/networking-mca0.2.2-mca0.2.8/src/main/resources/fabric.mod.json +++ b/libraries/networking/networking-mca0.2.2-mca0.2.8/src/main/resources/fabric.mod.json @@ -10,8 +10,8 @@ "fabricloader": "\u003e\u003d0.18.0", "minecraft": "\u003e\u003d1.0.0-alpha.2.2 \u003c\u003d1.0.0-alpha.2.8", "osl-core": "\u003e\u003d0.7.0", - "osl-entrypoints": "\u003e\u003d0.5.0", - "osl-lifecycle-events": "\u003e\u003d0.6.0" + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-" }, "name": "OSL Networking", "description": "Client-server networking API and events.", diff --git a/libraries/networking/networking-mca0.2.2-mca0.2.8/src/main/resources/osl.networking.classtweaker b/libraries/networking/networking-mca0.2.2-mca0.2.8/src/main/resources/osl.networking.classtweaker new file mode 100644 index 00000000..9972f883 --- /dev/null +++ b/libraries/networking/networking-mca0.2.2-mca0.2.8/src/main/resources/osl.networking.classtweaker @@ -0,0 +1,3 @@ +classTweaker v1 named + +accessible field net/minecraft/server/network/handler/ServerPlayNetworkHandler player Lnet/minecraft/server/entity/mob/player/ServerPlayerEntity; \ No newline at end of file diff --git a/libraries/networking/networking-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/api/client/ClientConnectionEvents.java b/libraries/networking/networking-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/api/client/ClientConnectionEvents.java index d5adcfb8..c971cb64 100644 --- a/libraries/networking/networking-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/api/client/ClientConnectionEvents.java +++ b/libraries/networking/networking-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/api/client/ClientConnectionEvents.java @@ -5,11 +5,12 @@ import net.minecraft.client.Minecraft; import net.ornithemc.osl.core.api.events.Event; +import net.ornithemc.osl.text.api.TextComponent; /** * Events related to the client side of a client-server connection. */ -public class ClientConnectionEvents { +public final class ClientConnectionEvents { /** * This event is fired after a successful login occurs. @@ -28,13 +29,13 @@ public class ClientConnectionEvents { * *
 	 * {@code
-	 * ClientConnectionEvents.LOGIN.register(minecraft -> {
+	 * ClientConnectionEvents.LOGIN.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> LOGIN = Event.consumer(); + public static final Event> LOGIN = Event.consumer(); /** * This event is fired after login, once channel registration is complete. * @@ -51,13 +52,13 @@ public class ClientConnectionEvents { * *
 	 * {@code
-	 * ClientConnectionEvents.PLAY_READY.register(minecraft -> {
+	 * ClientConnectionEvents.PLAY_READY.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> PLAY_READY = Event.consumer(); + public static final Event> PLAY_READY = Event.consumer(); /** * This event is fired when the client disconnects from the server. * @@ -71,12 +72,67 @@ public class ClientConnectionEvents { * *
 	 * {@code
-	 * ClientConnectionEvents.DISCONNECT.register(minecraft -> {
+	 * ClientConnectionEvents.DISCONNECT.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> DISCONNECT = Event.consumer(); + public static final Event> DISCONNECT = Event.consumer(); + /** + * Common interface for connection context classes. + */ + public interface ConnectionContext { + + /** + * @return the current {@linkplain Minecraft} instance. + */ + Minecraft minecraft(); + + /** + * @return the name of the selected singleplayer world, or {@code null} if connected to a remote server. + */ + String worldName(); + + /** + * @return the address of the server logged into, or {@code null} if selected a singleplayer world. + */ + String serverAddress(); + + /** + * @return the port of the server logged into, or {@code -1} if selected a singleplayer world. + */ + int serverPort(); + + /** + * @return whether the server is a local integrated server. + */ + boolean isServerLocal(); + + } + + /** + * Access to relevant context for login events. + */ + public interface LoginContext extends ConnectionContext { + } + + /** + * Access to relevant context for play ready events. + */ + public interface PlayReadyContext extends ConnectionContext { + } + + /** + * Access to relevant context for disconnect events. + */ + public interface DisconnectContext extends ConnectionContext { + + /** + * @return the reason for the disconnect, or {@code null} if disconnected by leaving the server or closing the game. + */ + TextComponent disconnectReason(); + + } } diff --git a/libraries/networking/networking-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java b/libraries/networking/networking-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java new file mode 100644 index 00000000..e067a183 --- /dev/null +++ b/libraries/networking/networking-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/access/ClientNetworkHandlerAccess.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.networking.impl.access; + +import net.ornithemc.osl.networking.impl.client.ClientConnectionContext; + +public interface ClientNetworkHandlerAccess extends NetworkHandlerAccess { + + ClientConnectionContext osl$networking$connectionContext(); + +} diff --git a/libraries/networking/networking-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/client/ClientConnectionContext.java b/libraries/networking/networking-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/client/ClientConnectionContext.java new file mode 100644 index 00000000..9dcbf193 --- /dev/null +++ b/libraries/networking/networking-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/client/ClientConnectionContext.java @@ -0,0 +1,69 @@ +package net.ornithemc.osl.networking.impl.client; + +import net.minecraft.client.Minecraft; + +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents.DisconnectContext; +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents.LoginContext; +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents.PlayReadyContext; +import net.ornithemc.osl.text.api.TextComponent; + +public final class ClientConnectionContext implements LoginContext, PlayReadyContext, DisconnectContext { + + private final Minecraft minecraft; + private final String worldName; + private final String serverAddress; + private final int serverPort; + + private TextComponent disconnectReason; + + public ClientConnectionContext(Minecraft minecraft, String worldName) { + this(minecraft, worldName, null, -1); + } + + public ClientConnectionContext(Minecraft minecraft, String serverAddress, int serverPort) { + this(minecraft, null, serverAddress, serverPort); + } + + private ClientConnectionContext(Minecraft minecraft, String worldName, String serverAddress, int serverPort) { + this.minecraft = minecraft; + this.worldName = worldName; + this.serverAddress = serverAddress; + this.serverPort = serverPort; + } + + @Override + public Minecraft minecraft() { + return this.minecraft; + } + + @Override + public String worldName() { + return this.worldName; + } + + @Override + public String serverAddress() { + return this.serverAddress; + } + + @Override + public int serverPort() { + return this.serverPort; + } + + @Override + public TextComponent disconnectReason() { + return this.disconnectReason; + } + + @Override + public boolean isServerLocal() { + return this.worldName != null; + } + + public void offerDisconnectReason(TextComponent disconnectReason) { + if (this.disconnectReason == null) { + this.disconnectReason = disconnectReason; + } + } +} diff --git a/libraries/networking/networking-mca1.0.16-mca1.2.6/src/main/resources/fabric.mod.json b/libraries/networking/networking-mca1.0.16-mca1.2.6/src/main/resources/fabric.mod.json index 9ead7866..dd6007ea 100644 --- a/libraries/networking/networking-mca1.0.16-mca1.2.6/src/main/resources/fabric.mod.json +++ b/libraries/networking/networking-mca1.0.16-mca1.2.6/src/main/resources/fabric.mod.json @@ -10,8 +10,8 @@ "fabricloader": "\u003e\u003d0.18.0", "minecraft": "\u003e\u003d1.0.0-alpha.0.16 \u003c\u003d1.0.0-alpha.2.6", "osl-core": "\u003e\u003d0.7.0", - "osl-entrypoints": "\u003e\u003d0.5.0", - "osl-lifecycle-events": "\u003e\u003d0.6.0" + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-" }, "name": "OSL Networking", "description": "Client-server networking API and events.", diff --git a/libraries/networking/networking-mcb1.0-mc13w39b/src/main/java/net/ornithemc/osl/networking/api/client/ClientConnectionEvents.java b/libraries/networking/networking-mcb1.0-mc13w39b/src/main/java/net/ornithemc/osl/networking/api/client/ClientConnectionEvents.java index d5adcfb8..c971cb64 100644 --- a/libraries/networking/networking-mcb1.0-mc13w39b/src/main/java/net/ornithemc/osl/networking/api/client/ClientConnectionEvents.java +++ b/libraries/networking/networking-mcb1.0-mc13w39b/src/main/java/net/ornithemc/osl/networking/api/client/ClientConnectionEvents.java @@ -5,11 +5,12 @@ import net.minecraft.client.Minecraft; import net.ornithemc.osl.core.api.events.Event; +import net.ornithemc.osl.text.api.TextComponent; /** * Events related to the client side of a client-server connection. */ -public class ClientConnectionEvents { +public final class ClientConnectionEvents { /** * This event is fired after a successful login occurs. @@ -28,13 +29,13 @@ public class ClientConnectionEvents { * *
 	 * {@code
-	 * ClientConnectionEvents.LOGIN.register(minecraft -> {
+	 * ClientConnectionEvents.LOGIN.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> LOGIN = Event.consumer(); + public static final Event> LOGIN = Event.consumer(); /** * This event is fired after login, once channel registration is complete. * @@ -51,13 +52,13 @@ public class ClientConnectionEvents { * *
 	 * {@code
-	 * ClientConnectionEvents.PLAY_READY.register(minecraft -> {
+	 * ClientConnectionEvents.PLAY_READY.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> PLAY_READY = Event.consumer(); + public static final Event> PLAY_READY = Event.consumer(); /** * This event is fired when the client disconnects from the server. * @@ -71,12 +72,67 @@ public class ClientConnectionEvents { * *
 	 * {@code
-	 * ClientConnectionEvents.DISCONNECT.register(minecraft -> {
+	 * ClientConnectionEvents.DISCONNECT.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> DISCONNECT = Event.consumer(); + public static final Event> DISCONNECT = Event.consumer(); + /** + * Common interface for connection context classes. + */ + public interface ConnectionContext { + + /** + * @return the current {@linkplain Minecraft} instance. + */ + Minecraft minecraft(); + + /** + * @return the name of the selected singleplayer world, or {@code null} if connected to a remote server. + */ + String worldName(); + + /** + * @return the address of the server logged into, or {@code null} if selected a singleplayer world. + */ + String serverAddress(); + + /** + * @return the port of the server logged into, or {@code -1} if selected a singleplayer world. + */ + int serverPort(); + + /** + * @return whether the server is a local integrated server. + */ + boolean isServerLocal(); + + } + + /** + * Access to relevant context for login events. + */ + public interface LoginContext extends ConnectionContext { + } + + /** + * Access to relevant context for play ready events. + */ + public interface PlayReadyContext extends ConnectionContext { + } + + /** + * Access to relevant context for disconnect events. + */ + public interface DisconnectContext extends ConnectionContext { + + /** + * @return the reason for the disconnect, or {@code null} if disconnected by leaving the server or closing the game. + */ + TextComponent disconnectReason(); + + } } diff --git a/libraries/networking/networking-mcb1.0-mc13w39b/src/main/java/net/ornithemc/osl/networking/api/server/ServerConnectionEvents.java b/libraries/networking/networking-mcb1.0-mc13w39b/src/main/java/net/ornithemc/osl/networking/api/server/ServerConnectionEvents.java index 9d33bccf..f7c894fd 100644 --- a/libraries/networking/networking-mcb1.0-mc13w39b/src/main/java/net/ornithemc/osl/networking/api/server/ServerConnectionEvents.java +++ b/libraries/networking/networking-mcb1.0-mc13w39b/src/main/java/net/ornithemc/osl/networking/api/server/ServerConnectionEvents.java @@ -1,16 +1,17 @@ package net.ornithemc.osl.networking.api.server; -import java.util.function.BiConsumer; +import java.util.function.Consumer; import net.minecraft.server.MinecraftServer; import net.minecraft.server.entity.mob.player.ServerPlayerEntity; import net.ornithemc.osl.core.api.events.Event; +import net.ornithemc.osl.text.api.TextComponent; /** * Events related to the server side of a client-server connection. */ -public class ServerConnectionEvents { +public final class ServerConnectionEvents { /** * This event is fired after a successful login occurs. @@ -29,13 +30,13 @@ public class ServerConnectionEvents { * *
 	 * {@code
-	 * ServerConnectionEvents.LOGIN.register((server, player) -> {
+	 * ServerConnectionEvents.LOGIN.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> LOGIN = Event.biConsumer(); + public static final Event> LOGIN = Event.consumer(); /** * This event is fired after login, once channel registration is complete. * @@ -52,13 +53,13 @@ public class ServerConnectionEvents { * *
 	 * {@code
-	 * ServerConnectionEvents.PLAY_READY.register((server, player) -> {
+	 * ServerConnectionEvents.PLAY_READY.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> PLAY_READY = Event.biConsumer(); + public static final Event> PLAY_READY = Event.consumer(); /** * This event is fired when a client disconnects from the server. * @@ -72,12 +73,52 @@ public class ServerConnectionEvents { * *
 	 * {@code
-	 * ServerConnectionEvents.DISCONNECT.register((server, player) -> {
+	 * ServerConnectionEvents.DISCONNECT.register(context -> {
 	 * 	...
 	 * });
 	 * }
 	 * 
*/ - public static final Event> DISCONNECT = Event.biConsumer(); + public static final Event> DISCONNECT = Event.consumer(); + /** + * Common interface for connection context classes. + */ + public interface ConnectionContext { + + /** + * @return the current {@linkplain MinecraftServer} instance. + */ + MinecraftServer server(); + + /** + * @return the current {@linkplain ServerPlayerEntity} instance. + */ + ServerPlayerEntity player(); + + } + + /** + * Access to relevant context for login events. + */ + public interface LoginContext extends ConnectionContext { + } + + /** + * Access to relevant context for play ready events. + */ + public interface PlayReadyContext extends ConnectionContext { + } + + /** + * Access to relevant context for disconnect events. + */ + public interface DisconnectContext extends ConnectionContext { + + /** + * @return the reason for the disconnect, or {@code null} if disconnected by leaving the server or closing the game. + */ + TextComponent disconnectReason(); + + } } diff --git a/libraries/networking/networking-mcb1.0-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/client/ClientConnectionContext.java b/libraries/networking/networking-mcb1.0-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/client/ClientConnectionContext.java new file mode 100644 index 00000000..9dcbf193 --- /dev/null +++ b/libraries/networking/networking-mcb1.0-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/client/ClientConnectionContext.java @@ -0,0 +1,69 @@ +package net.ornithemc.osl.networking.impl.client; + +import net.minecraft.client.Minecraft; + +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents.DisconnectContext; +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents.LoginContext; +import net.ornithemc.osl.networking.api.client.ClientConnectionEvents.PlayReadyContext; +import net.ornithemc.osl.text.api.TextComponent; + +public final class ClientConnectionContext implements LoginContext, PlayReadyContext, DisconnectContext { + + private final Minecraft minecraft; + private final String worldName; + private final String serverAddress; + private final int serverPort; + + private TextComponent disconnectReason; + + public ClientConnectionContext(Minecraft minecraft, String worldName) { + this(minecraft, worldName, null, -1); + } + + public ClientConnectionContext(Minecraft minecraft, String serverAddress, int serverPort) { + this(minecraft, null, serverAddress, serverPort); + } + + private ClientConnectionContext(Minecraft minecraft, String worldName, String serverAddress, int serverPort) { + this.minecraft = minecraft; + this.worldName = worldName; + this.serverAddress = serverAddress; + this.serverPort = serverPort; + } + + @Override + public Minecraft minecraft() { + return this.minecraft; + } + + @Override + public String worldName() { + return this.worldName; + } + + @Override + public String serverAddress() { + return this.serverAddress; + } + + @Override + public int serverPort() { + return this.serverPort; + } + + @Override + public TextComponent disconnectReason() { + return this.disconnectReason; + } + + @Override + public boolean isServerLocal() { + return this.worldName != null; + } + + public void offerDisconnectReason(TextComponent disconnectReason) { + if (this.disconnectReason == null) { + this.disconnectReason = disconnectReason; + } + } +} diff --git a/libraries/networking/networking-mcb1.0-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/server/ServerConnectionContext.java b/libraries/networking/networking-mcb1.0-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/server/ServerConnectionContext.java new file mode 100644 index 00000000..86769405 --- /dev/null +++ b/libraries/networking/networking-mcb1.0-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/server/ServerConnectionContext.java @@ -0,0 +1,44 @@ +package net.ornithemc.osl.networking.impl.server; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.entity.mob.player.ServerPlayerEntity; +import net.minecraft.server.network.handler.ServerPlayNetworkHandler; + +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents.DisconnectContext; +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents.LoginContext; +import net.ornithemc.osl.networking.api.server.ServerConnectionEvents.PlayReadyContext; +import net.ornithemc.osl.text.api.TextComponent; + +public final class ServerConnectionContext implements LoginContext, PlayReadyContext, DisconnectContext { + + private final MinecraftServer server; + private final ServerPlayNetworkHandler networkHandler; + + private TextComponent disconnectReason; + + public ServerConnectionContext(MinecraftServer server, ServerPlayNetworkHandler networkHandler) { + this.server = server; + this.networkHandler = networkHandler; + } + + @Override + public MinecraftServer server() { + return this.server; + } + + @Override + public ServerPlayerEntity player() { + return this.networkHandler.player; + } + + @Override + public TextComponent disconnectReason() { + return this.disconnectReason; + } + + public void offerDisconnectReason(TextComponent disconnectReason) { + if (this.disconnectReason == null) { + this.disconnectReason = disconnectReason; + } + } +} diff --git a/libraries/networking/networking-mcb1.0-mc13w39b/src/main/resources/fabric.mod.json b/libraries/networking/networking-mcb1.0-mc13w39b/src/main/resources/fabric.mod.json index 7569828e..e2103655 100644 --- a/libraries/networking/networking-mcb1.0-mc13w39b/src/main/resources/fabric.mod.json +++ b/libraries/networking/networking-mcb1.0-mc13w39b/src/main/resources/fabric.mod.json @@ -10,8 +10,8 @@ "fabricloader": "\u003e\u003d0.18.0", "minecraft": "\u003e\u003d1.0.0-beta.0 \u003c\u003d1.7-alpha.13.39.b", "osl-core": "\u003e\u003d0.7.0", - "osl-entrypoints": "\u003e\u003d0.5.0", - "osl-lifecycle-events": "\u003e\u003d0.6.0" + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-" }, "name": "OSL Networking", "description": "Client-server networking API and events.", diff --git a/libraries/networking/networking-mcb1.0-mc13w39b/src/main/resources/osl.networking.classtweaker b/libraries/networking/networking-mcb1.0-mc13w39b/src/main/resources/osl.networking.classtweaker new file mode 100644 index 00000000..9972f883 --- /dev/null +++ b/libraries/networking/networking-mcb1.0-mc13w39b/src/main/resources/osl.networking.classtweaker @@ -0,0 +1,3 @@ +classTweaker v1 named + +accessible field net/minecraft/server/network/handler/ServerPlayNetworkHandler player Lnet/minecraft/server/entity/mob/player/ServerPlayerEntity; \ No newline at end of file diff --git a/libraries/networking/src/main/java/net/ornithemc/osl/networking/impl/AddressParser.java b/libraries/networking/src/main/java/net/ornithemc/osl/networking/impl/AddressParser.java new file mode 100644 index 00000000..0d026b87 --- /dev/null +++ b/libraries/networking/src/main/java/net/ornithemc/osl/networking/impl/AddressParser.java @@ -0,0 +1,36 @@ +package net.ornithemc.osl.networking.impl; + +import java.net.SocketAddress; + +public final class AddressParser { + + public static final int DEFAULT_PORT = 25565; + + public static String getAddress(SocketAddress socketAddress) { + String address = socketAddress.toString(); + + if (address.contains("/")) { + address = address.substring(address.indexOf('/') + 1); + } + if (address.contains(":")) { + address = address.substring(0, address.indexOf(':')); + } + + return address; + } + + public static int getPort(SocketAddress socketAddress) { + String address = socketAddress.toString(); + + if (address.contains(":")) { + String port = address.substring(address.indexOf(':') + 1); + + try { + return Integer.parseInt(port); + } catch (NumberFormatException ignored) { + } + } + + return -1; + } +}