Skip to content

Commit 5d90ca3

Browse files
committed
Simplify packaging of UniversalMenu.Compat.CSSharp
1 parent c5f87e0 commit 5d90ca3

6 files changed

Lines changed: 137 additions & 192 deletions

File tree

CSSUniversalMenuAPI.sln

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GitHub Actions", "GitHub Ac
4141
EndProject
4242
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalMenu.Compat.CSSharp", "src\UniversalMenu.Compat.CSSharp\UniversalMenu.Compat.CSSharp.csproj", "{EF2866D7-C411-42ED-B5E0-DCE79CCFCA09}"
4343
EndProject
44-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalMenu.Compat.CSSharp.Shared", "src\UniversalMenu.Compat.CSSharp.Shared\UniversalMenu.Compat.CSSharp.Shared.csproj", "{6ADB7AC3-E7F1-4BAB-A323-633932EBB322}"
45-
EndProject
4644
Global
4745
GlobalSection(SolutionConfigurationPlatforms) = preSolution
4846
Debug|Any CPU = Debug|Any CPU
@@ -77,10 +75,6 @@ Global
7775
{EF2866D7-C411-42ED-B5E0-DCE79CCFCA09}.Debug|Any CPU.Build.0 = Debug|Any CPU
7876
{EF2866D7-C411-42ED-B5E0-DCE79CCFCA09}.Release|Any CPU.ActiveCfg = Release|Any CPU
7977
{EF2866D7-C411-42ED-B5E0-DCE79CCFCA09}.Release|Any CPU.Build.0 = Release|Any CPU
80-
{6ADB7AC3-E7F1-4BAB-A323-633932EBB322}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
81-
{6ADB7AC3-E7F1-4BAB-A323-633932EBB322}.Debug|Any CPU.Build.0 = Debug|Any CPU
82-
{6ADB7AC3-E7F1-4BAB-A323-633932EBB322}.Release|Any CPU.ActiveCfg = Release|Any CPU
83-
{6ADB7AC3-E7F1-4BAB-A323-633932EBB322}.Release|Any CPU.Build.0 = Release|Any CPU
8478
EndGlobalSection
8579
GlobalSection(SolutionProperties) = preSolution
8680
HideSolutionNode = FALSE

package.sh

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,8 @@ mkdir -p "$dst_plugins/UniversalMenu.Compat.CSSharp"
2121
src="./src/UniversalMenu.Compat.CSSharp/bin/Release/net8.0/publish"
2222
cp -r "$src/." "$dst_plugins/UniversalMenu.Compat.CSSharp/"
2323
# shared part: allows modified methods to load the 0Harmony.dll dependency
24-
mkdir -p "$dst_shared/UniversalMenu.Compat.CSSharp.Shared"
25-
src="./src/UniversalMenu.Compat.CSSharp.Shared/bin/Release/net8.0/publish"
26-
cp -r "$src/." "$dst_shared/UniversalMenu.Compat.CSSharp.Shared/"
24+
mkdir -p "$dst_shared/0Harmony"
25+
mv "$dst_plugins/UniversalMenu.Compat.CSSharp/0Harmony.dll" "$dst_shared/0Harmony/"
2726

2827
# package UniversalMenu.Compat.ScreenMenuAPI # this isn't implemented yet
2928
#mkdir -p "$dst_plugins/UniversalMenu.Compat.ScreenMenuAPI"

src/UniversalMenu.Compat.CSSharp.Shared/CSSharpCompatPluginShared.cs

Lines changed: 0 additions & 154 deletions
This file was deleted.

src/UniversalMenu.Compat.CSSharp.Shared/UniversalMenu.Compat.CSSharp.Shared.csproj

Lines changed: 0 additions & 20 deletions
This file was deleted.
Lines changed: 132 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,20 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
5+
using AngleSharp.Dom;
6+
using AngleSharp.Html.Parser;
7+
18
using CounterStrikeSharp.API.Core;
29
using CounterStrikeSharp.API.Core.Attributes.Registration;
10+
using CounterStrikeSharp.API.Modules.Menu;
11+
12+
using CSSUniversalMenuAPI;
13+
using CSSUniversalMenuAPI.Extensions;
14+
15+
using HarmonyLib;
16+
17+
using IUniversalMenu = CSSUniversalMenuAPI.IMenu;
318

419
namespace UniversalMenu.Compat.CSSharp;
520

@@ -10,21 +25,135 @@ public class CSSharpCompatPlugin : BasePlugin
1025

1126
public override void Load(bool hotReload)
1227
{
13-
CSSharpCompatPluginShared.Patch();
28+
Harmony = new Harmony("com.universalmenu.compat.cssharp");
29+
30+
{
31+
var original = AccessTools.Method(typeof(MenuManager), nameof(MenuManager.OpenCenterHtmlMenu));
32+
var pre = SymbolExtensions.GetMethodInfo(() => MenuManager_OpenCenterHtmlMenu(null!, null!, null!));
33+
Harmony.Patch(original, prefix: new HarmonyMethod(pre));
34+
}
35+
36+
{
37+
var original = AccessTools.Method(typeof(MenuManager), nameof(MenuManager.OpenChatMenu));
38+
var pre = SymbolExtensions.GetMethodInfo(() => MenuManager_OpenChatMenu(null!, null!));
39+
Harmony.Patch(original, prefix: new HarmonyMethod(pre));
40+
}
41+
42+
{
43+
var original = AccessTools.Method(typeof(MenuManager), nameof(MenuManager.OpenConsoleMenu));
44+
var pre = SymbolExtensions.GetMethodInfo(() => MenuManager_OpenConsoleMenu(null!, null!));
45+
Harmony.Patch(original, prefix: new HarmonyMethod(pre));
46+
}
47+
48+
{
49+
var original = AccessTools.Method(typeof(MenuManager), nameof(MenuManager.CloseActiveMenu));
50+
var pre = SymbolExtensions.GetMethodInfo(() => MenuManager_CloseActiveMenu(null!));
51+
Harmony.Patch(original, prefix: new HarmonyMethod(pre));
52+
}
1453
}
1554

1655
public override void Unload(bool hotReload)
1756
{
18-
CSSharpCompatPluginShared.Unpatch();
57+
Harmony?.UnpatchAll();
1958
}
2059

60+
private static Harmony? Harmony { get; set; }
61+
private static Dictionary<nint, IUniversalMenu> ActiveMenus { get; } = new();
62+
2163
[GameEventHandler(HookMode.Pre)]
2264
public HookResult OnPlayerDisconnect(EventPlayerDisconnect e, GameEventInfo info)
2365
{
2466
if (e.Userid is null)
2567
return HookResult.Continue;
2668

27-
CSSharpCompatPluginShared.PlayerDisconnected(e.Userid);
69+
ActiveMenus.Remove(e.Userid.Handle);
2870
return HookResult.Continue;
2971
}
72+
73+
public static bool BaseMenu_Open(BasePlugin? plugin, CCSPlayerController player, BaseMenu menu)
74+
{
75+
// this API assumes there may only be 1 menu at a time, so tell the implementation
76+
// that this menu is expected to be closed
77+
if (ActiveMenus.TryGetValue(player.Handle, out var activeMenu))
78+
{
79+
ActiveMenus.Remove(player.Handle);
80+
activeMenu.Close();
81+
}
82+
83+
var api = IMenuAPI.PluginCapability.Get();
84+
85+
if (api is null) // fall back to builtin menu
86+
return true;
87+
88+
var newMenu = api.CreateMenu(player);
89+
newMenu.PlayerCanClose = menu.ExitButton;
90+
91+
var useHtml = false;
92+
if (newMenu is IHtmlSupportMenuExtension htmlMenu)
93+
htmlMenu.UseHtml = useHtml = true;
94+
95+
if (useHtml)
96+
newMenu.Title = menu.Title;
97+
else
98+
newMenu.Title = StripHtml(menu.Title);
99+
100+
foreach (var item in menu.MenuOptions)
101+
{
102+
var newItem = newMenu.CreateItem();
103+
newItem.Enabled = !item.Disabled;
104+
105+
if (useHtml)
106+
newItem.Title = item.Text;
107+
else
108+
newItem.Title = StripHtml(item.Text);
109+
110+
if (item.OnSelect is not null)
111+
newItem.Selected += (selectedItem) =>
112+
{
113+
item.OnSelect(player, item);
114+
if (menu.PostSelectAction == PostSelectAction.Close)
115+
{
116+
if (ActiveMenus.TryGetValue(player.Handle, out var activeMenu) && activeMenu == newMenu)
117+
ActiveMenus.Remove(player.Handle);
118+
newMenu.Close();
119+
}
120+
};
121+
}
122+
123+
ActiveMenus[player.Handle] = newMenu;
124+
newMenu.Display();
125+
return false;
126+
}
127+
128+
public static bool MenuManager_CloseActiveMenu(CCSPlayerController player)
129+
{
130+
if (ActiveMenus.TryGetValue(player.Handle, out var activeMenu))
131+
{
132+
ActiveMenus.Remove(player.Handle);
133+
activeMenu.Close();
134+
}
135+
return true;
136+
}
137+
138+
public static bool MenuManager_OpenCenterHtmlMenu(BasePlugin plugin, CCSPlayerController player, CenterHtmlMenu menu)
139+
{
140+
return BaseMenu_Open(plugin, player, menu);
141+
}
142+
143+
public static bool MenuManager_OpenChatMenu(CCSPlayerController player, ChatMenu menu)
144+
{
145+
return BaseMenu_Open(null, player, menu);
146+
}
147+
148+
public static bool MenuManager_OpenConsoleMenu(CCSPlayerController player, ConsoleMenu menu)
149+
{
150+
return BaseMenu_Open(null, player, menu);
151+
}
152+
153+
private static readonly HtmlParser HtmlParser = new(new HtmlParserOptions() { IsStrictMode = false });
154+
private static string StripHtml(string input)
155+
{
156+
var doc = HtmlParser.ParseFragment(input, null!);
157+
return string.Join(string.Empty, doc.Select(x => x.Text()));
158+
}
30159
}

src/UniversalMenu.Compat.CSSharp/UniversalMenu.Compat.CSSharp.csproj

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,10 @@
1212
<CopyLocalSatelliteAssemblies>False</CopyLocalSatelliteAssemblies>
1313
</ProjectReference>
1414

15-
<ProjectReference Include="..\UniversalMenu.Compat.CSSharp.Shared\UniversalMenu.Compat.CSSharp.Shared.csproj">
16-
<Private>False</Private>
17-
<CopyLocalSatelliteAssemblies>False</CopyLocalSatelliteAssemblies>
18-
<ExcludeAssets>runtime</ExcludeAssets>
19-
</ProjectReference>
20-
2115
<PackageReference Include="CS2ScreenMenuAPI" Version="3.0.4" ExcludeAssets="runtime" />
16+
17+
<PackageReference Include="AngleSharp" Version="1.2.0" />
18+
<PackageReference Include="Lib.Harmony" Version="2.3.6" />
2219
</ItemGroup>
2320

2421
</Project>

0 commit comments

Comments
 (0)