Skip to content

Commit 689bd6a

Browse files
committed
Added more compatibility plugins
- Added shell for ScreenMenuAPI - Added and implemented CSSharp compat which redirects to the universal API when any of the following methods are used: - `MenuManager.OpenCenterHtmlMenu()` - `MenuManager.OpenChatMenu()` - `MenuManager.OpenConsoleMenu()` - `new CenterHtmlMenu().Open(player)` and the like
1 parent e7bef18 commit 689bd6a

7 files changed

Lines changed: 224 additions & 0 deletions

File tree

CSSUniversalMenuAPI.sln

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProofOfConcepts", "tests\Pr
2525
EndProject
2626
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalMenu.Compat.MenuManagerApi", "src\UniversalMenu.Compat.MenuManagerApi\UniversalMenu.Compat.MenuManagerApi.csproj", "{44AAF649-62D6-1CD8-3F16-028F4D262BE6}"
2727
EndProject
28+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalMenu.Compat.ScreenMenuAPI", "src\UniversalMenu.Compat.ScreenMenuAPI\UniversalMenu.Compat.ScreenMenuAPI.csproj", "{B5AB3AB6-5BB6-0154-27DF-61D9EE587806}"
29+
EndProject
2830
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalMenu.Driver.ScreenMenuAPI", "src\UniversalMenu.Driver.ScreenMenuAPI\UniversalMenu.Driver.ScreenMenuAPI.csproj", "{E2FD83DD-D7EA-97CA-B6F4-DE2F92E5A00F}"
2931
EndProject
3032
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GitHub Actions", "GitHub Actions", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}"
@@ -37,6 +39,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GitHub Actions", "GitHub Ac
3739
.github\shared.yml = .github\shared.yml
3840
EndProjectSection
3941
EndProject
42+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalMenu.Compat.CSSharp", "src\UniversalMenu.Compat.CSSharp\UniversalMenu.Compat.CSSharp.csproj", "{EF2866D7-C411-42ED-B5E0-DCE79CCFCA09}"
43+
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
4046
Global
4147
GlobalSection(SolutionConfigurationPlatforms) = preSolution
4248
Debug|Any CPU = Debug|Any CPU
@@ -59,10 +65,22 @@ Global
5965
{44AAF649-62D6-1CD8-3F16-028F4D262BE6}.Debug|Any CPU.Build.0 = Debug|Any CPU
6066
{44AAF649-62D6-1CD8-3F16-028F4D262BE6}.Release|Any CPU.ActiveCfg = Release|Any CPU
6167
{44AAF649-62D6-1CD8-3F16-028F4D262BE6}.Release|Any CPU.Build.0 = Release|Any CPU
68+
{B5AB3AB6-5BB6-0154-27DF-61D9EE587806}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
69+
{B5AB3AB6-5BB6-0154-27DF-61D9EE587806}.Debug|Any CPU.Build.0 = Debug|Any CPU
70+
{B5AB3AB6-5BB6-0154-27DF-61D9EE587806}.Release|Any CPU.ActiveCfg = Release|Any CPU
71+
{B5AB3AB6-5BB6-0154-27DF-61D9EE587806}.Release|Any CPU.Build.0 = Release|Any CPU
6272
{E2FD83DD-D7EA-97CA-B6F4-DE2F92E5A00F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
6373
{E2FD83DD-D7EA-97CA-B6F4-DE2F92E5A00F}.Debug|Any CPU.Build.0 = Debug|Any CPU
6474
{E2FD83DD-D7EA-97CA-B6F4-DE2F92E5A00F}.Release|Any CPU.ActiveCfg = Release|Any CPU
6575
{E2FD83DD-D7EA-97CA-B6F4-DE2F92E5A00F}.Release|Any CPU.Build.0 = Release|Any CPU
76+
{EF2866D7-C411-42ED-B5E0-DCE79CCFCA09}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
77+
{EF2866D7-C411-42ED-B5E0-DCE79CCFCA09}.Debug|Any CPU.Build.0 = Debug|Any CPU
78+
{EF2866D7-C411-42ED-B5E0-DCE79CCFCA09}.Release|Any CPU.ActiveCfg = Release|Any CPU
79+
{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
6684
EndGlobalSection
6785
GlobalSection(SolutionProperties) = preSolution
6886
HideSolutionNode = FALSE

package.sh

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,20 @@ mkdir -p "$dst_plugins/UniversalMenu.Compat.MenuManagerApi"
1616
src="./src/UniversalMenu.Compat.MenuManagerApi/bin/Release/net8.0/publish"
1717
cp -r "$src/." "$dst_plugins/UniversalMenu.Compat.MenuManagerApi/"
1818

19+
# package UniversalMenu.Compat.CSSharp
20+
mkdir -p "$dst_plugins/UniversalMenu.Compat.CSSharp"
21+
src="./src/UniversalMenu.Compat.CSSharp/bin/Release/net8.0/publish"
22+
cp -r "$src/." "$dst_plugins/UniversalMenu.Compat.CSSharp/"
23+
# shared part: allows modified methods to load the 0Harmony.dll dependency
24+
mkdir -p "$dst_plugins/UniversalMenu.Compat.CSSharp.Shared"
25+
src="./src/UniversalMenu.Compat.CSSharp.Shared/bin/Release/net8.0/publish"
26+
cp -r "$src/." "$dst_plugins/UniversalMenu.Compat.CSSharp.Shared/"
27+
28+
# package UniversalMenu.Compat.ScreenMenuAPI # this isn't implemented yet
29+
#mkdir -p "$dst_plugins/UniversalMenu.Compat.ScreenMenuAPI"
30+
#src="./src/UniversalMenu.Compat.ScreenMenuAPI/bin/Release/net8.0/publish"
31+
#cp -r "$src/." "$dst_shared/UniversalMenu.Compat.ScreenMenuAPI/"
32+
1933
# zip CSSUniversalMenuAPI.zip
2034
pushd "$dst"
2135
7z a ../CSSUniversalMenuAPI.zip ./
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
using System.Linq;
2+
3+
using AngleSharp.Dom;
4+
using AngleSharp.Html.Parser;
5+
6+
using CounterStrikeSharp.API.Core;
7+
using CounterStrikeSharp.API.Modules.Menu;
8+
9+
using CSSUniversalMenuAPI;
10+
using CSSUniversalMenuAPI.Extensions;
11+
12+
using HarmonyLib;
13+
14+
namespace UniversalMenu.Compat.CSSharp;
15+
16+
public static class CSSSharpCompatPluginShared
17+
{
18+
private static Harmony? Harmony { get; set; }
19+
20+
public static void Patch()
21+
{
22+
Harmony = new Harmony("com.universalmenu.cssharp");
23+
24+
{
25+
var original = AccessTools.Method(typeof(MenuManager), nameof(MenuManager.OpenCenterHtmlMenu));
26+
var pre = SymbolExtensions.GetMethodInfo(() => MenuManager_OpenCenterHtmlMenu(null!, null!, null!));
27+
Harmony.Patch(original, prefix: new HarmonyMethod(pre));
28+
}
29+
30+
{
31+
var original = AccessTools.Method(typeof(MenuManager), nameof(MenuManager.OpenChatMenu));
32+
var pre = SymbolExtensions.GetMethodInfo(() => MenuManager_OpenChatMenu(null!, null!, null!));
33+
Harmony.Patch(original, prefix: new HarmonyMethod(pre));
34+
}
35+
36+
{
37+
var original = AccessTools.Method(typeof(MenuManager), nameof(MenuManager.OpenConsoleMenu));
38+
var pre = SymbolExtensions.GetMethodInfo(() => MenuManager_OpenConsoleMenu(null!, null!, null!));
39+
Harmony.Patch(original, prefix: new HarmonyMethod(pre));
40+
}
41+
}
42+
43+
public static void Unpatch()
44+
{
45+
Harmony?.UnpatchAll();
46+
}
47+
48+
public static bool BaseMenu_Open(BasePlugin plugin, CCSPlayerController player, BaseMenu menu)
49+
{
50+
var api = IMenuAPI.PluginCapability.Get();
51+
52+
if (api is null) // fall back to builtin menu
53+
return true;
54+
55+
var newMenu = api.CreateMenu(player);
56+
newMenu.PlayerCanClose = menu.ExitButton;
57+
58+
var useHtml = false;
59+
if (newMenu is IHtmlSupportMenuExtension htmlMenu)
60+
htmlMenu.UseHtml = useHtml = true;
61+
62+
if (useHtml)
63+
newMenu.Title = menu.Title;
64+
else
65+
newMenu.Title = StripHtml(menu.Title);
66+
67+
foreach (var item in menu.MenuOptions)
68+
{
69+
var newItem = newMenu.CreateItem();
70+
newItem.Enabled = !item.Disabled;
71+
72+
if (useHtml)
73+
newItem.Title = item.Text;
74+
else
75+
newItem.Title = StripHtml(item.Text);
76+
77+
if (item.OnSelect is not null)
78+
newItem.Selected += (selectedItem) =>
79+
{
80+
if (menu.PostSelectAction == PostSelectAction.Close)
81+
newMenu.Close();
82+
item.OnSelect(player, item);
83+
};
84+
}
85+
86+
newMenu.Display();
87+
return false;
88+
}
89+
90+
public static bool MenuManager_OpenCenterHtmlMenu(BasePlugin plugin, CCSPlayerController player, CenterHtmlMenu menu)
91+
{
92+
return BaseMenu_Open(plugin, player, menu);
93+
}
94+
95+
public static bool MenuManager_OpenChatMenu(BasePlugin plugin, CCSPlayerController player, ChatMenu menu)
96+
{
97+
return BaseMenu_Open(plugin, player, menu);
98+
}
99+
100+
public static bool MenuManager_OpenConsoleMenu(BasePlugin plugin, CCSPlayerController player, ConsoleMenu menu)
101+
{
102+
return BaseMenu_Open(plugin, player, menu);
103+
}
104+
105+
private static readonly HtmlParser HtmlParser = new(new HtmlParserOptions() { IsStrictMode = false });
106+
private static string StripHtml(string input)
107+
{
108+
var doc = HtmlParser.ParseFragment(input, null!);
109+
return string.Join(string.Empty, doc.Select(x => x.Text()));
110+
}
111+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<RootNamespace>UniversalMenu.Compat.CSSharp</RootNamespace>
5+
<OutputType>Library</OutputType>
6+
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<ProjectReference Include="..\CSSUniversalMenuAPI\CSSUniversalMenuAPI.csproj">
11+
<Private>False</Private>
12+
<CopyLocalSatelliteAssemblies>False</CopyLocalSatelliteAssemblies>
13+
</ProjectReference>
14+
<PackageReference Include="AngleSharp" Version="1.2.0" />
15+
16+
<PackageReference Include="CS2ScreenMenuAPI" Version="3.0.4" ExcludeAssets="runtime" />
17+
<PackageReference Include="Lib.Harmony" Version="2.3.6" />
18+
</ItemGroup>
19+
20+
</Project>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using CounterStrikeSharp.API.Core;
2+
3+
namespace UniversalMenu.Compat.CSSharp;
4+
5+
public class CSSSharpCompatPlugin : BasePlugin
6+
{
7+
public override string ModuleName => "UniversalMenu.Compat.CSSharp";
8+
public override string ModuleVersion => Verlite.Version.Full;
9+
10+
public override void Load(bool hotReload)
11+
{
12+
CSSSharpCompatPluginShared.Patch();
13+
}
14+
15+
public override void Unload(bool hotReload)
16+
{
17+
CSSSharpCompatPluginShared.Unpatch();
18+
}
19+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<RootNamespace>UniversalMenu.Compat.CSSharp</RootNamespace>
5+
<OutputType>Library</OutputType>
6+
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<ProjectReference Include="..\CSSUniversalMenuAPI\CSSUniversalMenuAPI.csproj">
11+
<Private>False</Private>
12+
<CopyLocalSatelliteAssemblies>False</CopyLocalSatelliteAssemblies>
13+
</ProjectReference>
14+
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+
21+
<PackageReference Include="CS2ScreenMenuAPI" Version="3.0.4" ExcludeAssets="runtime" />
22+
</ItemGroup>
23+
24+
</Project>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<RootNamespace>UniversalMenu.Compat.ScreenMenuAPI</RootNamespace>
5+
<OutputType>Library</OutputType>
6+
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<ProjectReference Include="..\CSSUniversalMenuAPI\CSSUniversalMenuAPI.csproj">
11+
<Private>False</Private>
12+
<CopyLocalSatelliteAssemblies>False</CopyLocalSatelliteAssemblies>
13+
</ProjectReference>
14+
15+
<PackageReference Include="CS2ScreenMenuAPI" Version="3.0.4" ExcludeAssets="runtime" />
16+
</ItemGroup>
17+
18+
</Project>

0 commit comments

Comments
 (0)