6 Commits

Author SHA1 Message Date
Yue-bin
bc2d44f5cd docs(readme): 更新文档添加新功能说明
Some checks failed
Publish Release / build (push) Failing after 4m0s
- 移除了重复的玩家名称颜色显示说明
- 添加了一键加好友功能描述
- 更新了更新日志,包含v4.0.4版本的新功能:
  1. 房间列表现在在房间内也显示,但是点击无效
  2. 添加了加好友按钮
  3. 修复了禁音功能
- 调整了v4.0.3版本更新内容的序号格式
2026-05-28 17:02:17 +08:00
Yue-bin
c065b14f9d chore(PlayerManager): 更新版本号到4.0.4
- 将项目版本从4.0.3更新至4.0.4
2026-05-28 16:58:42 +08:00
Yue-bin
46f05b5489 🐞 fix(mute): 修复了禁音无效的问题
难道他真的是猪?
2026-05-28 16:58:06 +08:00
Yue-bin
3a9e903044 feat(gui): 添加加好友按钮功能
新增了加好友按钮组件,允许玩家通过Steam界面添加其他玩家为好友。
该功能包含一个可配置的按钮,点击后会复制玩家信息到剪贴板并打开Steam好友添加界面。
同时增加了相应的配置选项来控制按钮的显示。

需要配置项ShowAddFriendButton来控制加好友按钮的显示状态,
默认设置为显示(true)。
2026-05-28 16:24:23 +08:00
Yue-bin
ca331d4ac8 feat(Gui): 添加大厅搜索信息显示功能
添加了大厅搜索信息的绘制功能,并优化了服务器加入逻辑,
避免在已有大厅的情况下重复加入服务器。
2026-05-28 16:09:47 +08:00
Yue-bin
692fc25d42 fix(Gui): 修改静音按钮逻辑
- 移除主机玩家的条件限制,仅保留本地玩家检查
- 将"禁音"/"取消禁音"文本改为更标准的"静音"/"取消静音"
2026-05-08 17:42:15 +08:00
9 changed files with 107 additions and 16 deletions

View File

@@ -43,5 +43,7 @@ public static class DefaultWidgets
if (PlayerManager.ShowMuteButton.Value) if (PlayerManager.ShowMuteButton.Value)
RegisterManager.RegisterPlayerRow(InternalWidgets.MuteButton.Create()); RegisterManager.RegisterPlayerRow(InternalWidgets.MuteButton.Create());
if (PlayerManager.ShowAddFriendButton.Value)
RegisterManager.RegisterPlayerRow(InternalWidgets.AddFriendButton.Create());
} }
} }

View File

@@ -0,0 +1,26 @@
using Steamworks;
using UnityEngine;
using stick.plugins.playermanager.Recorder;
namespace stick.plugins.playermanager.Gui.InternalWidgets;
public static class AddFriendButton
{
public static IPlayerRowWidget Create()
{
return new PlayerRowButtonWidget
{
Name = "Add Friend",
GetText = player => "加好友",
Condition = player =>
!PlayerManager.IsLocalPlayer(PlayerManager.LocalPlayer)
&& !player.IsFriend,
OnClick = player =>
{
GUIUtility.systemCopyBuffer = player.ToString();
SteamFriends.ActivateGameOverlayToUser("friendadd", player.SteamId);
},
Width = 100f,
};
}
}

View File

@@ -9,11 +9,9 @@ public static class MuteButton
return new PlayerRowButtonWidget return new PlayerRowButtonWidget
{ {
Name = "mute", Name = "mute",
Condition = player => Condition = player => !PlayerManager.IsLocalPlayer(player),
!PlayerManager.IsHost(player)
&& !PlayerManager.IsLocalPlayer(player),
GetText = player => GetText = player =>
PlayerManager.IsMuted(player) ? "取消音" : "音", PlayerManager.IsMuted(player) ? "取消音" : "音",
OnClick = player => OnClick = player =>
{ {
if (PlayerManager.IsMuted(player)) if (PlayerManager.IsMuted(player))

View File

@@ -45,6 +45,7 @@ public static class PlayerManagerGUI
if (PlayerManager.MatchmakingHandler.IsInsideLobby) if (PlayerManager.MatchmakingHandler.IsInsideLobby)
{ {
DrawCurrentLobbyInfo(); DrawCurrentLobbyInfo();
DrawLobbySearchInfo();
} }
else else
{ {
@@ -195,7 +196,9 @@ public static class PlayerManagerGUI
GUIStyles.Button GUIStyles.Button
)) ))
{ {
PlayerManager.JoinSpecificServer(lobbyId); // 在大厅中则不加入
if (!PlayerManager.MatchmakingHandler.IsInsideLobby)
PlayerManager.JoinSpecificServer(lobbyId);
} }
} }

15
Patches/MutePatch.cs Normal file
View File

@@ -0,0 +1,15 @@
using HarmonyLib;
using stick.plugins.playermanager;
[HarmonyPatch(typeof(NetworkPlayer), "SyncClientChat")]
class MutePatch
{
public static bool Prefix(NetworkPlayer __instance)
{
if (PlayerManager.MutedPlayers.Contains(__instance.NetworkSpawnID))
{
return false;
}
return true;
}
}

View File

@@ -64,6 +64,11 @@ public class PlayerManager : BaseUnityPlugin
/// </summary> /// </summary>
internal static ConfigEntry<bool> ShowMuteButton; internal static ConfigEntry<bool> ShowMuteButton;
/// <summary>
/// 是否显示加好友按钮
/// </summary>
internal static ConfigEntry<bool> ShowAddFriendButton;
#endregion #endregion
#region Steam回调 #region Steam回调
@@ -111,6 +116,11 @@ public class PlayerManager : BaseUnityPlugin
#region 访 #region 访
/// <summary>
/// 多人管理器实例
/// </summary>
public static MultiplayerManager MultiplayerManager => FindObjectOfType<MultiplayerManager>();
/// <summary> /// <summary>
/// 大厅管理器实例 /// 大厅管理器实例
/// </summary> /// </summary>
@@ -164,7 +174,7 @@ public class PlayerManager : BaseUnityPlugin
/// <summary> /// <summary>
/// 禁音玩家列表 /// 禁音玩家列表
/// </summary> /// </summary>
public static HashSet<PlayerInfo> MutedPlayers = []; public static HashSet<ushort> MutedPlayers = [];
#endregion #endregion
@@ -263,6 +273,13 @@ public class PlayerManager : BaseUnityPlugin
true, true,
"是否显示切换公开性按钮" "是否显示切换公开性按钮"
); );
ShowAddFriendButton = Config.Bind(
"GUI",
"ShowAddFriendButton",
true,
"是否显示加好友按钮"
);
} }
/// <summary> /// <summary>
@@ -310,6 +327,24 @@ public class PlayerManager : BaseUnityPlugin
#region #region
/// <summary>
/// 通过SteamID获取NetworkSpawnID
/// </summary>
/// <param name="targetSteamID"></param>
/// <returns></returns>
public static ushort GetNetworkSpawnIDBySteamID(CSteamID targetSteamID)
{
ConnectedClientData[] clients = MultiplayerManager.ConnectedClients;
for (ushort i = 0; i < clients.Length; i++)
{
if (clients[i] != null && clients[i].ClientID == targetSteamID)
{
return i; // i 就是 NetworkSpawnID
}
}
return 65535; // ushort.MaxValue表示未找到与默认值一致
}
/// <summary> /// <summary>
/// 判断指定玩家是否被静音 /// 判断指定玩家是否被静音
/// </summary> /// </summary>
@@ -317,7 +352,7 @@ public class PlayerManager : BaseUnityPlugin
/// <returns>如果被静音返回true</returns> /// <returns>如果被静音返回true</returns>
public static bool IsMuted(PlayerInfo player) public static bool IsMuted(PlayerInfo player)
{ {
return player != null && MutedPlayers.Contains(player); return player != null && MutedPlayers.Contains(player.NetworkSpawnID);
} }
/// <summary> /// <summary>
@@ -328,7 +363,7 @@ public class PlayerManager : BaseUnityPlugin
{ {
if (player != null) if (player != null)
{ {
MutedPlayers.Add(player); MutedPlayers.Add(player.NetworkSpawnID);
Debug.Log($"玩家 {player} 已被静音"); Debug.Log($"玩家 {player} 已被静音");
} }
} }
@@ -339,9 +374,9 @@ public class PlayerManager : BaseUnityPlugin
/// <param name="player">要取消静音的玩家</param> /// <param name="player">要取消静音的玩家</param>
public static void UnmutePlayer(PlayerInfo player) public static void UnmutePlayer(PlayerInfo player)
{ {
if (player != null && MutedPlayers.Contains(player)) if (player != null && MutedPlayers.Contains(player.NetworkSpawnID))
{ {
MutedPlayers.Remove(player); MutedPlayers.Remove(player.NetworkSpawnID);
Debug.Log($"玩家 {player} 已被取消静音"); Debug.Log($"玩家 {player} 已被取消静音");
} }
} }

View File

@@ -43,6 +43,12 @@ public class PlayerInfo : IEquatable<PlayerInfo>
/// </summary> /// </summary>
public PlayerRecordStatus RecordStatus { get; set; } public PlayerRecordStatus RecordStatus { get; set; }
/// <summary>
/// 柴自己的NetworkSpawnID
/// </summary>
public ushort NetworkSpawnID => PlayerManager.GetNetworkSpawnIDBySteamID(SteamId);
/// <summary> /// <summary>
/// 当前玩家名称(实时获取) /// 当前玩家名称(实时获取)
/// </summary> /// </summary>

View File

@@ -6,7 +6,6 @@
- 房间查找 - 房间查找
- 玩家记录 - 玩家记录
- 被记录的玩家显示为黄名 - 被记录的玩家显示为黄名
- 是steam好友的玩家显示为绿名优先级更高 - 是steam好友的玩家显示为绿名优先级更高
- 被拉黑的玩家显示为红名(优先级最高) - 被拉黑的玩家显示为红名(优先级最高)
@@ -16,16 +15,23 @@
- 可配置的界面开启按键默认为F2 - 可配置的界面开启按键默认为F2
- 可以随时切换房间的公开性 - 可以随时切换房间的公开性
- 静音单个玩家 - 静音单个玩家
- 一键加好友
## 更新日志 ## 更新日志
### v4.0.4
1. 房间列表现在在房间内也显示,但是点击无效
2. 添加了加好友按钮
3. 修复了禁音功能 *难道他真的是猪??*
### v4.0.3 ### v4.0.3
1. 静音单个玩家 1. 静音单个玩家
1. 性能优化 2. 性能优化
1. 提供了更多可选是否开启功能显示的配置项 3. 提供了更多可选是否开启功能显示的配置项
1. 提供按钮组件注册入口 4. 提供按钮组件注册入口
1. 更好的房间公开性切换 5. 更好的房间公开性切换
### v3.1.1 ### v3.1.1

View File

@@ -4,7 +4,7 @@
<TargetFramework>net35</TargetFramework> <TargetFramework>net35</TargetFramework>
<AssemblyName>stick.plugins.playermanager</AssemblyName> <AssemblyName>stick.plugins.playermanager</AssemblyName>
<Product>PlayerManager</Product> <Product>PlayerManager</Product>
<Version>4.0.3</Version> <Version>4.0.4</Version>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<RestoreAdditionalProjectSources> <RestoreAdditionalProjectSources>