8 Commits

Author SHA1 Message Date
Yue-bin
8262b70292 ci(gitea): 固定 workflow action 版本以提高安全性
Some checks failed
Publish Release / build (push) Failing after 3s
将 actions/checkout 和 actions/setup-dotnet 从浮动版本标签
更新为固定的提交哈希和特定版本号,防止潜在的安全风险并
确保 CI/CD 构建的可重复性。
2026-02-19 18:39:06 +08:00
Yue-bin
652693883b ci: 添加 Gitea Actions 自动发布工作流
Some checks failed
Publish Release / build (push) Failing after 4s
配置 Gitea Actions 工作流实现 .NET 项目自动化发布:
- 监听 v 开头标签触发构建任务
- 使用 .NET 8.0 构建 Release 版本
- 自动创建 Gitea Release 并上传 stick.plugins DLL 文件
- 智能识别 alpha/beta/rc 标签并标记为预发布版本
2026-02-19 18:30:49 +08:00
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
4 changed files with 127 additions and 28 deletions

View File

@@ -0,0 +1,46 @@
name: Publish Release
on:
push:
tags:
- 'v*' # 匹配 v 开头的标签,如 v1.0.0
# 或者使用 '*' 匹配所有标签
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: http://MonBianG.lan:3000/actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Setup .NET
uses: http://MonBianG.lan:3000/actions/setup-dotnet@v4.3.0
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore --configuration Release
# 使用 Gitea Release Action 创建 Release
- name: Create Release
uses: http://MonBianG.lan:3000/actions/gitea-release-action@main
with:
# 使用推送的标签名作为版本号
tag: ${{ github.ref_name }}
# 自动从标签名生成 Release 标题
name: Release ${{ github.ref_name }}
# 使用提交信息或自定义发布说明
body: |
## Changes in ${{ github.ref_name }}
Auto-generated release for tag ${{ github.ref_name }}.
# 上传构建产物
files: |
./bin/Release/net35/stick.plugins.*.dll
# 是否为预发布版本(如果是 alpha/beta/rc 标签)
prerelease: ${{ contains(github.ref_name, 'alpha') || contains(github.ref_name, 'beta') || contains(github.ref_name, 'rc') }}

View File

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

View File

@@ -82,6 +82,24 @@ public class PlayerManager : BaseUnityPlugin
/// </summary>
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>
/// 当前大厅ID
/// </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
#region
@@ -210,21 +247,51 @@ public class PlayerManager : BaseUnityPlugin
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>
public static void RequestLobbyList()
{
Debug.Log("正在请求大厅列表...");
SteamMatchmaking.AddRequestLobbyListDistanceFilter(lobbyDistanceFilter);
SteamAPICall_t apiCall = SteamMatchmaking.RequestLobbyList();
LobbyMatchListCallResult.Set(apiCall, OnLobbyMatchListReceived);
LobbyMatchListCallResult.Set(apiCall, new CallResult<LobbyMatchList_t>.APIDispatchDelegate(OnRequestLobbyList));
}
/// <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 = [];
uint lobbyCount = result.m_nLobbiesMatching;
@@ -235,6 +302,11 @@ public class PlayerManager : BaseUnityPlugin
{
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
}
/// <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>
<AssemblyName>stick.plugins.playermanager</AssemblyName>
<Product>PlayerManager</Product>
<Version>3.1.0</Version>
<Version>3.1.1</Version>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>latest</LangVersion>
<RestoreAdditionalProjectSources>