Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
e95a1d0
fix(signatures): SetOrAddAttributeValueByName
skuzzis Nov 20, 2025
cf184d4
fix(configuration): Scroll Back default value
skuzzis Nov 20, 2025
2702b8a
fix(Menu/Close): Text being bugged on screen
skuzzis Nov 20, 2025
c8402a0
fix(HookClientCommand): Some client commands
skuzzis Nov 20, 2025
7ba6a73
fix(ClientCommand): Offset
skuzzis Nov 20, 2025
9ff2303
fix(managed): Fix gamedata parse
samyycX Nov 21, 2025
c5a0021
refactor: Register MenuManagerAPI as global singleton
ELDment Nov 21, 2025
2824016
fix: Replace IPlayer keys with PlayerID in dictionaries to avoid refe…
ELDment Nov 21, 2025
bcf2bb3
chore: Add test code
ELDment Nov 21, 2025
1fff3e2
feat(managed): Add AsProtobuf
samyycX Nov 21, 2025
f31ad47
feat: Support pausing animations for hidden menus
ELDment Nov 21, 2025
0c3fd87
fix: Switch to SemaphoreSlim to prevent thread starvation
ELDment Nov 21, 2025
cb4f6bd
chore: Clean up code
ELDment Nov 21, 2025
7a6fd96
chore: Ensure semaphore does not overflow
ELDment Nov 21, 2025
6dab248
feat(permissions): HasPermissions
skuzzis Nov 21, 2025
5b283f9
chore: Use unified task in MenuOptionBase to avoid high CPU overhead …
ELDment Nov 21, 2025
54bcc94
chore: Clean up
ELDment Nov 21, 2025
07968c2
chore(PluginManager): Show exception
skuzzis Nov 21, 2025
9e72dd6
Merge pull request #116 from ELDment/fix-menu
skuzzis Nov 21, 2025
58bbf00
chore: Refactor menu render task lifecycle to prevent unnecessary tas…
ELDment Nov 22, 2025
931aa96
chore: Add threadpool statistics tracking
ELDment Nov 22, 2025
1a3c686
chore: Reduce OnRender frequency to approximately once per tick
ELDment Nov 22, 2025
20824c3
chore: Add intelligent caching for static text styles
ELDment Nov 22, 2025
e4f15aa
fix(interfaces): VFileSystem search
skuzzis Nov 22, 2025
cf6c499
Merge branch 'beta' of https://github.com/swiftly-solution/swiftlys2 …
skuzzis Nov 22, 2025
cae3f30
feat(filesystem): Add FindFileAbsoluteList
samyycX Nov 22, 2025
8eeab70
chore: Add test code
ELDment Nov 22, 2025
c400e2a
feat(managed): fuck you
samyycX Nov 22, 2025
1b1a148
fix: Midhook callback crash
ELDment Nov 23, 2025
c98a513
feat(CGameTrace): Helpers
skuzzis Nov 23, 2025
c95dd93
feat(WeaponServices): MyValidWeapons
skuzzis Nov 23, 2025
bc6e4a9
feat(CBasePlayerPawn): Helpers
skuzzis Nov 23, 2025
cdc2138
chore: Add test code
ELDment Nov 23, 2025
53ddbfb
feat(OnEntityTakeDamage): DamageResult
skuzzis Nov 23, 2025
e775aaa
feat(GetRecipients): GetRecipients
skuzzis Nov 23, 2025
72a94d4
Merge pull request #118 from ELDment/fix-menu
skuzzis Nov 23, 2025
2aa8891
chore: Clean up code
ELDment Nov 23, 2025
c4905de
chore: Remove debug code and finalize multi-hook support
ELDment Nov 23, 2025
4fb41e3
feat(cmd): sw_logpath
skuzzis Nov 23, 2025
4b1ae4a
Merge branch 'beta' of https://github.com/swiftly-solution/swiftlys2 …
skuzzis Nov 23, 2025
c847b1b
refactor: Simplify midhook implementation by removing C++ wrapper layer
ELDment Nov 23, 2025
90eb36c
[no ci] chore: Clean up code
ELDment Nov 23, 2025
be1ad23
chore: Move test code to appropriate location
ELDment Nov 23, 2025
39ece8a
Merge pull request #120 from ELDment/fix-midhook
skuzzis Nov 23, 2025
ba07c5f
fix: Crash when blocking entity transmission in CheckTransmitHook
ELDment Nov 23, 2025
c3a1ad8
revert: Necessary code comments
ELDment Nov 23, 2025
6117a27
fix(timers): Object disposed
skuzzis Nov 23, 2025
a4a7136
chore: Add test code
ELDment Nov 23, 2025
dc3affe
fix: Prevent bit shift wraparound when bit >= 32
ELDment Nov 23, 2025
460a88b
Merge pull request #121 from ELDment/fix-transmit
skuzzis Nov 23, 2025
19656dd
Add ChangeSubclass method to CBaseModelEntity
agasking1337 Nov 23, 2025
88a27d6
fix(menus): Disposal issue
skuzzis Nov 23, 2025
5421428
Merge pull request #122 from agasking1337/master
skuzzis Nov 23, 2025
4b7e381
fix(startup): MenuManager exception
skuzzis Nov 23, 2025
09aad1e
fix(Transmit): Out of bounds
skuzzis Nov 23, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
16,752 changes: 8,376 additions & 8,376 deletions generator/schema_generator/sdk.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
private static readonly Lazy<nint> _$NAME$Offset = new(() => Schema.GetOffset($HASH$), LazyThreadSafetyMode.None);
private static readonly nint _$NAME$Offset = Schema.GetOffset($HASH$);

public string $NAME$ {
get {
var ptr = _Handle + _$NAME$Offset.Value;
var ptr = _Handle + _$NAME$Offset;
return Schema.GetString(ptr);
}
set => Schema.SetFixedString(_Handle, _$NAME$Offset.Value, value, $ELEMENT_COUNT$);
set => Schema.SetFixedString(_Handle, _$NAME$Offset, value, $ELEMENT_COUNT$);
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
private static readonly Lazy<nint> _$NAME$Offset = new(() => Schema.GetOffset($HASH$), LazyThreadSafetyMode.None);
private static readonly nint _$NAME$Offset = Schema.GetOffset($HASH$);

public $INTERFACE_TYPE$? $NAME$ {
get {
var ptr = _Handle.Read<nint>(_$NAME$Offset.Value);
var ptr = _Handle.Read<nint>(_$NAME$Offset);
return ptr.IsValidPtr() ? new $IMPL_TYPE$(ptr) : null;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
private static readonly Lazy<nint> _$NAME$Offset = new(() => Schema.GetOffset($HASH$), LazyThreadSafetyMode.None);
private static readonly nint _$NAME$Offset = Schema.GetOffset($HASH$);

public $INTERFACE_TYPE$ $NAME$ {
get => new $IMPL_TYPE$(_Handle + _$NAME$Offset.Value);
get => new $IMPL_TYPE$(_Handle + _$NAME$Offset);
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
private static readonly Lazy<nint> _$NAME$Offset = new(() => Schema.GetOffset($HASH$), LazyThreadSafetyMode.None);
private static readonly nint _$NAME$Offset = Schema.GetOffset($HASH$);

public string $NAME$ {
get {
var ptr = _Handle.Read<nint>(_$NAME$Offset.Value);
var ptr = _Handle.Read<nint>(_$NAME$Offset);
return Schema.GetString(ptr);
}
set => Schema.SetString(_Handle, _$NAME$Offset.Value, value);
set => Schema.SetString(_Handle, _$NAME$Offset, value);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
private static readonly Lazy<nint> _$NAME$Offset = new(() => Schema.GetOffset($HASH$), LazyThreadSafetyMode.None);
private static readonly nint _$NAME$Offset = Schema.GetOffset($HASH$);

public ref $IMPL_TYPE$ $NAME$ {
get => ref _Handle.$REF_METHOD$<$IMPL_TYPE$>(_$NAME$Offset.Value);
get => ref _Handle.$REF_METHOD$<$IMPL_TYPE$>(_$NAME$Offset);
}
4 changes: 2 additions & 2 deletions managed/src/Entrypoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ internal class Entrypoint
{
[UnmanagedCallersOnly]
[SecurityCritical]
public unsafe static void Start( IntPtr nativeTable, int nativeTableSize, IntPtr basePath )
public unsafe static void Start( IntPtr nativeTable, int nativeTableSize, IntPtr basePath, IntPtr logsPath )
{
try
{
Bootstrap.Start(nativeTable, nativeTableSize, Marshal.PtrToStringUTF8(basePath)!);
Bootstrap.Start(nativeTable, nativeTableSize, Marshal.PtrToStringUTF8(basePath)!, Marshal.PtrToStringUTF8(logsPath)!);
}
catch (Exception e)
{
Expand Down
159 changes: 77 additions & 82 deletions managed/src/SwiftlyS2.Core/Bootstrap.cs
Original file line number Diff line number Diff line change
@@ -1,102 +1,97 @@
using System.Reflection;
using System.Runtime.InteropServices;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Spectre.Console;
using SwiftlyS2.Core.Misc;
using SwiftlyS2.Core.Events;
using SwiftlyS2.Core.Hosting;
using SwiftlyS2.Core.Natives;
using SwiftlyS2.Core.Services;
using SwiftlyS2.Shared;
using SwiftlyS2.Core.Events;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Hosting;
using SwiftlyS2.Core.Misc;
using Microsoft.Extensions.Configuration;
using SwiftlyS2.Shared.Memory;
using SwiftlyS2.Shared.Services;
using System.Runtime.InteropServices;
using SwiftlyS2.Shared.SteamAPI;
using System.Reflection;

namespace SwiftlyS2.Core;

internal static class Bootstrap
{
// how tf i forgot services can be collected hahahahahahahhaahhahaa FUCK
private static IHost? sw2Host;

// how tf i forgot services can be collected hahahahahahahhaahhahaa FUCK
private static IHost? _host;

private static IntPtr SteamAPIDLLResolver( string libraryName, Assembly assembly, DllImportSearchPath? searchPath )
{
if (libraryName == "steam_api" || libraryName == "sdkencryptedappticket")
private static IntPtr SteamAPIDLLResolver( string libraryName, Assembly assembly, DllImportSearchPath? searchPath )
{
if (OperatingSystem.IsWindows())
{
libraryName += "64";
}

if (NativeLibrary.TryLoad(libraryName, out var handle))
{
return handle;
}
}
if (libraryName == "steam_api" || libraryName == "sdkencryptedappticket")
{
if (OperatingSystem.IsWindows())
{
libraryName += "64";
}

return IntPtr.Zero;
}
if (NativeLibrary.TryLoad(libraryName, out var handle))
{
return handle;
}
}

public static void Start( IntPtr nativeTable, int nativeTableSize, string basePath )
{
Environment.SetEnvironmentVariable("SWIFTLY_MANAGED_ROOT", basePath);

NativeBinding.BindNatives(nativeTable, nativeTableSize);

NativeLibrary.SetDllImportResolver(typeof(NativeMethods).Assembly, SteamAPIDLLResolver);

EventPublisher.Register();
GameFunctions.Initialize();
FileLogger.Initialize(basePath);
return IntPtr.Zero;
}

AnsiConsole.Write(new FigletText("SwiftlyS2").LeftJustified().Color(Spectre.Console.Color.LightSteelBlue1));
public static void Start( IntPtr nativeTable, int nativeTableSize, string basePath, string logPath )
{
Environment.SetEnvironmentVariable("SWIFTLY_MANAGED_ROOT", basePath);
NativeBinding.BindNatives(nativeTable, nativeTableSize);
NativeLibrary.SetDllImportResolver(typeof(NativeMethods).Assembly, SteamAPIDLLResolver);

_host = Host.CreateDefaultBuilder()
.UseConsoleLifetime(options =>
{
options.SuppressStatusMessages = true;
})
.ConfigureServices(( context, services ) =>
{
services.AddHostedService<StartupService>();
})
.ConfigureLogging(( context, logging ) =>
{
logging.ClearProviders();
logging.AddProvider(new SwiftlyLoggerProvider("SwiftlyS2"));
})
.ConfigureAppConfiguration(( context, config ) =>
{
config.SetBasePath(Path.Combine(Environment.GetEnvironmentVariable("SWIFTLY_MANAGED_ROOT")!, "configs"));
config.AddJsonFile("permissions.jsonc", optional: false, reloadOnChange: true);
})
.ConfigureServices(( context, services ) =>
{
services
.AddProfileService()
.AddConfigurationService()
.AddTestService()
.AddRootDirService()
.AddDataDirectoryService()
.AddPlayerManagerService()
.AddPluginManager()
.AddHookManager()
.AddTraceManagerService()
.AddPermissionManager()
.AddCoreHookService()
.AddCoreCommandService()
.AddCommandTrackerManager()
.AddCommandTrackerService()
.AddSwiftlyCore(basePath);
})
.Build();
EventPublisher.Register();
GameFunctions.Initialize();
FileLogger.Initialize(logPath);

_host.Start();
AnsiConsole.Write(new FigletText("SwiftlyS2").LeftJustified().Color(Color.LightSteelBlue1));

// provider.UseTestService();
sw2Host = Host.CreateDefaultBuilder()
.UseConsoleLifetime(options =>
{
options.SuppressStatusMessages = true;
})
.ConfigureServices(( context, services ) =>
{
_ = services.AddHostedService<StartupService>();
})
.ConfigureLogging(( context, logging ) =>
{
_ = logging.ClearProviders();
_ = logging.AddProvider(new SwiftlyLoggerProvider("SwiftlyS2"));
})
.ConfigureAppConfiguration(( context, config ) =>
{
_ = config.SetBasePath(Path.Combine(Environment.GetEnvironmentVariable("SWIFTLY_MANAGED_ROOT")!, "configs"));
_ = config.AddJsonFile("permissions.jsonc", optional: false, reloadOnChange: true);
})
.ConfigureServices(( context, services ) =>
{
_ = services
.AddProfileService()
.AddConfigurationService()
.AddTestService()
.AddRootDirService()
.AddDataDirectoryService()
.AddPlayerManagerService()
.AddPluginManager()
.AddHookManager()
.AddTraceManagerService()
.AddPermissionManager()
.AddCoreHookService()
.AddCoreCommandService()
.AddCommandTrackerManager()
.AddCommandTrackerService()
.AddMenuManagerAPI()
.AddMenuManagerAPIService()
.AddSwiftlyCore(basePath);
})
.Build();

}
sw2Host.Start();
// provider.UseTestService();
}
}
12 changes: 12 additions & 0 deletions managed/src/SwiftlyS2.Core/Hosting/MenuManagerAPIInjection.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using Microsoft.Extensions.DependencyInjection;
using SwiftlyS2.Core.Menus;

namespace SwiftlyS2.Core.Hosting;

internal static class MenuManagerAPIInjection
{
public static IServiceCollection AddMenuManagerAPI( this IServiceCollection self )
{
return self.AddSingleton<MenuManagerAPI>();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using Microsoft.Extensions.DependencyInjection;
using SwiftlyS2.Core.Services;

namespace SwiftlyS2.Core.Hosting;

internal static class MenuManagerAPIServiceInjection
{
public static IServiceCollection AddMenuManagerAPIService( this IServiceCollection self )
{
return self.AddSingleton<MenuManagerAPIService>();
}

public static void UseMenuManagerAPIService( this IServiceProvider self )
{
self.GetRequiredService<MenuManagerAPIService>();
}
}
2 changes: 1 addition & 1 deletion managed/src/SwiftlyS2.Core/Misc/FileLogger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ internal static class FileLogger

public static void Initialize( string basePath )
{
var directory = Path.Combine(basePath, "logs");
var directory = basePath;

if (!Directory.Exists(directory))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,13 @@

namespace SwiftlyS2.Core.Events;

internal class OnEntityTakeDamageEvent : IOnEntityTakeDamageEvent {
internal class OnEntityTakeDamageEvent : IOnEntityTakeDamageEvent
{
public required CEntityInstance Entity { get; set; }
public unsafe nint _infoPtr;
public unsafe nint _resultPtr;
public ref CTakeDamageInfo Info => ref _infoPtr.AsRef<CTakeDamageInfo>();
public ref CTakeDamageResult DamageResult => ref _resultPtr.AsRef<CTakeDamageResult>();

public HookResult Result { get; set; } = HookResult.Continue;

Expand Down
7 changes: 4 additions & 3 deletions managed/src/SwiftlyS2.Core/Modules/Events/EventPublisher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public static void Register()
NativeEvents.RegisterOnMapLoadCallback((nint)(delegate* unmanaged< nint, void >)&OnMapLoad);
NativeEvents.RegisterOnMapUnloadCallback((nint)(delegate* unmanaged< nint, void >)&OnMapUnload);
NativeEvents.RegisterOnClientProcessUsercmdsCallback((nint)(delegate* unmanaged< int, nint, int, byte, float, void >)&OnClientProcessUsercmds);
NativeEvents.RegisterOnEntityTakeDamageCallback((nint)(delegate* unmanaged< nint, nint, byte >)&OnEntityTakeDamage);
NativeEvents.RegisterOnEntityTakeDamageCallback((nint)(delegate* unmanaged< nint, nint, nint, byte >)&OnEntityTakeDamage);
NativeEvents.RegisterOnPrecacheResourceCallback((nint)(delegate* unmanaged< nint, void >)&OnPrecacheResource);
NativeConvars.AddConvarCreatedListener((nint)(delegate* unmanaged< nint, void >)&OnConVarCreated);
NativeConvars.AddConCommandCreatedListener((nint)(delegate* unmanaged< nint, void >)&OnConCommandCreated);
Expand Down Expand Up @@ -475,7 +475,7 @@ public static void OnClientProcessUsercmds( int playerId, nint usercmdsPtr, int
}

[UnmanagedCallersOnly]
public static byte OnEntityTakeDamage( nint entityPtr, nint takeDamageInfoPtr )
public static byte OnEntityTakeDamage( nint entityPtr, nint takeDamageInfoPtr, nint takeDamageResultPtr )
{
if (_subscribers.Count == 0) return 1;
try
Expand All @@ -485,7 +485,8 @@ public static byte OnEntityTakeDamage( nint entityPtr, nint takeDamageInfoPtr )
var entity = new CEntityInstanceImpl(entityPtr);
OnEntityTakeDamageEvent @event = new() {
Entity = entity,
_infoPtr = takeDamageInfoPtr
_infoPtr = takeDamageInfoPtr,
_resultPtr = takeDamageResultPtr
};
foreach (var subscriber in _subscribers)
{
Expand Down
17 changes: 17 additions & 0 deletions managed/src/SwiftlyS2.Core/Modules/FileSystem/GameFileSystem.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using System.Runtime.CompilerServices;
using SwiftlyS2.Core.Natives;
using SwiftlyS2.Shared.FileSystem;
using SwiftlyS2.Shared.Natives;

namespace SwiftlyS2.Core.FileSystem;

Expand Down Expand Up @@ -64,4 +66,19 @@ public bool WriteFile( string filePath, string pathId, string content )
{
return NativeFileSystem.WriteFile(filePath, pathId, content);
}

public List<string> FindFileAbsoluteList( string wildcard, string pathId )
{
List<string> results = new();
ManagedCUtlVector<CUtlString> files = new();
unsafe {
fixed (void* filesPtr = &files.Value) {
NativeFileSystem.FindFileAbsoluteList(new IntPtr(filesPtr), wildcard, pathId);
}

files.Value.ToList().ForEach(file => results.Add(file.Value));
}
files.Dispose();
return results;
}
}
Loading
Loading