From 10dcdfec5841c90857c206f54b69c931d436effa Mon Sep 17 00:00:00 2001 From: haykam821 <24855774+haykam821@users.noreply.github.com> Date: Wed, 24 Feb 2021 20:46:06 -0500 Subject: [PATCH 1/4] Add the player add game packet --- doc/network.md | 17 ++++++ .../nucleoid/plasmid/event/GamePackets.java | 58 +++++++++++++++++++ .../plasmid/game/ManagedGameSpace.java | 2 + 3 files changed, 77 insertions(+) create mode 100644 src/main/java/xyz/nucleoid/plasmid/event/GamePackets.java diff --git a/doc/network.md b/doc/network.md index 9a48a58e..9e72f912 100644 --- a/doc/network.md +++ b/doc/network.md @@ -89,6 +89,23 @@ Size: 0 if non-present, else size of `X`. ## Packets +### Game-related Packets + +#### `plasmid:game/player_add` + +Packet sent when a player is joined to a game space. + +Direction: `C<-S` + +| Fields | Type | Description | +|:--------------:|:----------:|:----------------------------------------------------------------| +| game_type_id | Identifier | The identifier of the game type. | +| game_type_name | Text | The name of the game type. | +| game_id | Identifier | The identifier of the game. | +| game_name | Text | The name of the game. | +| player_count | int | The new player count of the game space after the player joined. | +| player_uuid | UUID | The UUID of the player that joined the game space. | + ### Workspace-related Packets The server controls most of the requests sent by a client for workspace-related packets as it requires some permissions. diff --git a/src/main/java/xyz/nucleoid/plasmid/event/GamePackets.java b/src/main/java/xyz/nucleoid/plasmid/event/GamePackets.java new file mode 100644 index 00000000..b430fac7 --- /dev/null +++ b/src/main/java/xyz/nucleoid/plasmid/event/GamePackets.java @@ -0,0 +1,58 @@ +package xyz.nucleoid.plasmid.event; + +import java.util.function.Consumer; + +import io.netty.buffer.Unpooled; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.Identifier; +import xyz.nucleoid.plasmid.Plasmid; +import xyz.nucleoid.plasmid.game.ConfiguredGame; +import xyz.nucleoid.plasmid.game.GameSpace; +import xyz.nucleoid.plasmid.game.GameType; + +/** + * A helper class for creating {@linkplain net.minecraft.network.packet.c2s.play.CustomPayloadC2SPacket custom payload packets} to send to clients. + */ +public final class GamePackets { + private GamePackets() { } + + public static CustomPayloadS2CPacket playerAdd(GameSpace gameSpace, ServerPlayerEntity player) { + return createPacket("player_add", buf -> writeGameAndPlayerInfo(buf, gameSpace, player)); + } + + private static void writeGameAndPlayerInfo(PacketByteBuf buf, GameSpace gameSpace, ServerPlayerEntity player) { + writeGameInfo(buf, gameSpace); + writePlayerInfo(buf, gameSpace, player); + } + + private static void writeGameInfo(PacketByteBuf buf, GameSpace gameSpace) { + ConfiguredGame game = gameSpace.getGameConfig(); + GameType gameType = game.getType(); + + // Game type ID and name + buf.writeIdentifier(gameType.getIdentifier()); + buf.writeText(gameType.getName()); + + // Game ID and name + buf.writeIdentifier(game.getSource()); + buf.writeText(game.getNameText()); + } + + private static void writePlayerInfo(PacketByteBuf buf, GameSpace gameSpace, ServerPlayerEntity player) { + buf.writeInt(gameSpace.getPlayerCount()); + buf.writeUuid(player.getUuid()); + } + + private static CustomPayloadS2CPacket createPacket(String type, Consumer writer) { + PacketByteBuf buf = new PacketByteBuf(Unpooled.buffer()); + writer.accept(buf); + + return new CustomPayloadS2CPacket(createChannel(type), buf); + } + + private static Identifier createChannel(String type) { + return new Identifier(Plasmid.ID, "game/" + type); + } +} diff --git a/src/main/java/xyz/nucleoid/plasmid/game/ManagedGameSpace.java b/src/main/java/xyz/nucleoid/plasmid/game/ManagedGameSpace.java index 8a3a4c6a..96b36540 100644 --- a/src/main/java/xyz/nucleoid/plasmid/game/ManagedGameSpace.java +++ b/src/main/java/xyz/nucleoid/plasmid/game/ManagedGameSpace.java @@ -24,6 +24,7 @@ import xyz.nucleoid.leukocyte.shape.ProtectionShape; import xyz.nucleoid.plasmid.error.ErrorReporter; import xyz.nucleoid.plasmid.event.GameEvents; +import xyz.nucleoid.plasmid.event.GamePackets; import xyz.nucleoid.plasmid.game.event.*; import xyz.nucleoid.plasmid.game.player.JoinResult; import xyz.nucleoid.plasmid.game.player.MutablePlayerSet; @@ -238,6 +239,7 @@ public boolean addPlayer(ServerPlayerEntity player) { } this.lifecycle.addPlayer(this, player); + GamePackets.playerAdd(this, player); return true; } From ea668f1f7cc528f83dab524346cd871be35e78cb Mon Sep 17 00:00:00 2001 From: haykam821 <24855774+haykam821@users.noreply.github.com> Date: Wed, 24 Feb 2021 20:47:27 -0500 Subject: [PATCH 2/4] Add the player remove game packet --- doc/network.md | 15 +++++++++++++++ .../xyz/nucleoid/plasmid/event/GamePackets.java | 4 ++++ .../nucleoid/plasmid/game/ManagedGameSpace.java | 1 + 3 files changed, 20 insertions(+) diff --git a/doc/network.md b/doc/network.md index 9e72f912..c44247bf 100644 --- a/doc/network.md +++ b/doc/network.md @@ -106,6 +106,21 @@ Direction: `C<-S` | player_count | int | The new player count of the game space after the player joined. | | player_uuid | UUID | The UUID of the player that joined the game space. | +#### `plasmid:game/player_removed` + +Packet sent when a player is remove from a game space. + +Direction: `C<-S` + +| Fields | Type | Description | +|:--------------:|:----------:|:--------------------------------------------------------------------| +| game_type_id | Identifier | The identifier of the game type. | +| game_type_name | Text | The name of the game type. | +| game_id | Identifier | The identifier of the game. | +| game_name | Text | The name of the game. | +| player_count | int | The new player count of the game space after the player is removed. | +| player_uuid | UUID | The UUID of the player that was removed from the game space. | + ### Workspace-related Packets The server controls most of the requests sent by a client for workspace-related packets as it requires some permissions. diff --git a/src/main/java/xyz/nucleoid/plasmid/event/GamePackets.java b/src/main/java/xyz/nucleoid/plasmid/event/GamePackets.java index b430fac7..8031993f 100644 --- a/src/main/java/xyz/nucleoid/plasmid/event/GamePackets.java +++ b/src/main/java/xyz/nucleoid/plasmid/event/GamePackets.java @@ -22,6 +22,10 @@ public static CustomPayloadS2CPacket playerAdd(GameSpace gameSpace, ServerPlayer return createPacket("player_add", buf -> writeGameAndPlayerInfo(buf, gameSpace, player)); } + public static CustomPayloadS2CPacket playerRemove(GameSpace gameSpace, ServerPlayerEntity player) { + return createPacket("player_remove", buf -> writeGameAndPlayerInfo(buf, gameSpace, player)); + } + private static void writeGameAndPlayerInfo(PacketByteBuf buf, GameSpace gameSpace, ServerPlayerEntity player) { writeGameInfo(buf, gameSpace); writePlayerInfo(buf, gameSpace, player); diff --git a/src/main/java/xyz/nucleoid/plasmid/game/ManagedGameSpace.java b/src/main/java/xyz/nucleoid/plasmid/game/ManagedGameSpace.java index 96b36540..34a0184d 100644 --- a/src/main/java/xyz/nucleoid/plasmid/game/ManagedGameSpace.java +++ b/src/main/java/xyz/nucleoid/plasmid/game/ManagedGameSpace.java @@ -266,6 +266,7 @@ private void onRemovePlayer(ServerPlayerEntity player) { this.players.remove(player); this.lifecycle.removePlayer(this, player); + GamePackets.playerRemove(this, player); if (this.getPlayerCount() <= 0) { this.close(GameCloseReason.CANCELED); From 53a4f36f9435c632f91ddb711d94573885c05024 Mon Sep 17 00:00:00 2001 From: haykam821 <24855774+haykam821@users.noreply.github.com> Date: Wed, 24 Feb 2021 20:59:13 -0500 Subject: [PATCH 3/4] Add the game close game packet --- doc/network.md | 14 ++++++++++++++ .../xyz/nucleoid/plasmid/event/GamePackets.java | 8 ++++++++ .../nucleoid/plasmid/game/ManagedGameSpace.java | 1 + 3 files changed, 23 insertions(+) diff --git a/doc/network.md b/doc/network.md index c44247bf..07fb10b8 100644 --- a/doc/network.md +++ b/doc/network.md @@ -121,6 +121,20 @@ Direction: `C<-S` | player_count | int | The new player count of the game space after the player is removed. | | player_uuid | UUID | The UUID of the player that was removed from the game space. | +#### `plasmid:game/game_close` + +Packet sent when a game space closes. + +Direction: `C<-S` + +| Fields | Type | Description | +|:--------------:|:---------------:|:-----------------------------------| +| game_type_id | Identifier | The identifier of the game type. | +| game_type_name | Text | The name of the game type. | +| game_id | Identifier | The identifier of the game. | +| game_name | Text | The name of the game. | +| reason | GameCloseReason | The reason for the game's closure. | + ### Workspace-related Packets The server controls most of the requests sent by a client for workspace-related packets as it requires some permissions. diff --git a/src/main/java/xyz/nucleoid/plasmid/event/GamePackets.java b/src/main/java/xyz/nucleoid/plasmid/event/GamePackets.java index 8031993f..7d3c1081 100644 --- a/src/main/java/xyz/nucleoid/plasmid/event/GamePackets.java +++ b/src/main/java/xyz/nucleoid/plasmid/event/GamePackets.java @@ -9,6 +9,7 @@ import net.minecraft.util.Identifier; import xyz.nucleoid.plasmid.Plasmid; import xyz.nucleoid.plasmid.game.ConfiguredGame; +import xyz.nucleoid.plasmid.game.GameCloseReason; import xyz.nucleoid.plasmid.game.GameSpace; import xyz.nucleoid.plasmid.game.GameType; @@ -26,6 +27,13 @@ public static CustomPayloadS2CPacket playerRemove(GameSpace gameSpace, ServerPla return createPacket("player_remove", buf -> writeGameAndPlayerInfo(buf, gameSpace, player)); } + public static CustomPayloadS2CPacket gameClose(GameSpace gameSpace, GameCloseReason reason) { + return createPacket("game_close", buf -> { + writeGameInfo(buf, gameSpace); + buf.writeString(reason == GameCloseReason.FINISHED ? "finished" : "canceled"); + }); + } + private static void writeGameAndPlayerInfo(PacketByteBuf buf, GameSpace gameSpace, ServerPlayerEntity player) { writeGameInfo(buf, gameSpace); writePlayerInfo(buf, gameSpace, player); diff --git a/src/main/java/xyz/nucleoid/plasmid/game/ManagedGameSpace.java b/src/main/java/xyz/nucleoid/plasmid/game/ManagedGameSpace.java index 34a0184d..c152406a 100644 --- a/src/main/java/xyz/nucleoid/plasmid/game/ManagedGameSpace.java +++ b/src/main/java/xyz/nucleoid/plasmid/game/ManagedGameSpace.java @@ -364,6 +364,7 @@ public void close(GameCloseReason reason) { this.resources.close(); this.lifecycle.onClosed(this, players, reason); + GamePackets.gameClose(this, reason); Leukocyte leukocyte = Leukocyte.get(this.getServer()); leukocyte.removeAuthority(this.ruleAuthority); From b921214c9237300c8c9690b6f5bd949b2a1cd958 Mon Sep 17 00:00:00 2001 From: haykam821 <24855774+haykam821@users.noreply.github.com> Date: Wed, 24 Feb 2021 21:03:49 -0500 Subject: [PATCH 4/4] Send game packets to relevant players --- doc/network.md | 8 +++++--- .../nucleoid/plasmid/game/ManagedGameSpace.java | 14 +++++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/doc/network.md b/doc/network.md index 07fb10b8..e6533cff 100644 --- a/doc/network.md +++ b/doc/network.md @@ -93,7 +93,8 @@ Size: 0 if non-present, else size of `X`. #### `plasmid:game/player_add` -Packet sent when a player is joined to a game space. +Packet sent to all players of a game space when a player is joined to a game space. +The player that was joined to the game space also receives this packet. Direction: `C<-S` @@ -108,7 +109,8 @@ Direction: `C<-S` #### `plasmid:game/player_removed` -Packet sent when a player is remove from a game space. +Packet sent to all players of a game space when a player is removed from a game space. +The player that was removed from the game space also receives this packet. Direction: `C<-S` @@ -123,7 +125,7 @@ Direction: `C<-S` #### `plasmid:game/game_close` -Packet sent when a game space closes. +Packet sent to all players in a game space when it closes. Direction: `C<-S` diff --git a/src/main/java/xyz/nucleoid/plasmid/game/ManagedGameSpace.java b/src/main/java/xyz/nucleoid/plasmid/game/ManagedGameSpace.java index c152406a..89ba64c6 100644 --- a/src/main/java/xyz/nucleoid/plasmid/game/ManagedGameSpace.java +++ b/src/main/java/xyz/nucleoid/plasmid/game/ManagedGameSpace.java @@ -2,6 +2,7 @@ import com.google.common.collect.Lists; import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; +import net.minecraft.network.Packet; import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; @@ -239,7 +240,7 @@ public boolean addPlayer(ServerPlayerEntity player) { } this.lifecycle.addPlayer(this, player); - GamePackets.playerAdd(this, player); + this.players.sendPacket(GamePackets.playerAdd(this, player)); return true; } @@ -266,7 +267,10 @@ private void onRemovePlayer(ServerPlayerEntity player) { this.players.remove(player); this.lifecycle.removePlayer(this, player); - GamePackets.playerRemove(this, player); + + Packet packet = GamePackets.playerRemove(this, player); + this.players.sendPacket(packet); + player.networkHandler.sendPacket(packet); if (this.getPlayerCount() <= 0) { this.close(GameCloseReason.CANCELED); @@ -364,7 +368,11 @@ public void close(GameCloseReason reason) { this.resources.close(); this.lifecycle.onClosed(this, players, reason); - GamePackets.gameClose(this, reason); + + Packet packet = GamePackets.gameClose(this, reason); + for (ServerPlayerEntity player : players) { + player.networkHandler.sendPacket(packet); + } Leukocyte leukocyte = Leukocyte.get(this.getServer()); leukocyte.removeAuthority(this.ruleAuthority);