Skip to content

Commit

Permalink
Refactor team selection to command
Browse files Browse the repository at this point in the history
  • Loading branch information
Extremelyd1 committed May 19, 2024
1 parent 2cb9c4a commit 8961034
Show file tree
Hide file tree
Showing 12 changed files with 154 additions and 138 deletions.
1 change: 1 addition & 0 deletions HKMP/Api/Client/IClientManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ public interface IClientManager {
/// Changes the team of the local player.
/// </summary>
/// <param name="team">The team value.</param>
[Obsolete("ChangeTeam is deprecated. Team changes are handled by the IServerManager.")]
void ChangeTeam(Team team);

/// <summary>
Expand Down
3 changes: 3 additions & 0 deletions HKMP/Api/Client/IUiManager.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System;

namespace Hkmp.Api.Client;

Expand All @@ -13,11 +14,13 @@ public interface IUiManager {
/// <summary>
/// Disables the ability for the user to select a team.
/// </summary>
[Obsolete("DisableTeamSelection is deprecated. There is no UI anymore for changing team. Changing teams is handled by the IServerManager.")]
void DisableTeamSelection();

/// <summary>
/// Enables the ability for the user to select a team if it was disabled.
/// </summary>
[Obsolete("EnableTeamSelection is deprecated. There is no UI anymore for changing team. Changing teams is handled by the IServerManager.")]
void EnableTeamSelection();

/// <summary>
Expand Down
30 changes: 0 additions & 30 deletions HKMP/Game/Client/ClientManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -414,31 +414,6 @@ private void OnChatInput(string message) {
_netClient.UpdateManager.SetChatMessage(message);
}

/// <summary>
/// Internal method for changing the local player team.
/// </summary>
/// <param name="team">The new team.</param>
private void InternalChangeTeam(Team team) {
if (!_netClient.IsConnected) {
return;
}

if (!_serverSettings.TeamsEnabled) {
Logger.Debug("Team are not enabled by server");
return;
}

if (_playerManager.LocalPlayerTeam == team) {
return;
}

_playerManager.OnLocalPlayerTeamUpdate(team);

_netClient.UpdateManager.SetTeamUpdate(team);

UiManager.InternalChatBox.AddMessage($"You are now in Team {team}");
}

/// <summary>
/// Internal method for changing the local player skin.
/// </summary>
Expand Down Expand Up @@ -1062,11 +1037,6 @@ public bool TryGetPlayer(ushort id, out IClientPlayer player) {

/// <inheritdoc />
public void ChangeTeam(Team team) {
if (!_netClient.IsConnected) {
throw new InvalidOperationException("Client is not connected, cannot change team");
}

InternalChangeTeam(team);
}

/// <inheritdoc />
Expand Down
15 changes: 11 additions & 4 deletions HKMP/Game/Client/PlayerManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -492,9 +492,16 @@ public void AddNameToPlayer(GameObject playerContainer, string name, Team team =
/// </summary>
/// <param name="playerTeamUpdate">The ClientPlayerTeamUpdate packet data.</param>
private void OnPlayerTeamUpdate(ClientPlayerTeamUpdate playerTeamUpdate) {
var id = playerTeamUpdate.Id;
var team = playerTeamUpdate.Team;

if (playerTeamUpdate.Self) {
Logger.Debug($"Received PlayerTeamUpdate for local player: {Enum.GetName(typeof(Team), team)}");

UpdateLocalPlayerTeam(team);
return;
}

var id = playerTeamUpdate.Id;
Logger.Debug($"Received PlayerTeamUpdate for ID: {id}, team: {Enum.GetName(typeof(Team), team)}");

UpdatePlayerTeam(id, team);
Expand All @@ -504,7 +511,7 @@ private void OnPlayerTeamUpdate(ClientPlayerTeamUpdate playerTeamUpdate) {
/// Reset the local player's team to be None and reset all existing player names and hit-boxes.
/// </summary>
public void ResetAllTeams() {
OnLocalPlayerTeamUpdate(Team.None);
UpdateLocalPlayerTeam(Team.None);

foreach (var id in _playerData.Keys) {
UpdatePlayerTeam(id, Team.None);
Expand Down Expand Up @@ -548,10 +555,10 @@ private void UpdatePlayerTeam(ushort id, Team team) {
}

/// <summary>
/// Callback method for when the team of the local player updates.
/// Update the team for the local player.
/// </summary>
/// <param name="team">The new team of the local player.</param>
public void OnLocalPlayerTeamUpdate(Team team) {
private void UpdateLocalPlayerTeam(Team team) {
LocalPlayerTeam = team;

var nameObject = HeroController.instance.gameObject.FindGameObjectInChildren(UsernameObjectName);
Expand Down
55 changes: 55 additions & 0 deletions HKMP/Game/Command/Server/TeamCommand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
using System;
using Hkmp.Api.Command.Server;
using Hkmp.Game.Server;

namespace Hkmp.Game.Command.Server;

/// <summary>
/// Command for changing the team of the player.
/// </summary>
internal class TeamCommand : IServerCommand {
/// <inheritdoc />
public string Trigger => "/team";

/// <inheritdoc />
public string[] Aliases => Array.Empty<string>();

/// <inheritdoc />
public bool AuthorizedOnly => false;

/// <summary>
/// The server manager instance.
/// </summary>
private readonly ServerManager _serverManager;

public TeamCommand(ServerManager serverManager) {
_serverManager = serverManager;
}

/// <inheritdoc />
public void Execute(ICommandSender commandSender, string[] arguments) {
if (commandSender.Type == CommandSenderType.Console) {
commandSender.SendMessage("Console cannot change teams.");
return;
}

var sender = (PlayerCommandSender) commandSender;

if (arguments.Length != 2) {
sender.SendMessage($"Usage: {Trigger} <None|Moss|Hive|Grimm|Lifeblood>");
return;
}

var teamName = arguments[1];
if (!Enum.TryParse<Team>(teamName, true, out var team)) {
sender.SendMessage($"Unknown team name: '{teamName}'");
return;
}

if (_serverManager.TryUpdatePlayerTeam(sender.Id, team, out var reason)) {
sender.SendMessage($"Team changed to '{team}'");
} else {
sender.SendMessage(reason);
}
}
}
35 changes: 24 additions & 11 deletions HKMP/Game/Server/ServerManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -147,8 +147,6 @@ PacketManager packetManager
OnReliableEntityUpdate);
packetManager.RegisterServerPacketHandler(ServerPacketId.PlayerDisconnect, OnPlayerDisconnect);
packetManager.RegisterServerPacketHandler(ServerPacketId.PlayerDeath, OnPlayerDeath);
packetManager.RegisterServerPacketHandler<ServerPlayerTeamUpdate>(ServerPacketId.PlayerTeamUpdate,
OnPlayerTeamUpdate);
packetManager.RegisterServerPacketHandler<ServerPlayerSkinUpdate>(ServerPacketId.PlayerSkinUpdate,
OnPlayerSkinUpdate);
packetManager.RegisterServerPacketHandler<ChatMessage>(ServerPacketId.ChatMessage, OnChatMessage);
Expand Down Expand Up @@ -184,6 +182,7 @@ protected virtual void RegisterCommands() {
CommandManager.RegisterCommand(new AnnounceCommand(_playerData, _netServer));
CommandManager.RegisterCommand(new BanCommand(_banList, this));
CommandManager.RegisterCommand(new KickCommand(this));
CommandManager.RegisterCommand(new TeamCommand(this));
}

/// <summary>
Expand Down Expand Up @@ -985,33 +984,47 @@ private void OnPlayerDeath(ushort id) {
}

/// <summary>
/// Callback method for when a player updates their team.
/// Try to update the team for the player with the given ID.
/// </summary>
/// <param name="id">The ID of the player.</param>
/// <param name="teamUpdate">The ServerPlayerTeamUpdate packet data.</param>
private void OnPlayerTeamUpdate(ushort id, ServerPlayerTeamUpdate teamUpdate) {
/// <param name="team">The team to change the player to.</param>
/// <param name="reason">The reason if the team could not be updated, otherwise null.</param>
/// <returns>True if the player's team was updated, false otherwise.</returns>
public bool TryUpdatePlayerTeam(ushort id, Team team, out string reason) {
if (!_playerData.TryGetValue(id, out var playerData)) {
Logger.Warn($"Received PlayerTeamUpdate data, but player with ID {id} is not in mapping");
return;

reason = "Could not find player.";
return false;
}

Logger.Info($"Received PlayerTeamUpdate data from ({id}, {playerData.Username}), new team: {teamUpdate.Team}");
Logger.Info($"Received PlayerTeamUpdate data from ({id}, {playerData.Username}) for team: {team}");

if (!ServerSettings.TeamsEnabled) {
Logger.Info(" Teams are not enabled, won't update team");

reason = "Unable to change team.";
return false;
}

// Update the team in the player data
playerData.Team = teamUpdate.Team;
playerData.Team = team;

// Broadcast the packet to all players except the player we received the update from
foreach (var playerId in _playerData.Keys) {
if (id == playerId) {
_netServer.GetUpdateManagerForClient(playerId)?.AddPlayerTeamUpdateData(team);
continue;
}

_netServer.GetUpdateManagerForClient(playerId)?.AddPlayerTeamUpdateData(
_netServer.GetUpdateManagerForClient(playerId)?.AddOtherPlayerTeamUpdateData(
id,
playerData.Username,
teamUpdate.Team
team
);
}

reason = null;
return true;
}

/// <summary>
Expand Down
13 changes: 0 additions & 13 deletions HKMP/Networking/Client/ClientUpdateManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -328,19 +328,6 @@ public void SetPlayerDisconnect() {
}
}

/// <summary>
/// Set a team update in the current packet.
/// </summary>
/// <param name="team">The new team of the player.</param>
public void SetTeamUpdate(Team team) {
lock (Lock) {
CurrentUpdatePacket.SetSendingPacketData(
ServerPacketId.PlayerTeamUpdate,
new ServerPlayerTeamUpdate { Team = team }
);
}
}

/// <summary>
/// Set a skin update in the current packet.
/// </summary>
Expand Down
47 changes: 13 additions & 34 deletions HKMP/Networking/Packet/Data/PlayerTeamUpdate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,60 +7,39 @@ namespace Hkmp.Networking.Packet.Data;
/// </summary>
internal class ClientPlayerTeamUpdate : GenericClientData {
/// <summary>
/// The username of the player.
/// Whether the team update is for the player receiving the packet.
/// </summary>
public string Username { get; set; }
public bool Self { get; set; }

/// <summary>
/// The team of the player.
/// </summary>
public Team Team { get; set; }

/// <summary>
/// Construct the player team update data.
/// </summary>
public ClientPlayerTeamUpdate() {
IsReliable = true;
DropReliableDataIfNewerExists = true;
DropReliableDataIfNewerExists = false;
}

/// <inheritdoc />
public override void WriteData(IPacket packet) {
packet.Write(Id);
packet.Write(Username);
packet.Write(Self);

if (!Self) {
packet.Write(Id);
}

packet.Write((byte) Team);
}

/// <inheritdoc />
public override void ReadData(IPacket packet) {
Id = packet.ReadUShort();
Username = packet.ReadString();
Team = (Team) packet.ReadByte();
}
}

/// <summary>
/// Packet data for the server-bound player team update.
/// </summary>
internal class ServerPlayerTeamUpdate : IPacketData {
/// <inheritdoc />
public bool IsReliable => true;
Self = packet.ReadBool();

/// <inheritdoc />
public bool DropReliableDataIfNewerExists => true;

/// <summary>
/// The team of the player.
/// </summary>
public Team Team { get; set; }
if (!Self) {
Id = packet.ReadUShort();
}

/// <inheritdoc />
public void WriteData(IPacket packet) {
packet.Write((byte) Team);
}

/// <inheritdoc />
public void ReadData(IPacket packet) {
Team = (Team) packet.ReadByte();
}
}
11 changes: 3 additions & 8 deletions HKMP/Networking/Packet/PacketId.cs
Original file line number Diff line number Diff line change
Expand Up @@ -164,23 +164,18 @@ public enum ServerPacketId {
/// </summary>
PlayerDeath = 10,

/// <summary>
/// Notify that a player has changed teams.
/// </summary>
PlayerTeamUpdate = 11,

/// <summary>
/// Notify that a player has changed skins.
/// </summary>
PlayerSkinUpdate = 12,
PlayerSkinUpdate = 11,

/// <summary>
/// Player sent chat message.
/// </summary>
ChatMessage = 13,
ChatMessage = 12,

/// <summary>
/// Value in the save file has updated.
/// </summary>
SaveUpdate = 14,
SaveUpdate = 13,
}
2 changes: 0 additions & 2 deletions HKMP/Networking/Packet/UpdatePacket.cs
Original file line number Diff line number Diff line change
Expand Up @@ -873,8 +873,6 @@ protected override IPacketData InstantiatePacketDataFromId(ServerPacketId packet
return new PacketDataCollection<ReliableEntityUpdate>();
case ServerPacketId.PlayerEnterScene:
return new ServerPlayerEnterScene();
case ServerPacketId.PlayerTeamUpdate:
return new ServerPlayerTeamUpdate();
case ServerPacketId.PlayerSkinUpdate:
return new ServerPlayerSkinUpdate();
case ServerPacketId.ChatMessage:
Expand Down
Loading

0 comments on commit 8961034

Please sign in to comment.