fighting crashes #1

This commit is contained in:
Juzlus 2026-04-28 18:58:21 +02:00
parent 10dbf6629e
commit 0fb3d63cd8
145 changed files with 677278 additions and 1703 deletions

View file

@ -0,0 +1,82 @@
namespace src.utils
{
public enum Rarity
{
Common,
Uncommon,
Rare,
Epic,
Legendary
}
public static class RarityManager
{
private static readonly object rarityLock = new();
private static Dictionary<Rarity, float> rarityPercentages = new()
{
{ Rarity.Common, 40f },
{ Rarity.Uncommon, 25f },
{ Rarity.Rare, 20f },
{ Rarity.Epic, 10f },
{ Rarity.Legendary, 5f }
};
public static IReadOnlyDictionary<Rarity, float> RarityPercentages
{
get
{
lock (rarityLock)
return rarityPercentages.ToDictionary(k => k.Key, v => v.Value);
}
}
public static void SetRarityPercentages(IDictionary<Rarity, float> percentages)
{
if (percentages == null || percentages.Count == 0) return;
lock (rarityLock)
{
double sum = percentages.Values.Sum(v => (double)v);
if (sum <= 0)
return;
if (Math.Abs(sum - 100.0) > 0.0001)
{
var normalized = new Dictionary<Rarity, float>();
foreach (var kv in percentages)
normalized[kv.Key] = (float)((kv.Value / sum) * 100.0);
rarityPercentages = normalized;
}
else
rarityPercentages = percentages.ToDictionary(k => k.Key, v => v.Value);
}
}
public static float GetRarityPercentage(Rarity rarity)
{
lock (rarityLock)
return rarityPercentages.TryGetValue(rarity, out var v) ? v : 0f;
}
public static Rarity RollRarity()
{
var random = jRandomSkills.Instance?.Random ?? new Random();
double roll = (random.NextDouble()) * 100.0;
double accum = 0.0;
lock (rarityLock)
{
foreach (var r in Enum.GetValues(typeof(Rarity)).Cast<Rarity>())
{
accum += GetRarityPercentage(r);
if (roll <= accum)
return r;
}
}
return Rarity.Common;
}
}
}

View file

@ -30,7 +30,7 @@ namespace src.utils
mask = playerPawn.Collision.CollisionAttribute.InteractsWith | (ulong)InteractionLayers.Hitboxes;
mask &= ~(ulong)InteractionLayers.PlayerClip;
}
contents ??= playerPawn.Collision.CollisionGroup;
contents ??= 0; // playerPawn.Collision.CollisionGroup;
bool drawBeam = Config.LoadedConfig.TraceRayBeam;
@ -42,8 +42,12 @@ namespace src.utils
};
rayTrace.TraceEndShape(startPos, endPos, playerPawn, options, out TraceResult result);
var customResult = new CustomTraceResult(result, startPos, (ulong)mask, (ulong)contents, drawBeam);
return new CustomTraceResult(result, startPos, (ulong)mask, (ulong)contents, drawBeam);
if (drawBeam)
Server.PrintToChatAll($"start: {startPos}, end: {result.EndPos}, didHit: {result.DidHit}, hit: {(customResult.HitEntity(out var entity) && !string.IsNullOrEmpty(entity?.DesignerName) ? entity.DesignerName : "None")}, mask: {(InteractionLayers)mask}, contents: {(InteractionLayers)contents}");
return customResult;
}
public static CustomTraceResult? EyeTrace(CCSPlayerController player)
@ -75,7 +79,7 @@ namespace src.utils
return null;
mask ??= playerPawn.Collision.CollisionAttribute.InteractsWith;
contents ??= playerPawn.Collision.CollisionGroup;
contents ??= 0; // playerPawn.Collision.CollisionGroup;
bool drawBeam = Config.LoadedConfig.TraceRayBeam;

View file

@ -23,6 +23,7 @@ namespace src.utils
private static readonly MemoryFunctionWithReturn<IntPtr, IntPtr, IntPtr, IntPtr, IntPtr, int, int, CSmokeGrenadeProjectile> SmokeGrenadeProjectile_CreateFunc = new(GameData.GetSignature("SmokeGrenadeProjectile_CreateFunc"));
private static readonly MemoryFunctionVoid<nint, float, RoundEndReason, nint, nint> TerminateRoundFunc = new(GameData.GetSignature("CCSGameRules_TerminateRound"));
private static readonly MemoryFunctionVoid<CBasePlayerPawn, QAngle> SnapViewAngles = new(GameData.GetSignature("SnapViewAngles"));
// private static readonly int collisionRulesChangedOffset = GameData.GetOffset("CBaseEntity_CollisionRulesChanged");
public static void PrintToChat(CCSPlayerController player, string? msg, string border = "tb", string? title = null)
{
@ -101,6 +102,36 @@ namespace src.utils
return $"{minutes:D2}:{seconds:D2}";
}
public static void SafeKillEntity<T>(uint? index) where T : CBaseEntity
{
if (index == null) return;
var ent = Utilities.GetEntityFromIndex<T>((int)index);
if (ent == null || !ent.IsValid) return;
ent.AddEntityIOEvent("Kill", ent, delay: 0.1f);
}
public static bool IsValid<T>(this CHandle<T>? handle) where T : NativeEntity
{
return handle != null && handle.IsValid && handle.Value != null;
}
public static bool IsValid(this CBaseEntity? ent)
{
return ent != null && ent.IsValid;
}
public static bool CheckPlayer(this CCSPlayerController? player)
{
return player != null
&& player.IsValid
&& player.PlayerPawn?.Value?.IsValid() == true
&& player.PawnIsAlive
&& (player?.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist);
}
public static Vector GetForwardVector(QAngle angles)
{
float pitch = -angles.X * (float)(Math.PI / 180);
@ -138,6 +169,35 @@ namespace src.utils
return beam;
}
public static void SetPlayerCollisions(CCSPlayerController? player, bool enable)
{
return;
if (player == null || !player.IsValid) return;
var pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid || !player.PawnIsAlive || pawn.CBodyComponent == null) return;
var collision = pawn.Collision;
if (collision == null) return;
var collisionGroup = (byte)(enable ? CollisionGroup.COLLISION_GROUP_PLAYER : CollisionGroup.COLLISION_GROUP_DEBRIS);
collision.CollisionGroup = collisionGroup;
collision.CollisionAttribute.CollisionGroup = collisionGroup;
Utilities.SetStateChanged(pawn, "CCollisionProperty", "m_collisionAttribute");
// CollisionRulesChanged(pawn);
}
//public static void CollisionRulesChanged(CBaseEntity? entity)
//{
// if (entity == null || !entity.IsValid || collisionRulesChangedOffset <= 0) return;
// var collisionRulesChanged = new VirtualFunctionVoid<nint>(entity.Handle, collisionRulesChangedOffset);
// collisionRulesChanged.Invoke(entity.Handle);
//}
public static void ApplyScreenColor(CCSPlayerController? player, int r, int g, int b, int a, int duration, int holdTime, int flags = 1)
{
if (player == null || !player.IsValid) return;

View file

@ -127,7 +127,7 @@ namespace src.utils
}
}
public class DefaultSkillInfo(Skills skill, bool active = true, string color = "#ffffff", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "")
public class DefaultSkillInfo(Skills skill, bool active = true, string color = "#ffffff", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common)
{
public bool NeedsTeammates { get; set; } = needsTeammates;
public bool DisableOnFreezeTime { get; set; } = disableOnFreezeTime;
@ -136,6 +136,9 @@ namespace src.utils
public bool Active { get; set; } = active;
public string Name { get; set; } = skill.ToString();
public string RequiredPermission { get; set; } = requiredPermission;
public int MaxPerServer { get; set; } = maxPerServer;
public string Rarity { get; set; } = rarity.ToString();
}
}
}