6 Commits

Author SHA1 Message Date
Yue-bin
8261d243e6 chore(playermanager): 更新版本号至 3.1.1 2026-02-19 17:35:59 +08:00
Yue-bin
4de0778dc8 fix(playermanager):修复了获取不到lobbylist的问题 2026-02-19 17:34:08 +08:00
Yue-bin
eb27008e4d fix(playermanager): 修复大厅搜索信息显示逻辑并添加筛选自动刷新
将 DrawLobbySearchInfo 移至未加入大厅的条件分支内,避免在大厅中错误显示搜索信息。
在切换距离筛选器时立即请求大厅列表,实现筛选条件变更后自动刷新结果。
2026-02-19 17:33:39 +08:00
Yue-bin
0b3a12f64d fix(playermanager): 修复拉杆旋转逻辑并添加大厅列表调试信息
将拉杆角度控制从直接修改 transform.forward 改为使用 Rigidbody.MoveRotation,
确保物理引擎正确处理旋转并避免抖动。

在大厅列表请求流程中添加详细调试日志,包括请求开始、
完成状态以及版本过滤详情,便于排查联机兼容性问题。
2026-02-19 17:32:53 +08:00
Yue-bin
f44815c600 feat(playermanager): 优化房间公开性切换的拉杆控制逻辑
将原有的 DisableLever()/EnableLever() 调用替换为更精确的 SetHostLeverDirection(angle) 方法,支持根据房间公开状态设置拉杆的不同朝向角度(公开时-30°,私密时30°)。新增回退机制,当拉杆组件不存在时直接调用原始方法修改房间类型,确保功能在各种环境下均可正常工作。
2026-02-01 22:18:13 +08:00
Yue-bin
ca1f7c0637 feat(playermanager): 重构大厅公开性切换并集成拉杆控制功能
提取 GUI 中的大厅公开性切换逻辑到 PlayerManager 统一管理,并增加与 HostLeverHandler 的集成。当切换为公开大厅时启用拉杆,切换为私人大厅时禁用拉杆。
2026-02-01 21:05:36 +08:00
3 changed files with 81 additions and 28 deletions

View File

@@ -167,7 +167,7 @@ public static class PlayerManagerGUI
private static string GetRoomPublicText() private static string GetRoomPublicText()
{ {
return MatchmakingHandler.LobbyType == ELobbyType.k_ELobbyTypePublic ? "公开" : "好友可见"; return PlayerManager.IsPublic ? "公开" : "好友可见";
} }
#endregion #endregion
@@ -180,17 +180,7 @@ public static class PlayerManagerGUI
private static void OnRoomPublicToggleButtonClick() private static void OnRoomPublicToggleButtonClick()
{ {
if (MultiplayerManager.IsServer) PlayerManager.ToggleLobbyPublicity();
{
if (MatchmakingHandler.LobbyType == ELobbyType.k_ELobbyTypePublic)
{
MatchmakingHandler.SetNewLobbyType(ELobbyType.k_ELobbyTypeFriendsOnly);
}
else
{
MatchmakingHandler.SetNewLobbyType(ELobbyType.k_ELobbyTypePublic);
}
}
} }
/// <summary> /// <summary>
@@ -243,6 +233,7 @@ public static class PlayerManagerGUI
private static void OnCycleLobbyDistanceFilterClick() private static void OnCycleLobbyDistanceFilterClick()
{ {
CycleLobbyDistanceFilter(); CycleLobbyDistanceFilter();
PlayerManager.RequestLobbyList();
} }
/// <summary> /// <summary>
@@ -276,14 +267,14 @@ public static class PlayerManagerGUI
{ {
// 绘制房间公开性 // 绘制房间公开性
GUI.Label( GUI.Label(
new Rect(OffsetX, GetNewYPosition(), 500f, 40f), new Rect(OffsetX, GetNewYPosition(), 200f, 40f),
$"房间类型: {GetRoomPublicText()}", $"房间类型: {GetRoomPublicText()}",
TitleStyle TitleStyle
); );
// 绘制房间公开切换按钮 // 绘制房间公开切换按钮
if (GUI.Button( if (GUI.Button(
new Rect(OffsetX + 520f, GetCurrentYPosition(), 100f, 40f), new Rect(OffsetX + 220f, GetCurrentYPosition(), 150f, 40f),
"切换公开性", "切换公开性",
CommonButtonStyle CommonButtonStyle
)) ))
@@ -471,10 +462,9 @@ public static class PlayerManagerGUI
"当前不在大厅中", "当前不在大厅中",
TitleStyle TitleStyle
); );
}
DrawLobbySearchInfo(); DrawLobbySearchInfo();
} }
}
#endregion #endregion
} }

View File

@@ -82,6 +82,24 @@ public class PlayerManager : BaseUnityPlugin
/// </summary> /// </summary>
public static MatchmakingHandler MatchmakingHandler => MatchmakingHandler.Instance; public static MatchmakingHandler MatchmakingHandler => MatchmakingHandler.Instance;
/// <summary>
/// 原始的设置lobby类型方法
/// </summary>
public static MethodInfo RawChangeLobbyTypeMI => AccessTools.Method(
typeof(MatchmakingHandler),
"ChangeLobbyType"
);
/// <summary>
/// leverhandler实例
/// </summary>
public static HostLeverHandler HostLeverHandler => UnityEngine.Object.FindObjectOfType<HostLeverHandler>();
/// <summary>
/// 房间公开性
/// </summary>
public static bool IsPublic => HostLeverHandler?.isOn ?? MatchmakingHandler.LobbyType == ELobbyType.k_ELobbyTypePublic;
/// <summary> /// <summary>
/// 当前大厅ID /// 当前大厅ID
/// </summary> /// </summary>
@@ -186,6 +204,25 @@ public class PlayerManager : BaseUnityPlugin
} }
} }
/// <summary>
/// 修改lever朝向
/// </summary>
/// <param name="angle">朝向角度</param>
/// <returns>修改成功返回true</returns>
private static bool SetHostLeverDirection(float angle)
{
if (HostLeverHandler is not null)
{
var rig = HostLeverHandler.lever.GetComponent<Rigidbody>();
if (rig is not null)
{
rig.MoveRotation(Quaternion.Euler(0, angle, 0));
return true;
}
}
return false;
}
#endregion #endregion
#region #region
@@ -210,21 +247,51 @@ public class PlayerManager : BaseUnityPlugin
return player.Equals(LocalPlayer); return player.Equals(LocalPlayer);
} }
/// <summary>
/// 修改大厅公开性
/// </summary>
public static void ToggleLobbyPublicity()
{
if (MultiplayerManager.IsServer)
{
if (IsPublic)
{
MatchmakingHandler.SetNewLobbyType(ELobbyType.k_ELobbyTypeFriendsOnly);
if (!SetHostLeverDirection(30f))
{
// 如果lever不存在则直接调用原始方法
RawChangeLobbyTypeMI.Invoke(MatchmakingHandler, [ELobbyType.k_ELobbyTypeFriendsOnly]);
}
}
else
{
MatchmakingHandler.SetNewLobbyType(ELobbyType.k_ELobbyTypePublic);
if (!SetHostLeverDirection(-30f))
{
// 如果lever不存在则直接调用原始方法
RawChangeLobbyTypeMI.Invoke(MatchmakingHandler, [ELobbyType.k_ELobbyTypePublic]);
}
}
}
}
/// <summary> /// <summary>
/// 请求大厅列表 /// 请求大厅列表
/// </summary> /// </summary>
public static void RequestLobbyList() public static void RequestLobbyList()
{ {
Debug.Log("正在请求大厅列表...");
SteamMatchmaking.AddRequestLobbyListDistanceFilter(lobbyDistanceFilter); SteamMatchmaking.AddRequestLobbyListDistanceFilter(lobbyDistanceFilter);
SteamAPICall_t apiCall = SteamMatchmaking.RequestLobbyList(); SteamAPICall_t apiCall = SteamMatchmaking.RequestLobbyList();
LobbyMatchListCallResult.Set(apiCall, OnLobbyMatchListReceived); LobbyMatchListCallResult.Set(apiCall, new CallResult<LobbyMatchList_t>.APIDispatchDelegate(OnRequestLobbyList));
} }
/// <summary> /// <summary>
/// 处理大厅列表查询结果 /// 处理大厅列表查询结果
/// </summary> /// </summary>
private static void OnLobbyMatchListReceived(LobbyMatchList_t result, bool ioFailure) private static void OnRequestLobbyList(LobbyMatchList_t result, bool ioFailure)
{ {
Debug.Log("大厅列表请求完成: " + result.m_nLobbiesMatching + " 个大厅");
lobbyDataList = []; lobbyDataList = [];
uint lobbyCount = result.m_nLobbiesMatching; uint lobbyCount = result.m_nLobbiesMatching;
@@ -235,6 +302,11 @@ public class PlayerManager : BaseUnityPlugin
{ {
lobbyDataList.Add(lobbyId); lobbyDataList.Add(lobbyId);
} }
else
{
Debug.Log("过滤掉不兼容版本的大厅: " + lobbyId);
Debug.Log("大厅 " + lobbyId + " 版本: " + SteamMatchmaking.GetLobbyData(lobbyId, StickFightConstants.VERSION_KEY));
}
} }
} }
@@ -297,12 +369,3 @@ public class PlayerManager : BaseUnityPlugin
#endregion #endregion
} }
/// <summary>
/// Stick Fight游戏常量
/// </summary>
internal static class StickFightConstants
{
public const string VERSION_KEY = "version";
public const string VERSION_VALUE = "1.0.0";
}

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>3.1.0</Version> <Version>3.1.1</Version>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<RestoreAdditionalProjectSources> <RestoreAdditionalProjectSources>