Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion SSMP/Api/Addon/AddonLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ internal abstract class AddonLoader {
];

/// <summary>
/// Get the paths for all assembly files in the HKMP directory.
/// Get the paths for all assembly files in the SSMP directory.
/// </summary>
/// <returns>A string array containing file paths.</returns>
private static string[] GetAssemblyPaths() {
Expand Down
17 changes: 17 additions & 0 deletions SSMP/Api/Client/IClientManager.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using SSMP.Api.Server;
using SSMP.Game;

namespace SSMP.Api.Client;
Expand All @@ -8,6 +9,11 @@ namespace SSMP.Api.Client;
/// Client manager that handles the local client and related data.
/// </summary>
public interface IClientManager {
/// <summary>
/// Class that handles information about players.
/// </summary>
IPlayerManager PlayerManager { get; }

/// <summary>
/// Class that manages player locations on the in-game map.
/// </summary>
Expand All @@ -21,13 +27,24 @@ public interface IClientManager {
/// <summary>
/// The current team of the local player.
/// </summary>
[Obsolete("Use PlayerManager.LocalPlayerTeam instead.")]
Team Team { get; }

/// <summary>
/// A read-only collection of all connected players.
/// </summary>
IReadOnlyCollection<IClientPlayer> Players { get; }

/// <summary>
/// A read-only <see cref="IServerSettings"/> that contains the settings related to gameplay.
/// </summary>
IServerSettings ServerSettings { get; }

/// <summary>
/// A read-only <see cref="IModSettings"/> that contains the settings related to the client.
/// </summary>
IModSettings ModSettings { get; }

/// <summary>
/// Disconnect the local client from the server.
/// </summary>
Expand Down
38 changes: 38 additions & 0 deletions SSMP/Api/Client/IModSettings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
using System;

namespace SSMP.Api.Client;

/// <summary>
/// Settings related to the client/mod that are accessible to addons.
/// </summary>
public interface IModSettings {
/// <summary>
/// Event triggered whenever any of the mod settings are changed.
/// </summary>
event Action<string>? ChangedEvent;

/// <summary>
/// The last used address to join a server.
/// </summary>
string ConnectAddress { get; }

/// <summary>
/// The last used port to join a server.
/// </summary>
int ConnectPort { get; }

/// <summary>
/// The last used username to join a server.
/// </summary>
string Username { get; }

/// <summary>
/// Whether to display a UI element for the ping.
/// </summary>
bool DisplayPing { get; }

/// <summary>
/// Whether full synchronisation of bosses, enemies, worlds, and saves is enabled.
/// </summary>
bool FullSynchronisation { get; }
}
25 changes: 25 additions & 0 deletions SSMP/Api/Client/IPlayerManager.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using System;
using SSMP.Game;

namespace SSMP.Api.Client;

/// <summary>
/// Player manager that handles information about players, such as the local player's team or changes to other players'
/// teams.
/// </summary>
public interface IPlayerManager {
/// <summary>
/// The team that our local player is on.
/// </summary>
Team LocalPlayerTeam { get; }

/// <summary>
/// Event that is called when the local player's team changes.
/// </summary>
event Action<Team>? LocalPlayerTeamChangeEvent;

/// <summary>
/// Event that is called when any player's (including the local player's) team changes.
/// </summary>
event Action<IClientPlayer, Team>? PlayerTeamChangeEvent;
}
6 changes: 6 additions & 0 deletions SSMP/Api/Server/IServerManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using SSMP.Api.Eventing.ServerEvents;
using SSMP.Game;
using SSMP.Game.Settings;
using SSMP.Networking.Packet.Data;

Expand Down Expand Up @@ -97,6 +98,11 @@ public interface IServerManager {
/// </summary>
event Action<IServerPlayer> PlayerLeaveSceneEvent;

/// <summary>
/// Event that is called when a player's team changes.
/// </summary>
event Action<IServerPlayer, Team> PlayerTeamChangedEvent;

/// <summary>
/// Event that is called when a player sends a chat message.
/// </summary>
Expand Down
18 changes: 12 additions & 6 deletions SSMP/Api/Server/IServerSettings.cs
Original file line number Diff line number Diff line change
@@ -1,39 +1,45 @@
using System;

namespace SSMP.Api.Server;

/// <summary>
/// Settings related to gameplay that is shared between server and clients.
/// </summary>
public interface IServerSettings {
/// <summary>
/// Event triggered whenever any of the server settings are changed.
/// </summary>
event Action<string>? ChangeEvent;

/// <summary>
/// Whether player vs. player damage is enabled.
/// </summary>
public bool IsPvpEnabled { get; }
bool IsPvpEnabled { get; }

/// <summary>
/// Whether to always show map icons.
/// </summary>
public bool AlwaysShowMapIcons { get; }
bool AlwaysShowMapIcons { get; }

/// <summary>
/// Whether to only broadcast the map icon of a player if they have wayward compass equipped.
/// </summary>
public bool OnlyBroadcastMapIconWithCompass { get; }
bool OnlyBroadcastMapIconWithCompass { get; }

/// <summary>
/// Whether to display player names above the player objects.
/// </summary>
public bool DisplayNames { get; }
bool DisplayNames { get; }

/// <summary>
/// Whether teams are enabled.
/// </summary>
public bool TeamsEnabled { get; }
bool TeamsEnabled { get; }

/// <summary>
/// Whether skins are allowed.
/// </summary>
public bool AllowSkins { get; }
bool AllowSkins { get; }

// /// <summary>
// /// Whether other player's attacks can be parried.
Expand Down
40 changes: 11 additions & 29 deletions SSMP/Game/Client/ClientManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using Steamworks;
using SSMP.Animation;
using SSMP.Api.Client;
using SSMP.Api.Server;
using SSMP.Eventing;
using SSMP.Fsm;
using SSMP.Game.Client.Entity;
Expand Down Expand Up @@ -167,28 +168,21 @@ internal class ClientManager : IClientManager {
/// </summary>
private bool _sceneHostDetermined;

/// <summary>
/// Event for when the server settings change after being received from the server.
/// The parameter for the action is a copy of the last received server settings.
/// </summary>
public event Action<ServerSettings>? ServerSettingsChangedEvent;

/// <summary>
/// Event for when the player's team changes after being received from the server.
/// </summary>
public event Action<Team>? TeamChangedEvent;

/// <summary>
/// Event for when the player's skin changes after being received from the server.
/// </summary>
public event Action<byte>? SkinChangedEvent;

#endregion

#region IClientManager properties

/// <inheritdoc />
public IPlayerManager PlayerManager => _playerManager;

/// <inheritdoc />
public IMapManager MapManager => _mapManager;

/// <inheritdoc />
public IServerSettings ServerSettings => _serverSettings;

/// <inheritdoc />
public IModSettings ModSettings => _modSettings;

/// <inheritdoc />
public string Username => !_netClient.IsConnected ? throw new Exception("Client is not connected, username is undefined") : _username!;
Expand Down Expand Up @@ -664,10 +658,8 @@ private void OnClientConnect(ServerInfo serverInfo) {

// Update the locally stored server settings
_serverSettings.SetAllProperties(serverInfo.ServerSettingsUpdate.ServerSettings);
// Call the event that the settings were updated
ServerSettingsChangedEvent?.Invoke(serverInfo.ServerSettingsUpdate.ServerSettings);

// Note whether full synchronisation is enabled
// Note whether full synchronization is enabled
_fullSynchronisation = serverInfo.FullSynchronisation;

// Register hooks and packet handlers before we load into the game
Expand Down Expand Up @@ -1126,8 +1118,6 @@ private void OnServerSettingsUpdated(ServerSettingsUpdate update) {

// Update the settings so callbacks can read updated values
_serverSettings.SetAllProperties(newServerSettings);
// Call the event that the settings were updated
ServerSettingsChangedEvent?.Invoke(newServerSettings);

// Only update the player manager if the either PvP or body damage have been changed
if (displayNamesChanged) {
Expand All @@ -1145,8 +1135,6 @@ private void OnServerSettingsUpdated(ServerSettingsUpdate update) {
// If the team setting was disabled, we reset all teams and call the event
if (!_serverSettings.TeamsEnabled) {
_playerManager.ResetAllTeams();

TeamChangedEvent?.Invoke(Team.None);
}

// _uiManager.OnTeamSettingChange();
Expand All @@ -1156,8 +1144,6 @@ private void OnServerSettingsUpdated(ServerSettingsUpdate update) {
// event
if (allowSkinsChanged && !_serverSettings.AllowSkins) {
_playerManager.ResetAllPlayerSkins();

SkinChangedEvent?.Invoke(0);
}
}

Expand Down Expand Up @@ -1300,8 +1286,6 @@ private void OnPlayerSettingUpdate(ClientPlayerSettingUpdate settingUpdate) {
if (settingUpdate.UpdateTypes.Contains(PlayerSettingUpdateType.Team)) {
if (settingUpdate.Self) {
_playerManager.OnPlayerTeamUpdate(true, settingUpdate.Team);

TeamChangedEvent?.Invoke(settingUpdate.Team);
} else {
_playerManager.OnPlayerTeamUpdate(false, settingUpdate.Team, settingUpdate.Id);
}
Expand All @@ -1310,8 +1294,6 @@ private void OnPlayerSettingUpdate(ClientPlayerSettingUpdate settingUpdate) {
if (settingUpdate.UpdateTypes.Contains(PlayerSettingUpdateType.Skin)) {
if (settingUpdate.Self) {
_playerManager.OnPlayerSkinUpdate(true, settingUpdate.SkinId);

SkinChangedEvent?.Invoke(settingUpdate.SkinId);
} else {
_playerManager.OnPlayerSkinUpdate(false, settingUpdate.SkinId, settingUpdate.Id);
}
Expand Down
1 change: 1 addition & 0 deletions SSMP/Game/Client/ClientPlayerData.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System;
using SSMP.Api.Client;
using SSMP.Internals;
using UnityEngine;
Expand Down
33 changes: 27 additions & 6 deletions SSMP/Game/Client/PlayerManager.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using SSMP.Api.Client;
using SSMP.Fsm;
using SSMP.Game.Client.Skin;
using SSMP.Game.Settings;
Expand All @@ -17,7 +18,7 @@ namespace SSMP.Game.Client;
/// <summary>
/// Class that manages player objects, spawning and recycling thereof.
/// </summary>
internal class PlayerManager {
internal class PlayerManager : IPlayerManager {
/// <summary>
/// The name of the game object for the player container prefab.
/// </summary>
Expand Down Expand Up @@ -59,11 +60,6 @@ internal class PlayerManager {
/// </summary>
private readonly Dictionary<ushort, ClientPlayerData> _playerData;

/// <summary>
/// The team that our local player is on.
/// </summary>
public Team LocalPlayerTeam { get; private set; } = Team.None;

/// <summary>
/// The player container prefab GameObject.
/// </summary>
Expand All @@ -79,6 +75,19 @@ internal class PlayerManager {
/// </summary>
private readonly Dictionary<ushort, GameObject> _activePlayers;

/// <inheritdoc/>
public Team LocalPlayerTeam { get; private set; } = Team.None;

/// <summary>
/// Event for when the local player's team changes after being received from the server.
/// </summary>
public event Action<Team>? LocalPlayerTeamChangeEvent;

/// <summary>
/// Event for when any player's team changes after being received from the server.
/// </summary>
public event Action<IClientPlayer, Team>? PlayerTeamChangeEvent;

public PlayerManager(
ServerSettings serverSettings,
Dictionary<ushort, ClientPlayerData> playerData
Expand Down Expand Up @@ -573,6 +582,9 @@ private void UpdatePlayerTeam(ushort id, Team team) {
Logger.Debug($"Tried to update team for ID {id} while player data did not exists");
return;
}

// Store the old team for invoking the event later
var oldTeam = playerData.Team;

// Update the team in the player data
playerData.Team = team;
Expand All @@ -590,13 +602,18 @@ private void UpdatePlayerTeam(ushort id, Team team) {
var textMeshObject = nameObject.GetComponent<TextMeshPro>();

ChangeNameColor(textMeshObject, team);

if (oldTeam != team) {
PlayerTeamChangeEvent?.Invoke(playerData, team);
}
}

/// <summary>
/// Update the team for the local player.
/// </summary>
/// <param name="team">The new team of the local player.</param>
private void UpdateLocalPlayerTeam(Team team) {
var oldTeam = LocalPlayerTeam;
LocalPlayerTeam = team;

var nameObject = HeroController.instance.gameObject.FindGameObjectInChildren(UsernameObjectName);
Expand All @@ -608,6 +625,10 @@ private void UpdateLocalPlayerTeam(Team team) {

var textMeshObject = nameObject.GetComponent<TextMeshPro>();
ChangeNameColor(textMeshObject, team);

if (oldTeam != team) {
LocalPlayerTeamChangeEvent?.Invoke(team);
}
}

/// <summary>
Expand Down
Loading