Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
420 changes: 222 additions & 198 deletions managed/src/SwiftlyS2.Core/Modules/Convars/ConVar.cs

Large diffs are not rendered by default.

159 changes: 109 additions & 50 deletions managed/src/SwiftlyS2.Core/Modules/Convars/ConVarService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,191 +25,250 @@ internal enum EConVarType : int
EConVarType_MAX
};

internal class ConVarService : IConVarService {
internal class ConVarService : IConVarService
{

public IConVar<T>? Find<T>(string name) {
public IConVar<T>? Find<T>( string name )
{

if (!NativeConvars.ExistsConvar(name)) {
if (!NativeConvars.ExistsConvar(name))
{
return null;
}

return new ConVar<T>(name);

}

public IConVar<T> Create<T>(string name, string helpMessage, T defaultValue, ConvarFlags flags = ConvarFlags.NONE) {
if (NativeConvars.ExistsConvar(name)) {
public IConVar<T> Create<T>( string name, string helpMessage, T defaultValue, ConvarFlags flags = ConvarFlags.NONE )
{
if (NativeConvars.ExistsConvar(name))
{
throw new Exception($"Convar {name} already exists.");
}

if (defaultValue is bool boolValue) {
if (defaultValue is bool boolValue)
{
NativeConvars.CreateConvarBool(name, (int)EConVarType.EConVarType_Bool, (ulong)flags, helpMessage, boolValue, 0, 0);
}
else if (defaultValue is short shortValue) {
else if (defaultValue is short shortValue)
{
NativeConvars.CreateConvarInt16(name, (int)EConVarType.EConVarType_Int16, (ulong)flags, helpMessage, shortValue, 0, 0);
}
else if (defaultValue is ushort ushortValue) {
else if (defaultValue is ushort ushortValue)
{
NativeConvars.CreateConvarUInt16(name, (int)EConVarType.EConVarType_UInt16, (ulong)flags, helpMessage, ushortValue, 0, 0);
}
else if (defaultValue is int intValue) {
else if (defaultValue is int intValue)
{
NativeConvars.CreateConvarInt32(name, (int)EConVarType.EConVarType_Int32, (ulong)flags, helpMessage, intValue, 0, 0);
}
else if (defaultValue is uint uintValue) {
else if (defaultValue is uint uintValue)
{
NativeConvars.CreateConvarUInt32(name, (int)EConVarType.EConVarType_UInt32, (ulong)flags, helpMessage, uintValue, 0, 0);
}
else if (defaultValue is long longValue) {
else if (defaultValue is long longValue)
{
NativeConvars.CreateConvarInt64(name, (int)EConVarType.EConVarType_Int64, (ulong)flags, helpMessage, longValue, 0, 0);
}
else if (defaultValue is ulong ulongValue) {
else if (defaultValue is ulong ulongValue)
{
NativeConvars.CreateConvarUInt64(name, (int)EConVarType.EConVarType_UInt64, (ulong)flags, helpMessage, ulongValue, 0, 0);
}
else if (defaultValue is float floatValue) {
else if (defaultValue is float floatValue)
{
NativeConvars.CreateConvarFloat(name, (int)EConVarType.EConVarType_Float32, (ulong)flags, helpMessage, floatValue, 0, 0);
}
else if (defaultValue is double doubleValue) {
else if (defaultValue is double doubleValue)
{
NativeConvars.CreateConvarDouble(name, (int)EConVarType.EConVarType_Float64, (ulong)flags, helpMessage, doubleValue, 0, 0);
}
else if (defaultValue is Vector2D vector2Value) {
else if (defaultValue is Vector2D vector2Value)
{
NativeConvars.CreateConvarVector2D(name, (int)EConVarType.EConVarType_Vector2, (ulong)flags, helpMessage, vector2Value, 0, 0);
}
else if (defaultValue is Vector vector3Value) {
else if (defaultValue is Vector vector3Value)
{
NativeConvars.CreateConvarVector(name, (int)EConVarType.EConVarType_Vector3, (ulong)flags, helpMessage, vector3Value, 0, 0);
}
else if (defaultValue is Vector4D vector4Value) {
else if (defaultValue is Vector4D vector4Value)
{
NativeConvars.CreateConvarVector4D(name, (int)EConVarType.EConVarType_Vector4, (ulong)flags, helpMessage, vector4Value, 0, 0);
}
else if (defaultValue is QAngle qAngleValue) {
else if (defaultValue is QAngle qAngleValue)
{
NativeConvars.CreateConvarQAngle(name, (int)EConVarType.EConVarType_Qangle, (ulong)flags, helpMessage, qAngleValue, 0, 0);
}
else if (defaultValue is Color colorValue) {
else if (defaultValue is Color colorValue)
{
NativeConvars.CreateConvarColor(name, (int)EConVarType.EConVarType_Color, (ulong)flags, helpMessage, colorValue, 0, 0);
}
else if (defaultValue is string stringValue) {
else if (defaultValue is string stringValue)
{
NativeConvars.CreateConvarString(name, (int)EConVarType.EConVarType_String, (ulong)flags, helpMessage, stringValue, 0, 0);
}
else {
else
{
throw new Exception($"Unsupported type {typeof(T)}.");
}

return new ConVar<T>(name);
}

public IConVar<T> Create<T>(string name, string helpMessage, T defaultValue, T? minValue = null, T? maxValue = null, ConvarFlags flags = ConvarFlags.NONE) where T : unmanaged {

if (NativeConvars.ExistsConvar(name)) {
public IConVar<T> Create<T>( string name, string helpMessage, T defaultValue, T? minValue, T? maxValue, ConvarFlags flags = ConvarFlags.NONE ) where T : unmanaged
{

if (NativeConvars.ExistsConvar(name))
{
throw new Exception($"Convar {name} already exists.");
}
unsafe {
unsafe
{

if (defaultValue is short shortValue) {
if (defaultValue is short shortValue)
{
short* pMin = stackalloc short[1];
if (minValue.HasValue) {
if (minValue.HasValue)
{
pMin[0] = (short)(object)minValue.Value;
}

short* pMax = stackalloc short[1];
if (maxValue.HasValue) {
if (maxValue.HasValue)
{
pMax[0] = (short)(object)maxValue.Value;
}

NativeConvars.CreateConvarInt16(name, (int)EConVarType.EConVarType_Int16, (ulong)flags, helpMessage, shortValue, minValue.HasValue ? (nint)pMin : 0, maxValue.HasValue ? (nint)pMax : 0);
}
else if (defaultValue is ushort ushortValue) {
else if (defaultValue is ushort ushortValue)
{
ushort* pMin = stackalloc ushort[1];
if (minValue.HasValue) {
if (minValue.HasValue)
{
pMin[0] = (ushort)(object)minValue.Value;
}

ushort* pMax = stackalloc ushort[1];
if (maxValue.HasValue) {
if (maxValue.HasValue)
{
pMax[0] = (ushort)(object)maxValue.Value;
}

NativeConvars.CreateConvarUInt16(name, (int)EConVarType.EConVarType_UInt16, (ulong)flags, helpMessage, ushortValue, minValue.HasValue ? (nint)pMin : 0, maxValue.HasValue ? (nint)pMax : 0);
}
else if (defaultValue is int intValue) {
else if (defaultValue is int intValue)
{
int* pMin = stackalloc int[1];
if (minValue.HasValue) {
if (minValue.HasValue)
{
pMin[0] = (int)(object)minValue.Value;
}

int* pMax = stackalloc int[1];
if (maxValue.HasValue) {
if (maxValue.HasValue)
{
pMax[0] = (int)(object)maxValue.Value;
}

NativeConvars.CreateConvarInt32(name, (int)EConVarType.EConVarType_Int32, (ulong)flags, helpMessage, intValue, minValue.HasValue ? (nint)pMin : 0, maxValue.HasValue ? (nint)pMax : 0);
}
else if (defaultValue is uint uintValue) {
else if (defaultValue is uint uintValue)
{
uint* pMin = stackalloc uint[1];
if (minValue.HasValue) {
if (minValue.HasValue)
{
pMin[0] = (uint)(object)minValue.Value;
}

uint* pMax = stackalloc uint[1];
if (maxValue.HasValue) {
if (maxValue.HasValue)
{
pMax[0] = (uint)(object)maxValue.Value;
}

NativeConvars.CreateConvarUInt32(name, (int)EConVarType.EConVarType_UInt32, (ulong)flags, helpMessage, uintValue, minValue.HasValue ? (nint)pMin : 0, maxValue.HasValue ? (nint)pMax : 0);
}
else if (defaultValue is long longValue) {
else if (defaultValue is long longValue)
{
long* pMin = stackalloc long[1];
if (minValue.HasValue) {
if (minValue.HasValue)
{
pMin[0] = (long)(object)minValue.Value;
}

long* pMax = stackalloc long[1];
if (maxValue.HasValue) {
if (maxValue.HasValue)
{
pMax[0] = (long)(object)maxValue.Value;
}

NativeConvars.CreateConvarInt64(name, (int)EConVarType.EConVarType_Int64, (ulong)flags, helpMessage, longValue, minValue.HasValue ? (nint)pMin : 0, maxValue.HasValue ? (nint)pMax : 0);
}
else if (defaultValue is ulong ulongValue) {
else if (defaultValue is ulong ulongValue)
{
ulong* pMin = stackalloc ulong[1];
if (minValue.HasValue) {
if (minValue.HasValue)
{
pMin[0] = (ulong)(object)minValue.Value;
}

ulong* pMax = stackalloc ulong[1];
if (maxValue.HasValue) {
if (maxValue.HasValue)
{
pMax[0] = (ulong)(object)maxValue.Value;
}

NativeConvars.CreateConvarUInt64(name, (int)EConVarType.EConVarType_UInt64, (ulong)flags, helpMessage, ulongValue, minValue.HasValue ? (nint)pMin : 0, maxValue.HasValue ? (nint)pMax : 0);
}
else if (defaultValue is float floatValue) {
else if (defaultValue is float floatValue)
{
float* pMin = stackalloc float[1];
if (minValue.HasValue) {
if (minValue.HasValue)
{
pMin[0] = (float)(object)minValue.Value;
}

float* pMax = stackalloc float[1];
if (maxValue.HasValue) {
if (maxValue.HasValue)
{
pMax[0] = (float)(object)maxValue.Value;
}

NativeConvars.CreateConvarFloat(name, (int)EConVarType.EConVarType_Float32, (ulong)flags, helpMessage, floatValue, minValue.HasValue ? (nint)pMin : 0, maxValue.HasValue ? (nint)pMax : 0);
}
else if (defaultValue is double doubleValue) {
else if (defaultValue is double doubleValue)
{
double* pMin = stackalloc double[1];
if (minValue.HasValue) {
if (minValue.HasValue)
{
pMin[0] = (double)(object)minValue.Value;
}

double* pMax = stackalloc double[1];
if (maxValue.HasValue) {
if (maxValue.HasValue)
{
pMax[0] = (double)(object)maxValue.Value;
}

NativeConvars.CreateConvarDouble(name, (int)EConVarType.EConVarType_Float64, (ulong)flags, helpMessage, doubleValue, minValue.HasValue ? (nint)pMin : 0, maxValue.HasValue ? (nint)pMax : 0);
}
else {
else
{
throw new Exception($"You can't assign min and max values to {typeof(T)}.");
}
}

return new ConVar<T>(name);
}

public IConVar<T> CreateOrFind<T>( string name, string helpMessage, T defaultValue, ConvarFlags flags = ConvarFlags.NONE )
{
return NativeConvars.ExistsConvar(name) ? new ConVar<T>(name) : Create(name, helpMessage, defaultValue, flags);
}

public IConVar<T> CreateOrFind<T>( string name, string helpMessage, T defaultValue, T? minValue, T? maxValue, ConvarFlags flags = ConvarFlags.NONE ) where T : unmanaged
{
return NativeConvars.ExistsConvar(name) ? new ConVar<T>(name) : Create(name, helpMessage, defaultValue, minValue, maxValue, flags);
}
}
27 changes: 25 additions & 2 deletions managed/src/SwiftlyS2.Core/Services/TestService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,16 +37,39 @@ ISwiftlyCore core
_Core = core;
_Logger = logger;

_Logger.LogWarning("TestService created");
_Logger.LogWarning("TestService created");
_Logger.LogWarning("TestService created");
_Logger.LogWarning("TestService created");
_Logger.LogWarning("TestService created");
_Logger.LogWarning("TestService created");
_Logger.LogWarning("TestService created");
_Logger.LogWarning("TestService created");
_Logger.LogWarning("TestService created");

Test();
}


public void Test()
{
_Core.Event.OnEntityDeleted += (@event) => {
Console.WriteLine("Entity deleted: " + @event.Entity.Entity?.DesignerName);
};
_Core.Command.RegisterCommand("rrr", (context) => {
_Core.Engine.ExecuteCommandWithBuffer("echo 1", (buffer) => {
Console.WriteLine(buffer);

_Core.EntitySystem.GetAllEntities().ToList().ForEach(entity => {
entity.Entity.Flags |= 0x200;
});

var a = _Core.ConVar.Create("test_convar", "Test convar", "abc");

Console.WriteLine(a.Value);
a.SetInternal("ghi");

Console.WriteLine(a.Value);
a.Value = "def";
Console.WriteLine(a.Value);
});
// _Core.Event.OnItemServicesCanAcquireHook += (@event) => {
// Console.WriteLine(@event.EconItemView.ItemDefinitionIndex);
Expand Down
Loading
Loading