Skip to content
This repository was archived by the owner on Mar 15, 2024. It is now read-only.

Commit 333305a

Browse files
committed
wip ConVar manager
1 parent 20cc2b8 commit 333305a

File tree

9 files changed

+172
-35
lines changed

9 files changed

+172
-35
lines changed

.editorconfig

+28-2
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,37 @@ charset = "utf-8"
77
[*.cs]
88
csharp_style_namespace_declarations = file_scoped:error
99
csharp_using_directive_placement = outside_namespace:error
10-
dotnet_diagnostic.CS4014.severity = error
10+
dotnet_diagnostic.cs4014.severity = error
1111
indent_size = 4
1212

13+
# Microsoft .NET properties
14+
csharp_new_line_before_members_in_object_initializers = true
15+
csharp_new_line_between_query_expression_clauses = true
16+
17+
# ReSharper properties
18+
resharper_csharp_wrap_arguments_style = chop_if_long
19+
resharper_csharp_wrap_before_binary_opsign = true
20+
resharper_csharp_wrap_extends_list_style = chop_if_long
21+
resharper_csharp_wrap_multiple_declaration_style = chop_always
22+
resharper_csharp_wrap_parameters_style = chop_if_long
23+
resharper_keep_existing_embedded_arrangement = false
24+
resharper_keep_existing_expr_member_arrangement = false
25+
resharper_keep_existing_switch_expression_arrangement = false
26+
resharper_nested_ternary_style = expanded
27+
resharper_new_line_before_while = true
28+
resharper_place_accessorholder_attribute_on_same_line = false
29+
resharper_place_field_attribute_on_same_line = false
30+
resharper_place_simple_embedded_statement_on_same_line = false
31+
resharper_space_within_single_line_array_initializer_braces = true
32+
resharper_wrap_array_initializer_style = chop_if_long
33+
resharper_wrap_chained_binary_expressions = chop_if_long
34+
resharper_wrap_chained_binary_patterns = chop_if_long
35+
resharper_wrap_chained_method_calls = chop_if_long
36+
resharper_wrap_linq_expressions = chop_always
37+
resharper_wrap_list_pattern = chop_if_long
38+
1339
[*.json]
1440
indent_size = 2
1541

1642
[*.{xml,config}]
17-
indent_size = 2
43+
indent_size = 2

BindingGenerator/CoreLibrary.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public void Setup(Driver driver)
2626
var projectFolder = Environment.GetEnvironmentVariable("SOURCESHARP")!;
2727

2828
var options = driver.Options;
29+
options.Verbose = true;
2930
options.GeneratorKind = GeneratorKind.CSharp;
3031
options.OutputDir = Path.Combine(projectFolder, "runtime", "Core", "Bridges");
3132

@@ -46,7 +47,8 @@ public void Setup(Driver driver)
4647

4748
public void SetupPasses(Driver driver)
4849
{
49-
50+
driver.Context.TranslationUnitPasses.AddPass(new CppSharp.Passes.FunctionToInstanceMethodPass());
51+
driver.Context.TranslationUnitPasses.AddPass(new CppSharp.Passes.FunctionToStaticMethodPass());
5052
}
5153

5254
}

Core/Bootstrap.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ private static void ConfigureServices(IServiceCollection services, IConfiguratio
8686

8787
services.AddSingleton<IAdminManager, AdminManager>();
8888
services.AddSingleton<ICommandListener, CommandListener>();
89-
//services.AddSingleton<IConVarManager, ConVarManager>();
89+
services.AddSingleton<IConVarManager, ConVarManager>();
9090
//services.AddSingleton<IGameEventListener, GameEventListener>();
9191
services.AddSingleton<IPlayerListener, PlayerListener>();
9292
services.AddSingleton<IPlayerManagerBase, PlayerManager>();

Core/Bridges/ConVar.cs

+116-29
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,86 @@
1414

1515
namespace SourceSharp.Core.Bridges
1616
{
17+
public unsafe partial class ConVar
18+
{
19+
public partial struct __Internal
20+
{
21+
}
22+
23+
public __IntPtr __Instance { get; protected set; }
24+
25+
internal static readonly new global::System.Collections.Concurrent.ConcurrentDictionary<IntPtr, global::SourceSharp.Core.Bridges.ConVar> NativeToManagedMap =
26+
new global::System.Collections.Concurrent.ConcurrentDictionary<IntPtr, global::SourceSharp.Core.Bridges.ConVar>();
27+
28+
internal static void __RecordNativeToManagedMapping(IntPtr native, global::SourceSharp.Core.Bridges.ConVar managed)
29+
{
30+
NativeToManagedMap[native] = managed;
31+
}
32+
33+
internal static bool __TryGetNativeToManagedMapping(IntPtr native, out global::SourceSharp.Core.Bridges.ConVar managed)
34+
{
35+
36+
return NativeToManagedMap.TryGetValue(native, out managed);
37+
}
38+
39+
protected bool __ownsNativeInstance;
40+
41+
internal static ConVar __CreateInstance(__IntPtr native, bool skipVTables = false)
42+
{
43+
if (native == __IntPtr.Zero)
44+
return null;
45+
return new ConVar(native.ToPointer(), skipVTables);
46+
}
47+
48+
internal static ConVar __GetOrCreateInstance(__IntPtr native, bool saveInstance = false, bool skipVTables = false)
49+
{
50+
if (native == __IntPtr.Zero)
51+
return null;
52+
if (__TryGetNativeToManagedMapping(native, out var managed))
53+
return (ConVar)managed;
54+
var result = __CreateInstance(native, skipVTables);
55+
if (saveInstance)
56+
__RecordNativeToManagedMapping(native, result);
57+
return result;
58+
}
59+
60+
internal static ConVar __CreateInstance(__Internal native, bool skipVTables = false)
61+
{
62+
return new ConVar(native, skipVTables);
63+
}
64+
65+
private static void* __CopyValue(__Internal native)
66+
{
67+
var ret = Marshal.AllocHGlobal(sizeof(__Internal));
68+
*(__Internal*) ret = native;
69+
return ret.ToPointer();
70+
}
71+
72+
private ConVar(__Internal native, bool skipVTables = false)
73+
: this(__CopyValue(native), skipVTables)
74+
{
75+
__ownsNativeInstance = true;
76+
__RecordNativeToManagedMapping(__Instance, this);
77+
}
78+
79+
protected ConVar(void* native, bool skipVTables = false)
80+
{
81+
if (native == null)
82+
return;
83+
__Instance = new __IntPtr(native);
84+
}
85+
}
86+
1787
public unsafe partial class SSConVar : IDisposable
1888
{
19-
[StructLayout(LayoutKind.Sequential, Size = 8)]
89+
[StructLayout(LayoutKind.Sequential, Size = 16)]
2090
public partial struct __Internal
2191
{
2292
internal __IntPtr m_pConVar;
93+
internal byte m_bRegister;
94+
95+
[SuppressUnmanagedCodeSecurity, DllImport("sourcesharp", EntryPoint = "??0SSConVar@@QEAA@PEAVConVar@@_N@Z", CallingConvention = __CallingConvention.Cdecl)]
96+
internal static extern __IntPtr ctor(__IntPtr __instance, __IntPtr pVar, bool bRegister);
2397

2498
[SuppressUnmanagedCodeSecurity, DllImport("sourcesharp", EntryPoint = "??0SSConVar@@QEAA@AEBV0@@Z", CallingConvention = __CallingConvention.Cdecl)]
2599
internal static extern __IntPtr cctor(__IntPtr __instance, __IntPtr _0);
@@ -28,12 +102,6 @@ public partial struct __Internal
28102
[return: MarshalAs(UnmanagedType.I1)]
29103
internal static extern bool ReplicateToPlayers(__IntPtr __instance, int[] pPlayers, int nPlayers);
30104

31-
[SuppressUnmanagedCodeSecurity, DllImport("sourcesharp", EntryPoint = "?GetName@SSConVar@@QEAAPEBDXZ", CallingConvention = __CallingConvention.Cdecl)]
32-
internal static extern __IntPtr GetName(__IntPtr __instance);
33-
34-
[SuppressUnmanagedCodeSecurity, DllImport("sourcesharp", EntryPoint = "?GetDefault@SSConVar@@QEAAPEBDXZ", CallingConvention = __CallingConvention.Cdecl)]
35-
internal static extern __IntPtr GetDefault(__IntPtr __instance);
36-
37105
[SuppressUnmanagedCodeSecurity, DllImport("sourcesharp", EntryPoint = "?GetDescription@SSConVar@@QEAAPEBDXZ", CallingConvention = __CallingConvention.Cdecl)]
38106
internal static extern __IntPtr GetDescription(__IntPtr __instance);
39107

@@ -93,6 +161,9 @@ public partial struct __Internal
93161

94162
[SuppressUnmanagedCodeSecurity, DllImport("sourcesharp", EntryPoint = "?SetHasMax@SSConVar@@QEAAX_N@Z", CallingConvention = __CallingConvention.Cdecl)]
95163
internal static extern void SetHasMax(__IntPtr __instance, bool has);
164+
165+
[SuppressUnmanagedCodeSecurity, DllImport("sourcesharp", EntryPoint = "?GetBase@SSConVar@@QEAAPEAVConVar@@XZ", CallingConvention = __CallingConvention.Cdecl)]
166+
internal static extern __IntPtr GetBase(__IntPtr __instance);
96167
}
97168

98169
public __IntPtr __Instance { get; protected set; }
@@ -158,11 +229,13 @@ protected SSConVar(void* native, bool skipVTables = false)
158229
__Instance = new __IntPtr(native);
159230
}
160231

161-
public SSConVar()
232+
public SSConVar(global::SourceSharp.Core.Bridges.ConVar pVar, bool bRegister)
162233
{
163234
__Instance = Marshal.AllocHGlobal(sizeof(global::SourceSharp.Core.Bridges.SSConVar.__Internal));
164235
__ownsNativeInstance = true;
165236
__RecordNativeToManagedMapping(__Instance, this);
237+
var __arg0 = pVar is null ? __IntPtr.Zero : pVar.__Instance;
238+
__Internal.ctor(__Instance, __arg0, bRegister);
166239
}
167240

168241
public SSConVar(global::SourceSharp.Core.Bridges.SSConVar _0)
@@ -197,24 +270,6 @@ public bool ReplicateToPlayers(int[] pPlayers, int nPlayers)
197270
return ___ret;
198271
}
199272

200-
public string Name
201-
{
202-
get
203-
{
204-
var ___ret = __Internal.GetName(__Instance);
205-
return CppSharp.Runtime.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, ___ret);
206-
}
207-
}
208-
209-
public string Default
210-
{
211-
get
212-
{
213-
var ___ret = __Internal.GetDefault(__Instance);
214-
return CppSharp.Runtime.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, ___ret);
215-
}
216-
}
217-
218273
public string Description
219274
{
220275
get
@@ -349,20 +404,51 @@ public bool HasMax
349404
__Internal.SetHasMax(__Instance, value);
350405
}
351406
}
407+
408+
public global::SourceSharp.Core.Bridges.ConVar Base
409+
{
410+
get
411+
{
412+
var ___ret = __Internal.GetBase(__Instance);
413+
var __result0 = global::SourceSharp.Core.Bridges.ConVar.__GetOrCreateInstance(___ret, false);
414+
return __result0;
415+
}
416+
}
352417
}
353418

354419
public unsafe partial class ConVar
355420
{
356421
public partial struct __Internal
357422
{
423+
[SuppressUnmanagedCodeSecurity, DllImport("sourcesharp", EntryPoint = "GetSSConVarName", CallingConvention = __CallingConvention.Cdecl)]
424+
internal static extern __IntPtr GetSSConVarName(__IntPtr pVar);
425+
426+
[SuppressUnmanagedCodeSecurity, DllImport("sourcesharp", EntryPoint = "GetSSConVarDefault", CallingConvention = __CallingConvention.Cdecl)]
427+
internal static extern __IntPtr GetSSConVarDefault(__IntPtr pVar);
428+
358429
[SuppressUnmanagedCodeSecurity, DllImport("sourcesharp", EntryPoint = "CreateConVar", CallingConvention = __CallingConvention.Cdecl)]
359430
internal static extern __IntPtr CreateConVar([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CppSharp.Runtime.UTF8Marshaller))] string pName, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CppSharp.Runtime.UTF8Marshaller))] string pDefValue, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CppSharp.Runtime.UTF8Marshaller))] string pDescription, int nFlags, bool bHasMin, float flMin, bool bHasMax, float flMax);
360431

361432
[SuppressUnmanagedCodeSecurity, DllImport("sourcesharp", EntryPoint = "FindConVar", CallingConvention = __CallingConvention.Cdecl)]
362433
internal static extern __IntPtr FindConVar([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CppSharp.Runtime.UTF8Marshaller))] string pName);
363434

364435
[SuppressUnmanagedCodeSecurity, DllImport("sourcesharp", EntryPoint = "RegisterConVarHook", CallingConvention = __CallingConvention.Cdecl)]
365-
internal static extern void RegisterConVarHook([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CppSharp.Runtime.UTF8Marshaller))] string pName);
436+
[return: MarshalAs(UnmanagedType.I1)]
437+
internal static extern bool RegisterConVarHook([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CppSharp.Runtime.UTF8Marshaller))] string pName);
438+
}
439+
440+
public static string GetSSConVarName(global::SourceSharp.Core.Bridges.SSConVar pVar)
441+
{
442+
var __arg0 = pVar is null ? __IntPtr.Zero : pVar.__Instance;
443+
var ___ret = __Internal.GetSSConVarName(__arg0);
444+
return CppSharp.Runtime.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, ___ret);
445+
}
446+
447+
public static string GetSSConVarDefault(global::SourceSharp.Core.Bridges.SSConVar pVar)
448+
{
449+
var __arg0 = pVar is null ? __IntPtr.Zero : pVar.__Instance;
450+
var ___ret = __Internal.GetSSConVarDefault(__arg0);
451+
return CppSharp.Runtime.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, ___ret);
366452
}
367453

368454
public static global::SourceSharp.Core.Bridges.SSConVar CreateConVar(string pName, string pDefValue, string pDescription, int nFlags, bool bHasMin, float flMin, bool bHasMax, float flMax)
@@ -379,9 +465,10 @@ public partial struct __Internal
379465
return __result0;
380466
}
381467

382-
public static void RegisterConVarHook(string pName)
468+
public static bool RegisterConVarHook(string pName)
383469
{
384-
__Internal.RegisterConVarHook(pName);
470+
var ___ret = __Internal.RegisterConVarHook(pName);
471+
return ___ret;
385472
}
386473
}
387474
}

Core/Invoker.cs

+13-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ internal static void Initialize(IServiceProvider services)
3131
_playerManager = services.GetRequiredService<IPlayerManagerBase>();
3232
_playerListener = services.GetRequiredService<IPlayerListener>();
3333
//_gameEventListener = services.GetRequiredService<IGameEventListener>();
34-
//_conVarManager = services.GetRequiredService<IConVarManager>();
34+
_conVarManager = services.GetRequiredService<IConVarManager>();
3535
}
3636

3737
/*
@@ -123,6 +123,18 @@ public static int ClientConsoleCommand(
123123

124124
#endregion
125125

126+
#region ConVar
127+
128+
[UnmanagedCallersOnly]
129+
public static void OnConVarChanged([DNNE.C99Type("const char*")] IntPtr pName,
130+
[DNNE.C99Type("const char*")] IntPtr pOldValue,
131+
[DNNE.C99Type("const char*")] IntPtr pNewValue)
132+
{
133+
134+
}
135+
136+
#endregion
137+
126138
#region Event Listener
127139

128140
[UnmanagedCallersOnly]

Core/Models/CConVar.cs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ internal class CConVar : ConVar
1313
private readonly SSConVar _conVar;
1414
private readonly string _name;
1515
private readonly string _description;
16+
public override event Action<ConVar, string, string>? OnChanged;
1617

1718
public CConVar(SSConVar conVar, string name, string description)
1819
{

Core/Modules/ConVarManager.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ private void HookConVars(CPlugin plugin)
133133

134134
return new ConVarHookInfo(conVar);
135135
},
136-
ConVarBridge.RegisterConVarHook);
136+
name => ConVarBridge.RegisterConVarHook(name));
137137

138138
/*
139139
* IRuntime

PluginExample/Example.cs

+4
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ public override bool OnLoad()
3131
{
3232
_sourceSharp.LogMessage("plugin loaded");
3333
_shareSystem.AddInterface(this, this);
34+
35+
ss_plugin_example.OnChanged += (var, oldValue, newValue) =>
36+
_sourceSharp.LogMessage($"ConVar [{var.Name}] -> old<{oldValue}> -> new<{newValue}");
37+
3438
return true;
3539
}
3640

Sdk/Models/ConVar.cs

+5
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ public ConVarFlags Flags
6060
/// <returns>True = 成功</returns>
6161
public abstract bool ReplicateToPlayers(GamePlayer[] players);
6262

63+
/// <summary>
64+
/// 订阅修改事件
65+
/// </summary>
66+
public abstract event Action<ConVar, string, string> OnChanged;
67+
6368
protected abstract ConVarBounds GetBounds();
6469
protected abstract void SetBounds(ConVarBounds bounds);
6570
protected abstract string GetDescription();

0 commit comments

Comments
 (0)