From c225b058623dc4c1a9adc0e713351bb967709203 Mon Sep 17 00:00:00 2001 From: Ambr0se Date: Wed, 22 Oct 2025 17:30:44 +0800 Subject: [PATCH 01/15] feat: Implement OriginalArgs getter for IOnCommandExecuteHookEvent --- .../EventParams/OnCommandExecuteHookEvent.cs | 1 + .../Services/CoreHookService.cs | 17 ++++++++++--- .../EventParams/IOnCommandExecuteHookEvent.cs | 5 ++++ managed/src/TestPlugin/TestPlugin.cs | 2 +- plugin_files/gamedata/cs2/core/offsets.jsonc | 24 +++++++++++++++++++ 5 files changed, 45 insertions(+), 4 deletions(-) diff --git a/managed/src/SwiftlyS2.Core/Modules/Events/EventParams/OnCommandExecuteHookEvent.cs b/managed/src/SwiftlyS2.Core/Modules/Events/EventParams/OnCommandExecuteHookEvent.cs index 981a1cfd..2ea5ccf2 100644 --- a/managed/src/SwiftlyS2.Core/Modules/Events/EventParams/OnCommandExecuteHookEvent.cs +++ b/managed/src/SwiftlyS2.Core/Modules/Events/EventParams/OnCommandExecuteHookEvent.cs @@ -6,6 +6,7 @@ namespace SwiftlyS2.Core.Events; internal class OnCommandExecuteHookEvent : IOnCommandExecuteHookEvent { public required string OriginalName { get; init; } + public required string[] OriginalArgs { get; init; } public string CommandName { get; set; } = string.Empty; public required HookMode HookMode { get; init; } diff --git a/managed/src/SwiftlyS2.Core/Services/CoreHookService.cs b/managed/src/SwiftlyS2.Core/Services/CoreHookService.cs index 926ce0ef..8df7443e 100644 --- a/managed/src/SwiftlyS2.Core/Services/CoreHookService.cs +++ b/managed/src/SwiftlyS2.Core/Services/CoreHookService.cs @@ -104,22 +104,32 @@ private void HookCommandExecute() _Logger.LogInformation("Hooking Cmd_ExecuteCommand at {Address}", address); var commandNameOffset = NativeOffsets.Fetch("CommandNameOffset"); + var commandArgsOffset = NativeOffsets.Fetch("CommandArgsOffset"); _ExecuteCommand = _Core.Memory.GetUnmanagedFunctionByAddress(address); _ExecuteCommandGuid = _ExecuteCommand.AddHook((next) => { return (a1, a2, a3, a4, a5) => { - var (commandName, commandPtr) = (a5 != nint.Zero && a5 < nint.MaxValue && commandNameOffset != 0) switch + var commandName = (a5 != nint.Zero && a5 < nint.MaxValue && commandNameOffset != 0) switch { true when Marshal.ReadIntPtr(new nint(a5 + commandNameOffset)) is var basePtr && basePtr != nint.Zero && basePtr < nint.MaxValue - => (Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(basePtr)) ?? string.Empty, Marshal.ReadIntPtr(basePtr)), - _ => (string.Empty, nint.Zero) + => Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(basePtr)) ?? string.Empty, + _ => string.Empty }; + var commandArgs = (a5 != nint.Zero && a5 < nint.MaxValue && commandArgsOffset != 0) switch + { + true => Marshal.PtrToStringAnsi(new nint(a5 + commandArgsOffset)) ?? string.Empty, + _ => string.Empty + }; + + var argsSplit = commandArgs.Split(' ', StringSplitOptions.RemoveEmptyEntries); + var args = argsSplit.Length > 1 ? argsSplit[1..] : []; var preEvent = new OnCommandExecuteHookEvent { OriginalName = commandName, + OriginalArgs = args, HookMode = HookMode.Pre }; EventPublisher.InvokeOnCommandExecuteHook(preEvent); @@ -142,6 +152,7 @@ true when Marshal.ReadIntPtr(new nint(a5 + commandNameOffset)) is var basePtr && var postEvent = new OnCommandExecuteHookEvent { OriginalName = commandName, + OriginalArgs = args, HookMode = HookMode.Post }; EventPublisher.InvokeOnCommandExecuteHook(postEvent); diff --git a/managed/src/SwiftlyS2.Shared/Modules/Events/EventParams/IOnCommandExecuteHookEvent.cs b/managed/src/SwiftlyS2.Shared/Modules/Events/EventParams/IOnCommandExecuteHookEvent.cs index 3ad311a2..699f9300 100644 --- a/managed/src/SwiftlyS2.Shared/Modules/Events/EventParams/IOnCommandExecuteHookEvent.cs +++ b/managed/src/SwiftlyS2.Shared/Modules/Events/EventParams/IOnCommandExecuteHookEvent.cs @@ -12,6 +12,11 @@ public interface IOnCommandExecuteHookEvent { /// public string OriginalName { get; } + /// + /// The original command arguments. + /// + public string[] OriginalArgs { get; } + /// /// The command arguments. /// diff --git a/managed/src/TestPlugin/TestPlugin.cs b/managed/src/TestPlugin/TestPlugin.cs index 3afd3499..80f69e5e 100644 --- a/managed/src/TestPlugin/TestPlugin.cs +++ b/managed/src/TestPlugin/TestPlugin.cs @@ -77,7 +77,7 @@ public override void Load(bool hotReload) // Core.Event.OnCommandExecuteHook += (@event) => // { - // Console.WriteLine($"[TestPlugin] CommandExecute({@event.HookMode}): {@event.OriginalName}"); + // Console.WriteLine($"[TestPlugin] CommandExecute({@event.HookMode}): {@event.OriginalName} ({string.Join(" ", @event.OriginalArgs)})"); // @event.SetCommandName("test"); // }; Core.Engine.ExecuteCommandWithBuffer("@ping", (buffer) => diff --git a/plugin_files/gamedata/cs2/core/offsets.jsonc b/plugin_files/gamedata/cs2/core/offsets.jsonc index 669ae0b5..674410ee 100644 --- a/plugin_files/gamedata/cs2/core/offsets.jsonc +++ b/plugin_files/gamedata/cs2/core/offsets.jsonc @@ -97,6 +97,30 @@ "windows": 1088, "linux": 1088 }, + /* + To locate this offset, first refer to my ExecuteCommandDelegate comments in CoreHookService.cs. + The function prologue disassembly: + + .text:00000000001C34E0 mov [rsp-8+arg_8], rbx + .text:00000000001C34E5 mov [rsp-8+arg_18], r9 + .text:00000000001C34EA mov [rsp-8+arg_0], rcx + ... + .text:00000000001C3509 mov r14, [rbp+0D00h+arg_20] + + Following the Windows x64 calling convention, parameters a1-a4 are passed via rcx, rdx, r8, r9 respectively, + while a5 (the first stack parameter) is loaded into r14 from [rbp+0D00h+arg_20]. + + By setting a breakpoint at the mov instruction above and executing an invalid command in the CS2 server console, + we can inspect the memory region pointed to by r14. + The command string with arguments appears at offset 0x20 from the base address in r14. + + Note: Unlike CommandNameOffset (which points to null-byte ('\0') delimited tokens), + CommandArgsOffset points to a space-delimited string containing the full command line. + */ + "CommandArgsOffset": { + "windows": 32, + "linux": 32 + }, /* From sdk */ "ICvar::FindConCommand": { "windows": 17, From cbd971d1799fed50ee6353c9cb9f0cad2a18611d Mon Sep 17 00:00:00 2001 From: Ambr0se Date: Wed, 22 Oct 2025 17:44:11 +0800 Subject: [PATCH 02/15] chore: Update TestPlugin.cs --- managed/src/TestPlugin/TestPlugin.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/managed/src/TestPlugin/TestPlugin.cs b/managed/src/TestPlugin/TestPlugin.cs index 80f69e5e..0e602dbf 100644 --- a/managed/src/TestPlugin/TestPlugin.cs +++ b/managed/src/TestPlugin/TestPlugin.cs @@ -75,11 +75,12 @@ public override void Load(bool hotReload) // Console.WriteLine($"[TestPlugin] ConsoleOutput: {@event.Message}"); // }; - // Core.Event.OnCommandExecuteHook += (@event) => - // { - // Console.WriteLine($"[TestPlugin] CommandExecute({@event.HookMode}): {@event.OriginalName} ({string.Join(" ", @event.OriginalArgs)})"); - // @event.SetCommandName("test"); - // }; + Core.Event.OnCommandExecuteHook += (@event) => + { + if (@event.HookMode == HookMode.Pre) return; + Core.Logger.LogInformation("CommandExecute: {name} with {args}", @event.OriginalName, @event.OriginalArgs.Length > 0 ? string.Join(" ", @event.OriginalArgs) : "no args"); + // @event.SetCommandName("test"); + }; Core.Engine.ExecuteCommandWithBuffer("@ping", (buffer) => { Console.WriteLine($"pong: {buffer}"); From 9bae3c5f9ad764806c4f157f354fd43a33c3165c Mon Sep 17 00:00:00 2001 From: Ambr0se Date: Thu, 23 Oct 2025 00:29:43 +0800 Subject: [PATCH 03/15] chore: Cleanup code --- managed/src/TestPlugin/TestPlugin.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/managed/src/TestPlugin/TestPlugin.cs b/managed/src/TestPlugin/TestPlugin.cs index 0e602dbf..c9ff4404 100644 --- a/managed/src/TestPlugin/TestPlugin.cs +++ b/managed/src/TestPlugin/TestPlugin.cs @@ -75,12 +75,12 @@ public override void Load(bool hotReload) // Console.WriteLine($"[TestPlugin] ConsoleOutput: {@event.Message}"); // }; - Core.Event.OnCommandExecuteHook += (@event) => - { - if (@event.HookMode == HookMode.Pre) return; - Core.Logger.LogInformation("CommandExecute: {name} with {args}", @event.OriginalName, @event.OriginalArgs.Length > 0 ? string.Join(" ", @event.OriginalArgs) : "no args"); - // @event.SetCommandName("test"); - }; + // Core.Event.OnCommandExecuteHook += (@event) => + // { + // if (@event.HookMode == HookMode.Pre) return; + // Core.Logger.LogInformation("CommandExecute: {name} with {args}", @event.OriginalName, @event.OriginalArgs.Length > 0 ? string.Join(" ", @event.OriginalArgs) : "no args"); + // // @event.SetCommandName("test"); + // }; Core.Engine.ExecuteCommandWithBuffer("@ping", (buffer) => { Console.WriteLine($"pong: {buffer}"); From 9d80e977ad42dcaffe4fe3db67fda93860048568 Mon Sep 17 00:00:00 2001 From: skuzzis Date: Thu, 23 Oct 2025 14:15:40 +0300 Subject: [PATCH 04/15] fix(menus): Submenu Open --- managed/src/SwiftlyS2.Core/Modules/Menus/Menu.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/managed/src/SwiftlyS2.Core/Modules/Menus/Menu.cs b/managed/src/SwiftlyS2.Core/Modules/Menus/Menu.cs index 9b7de47f..e3b7dd12 100644 --- a/managed/src/SwiftlyS2.Core/Modules/Menus/Menu.cs +++ b/managed/src/SwiftlyS2.Core/Modules/Menus/Menu.cs @@ -228,7 +228,7 @@ public void UseSelection(IPlayer player) buttonOption.OnClick?.Invoke(player); if (buttonOption.CloseOnSelect) { - Close(player); + MenuManager.CloseMenuForPlayer(player); } break; } @@ -255,7 +255,7 @@ public void UseSelection(IPlayer player) if (closeAfter && player.IsValid) { - Close(player); + MenuManager.CloseMenuForPlayer(player); } } }); @@ -266,7 +266,7 @@ public void UseSelection(IPlayer player) toggle.Toggle(player); if (toggle.CloseOnSelect) { - Close(player); + MenuManager.CloseMenuForPlayer(player); } else { @@ -280,7 +280,7 @@ public void UseSelection(IPlayer player) if (subMenu != null) { subMenu.Parent = this; - subMenu.Show(player); + MenuManager.OpenMenu(player, subMenu); } break; } From 2da9567b9bb4f75952efc0f97321727f22bc5567 Mon Sep 17 00:00:00 2001 From: skuzzis Date: Fri, 24 Oct 2025 03:45:25 +0300 Subject: [PATCH 05/15] feat(managed): ICommandLine --- .../Modules/CommandLine/CommandLine.cs | 33 +++++ .../Modules/Plugins/SwiftlyCore.cs | 10 +- .../Natives/CommandLine.cs | 114 ++++++++++++++++++ managed/src/SwiftlyS2.Shared/ISwiftlyCore.cs | 6 + .../Modules/CommandLine/ICommandLine.cs | 33 +++++ natives/engine/commandline.native | 9 ++ src/scripting/engine/commandline.cpp | 99 +++++++++++++++ 7 files changed, 301 insertions(+), 3 deletions(-) create mode 100644 managed/src/SwiftlyS2.Core/Modules/CommandLine/CommandLine.cs create mode 100644 managed/src/SwiftlyS2.Generated/Natives/CommandLine.cs create mode 100644 managed/src/SwiftlyS2.Shared/Modules/CommandLine/ICommandLine.cs create mode 100644 natives/engine/commandline.native create mode 100644 src/scripting/engine/commandline.cpp diff --git a/managed/src/SwiftlyS2.Core/Modules/CommandLine/CommandLine.cs b/managed/src/SwiftlyS2.Core/Modules/CommandLine/CommandLine.cs new file mode 100644 index 00000000..abff6c84 --- /dev/null +++ b/managed/src/SwiftlyS2.Core/Modules/CommandLine/CommandLine.cs @@ -0,0 +1,33 @@ +using SwiftlyS2.Core.Natives; +using SwiftlyS2.Shared.CommandLine; + +namespace SwiftlyS2.Core.CommandLine; + +internal class CommandLineService : ICommandLine +{ + public int ParameterCount => NativeCommandLine.GetParameterCount(); + + public string CommandLine => NativeCommandLine.GetCommandLine(); + + public bool HasParameters => NativeCommandLine.HasParameters(); + + public float GetParameterFloat(string paramName, float defaultValue = 0) + { + return NativeCommandLine.GetParameterValueFloat(paramName, defaultValue); + } + + public int GetParameterInt(string paramName, int defaultValue = 0) + { + return NativeCommandLine.GetParameterValueInt(paramName, defaultValue); + } + + public string GetParameterString(string paramName, string defaultValue = "") + { + return NativeCommandLine.GetParameterValueString(paramName, defaultValue); + } + + public bool HasParameter(string paramName) + { + return NativeCommandLine.HasParameter(paramName); + } +} \ No newline at end of file diff --git a/managed/src/SwiftlyS2.Core/Modules/Plugins/SwiftlyCore.cs b/managed/src/SwiftlyS2.Core/Modules/Plugins/SwiftlyCore.cs index c8bd836b..579b4afa 100644 --- a/managed/src/SwiftlyS2.Core/Modules/Plugins/SwiftlyCore.cs +++ b/managed/src/SwiftlyS2.Core/Modules/Plugins/SwiftlyCore.cs @@ -6,7 +6,6 @@ using SwiftlyS2.Core.GameEvents; using SwiftlyS2.Core.Misc; using SwiftlyS2.Core.NetMessages; -using SwiftlyS2.Core.Services; using SwiftlyS2.Shared; using SwiftlyS2.Shared.Events; using SwiftlyS2.Shared.GameEvents; @@ -26,9 +25,7 @@ using SwiftlyS2.Core.Memory; using SwiftlyS2.Shared.Scheduler; using SwiftlyS2.Core.Scheduler; -using SwiftlyS2.Core.Plugins; using SwiftlyS2.Core.Database; -using SwiftlyS2.Core.Engine; using SwiftlyS2.Shared.Database; using SwiftlyS2.Core.Translations; using SwiftlyS2.Core.Permissions; @@ -38,6 +35,8 @@ using SwiftlyS2.Shared.Players; using SwiftlyS2.Shared.Translation; using SwiftlyS2.Core.Players; +using SwiftlyS2.Shared.CommandLine; +using SwiftlyS2.Core.CommandLine; namespace SwiftlyS2.Core.Services; @@ -70,6 +69,7 @@ internal class SwiftlyCore : ISwiftlyCore, IDisposable public PermissionManager PermissionManager { get; init; } public RegistratorService RegistratorService { get; init; } public MenuManager MenuManager { get; init; } + public CommandLineService CommandLineManager { get; init; } public string ContextBasePath { get; init; } public SwiftlyCore(string contextId, string contextBaseDirectory, PluginMetadata? pluginManifest, Type contextType, IServiceProvider coreProvider) { @@ -102,6 +102,7 @@ public SwiftlyCore(string contextId, string contextBaseDirectory, PluginMetadata .AddSingleton() .AddSingleton() .AddSingleton() + .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() @@ -131,6 +132,7 @@ public SwiftlyCore(string contextId, string contextBaseDirectory, PluginMetadata .AddSingleton(provider => provider.GetRequiredService().GetLocalizer()) .AddSingleton(provider => provider.GetRequiredService()) .AddSingleton(provider => provider.GetRequiredService()) + .AddSingleton(provider => provider.GetRequiredService()) .AddLogging( builder => @@ -164,6 +166,7 @@ public SwiftlyCore(string contextId, string contextBaseDirectory, PluginMetadata PermissionManager = _ServiceProvider.GetRequiredService(); RegistratorService = _ServiceProvider.GetRequiredService(); MenuManager = _ServiceProvider.GetRequiredService(); + CommandLineManager = _ServiceProvider.GetRequiredService(); Logger = LoggerFactory.CreateLogger(contextType); } @@ -206,4 +209,5 @@ public void Dispose() IRegistratorService ISwiftlyCore.Registrator => RegistratorService; IMenuManager ISwiftlyCore.Menus => MenuManager; string ISwiftlyCore.PluginPath => ContextBasePath; + public ICommandLine CommandLine => CommandLineManager; } \ No newline at end of file diff --git a/managed/src/SwiftlyS2.Generated/Natives/CommandLine.cs b/managed/src/SwiftlyS2.Generated/Natives/CommandLine.cs new file mode 100644 index 00000000..616e778b --- /dev/null +++ b/managed/src/SwiftlyS2.Generated/Natives/CommandLine.cs @@ -0,0 +1,114 @@ +#pragma warning disable CS0649 +#pragma warning disable CS0169 + +using System.Buffers; +using System.Text; +using System.Threading; +using SwiftlyS2.Shared.Natives; + +namespace SwiftlyS2.Core.Natives; + +internal static class NativeCommandLine { + private static int _MainThreadID; + + private unsafe static delegate* unmanaged _HasParameter; + + public unsafe static bool HasParameter(string parameter) { + var pool = ArrayPool.Shared; + var parameterLength = Encoding.UTF8.GetByteCount(parameter); + var parameterBuffer = pool.Rent(parameterLength + 1); + Encoding.UTF8.GetBytes(parameter, parameterBuffer); + parameterBuffer[parameterLength] = 0; + fixed (byte* parameterBufferPtr = parameterBuffer) { + var ret = _HasParameter(parameterBufferPtr); + pool.Return(parameterBuffer); + return ret == 1; + } + } + + private unsafe static delegate* unmanaged _GetParameterCount; + + public unsafe static int GetParameterCount() { + var ret = _GetParameterCount(); + return ret; + } + + private unsafe static delegate* unmanaged _GetParameterValueString; + + public unsafe static string GetParameterValueString(string parameter, string defaultValue) { + var pool = ArrayPool.Shared; + var parameterLength = Encoding.UTF8.GetByteCount(parameter); + var parameterBuffer = pool.Rent(parameterLength + 1); + Encoding.UTF8.GetBytes(parameter, parameterBuffer); + parameterBuffer[parameterLength] = 0; + var defaultValueLength = Encoding.UTF8.GetByteCount(defaultValue); + var defaultValueBuffer = pool.Rent(defaultValueLength + 1); + Encoding.UTF8.GetBytes(defaultValue, defaultValueBuffer); + defaultValueBuffer[defaultValueLength] = 0; + fixed (byte* parameterBufferPtr = parameterBuffer) { + fixed (byte* defaultValueBufferPtr = defaultValueBuffer) { + var ret = _GetParameterValueString(null, parameterBufferPtr, defaultValueBufferPtr); + var retBuffer = pool.Rent(ret + 1); + fixed (byte* retBufferPtr = retBuffer) { + ret = _GetParameterValueString(retBufferPtr, parameterBufferPtr, defaultValueBufferPtr); + var retString = Encoding.UTF8.GetString(retBufferPtr, ret); + pool.Return(retBuffer); + pool.Return(parameterBuffer); + pool.Return(defaultValueBuffer); + return retString; + } + } + } + } + + private unsafe static delegate* unmanaged _GetParameterValueInt; + + public unsafe static int GetParameterValueInt(string parameter, int defaultValue) { + var pool = ArrayPool.Shared; + var parameterLength = Encoding.UTF8.GetByteCount(parameter); + var parameterBuffer = pool.Rent(parameterLength + 1); + Encoding.UTF8.GetBytes(parameter, parameterBuffer); + parameterBuffer[parameterLength] = 0; + fixed (byte* parameterBufferPtr = parameterBuffer) { + var ret = _GetParameterValueInt(parameterBufferPtr, defaultValue); + pool.Return(parameterBuffer); + return ret; + } + } + + private unsafe static delegate* unmanaged _GetParameterValueFloat; + + public unsafe static float GetParameterValueFloat(string parameter, float defaultValue) { + var pool = ArrayPool.Shared; + var parameterLength = Encoding.UTF8.GetByteCount(parameter); + var parameterBuffer = pool.Rent(parameterLength + 1); + Encoding.UTF8.GetBytes(parameter, parameterBuffer); + parameterBuffer[parameterLength] = 0; + fixed (byte* parameterBufferPtr = parameterBuffer) { + var ret = _GetParameterValueFloat(parameterBufferPtr, defaultValue); + pool.Return(parameterBuffer); + return ret; + } + } + + private unsafe static delegate* unmanaged _GetCommandLine; + + public unsafe static string GetCommandLine() { + var ret = _GetCommandLine(null); + var pool = ArrayPool.Shared; + var retBuffer = pool.Rent(ret + 1); + fixed (byte* retBufferPtr = retBuffer) { + ret = _GetCommandLine(retBufferPtr); + var retString = Encoding.UTF8.GetString(retBufferPtr, ret); + pool.Return(retBuffer); + return retString; + } + } + + private unsafe static delegate* unmanaged _HasParameters; + + public unsafe static bool HasParameters() { + var ret = _HasParameters(); + return ret == 1; + } +} \ No newline at end of file diff --git a/managed/src/SwiftlyS2.Shared/ISwiftlyCore.cs b/managed/src/SwiftlyS2.Shared/ISwiftlyCore.cs index 42f46ea4..c41f2fcb 100644 --- a/managed/src/SwiftlyS2.Shared/ISwiftlyCore.cs +++ b/managed/src/SwiftlyS2.Shared/ISwiftlyCore.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.Logging; using SwiftlyS2.Core.Services; +using SwiftlyS2.Shared.CommandLine; using SwiftlyS2.Shared.Commands; using SwiftlyS2.Shared.ConsoleOutput; using SwiftlyS2.Shared.Convars; @@ -144,4 +145,9 @@ public interface ISwiftlyCore /// Menu manager. /// public IMenuManager Menus { get; } + + /// + /// Command line. + /// + public ICommandLine CommandLine { get; } } \ No newline at end of file diff --git a/managed/src/SwiftlyS2.Shared/Modules/CommandLine/ICommandLine.cs b/managed/src/SwiftlyS2.Shared/Modules/CommandLine/ICommandLine.cs new file mode 100644 index 00000000..d831ef8b --- /dev/null +++ b/managed/src/SwiftlyS2.Shared/Modules/CommandLine/ICommandLine.cs @@ -0,0 +1,33 @@ +namespace SwiftlyS2.Shared.CommandLine; + +public interface ICommandLine +{ + /// + /// Checks if a parameter exists in the command line. + /// + public bool HasParameter(string paramName); + + /// + /// Gets the total number of parameters in the command line. + /// + public int ParameterCount { get; } + + /// + /// Gets a string parameter from the command line. + /// + public string GetParameterString(string paramName, string defaultValue = ""); + + /// + /// Gets an integer parameter from the command line. + /// + public int GetParameterInt(string paramName, int defaultValue = 0); + + /// + /// Gets a float parameter from the command line. + /// + public float GetParameterFloat(string paramName, float defaultValue = 0f); + + public string CommandLine { get; } + + public bool HasParameters { get; } +} \ No newline at end of file diff --git a/natives/engine/commandline.native b/natives/engine/commandline.native new file mode 100644 index 00000000..600590d7 --- /dev/null +++ b/natives/engine/commandline.native @@ -0,0 +1,9 @@ +class CommandLine + +bool HasParameter = string parameter +int32 GetParameterCount = void +string GetParameterValueString = string parameter, string defaultValue +int32 GetParameterValueInt = string parameter, int32 defaultValue +float GetParameterValueFloat = string parameter, float defaultValue +string GetCommandLine = void +bool HasParameters = void \ No newline at end of file diff --git a/src/scripting/engine/commandline.cpp b/src/scripting/engine/commandline.cpp new file mode 100644 index 00000000..de9c4d50 --- /dev/null +++ b/src/scripting/engine/commandline.cpp @@ -0,0 +1,99 @@ +/************************************************************************************************ + * SwiftlyS2 is a scripting framework for Source2-based games. + * Copyright (C) 2025 Swiftly Solution SRL via Sava Andrei-Sebastian and it's contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ************************************************************************************************/ + +#include +#include +#include + +#include + +bool Scripting_CommandLine_HasParameter(const char* param) +{ + ICommandLine* cmdLine = CommandLine(); + if (!cmdLine) return false; + + CUtlStringToken token(param); + return cmdLine->HasParm(token); +} + +int Scripting_CommandLine_GetParameterCount() +{ + ICommandLine* cmdLine = CommandLine(); + if (!cmdLine) return 0; + + return cmdLine->ParmCount(); +} + +int Scripting_CommandLine_GetParameterValueString(char* out, const char* param, const char* defaultValue) +{ + ICommandLine* cmdLine = CommandLine(); + if (!cmdLine) return 1; + + CUtlStringToken token(param); + std::string s = cmdLine->ParmValue(token, defaultValue); + + if (out != nullptr) strcpy(out, s.c_str()); + + return s.size(); +} + +int Scripting_CommandLine_GetParameterValueInt(const char* param, int defaultValue) +{ + ICommandLine* cmdLine = CommandLine(); + if (!cmdLine) return defaultValue; + + CUtlStringToken token(param); + return cmdLine->ParmValue(token, defaultValue); +} + +float Scripting_CommandLine_GetParameterValueFloat(const char* param, float defaultValue) +{ + ICommandLine* cmdLine = CommandLine(); + if (!cmdLine) return defaultValue; + + CUtlStringToken token(param); + return cmdLine->ParmValue(token, defaultValue); +} + +int Scripting_CommandLine_GetCommandLine(char* out) +{ + ICommandLine* cmdLine = CommandLine(); + if (!cmdLine) return 0; + + std::string s = cmdLine->GetCmdLine(); + + if (out != nullptr) strcpy(out, s.c_str()); + + return s.size(); +} + +bool Scripting_CommandLine_HasParameters() +{ + ICommandLine* cmdLine = CommandLine(); + if (!cmdLine) return false; + + return cmdLine->HasParms(); +} + +DEFINE_NATIVE("CommandLine.HasParameter", Scripting_CommandLine_HasParameter); +DEFINE_NATIVE("CommandLine.GetParameterCount", Scripting_CommandLine_GetParameterCount); +DEFINE_NATIVE("CommandLine.GetParameterValueString", Scripting_CommandLine_GetParameterValueString); +DEFINE_NATIVE("CommandLine.GetParameterValueInt", Scripting_CommandLine_GetParameterValueInt); +DEFINE_NATIVE("CommandLine.GetParameterValueFloat", Scripting_CommandLine_GetParameterValueFloat); +DEFINE_NATIVE("CommandLine.GetCommandLine", Scripting_CommandLine_GetCommandLine); +DEFINE_NATIVE("CommandLine.HasParameters", Scripting_CommandLine_HasParameters); \ No newline at end of file From 399f251879747714a7bb8033e724c4726c1f9536 Mon Sep 17 00:00:00 2001 From: skuzzis Date: Fri, 24 Oct 2025 04:01:09 +0300 Subject: [PATCH 06/15] update(vendor): SDK --- managed/src/SwiftlyS2.Core/Modules/Plugins/SwiftlyCore.cs | 2 +- managed/src/SwiftlyS2.Shared/Misc/AcquireMethod.cs | 2 +- vendor/s2sdk | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/managed/src/SwiftlyS2.Core/Modules/Plugins/SwiftlyCore.cs b/managed/src/SwiftlyS2.Core/Modules/Plugins/SwiftlyCore.cs index 579b4afa..d8329b56 100644 --- a/managed/src/SwiftlyS2.Core/Modules/Plugins/SwiftlyCore.cs +++ b/managed/src/SwiftlyS2.Core/Modules/Plugins/SwiftlyCore.cs @@ -209,5 +209,5 @@ public void Dispose() IRegistratorService ISwiftlyCore.Registrator => RegistratorService; IMenuManager ISwiftlyCore.Menus => MenuManager; string ISwiftlyCore.PluginPath => ContextBasePath; - public ICommandLine CommandLine => CommandLineManager; + ICommandLine ISwiftlyCore.CommandLine => CommandLineManager; } \ No newline at end of file diff --git a/managed/src/SwiftlyS2.Shared/Misc/AcquireMethod.cs b/managed/src/SwiftlyS2.Shared/Misc/AcquireMethod.cs index cb1db7ee..57d1ddf2 100644 --- a/managed/src/SwiftlyS2.Shared/Misc/AcquireMethod.cs +++ b/managed/src/SwiftlyS2.Shared/Misc/AcquireMethod.cs @@ -4,5 +4,5 @@ public enum AcquireMethod : int { PickUp = 0, Buy, - + BuyWithCtrl } \ No newline at end of file diff --git a/vendor/s2sdk b/vendor/s2sdk index 26de1b68..81764250 160000 --- a/vendor/s2sdk +++ b/vendor/s2sdk @@ -1 +1 @@ -Subproject commit 26de1b682e0d25850516fca6876ff16d0932be5b +Subproject commit 817642500769a527abe45466d1d5ada4a70db94a From 283d1b8206028337bef814b98a9dda329662f1b2 Mon Sep 17 00:00:00 2001 From: skuzzis Date: Fri, 24 Oct 2025 04:20:14 +0300 Subject: [PATCH 07/15] feat(managed/engine): GlobalVars --- .../Modules/Engine/EngineService.cs | 12 +++-- .../Natives/EngineHelpers.cs | 45 +++--------------- .../Modules/Engine/IEngineService.cs | 11 +++++ .../Natives/Structs/CGlobalVars.cs | 43 +++++++++++++++++ natives/engine/helpers.native | 7 +-- src/scripting/engine/enginehelpers.cpp | 47 ------------------- 6 files changed, 71 insertions(+), 94 deletions(-) create mode 100644 managed/src/SwiftlyS2.Shared/Natives/Structs/CGlobalVars.cs diff --git a/managed/src/SwiftlyS2.Core/Modules/Engine/EngineService.cs b/managed/src/SwiftlyS2.Core/Modules/Engine/EngineService.cs index 97eaa387..8f452160 100644 --- a/managed/src/SwiftlyS2.Core/Modules/Engine/EngineService.cs +++ b/managed/src/SwiftlyS2.Core/Modules/Engine/EngineService.cs @@ -1,6 +1,8 @@ using SwiftlyS2.Shared; using SwiftlyS2.Core.Natives; using SwiftlyS2.Shared.Services; +using SwiftlyS2.Core.Extensions; +using SwiftlyS2.Shared.Natives; namespace SwiftlyS2.Core.Services; @@ -15,13 +17,15 @@ public EngineService(CommandTrackerManager commandTrackedManager) public string ServerIP => NativeEngineHelpers.GetServerIP(); - public string Map => NativeEngineHelpers.GetMap(); + public ref CGlobalVars GlobalVars => ref NativeEngineHelpers.GetGlobalVars().AsRef(); - public int MaxPlayers => NativeEngineHelpers.GetMaxPlayers(); + public string Map => GlobalVars.MapName.ToString() ?? string.Empty; - public float CurrentTime => NativeEngineHelpers.GetServerCurrentTime(); + public int MaxPlayers => GlobalVars.MaxClients; - public int TickCount => NativeEngineHelpers.GetServerTickCount(); + public float CurrentTime => GlobalVars.CurrentTime; + + public int TickCount => GlobalVars.TickCount; public void ExecuteCommand(string command) { diff --git a/managed/src/SwiftlyS2.Generated/Natives/EngineHelpers.cs b/managed/src/SwiftlyS2.Generated/Natives/EngineHelpers.cs index 32c7f525..0aaf7d49 100644 --- a/managed/src/SwiftlyS2.Generated/Natives/EngineHelpers.cs +++ b/managed/src/SwiftlyS2.Generated/Natives/EngineHelpers.cs @@ -25,20 +25,6 @@ public unsafe static string GetServerIP() { } } - private unsafe static delegate* unmanaged _GetMap; - - public unsafe static string GetMap() { - var ret = _GetMap(null); - var pool = ArrayPool.Shared; - var retBuffer = pool.Rent(ret + 1); - fixed (byte* retBufferPtr = retBuffer) { - ret = _GetMap(retBufferPtr); - var retString = Encoding.UTF8.GetString(retBufferPtr, ret); - pool.Return(retBuffer); - return retString; - } - } - private unsafe static delegate* unmanaged _IsMapValid; /// @@ -57,13 +43,6 @@ public unsafe static bool IsMapValid(string map_name) { } } - private unsafe static delegate* unmanaged _GetMaxPlayers; - - public unsafe static int GetMaxPlayers() { - var ret = _GetMaxPlayers(); - return ret; - } - private unsafe static delegate* unmanaged _ExecuteCommand; public unsafe static void ExecuteCommand(string command) { @@ -78,23 +57,6 @@ public unsafe static void ExecuteCommand(string command) { } } - private unsafe static delegate* unmanaged _GetServerCurrentTime; - - public unsafe static float GetServerCurrentTime() { - var ret = _GetServerCurrentTime(); - return ret; - } - - private unsafe static delegate* unmanaged _GetServerTickCount; - - /// - /// simulation tick - /// - public unsafe static int GetServerTickCount() { - var ret = _GetServerTickCount(); - return ret; - } - private unsafe static delegate* unmanaged _FindGameSystemByName; public unsafe static nint FindGameSystemByName(string name) { @@ -172,4 +134,11 @@ public unsafe static string GetMenuSettings() { return retString; } } + + private unsafe static delegate* unmanaged _GetGlobalVars; + + public unsafe static nint GetGlobalVars() { + var ret = _GetGlobalVars(); + return ret; + } } \ No newline at end of file diff --git a/managed/src/SwiftlyS2.Shared/Modules/Engine/IEngineService.cs b/managed/src/SwiftlyS2.Shared/Modules/Engine/IEngineService.cs index f9c296f2..e3b078a4 100644 --- a/managed/src/SwiftlyS2.Shared/Modules/Engine/IEngineService.cs +++ b/managed/src/SwiftlyS2.Shared/Modules/Engine/IEngineService.cs @@ -1,3 +1,5 @@ +using SwiftlyS2.Shared.Natives; + namespace SwiftlyS2.Shared.Services; public interface IEngineService @@ -10,8 +12,14 @@ public interface IEngineService /// /// Gets the map that the server is running /// + [Obsolete("Use GlobalVars.MapName instead.")] string Map { get; } + /// + /// Gets a reference to the global variables structure. + /// + ref CGlobalVars GlobalVars { get; } + /// /// Determines whether the specified map string represents a valid map in server files. /// @@ -22,6 +30,7 @@ public interface IEngineService /// /// Gets the maximum number of players allowed in the game. /// + [Obsolete("Use GlobalVars.MaxClients instead.")] int MaxPlayers { get; } /// @@ -40,11 +49,13 @@ public interface IEngineService /// /// The time since the server started. /// + [Obsolete("Use GlobalVars.CurrentTime instead.")] float CurrentTime { get; } /// /// The number of simulation ticks that have occurred since the server started. /// + [Obsolete("Use GlobalVars.TickCount instead.")] int TickCount { get; } /// diff --git a/managed/src/SwiftlyS2.Shared/Natives/Structs/CGlobalVars.cs b/managed/src/SwiftlyS2.Shared/Natives/Structs/CGlobalVars.cs new file mode 100644 index 00000000..c1ca6422 --- /dev/null +++ b/managed/src/SwiftlyS2.Shared/Natives/Structs/CGlobalVars.cs @@ -0,0 +1,43 @@ +using System.Runtime.InteropServices; + +namespace SwiftlyS2.Shared.Natives; + +public enum MapLoadType_t +{ + MapLoad_NewMap = 0, + MapLoad_LoadGame, + MapLoad_Transition, + MapLoad_Background, +} + +[StructLayout(LayoutKind.Sequential)] +public struct CGlobalVars +{ + public float RealTime; + public int FrameCount; + public float AbsoluteFrameTime; + public float AbsoluteFrameStartTimeStdDev; + public int MaxClients; + private int _unk01; + private int _unk02; + private int _unk03; + private int _unk04; + private int _unk05; + private nint _unk06; + public float CurrentTime; + public float FrameTime; + private float _unk07; + private float _unk08; + public bool InSimulation; + public bool EnableAssertions; + public int TickCount; + private int _unk09; + private int _unk10; + public float SubtickFraction; + public CString MapName; + public CString StartSpot; + public MapLoadType_t MapLoadType; + public bool TeamPlay; + public int MaxEntities; + public int ServerCount; +} \ No newline at end of file diff --git a/natives/engine/helpers.native b/natives/engine/helpers.native index af18e4bd..80f886fc 100644 --- a/natives/engine/helpers.native +++ b/natives/engine/helpers.native @@ -1,15 +1,12 @@ class EngineHelpers string GetServerIP = void -string GetMap = void bool IsMapValid = string map_name // it can be map name, or workshop id -int32 GetMaxPlayers = void void ExecuteCommand = string command -float GetServerCurrentTime = void -int32 GetServerTickCount = void // simulation tick ptr FindGameSystemByName = string name void SendMessageToConsole = string msg ptr GetTraceManager = void string GetCurrentGame = void string GetNativeVersion = void -string GetMenuSettings = void \ No newline at end of file +string GetMenuSettings = void +ptr GetGlobalVars = void \ No newline at end of file diff --git a/src/scripting/engine/enginehelpers.cpp b/src/scripting/engine/enginehelpers.cpp index aecdbabf..e26200cb 100644 --- a/src/scripting/engine/enginehelpers.cpp +++ b/src/scripting/engine/enginehelpers.cpp @@ -51,25 +51,6 @@ int Bridge_EngineHelpers_GetServerIP(char* out) return s.size(); } -int Bridge_EngineHelpers_GetMap(char* out) -{ - static std::string s; - auto engine = g_ifaceService.FetchInterface(INTERFACEVERSION_VENGINESERVER); - if (!engine) s = "unknown_map"; - else { - auto globals = engine->GetServerGlobals(); - if (!globals) { - s = "unknown_map"; - } - else { - s = globals->mapname.ToCStr(); - } - } - - if (out != nullptr) strcpy(out, s.c_str()); - return s.size(); -} - bool Bridge_EngineHelpers_IsMapValid(const char* map_name) { if (!map_name) return false; @@ -87,14 +68,6 @@ bool Bridge_EngineHelpers_IsMapValid(const char* map_name) ); } -int Bridge_EngineHelpers_GetMaxPlayers() -{ - auto engine = g_ifaceService.FetchInterface(INTERFACEVERSION_VENGINESERVER); - if (!engine) return 0; - - return engine->GetServerGlobals()->maxClients; -} - void Bridge_EngineHelpers_ExecuteCommand(const char* command) { if (!command) return; @@ -105,22 +78,6 @@ void Bridge_EngineHelpers_ExecuteCommand(const char* command) engine->ServerCommand(command); } -float Bridge_EngineHelpers_GetServerCurrentTime() -{ - auto engine = g_ifaceService.FetchInterface(INTERFACEVERSION_VENGINESERVER); - if (!engine) return 0.0f; - - return engine->GetServerGlobals()->curtime; -} - -int Bridge_EngineHelpers_GetServerTickCount() -{ - auto engine = g_ifaceService.FetchInterface(INTERFACEVERSION_VENGINESERVER); - if (!engine) return 0; - - return engine->GetServerGlobals()->tickcount; -} - void* Bridge_EngineHelpers_FindGameSystemByName(const char* name) { CBaseGameSystemFactory_t* pFactoryList = *reinterpret_cast(CBaseGameSystemFactory::sm_pFirst); @@ -201,12 +158,8 @@ int Bridge_EngineHelpers_GetMenuSettings(char* out) } DEFINE_NATIVE("EngineHelpers.GetServerIP", Bridge_EngineHelpers_GetServerIP); -DEFINE_NATIVE("EngineHelpers.GetMap", Bridge_EngineHelpers_GetMap); DEFINE_NATIVE("EngineHelpers.IsMapValid", Bridge_EngineHelpers_IsMapValid); -DEFINE_NATIVE("EngineHelpers.GetMaxPlayers", Bridge_EngineHelpers_GetMaxPlayers); DEFINE_NATIVE("EngineHelpers.ExecuteCommand", Bridge_EngineHelpers_ExecuteCommand); -DEFINE_NATIVE("EngineHelpers.GetServerCurrentTime", Bridge_EngineHelpers_GetServerCurrentTime); -DEFINE_NATIVE("EngineHelpers.GetServerTickCount", Bridge_EngineHelpers_GetServerTickCount); DEFINE_NATIVE("EngineHelpers.FindGameSystemByName", Bridge_EngineHelpers_FindGameSystemByName); DEFINE_NATIVE("EngineHelpers.SendMessageToConsole", Bridge_EngineHelpers_SendMessageToConsole); DEFINE_NATIVE("EngineHelpers.GetTraceManager", Bridge_EngineHelpers_GetTraceManager); From ae0fdc381d4498785012be51425cb1e4100bbd0b Mon Sep 17 00:00:00 2001 From: skuzzis Date: Fri, 24 Oct 2025 04:22:08 +0300 Subject: [PATCH 08/15] fix(native): GetGlobalVars --- src/scripting/engine/enginehelpers.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/scripting/engine/enginehelpers.cpp b/src/scripting/engine/enginehelpers.cpp index e26200cb..6722ea2a 100644 --- a/src/scripting/engine/enginehelpers.cpp +++ b/src/scripting/engine/enginehelpers.cpp @@ -157,6 +157,14 @@ int Bridge_EngineHelpers_GetMenuSettings(char* out) return s.size(); } +void* Bridge_EngineHelpers_GetGlobalVars() +{ + auto engine = g_ifaceService.FetchInterface(INTERFACEVERSION_VENGINESERVER); + if (!engine) return nullptr; + + return engine->GetServerGlobals(); +} + DEFINE_NATIVE("EngineHelpers.GetServerIP", Bridge_EngineHelpers_GetServerIP); DEFINE_NATIVE("EngineHelpers.IsMapValid", Bridge_EngineHelpers_IsMapValid); DEFINE_NATIVE("EngineHelpers.ExecuteCommand", Bridge_EngineHelpers_ExecuteCommand); @@ -165,4 +173,5 @@ DEFINE_NATIVE("EngineHelpers.SendMessageToConsole", Bridge_EngineHelpers_SendMes DEFINE_NATIVE("EngineHelpers.GetTraceManager", Bridge_EngineHelpers_GetTraceManager); DEFINE_NATIVE("EngineHelpers.GetCurrentGame", Bridge_EngineHelpers_GetCurrentGame); DEFINE_NATIVE("EngineHelpers.GetNativeVersion", Bridge_EngineHelpers_GetNativeVersion); -DEFINE_NATIVE("EngineHelpers.GetMenuSettings", Bridge_EngineHelpers_GetMenuSettings); \ No newline at end of file +DEFINE_NATIVE("EngineHelpers.GetMenuSettings", Bridge_EngineHelpers_GetMenuSettings); +DEFINE_NATIVE("EngineHelpers.GetGlobalVars", Bridge_EngineHelpers_GetGlobalVars); \ No newline at end of file From cc4069e9351b6020fb3eda882b7f41be8d6590b3 Mon Sep 17 00:00:00 2001 From: samyyc Date: Fri, 24 Oct 2025 20:55:29 +0800 Subject: [PATCH 09/15] fix(managed): Fix startup error --- .../Modules/Plugins/SwiftlyCore.cs | 7 +- managed/src/TestPlugin/BenchContext.cs | 7 + managed/src/TestPlugin/PlayerBenchmarks.cs | 29 ++ managed/src/TestPlugin/TestPlugin.cs | 386 +----------------- managed/src/TestPlugin/TestPlugin.csproj | 1 + 5 files changed, 60 insertions(+), 370 deletions(-) create mode 100644 managed/src/TestPlugin/BenchContext.cs create mode 100644 managed/src/TestPlugin/PlayerBenchmarks.cs diff --git a/managed/src/SwiftlyS2.Core/Modules/Plugins/SwiftlyCore.cs b/managed/src/SwiftlyS2.Core/Modules/Plugins/SwiftlyCore.cs index d8329b56..fdb64e4a 100644 --- a/managed/src/SwiftlyS2.Core/Modules/Plugins/SwiftlyCore.cs +++ b/managed/src/SwiftlyS2.Core/Modules/Plugins/SwiftlyCore.cs @@ -69,7 +69,7 @@ internal class SwiftlyCore : ISwiftlyCore, IDisposable public PermissionManager PermissionManager { get; init; } public RegistratorService RegistratorService { get; init; } public MenuManager MenuManager { get; init; } - public CommandLineService CommandLineManager { get; init; } + public CommandLineService CommandLineService { get; init; } public string ContextBasePath { get; init; } public SwiftlyCore(string contextId, string contextBaseDirectory, PluginMetadata? pluginManifest, Type contextType, IServiceProvider coreProvider) { @@ -110,6 +110,7 @@ public SwiftlyCore(string contextId, string contextBaseDirectory, PluginMetadata .AddSingleton(provider => provider.GetRequiredService().GetLocalizer()) .AddSingleton() .AddSingleton() + .AddSingleton() .AddSingleton(provider => provider.GetRequiredService()) .AddSingleton(provider => provider.GetRequiredService()) @@ -166,7 +167,7 @@ public SwiftlyCore(string contextId, string contextBaseDirectory, PluginMetadata PermissionManager = _ServiceProvider.GetRequiredService(); RegistratorService = _ServiceProvider.GetRequiredService(); MenuManager = _ServiceProvider.GetRequiredService(); - CommandLineManager = _ServiceProvider.GetRequiredService(); + CommandLineService = _ServiceProvider.GetRequiredService(); Logger = LoggerFactory.CreateLogger(contextType); } @@ -209,5 +210,5 @@ public void Dispose() IRegistratorService ISwiftlyCore.Registrator => RegistratorService; IMenuManager ISwiftlyCore.Menus => MenuManager; string ISwiftlyCore.PluginPath => ContextBasePath; - ICommandLine ISwiftlyCore.CommandLine => CommandLineManager; + ICommandLine ISwiftlyCore.CommandLine => CommandLineService; } \ No newline at end of file diff --git a/managed/src/TestPlugin/BenchContext.cs b/managed/src/TestPlugin/BenchContext.cs new file mode 100644 index 00000000..e019e4aa --- /dev/null +++ b/managed/src/TestPlugin/BenchContext.cs @@ -0,0 +1,7 @@ +using SwiftlyS2.Shared.SchemaDefinitions; + +namespace TestPlugin; + +public static class BenchContext { + public static CCSPlayerController? Controller { get; set; } +} \ No newline at end of file diff --git a/managed/src/TestPlugin/PlayerBenchmarks.cs b/managed/src/TestPlugin/PlayerBenchmarks.cs new file mode 100644 index 00000000..005e5ee7 --- /dev/null +++ b/managed/src/TestPlugin/PlayerBenchmarks.cs @@ -0,0 +1,29 @@ +using BenchmarkDotNet.Attributes; +using SwiftlyS2.Shared.SchemaDefinitions; + +namespace TestPlugin; + +public class PlayerBenchmarks { + + private CCSPlayerController _controller; + + [GlobalSetup] + public void Setup() + { + _controller = BenchContext.Controller; + + if (_controller is null) + { + throw new InvalidOperationException("Controller is not set"); + } + } + + [Benchmark] + public void Test() + { + for (int i = 0; i < 10000; i++) + { + var a = _controller.Pawn.Value.WeaponServices.ActiveWeapon; + } + } +} \ No newline at end of file diff --git a/managed/src/TestPlugin/TestPlugin.cs b/managed/src/TestPlugin/TestPlugin.cs index c9ff4404..e00ca3f8 100644 --- a/managed/src/TestPlugin/TestPlugin.cs +++ b/managed/src/TestPlugin/TestPlugin.cs @@ -22,16 +22,27 @@ using Microsoft.Extensions.Options; using Microsoft.Extensions.Hosting; using SwiftlyS2.Shared.Players; +using BenchmarkDotNet.Running; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Toolchains.InProcess.NoEmit; +using BenchmarkDotNet.Toolchains.InProcess.Emit; +using BenchmarkDotNet.Jobs; +using BenchmarkDotNet.Loggers; namespace TestPlugin; - -public class TestConfig +public class InProcessConfig : ManualConfig { - public string Name { get; set; } - public int Age { get; set; } + public InProcessConfig() + { + AddLogger(ConsoleLogger.Default); + AddJob(Job.Default + .WithToolchain(new InProcessNoEmitToolchain(true)) + .WithId("InProcess")); + } } + [PluginMetadata(Id = "testplugin", Version = "1.0.0")] public class TestPlugin : BasePlugin { @@ -41,31 +52,13 @@ public TestPlugin(ISwiftlyCore core) : base(core) Console.WriteLine("[TestPlugin] TestPlugin constructed successfully!"); } - public override void ConfigureSharedInterface(IInterfaceManager interfaceManager) - { - // Register plugin-specific services here if needed - } - - public override void UseSharedInterface(IInterfaceManager interfaceManager) - { - // Use plugin-specific services here if needed - } - - CancellationTokenSource? token2 = null; - delegate void Test(int a, int b); - IOptionsMonitor _config; - - [Command("sound")] - public void SoundCommand(ICommandContext context) + [Command("be")] + public void Test2Command(ICommandContext context) { - using var se = new SoundEvent(); - se.Name = "MVP_ProtectionCharm"; - se.Volume = 0.6f; - se.SourceEntityIndex = (int)context.Sender!.Pawn!.Index; - se.Recipients.AddAllPlayers(); - se.Emit(); + BenchContext.Controller = context.Sender!.RequiredController; + BenchmarkRunner.Run(new InProcessConfig()); } public override void Load(bool hotReload) @@ -113,346 +106,5 @@ public override void Load(bool hotReload) { Console.WriteLine($"ConVar {@event.ConVarName} changed from {@event.OldValue} to {@event.NewValue} by player {@event.PlayerId}"); }; - - - // var provider = services.BuildServiceProvider(); - - // provider.GetRequiredService(); - - - // Host.CreateDefaultBuilder() - // .ConfigureLogging((context, logging) => { - // logging.AddConsole(); - // }) - // .ConfigureAppConfiguration((context, config) => { - // config.SetBasePath(Core.Configuration.GetBasePath()); - // config.AddJsonFile("test.jsonc", optional: false, reloadOnChange: true); - // }) - // .ConfigureServices((context, services) => { - // services.AddOptionsWithValidateOnStart>() - // .Bind(context.Configuration.GetSection("Main")); - // }) - // .Build(); - - // This can be used everywhere and the value will be updated when the config is changed - // Console.WriteLine(config.CurrentValue.Age); - - - // var config = new TestConfig(); - - // throw new Exception("TestPlugin loaded"); - - // Core. - - int i = 0; - - // var token2 = Core.Scheduler.Repeat(10, () => { - // Console.WriteLine(Core.Engine.TickCount); - // Console.WriteLine("TestPlugin Timer"); - // }); - Core.Logger.LogInformation("TestPlugin loaded"); - - using var se = new SoundEvent(); - - // var func = Core.Memory.GetUnmanagedFunctionByAddress(Core.Memory.GetAddressBySignature(Library.Server, "AAAAA")!.Value); - - // func.CallOriginal(1, 2); - - // func.Call(1, 2); - - // func.AddHook((next) => { - // return (a, b) => { - // Console.WriteLine("TestPlugin Hook " + a + " " + b); - // next()(a, b); - // }; - // }); - - - // Entrypoint - - // Core.Event.OnTick += () => { - // Console.WriteLine("TestPlugin OnTick "); - // }; - - // Core.Event.OnClientConnected += (@event) => { - // Console.WriteLine("TestPlugin OnClientConnected " + @event.PlayerId); - // }; - - // Core.Event.OnClientPutInServer += (@event) => { - // Console.WriteLine("TestPlugin OnClientPutInServer " + @event.PlayerId); - // }; - - Core.Event.OnClientDisconnected += (@event) => - { - Console.WriteLine("TestPlugin OnClientDisconnected " + @event.PlayerId); - }; - Core.Event.OnTick += () => - { - int i = 0; - }; - - - // Core.Event.OnClientProcessUsercmds += (@event) => { - // foreach(var usercmd in @event.Usercmds) { - // usercmd.Base.ButtonsPb.Buttonstate1 &= 1UL << (int)GameButtons.Ctrl; - // usercmd.Base.ButtonsPb.Buttonstate2 &= 1UL << (int)GameButtons.Ctrl; - // usercmd.Base.ButtonsPb.Buttonstate3 &= 1UL << (int)GameButtons.Ctrl; - // } - // }; - - // Core.NetMessage.HookClientMessage((msg, id) => { - // Console.WriteLine("TestPlugin OnClientMove "); - // Console.WriteLine(BitConverter.ToString(msg.Data)); - // return HookResult.Continue; - // }); - - // Core.Event.OnEntityTakeDamage += (@event) => { - // Console.WriteLine("TestPlugin OnEntityTakeDamage " + @event.Entity.Entity?.DesignerName + " " + @event.Info.HitGroupId); - // }; - - // Core.Event.OnTick += () => { - - // Console.WriteLine("TestPlugin OnTick"); - // }; - - // Core.Event.OnEntityCreated += (ev) => { - // var entity = ev.Entity; - // entity.Entity.DesignerName = "a"; - // Console.WriteLine("TestPlugin OnEntityCreated " + ev.Entity.Entity?.DesignerName); - // }; - - - using CEntityKeyValues kv = new(); - - kv.SetBool("test", true); - - Console.WriteLine(kv.Get("test2")); - - - CUtlStringToken token = new("hello"); - Console.WriteLine($"2"); - } - - CEntityKeyValues kv { get; set; } - CEntityInstance entity { get; set; } - - - [Command("tt")] - public void TestCommand(ICommandContext context) - { - token2?.Cancel(); - // kv = new(); - // kv.SetString("test", "SAFE"); - - - - // _Core.Logger.LogInformation("!@#"); - - // _Core.Logger.LogInformation(_Core.GameData.GetSignature("CEntityInstance::AcceptInput").ToString()); - - // entity = _Core.EntitySystem.CreateEntityByDesignerName("point_worldtext"); - // entity.DispatchSpawn(kv); - // Console.WriteLine("Spawned entity with keyvalues"); - - int j = 0; - - var cvar = Core.ConVar.Find("sv_cheats")!; - Console.WriteLine(cvar); - Console.WriteLine(cvar.Value); - var cvar2 = Core.ConVar.Find("sv_autobunnyhopping")!; - Console.WriteLine(cvar2); - Console.WriteLine(cvar2.Value); - - var cvar3 = Core.ConVar.Create("sw_test_cvar", "Test cvar", "ABCDEFG"); - Console.WriteLine(cvar3); - Console.WriteLine(cvar3.Value); - - var cvar4 = Core.ConVar.Find("r_drawworld")!; - - cvar2.ReplicateToClient(0, true); - - cvar4.QueryClient(0, (value) => - { - Console.WriteLine("QueryCallback " + value); - }); - } - - [Command("w")] - public void TestCommand1(ICommandContext context) - { - var attacker = context.Sender!; - var weapons = attacker.Pawn!.WeaponServices!.MyWeapons; - foreach (var weaponHandle in weapons) - { - var weapon = weaponHandle.Value?.As(); - if (weapon == null) - return; - - Console.WriteLine($"Weapon: {weapon.DesignerName}"); - } - - } - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - delegate nint DispatchSpawnDelegate(nint pEntity, nint pKV); - int order = 0; - - IUnmanagedFunction? _dispatchspawn; - - [Command("h1")] - public void TestCommand2(ICommandContext context) - { - var token = Core.Scheduler.DelayAndRepeat(500, 1000, () => - { - - }); - - var addres = Core.GameData.GetSignature("CBaseEntity::DispatchSpawn"); - var func = Core.Memory.GetUnmanagedFunctionByAddress(addres); - - var guid = func.AddHook((next) => - { - return (pEntity, pKV) => - { - Console.WriteLine("TestPlugin DispatchSpawn " + order++); - return next()(pEntity, pKV); - }; - }); - - _dispatchspawn.AddHook((next) => - { - return (pEntity, pKV) => - { - Console.WriteLine("TestPlugin DispatchSpawn2 " + order++); - return next()(pEntity, pKV); - }; - }); - - } - - [EventListener] - public void OnEntityCreated(IOnEntityCreatedEvent @event) - { - // @event.Entity.Entity.DesignerName = "abc"; - Console.WriteLine("TestPlugin OnEntityCreated222 " + @event.Entity.Entity?.DesignerName); - } - - Guid _hookId = Guid.Empty; - - [Command("h2")] - public void TestCommand3(ICommandContext context) - { - Core.Command.HookClientCommand((playerId, commandLine) => - { - Console.WriteLine("TestPlugin HookClientCommand " + playerId + " " + commandLine); - return HookResult.Continue; - }); - Console.WriteLine(Core.GameData.GetSignature("CBaseEntity::DispatchSpawn")); - var ent = Core.EntitySystem.CreateEntity(); - ent.DispatchSpawn(); - } - - [Command("tt3")] - public void TestCommand33(ICommandContext context) - { - } - - [Command("tt4")] - public void TestCommand4(ICommandContext context) - { - Console.WriteLine(Core.Permission.PlayerHasPermission(7656, context.Args[0])); - } - - [Command("tt5")] - public void TestCommand5(ICommandContext context) - { - Console.WriteLine("TestPlugin TestCommand5"); - } - - [Command("tt6", permission: "tt6")] - public void TestCommand6(ICommandContext context) - { - Console.WriteLine("TestPlugin TestCommand6"); - } - - [Command("tt7")] - public void TestCommand7(ICommandContext context) - { - Core.Engine.ExecuteCommandWithBuffer("@ping", (buffer) => - { - Console.WriteLine($"pong: {buffer}"); - }); - } - - [GameEventHandler(HookMode.Pre)] - public HookResult TestGameEventHandler(EventPlayerJump @e) - { - Console.WriteLine(@e.UserIdController.PlayerName); - return HookResult.Continue; - } - - [ServerNetMessageHandler] - public HookResult TestServerNetMessageHandler(CCSUsrMsg_SendPlayerItemDrops msg) - { - - Console.WriteLine("FIRED"); - // foreach(var item in msg.Accessor) { - // Console.WriteLine($"TestPlugin ServerNetMessageHandler: {item.EconItem.Defindex}"); - // } - return HookResult.Continue; - } - - [Command("menu")] - public void MenuCommand(ICommandContext context) - { - var player = context.Sender!; - var menu = Core.Menus.CreateMenu("Test Menu"); - - menu.Builder - .AddButton("Button 1", (ctx) => - { - player.SendMessage(MessageType.Chat, "You clicked Button 1"); - }) - .AddButton("Button 2", (ctx) => - { - player.SendMessage(MessageType.Chat, "You clicked Button 2"); - }) - .AddButton("Button 3", (ctx) => - { - player.SendMessage(MessageType.Chat, "You clicked Button 3"); - }) - .AddButton("Button 4", (ctx) => - { - player.SendMessage(MessageType.Chat, "You clicked Button 4"); - }) - .AddButton("Button 5", (ctx) => - { - player.SendMessage(MessageType.Chat, "You clicked Button 5"); - }) - .AddButton("Button 6", (ctx) => - { - player.SendMessage(MessageType.Chat, "You clicked Button 6"); - }) - .AddButton("Button 7", (ctx) => - { - player.SendMessage(MessageType.Chat, "You clicked Button 7"); - }) - .AddButton("Button 8", (ctx) => - { - player.SendMessage(MessageType.Chat, "You clicked Button 8"); - }) - .AddSeparator() - .AddText("hello!", size: SwiftlyS2.Shared.Menus.IMenuTextSize.ExtraLarge) - .SetColor(new(0, 186, 105, 255)) - .AutoClose(15f) - .HasSound(true) - .ForceFreeze(); - - Core.Menus.OpenMenu(player, menu); - } - - public override void Unload() - { - Console.WriteLine("TestPlugin unloaded"); } } \ No newline at end of file diff --git a/managed/src/TestPlugin/TestPlugin.csproj b/managed/src/TestPlugin/TestPlugin.csproj index ecc363b0..1aceea1e 100644 --- a/managed/src/TestPlugin/TestPlugin.csproj +++ b/managed/src/TestPlugin/TestPlugin.csproj @@ -23,6 +23,7 @@ + From 9fbb5348c45a927518bf1aeaa88f16cdf0c57dae Mon Sep 17 00:00:00 2001 From: Ambr0se Date: Fri, 24 Oct 2025 21:58:36 +0800 Subject: [PATCH 10/15] feat: Optimal performance --- generator/schema_generator/generator.py | 52 ++- .../class_fixed_array_field_template.cs | 2 +- .../class_fixed_string_field_template.cs | 2 +- .../SwiftlyS2.Core/Modules/Schemas/Schema.cs | 50 +++ .../Schemas/Classes/CAnimAttachmentImpl.cs | 8 +- .../Schemas/Classes/CAttachmentImpl.cs | 8 +- .../Schemas/Classes/CBaseIssueImpl.cs | 4 +- .../Schemas/Classes/CBaseModelEntityImpl.cs | 2 +- .../Classes/CBasePlayerControllerImpl.cs | 2 +- .../Schemas/Classes/CBasePlayerWeaponImpl.cs | 2 +- .../Classes/CBaseRendererSource2Impl.cs | 4 +- .../Schemas/Classes/CBeamImpl.cs | 2 +- .../Classes/CBoneConstraintDotToMorphImpl.cs | 2 +- .../Schemas/Classes/CC4Impl.cs | 2 +- .../Schemas/Classes/CCSBotImpl.cs | 6 +- .../Schemas/Classes/CCSGameRulesImpl.cs | 30 +- .../Classes/CCSPlayerControllerImpl.cs | 2 +- ...SPlayerController_InventoryServicesImpl.cs | 4 +- .../Schemas/Classes/CCSPlayerPawnImpl.cs | 12 +- .../Schemas/Classes/CCSPlayerResourceImpl.cs | 12 +- .../Schemas/Classes/CCSTeamImpl.cs | 8 +- .../Schemas/Classes/CColorCorrectionImpl.cs | 2 +- .../Classes/CColorCorrectionVolumeImpl.cs | 2 +- .../Schemas/Classes/CDrawCullingDataImpl.cs | 2 +- .../Schemas/Classes/CEconItemViewImpl.cs | 4 +- .../Schemas/Classes/CFilterMultipleImpl.cs | 2 +- .../Schemas/Classes/CFiringModeFloatImpl.cs | 2 +- .../Schemas/Classes/CFiringModeIntImpl.cs | 2 +- .../Schemas/Classes/CGameRulesImpl.cs | 2 +- .../Schemas/Classes/CInButtonStateImpl.cs | 2 +- .../Schemas/Classes/CInfernoImpl.cs | 8 +- .../Classes/CJumpHelperUpdateNodeImpl.cs | 2 +- .../Schemas/Classes/CLogicCaseImpl.cs | 2 +- .../Classes/CMapVetoPickControllerImpl.cs | 20 +- .../Schemas/Classes/CMotionGraphConfigImpl.cs | 2 +- .../Schemas/Classes/CMultiSourceImpl.cs | 4 +- .../Schemas/Classes/CParticleSystemImpl.cs | 8 +- .../Schemas/Classes/CPhysLengthImpl.cs | 2 +- .../Schemas/Classes/CPhysPulleyImpl.cs | 2 +- .../Schemas/Classes/CPhysicsPropImpl.cs | 2 +- .../Schemas/Classes/CPlantedC4Impl.cs | 2 +- .../Schemas/Classes/CPlayerPingImpl.cs | 2 +- .../Schemas/Classes/CPlayerSprayDecalImpl.cs | 2 +- .../Classes/CPlayer_MovementServicesImpl.cs | 4 +- .../Classes/CPlayer_WeaponServicesImpl.cs | 2 +- .../CPointClientUIWorldTextPanelImpl.cs | 2 +- .../Schemas/Classes/CPointWorldTextImpl.cs | 6 +- .../Schemas/Classes/CRR_ResponseImpl.cs | 4 +- .../Schemas/Classes/CRangeFloatImpl.cs | 2 +- .../Schemas/Classes/CRangeIntImpl.cs | 2 +- .../Schemas/Classes/CRemapFloatImpl.cs | 2 +- .../Schemas/Classes/CSceneListManagerImpl.cs | 2 +- .../Schemas/Classes/CSeqMultiFetchImpl.cs | 6 +- .../Schemas/Classes/CSkillFloatImpl.cs | 2 +- .../Schemas/Classes/CSkillIntImpl.cs | 2 +- .../Schemas/Classes/CTeamImpl.cs | 2 +- .../Schemas/Classes/CTimelineImpl.cs | 4 +- .../Classes/CTriggerSndSosOpvarImpl.cs | 6 +- .../Schemas/Classes/CVoteControllerImpl.cs | 4 +- .../C_INIT_CreateOnModelAtHeightImpl.cs | 2 +- .../Classes/C_INIT_CreateOnModelImpl.cs | 2 +- .../Classes/C_INIT_DistanceToCPInitImpl.cs | 2 +- .../C_INIT_InitialRepulsionVelocityImpl.cs | 2 +- .../C_INIT_InitialVelocityFromHitboxImpl.cs | 2 +- .../C_INIT_LifespanFromVelocityImpl.cs | 2 +- .../Schemas/Classes/C_INIT_ModelCullImpl.cs | 2 +- .../C_INIT_PositionPlaceOnGroundImpl.cs | 2 +- .../Classes/C_INIT_RandomModelSequenceImpl.cs | 4 +- .../Schemas/Classes/C_INIT_RtEnvCullImpl.cs | 2 +- .../Classes/C_INIT_SetHitboxToClosestImpl.cs | 2 +- .../Classes/C_INIT_SetHitboxToModelImpl.cs | 2 +- .../C_OP_DistanceBetweenCPsToCPImpl.cs | 2 +- .../C_OP_DistanceBetweenTransformsImpl.cs | 2 +- .../Classes/C_OP_DistanceToTransformImpl.cs | 2 +- .../Schemas/Classes/C_OP_LockToBoneImpl.cs | 2 +- .../Schemas/Classes/C_OP_ModelCullImpl.cs | 2 +- .../Classes/C_OP_ModelDampenMovementImpl.cs | 2 +- .../Schemas/Classes/C_OP_MoveToHitboxImpl.cs | 2 +- .../Classes/C_OP_MovementPlaceOnGroundImpl.cs | 2 +- .../C_OP_RemapAverageHitboxSpeedtoCPImpl.cs | 2 +- .../Schemas/Classes/C_OP_RenderModelsImpl.cs | 10 +- .../Schemas/Classes/C_OP_RenderSoundImpl.cs | 2 +- .../Schemas/Classes/C_OP_RtEnvCullImpl.cs | 2 +- ...C_OP_SetCPOrientationToGroundNormalImpl.cs | 2 +- ...ontrolPointPositionToTimeOfDayValueImpl.cs | 2 +- .../C_OP_SetControlPointToImpactPointImpl.cs | 2 +- ...OP_SetControlPointsToModelParticlesImpl.cs | 4 +- .../Classes/C_OP_WorldTraceConstraintImpl.cs | 2 +- .../Schemas/Classes/Dop26_tImpl.cs | 2 +- .../Classes/EntitySpottedState_tImpl.cs | 2 +- .../Classes/FeAnimStrayRadius_tImpl.cs | 2 +- .../Schemas/Classes/FeAxialEdgeBend_tImpl.cs | 4 +- .../Schemas/Classes/FeBandBendLimit_tImpl.cs | 2 +- .../Schemas/Classes/FeEdgeDesc_tImpl.cs | 4 +- .../Classes/FeHingeLimitBuild_tImpl.cs | 2 +- .../Schemas/Classes/FeHingeLimit_tImpl.cs | 2 +- .../Schemas/Classes/FeKelagerBend2_tImpl.cs | 4 +- .../Schemas/Classes/FeNodeBase_tImpl.cs | 2 +- .../Schemas/Classes/FeQuad_tImpl.cs | 4 +- .../Schemas/Classes/FeRodConstraint_tImpl.cs | 2 +- .../Schemas/Classes/FeSimdNodeBase_tImpl.cs | 12 +- .../Schemas/Classes/FeSimdQuad_tImpl.cs | 4 +- .../Schemas/Classes/FeSourceEdge_tImpl.cs | 2 +- .../Classes/FeSpringIntegrator_tImpl.cs | 2 +- .../Classes/FeStiffHingeBuild_tImpl.cs | 4 +- .../Classes/FeTaperedCapsuleRigid_tImpl.cs | 2 +- .../Classes/FeTaperedCapsuleStretch_tImpl.cs | 4 +- .../Schemas/Classes/FeTreeChildren_tImpl.cs | 2 +- .../Schemas/Classes/FeTri_tImpl.cs | 2 +- .../Schemas/Classes/OldFeEdge_tImpl.cs | 6 +- .../PostProcessingBloomParameters_tImpl.cs | 4 +- .../Classes/RenderHairStrandInfo_tImpl.cs | 8 +- .../Classes/RenderInputLayoutField_tImpl.cs | 4 +- .../Schemas/Classes/RnBodyDesc_tImpl.cs | 2 +- .../Schemas/Classes/RnCapsule_tImpl.cs | 2 +- .../Classes/RnSoftbodyCapsule_tImpl.cs | 4 +- .../Schemas/Classes/RnSoftbodySpring_tImpl.cs | 2 +- .../Schemas/Classes/RnTriangle_tImpl.cs | 2 +- .../Schemas/Classes/RnWing_tImpl.cs | 2 +- .../Schemas/Classes/SampleCodeImpl.cs | 2 +- .../Schemas/Classes/SceneObject_tImpl.cs | 2 +- .../SimpleConstraintSoundProfileImpl.cs | 4 +- .../Classes/VPhysXConstraintParams_tImpl.cs | 2 +- .../Classes/VsInputSignatureElement_tImpl.cs | 6 +- .../Schemas/Classes/audioparams_tImpl.cs | 2 +- .../constraint_breakableparams_tImpl.cs | 2 +- managed/src/TestPlugin/TestPlugin.cs | 379 ++++++++++++++++++ 127 files changed, 697 insertions(+), 220 deletions(-) diff --git a/generator/schema_generator/generator.py b/generator/schema_generator/generator.py index 37da00ab..e34fb2cb 100644 --- a/generator/schema_generator/generator.py +++ b/generator/schema_generator/generator.py @@ -31,6 +31,41 @@ "SchemaFixedString" ] +dangerous_fields = [ + "m_bIsValveDS", + "m_bIsQuestEligible", + "m_iEntityLevel", + "m_iItemIDHigh", + "m_iItemIDLow", + "m_iAccountID", + "m_iEntityQuality", + "m_bInitialized", + "m_szCustomName", + "m_iAttributeDefinitionIndex", + "m_iRawValue32", + "m_iRawInitialValue32", + "m_flValue", + "m_flInitialValue", + "m_bSetBonus", + "m_nRefundableCurrency", + "m_OriginalOwnerXuidLow", + "m_OriginalOwnerXuidHigh", + "m_nFallbackPaintKit", + "m_nFallbackSeed", + "m_flFallbackWear", + "m_nFallbackStatTrak", + "m_iCompetitiveWins", + "m_iCompetitiveRanking", + "m_iCompetitiveRankType", + "m_iCompetitiveRankingPredicted_Win", + "m_iCompetitiveRankingPredicted_Loss", + "m_iCompetitiveRankingPredicted_Tie", + "m_nActiveCoinRank", + "m_nMusicID" +] + +found_dangerous_fields = [] + def render_template(template, params): for param, value in params.items(): template = template.replace(f"${param}$", str(value)) @@ -89,6 +124,12 @@ def write_class(self): names.append(field_info["NAME"]) field_info["REF_METHOD"] = "Deref" if field_info["KIND"] == "ptr" else "AsRef" + if field["name"] in dangerous_fields: + found_dangerous_fields.append({ + "class": self.class_name, + "field": field["name"], + "hash": field_info["HASH"] + }) if field_info["IS_NETWORKED"] == "true": updators.append(render_template(self.class_updator_template, field_info)) @@ -199,7 +240,7 @@ def write_enum(self): for field in self.class_def["fields"]: value = field["value"] if field["value"] != -1 else f"{type}.MaxValue" value = value if value != -2 else f"{type}.MaxValue - 1" - fields.append(f" {field["name"]} = {value},") + fields.append(f" {field['name']} = {value},") params = { "ENUM_NAME": self.class_name, @@ -229,4 +270,11 @@ def write_enum(self): continue writer = Writer(enum_def, all_class_names, all_enum_names) - writer.write_enum() \ No newline at end of file + writer.write_enum() + + if found_dangerous_fields: + print("\n") + print(" private static readonly HashSet dangerousFields = new() {") + for item in found_dangerous_fields: + print(f" {item['hash']}, // {item['class']}.{item['field']}") + print(" };") \ No newline at end of file diff --git a/generator/schema_generator/templates/class_fixed_array_field_template.cs b/generator/schema_generator/templates/class_fixed_array_field_template.cs index c49158d0..e22784ae 100644 --- a/generator/schema_generator/templates/class_fixed_array_field_template.cs +++ b/generator/schema_generator/templates/class_fixed_array_field_template.cs @@ -1,3 +1,3 @@ -public $INTERFACE_TYPE$ $NAME$ { + public $INTERFACE_TYPE$ $NAME$ { get => new $IMPL_TYPE$(_Handle, $HASH$, $ELEMENT_COUNT$, $ELEMENT_SIZE$, $ELEMENT_ALIGNMENT$); } \ No newline at end of file diff --git a/generator/schema_generator/templates/class_fixed_string_field_template.cs b/generator/schema_generator/templates/class_fixed_string_field_template.cs index 80f3ccee..4c33ab2b 100644 --- a/generator/schema_generator/templates/class_fixed_string_field_template.cs +++ b/generator/schema_generator/templates/class_fixed_string_field_template.cs @@ -1,4 +1,4 @@ -public string $NAME$ { + public string $NAME$ { get { var ptr = _Handle + Schema.GetOffset($HASH$); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Core/Modules/Schemas/Schema.cs b/managed/src/SwiftlyS2.Core/Modules/Schemas/Schema.cs index b0ab71c5..b689cf23 100644 --- a/managed/src/SwiftlyS2.Core/Modules/Schemas/Schema.cs +++ b/managed/src/SwiftlyS2.Core/Modules/Schemas/Schema.cs @@ -8,24 +8,74 @@ namespace SwiftlyS2.Core.Schemas; internal static class Schema { + private static readonly HashSet dangerousFields = new() { + 0x509D90A88DFCB984, // CMaterialAttributeAnimTag.m_flValue + 0xCB1D2D708DFCB984, // CNmConstFloatNode__CDefinition.m_flValue + 0xB6A452E28DFCB984, // MaterialParamFloat_t.m_flValue + 0x37D4D7108DFCB984, // CAudioEmphasisSample.m_flValue + 0xF12966B68DFCB984, // NmPercent_t.m_flValue + 0x5EC3BE448DFCB984, // CSeqPoseSetting.m_flValue + 0xF4BEF78E8DFCB984, // ConstantInfo_t.m_flValue + 0x6295CF65B14BF634, // CCSGameRules.m_bIsValveDS + 0x6295CF65814483B8, // CCSGameRules.m_bIsQuestEligible + 0xBB0F80FC8DAFCD73, // CEconItemAttribute.m_iAttributeDefinitionIndex + 0xBB0F80FC8DFCB984, // CEconItemAttribute.m_flValue + 0xBB0F80FCE2DBFFF2, // CEconItemAttribute.m_flInitialValue + 0xBB0F80FC1021E694, // CEconItemAttribute.m_nRefundableCurrency + 0xBB0F80FCA5E9EA96, // CEconItemAttribute.m_bSetBonus + 0x28ECD7A1D82CC087, // CCSPlayerController.m_iCompetitiveRanking + 0x28ECD7A192776C10, // CCSPlayerController.m_iCompetitiveWins + 0x28ECD7A15803DF71, // CCSPlayerController.m_iCompetitiveRankType + 0x28ECD7A1C32AD2BC, // CCSPlayerController.m_iCompetitiveRankingPredicted_Win + 0x28ECD7A1BDCCE5ED, // CCSPlayerController.m_iCompetitiveRankingPredicted_Loss + 0x28ECD7A138CA4C74, // CCSPlayerController.m_iCompetitiveRankingPredicted_Tie + 0xE1A93F256A67D4C4, // CEconItemView.m_iEntityQuality + 0xE1A93F2555EF3B5F, // CEconItemView.m_iEntityLevel + 0xE1A93F25373EE446, // CEconItemView.m_iItemIDHigh + 0xE1A93F250DF29C2C, // CEconItemView.m_iItemIDLow + 0xE1A93F25C65DE986, // CEconItemView.m_iAccountID + 0xE1A93F250710ABDD, // CEconItemView.m_bInitialized + 0xE1A93F25AFD12EE8, // CEconItemView.m_szCustomName + 0xCD91F6843C990CE3, // CEconEntity.m_OriginalOwnerXuidLow + 0xCD91F6842628947F, // CEconEntity.m_OriginalOwnerXuidHigh + 0xCD91F6840A12D48F, // CEconEntity.m_nFallbackPaintKit + 0xCD91F684A1B165B2, // CEconEntity.m_nFallbackSeed + 0xCD91F68486253266, // CEconEntity.m_flFallbackWear + 0xCD91F68467ECC1E7, // CEconEntity.m_nFallbackStatTrak + }; + + private static readonly bool isFollowingServerGuidelines = NativeServerHelpers.IsFollowingServerGuidelines(); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int GetOffset(ulong hash) { + Console.WriteLine($"isFollowingServerGuidelines: {isFollowingServerGuidelines}, hash: {hash}"); + if (isFollowingServerGuidelines && dangerousFields.Contains(hash)) { + throw new InvalidOperationException($"Cannot execute dangerous operation {hash} while \"FollowCS2ServerGuidelines\" is enabled.\n\tTo use this operation, disable the option in core.jsonc."); + } return NativeSchema.GetOffset(hash); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Update(nint handle, ulong hash) { + if (isFollowingServerGuidelines && dangerousFields.Contains(hash)) { + throw new InvalidOperationException($"Cannot execute dangerous operation {hash} while \"FollowCS2ServerGuidelines\" is enabled.\n\tTo use this operation, disable the option in core.jsonc."); + } NativeSchema.SetStateChanged(handle, hash); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void SetString(nint handle, ulong hash, string value) { + if (isFollowingServerGuidelines && dangerousFields.Contains(hash)) { + throw new InvalidOperationException($"Cannot execute dangerous operation {hash} while \"FollowCS2ServerGuidelines\" is enabled.\n\tTo use this operation, disable the option in core.jsonc."); + } (handle + GetOffset(hash)).Write(StringPool.Allocate(value)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void SetFixedString(nint handle, ulong hash, string value, int maxSize) { + if (isFollowingServerGuidelines && dangerousFields.Contains(hash)) { + throw new InvalidOperationException($"Cannot execute dangerous operation {hash} while \"FollowCS2ServerGuidelines\" is enabled.\n\tTo use this operation, disable the option in core.jsonc."); + } var pool = ArrayPool.Shared; var size = Encoding.UTF8.GetByteCount(value); if (size + 1 > maxSize) { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CAnimAttachmentImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CAnimAttachmentImpl.cs index aa957992..962a19ba 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CAnimAttachmentImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CAnimAttachmentImpl.cs @@ -15,16 +15,16 @@ internal partial class CAnimAttachmentImpl : SchemaClass, CAnimAttachment { public CAnimAttachmentImpl(nint handle) : base(handle) { } -public ISchemaFixedArray InfluenceRotations { + public ISchemaFixedArray InfluenceRotations { get => new SchemaFixedArray(_Handle, 0xCF918186B393B857, 3, 16, 16); } -public ISchemaFixedArray InfluenceOffsets { + public ISchemaFixedArray InfluenceOffsets { get => new SchemaFixedArray(_Handle, 0xCF918186E75BDA68, 3, 16, 16); } -public ISchemaFixedArray InfluenceIndices { + public ISchemaFixedArray InfluenceIndices { get => new SchemaFixedArray(_Handle, 0xCF9181862FA09BA5, 3, 4, 4); } -public ISchemaFixedArray InfluenceWeights { + public ISchemaFixedArray InfluenceWeights { get => new SchemaFixedArray(_Handle, 0xCF91818649916951, 3, 4, 4); } public ref byte NumInfluences { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CAttachmentImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CAttachmentImpl.cs index 49b9274e..cd6bf818 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CAttachmentImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CAttachmentImpl.cs @@ -29,16 +29,16 @@ public string InfluenceNames { } set => Schema.SetString(_Handle, 0x5F09808FFD9B3CB8, value); } -public ISchemaFixedArray InfluenceRotations { + public ISchemaFixedArray InfluenceRotations { get => new SchemaFixedArray(_Handle, 0x5F09808FD277168B, 3, 16, 16); } -public ISchemaFixedArray InfluenceOffsets { + public ISchemaFixedArray InfluenceOffsets { get => new SchemaFixedArray(_Handle, 0x5F09808F767C44DC, 3, 12, 4); } -public ISchemaFixedArray InfluenceWeights { + public ISchemaFixedArray InfluenceWeights { get => new SchemaFixedArray(_Handle, 0x5F09808F49916951, 3, 4, 4); } -public ISchemaFixedArray InfluenceRootTransform { + public ISchemaFixedArray InfluenceRootTransform { get => new SchemaFixedArray(_Handle, 0x5F09808F5763011C, 3, 1, 1); } public ref byte Influences { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBaseIssueImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBaseIssueImpl.cs index c063636f..a10e7f8b 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBaseIssueImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBaseIssueImpl.cs @@ -15,14 +15,14 @@ internal partial class CBaseIssueImpl : SchemaClass, CBaseIssue { public CBaseIssueImpl(nint handle) : base(handle) { } -public string TypeString { + public string TypeString { get { var ptr = _Handle + Schema.GetOffset(0xE0727D1E2E3EE7A9); return Schema.GetString(ptr); } set => Schema.SetFixedString(_Handle, 0xE0727D1E2E3EE7A9, value, 64); } -public string DetailsString { + public string DetailsString { get { var ptr = _Handle + Schema.GetOffset(0xE0727D1ECCE4C9BF); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBaseModelEntityImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBaseModelEntityImpl.cs index 18070ca7..376753a4 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBaseModelEntityImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBaseModelEntityImpl.cs @@ -141,7 +141,7 @@ public ref CUtlVector> ConfigEntitiesToPropagateMateri public CNetworkViewOffsetVector ViewOffset { get => new CNetworkViewOffsetVectorImpl(_Handle + Schema.GetOffset(0x517849F739DB834B)); } -public ISchemaFixedArray DisabledHitGroups { + public ISchemaFixedArray DisabledHitGroups { get => new SchemaFixedArray(_Handle, 0x517849F7DDB01736, 1, 4, 4); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBasePlayerControllerImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBasePlayerControllerImpl.cs index 2393aaf8..30bcef33 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBasePlayerControllerImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBasePlayerControllerImpl.cs @@ -42,7 +42,7 @@ public ref bool IsHLTV { public ref PlayerConnectedState Connected { get => ref _Handle.AsRef(Schema.GetOffset(0x3979FF6E97963D8B)); } -public string PlayerName { + public string PlayerName { get { var ptr = _Handle + Schema.GetOffset(0x3979FF6EDE61DD3B); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBasePlayerWeaponImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBasePlayerWeaponImpl.cs index afb2e76e..42548dcb 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBasePlayerWeaponImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBasePlayerWeaponImpl.cs @@ -33,7 +33,7 @@ public ref int Clip1 { public ref int Clip2 { get => ref _Handle.AsRef(Schema.GetOffset(0x4174B75ECD2504B0)); } -public ISchemaFixedArray ReserveAmmo { + public ISchemaFixedArray ReserveAmmo { get => new SchemaFixedArray(_Handle, 0x4174B75EB3FEBB0B, 2, 4, 4); } public CEntityIOOutput OnPlayerUse { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBaseRendererSource2Impl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBaseRendererSource2Impl.cs index 594ee329..077d715f 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBaseRendererSource2Impl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBaseRendererSource2Impl.cs @@ -166,7 +166,7 @@ public ref bool UseMixedResolutionRendering { public ref bool OnlyRenderInEffecsGameOverlay { get => ref _Handle.AsRef(Schema.GetOffset(0xA732A5750293C80E)); } -public string StencilTestID { + public string StencilTestID { get { var ptr = _Handle + Schema.GetOffset(0xA732A575115C996A); return Schema.GetString(ptr); @@ -176,7 +176,7 @@ public string StencilTestID { public ref bool StencilTestExclude { get => ref _Handle.AsRef(Schema.GetOffset(0xA732A57584BFB66B)); } -public string StencilWriteID { + public string StencilWriteID { get { var ptr = _Handle + Schema.GetOffset(0xA732A5758FB6505B); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBeamImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBeamImpl.cs index 9da54ef5..63098630 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBeamImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBeamImpl.cs @@ -42,7 +42,7 @@ public ref BeamType_t BeamType { public ref uint BeamFlags { get => ref _Handle.AsRef(Schema.GetOffset(0x4BCF3CE5BB875091)); } -public ISchemaFixedArray> AttachEntity { + public ISchemaFixedArray> AttachEntity { get => new SchemaFixedArray>(_Handle, 0x4BCF3CE56BCDCAD1, 10, 4, 4); } public SchemaUntypedField AttachIndex { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBoneConstraintDotToMorphImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBoneConstraintDotToMorphImpl.cs index 318307a6..5e3d671f 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBoneConstraintDotToMorphImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CBoneConstraintDotToMorphImpl.cs @@ -36,7 +36,7 @@ public string MorphChannelName { } set => Schema.SetString(_Handle, 0x75939F0777272AE4, value); } -public ISchemaFixedArray Remap { + public ISchemaFixedArray Remap { get => new SchemaFixedArray(_Handle, 0x75939F07BE3DB1A0, 4, 4, 4); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CC4Impl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CC4Impl.cs index ce4e1d64..9545b2cd 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CC4Impl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CC4Impl.cs @@ -42,7 +42,7 @@ public EntitySpottedState_t EntitySpottedState { public ref int SpotRules { get => ref _Handle.AsRef(Schema.GetOffset(0x1D49B0B5776CCE44)); } -public ISchemaFixedArray PlayedArmingBeeps { + public ISchemaFixedArray PlayedArmingBeeps { get => new SchemaFixedArray(_Handle, 0x1D49B0B525D5D369, 7, 1, 1); } public ref bool BombPlanted { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSBotImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSBotImpl.cs index ad1f8d8c..392c23e7 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSBotImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSBotImpl.cs @@ -18,7 +18,7 @@ public CCSBotImpl(nint handle) : base(handle) { public ref Vector EyePosition { get => ref _Handle.AsRef(Schema.GetOffset(0x1CFE165D847A3605)); } -public string Name { + public string Name { get { var ptr = _Handle + Schema.GetOffset(0x1CFE165D4D8F5786); return Schema.GetString(ptr); @@ -145,7 +145,7 @@ public CountdownTimer WaitTimer { public CountdownTimer UpdateTravelDistanceTimer { get => new CountdownTimerImpl(_Handle + Schema.GetOffset(0x1CFE165D67E5EA78)); } -public ISchemaFixedArray PlayerTravelDistance { + public ISchemaFixedArray PlayerTravelDistance { get => new SchemaFixedArray(_Handle, 0x1CFE165DA4B8EEEF, 64, 4, 4); } public ref byte TravelDistancePhase { @@ -413,7 +413,7 @@ public CountdownTimer StuckJumpTimer { public GameTime_t NextCleanupCheckTimestamp { get => new GameTime_tImpl(_Handle + Schema.GetOffset(0x1CFE165DB61EB6BC)); } -public ISchemaFixedArray AvgVel { + public ISchemaFixedArray AvgVel { get => new SchemaFixedArray(_Handle, 0x1CFE165D99077BFE, 10, 4, 4); } public ref int AvgVelIndex { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSGameRulesImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSGameRulesImpl.cs index f01639fd..51c04582 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSGameRulesImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSGameRulesImpl.cs @@ -126,28 +126,28 @@ public ref bool HasMatchStarted { public ref int NextMapInMapgroup { get => ref _Handle.AsRef(Schema.GetOffset(0x6295CF65C6613F50)); } -public string TournamentEventName { + public string TournamentEventName { get { var ptr = _Handle + Schema.GetOffset(0x6295CF65D2FCF8C2); return Schema.GetString(ptr); } set => Schema.SetFixedString(_Handle, 0x6295CF65D2FCF8C2, value, 512); } -public string TournamentEventStage { + public string TournamentEventStage { get { var ptr = _Handle + Schema.GetOffset(0x6295CF658177EF71); return Schema.GetString(ptr); } set => Schema.SetFixedString(_Handle, 0x6295CF658177EF71, value, 512); } -public string MatchStatTxt { + public string MatchStatTxt { get { var ptr = _Handle + Schema.GetOffset(0x6295CF65D6472911); return Schema.GetString(ptr); } set => Schema.SetFixedString(_Handle, 0x6295CF65D6472911, value, 512); } -public string TournamentPredictionsTxt { + public string TournamentPredictionsTxt { get { var ptr = _Handle + Schema.GetOffset(0x6295CF65A974A2B9); return Schema.GetString(ptr); @@ -172,10 +172,10 @@ public ref bool IsQuestEligible { public ref bool IsHltvActive { get => ref _Handle.AsRef(Schema.GetOffset(0x6295CF657F4E0DA5)); } -public ISchemaFixedArray ProhibitedItemIndices { + public ISchemaFixedArray ProhibitedItemIndices { get => new SchemaFixedArray(_Handle, 0x6295CF65BFE8D026, 100, 2, 2); } -public ISchemaFixedArray TournamentActiveCasterAccounts { + public ISchemaFixedArray TournamentActiveCasterAccounts { get => new SchemaFixedArray(_Handle, 0x6295CF6525481301, 4, 4, 4); } public ref int NumBestOfMaps { @@ -202,16 +202,16 @@ public ref bool TCantBuy { public ref bool CTCantBuy { get => ref _Handle.AsRef(Schema.GetOffset(0x6295CF655A190494)); } -public ISchemaFixedArray MatchStats_RoundResults { + public ISchemaFixedArray MatchStats_RoundResults { get => new SchemaFixedArray(_Handle, 0x6295CF652BF6608F, 30, 4, 4); } -public ISchemaFixedArray MatchStats_PlayersAlive_CT { + public ISchemaFixedArray MatchStats_PlayersAlive_CT { get => new SchemaFixedArray(_Handle, 0x6295CF650A468F9C, 30, 4, 4); } -public ISchemaFixedArray MatchStats_PlayersAlive_T { + public ISchemaFixedArray MatchStats_PlayersAlive_T { get => new SchemaFixedArray(_Handle, 0x6295CF65DCEE8755, 30, 4, 4); } -public ISchemaFixedArray TeamRespawnWaveTimes { + public ISchemaFixedArray TeamRespawnWaveTimes { get => new SchemaFixedArray(_Handle, 0x6295CF65A15A30B1, 32, 4, 4); } public SchemaUntypedField NextRespawnWave { @@ -223,16 +223,16 @@ public ref Vector MinimapMins { public ref Vector MinimapMaxs { get => ref _Handle.AsRef(Schema.GetOffset(0x6295CF65F2B86C5F)); } -public ISchemaFixedArray MinimapVerticalSectionHeights { + public ISchemaFixedArray MinimapVerticalSectionHeights { get => new SchemaFixedArray(_Handle, 0x6295CF6537ADB2EF, 8, 4, 4); } public ref ulong UllLocalMatchID { get => ref _Handle.AsRef(Schema.GetOffset(0x6295CF657D14A239)); } -public ISchemaFixedArray EndMatchMapGroupVoteTypes { + public ISchemaFixedArray EndMatchMapGroupVoteTypes { get => new SchemaFixedArray(_Handle, 0x6295CF65B4DAF10B, 10, 4, 4); } -public ISchemaFixedArray EndMatchMapGroupVoteOptions { + public ISchemaFixedArray EndMatchMapGroupVoteOptions { get => new SchemaFixedArray(_Handle, 0x6295CF65BCAA50F4, 10, 4, 4); } public ref int EndMatchMapVoteWinner { @@ -530,10 +530,10 @@ public ref CHandle PlayerResource { public CRetakeGameRules RetakeRules { get => new CRetakeGameRulesImpl(_Handle + Schema.GetOffset(0x6295CF65DB6D258A)); } -public ISchemaFixedArray> TeamUniqueKillWeaponsMatch { + public ISchemaFixedArray> TeamUniqueKillWeaponsMatch { get => new SchemaFixedArray>(_Handle, 0x6295CF65EB474B78, 4, 24, 8); } -public ISchemaFixedArray TeamLastKillUsedUniqueWeaponMatch { + public ISchemaFixedArray TeamLastKillUsedUniqueWeaponMatch { get => new SchemaFixedArray(_Handle, 0x6295CF65BCB471EB, 4, 1, 1); } public ref byte MatchEndCount { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSPlayerControllerImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSPlayerControllerImpl.cs index 1095eef0..4187d5b6 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSPlayerControllerImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSPlayerControllerImpl.cs @@ -242,7 +242,7 @@ public ref int RoundScore { public ref int RoundsWon { get => ref _Handle.AsRef(Schema.GetOffset(0x28ECD7A1866D1FEF)); } -public ISchemaFixedArray RecentKillQueue { + public ISchemaFixedArray RecentKillQueue { get => new SchemaFixedArray(_Handle, 0x28ECD7A12540EEA5, 8, 1, 1); } public ref byte FirstKill { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSPlayerController_InventoryServicesImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSPlayerController_InventoryServicesImpl.cs index 73a0acca..98387292 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSPlayerController_InventoryServicesImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSPlayerController_InventoryServicesImpl.cs @@ -18,7 +18,7 @@ public CCSPlayerController_InventoryServicesImpl(nint handle) : base(handle) { public ref ushort MusicID { get => ref _Handle.AsRef(Schema.GetOffset(0xC1D0078289F71A5C)); } -public ISchemaFixedArray Rank { + public ISchemaFixedArray Rank { get => new SchemaFixedArray(_Handle, 0xC1D007826A7861C7, 6, 4, 4); } public ref int PersonaDataPublicLevel { @@ -36,7 +36,7 @@ public ref int PersonaDataPublicCommendsFriendly { public ref int PersonaDataXpTrailLevel { get => ref _Handle.AsRef(Schema.GetOffset(0xC1D0078228192B7D)); } -public ISchemaFixedArray EquippedPlayerSprayIDs { + public ISchemaFixedArray EquippedPlayerSprayIDs { get => new SchemaFixedArray(_Handle, 0xC1D00782CE970C93, 1, 4, 4); } public ref ulong CurrentLoadoutHash { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSPlayerPawnImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSPlayerPawnImpl.cs index 8da54d07..9726ea1a 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSPlayerPawnImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSPlayerPawnImpl.cs @@ -64,7 +64,7 @@ public string StrVOPrefix { } set => Schema.SetString(_Handle, 0xC7614AAB86FA355B, value); } -public string LastPlaceName { + public string LastPlaceName { get { var ptr = _Handle + Schema.GetOffset(0xC7614AAB4C28E3A0); return Schema.GetString(ptr); @@ -161,7 +161,7 @@ public ref Vector RagdollDamageForce { public ref Vector RagdollDamagePosition { get => ref _Handle.AsRef(Schema.GetOffset(0xC7614AAB29671362)); } -public string RagdollDamageWeaponName { + public string RagdollDamageWeaponName { get { var ptr = _Handle + Schema.GetOffset(0xC7614AABDAAFA519); return Schema.GetString(ptr); @@ -360,7 +360,7 @@ public ref float DeathInfoTime { public ref Vector DeathInfoOrigin { get => ref _Handle.AsRef(Schema.GetOffset(0xC7614AAB05B549A7)); } -public ISchemaFixedArray PlayerPatchEconIndices { + public ISchemaFixedArray PlayerPatchEconIndices { get => new SchemaFixedArray(_Handle, 0xC7614AABECA447BC, 5, 4, 4); } public ref Color GunGameImmunityColor { @@ -381,13 +381,13 @@ public ref Vector StashedGrenadeThrowPosition { public ref Vector StashedVelocity { get => ref _Handle.AsRef(Schema.GetOffset(0xC7614AAB577972A4)); } -public ISchemaFixedArray ShootAngleHistory { + public ISchemaFixedArray ShootAngleHistory { get => new SchemaFixedArray(_Handle, 0xC7614AABE9EFCFCF, 2, 12, 4); } -public ISchemaFixedArray ThrowPositionHistory { + public ISchemaFixedArray ThrowPositionHistory { get => new SchemaFixedArray(_Handle, 0xC7614AAB35A0837C, 2, 12, 4); } -public ISchemaFixedArray VelocityHistory { + public ISchemaFixedArray VelocityHistory { get => new SchemaFixedArray(_Handle, 0xC7614AAB24AFD9B2, 2, 12, 4); } public ref CUtlVector PredictedDamageTags { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSPlayerResourceImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSPlayerResourceImpl.cs index 0b830cf6..1499d5f0 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSPlayerResourceImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSPlayerResourceImpl.cs @@ -15,13 +15,13 @@ internal partial class CCSPlayerResourceImpl : CBaseEntityImpl, CCSPlayerResourc public CCSPlayerResourceImpl(nint handle) : base(handle) { } -public ISchemaFixedArray HostageAlive { + public ISchemaFixedArray HostageAlive { get => new SchemaFixedArray(_Handle, 0xBEE9B9154C5B2E7F, 12, 1, 1); } -public ISchemaFixedArray IsHostageFollowingSomeone { + public ISchemaFixedArray IsHostageFollowingSomeone { get => new SchemaFixedArray(_Handle, 0xBEE9B9153F8AA9BB, 12, 1, 1); } -public ISchemaFixedArray HostageEntityIDs { + public ISchemaFixedArray HostageEntityIDs { get => new SchemaFixedArray(_Handle, 0xBEE9B9150EEFA350, 12, 4, 4); } public ref Vector BombsiteCenterA { @@ -30,13 +30,13 @@ public ref Vector BombsiteCenterA { public ref Vector BombsiteCenterB { get => ref _Handle.AsRef(Schema.GetOffset(0xBEE9B915A01A7227)); } -public ISchemaFixedArray HostageRescueX { + public ISchemaFixedArray HostageRescueX { get => new SchemaFixedArray(_Handle, 0xBEE9B91584FE2109, 4, 4, 4); } -public ISchemaFixedArray HostageRescueY { + public ISchemaFixedArray HostageRescueY { get => new SchemaFixedArray(_Handle, 0xBEE9B91583FE1F76, 4, 4, 4); } -public ISchemaFixedArray HostageRescueZ { + public ISchemaFixedArray HostageRescueZ { get => new SchemaFixedArray(_Handle, 0xBEE9B91582FE1DE3, 4, 4, 4); } public ref bool EndMatchNextMapAllVoted { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSTeamImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSTeamImpl.cs index d0be3ca3..0f9b9092 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSTeamImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CCSTeamImpl.cs @@ -24,7 +24,7 @@ public ref int ShorthandedRoundBonusStartRound { public ref bool Surrendered { get => ref _Handle.AsRef(Schema.GetOffset(0x1CE326C9CFFCED54)); } -public string TeamMatchStat { + public string TeamMatchStat { get { var ptr = _Handle + Schema.GetOffset(0x1CE326C9D2C89DC0); return Schema.GetString(ptr); @@ -43,7 +43,7 @@ public ref int ScoreSecondHalf { public ref int ScoreOvertime { get => ref _Handle.AsRef(Schema.GetOffset(0x1CE326C9A22D3CEE)); } -public string ClanTeamname { + public string ClanTeamname { get { var ptr = _Handle + Schema.GetOffset(0x1CE326C946453F76); return Schema.GetString(ptr); @@ -53,14 +53,14 @@ public string ClanTeamname { public ref uint ClanID { get => ref _Handle.AsRef(Schema.GetOffset(0x1CE326C90A807BAD)); } -public string TeamFlagImage { + public string TeamFlagImage { get { var ptr = _Handle + Schema.GetOffset(0x1CE326C9F7FF31D0); return Schema.GetString(ptr); } set => Schema.SetFixedString(_Handle, 0x1CE326C9F7FF31D0, value, 8); } -public string TeamLogoImage { + public string TeamLogoImage { get { var ptr = _Handle + Schema.GetOffset(0x1CE326C981DF092B); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CColorCorrectionImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CColorCorrectionImpl.cs index bb75e8fc..724cde58 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CColorCorrectionImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CColorCorrectionImpl.cs @@ -60,7 +60,7 @@ public ref float MaxFalloff { public ref float CurWeight { get => ref _Handle.AsRef(Schema.GetOffset(0x86645E112EA7ED7F)); } -public string NetlookupFilename { + public string NetlookupFilename { get { var ptr = _Handle + Schema.GetOffset(0x86645E11543AB1EB); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CColorCorrectionVolumeImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CColorCorrectionVolumeImpl.cs index 20646e2d..8bc36554 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CColorCorrectionVolumeImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CColorCorrectionVolumeImpl.cs @@ -24,7 +24,7 @@ public ref float FadeDuration { public ref float Weight { get => ref _Handle.AsRef(Schema.GetOffset(0x78A9E01BBF415739)); } -public string LookupFilename { + public string LookupFilename { get { var ptr = _Handle + Schema.GetOffset(0x78A9E01B2611A2C6); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CDrawCullingDataImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CDrawCullingDataImpl.cs index 25a93a12..443a1643 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CDrawCullingDataImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CDrawCullingDataImpl.cs @@ -15,7 +15,7 @@ internal partial class CDrawCullingDataImpl : SchemaClass, CDrawCullingData { public CDrawCullingDataImpl(nint handle) : base(handle) { } -public ISchemaFixedArray ConeAxis { + public ISchemaFixedArray ConeAxis { get => new SchemaFixedArray(_Handle, 0x80665970C59E234F, 3, 1, 1); } public ref byte ConeCutoff { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CEconItemViewImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CEconItemViewImpl.cs index b148a554..9c1ad0a1 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CEconItemViewImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CEconItemViewImpl.cs @@ -48,14 +48,14 @@ public CAttributeList AttributeList { public CAttributeList NetworkedDynamicAttributes { get => new CAttributeListImpl(_Handle + Schema.GetOffset(0xE1A93F25B576449C)); } -public string CustomName { + public string CustomName { get { var ptr = _Handle + Schema.GetOffset(0xE1A93F25AFD12EE8); return Schema.GetString(ptr); } set => Schema.SetFixedString(_Handle, 0xE1A93F25AFD12EE8, value, 161); } -public string CustomNameOverride { + public string CustomNameOverride { get { var ptr = _Handle + Schema.GetOffset(0xE1A93F25A74A6ED8); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CFilterMultipleImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CFilterMultipleImpl.cs index f4dfd0ff..1d8e56e5 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CFilterMultipleImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CFilterMultipleImpl.cs @@ -25,7 +25,7 @@ public string FilterName { } set => Schema.SetString(_Handle, 0x6EA0578009C86445, value); } -public ISchemaFixedArray> Filter { + public ISchemaFixedArray> Filter { get => new SchemaFixedArray>(_Handle, 0x6EA0578045D9E0B1, 10, 4, 4); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CFiringModeFloatImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CFiringModeFloatImpl.cs index dacc3626..1bd30279 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CFiringModeFloatImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CFiringModeFloatImpl.cs @@ -15,7 +15,7 @@ internal partial class CFiringModeFloatImpl : SchemaClass, CFiringModeFloat { public CFiringModeFloatImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Values { + public ISchemaFixedArray Values { get => new SchemaFixedArray(_Handle, 0xB6918247BD8BFD5, 2, 4, 4); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CFiringModeIntImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CFiringModeIntImpl.cs index c43c16e1..2b88f97d 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CFiringModeIntImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CFiringModeIntImpl.cs @@ -15,7 +15,7 @@ internal partial class CFiringModeIntImpl : SchemaClass, CFiringModeInt { public CFiringModeIntImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Values { + public ISchemaFixedArray Values { get => new SchemaFixedArray(_Handle, 0x528A6FDFD7175D77, 2, 4, 4); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CGameRulesImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CGameRulesImpl.cs index 4afcc623..d5d0f0ec 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CGameRulesImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CGameRulesImpl.cs @@ -18,7 +18,7 @@ public CGameRulesImpl(nint handle) : base(handle) { public ref CNetworkVarChainer __m_pChainEntity { get => ref _Handle.AsRef(Schema.GetOffset(0x4807DA77F63F0E7D)); } -public string QuestName { + public string QuestName { get { var ptr = _Handle + Schema.GetOffset(0x4807DA7748F621A1); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CInButtonStateImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CInButtonStateImpl.cs index a5dbe6b4..a8270ee0 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CInButtonStateImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CInButtonStateImpl.cs @@ -15,7 +15,7 @@ internal partial class CInButtonStateImpl : SchemaClass, CInButtonState { public CInButtonStateImpl(nint handle) : base(handle) { } -public ISchemaFixedArray ButtonStates { + public ISchemaFixedArray ButtonStates { get => new SchemaFixedArray(_Handle, 0x6C8AF06A00121DF9, 3, 8, 8); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CInfernoImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CInfernoImpl.cs index 54b62a7b..01eb83c8 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CInfernoImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CInfernoImpl.cs @@ -15,16 +15,16 @@ internal partial class CInfernoImpl : CBaseModelEntityImpl, CInferno { public CInfernoImpl(nint handle) : base(handle) { } -public ISchemaFixedArray FirePositions { + public ISchemaFixedArray FirePositions { get => new SchemaFixedArray(_Handle, 0xABE104C91E992007, 64, 12, 4); } -public ISchemaFixedArray FireParentPositions { + public ISchemaFixedArray FireParentPositions { get => new SchemaFixedArray(_Handle, 0xABE104C9A58B35D7, 64, 12, 4); } -public ISchemaFixedArray FireIsBurning { + public ISchemaFixedArray FireIsBurning { get => new SchemaFixedArray(_Handle, 0xABE104C9E5CD906C, 64, 1, 1); } -public ISchemaFixedArray BurnNormal { + public ISchemaFixedArray BurnNormal { get => new SchemaFixedArray(_Handle, 0xABE104C9382663DB, 64, 12, 4); } public ref int FireCount { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CJumpHelperUpdateNodeImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CJumpHelperUpdateNodeImpl.cs index 69e4e72a..8f29b9aa 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CJumpHelperUpdateNodeImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CJumpHelperUpdateNodeImpl.cs @@ -33,7 +33,7 @@ public ref float JumpEndCycle { public ref JumpCorrectionMethod CorrectionMethod { get => ref _Handle.AsRef(Schema.GetOffset(0xB5EA31271E19BA51)); } -public ISchemaFixedArray TranslationAxis { + public ISchemaFixedArray TranslationAxis { get => new SchemaFixedArray(_Handle, 0xB5EA3127F062387D, 3, 1, 1); } public ref bool ScaleSpeed { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CLogicCaseImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CLogicCaseImpl.cs index 93fdfe05..446d38e0 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CLogicCaseImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CLogicCaseImpl.cs @@ -28,7 +28,7 @@ public ref int ShuffleCases { public ref int LastShuffleCase { get => ref _Handle.AsRef(Schema.GetOffset(0x4B6BB20C053CE392)); } -public ISchemaFixedArray UchShuffleCaseMap { + public ISchemaFixedArray UchShuffleCaseMap { get => new SchemaFixedArray(_Handle, 0x4B6BB20CF9FC41AE, 32, 1, 1); } public SchemaUntypedField OnCase { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CMapVetoPickControllerImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CMapVetoPickControllerImpl.cs index f35c1212..5a5271ec 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CMapVetoPickControllerImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CMapVetoPickControllerImpl.cs @@ -33,34 +33,34 @@ public ref int DraftType { public ref int TeamWinningCoinToss { get => ref _Handle.AsRef(Schema.GetOffset(0xD5DDD68D45B5B5A2)); } -public ISchemaFixedArray TeamWithFirstChoice { + public ISchemaFixedArray TeamWithFirstChoice { get => new SchemaFixedArray(_Handle, 0xD5DDD68D8887D005, 64, 4, 4); } -public ISchemaFixedArray VoteMapIdsList { + public ISchemaFixedArray VoteMapIdsList { get => new SchemaFixedArray(_Handle, 0xD5DDD68DE64EA3ED, 7, 4, 4); } -public ISchemaFixedArray AccountIDs { + public ISchemaFixedArray AccountIDs { get => new SchemaFixedArray(_Handle, 0xD5DDD68D2F303A1A, 64, 4, 4); } -public ISchemaFixedArray MapId0 { + public ISchemaFixedArray MapId0 { get => new SchemaFixedArray(_Handle, 0xD5DDD68D9E2BC198, 64, 4, 4); } -public ISchemaFixedArray MapId1 { + public ISchemaFixedArray MapId1 { get => new SchemaFixedArray(_Handle, 0xD5DDD68D9F2BC32B, 64, 4, 4); } -public ISchemaFixedArray MapId2 { + public ISchemaFixedArray MapId2 { get => new SchemaFixedArray(_Handle, 0xD5DDD68DA02BC4BE, 64, 4, 4); } -public ISchemaFixedArray MapId3 { + public ISchemaFixedArray MapId3 { get => new SchemaFixedArray(_Handle, 0xD5DDD68DA12BC651, 64, 4, 4); } -public ISchemaFixedArray MapId4 { + public ISchemaFixedArray MapId4 { get => new SchemaFixedArray(_Handle, 0xD5DDD68DA22BC7E4, 64, 4, 4); } -public ISchemaFixedArray MapId5 { + public ISchemaFixedArray MapId5 { get => new SchemaFixedArray(_Handle, 0xD5DDD68DA32BC977, 64, 4, 4); } -public ISchemaFixedArray StartingSide0 { + public ISchemaFixedArray StartingSide0 { get => new SchemaFixedArray(_Handle, 0xD5DDD68DDAE5D5BA, 64, 4, 4); } public ref int CurrentPhase { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CMotionGraphConfigImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CMotionGraphConfigImpl.cs index 608faa0d..4db13d8a 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CMotionGraphConfigImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CMotionGraphConfigImpl.cs @@ -15,7 +15,7 @@ internal partial class CMotionGraphConfigImpl : SchemaClass, CMotionGraphConfig public CMotionGraphConfigImpl(nint handle) : base(handle) { } -public ISchemaFixedArray ParamValues { + public ISchemaFixedArray ParamValues { get => new SchemaFixedArray(_Handle, 0x851F6EEA365BD3F8, 4, 4, 4); } public ref float Duration { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CMultiSourceImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CMultiSourceImpl.cs index 0d54164b..6b88cd14 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CMultiSourceImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CMultiSourceImpl.cs @@ -15,10 +15,10 @@ internal partial class CMultiSourceImpl : CLogicalEntityImpl, CMultiSource { public CMultiSourceImpl(nint handle) : base(handle) { } -public ISchemaFixedArray> RgEntities { + public ISchemaFixedArray> RgEntities { get => new SchemaFixedArray>(_Handle, 0x87DC5C660CB2E479, 32, 4, 4); } -public ISchemaFixedArray RgTriggered { + public ISchemaFixedArray RgTriggered { get => new SchemaFixedArray(_Handle, 0x87DC5C664616C37F, 32, 4, 4); } public CEntityIOOutput OnTrigger { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CParticleSystemImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CParticleSystemImpl.cs index 01c8c8e9..a07d816d 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CParticleSystemImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CParticleSystemImpl.cs @@ -15,7 +15,7 @@ internal partial class CParticleSystemImpl : CBaseModelEntityImpl, CParticleSyst public CParticleSystemImpl(nint handle) : base(handle) { } -public string SnapshotFileName { + public string SnapshotFileName { get { var ptr = _Handle + Schema.GetOffset(0x8F6D2B258D2636C1); return Schema.GetString(ptr); @@ -46,13 +46,13 @@ public GameTime_t StartTime { public ref float PreSimTime { get => ref _Handle.AsRef(Schema.GetOffset(0x8F6D2B25CD67F64E)); } -public ISchemaFixedArray ServerControlPoints { + public ISchemaFixedArray ServerControlPoints { get => new SchemaFixedArray(_Handle, 0x8F6D2B2561386048, 4, 12, 4); } -public ISchemaFixedArray ServerControlPointAssignments { + public ISchemaFixedArray ServerControlPointAssignments { get => new SchemaFixedArray(_Handle, 0x8F6D2B25E9DEDAC8, 4, 1, 1); } -public ISchemaFixedArray> ControlPointEnts { + public ISchemaFixedArray> ControlPointEnts { get => new SchemaFixedArray>(_Handle, 0x8F6D2B25ECA36598, 64, 4, 4); } public ref bool NoSave { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPhysLengthImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPhysLengthImpl.cs index 4e13ac60..2b351faf 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPhysLengthImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPhysLengthImpl.cs @@ -15,7 +15,7 @@ internal partial class CPhysLengthImpl : CPhysConstraintImpl, CPhysLength { public CPhysLengthImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Offset { + public ISchemaFixedArray Offset { get => new SchemaFixedArray(_Handle, 0x9203A50AF836806A, 2, 12, 4); } public ref Vector Attach { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPhysPulleyImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPhysPulleyImpl.cs index 5ef62f86..f3568c2f 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPhysPulleyImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPhysPulleyImpl.cs @@ -18,7 +18,7 @@ public CPhysPulleyImpl(nint handle) : base(handle) { public ref Vector Position2 { get => ref _Handle.AsRef(Schema.GetOffset(0xDCB3A22333568F48)); } -public ISchemaFixedArray Offset { + public ISchemaFixedArray Offset { get => new SchemaFixedArray(_Handle, 0xDCB3A223F836806A, 2, 12, 4); } public ref float AddLength { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPhysicsPropImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPhysicsPropImpl.cs index 999e7eca..fd11d83f 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPhysicsPropImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPhysicsPropImpl.cs @@ -121,7 +121,7 @@ public string StrItemClass { } set => Schema.SetString(_Handle, 0xC3FD37FE35D963A1, value); } -public ISchemaFixedArray ItemCount { + public ISchemaFixedArray ItemCount { get => new SchemaFixedArray(_Handle, 0xC3FD37FEA5886501, 4, 4, 4); } public ref bool RemovableForAmmoBalancing { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPlantedC4Impl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPlantedC4Impl.cs index 92b3d5b4..29578419 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPlantedC4Impl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPlantedC4Impl.cs @@ -84,7 +84,7 @@ public ref int ProgressBarTime { public ref bool VoiceAlertFired { get => ref _Handle.AsRef(Schema.GetOffset(0xE1614C8139790C5F)); } -public ISchemaFixedArray VoiceAlertPlayed { + public ISchemaFixedArray VoiceAlertPlayed { get => new SchemaFixedArray(_Handle, 0xE1614C812559EA7A, 4, 1, 1); } public GameTime_t NextBotBeepTime { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPlayerPingImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPlayerPingImpl.cs index d6603ae5..753eb141 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPlayerPingImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPlayerPingImpl.cs @@ -27,7 +27,7 @@ public ref int Type { public ref bool Urgent { get => ref _Handle.AsRef(Schema.GetOffset(0x5943E25F4F5EE9D0)); } -public string PlaceName { + public string PlaceName { get { var ptr = _Handle + Schema.GetOffset(0x5943E25F6039F660); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPlayerSprayDecalImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPlayerSprayDecalImpl.cs index 0e0bd2b2..be6eaf11 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPlayerSprayDecalImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPlayerSprayDecalImpl.cs @@ -57,7 +57,7 @@ public ref int TintID { public ref byte Version { get => ref _Handle.AsRef(Schema.GetOffset(0x782380E1B0AB8B1B)); } -public ISchemaFixedArray Signature { + public ISchemaFixedArray Signature { get => new SchemaFixedArray(_Handle, 0x782380E133A8D6DC, 128, 1, 1); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPlayer_MovementServicesImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPlayer_MovementServicesImpl.cs index c982faf1..68f9607e 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPlayer_MovementServicesImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPlayer_MovementServicesImpl.cs @@ -30,7 +30,7 @@ public ref ulong QueuedButtonChangeMask { public ref ulong ButtonDoublePressed { get => ref _Handle.AsRef(Schema.GetOffset(0xD5BDF289E6C8CA6E)); } -public ISchemaFixedArray ButtonPressedCmdNumber { + public ISchemaFixedArray ButtonPressedCmdNumber { get => new SchemaFixedArray(_Handle, 0xD5BDF289A7854580, 64, 4, 4); } public ref uint LastCommandNumberProcessed { @@ -42,7 +42,7 @@ public ref ulong ToggleButtonDownMask { public ref float Maxspeed { get => ref _Handle.AsRef(Schema.GetOffset(0xD5BDF289468F90F2)); } -public ISchemaFixedArray ForceSubtickMoveWhen { + public ISchemaFixedArray ForceSubtickMoveWhen { get => new SchemaFixedArray(_Handle, 0xD5BDF28999115A07, 4, 4, 4); } public ref float ForwardMove { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPlayer_WeaponServicesImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPlayer_WeaponServicesImpl.cs index 2d75a49e..9df599e0 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPlayer_WeaponServicesImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPlayer_WeaponServicesImpl.cs @@ -24,7 +24,7 @@ public ref CHandle ActiveWeapon { public ref CHandle LastWeapon { get => ref _Handle.AsRef>(Schema.GetOffset(0x634D2280EA5C9547)); } -public ISchemaFixedArray Ammo { + public ISchemaFixedArray Ammo { get => new SchemaFixedArray(_Handle, 0x634D22800D59E6CA, 32, 2, 2); } public ref bool PreventWeaponPickup { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPointClientUIWorldTextPanelImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPointClientUIWorldTextPanelImpl.cs index 3eaf05c6..4ac91ef3 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPointClientUIWorldTextPanelImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPointClientUIWorldTextPanelImpl.cs @@ -15,7 +15,7 @@ internal partial class CPointClientUIWorldTextPanelImpl : CPointClientUIWorldPan public CPointClientUIWorldTextPanelImpl(nint handle) : base(handle) { } -public string MessageText { + public string MessageText { get { var ptr = _Handle + Schema.GetOffset(0x9F10465EBA6E5D73); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPointWorldTextImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPointWorldTextImpl.cs index 22bf9872..a301d35d 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPointWorldTextImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CPointWorldTextImpl.cs @@ -15,21 +15,21 @@ internal partial class CPointWorldTextImpl : CModelPointEntityImpl, CPointWorldT public CPointWorldTextImpl(nint handle) : base(handle) { } -public string MessageText { + public string MessageText { get { var ptr = _Handle + Schema.GetOffset(0x5BF88697BA6E5D73); return Schema.GetString(ptr); } set => Schema.SetFixedString(_Handle, 0x5BF88697BA6E5D73, value, 512); } -public string FontName { + public string FontName { get { var ptr = _Handle + Schema.GetOffset(0x5BF88697C241C2B3); return Schema.GetString(ptr); } set => Schema.SetFixedString(_Handle, 0x5BF88697C241C2B3, value, 64); } -public string BackgroundMaterialName { + public string BackgroundMaterialName { get { var ptr = _Handle + Schema.GetOffset(0x5BF88697ECF8A7AB); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CRR_ResponseImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CRR_ResponseImpl.cs index 7a16e88c..2264a900 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CRR_ResponseImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CRR_ResponseImpl.cs @@ -18,14 +18,14 @@ public CRR_ResponseImpl(nint handle) : base(handle) { public ref byte Type { get => ref _Handle.AsRef(Schema.GetOffset(0x7B8008788ED6D5CD)); } -public string ResponseName { + public string ResponseName { get { var ptr = _Handle + Schema.GetOffset(0x7B800878C2716964); return Schema.GetString(ptr); } set => Schema.SetFixedString(_Handle, 0x7B800878C2716964, value, 192); } -public string MatchingRule { + public string MatchingRule { get { var ptr = _Handle + Schema.GetOffset(0x7B80087820850239); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CRangeFloatImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CRangeFloatImpl.cs index fc07f4c6..4c120933 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CRangeFloatImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CRangeFloatImpl.cs @@ -15,7 +15,7 @@ internal partial class CRangeFloatImpl : SchemaClass, CRangeFloat { public CRangeFloatImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Value { + public ISchemaFixedArray Value { get => new SchemaFixedArray(_Handle, 0xD3CD83EB7F437844, 2, 4, 4); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CRangeIntImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CRangeIntImpl.cs index e95a5bf2..c333b6c6 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CRangeIntImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CRangeIntImpl.cs @@ -15,7 +15,7 @@ internal partial class CRangeIntImpl : SchemaClass, CRangeInt { public CRangeIntImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Value { + public ISchemaFixedArray Value { get => new SchemaFixedArray(_Handle, 0xF42199F07F437844, 2, 4, 4); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CRemapFloatImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CRemapFloatImpl.cs index 0f7e75de..52896e63 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CRemapFloatImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CRemapFloatImpl.cs @@ -15,7 +15,7 @@ internal partial class CRemapFloatImpl : SchemaClass, CRemapFloat { public CRemapFloatImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Value { + public ISchemaFixedArray Value { get => new SchemaFixedArray(_Handle, 0x49763A6B7F437844, 4, 4, 4); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CSceneListManagerImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CSceneListManagerImpl.cs index 156271b0..e7ac92fc 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CSceneListManagerImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CSceneListManagerImpl.cs @@ -25,7 +25,7 @@ public string Scenes { } set => Schema.SetString(_Handle, 0x6DF51C6D967363E8, value); } -public ISchemaFixedArray> Scenes1 { + public ISchemaFixedArray> Scenes1 { get => new SchemaFixedArray>(_Handle, 0x6DF51C6D2B7EE872, 16, 4, 4); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CSeqMultiFetchImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CSeqMultiFetchImpl.cs index 76b0d2f2..f16b232b 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CSeqMultiFetchImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CSeqMultiFetchImpl.cs @@ -21,10 +21,10 @@ public CSeqMultiFetchFlag Flags { public ref CUtlVector LocalReferenceArray { get => ref _Handle.AsRef>(Schema.GetOffset(0x3846FD6290C98686)); } -public ISchemaFixedArray GroupSize { + public ISchemaFixedArray GroupSize { get => new SchemaFixedArray(_Handle, 0x3846FD6258533CF9, 2, 4, 4); } -public ISchemaFixedArray LocalPose { + public ISchemaFixedArray LocalPose { get => new SchemaFixedArray(_Handle, 0x3846FD6270BF8111, 2, 4, 4); } public ref CUtlVector PoseKeyArray0 { @@ -42,7 +42,7 @@ public ref bool CalculatePoseParameters { public ref bool FixedBlendWeight { get => ref _Handle.AsRef(Schema.GetOffset(0x3846FD626C68A6B4)); } -public ISchemaFixedArray FixedBlendWeightVals { + public ISchemaFixedArray FixedBlendWeightVals { get => new SchemaFixedArray(_Handle, 0x3846FD6221B3BB76, 2, 4, 4); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CSkillFloatImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CSkillFloatImpl.cs index 2aa40f78..f3927999 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CSkillFloatImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CSkillFloatImpl.cs @@ -15,7 +15,7 @@ internal partial class CSkillFloatImpl : SchemaClass, CSkillFloat { public CSkillFloatImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Value { + public ISchemaFixedArray Value { get => new SchemaFixedArray(_Handle, 0x6C22E5377F437844, 4, 4, 4); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CSkillIntImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CSkillIntImpl.cs index 703b379b..72023af3 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CSkillIntImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CSkillIntImpl.cs @@ -15,7 +15,7 @@ internal partial class CSkillIntImpl : SchemaClass, CSkillInt { public CSkillIntImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Value { + public ISchemaFixedArray Value { get => new SchemaFixedArray(_Handle, 0xE86F537C7F437844, 4, 4, 4); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CTeamImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CTeamImpl.cs index 93c46b3c..8c195255 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CTeamImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CTeamImpl.cs @@ -24,7 +24,7 @@ public ref CUtlVector> Players { public ref int Score { get => ref _Handle.AsRef(Schema.GetOffset(0xAF5A77E339E7DEAE)); } -public string Teamname { + public string Teamname { get { var ptr = _Handle + Schema.GetOffset(0xAF5A77E3AA34880A); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CTimelineImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CTimelineImpl.cs index e6e397f8..d494ce2c 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CTimelineImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CTimelineImpl.cs @@ -15,10 +15,10 @@ internal partial class CTimelineImpl : IntervalTimerImpl, CTimeline { public CTimelineImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Values { + public ISchemaFixedArray Values { get => new SchemaFixedArray(_Handle, 0x36D1E6597BD8BFD5, 64, 4, 4); } -public ISchemaFixedArray ValueCounts { + public ISchemaFixedArray ValueCounts { get => new SchemaFixedArray(_Handle, 0x36D1E65961EF23CA, 64, 4, 4); } public ref int BucketCount { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CTriggerSndSosOpvarImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CTriggerSndSosOpvarImpl.cs index c4531384..8a4d3678 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CTriggerSndSosOpvarImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CTriggerSndSosOpvarImpl.cs @@ -54,21 +54,21 @@ public string OperatorName { public ref bool VolIs2D { get => ref _Handle.AsRef(Schema.GetOffset(0xD4B7BEBC384D3350)); } -public string OpvarNameChar { + public string OpvarNameChar { get { var ptr = _Handle + Schema.GetOffset(0xD4B7BEBC55F3CFF0); return Schema.GetString(ptr); } set => Schema.SetFixedString(_Handle, 0xD4B7BEBC55F3CFF0, value, 256); } -public string StackNameChar { + public string StackNameChar { get { var ptr = _Handle + Schema.GetOffset(0xD4B7BEBC87998C38); return Schema.GetString(ptr); } set => Schema.SetFixedString(_Handle, 0xD4B7BEBC87998C38, value, 256); } -public string OperatorNameChar { + public string OperatorNameChar { get { var ptr = _Handle + Schema.GetOffset(0xD4B7BEBC9824CD12); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CVoteControllerImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CVoteControllerImpl.cs index 41327504..f8d4ec13 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/CVoteControllerImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/CVoteControllerImpl.cs @@ -21,7 +21,7 @@ public ref int ActiveIssueIndex { public ref int OnlyTeamToVote { get => ref _Handle.AsRef(Schema.GetOffset(0x6F560B06C957B8C6)); } -public ISchemaFixedArray VoteOptionCount { + public ISchemaFixedArray VoteOptionCount { get => new SchemaFixedArray(_Handle, 0x6F560B0614DBD0DF, 5, 4, 4); } public ref int PotentialVotes { @@ -39,7 +39,7 @@ public CountdownTimer ExecuteCommandTimer { public CountdownTimer ResetVoteTimer { get => new CountdownTimerImpl(_Handle + Schema.GetOffset(0x6F560B06B54CD305)); } -public ISchemaFixedArray VotesCast { + public ISchemaFixedArray VotesCast { get => new SchemaFixedArray(_Handle, 0x6F560B060247527D, 64, 4, 4); } public ref uint PlayerHoldingVote { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_CreateOnModelAtHeightImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_CreateOnModelAtHeightImpl.cs index 9125462b..d49ce7cd 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_CreateOnModelAtHeightImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_CreateOnModelAtHeightImpl.cs @@ -48,7 +48,7 @@ public ref bool LocalCoords { public ref bool PreferMovingBoxes { get => ref _Handle.AsRef(Schema.GetOffset(0xBB8B79F68F1573EE)); } -public string HitboxSetName { + public string HitboxSetName { get { var ptr = _Handle + Schema.GetOffset(0xBB8B79F66A21BB0E); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_CreateOnModelImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_CreateOnModelImpl.cs index 2e50a306..c21999d7 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_CreateOnModelImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_CreateOnModelImpl.cs @@ -48,7 +48,7 @@ public ref float MaxBoneVelocity { public CParticleCollectionVecInput DirectionBias { get => new CParticleCollectionVecInputImpl(_Handle + Schema.GetOffset(0xD7E119445A1697CF)); } -public string HitboxSetName { + public string HitboxSetName { get { var ptr = _Handle + Schema.GetOffset(0xD7E119446A21BB0E); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_DistanceToCPInitImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_DistanceToCPInitImpl.cs index c391676c..5db35e5e 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_DistanceToCPInitImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_DistanceToCPInitImpl.cs @@ -36,7 +36,7 @@ public ref int StartCP { public ref bool LOS { get => ref _Handle.AsRef(Schema.GetOffset(0x59C1B9D59C25C2ED)); } -public string CollisionGroupName { + public string CollisionGroupName { get { var ptr = _Handle + Schema.GetOffset(0x59C1B9D5D58A3195); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_InitialRepulsionVelocityImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_InitialRepulsionVelocityImpl.cs index 7bf17de9..b41ec84b 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_InitialRepulsionVelocityImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_InitialRepulsionVelocityImpl.cs @@ -15,7 +15,7 @@ internal partial class C_INIT_InitialRepulsionVelocityImpl : CParticleFunctionIn public C_INIT_InitialRepulsionVelocityImpl(nint handle) : base(handle) { } -public string CollisionGroupName { + public string CollisionGroupName { get { var ptr = _Handle + Schema.GetOffset(0x562DB6BED58A3195); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_InitialVelocityFromHitboxImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_InitialVelocityFromHitboxImpl.cs index 03d52861..2a5474ec 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_InitialVelocityFromHitboxImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_InitialVelocityFromHitboxImpl.cs @@ -24,7 +24,7 @@ public ref float VelocityMax { public ref int ControlPointNumber { get => ref _Handle.AsRef(Schema.GetOffset(0x48F25F173F31A6BD)); } -public string HitboxSetName { + public string HitboxSetName { get { var ptr = _Handle + Schema.GetOffset(0x48F25F176A21BB0E); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_LifespanFromVelocityImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_LifespanFromVelocityImpl.cs index 1636e9d9..9170e83b 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_LifespanFromVelocityImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_LifespanFromVelocityImpl.cs @@ -30,7 +30,7 @@ public ref float TraceTolerance { public ref int MaxPlanes { get => ref _Handle.AsRef(Schema.GetOffset(0x50DB3853ADB06362)); } -public string CollisionGroupName { + public string CollisionGroupName { get { var ptr = _Handle + Schema.GetOffset(0x50DB3853D58A3195); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_ModelCullImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_ModelCullImpl.cs index 8e89aa7c..14be144f 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_ModelCullImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_ModelCullImpl.cs @@ -27,7 +27,7 @@ public ref bool CullOutside { public ref bool UseBones { get => ref _Handle.AsRef(Schema.GetOffset(0xE9ECCC6B10D1938B)); } -public string HitboxSetName { + public string HitboxSetName { get { var ptr = _Handle + Schema.GetOffset(0xE9ECCC6B6A21BB0E); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_PositionPlaceOnGroundImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_PositionPlaceOnGroundImpl.cs index 637904d0..469b7aba 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_PositionPlaceOnGroundImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_PositionPlaceOnGroundImpl.cs @@ -21,7 +21,7 @@ public CPerParticleFloatInput Offset { public CPerParticleFloatInput MaxTraceLength { get => new CPerParticleFloatInputImpl(_Handle + Schema.GetOffset(0xA022821E543C3798)); } -public string CollisionGroupName { + public string CollisionGroupName { get { var ptr = _Handle + Schema.GetOffset(0xA022821ED58A3195); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_RandomModelSequenceImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_RandomModelSequenceImpl.cs index aa32cd92..ee624429 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_RandomModelSequenceImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_RandomModelSequenceImpl.cs @@ -15,14 +15,14 @@ internal partial class C_INIT_RandomModelSequenceImpl : CParticleFunctionInitial public C_INIT_RandomModelSequenceImpl(nint handle) : base(handle) { } -public string ActivityName { + public string ActivityName { get { var ptr = _Handle + Schema.GetOffset(0x2F450DC3BF0C5087); return Schema.GetString(ptr); } set => Schema.SetFixedString(_Handle, 0x2F450DC3BF0C5087, value, 256); } -public string SequenceName { + public string SequenceName { get { var ptr = _Handle + Schema.GetOffset(0x2F450DC3A270F66B); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_RtEnvCullImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_RtEnvCullImpl.cs index 90141f8f..dfcdf188 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_RtEnvCullImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_RtEnvCullImpl.cs @@ -30,7 +30,7 @@ public ref bool CullOnMiss { public ref bool LifeAdjust { get => ref _Handle.AsRef(Schema.GetOffset(0xEA96DD4FA38568F0)); } -public string RtEnvName { + public string RtEnvName { get { var ptr = _Handle + Schema.GetOffset(0xEA96DD4FC32A9775); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_SetHitboxToClosestImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_SetHitboxToClosestImpl.cs index efad8b78..98863078 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_SetHitboxToClosestImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_SetHitboxToClosestImpl.cs @@ -24,7 +24,7 @@ public ref int DesiredHitbox { public CParticleCollectionVecInput HitBoxScale { get => new CParticleCollectionVecInputImpl(_Handle + Schema.GetOffset(0x10F3322C58EE3FB7)); } -public string HitboxSetName { + public string HitboxSetName { get { var ptr = _Handle + Schema.GetOffset(0x10F3322C6A21BB0E); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_SetHitboxToModelImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_SetHitboxToModelImpl.cs index c1ec177f..ae87af29 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_SetHitboxToModelImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_INIT_SetHitboxToModelImpl.cs @@ -39,7 +39,7 @@ public ref bool MaintainHitbox { public ref bool UseBones { get => ref _Handle.AsRef(Schema.GetOffset(0x7129E7BA10D1938B)); } -public string HitboxSetName { + public string HitboxSetName { get { var ptr = _Handle + Schema.GetOffset(0x7129E7BA6A21BB0E); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_DistanceBetweenCPsToCPImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_DistanceBetweenCPsToCPImpl.cs index f47117dc..e83df091 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_DistanceBetweenCPsToCPImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_DistanceBetweenCPsToCPImpl.cs @@ -51,7 +51,7 @@ public ref float LOSScale { public ref bool LOS { get => ref _Handle.AsRef(Schema.GetOffset(0x379849D89C25C2ED)); } -public string CollisionGroupName { + public string CollisionGroupName { get { var ptr = _Handle + Schema.GetOffset(0x379849D8D58A3195); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_DistanceBetweenTransformsImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_DistanceBetweenTransformsImpl.cs index 23794853..2a3e1f50 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_DistanceBetweenTransformsImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_DistanceBetweenTransformsImpl.cs @@ -42,7 +42,7 @@ public ref float MaxTraceLength { public ref float LOSScale { get => ref _Handle.AsRef(Schema.GetOffset(0x60A44933259F6F3B)); } -public string CollisionGroupName { + public string CollisionGroupName { get { var ptr = _Handle + Schema.GetOffset(0x60A44933D58A3195); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_DistanceToTransformImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_DistanceToTransformImpl.cs index e081d488..558ef51b 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_DistanceToTransformImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_DistanceToTransformImpl.cs @@ -36,7 +36,7 @@ public CParticleTransformInput TransformStart { public ref bool LOS { get => ref _Handle.AsRef(Schema.GetOffset(0x4E4425499C25C2ED)); } -public string CollisionGroupName { + public string CollisionGroupName { get { var ptr = _Handle + Schema.GetOffset(0x4E442549D58A3195); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_LockToBoneImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_LockToBoneImpl.cs index f67484b9..55e26488 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_LockToBoneImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_LockToBoneImpl.cs @@ -33,7 +33,7 @@ public ref float JumpThreshold { public ref float PrevPosScale { get => ref _Handle.AsRef(Schema.GetOffset(0xF6C2B94D46CED122)); } -public string HitboxSetName { + public string HitboxSetName { get { var ptr = _Handle + Schema.GetOffset(0xF6C2B94D6A21BB0E); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_ModelCullImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_ModelCullImpl.cs index 8dfb3f26..4ec63dc9 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_ModelCullImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_ModelCullImpl.cs @@ -27,7 +27,7 @@ public ref bool CullOutside { public ref bool UseBones { get => ref _Handle.AsRef(Schema.GetOffset(0xED02878A10D1938B)); } -public string HitboxSetName { + public string HitboxSetName { get { var ptr = _Handle + Schema.GetOffset(0xED02878A6A21BB0E); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_ModelDampenMovementImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_ModelDampenMovementImpl.cs index 6ac9191b..60dedbd6 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_ModelDampenMovementImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_ModelDampenMovementImpl.cs @@ -27,7 +27,7 @@ public ref bool Outside { public ref bool UseBones { get => ref _Handle.AsRef(Schema.GetOffset(0x74BD8BB610D1938B)); } -public string HitboxSetName { + public string HitboxSetName { get { var ptr = _Handle + Schema.GetOffset(0x74BD8BB66A21BB0E); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_MoveToHitboxImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_MoveToHitboxImpl.cs index 7a3046c2..f5d73f36 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_MoveToHitboxImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_MoveToHitboxImpl.cs @@ -30,7 +30,7 @@ public ref float LifeTimeLerpEnd { public ref float PrevPosScale { get => ref _Handle.AsRef(Schema.GetOffset(0x4ACEA8FF46CED122)); } -public string HitboxSetName { + public string HitboxSetName { get { var ptr = _Handle + Schema.GetOffset(0x4ACEA8FF6A21BB0E); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_MovementPlaceOnGroundImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_MovementPlaceOnGroundImpl.cs index c6d5f4b1..e0a9e412 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_MovementPlaceOnGroundImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_MovementPlaceOnGroundImpl.cs @@ -30,7 +30,7 @@ public ref float TraceOffset { public ref float LerpRate { get => ref _Handle.AsRef(Schema.GetOffset(0x53323DE938B06C64)); } -public string CollisionGroupName { + public string CollisionGroupName { get { var ptr = _Handle + Schema.GetOffset(0x53323DE9D58A3195); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_RemapAverageHitboxSpeedtoCPImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_RemapAverageHitboxSpeedtoCPImpl.cs index f5bba24e..d2e7f181 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_RemapAverageHitboxSpeedtoCPImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_RemapAverageHitboxSpeedtoCPImpl.cs @@ -45,7 +45,7 @@ public ref int HeightControlPointNumber { public CParticleCollectionVecInput ComparisonVelocity { get => new CParticleCollectionVecInputImpl(_Handle + Schema.GetOffset(0xE6055FBC23BF409F)); } -public string HitboxSetName { + public string HitboxSetName { get { var ptr = _Handle + Schema.GetOffset(0xE6055FBC6A21BB0E); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_RenderModelsImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_RenderModelsImpl.cs index f15419d2..2514f58f 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_RenderModelsImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_RenderModelsImpl.cs @@ -93,14 +93,14 @@ public ParticleAttributeIndex_t AnimationField { public ParticleAttributeIndex_t ManualFrameField { get => new ParticleAttributeIndex_tImpl(_Handle + Schema.GetOffset(0xC58C7B1352FAE698)); } -public string ActivityName { + public string ActivityName { get { var ptr = _Handle + Schema.GetOffset(0xC58C7B13BF0C5087); return Schema.GetString(ptr); } set => Schema.SetFixedString(_Handle, 0xC58C7B13BF0C5087, value, 256); } -public string SequenceName { + public string SequenceName { get { var ptr = _Handle + Schema.GetOffset(0xC58C7B13A270F66B); return Schema.GetString(ptr); @@ -110,7 +110,7 @@ public string SequenceName { public ref bool EnableClothSimulation { get => ref _Handle.AsRef(Schema.GetOffset(0xC58C7B13F2B3D0A9)); } -public string ClothEffectName { + public string ClothEffectName { get { var ptr = _Handle + Schema.GetOffset(0xC58C7B139D0B2FCD); return Schema.GetString(ptr); @@ -141,7 +141,7 @@ public CParticleModelInput ModelInput { public ref int LOD { get => ref _Handle.AsRef(Schema.GetOffset(0xC58C7B138303A434)); } -public string EconSlotName { + public string EconSlotName { get { var ptr = _Handle + Schema.GetOffset(0xC58C7B13F7A43C9B); return Schema.GetString(ptr); @@ -175,7 +175,7 @@ public ref bool DoNotDrawInParticlePass { public ref bool AllowApproximateTransforms { get => ref _Handle.AsRef(Schema.GetOffset(0xC58C7B136C6ACC65)); } -public string RenderAttribute { + public string RenderAttribute { get { var ptr = _Handle + Schema.GetOffset(0xC58C7B13A343F648); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_RenderSoundImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_RenderSoundImpl.cs index bc44a648..f06df19b 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_RenderSoundImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_RenderSoundImpl.cs @@ -45,7 +45,7 @@ public ref int Channel { public ref int CPReference { get => ref _Handle.AsRef(Schema.GetOffset(0xBDBBFDFC1349FFE7)); } -public string SoundName { + public string SoundName { get { var ptr = _Handle + Schema.GetOffset(0xBDBBFDFC26D82A1A); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_RtEnvCullImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_RtEnvCullImpl.cs index 11322272..e697cd1d 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_RtEnvCullImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_RtEnvCullImpl.cs @@ -27,7 +27,7 @@ public ref bool CullOnMiss { public ref bool StickInsteadOfCull { get => ref _Handle.AsRef(Schema.GetOffset(0x72531BAE343222A2)); } -public string RtEnvName { + public string RtEnvName { get { var ptr = _Handle + Schema.GetOffset(0x72531BAEC32A9775); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_SetCPOrientationToGroundNormalImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_SetCPOrientationToGroundNormalImpl.cs index 47051f86..bc305b5f 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_SetCPOrientationToGroundNormalImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_SetCPOrientationToGroundNormalImpl.cs @@ -27,7 +27,7 @@ public ref float Tolerance { public ref float TraceOffset { get => ref _Handle.AsRef(Schema.GetOffset(0x7BC52DA37EF6C397)); } -public string CollisionGroupName { + public string CollisionGroupName { get { var ptr = _Handle + Schema.GetOffset(0x7BC52DA3D58A3195); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_SetControlPointPositionToTimeOfDayValueImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_SetControlPointPositionToTimeOfDayValueImpl.cs index 7177d4a1..acf0c90e 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_SetControlPointPositionToTimeOfDayValueImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_SetControlPointPositionToTimeOfDayValueImpl.cs @@ -18,7 +18,7 @@ public C_OP_SetControlPointPositionToTimeOfDayValueImpl(nint handle) : base(hand public ref int ControlPointNumber { get => ref _Handle.AsRef(Schema.GetOffset(0x976831CB3F31A6BD)); } -public string TimeOfDayParameter { + public string TimeOfDayParameter { get { var ptr = _Handle + Schema.GetOffset(0x976831CB5B5E9DD3); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_SetControlPointToImpactPointImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_SetControlPointToImpactPointImpl.cs index 418d4f90..cbc4cc25 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_SetControlPointToImpactPointImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_SetControlPointToImpactPointImpl.cs @@ -36,7 +36,7 @@ public ref float Offset { public ref Vector TraceDir { get => ref _Handle.AsRef(Schema.GetOffset(0x5ED2C481B3F09745)); } -public string CollisionGroupName { + public string CollisionGroupName { get { var ptr = _Handle + Schema.GetOffset(0x5ED2C481D58A3195); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_SetControlPointsToModelParticlesImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_SetControlPointsToModelParticlesImpl.cs index c78f74d5..7f1e3625 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_SetControlPointsToModelParticlesImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_SetControlPointsToModelParticlesImpl.cs @@ -15,14 +15,14 @@ internal partial class C_OP_SetControlPointsToModelParticlesImpl : CParticleFunc public C_OP_SetControlPointsToModelParticlesImpl(nint handle) : base(handle) { } -public string HitboxSetName { + public string HitboxSetName { get { var ptr = _Handle + Schema.GetOffset(0x8850EF6A6A21BB0E); return Schema.GetString(ptr); } set => Schema.SetFixedString(_Handle, 0x8850EF6A6A21BB0E, value, 128); } -public string AttachmentName { + public string AttachmentName { get { var ptr = _Handle + Schema.GetOffset(0x8850EF6A9CFCA76B); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_WorldTraceConstraintImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_WorldTraceConstraintImpl.cs index 8192ef3c..037a637a 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_WorldTraceConstraintImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/C_OP_WorldTraceConstraintImpl.cs @@ -30,7 +30,7 @@ public ref ParticleCollisionMode_t CollisionModeMin { public ref ParticleTraceSet_t TraceSet { get => ref _Handle.AsRef(Schema.GetOffset(0xD88A859FBD26C5B2)); } -public string CollisionGroupName { + public string CollisionGroupName { get { var ptr = _Handle + Schema.GetOffset(0xD88A859FD58A3195); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/Dop26_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/Dop26_tImpl.cs index 8e7a2ec2..42130ea5 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/Dop26_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/Dop26_tImpl.cs @@ -15,7 +15,7 @@ internal partial class Dop26_tImpl : SchemaClass, Dop26_t { public Dop26_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Support { + public ISchemaFixedArray Support { get => new SchemaFixedArray(_Handle, 0xBBAD032FAD766CEA, 26, 4, 4); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/EntitySpottedState_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/EntitySpottedState_tImpl.cs index 85f681ba..65f96117 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/EntitySpottedState_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/EntitySpottedState_tImpl.cs @@ -18,7 +18,7 @@ public EntitySpottedState_tImpl(nint handle) : base(handle) { public ref bool Spotted { get => ref _Handle.AsRef(Schema.GetOffset(0x6E33B0176DE4F1CA)); } -public ISchemaFixedArray SpottedByMask { + public ISchemaFixedArray SpottedByMask { get => new SchemaFixedArray(_Handle, 0x6E33B0170BD77207, 2, 4, 4); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeAnimStrayRadius_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeAnimStrayRadius_tImpl.cs index 406887e1..38506c23 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeAnimStrayRadius_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeAnimStrayRadius_tImpl.cs @@ -15,7 +15,7 @@ internal partial class FeAnimStrayRadius_tImpl : SchemaClass, FeAnimStrayRadius_ public FeAnimStrayRadius_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Node { + public ISchemaFixedArray Node { get => new SchemaFixedArray(_Handle, 0xF06BE9BCD6694B9, 2, 2, 2); } public ref float MaxDist { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeAxialEdgeBend_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeAxialEdgeBend_tImpl.cs index b082e56b..f17dee9d 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeAxialEdgeBend_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeAxialEdgeBend_tImpl.cs @@ -24,10 +24,10 @@ public ref float Tv { public ref float Dist { get => ref _Handle.AsRef(Schema.GetOffset(0x6CF84D701234268F)); } -public ISchemaFixedArray Weight { + public ISchemaFixedArray Weight { get => new SchemaFixedArray(_Handle, 0x6CF84D70CFFC66CB, 4, 4, 4); } -public ISchemaFixedArray Node { + public ISchemaFixedArray Node { get => new SchemaFixedArray(_Handle, 0x6CF84D70CD6694B9, 6, 2, 2); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeBandBendLimit_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeBandBendLimit_tImpl.cs index 2433b137..280e94a3 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeBandBendLimit_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeBandBendLimit_tImpl.cs @@ -21,7 +21,7 @@ public ref float DistMin { public ref float DistMax { get => ref _Handle.AsRef(Schema.GetOffset(0xB6674060F7C250C7)); } -public ISchemaFixedArray Node { + public ISchemaFixedArray Node { get => new SchemaFixedArray(_Handle, 0xB6674060CD6694B9, 6, 2, 2); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeEdgeDesc_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeEdgeDesc_tImpl.cs index 29efef58..8c436204 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeEdgeDesc_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeEdgeDesc_tImpl.cs @@ -15,13 +15,13 @@ internal partial class FeEdgeDesc_tImpl : SchemaClass, FeEdgeDesc_t { public FeEdgeDesc_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Edge { + public ISchemaFixedArray Edge { get => new SchemaFixedArray(_Handle, 0xD483120F9FB47768, 2, 2, 2); } public SchemaUntypedField Side { get => new SchemaUntypedField(_Handle + Schema.GetOffset(0xD483120FA0D97E1A)); } -public ISchemaFixedArray VirtElem { + public ISchemaFixedArray VirtElem { get => new SchemaFixedArray(_Handle, 0xD483120F64A695A5, 2, 2, 2); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeHingeLimitBuild_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeHingeLimitBuild_tImpl.cs index f55aa08f..367c43d5 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeHingeLimitBuild_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeHingeLimitBuild_tImpl.cs @@ -15,7 +15,7 @@ internal partial class FeHingeLimitBuild_tImpl : SchemaClass, FeHingeLimitBuild_ public FeHingeLimitBuild_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Node { + public ISchemaFixedArray Node { get => new SchemaFixedArray(_Handle, 0x50E120ADCD6694B9, 6, 2, 2); } public ref uint Flags { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeHingeLimit_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeHingeLimit_tImpl.cs index 06924655..c81b16aa 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeHingeLimit_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeHingeLimit_tImpl.cs @@ -15,7 +15,7 @@ internal partial class FeHingeLimit_tImpl : SchemaClass, FeHingeLimit_t { public FeHingeLimit_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Node { + public ISchemaFixedArray Node { get => new SchemaFixedArray(_Handle, 0x3E7F1FF5CD6694B9, 6, 2, 2); } public ref uint Flags { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeKelagerBend2_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeKelagerBend2_tImpl.cs index d4abe29d..6bfa6b5c 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeKelagerBend2_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeKelagerBend2_tImpl.cs @@ -15,13 +15,13 @@ internal partial class FeKelagerBend2_tImpl : SchemaClass, FeKelagerBend2_t { public FeKelagerBend2_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Weight { + public ISchemaFixedArray Weight { get => new SchemaFixedArray(_Handle, 0x702E10E1CFFC66CB, 3, 4, 4); } public ref float Height0 { get => ref _Handle.AsRef(Schema.GetOffset(0x702E10E1AA7896A0)); } -public ISchemaFixedArray Node { + public ISchemaFixedArray Node { get => new SchemaFixedArray(_Handle, 0x702E10E1CD6694B9, 3, 2, 2); } public ref ushort Reserved { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeNodeBase_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeNodeBase_tImpl.cs index 8f55d420..a99fcbdc 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeNodeBase_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeNodeBase_tImpl.cs @@ -18,7 +18,7 @@ public FeNodeBase_tImpl(nint handle) : base(handle) { public ref ushort Node { get => ref _Handle.AsRef(Schema.GetOffset(0x74CA29BECD6694B9)); } -public ISchemaFixedArray Dummy { + public ISchemaFixedArray Dummy { get => new SchemaFixedArray(_Handle, 0x74CA29BECD8BAE5F, 3, 2, 2); } public ref ushort NodeX0 { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeQuad_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeQuad_tImpl.cs index 8551aa8c..296656dd 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeQuad_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeQuad_tImpl.cs @@ -15,13 +15,13 @@ internal partial class FeQuad_tImpl : SchemaClass, FeQuad_t { public FeQuad_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Node { + public ISchemaFixedArray Node { get => new SchemaFixedArray(_Handle, 0x22A47BB8CD6694B9, 4, 2, 2); } public ref float Slack { get => ref _Handle.AsRef(Schema.GetOffset(0x22A47BB8C6554869)); } -public ISchemaFixedArray Shape { + public ISchemaFixedArray Shape { get => new SchemaFixedArray(_Handle, 0x22A47BB8E159551A, 4, 16, 4); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeRodConstraint_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeRodConstraint_tImpl.cs index 9f147909..0b56a4e7 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeRodConstraint_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeRodConstraint_tImpl.cs @@ -15,7 +15,7 @@ internal partial class FeRodConstraint_tImpl : SchemaClass, FeRodConstraint_t { public FeRodConstraint_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Node { + public ISchemaFixedArray Node { get => new SchemaFixedArray(_Handle, 0xC672146DCD6694B9, 2, 2, 2); } public ref float MaxDist { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeSimdNodeBase_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeSimdNodeBase_tImpl.cs index 131f0e4a..5789de2f 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeSimdNodeBase_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeSimdNodeBase_tImpl.cs @@ -15,22 +15,22 @@ internal partial class FeSimdNodeBase_tImpl : SchemaClass, FeSimdNodeBase_t { public FeSimdNodeBase_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Node { + public ISchemaFixedArray Node { get => new SchemaFixedArray(_Handle, 0x8B863723CD6694B9, 4, 2, 2); } -public ISchemaFixedArray NodeX0 { + public ISchemaFixedArray NodeX0 { get => new SchemaFixedArray(_Handle, 0x8B86372381C7FEB9, 4, 2, 2); } -public ISchemaFixedArray NodeX1 { + public ISchemaFixedArray NodeX1 { get => new SchemaFixedArray(_Handle, 0x8B86372380C7FD26, 4, 2, 2); } -public ISchemaFixedArray NodeY0 { + public ISchemaFixedArray NodeY0 { get => new SchemaFixedArray(_Handle, 0x8B8637237BC5B6B0, 4, 2, 2); } -public ISchemaFixedArray NodeY1 { + public ISchemaFixedArray NodeY1 { get => new SchemaFixedArray(_Handle, 0x8B8637237CC5B843, 4, 2, 2); } -public ISchemaFixedArray Dummy { + public ISchemaFixedArray Dummy { get => new SchemaFixedArray(_Handle, 0x8B863723CD8BAE5F, 4, 2, 2); } public FourQuaternions Adjust { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeSimdQuad_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeSimdQuad_tImpl.cs index a0e0eda1..0953c656 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeSimdQuad_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeSimdQuad_tImpl.cs @@ -21,10 +21,10 @@ public SchemaUntypedField Node { public ref fltx4 F4Slack { get => ref _Handle.AsRef(Schema.GetOffset(0xB82B061DBBFE3561)); } -public ISchemaFixedArray Shape { + public ISchemaFixedArray Shape { get => new SchemaFixedArray(_Handle, 0xB82B061DE159551A, 4, 48, 16); } -public ISchemaFixedArray F4Weights { + public ISchemaFixedArray F4Weights { get => new SchemaFixedArray(_Handle, 0xB82B061DDCFBCC00, 4, 16, 16); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeSourceEdge_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeSourceEdge_tImpl.cs index d9b72f72..a6e5aed3 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeSourceEdge_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeSourceEdge_tImpl.cs @@ -15,7 +15,7 @@ internal partial class FeSourceEdge_tImpl : SchemaClass, FeSourceEdge_t { public FeSourceEdge_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Node { + public ISchemaFixedArray Node { get => new SchemaFixedArray(_Handle, 0x88268BD3CD6694B9, 2, 2, 2); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeSpringIntegrator_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeSpringIntegrator_tImpl.cs index 6be45648..5f251581 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeSpringIntegrator_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeSpringIntegrator_tImpl.cs @@ -15,7 +15,7 @@ internal partial class FeSpringIntegrator_tImpl : SchemaClass, FeSpringIntegrato public FeSpringIntegrator_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Node { + public ISchemaFixedArray Node { get => new SchemaFixedArray(_Handle, 0xFC6DF38BCD6694B9, 2, 2, 2); } public ref float SpringRestLength { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeStiffHingeBuild_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeStiffHingeBuild_tImpl.cs index 6fc3d787..32d7ab3c 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeStiffHingeBuild_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeStiffHingeBuild_tImpl.cs @@ -21,10 +21,10 @@ public ref float MaxAngle { public ref float Strength { get => ref _Handle.AsRef(Schema.GetOffset(0x41A81A58AFA3323A)); } -public ISchemaFixedArray MotionBias { + public ISchemaFixedArray MotionBias { get => new SchemaFixedArray(_Handle, 0x41A81A582CDDBF14, 3, 4, 4); } -public ISchemaFixedArray Node { + public ISchemaFixedArray Node { get => new SchemaFixedArray(_Handle, 0x41A81A58CD6694B9, 3, 2, 2); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeTaperedCapsuleRigid_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeTaperedCapsuleRigid_tImpl.cs index cb348758..48451f0f 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeTaperedCapsuleRigid_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeTaperedCapsuleRigid_tImpl.cs @@ -15,7 +15,7 @@ internal partial class FeTaperedCapsuleRigid_tImpl : SchemaClass, FeTaperedCapsu public FeTaperedCapsuleRigid_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Sphere { + public ISchemaFixedArray Sphere { get => new SchemaFixedArray(_Handle, 0x4B2017EE9E2AC48C, 2, 16, 16); } public ref ushort Node { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeTaperedCapsuleStretch_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeTaperedCapsuleStretch_tImpl.cs index c0998d43..36c56c06 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeTaperedCapsuleStretch_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeTaperedCapsuleStretch_tImpl.cs @@ -15,7 +15,7 @@ internal partial class FeTaperedCapsuleStretch_tImpl : SchemaClass, FeTaperedCap public FeTaperedCapsuleStretch_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Node { + public ISchemaFixedArray Node { get => new SchemaFixedArray(_Handle, 0x627474D0CD6694B9, 2, 2, 2); } public ref ushort CollisionMask { @@ -24,7 +24,7 @@ public ref ushort CollisionMask { public ref ushort Dummy { get => ref _Handle.AsRef(Schema.GetOffset(0x627474D0CD8BAE5F)); } -public ISchemaFixedArray Radius { + public ISchemaFixedArray Radius { get => new SchemaFixedArray(_Handle, 0x627474D095FBF7AD, 2, 4, 4); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeTreeChildren_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeTreeChildren_tImpl.cs index 2d224cc7..b374de19 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeTreeChildren_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeTreeChildren_tImpl.cs @@ -15,7 +15,7 @@ internal partial class FeTreeChildren_tImpl : SchemaClass, FeTreeChildren_t { public FeTreeChildren_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Child { + public ISchemaFixedArray Child { get => new SchemaFixedArray(_Handle, 0xD4BAF4A0E8CD59A1, 2, 2, 2); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeTri_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeTri_tImpl.cs index 6e7ea5c2..5d85f8e1 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeTri_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/FeTri_tImpl.cs @@ -15,7 +15,7 @@ internal partial class FeTri_tImpl : SchemaClass, FeTri_t { public FeTri_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Node { + public ISchemaFixedArray Node { get => new SchemaFixedArray(_Handle, 0x75C07D86CD6694B9, 3, 2, 2); } public ref float W1 { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/OldFeEdge_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/OldFeEdge_tImpl.cs index 21c149f3..92fcf754 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/OldFeEdge_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/OldFeEdge_tImpl.cs @@ -15,7 +15,7 @@ internal partial class OldFeEdge_tImpl : SchemaClass, OldFeEdge_t { public OldFeEdge_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray K { + public ISchemaFixedArray K { get => new SchemaFixedArray(_Handle, 0xBAF074C17C12054C, 3, 4, 4); } public ref float InvA { @@ -45,10 +45,10 @@ public ref float C04 { public ref float AxialModelDist { get => ref _Handle.AsRef(Schema.GetOffset(0xBAF074C1E53980E9)); } -public ISchemaFixedArray AxialModelWeights { + public ISchemaFixedArray AxialModelWeights { get => new SchemaFixedArray(_Handle, 0xBAF074C1D9CDB73E, 4, 4, 4); } -public ISchemaFixedArray Node { + public ISchemaFixedArray Node { get => new SchemaFixedArray(_Handle, 0xBAF074C1F6FB9B19, 4, 2, 2); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/PostProcessingBloomParameters_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/PostProcessingBloomParameters_tImpl.cs index 663f42ae..dc0841a2 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/PostProcessingBloomParameters_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/PostProcessingBloomParameters_tImpl.cs @@ -57,10 +57,10 @@ public ref float ComputeBloomLensDirtStrength { public ref float ComputeBloomLensDirtBlackLevel { get => ref _Handle.AsRef(Schema.GetOffset(0x30F41F3CB4FB5025)); } -public ISchemaFixedArray BlurWeight { + public ISchemaFixedArray BlurWeight { get => new SchemaFixedArray(_Handle, 0x30F41F3CAF5FB432, 5, 4, 4); } -public ISchemaFixedArray BlurTint { + public ISchemaFixedArray BlurTint { get => new SchemaFixedArray(_Handle, 0x30F41F3CC8FE1D49, 5, 12, 4); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/RenderHairStrandInfo_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/RenderHairStrandInfo_tImpl.cs index 60f190e5..79716964 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/RenderHairStrandInfo_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/RenderHairStrandInfo_tImpl.cs @@ -15,16 +15,16 @@ internal partial class RenderHairStrandInfo_tImpl : SchemaClass, RenderHairStran public RenderHairStrandInfo_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray GuideHairIndices_nSurfaceTriIndex { + public ISchemaFixedArray GuideHairIndices_nSurfaceTriIndex { get => new SchemaFixedArray(_Handle, 0x9037AEC699AC7193, 2, 4, 4); } -public ISchemaFixedArray GuideBary_vBaseBary { + public ISchemaFixedArray GuideBary_vBaseBary { get => new SchemaFixedArray(_Handle, 0x9037AEC6B3848BF7, 4, 2, 2); } -public ISchemaFixedArray RootOffset_flLengthScale { + public ISchemaFixedArray RootOffset_flLengthScale { get => new SchemaFixedArray(_Handle, 0x9037AEC67324D845, 4, 2, 2); } -public ISchemaFixedArray PackedBaseUv { + public ISchemaFixedArray PackedBaseUv { get => new SchemaFixedArray(_Handle, 0x9037AEC6D5457D8B, 2, 2, 2); } public ref uint PackedSurfaceNormalOs { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/RenderInputLayoutField_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/RenderInputLayoutField_tImpl.cs index 71d73ca0..7a834eb9 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/RenderInputLayoutField_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/RenderInputLayoutField_tImpl.cs @@ -15,7 +15,7 @@ internal partial class RenderInputLayoutField_tImpl : SchemaClass, RenderInputLa public RenderInputLayoutField_tImpl(nint handle) : base(handle) { } -public string SemanticName { + public string SemanticName { get { var ptr = _Handle + Schema.GetOffset(0x752C88F08F25E44C); return Schema.GetString(ptr); @@ -34,7 +34,7 @@ public ref byte Slot { public ref RenderSlotType_t SlotType { get => ref _Handle.AsRef(Schema.GetOffset(0x752C88F05072B95D)); } -public string ShaderSemantic { + public string ShaderSemantic { get { var ptr = _Handle + Schema.GetOffset(0x752C88F0897CAA95); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnBodyDesc_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnBodyDesc_tImpl.cs index f9d09a33..984c7c8a 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnBodyDesc_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnBodyDesc_tImpl.cs @@ -37,7 +37,7 @@ public ref Vector AngularVelocity { public ref Vector LocalMassCenter { get => ref _Handle.AsRef(Schema.GetOffset(0xB8BC9637AFDB4EDD)); } -public ISchemaFixedArray LocalInertiaInv { + public ISchemaFixedArray LocalInertiaInv { get => new SchemaFixedArray(_Handle, 0xB8BC9637AF2EEFAD, 3, 12, 4); } public ref float MassInv { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnCapsule_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnCapsule_tImpl.cs index d9e8d696..b83048cf 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnCapsule_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnCapsule_tImpl.cs @@ -15,7 +15,7 @@ internal partial class RnCapsule_tImpl : SchemaClass, RnCapsule_t { public RnCapsule_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Center { + public ISchemaFixedArray Center { get => new SchemaFixedArray(_Handle, 0xA2412C03C82A5908, 2, 12, 4); } public ref float Radius { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnSoftbodyCapsule_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnSoftbodyCapsule_tImpl.cs index 75f50c68..14e55e21 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnSoftbodyCapsule_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnSoftbodyCapsule_tImpl.cs @@ -15,13 +15,13 @@ internal partial class RnSoftbodyCapsule_tImpl : SchemaClass, RnSoftbodyCapsule_ public RnSoftbodyCapsule_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Center { + public ISchemaFixedArray Center { get => new SchemaFixedArray(_Handle, 0x896978BC82A5908, 2, 12, 4); } public ref float Radius { get => ref _Handle.AsRef(Schema.GetOffset(0x896978B5ACFC08D)); } -public ISchemaFixedArray Particle { + public ISchemaFixedArray Particle { get => new SchemaFixedArray(_Handle, 0x896978B863A8E83, 2, 2, 2); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnSoftbodySpring_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnSoftbodySpring_tImpl.cs index e32e5ba0..15fd7907 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnSoftbodySpring_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnSoftbodySpring_tImpl.cs @@ -15,7 +15,7 @@ internal partial class RnSoftbodySpring_tImpl : SchemaClass, RnSoftbodySpring_t public RnSoftbodySpring_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Particle { + public ISchemaFixedArray Particle { get => new SchemaFixedArray(_Handle, 0xAB4E9C9B863A8E83, 2, 2, 2); } public ref float Length { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnTriangle_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnTriangle_tImpl.cs index 42ea8886..c3a8262a 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnTriangle_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnTriangle_tImpl.cs @@ -15,7 +15,7 @@ internal partial class RnTriangle_tImpl : SchemaClass, RnTriangle_t { public RnTriangle_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Index { + public ISchemaFixedArray Index { get => new SchemaFixedArray(_Handle, 0x2136F8E2B73DBE67, 3, 4, 4); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnWing_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnWing_tImpl.cs index b67a2c09..61330b44 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnWing_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/RnWing_tImpl.cs @@ -15,7 +15,7 @@ internal partial class RnWing_tImpl : SchemaClass, RnWing_t { public RnWing_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray Index { + public ISchemaFixedArray Index { get => new SchemaFixedArray(_Handle, 0xED8A9D45B73DBE67, 3, 4, 4); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/SampleCodeImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/SampleCodeImpl.cs index 05f71473..87eade09 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/SampleCodeImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/SampleCodeImpl.cs @@ -15,7 +15,7 @@ internal partial class SampleCodeImpl : SchemaClass, SampleCode { public SampleCodeImpl(nint handle) : base(handle) { } -public ISchemaFixedArray SubCode { + public ISchemaFixedArray SubCode { get => new SchemaFixedArray(_Handle, 0x6387E3865AD6C244, 8, 1, 1); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/SceneObject_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/SceneObject_tImpl.cs index 490c693f..bce1b521 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/SceneObject_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/SceneObject_tImpl.cs @@ -18,7 +18,7 @@ public SceneObject_tImpl(nint handle) : base(handle) { public ref uint ObjectID { get => ref _Handle.AsRef(Schema.GetOffset(0xD71D99937D1B0793)); } -public ISchemaFixedArray Transform { + public ISchemaFixedArray Transform { get => new SchemaFixedArray(_Handle, 0xD71D9993EAAE256F, 3, 16, 4); } public ref float FadeStartDistance { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/SimpleConstraintSoundProfileImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/SimpleConstraintSoundProfileImpl.cs index bd56bbde..e5cb9000 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/SimpleConstraintSoundProfileImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/SimpleConstraintSoundProfileImpl.cs @@ -18,10 +18,10 @@ public SimpleConstraintSoundProfileImpl(nint handle) : base(handle) { public ref SimpleConstraintSoundProfile__SimpleConstraintsSoundProfileKeypoints_t Keypoints { get => ref _Handle.AsRef(Schema.GetOffset(0xB768AA94AE55150C)); } -public ISchemaFixedArray KeyPoints { + public ISchemaFixedArray KeyPoints { get => new SchemaFixedArray(_Handle, 0xB768AA9449DA0463, 2, 4, 4); } -public ISchemaFixedArray ReversalSoundThresholds { + public ISchemaFixedArray ReversalSoundThresholds { get => new SchemaFixedArray(_Handle, 0xB768AA9405E06766, 3, 4, 4); } diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/VPhysXConstraintParams_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/VPhysXConstraintParams_tImpl.cs index b61667d9..53b94e08 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/VPhysXConstraintParams_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/VPhysXConstraintParams_tImpl.cs @@ -27,7 +27,7 @@ public ref byte RotateMotion { public ref byte Flags { get => ref _Handle.AsRef(Schema.GetOffset(0xF2BDF6ADCE6E9C28)); } -public ISchemaFixedArray Anchor { + public ISchemaFixedArray Anchor { get => new SchemaFixedArray(_Handle, 0xF2BDF6AD23E10E54, 2, 12, 4); } public SchemaUntypedField Axes { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/VsInputSignatureElement_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/VsInputSignatureElement_tImpl.cs index 07ba805b..ed46dd47 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/VsInputSignatureElement_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/VsInputSignatureElement_tImpl.cs @@ -15,21 +15,21 @@ internal partial class VsInputSignatureElement_tImpl : SchemaClass, VsInputSigna public VsInputSignatureElement_tImpl(nint handle) : base(handle) { } -public string Name { + public string Name { get { var ptr = _Handle + Schema.GetOffset(0xFD3BBE5B5B47C92C); return Schema.GetString(ptr); } set => Schema.SetFixedString(_Handle, 0xFD3BBE5B5B47C92C, value, 64); } -public string Semantic { + public string Semantic { get { var ptr = _Handle + Schema.GetOffset(0xFD3BBE5B14684E6F); return Schema.GetString(ptr); } set => Schema.SetFixedString(_Handle, 0xFD3BBE5B14684E6F, value, 64); } -public string D3DSemanticName { + public string D3DSemanticName { get { var ptr = _Handle + Schema.GetOffset(0xFD3BBE5B66524995); return Schema.GetString(ptr); diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/audioparams_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/audioparams_tImpl.cs index fb468e1d..ccb34041 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/audioparams_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/audioparams_tImpl.cs @@ -15,7 +15,7 @@ internal partial class audioparams_tImpl : SchemaClass, audioparams_t { public audioparams_tImpl(nint handle) : base(handle) { } -public ISchemaFixedArray LocalSound { + public ISchemaFixedArray LocalSound { get => new SchemaFixedArray(_Handle, 0x6D349E3CCE184A47, 8, 12, 4); } public ref int SoundscapeIndex { diff --git a/managed/src/SwiftlyS2.Generated/Schemas/Classes/constraint_breakableparams_tImpl.cs b/managed/src/SwiftlyS2.Generated/Schemas/Classes/constraint_breakableparams_tImpl.cs index 0458c308..7436e909 100644 --- a/managed/src/SwiftlyS2.Generated/Schemas/Classes/constraint_breakableparams_tImpl.cs +++ b/managed/src/SwiftlyS2.Generated/Schemas/Classes/constraint_breakableparams_tImpl.cs @@ -24,7 +24,7 @@ public ref float ForceLimit { public ref float TorqueLimit { get => ref _Handle.AsRef(Schema.GetOffset(0xEDA0F37777EB0DDE)); } -public ISchemaFixedArray BodyMassScale { + public ISchemaFixedArray BodyMassScale { get => new SchemaFixedArray(_Handle, 0xEDA0F3775BED8FB5, 2, 4, 4); } public ref bool IsActive { diff --git a/managed/src/TestPlugin/TestPlugin.cs b/managed/src/TestPlugin/TestPlugin.cs index e00ca3f8..ceebe3b0 100644 --- a/managed/src/TestPlugin/TestPlugin.cs +++ b/managed/src/TestPlugin/TestPlugin.cs @@ -31,6 +31,13 @@ namespace TestPlugin; +public class TestConfig +{ + public string Name { get; set; } + public int Age { get; set; } +} + + public class InProcessConfig : ManualConfig { public InProcessConfig() @@ -106,5 +113,377 @@ public override void Load(bool hotReload) { Console.WriteLine($"ConVar {@event.ConVarName} changed from {@event.OldValue} to {@event.NewValue} by player {@event.PlayerId}"); }; + + + // var provider = services.BuildServiceProvider(); + + // provider.GetRequiredService(); + + + // Host.CreateDefaultBuilder() + // .ConfigureLogging((context, logging) => { + // logging.AddConsole(); + // }) + // .ConfigureAppConfiguration((context, config) => { + // config.SetBasePath(Core.Configuration.GetBasePath()); + // config.AddJsonFile("test.jsonc", optional: false, reloadOnChange: true); + // }) + // .ConfigureServices((context, services) => { + // services.AddOptionsWithValidateOnStart>() + // .Bind(context.Configuration.GetSection("Main")); + // }) + // .Build(); + + // This can be used everywhere and the value will be updated when the config is changed + // Console.WriteLine(config.CurrentValue.Age); + + + // var config = new TestConfig(); + + // throw new Exception("TestPlugin loaded"); + + // Core. + + int i = 0; + + // var token2 = Core.Scheduler.Repeat(10, () => { + // Console.WriteLine(Core.Engine.TickCount); + // Console.WriteLine("TestPlugin Timer"); + // }); + Core.Logger.LogInformation("TestPlugin loaded"); + + using var se = new SoundEvent(); + + // var func = Core.Memory.GetUnmanagedFunctionByAddress(Core.Memory.GetAddressBySignature(Library.Server, "AAAAA")!.Value); + + // func.CallOriginal(1, 2); + + // func.Call(1, 2); + + // func.AddHook((next) => { + // return (a, b) => { + // Console.WriteLine("TestPlugin Hook " + a + " " + b); + // next()(a, b); + // }; + // }); + + + // Entrypoint + + // Core.Event.OnTick += () => { + // Console.WriteLine("TestPlugin OnTick "); + // }; + + // Core.Event.OnClientConnected += (@event) => { + // Console.WriteLine("TestPlugin OnClientConnected " + @event.PlayerId); + // }; + + // Core.Event.OnClientPutInServer += (@event) => { + // Console.WriteLine("TestPlugin OnClientPutInServer " + @event.PlayerId); + // }; + + Core.Event.OnClientDisconnected += (@event) => + { + Console.WriteLine("TestPlugin OnClientDisconnected " + @event.PlayerId); + }; + Core.Event.OnTick += () => + { + int i = 0; + }; + + + // Core.Event.OnClientProcessUsercmds += (@event) => { + // foreach(var usercmd in @event.Usercmds) { + // usercmd.Base.ButtonsPb.Buttonstate1 &= 1UL << (int)GameButtons.Ctrl; + // usercmd.Base.ButtonsPb.Buttonstate2 &= 1UL << (int)GameButtons.Ctrl; + // usercmd.Base.ButtonsPb.Buttonstate3 &= 1UL << (int)GameButtons.Ctrl; + // } + // }; + + // Core.NetMessage.HookClientMessage((msg, id) => { + // Console.WriteLine("TestPlugin OnClientMove "); + // Console.WriteLine(BitConverter.ToString(msg.Data)); + // return HookResult.Continue; + // }); + + // Core.Event.OnEntityTakeDamage += (@event) => { + // Console.WriteLine("TestPlugin OnEntityTakeDamage " + @event.Entity.Entity?.DesignerName + " " + @event.Info.HitGroupId); + // }; + + // Core.Event.OnTick += () => { + + // Console.WriteLine("TestPlugin OnTick"); + // }; + + // Core.Event.OnEntityCreated += (ev) => { + // var entity = ev.Entity; + // entity.Entity.DesignerName = "a"; + // Console.WriteLine("TestPlugin OnEntityCreated " + ev.Entity.Entity?.DesignerName); + // }; + + + using CEntityKeyValues kv = new(); + + kv.SetBool("test", true); + + Console.WriteLine(kv.Get("test2")); + + + CUtlStringToken token = new("hello"); + Console.WriteLine($"2"); + } + + CEntityKeyValues kv { get; set; } + CEntityInstance entity { get; set; } + + + [Command("tt")] + public void TestCommand(ICommandContext context) + { + // token2?.Cancel(); + // kv = new(); + // kv.SetString("test", "SAFE"); + + + + // _Core.Logger.LogInformation("!@#"); + + // _Core.Logger.LogInformation(_Core.GameData.GetSignature("CEntityInstance::AcceptInput").ToString()); + + // entity = _Core.EntitySystem.CreateEntityByDesignerName("point_worldtext"); + // entity.DispatchSpawn(kv); + // Console.WriteLine("Spawned entity with keyvalues"); + + int j = 0; + + var cvar = Core.ConVar.Find("sv_cheats")!; + Console.WriteLine(cvar); + Console.WriteLine(cvar.Value); + var cvar2 = Core.ConVar.Find("sv_autobunnyhopping")!; + Console.WriteLine(cvar2); + Console.WriteLine(cvar2.Value); + + var cvar3 = Core.ConVar.Create("sw_test_cvar", "Test cvar", "ABCDEFG"); + Console.WriteLine(cvar3); + Console.WriteLine(cvar3.Value); + + var cvar4 = Core.ConVar.Find("r_drawworld")!; + + cvar2.ReplicateToClient(0, true); + + cvar4.QueryClient(0, (value) => + { + Console.WriteLine("QueryCallback " + value); + }); + } + + [Command("w")] + public void TestCommand1(ICommandContext context) + { + var attacker = context.Sender!; + var weapons = attacker.Pawn!.WeaponServices!.MyWeapons; + foreach (var weaponHandle in weapons) + { + var weapon = weaponHandle.Value?.As(); + if (weapon == null) + return; + + Console.WriteLine($"Weapon: {weapon.DesignerName}"); + } + + } + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + delegate nint DispatchSpawnDelegate(nint pEntity, nint pKV); + int order = 0; + + IUnmanagedFunction? _dispatchspawn; + + [Command("h1")] + public void TestCommand2(ICommandContext context) + { + var token = Core.Scheduler.DelayAndRepeat(500, 1000, () => + { + + }); + + var addres = Core.GameData.GetSignature("CBaseEntity::DispatchSpawn"); + var func = Core.Memory.GetUnmanagedFunctionByAddress(addres); + + var guid = func.AddHook((next) => + { + return (pEntity, pKV) => + { + Console.WriteLine("TestPlugin DispatchSpawn " + order++); + return next()(pEntity, pKV); + }; + }); + + _dispatchspawn.AddHook((next) => + { + return (pEntity, pKV) => + { + Console.WriteLine("TestPlugin DispatchSpawn2 " + order++); + return next()(pEntity, pKV); + }; + }); + + } + + [EventListener] + public void OnEntityCreated(IOnEntityCreatedEvent @event) + { + // @event.Entity.Entity.DesignerName = "abc"; + Console.WriteLine("TestPlugin OnEntityCreated222 " + @event.Entity.Entity?.DesignerName); + } + + Guid _hookId = Guid.Empty; + + [Command("bad")] + public void TestCommandBad(ICommandContext context) + { + try { + Core.Profiler.StartRecording("GetGameRules().IsValveDS"); + var isValveDS = Core.EntitySystem.GetGameRules()!.IsValveDS; + } catch (Exception e) { + Core.Logger.LogWarning("{Exception}", e.Message); + } finally { + Core.Profiler.StopRecording("GetGameRules().IsValveDS"); + } + + try { + Core.Profiler.StartRecording("GetGameRules().IsValveDS = true"); + Core.EntitySystem.GetGameRules()!.IsValveDS = true; + } catch (Exception e) { + Core.Logger.LogWarning("{Exception}", e.Message); + } finally { + Core.Profiler.StopRecording("GetGameRules().IsValveDS = true"); + } + + try { + Core.Profiler.StartRecording("GetGameRules().IsValveDSUpdated"); + Core.EntitySystem.GetGameRules()!.IsValveDSUpdated(); + } catch (Exception e) { + Core.Logger.LogWarning("{Exception}", e.Message); + } finally { + Core.Profiler.StopRecording("GetGameRules().IsValveDSUpdated"); + } + } + + [Command("h2")] + public void TestCommand3(ICommandContext context) + { + Core.Command.HookClientCommand((playerId, commandLine) => + { + Console.WriteLine("TestPlugin HookClientCommand " + playerId + " " + commandLine); + return HookResult.Continue; + }); + Console.WriteLine(Core.GameData.GetSignature("CBaseEntity::DispatchSpawn")); + var ent = Core.EntitySystem.CreateEntity(); + ent.DispatchSpawn(); + } + + [Command("tt3")] + public void TestCommand33(ICommandContext context) + { + } + + [Command("tt4")] + public void TestCommand4(ICommandContext context) + { + Console.WriteLine(Core.Permission.PlayerHasPermission(7656, context.Args[0])); + } + + [Command("tt5")] + public void TestCommand5(ICommandContext context) + { + Console.WriteLine("TestPlugin TestCommand5"); + } + + [Command("tt6", permission: "tt6")] + public void TestCommand6(ICommandContext context) + { + Console.WriteLine("TestPlugin TestCommand6"); + } + + [Command("tt7")] + public void TestCommand7(ICommandContext context) + { + Core.Engine.ExecuteCommandWithBuffer("@ping", (buffer) => + { + Console.WriteLine($"pong: {buffer}"); + }); + } + + [GameEventHandler(HookMode.Pre)] + public HookResult TestGameEventHandler(EventPlayerJump @e) + { + Console.WriteLine(@e.UserIdController.PlayerName); + return HookResult.Continue; + } + + [ServerNetMessageHandler] + public HookResult TestServerNetMessageHandler(CCSUsrMsg_SendPlayerItemDrops msg) + { + + Console.WriteLine("FIRED"); + // foreach(var item in msg.Accessor) { + // Console.WriteLine($"TestPlugin ServerNetMessageHandler: {item.EconItem.Defindex}"); + // } + return HookResult.Continue; + } + + [Command("menu")] + public void MenuCommand(ICommandContext context) + { + var player = context.Sender!; + var menu = Core.Menus.CreateMenu("Test Menu"); + + menu.Builder + .AddButton("Button 1", (ctx) => + { + player.SendMessage(MessageType.Chat, "You clicked Button 1"); + }) + .AddButton("Button 2", (ctx) => + { + player.SendMessage(MessageType.Chat, "You clicked Button 2"); + }) + .AddButton("Button 3", (ctx) => + { + player.SendMessage(MessageType.Chat, "You clicked Button 3"); + }) + .AddButton("Button 4", (ctx) => + { + player.SendMessage(MessageType.Chat, "You clicked Button 4"); + }) + .AddButton("Button 5", (ctx) => + { + player.SendMessage(MessageType.Chat, "You clicked Button 5"); + }) + .AddButton("Button 6", (ctx) => + { + player.SendMessage(MessageType.Chat, "You clicked Button 6"); + }) + .AddButton("Button 7", (ctx) => + { + player.SendMessage(MessageType.Chat, "You clicked Button 7"); + }) + .AddButton("Button 8", (ctx) => + { + player.SendMessage(MessageType.Chat, "You clicked Button 8"); + }) + .AddSeparator() + .AddText("hello!", size: SwiftlyS2.Shared.Menus.IMenuTextSize.ExtraLarge) + .SetColor(new(0, 186, 105, 255)) + .AutoClose(15f) + .HasSound(true) + .ForceFreeze(); + + Core.Menus.OpenMenu(player, menu); + } + + public override void Unload() + { + Console.WriteLine("TestPlugin unloaded"); } } \ No newline at end of file From 12cf8ec4e8e4f53c78f3aab0800580847fca657a Mon Sep 17 00:00:00 2001 From: Ambr0se Date: Fri, 24 Oct 2025 22:01:18 +0800 Subject: [PATCH 11/15] chore: Cleanup code --- managed/src/SwiftlyS2.Core/Modules/Schemas/Schema.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/managed/src/SwiftlyS2.Core/Modules/Schemas/Schema.cs b/managed/src/SwiftlyS2.Core/Modules/Schemas/Schema.cs index b689cf23..a006b587 100644 --- a/managed/src/SwiftlyS2.Core/Modules/Schemas/Schema.cs +++ b/managed/src/SwiftlyS2.Core/Modules/Schemas/Schema.cs @@ -48,7 +48,6 @@ internal static class Schema { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int GetOffset(ulong hash) { - Console.WriteLine($"isFollowingServerGuidelines: {isFollowingServerGuidelines}, hash: {hash}"); if (isFollowingServerGuidelines && dangerousFields.Contains(hash)) { throw new InvalidOperationException($"Cannot execute dangerous operation {hash} while \"FollowCS2ServerGuidelines\" is enabled.\n\tTo use this operation, disable the option in core.jsonc."); } From 57155201342d286aaabe7b4f4149b6306ab37767 Mon Sep 17 00:00:00 2001 From: Ambr0se Date: Fri, 24 Oct 2025 22:11:50 +0800 Subject: [PATCH 12/15] chore: Change exception message content --- managed/src/SwiftlyS2.Core/Modules/Schemas/Schema.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/managed/src/SwiftlyS2.Core/Modules/Schemas/Schema.cs b/managed/src/SwiftlyS2.Core/Modules/Schemas/Schema.cs index a006b587..9ecfdac1 100644 --- a/managed/src/SwiftlyS2.Core/Modules/Schemas/Schema.cs +++ b/managed/src/SwiftlyS2.Core/Modules/Schemas/Schema.cs @@ -49,7 +49,7 @@ internal static class Schema { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int GetOffset(ulong hash) { if (isFollowingServerGuidelines && dangerousFields.Contains(hash)) { - throw new InvalidOperationException($"Cannot execute dangerous operation {hash} while \"FollowCS2ServerGuidelines\" is enabled.\n\tTo use this operation, disable the option in core.jsonc."); + throw new InvalidOperationException($"Cannot get or set 0x{hash:X16} while \"FollowCS2ServerGuidelines\" is enabled.\n\tTo use this operation, disable the option in core.jsonc."); } return NativeSchema.GetOffset(hash); } @@ -57,7 +57,7 @@ public static int GetOffset(ulong hash) { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Update(nint handle, ulong hash) { if (isFollowingServerGuidelines && dangerousFields.Contains(hash)) { - throw new InvalidOperationException($"Cannot execute dangerous operation {hash} while \"FollowCS2ServerGuidelines\" is enabled.\n\tTo use this operation, disable the option in core.jsonc."); + throw new InvalidOperationException($"Cannot get or set 0x{hash:X16} while \"FollowCS2ServerGuidelines\" is enabled.\n\tTo use this operation, disable the option in core.jsonc."); } NativeSchema.SetStateChanged(handle, hash); } @@ -65,7 +65,7 @@ public static void Update(nint handle, ulong hash) { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void SetString(nint handle, ulong hash, string value) { if (isFollowingServerGuidelines && dangerousFields.Contains(hash)) { - throw new InvalidOperationException($"Cannot execute dangerous operation {hash} while \"FollowCS2ServerGuidelines\" is enabled.\n\tTo use this operation, disable the option in core.jsonc."); + throw new InvalidOperationException($"Cannot get or set 0x{hash:X16} while \"FollowCS2ServerGuidelines\" is enabled.\n\tTo use this operation, disable the option in core.jsonc."); } (handle + GetOffset(hash)).Write(StringPool.Allocate(value)); } @@ -73,7 +73,7 @@ public static void SetString(nint handle, ulong hash, string value) { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void SetFixedString(nint handle, ulong hash, string value, int maxSize) { if (isFollowingServerGuidelines && dangerousFields.Contains(hash)) { - throw new InvalidOperationException($"Cannot execute dangerous operation {hash} while \"FollowCS2ServerGuidelines\" is enabled.\n\tTo use this operation, disable the option in core.jsonc."); + throw new InvalidOperationException($"Cannot get or set 0x{hash:X16} while \"FollowCS2ServerGuidelines\" is enabled.\n\tTo use this operation, disable the option in core.jsonc."); } var pool = ArrayPool.Shared; var size = Encoding.UTF8.GetByteCount(value); From af18d2254cde0907b919f2dbf9544d2d6256621d Mon Sep 17 00:00:00 2001 From: Ambr0se Date: Fri, 24 Oct 2025 22:13:53 +0800 Subject: [PATCH 13/15] [no ci] chore: Typo --- managed/src/SwiftlyS2.Core/Modules/Schemas/Schema.cs | 2 +- managed/src/TestPlugin/TestPlugin.cs | 9 --------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/managed/src/SwiftlyS2.Core/Modules/Schemas/Schema.cs b/managed/src/SwiftlyS2.Core/Modules/Schemas/Schema.cs index 9ecfdac1..a8ec85de 100644 --- a/managed/src/SwiftlyS2.Core/Modules/Schemas/Schema.cs +++ b/managed/src/SwiftlyS2.Core/Modules/Schemas/Schema.cs @@ -57,7 +57,7 @@ public static int GetOffset(ulong hash) { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Update(nint handle, ulong hash) { if (isFollowingServerGuidelines && dangerousFields.Contains(hash)) { - throw new InvalidOperationException($"Cannot get or set 0x{hash:X16} while \"FollowCS2ServerGuidelines\" is enabled.\n\tTo use this operation, disable the option in core.jsonc."); + throw new InvalidOperationException($"Cannot get or set 0x{hash:X16} while \"FollowCS2ServerGuidelines\" is enabled.\n\tTo use this operation, disable the option in core.jsonc."); } NativeSchema.SetStateChanged(handle, hash); } diff --git a/managed/src/TestPlugin/TestPlugin.cs b/managed/src/TestPlugin/TestPlugin.cs index ceebe3b0..9bbd6476 100644 --- a/managed/src/TestPlugin/TestPlugin.cs +++ b/managed/src/TestPlugin/TestPlugin.cs @@ -343,30 +343,21 @@ public void OnEntityCreated(IOnEntityCreatedEvent @event) public void TestCommandBad(ICommandContext context) { try { - Core.Profiler.StartRecording("GetGameRules().IsValveDS"); var isValveDS = Core.EntitySystem.GetGameRules()!.IsValveDS; } catch (Exception e) { Core.Logger.LogWarning("{Exception}", e.Message); - } finally { - Core.Profiler.StopRecording("GetGameRules().IsValveDS"); } try { - Core.Profiler.StartRecording("GetGameRules().IsValveDS = true"); Core.EntitySystem.GetGameRules()!.IsValveDS = true; } catch (Exception e) { Core.Logger.LogWarning("{Exception}", e.Message); - } finally { - Core.Profiler.StopRecording("GetGameRules().IsValveDS = true"); } try { - Core.Profiler.StartRecording("GetGameRules().IsValveDSUpdated"); Core.EntitySystem.GetGameRules()!.IsValveDSUpdated(); } catch (Exception e) { Core.Logger.LogWarning("{Exception}", e.Message); - } finally { - Core.Profiler.StopRecording("GetGameRules().IsValveDSUpdated"); } } From e9798d57645b66372441a80f4527470c6eec1b94 Mon Sep 17 00:00:00 2001 From: skuzzis Date: Fri, 24 Oct 2025 21:52:23 +0300 Subject: [PATCH 14/15] fix(StateChanged): Chainer Detection --- managed/src/TestPlugin/TestPlugin.cs | 51 +++++++++++++++++++++------- src/sdk/reader.cpp | 39 +++++++++++++++++++++ 2 files changed, 77 insertions(+), 13 deletions(-) diff --git a/managed/src/TestPlugin/TestPlugin.cs b/managed/src/TestPlugin/TestPlugin.cs index 9bbd6476..29b5ba8c 100644 --- a/managed/src/TestPlugin/TestPlugin.cs +++ b/managed/src/TestPlugin/TestPlugin.cs @@ -40,13 +40,13 @@ public class TestConfig public class InProcessConfig : ManualConfig { - public InProcessConfig() - { - AddLogger(ConsoleLogger.Default); - AddJob(Job.Default - .WithToolchain(new InProcessNoEmitToolchain(true)) - .WithId("InProcess")); - } + public InProcessConfig() + { + AddLogger(ConsoleLogger.Default); + AddJob(Job.Default + .WithToolchain(new InProcessNoEmitToolchain(true)) + .WithId("InProcess")); + } } @@ -68,6 +68,22 @@ public void Test2Command(ICommandContext context) BenchmarkRunner.Run(new InProcessConfig()); } + [GameEventHandler(HookMode.Pre)] + public HookResult OnPlayerSpawn(EventPlayerSpawn @event) + { + if (!@event.UserIdPlayer.IsValid) + { + return HookResult.Continue; + } + var player = @event.UserIdPlayer.RequiredController; + if (player.InGameMoneyServices?.IsValid == true) + { + player.InGameMoneyServices.Account = Core.ConVar.Find("mp_maxmoney")?.Value ?? 16000; + player.InGameMoneyServices.AccountUpdated(); + } + return HookResult.Continue; + } + public override void Load(bool hotReload) { // Core.Event.OnConsoleOutput += (@event) => @@ -342,21 +358,30 @@ public void OnEntityCreated(IOnEntityCreatedEvent @event) [Command("bad")] public void TestCommandBad(ICommandContext context) { - try { + try + { var isValveDS = Core.EntitySystem.GetGameRules()!.IsValveDS; - } catch (Exception e) { + } + catch (Exception e) + { Core.Logger.LogWarning("{Exception}", e.Message); } - try { + try + { Core.EntitySystem.GetGameRules()!.IsValveDS = true; - } catch (Exception e) { + } + catch (Exception e) + { Core.Logger.LogWarning("{Exception}", e.Message); } - try { + try + { Core.EntitySystem.GetGameRules()!.IsValveDSUpdated(); - } catch (Exception e) { + } + catch (Exception e) + { Core.Logger.LogWarning("{Exception}", e.Message); } } diff --git a/src/sdk/reader.cpp b/src/sdk/reader.cpp index b6b4aead..66eeb075 100644 --- a/src/sdk/reader.cpp +++ b/src/sdk/reader.cpp @@ -111,6 +111,40 @@ std::string ReadFieldType(CSchemaType* field) else return field->m_sTypeName.Get(); } +void FindChainer(bool& has_chainer, int& chainer_offset, CSchemaClassInfo* classInfo) +{ + for (int i = 0; i < classInfo->m_nBaseClassCount; i++) + { + auto baseClass = classInfo->m_pBaseClasses[i].m_pClass; + if (baseClass) + { + for (int j = 0; j < baseClass->m_nFieldCount; j++) + { + if (baseClass->m_pFields[j].m_pszName == std::string("__m_pChainEntity")) + { + has_chainer = true; + chainer_offset = baseClass->m_pFields[j].m_nSingleInheritanceOffset; + break; + } + } + } + if (has_chainer) break; + } + + if (!has_chainer) + { + for (int i = 0; i < classInfo->m_nBaseClassCount; i++) + { + auto baseClass = classInfo->m_pBaseClasses[i].m_pClass; + if (baseClass) + { + FindChainer(has_chainer, chainer_offset, baseClass); + if (has_chainer) break; + } + } + } +} + void ReadClasses(CSchemaType_DeclaredClass* declClass, json& outJson) { auto classInfo = declClass->m_pClassInfo; @@ -154,6 +188,11 @@ void ReadClasses(CSchemaType_DeclaredClass* declClass, json& outJson) } } + if (!has_chainer) + { + FindChainer(has_chainer, chainer_offset, classInfo); + } + cls["has_chainer"] = has_chainer; for (int i = 0; i < field_size; i++) From 2839a580f3207bde9d8cb26fbcaa90639f9f3122 Mon Sep 17 00:00:00 2001 From: skuzzis Date: Sat, 25 Oct 2025 02:00:27 +0300 Subject: [PATCH 15/15] update(managed): Expose more functions for entity --- .../Schemas/Extensions/CAttributeList.cs | 9 + .../Schemas/Extensions/CAttributeListImpl.cs | 12 + .../Schemas/Extensions/CBaseModelEntity.cs | 10 + .../Extensions/CBaseModelEntityImpl.cs | 15 ++ .../SwiftlyS2.Core/Natives/GameFunctions.cs | 238 ++++++++++++------ .../gamedata/cs2/core/signatures.jsonc | 11 +- 6 files changed, 215 insertions(+), 80 deletions(-) create mode 100644 managed/src/SwiftlyS2.Core/Modules/Schemas/Extensions/CAttributeList.cs create mode 100644 managed/src/SwiftlyS2.Core/Modules/Schemas/Extensions/CAttributeListImpl.cs diff --git a/managed/src/SwiftlyS2.Core/Modules/Schemas/Extensions/CAttributeList.cs b/managed/src/SwiftlyS2.Core/Modules/Schemas/Extensions/CAttributeList.cs new file mode 100644 index 00000000..ebc42d44 --- /dev/null +++ b/managed/src/SwiftlyS2.Core/Modules/Schemas/Extensions/CAttributeList.cs @@ -0,0 +1,9 @@ +namespace SwiftlyS2.Shared.SchemaDefinitions; + +public partial interface CAttributeList +{ + /// + /// Sets or adds an attribute to the attribute list. + /// + public void SetOrAddAttribute(string attributeName, float value); +} \ No newline at end of file diff --git a/managed/src/SwiftlyS2.Core/Modules/Schemas/Extensions/CAttributeListImpl.cs b/managed/src/SwiftlyS2.Core/Modules/Schemas/Extensions/CAttributeListImpl.cs new file mode 100644 index 00000000..de778ffd --- /dev/null +++ b/managed/src/SwiftlyS2.Core/Modules/Schemas/Extensions/CAttributeListImpl.cs @@ -0,0 +1,12 @@ +using SwiftlyS2.Core.Natives; +using SwiftlyS2.Shared.SchemaDefinitions; + +namespace SwiftlyS2.Core.SchemaDefinitions; + +internal partial class CAttributeListImpl : CAttributeList +{ + public void SetOrAddAttribute(string attributeName, float value) + { + GameFunctions.SetOrAddAttribute(Address, attributeName, value); + } +} \ No newline at end of file diff --git a/managed/src/SwiftlyS2.Core/Modules/Schemas/Extensions/CBaseModelEntity.cs b/managed/src/SwiftlyS2.Core/Modules/Schemas/Extensions/CBaseModelEntity.cs index 44ed8773..93169e1c 100644 --- a/managed/src/SwiftlyS2.Core/Modules/Schemas/Extensions/CBaseModelEntity.cs +++ b/managed/src/SwiftlyS2.Core/Modules/Schemas/Extensions/CBaseModelEntity.cs @@ -7,4 +7,14 @@ public partial interface CBaseModelEntity /// /// The model path to be used. public void SetModel(string model); + + /// + /// Sets the bodygroup to the entity. + /// + public void SetBodygroupByName(string group, int value); + + /// + /// Sets the scale of the entity. + /// + public void SetScale(float scale); } \ No newline at end of file diff --git a/managed/src/SwiftlyS2.Core/Modules/Schemas/Extensions/CBaseModelEntityImpl.cs b/managed/src/SwiftlyS2.Core/Modules/Schemas/Extensions/CBaseModelEntityImpl.cs index d48cd679..75270dae 100644 --- a/managed/src/SwiftlyS2.Core/Modules/Schemas/Extensions/CBaseModelEntityImpl.cs +++ b/managed/src/SwiftlyS2.Core/Modules/Schemas/Extensions/CBaseModelEntityImpl.cs @@ -9,4 +9,19 @@ public void SetModel(string model) { GameFunctions.SetModel(Address, model); } + + public void SetBodygroupByName(string group, int value) + { + AcceptInput("SetBodygroup", $"{group},{value}"); + } + + public void SetScale(float scale) + { + var skeletonInstance = CBodyComponent?.SceneNode?.GetSkeletonInstance(); + if (skeletonInstance == null) return; + + skeletonInstance.Scale = scale; + AcceptInput("SetScale", scale); + CBodyComponentUpdated(); + } } \ No newline at end of file diff --git a/managed/src/SwiftlyS2.Core/Natives/GameFunctions.cs b/managed/src/SwiftlyS2.Core/Natives/GameFunctions.cs index 3626eba3..422e4392 100644 --- a/managed/src/SwiftlyS2.Core/Natives/GameFunctions.cs +++ b/managed/src/SwiftlyS2.Core/Natives/GameFunctions.cs @@ -5,13 +5,15 @@ namespace SwiftlyS2.Core.Natives; -internal static class GameFunctions { +internal static class GameFunctions +{ public static unsafe delegate* unmanaged pCTakeDamageInfo_Constructor; public static unsafe delegate* unmanaged pTraceShape; public static unsafe delegate* unmanaged pTracePlayerBBox; public static unsafe delegate* unmanaged pSetModel; - public static unsafe delegate* unmanaged pSetPlayerControllerPawn; + public static unsafe delegate* unmanaged pSetPlayerControllerPawn; + public static unsafe delegate* unmanaged pSetOrAddAttribute; public static int TeleportOffset => NativeOffsets.Fetch("CBaseEntity::Teleport"); public static int CommitSuicideOffset => NativeOffsets.Fetch("CBasePlayerPawn::CommitSuicide"); public static int GetSkeletonInstanceOffset => NativeOffsets.Fetch("CGameSceneNode::GetSkeletonInstance"); @@ -25,13 +27,16 @@ internal static class GameFunctions { public static int CollisionRulesChangedOffset => NativeOffsets.Fetch("CBaseEntity::CollisionRulesChanged"); public static int RespawnOffset => NativeOffsets.Fetch("CCSPlayerController::Respawn"); - public static void Initialize() { - unsafe { + public static void Initialize() + { + unsafe + { pCTakeDamageInfo_Constructor = (delegate* unmanaged)NativeSignatures.Fetch("CTakeDamageInfo::Constructor"); pTraceShape = (delegate* unmanaged)NativeSignatures.Fetch("TraceShape"); pTracePlayerBBox = (delegate* unmanaged)NativeSignatures.Fetch("TracePlayerBBox"); pSetModel = (delegate* unmanaged)NativeSignatures.Fetch("CBaseModelEntity::SetModel"); - pSetPlayerControllerPawn = (delegate* unmanaged)NativeSignatures.Fetch("CBasePlayerController::SetPawn"); + pSetPlayerControllerPawn = (delegate* unmanaged)NativeSignatures.Fetch("CBasePlayerController::SetPawn"); + pSetOrAddAttribute = (delegate* unmanaged)NativeSignatures.Fetch("CAttributeList::SetOrAddAttributeValueByName"); } } @@ -78,10 +83,11 @@ public unsafe static void PawnCommitSuicide(nint pPawn, bool bExplode, bool bFor unsafe { void*** ppVTable = (void***)pPawn; - var pCommitSuicide = (delegate* unmanaged)ppVTable[0][CommitSuicideOffset]; - pCommitSuicide(pPawn, bExplode, bForce); + var pCommitSuicide = (delegate* unmanaged)ppVTable[0][CommitSuicideOffset]; + pCommitSuicide(pPawn, (byte)(bExplode ? 1 : 0), (byte)(bForce ? 1 : 0)); } - } catch (Exception e) + } + catch (Exception e) { AnsiConsole.WriteException(e); } @@ -89,48 +95,61 @@ public unsafe static void PawnCommitSuicide(nint pPawn, bool bExplode, bool bFor public unsafe static void SetPlayerControllerPawn(nint pController, nint pPawn, bool b1, bool b2, bool b3, bool b4) { - try { - unsafe { - pSetPlayerControllerPawn(pController, pPawn, b1, b2, b3, b4); + try + { + unsafe + { + pSetPlayerControllerPawn(pController, pPawn, (byte)(b1 ? 1 : 0), (byte)(b2 ? 1 : 0), (byte)(b3 ? 1 : 0), (byte)(b4 ? 1 : 0)); } - } catch (Exception e) { + } + catch (Exception e) + { AnsiConsole.WriteException(e); } } public unsafe static void SetModel(nint pEntity, string model) { - try { - unsafe { + try + { + unsafe + { var pool = ArrayPool.Shared; var modelLength = Encoding.UTF8.GetByteCount(model); var modelBuffer = pool.Rent(modelLength + 1); Encoding.UTF8.GetBytes(model, modelBuffer); modelBuffer[modelLength] = 0; - fixed (byte* pModel = modelBuffer) { + fixed (byte* pModel = modelBuffer) + { pSetModel(pEntity, (IntPtr)pModel); pool.Return(modelBuffer); } } - } catch (Exception e) { - AnsiConsole.WriteException(e); } + catch (Exception e) + { + AnsiConsole.WriteException(e); } + } - public unsafe static void Teleport( - nint pEntity, - Vector* vecPosition, - QAngle* vecAngle, - Vector* vecVelocity - ) + public unsafe static void Teleport( + nint pEntity, + Vector* vecPosition, + QAngle* vecAngle, + Vector* vecVelocity +) { - try { - unsafe { + try + { + unsafe + { void*** ppVTable = (void***)pEntity; var pTeleport = (delegate* unmanaged)ppVTable[0][TeleportOffset]; pTeleport(pEntity, vecPosition, vecAngle, vecVelocity); } - } catch (Exception e) { + } + catch (Exception e) + { AnsiConsole.WriteException(e); } } @@ -143,11 +162,15 @@ public unsafe static void TracePlayerBBox( CGameTrace* pTrace ) { - try { - unsafe { + try + { + unsafe + { pTracePlayerBBox(vecStart, vecEnd, bounds, pFilter, pTrace); } - } catch (Exception e) { + } + catch (Exception e) + { AnsiConsole.WriteException(e); } } @@ -161,11 +184,15 @@ public unsafe static void TraceShape( CGameTrace* pTrace ) { - try { - unsafe { + try + { + unsafe + { pTraceShape(pEngineTrace, ray, vecStart, vecEnd, pFilter, pTrace); } - } catch (Exception e) { + } + catch (Exception e) + { AnsiConsole.WriteException(e); } } @@ -183,30 +210,42 @@ public unsafe static void CTakeDamageInfoConstructor( void* a10 ) { - try { - unsafe { + try + { + unsafe + { pCTakeDamageInfo_Constructor(pThis, pInflictor, pAttacker, pAbility, vecDamageForce, vecDamagePosition, flDamage, bitsDamageType, iCustomDamage, a10); } - } catch (Exception e) { + } + catch (Exception e) + { AnsiConsole.WriteException(e); } } - public unsafe static void CCSPlayer_ItemServices_RemoveWeapons(nint pThis) { - try { - unsafe { + public unsafe static void CCSPlayer_ItemServices_RemoveWeapons(nint pThis) + { + try + { + unsafe + { void*** ppVTable = (void***)pThis; var pRemoveWeapons = (delegate* unmanaged)ppVTable[0][RemoveWeaponsOffset]; pRemoveWeapons(pThis); } - } catch (Exception e) { + } + catch (Exception e) + { AnsiConsole.WriteException(e); } } - public unsafe static nint CCSPlayer_ItemServices_GiveNamedItem(nint pThis, string name) { - try { - unsafe { + public unsafe static nint CCSPlayer_ItemServices_GiveNamedItem(nint pThis, string name) + { + try + { + unsafe + { void*** ppVTable = (void***)pThis; var pGiveNamedItem = (delegate* unmanaged)ppVTable[0][GiveNamedItemOffset]; var pool = ArrayPool.Shared; @@ -214,55 +253,76 @@ public unsafe static nint CCSPlayer_ItemServices_GiveNamedItem(nint pThis, strin var nameBuffer = pool.Rent(nameLength + 1); Encoding.UTF8.GetBytes(name, nameBuffer); nameBuffer[nameLength] = 0; - fixed (byte* pName = nameBuffer) { + fixed (byte* pName = nameBuffer) + { return pGiveNamedItem(pThis, (IntPtr)pName); } } - } catch (Exception e) { + } + catch (Exception e) + { AnsiConsole.WriteException(e); return 0; } } - public unsafe static void CCSPlayer_ItemServices_DropActiveItem(nint pThis, Vector momentum) { - try { - unsafe { + public unsafe static void CCSPlayer_ItemServices_DropActiveItem(nint pThis, Vector momentum) + { + try + { + unsafe + { void*** ppVTable = (void***)pThis; var pDropActiveItem = (delegate* unmanaged)ppVTable[0][DropActiveItemOffset]; pDropActiveItem(pThis, &momentum); } - } catch (Exception e) { + } + catch (Exception e) + { AnsiConsole.WriteException(e); - } + } } - public unsafe static void CCSPlayer_WeaponServices_DropWeapon(nint pThis, nint pWeapon) { - try { - unsafe { + public unsafe static void CCSPlayer_WeaponServices_DropWeapon(nint pThis, nint pWeapon) + { + try + { + unsafe + { void*** ppVTable = (void***)pThis; var pDropWeapon = (delegate* unmanaged)ppVTable[0][DropWeaponOffset]; pDropWeapon(pThis, pWeapon); } - } catch (Exception e) { + } + catch (Exception e) + { AnsiConsole.WriteException(e); } } - public unsafe static void CCSPlayer_WeaponServices_SelectWeapon(nint pThis, nint pWeapon) { - try { - unsafe { + public unsafe static void CCSPlayer_WeaponServices_SelectWeapon(nint pThis, nint pWeapon) + { + try + { + unsafe + { void*** ppVTable = (void***)pThis; var pSelectWeapon = (delegate* unmanaged)ppVTable[0][SelectWeaponOffset]; pSelectWeapon(pThis, pWeapon); } - } catch (Exception e) { + } + catch (Exception e) + { AnsiConsole.WriteException(e); - } + } } - public unsafe static void CEntityResourceManifest_AddResource(nint pThis, string path) { - try { - unsafe { + public unsafe static void CEntityResourceManifest_AddResource(nint pThis, string path) + { + try + { + unsafe + { var pool = ArrayPool.Shared; var pathLength = Encoding.UTF8.GetByteCount(path); var pathBuffer = pool.Rent(pathLength + 1); @@ -270,37 +330,73 @@ public unsafe static void CEntityResourceManifest_AddResource(nint pThis, string pathBuffer[pathLength] = 0; void*** ppVTable = (void***)pThis; var pAddResource = (delegate* unmanaged)ppVTable[0][AddResourceOffset]; - fixed (byte* pPath = pathBuffer) { + fixed (byte* pPath = pathBuffer) + { pAddResource(pThis, (IntPtr)pPath); pool.Return(pathBuffer); } } - } catch (Exception e) { + } + catch (Exception e) + { + AnsiConsole.WriteException(e); + } + } + + public unsafe static void SetOrAddAttribute(nint handle, string name, float value) + { + try + { + unsafe + { + var pool = ArrayPool.Shared; + var nameLength = Encoding.UTF8.GetByteCount(name); + var nameBuffer = pool.Rent(nameLength + 1); + Encoding.UTF8.GetBytes(name, nameBuffer); + nameBuffer[nameLength] = 0; + fixed (byte* pName = nameBuffer) + { + pSetOrAddAttribute(handle, (nint)pName, value); + pool.Return(nameBuffer); + } + } + } + catch (Exception e) + { AnsiConsole.WriteException(e); } } - public unsafe static void CBaseEntity_CollisionRulesChanged(nint pThis) { - try { - unsafe { + public unsafe static void CBaseEntity_CollisionRulesChanged(nint pThis) + { + try + { + unsafe + { void*** ppVTable = (void***)pThis; var pCollisionRulesChanged = (delegate* unmanaged)ppVTable[0][CollisionRulesChangedOffset]; pCollisionRulesChanged(pThis); } - } catch (Exception e) { + } + catch (Exception e) + { AnsiConsole.WriteException(e); } } - public unsafe static void CCSPlayerController_Respawn(nint pThis) { - try { - unsafe { + public unsafe static void CCSPlayerController_Respawn(nint pThis) + { + try + { + unsafe + { void*** ppVTable = (void***)pThis; var pRespawn = (delegate* unmanaged)ppVTable[0][RespawnOffset]; pRespawn(pThis); } } - catch (Exception e) { + catch (Exception e) + { AnsiConsole.WriteException(e); } } diff --git a/plugin_files/gamedata/cs2/core/signatures.jsonc b/plugin_files/gamedata/cs2/core/signatures.jsonc index 1af64094..cabb78ff 100644 --- a/plugin_files/gamedata/cs2/core/signatures.jsonc +++ b/plugin_files/gamedata/cs2/core/signatures.jsonc @@ -28,8 +28,8 @@ // Taken from CS2Fixes (https://github.com/Source2ZE/CS2Fixes) "CBaseModelEntity::SetModel": { "lib": "server", - "windows": "40 53 48 83 EC ? 48 8B D9 4C 8B C2 48 8B 0D ? ? ? ? 48 8D 54 24 ? 48 8B 01 FF 50 ? 48 8B 44 24", - "linux": "55 48 89 F2 48 89 E5 53 48 89 FB 48 8D 7D ? 48 83 EC ? 48 8D 05 ? ? ? ? 48 8B 30 48 8B 06" + "windows": "40 53 48 83 EC ? 48 8B D9 4C 8B C2 48 8B 0D ? ? ? ? 48 8D 54 24 ? 48 8B 01 FF 50 ? 48 8B 44 24 ? 48 8D 54 24 ? 48 8B CB 48 89 44 24 ? E8 ? ? ? ? 48 83 C4 ? 5B C3 CC CC CC CC CC 48 89 5C 24", + "linux": "55 48 89 F2 48 89 E5 53 48 89 FB 48 8D 7D ? 48 83 EC ? 48 8D 05 ? ? ? ? 48 8B 30 48 8B 06 FF 50 ? 48 8B 45 ? 48 8D 75 ? 48 89 DF 48 89 45 ? E8 ? ? ? ? 48 8B 5D ? C9 C3 CC CC CC 55" }, // The function has "classname" in it. It can be found when searching for UTIL::CreateEntityByName "CBaseEntity::DispatchSpawn": { @@ -56,13 +56,6 @@ "windows": "40 53 55 41 56 48 81 EC 90 00 00 00", "linux": "55 48 89 E5 41 57 41 56 49 89 FE 41 55 41 54 49 89 F4 53 48 83 EC 78" }, - // Search for "Unlocked prop_door '%s' at (%.0f %.0f %.0f) has no hardware. All openable doors must have hardware!\n" - // above the if in which the string is, the function is called - "CBaseModelEntity::SetBodygroup": { - "lib": "server", - "windows": "48 89 5C 24 08 48 89 74 24 10 57 48 83 EC 20 41 8B F8 48 8B F2 48 8B D9 E8 ? ? ? ?", - "linux": "55 48 89 E5 41 55 49 89 F5 41 54 41 89 D4 53 48 89 FB 48 83 EC ? E8 ? ? ? ? 48 85 C0" - }, // Search for "break_radius", the constructor is called at the end of the function // More simple is to search for the VTable and see when it's being set "CTakeDamageInfo::Constructor": {