feat: add BasePower abstraction
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<AssemblyName>Cs2SuperPowersPlugin</AssemblyName>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.340" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,304 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Core.Attributes.Registration;
|
||||
using CounterStrikeSharp.API.Modules.Commands;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Powers;
|
||||
using Cs2SuperPowers.Powers.Assign;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace Cs2SuperPowers;
|
||||
|
||||
public class Cs2SuperPowersPlugin : BasePlugin
|
||||
{
|
||||
public override string ModuleName => "Cs2SuperPowersPlugin";
|
||||
public override string ModuleVersion => "0.1.0";
|
||||
public override string ModuleAuthor => "Latoch";
|
||||
public override string ModuleDescription => "This CS2 server plugin unleashes the divine within! Experience a chaotic and exhilarating gameplay where players wield incredible superpowers.";
|
||||
|
||||
private readonly ISuperPower[] _superPowers;
|
||||
private readonly IPowerAssignLogic _powerAssignLogic;
|
||||
private readonly IPlayerHud _playerHud;
|
||||
private readonly Random _random = new Random();
|
||||
|
||||
// Store listener delegate to prevent garbage collection!
|
||||
private readonly Listeners.CheckTransmit _checkTransmitHandler;
|
||||
|
||||
public Cs2SuperPowersPlugin(IEnumerable<ISuperPower> superPowers, IPowerAssignLogic powerAssignLogic, IPlayerHud playerHud) : base()
|
||||
{
|
||||
_superPowers = superPowers.ToArray();
|
||||
_powerAssignLogic = powerAssignLogic;
|
||||
_playerHud = playerHud;
|
||||
|
||||
// Initialize CheckTransmit handler here to store a reference!
|
||||
_checkTransmitHandler = OnCheckTransmit;
|
||||
}
|
||||
|
||||
public override void Load(bool hotReload)
|
||||
{
|
||||
Logger.LogInformation("Loading {ModuleName} with HotReload = {HotReload}", ModuleName, hotReload);
|
||||
base.Load(hotReload);
|
||||
|
||||
// Register CheckTransmit listener using stored handler!
|
||||
RegisterListener<Listeners.CheckTransmit>(_checkTransmitHandler);
|
||||
|
||||
foreach (var superPower in _superPowers)
|
||||
{
|
||||
Logger.LogInformation("Initializing SuperPower {Name} with Id = {Id}", superPower.Name, superPower.Id);
|
||||
superPower.Initialize(this);
|
||||
Logger.LogInformation("Finished Initializing SuperPower {Name}", superPower.Name);
|
||||
}
|
||||
_playerHud.Initialize(this);
|
||||
_powerAssignLogic.Initialize(this, _superPowers);
|
||||
Logger.LogInformation("Finished loading {ModuleName} with HotReload = {HotReload}", ModuleName, hotReload);
|
||||
}
|
||||
|
||||
public void OnCheckTransmit(CCheckTransmitInfoList infoList)
|
||||
{
|
||||
foreach ((CCheckTransmitInfo info, CCSPlayerController? player) in infoList)
|
||||
{
|
||||
if (player == null || !player.IsValid) continue;
|
||||
Wallhack._onPlayerTransmitHandler(info, player);
|
||||
}
|
||||
}
|
||||
|
||||
[ConsoleCommand("css_reroll", "Reroll your super power")]
|
||||
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_ONLY)]
|
||||
public void OnRerollCommand(CCSPlayerController? player, CommandInfo command)
|
||||
{
|
||||
if (player == null || !player.IsValid || !player.PawnIsAlive)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var activePlayerCount = Utilities.GetPlayers().Count(currentPlayer =>
|
||||
currentPlayer.IsValid && currentPlayer.Team != CsTeam.None && currentPlayer.Team != CsTeam.Spectator);
|
||||
var randomAssignablePowers = _superPowers
|
||||
.Where(power => power.CanBeRandomlyAssigned && power.MinimumPlayersRequired <= activePlayerCount)
|
||||
.ToArray();
|
||||
if (randomAssignablePowers.Length == 0)
|
||||
{
|
||||
player.PrintToChat("No eligible powers are available right now.");
|
||||
return;
|
||||
}
|
||||
|
||||
var randomPower = randomAssignablePowers[_random.Next(randomAssignablePowers.Length)];
|
||||
PlayerPowers.Instance.AddPower(player, randomPower, showMessages: true);
|
||||
}
|
||||
|
||||
[ConsoleCommand("css_forcepower", "Force a super power on a player: /forcepower <player name> <power name or id>")]
|
||||
[CommandHelper(minArgs: 2, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
|
||||
public void OnForcePowerCommand(CCSPlayerController? caller, CommandInfo command)
|
||||
{
|
||||
var playerNameArg = command.GetArg(1);
|
||||
var powerArg = command.GetArg(2);
|
||||
|
||||
// Find target player
|
||||
CCSPlayerController? targetPlayer = null;
|
||||
foreach (var player in Utilities.GetPlayers())
|
||||
{
|
||||
if (player.IsValid && player.PlayerName.Contains(playerNameArg, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
targetPlayer = player;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (targetPlayer == null)
|
||||
{
|
||||
command.ReplyToCommand($"Could not find player containing '{playerNameArg}'");
|
||||
return;
|
||||
}
|
||||
|
||||
// Find power
|
||||
ISuperPower? targetPower = null;
|
||||
if (int.TryParse(powerArg, out var powerId))
|
||||
{
|
||||
targetPower = _superPowers.FirstOrDefault(p => p.Id == powerId);
|
||||
}
|
||||
else
|
||||
{
|
||||
targetPower = _superPowers.FirstOrDefault(p => p.Name.Contains(powerArg, StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
if (targetPower == null)
|
||||
{
|
||||
command.ReplyToCommand($"Could not find power '{powerArg}'");
|
||||
return;
|
||||
}
|
||||
|
||||
// Assign power
|
||||
PlayerPowers.Instance.AddPower(targetPlayer, targetPower, showMessages: true);
|
||||
command.ReplyToCommand($"Gave {targetPlayer.PlayerName} the power '{targetPower.Name}'");
|
||||
}
|
||||
|
||||
[ConsoleCommand("css_nodelay", "Turn off cooldowns for Grenade Launcher, Not So Decoy, and Air Strike!")]
|
||||
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
|
||||
public void OnNoDelayCommand(CCSPlayerController? caller, CommandInfo command)
|
||||
{
|
||||
GlobalConfig.NoDelayEnabled = true;
|
||||
if (caller != null && caller.IsValid)
|
||||
{
|
||||
caller.PrintToChat($"NoDelay mode turned ON! Cooldowns disabled for Grenade Launcher, Not So Decoy, Air Strike!");
|
||||
}
|
||||
else
|
||||
{
|
||||
Server.PrintToChatAll($"NoDelay mode turned ON! Cooldowns disabled for Grenade Launcher, Not So Decoy, Air Strike!");
|
||||
}
|
||||
}
|
||||
|
||||
[ConsoleCommand("css_delay", "Turn on cooldowns for Grenade Launcher, Not So Decoy, and Air Strike!")]
|
||||
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
|
||||
public void OnDelayCommand(CCSPlayerController? caller, CommandInfo command)
|
||||
{
|
||||
GlobalConfig.NoDelayEnabled = false;
|
||||
if (caller != null && caller.IsValid)
|
||||
{
|
||||
caller.PrintToChat($"NoDelay mode turned OFF! Cooldowns re-enabled!");
|
||||
}
|
||||
else
|
||||
{
|
||||
Server.PrintToChatAll($"NoDelay mode turned OFF! Cooldowns re-enabled!");
|
||||
}
|
||||
}
|
||||
|
||||
[ConsoleCommand("css_boost", "Shows boost levels for all abilities.")]
|
||||
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
|
||||
public void OnBoostCommand(CCSPlayerController? caller, CommandInfo command)
|
||||
{
|
||||
string message = $"Boost Levels:\n GrenadeLauncher: {GlobalConfig.GrenadeLauncherBoostLevel} ({GlobalConfig.GetGrenadeLauncherCount(1)}x)\n NotSoDecoy: {GlobalConfig.NotSoDecoyBoostLevel} ({GlobalConfig.GetNotSoDecoyCount(20)} grenades)\n AirStrike: {GlobalConfig.AirStrikeBoostLevel} ({GlobalConfig.GetAirStrikeCount(20)} grenades)\n Dropped Nades: {GlobalConfig.DroppedNadesBoostLevel} ({GlobalConfig.GetDroppedNadesCount(5)} grenades)";
|
||||
if (caller != null && caller.IsValid)
|
||||
{
|
||||
caller.PrintToChat(message);
|
||||
}
|
||||
else
|
||||
{
|
||||
Server.PrintToChatAll(message);
|
||||
}
|
||||
}
|
||||
|
||||
[ConsoleCommand("css_boost_grenade", "Sets boost level for GrenadeLauncher (0+).")]
|
||||
[CommandHelper(minArgs: 1, usage: "[level >= 0]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
|
||||
public void OnBoostGrenadeCommand(CCSPlayerController? caller, CommandInfo command)
|
||||
{
|
||||
if (int.TryParse(command.GetArg(1), out int level) && level >= 0)
|
||||
{
|
||||
GlobalConfig.GrenadeLauncherBoostLevel = level;
|
||||
string message = $"GrenadeLauncher Boost Level set to {level} ({GlobalConfig.GetGrenadeLauncherCount(1)}x)!";
|
||||
if (caller != null && caller.IsValid)
|
||||
{
|
||||
caller.PrintToChat(message);
|
||||
}
|
||||
else
|
||||
{
|
||||
Server.PrintToChatAll(message);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
string message = "Invalid level! Use 0 or higher.";
|
||||
if (caller != null && caller.IsValid)
|
||||
{
|
||||
caller.PrintToChat(message);
|
||||
}
|
||||
else
|
||||
{
|
||||
Server.PrintToChatAll(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[ConsoleCommand("css_boost_decoy", "Sets boost level for NotSoDecoy (0+).")]
|
||||
[CommandHelper(minArgs: 1, usage: "[level >= 0]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
|
||||
public void OnBoostDecoyCommand(CCSPlayerController? caller, CommandInfo command)
|
||||
{
|
||||
if (int.TryParse(command.GetArg(1), out int level) && level >= 0)
|
||||
{
|
||||
GlobalConfig.NotSoDecoyBoostLevel = level;
|
||||
string message = $"NotSoDecoy Boost Level set to {level} ({GlobalConfig.GetNotSoDecoyCount(20)} grenades)!";
|
||||
if (caller != null && caller.IsValid)
|
||||
{
|
||||
caller.PrintToChat(message);
|
||||
}
|
||||
else
|
||||
{
|
||||
Server.PrintToChatAll(message);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
string message = "Invalid level! Use 0 or higher.";
|
||||
if (caller != null && caller.IsValid)
|
||||
{
|
||||
caller.PrintToChat(message);
|
||||
}
|
||||
else
|
||||
{
|
||||
Server.PrintToChatAll(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[ConsoleCommand("css_boost_airstrike", "Sets boost level for AirStrike (0+).")]
|
||||
[CommandHelper(minArgs: 1, usage: "[level >= 0]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
|
||||
public void OnBoostAirstrikeCommand(CCSPlayerController? caller, CommandInfo command)
|
||||
{
|
||||
if (int.TryParse(command.GetArg(1), out int level) && level >= 0)
|
||||
{
|
||||
GlobalConfig.AirStrikeBoostLevel = level;
|
||||
string message = $"AirStrike Boost Level set to {level} ({GlobalConfig.GetAirStrikeCount(20)} grenades)!";
|
||||
if (caller != null && caller.IsValid)
|
||||
{
|
||||
caller.PrintToChat(message);
|
||||
}
|
||||
else
|
||||
{
|
||||
Server.PrintToChatAll(message);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
string message = "Invalid level! Use 0 or higher.";
|
||||
if (caller != null && caller.IsValid)
|
||||
{
|
||||
caller.PrintToChat(message);
|
||||
}
|
||||
else
|
||||
{
|
||||
Server.PrintToChatAll(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[ConsoleCommand("css_boost_dropped_nades", "Sets boost level for Dropped Nades (0+).")]
|
||||
[CommandHelper(minArgs: 1, usage: "[level >= 0]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
|
||||
public void OnBoostDroppedNadesCommand(CCSPlayerController? caller, CommandInfo command)
|
||||
{
|
||||
if (int.TryParse(command.GetArg(1), out int level) && level >= 0)
|
||||
{
|
||||
GlobalConfig.DroppedNadesBoostLevel = level;
|
||||
string message = $"Dropped Nades Boost Level set to {level} ({GlobalConfig.GetDroppedNadesCount(5)} grenades)!";
|
||||
if (caller != null && caller.IsValid)
|
||||
{
|
||||
caller.PrintToChat(message);
|
||||
}
|
||||
else
|
||||
{
|
||||
Server.PrintToChatAll(message);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
string message = "Invalid level! Use 0 or higher.";
|
||||
if (caller != null && caller.IsValid)
|
||||
{
|
||||
caller.PrintToChat(message);
|
||||
}
|
||||
else
|
||||
{
|
||||
Server.PrintToChatAll(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Powers;
|
||||
using Cs2SuperPowers.Powers.Assign;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
namespace Cs2SuperPowers;
|
||||
|
||||
public class Cs2SuperPowersPluginDependencyInjection : IPluginServiceCollection<Cs2SuperPowersPlugin>
|
||||
{
|
||||
public void ConfigureServices(IServiceCollection services)
|
||||
{
|
||||
services.AddSingleton<ISuperPower, RiseFromTheDead>();
|
||||
services.AddSingleton<ISuperPower, FlashProof>();
|
||||
services.AddSingleton<ISuperPower, IronHead>();
|
||||
services.AddSingleton<ISuperPower, Phoenix>();
|
||||
services.AddSingleton<ISuperPower, Rambo>();
|
||||
services.AddSingleton<ISuperPower, ArmBreaker>();
|
||||
services.AddSingleton<ISuperPower, Ghost>();
|
||||
services.AddSingleton<ISuperPower, FinalMission>();
|
||||
services.AddSingleton<ISuperPower, IAmChicken>();
|
||||
services.AddSingleton<ISuperPower, OneShot>();
|
||||
services.AddSingleton<ISuperPower, Vampire>();
|
||||
services.AddSingleton<ISuperPower, BulletStorm>();
|
||||
services.AddSingleton<ISuperPower, Twister>();
|
||||
services.AddSingleton<ISuperPower, PowerThief>();
|
||||
services.AddSingleton<ISuperPower, BlindingLight>();
|
||||
services.AddSingleton<ISuperPower, FlashKing>();
|
||||
services.AddSingleton<ISuperPower, IronBody>();
|
||||
// mine
|
||||
services.AddSingleton<ISuperPower, GoFast>();
|
||||
services.AddSingleton<ISuperPower, TeleportOnKill>();
|
||||
services.AddSingleton<ISuperPower, GrenadeLauncher>();
|
||||
services.AddSingleton<ISuperPower, AirStrike>();
|
||||
services.AddSingleton<ISuperPower, NotSoDecoy>();
|
||||
services.AddSingleton<ISuperPower, PanicTeleport>();
|
||||
services.AddSingleton<ISuperPower, Wallhack>();
|
||||
services.AddSingleton<ISuperPower, DoubleJump>();
|
||||
services.AddSingleton<ISuperPower, RandomTeleport>();
|
||||
services.AddSingleton<ISuperPower, ExplosiveBullets>();
|
||||
services.AddSingleton<ISuperPower, Shield>();
|
||||
services.AddSingleton<ISuperPower, Jetpack>();
|
||||
services.AddSingleton<ISuperPower, DroppedNades>();
|
||||
|
||||
services.AddSingleton<IPowerAssignLogic, RandomAssignLogic>();
|
||||
services.AddSingleton<IPlayerHud, PlayerHud>();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
namespace Cs2SuperPowers;
|
||||
|
||||
public static class GlobalConfig
|
||||
{
|
||||
public static bool NoDelayEnabled { get; set; } = false;
|
||||
|
||||
// Boost levels stack linearly: level 0 = base value, level 1 = 2x, level 2 = 3x, etc.
|
||||
public static int GrenadeLauncherBoostLevel { get; set; } = 0;
|
||||
public static int NotSoDecoyBoostLevel { get; set; } = 0;
|
||||
public static int AirStrikeBoostLevel { get; set; } = 0;
|
||||
public static int DroppedNadesBoostLevel { get; set; } = 0;
|
||||
|
||||
public static int GetGrenadeLauncherCount(int baseCount)
|
||||
{
|
||||
return GetBoostedCount(baseCount, GrenadeLauncherBoostLevel);
|
||||
}
|
||||
|
||||
public static int GetNotSoDecoyCount(int baseCount)
|
||||
{
|
||||
return GetBoostedCount(baseCount, NotSoDecoyBoostLevel);
|
||||
}
|
||||
|
||||
public static int GetAirStrikeCount(int baseCount)
|
||||
{
|
||||
return GetBoostedCount(baseCount, AirStrikeBoostLevel);
|
||||
}
|
||||
|
||||
public static int GetDroppedNadesCount(int baseCount)
|
||||
{
|
||||
return GetBoostedCount(baseCount, DroppedNadesBoostLevel);
|
||||
}
|
||||
|
||||
private static int GetBoostedCount(int baseCount, int level)
|
||||
{
|
||||
if (baseCount <= 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (level <= 0)
|
||||
{
|
||||
return baseCount;
|
||||
}
|
||||
|
||||
long boostedCount = (long)baseCount * (level + 1L);
|
||||
return boostedCount > int.MaxValue ? int.MaxValue : (int)boostedCount;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
using CounterStrikeSharp.API.Core;
|
||||
|
||||
namespace Cs2SuperPowers;
|
||||
|
||||
public interface ISuperPower
|
||||
{
|
||||
int Id { get; }
|
||||
string Name { get; }
|
||||
string Description { get; }
|
||||
char ChatColor { get; }
|
||||
bool CanBeRandomlyAssigned { get; }
|
||||
int MinimumPlayersRequired { get; }
|
||||
|
||||
void Initialize(BasePlugin pluginRef);
|
||||
void AssignToPlayer(CCSPlayerController player, bool showMessages);
|
||||
void UnassignFromPlayer(CCSPlayerController player);
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using Cs2SuperPowers.Powers;
|
||||
|
||||
namespace Cs2SuperPowers;
|
||||
|
||||
public class PlayerPowers
|
||||
{
|
||||
private static PlayerPowers? _instance;
|
||||
public static PlayerPowers Instance => _instance ??= new PlayerPowers();
|
||||
|
||||
private readonly IDictionary<CCSPlayerController, ISuperPower> _superPowers
|
||||
= new Dictionary<CCSPlayerController, ISuperPower>();
|
||||
|
||||
public void RemovePower(CCSPlayerController player)
|
||||
{
|
||||
if (!_superPowers.TryGetValue(player, out var superPower)) return;
|
||||
|
||||
superPower.UnassignFromPlayer(player);
|
||||
_superPowers.Remove(player);
|
||||
}
|
||||
|
||||
public void AddPower(CCSPlayerController player, ISuperPower superPower, bool showMessages)
|
||||
{
|
||||
if (_superPowers.TryGetValue(player, out var existingSuperPower))
|
||||
{
|
||||
existingSuperPower.UnassignFromPlayer(player);
|
||||
_superPowers.Remove(player);
|
||||
};
|
||||
|
||||
superPower.AssignToPlayer(player, showMessages);
|
||||
_superPowers.Add(player, superPower);
|
||||
}
|
||||
|
||||
public bool TryGetValue(CCSPlayerController attacker, out ISuperPower? power)
|
||||
=> _superPowers.TryGetValue(attacker, out power);
|
||||
|
||||
public IEnumerable<(CCSPlayerController Player, ISuperPower Power)> GetAssignedPowers()
|
||||
=> _superPowers.Select(x => (x.Key, x.Value));
|
||||
|
||||
public IEnumerable<CCSPlayerController> GetPlayersWithPower(ISuperPower power)
|
||||
=> GetAssignedPowers().Where(x => x.Power.Id == power.Id).Select(x => x.Player);
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
using CounterStrikeSharp.API.Core;
|
||||
|
||||
namespace Cs2SuperPowers.Players;
|
||||
|
||||
public static class Ensure
|
||||
{
|
||||
public static ValidationBuilder<CCSPlayerController> Player(CCSPlayerController? player)
|
||||
{
|
||||
return new ValidationBuilder<CCSPlayerController>(player);
|
||||
}
|
||||
}
|
||||
|
||||
public class ValidationBuilder<TEntity>(TEntity? entity)
|
||||
{
|
||||
private readonly Queue<IValidation<TEntity>> _validations = new();
|
||||
|
||||
public void Add(IValidation<TEntity> validation)
|
||||
{
|
||||
_validations.Enqueue(validation);
|
||||
}
|
||||
|
||||
public bool Check()
|
||||
{
|
||||
return _validations.All(v => v.Validate(entity));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
using CounterStrikeSharp.API.Core;
|
||||
|
||||
namespace Cs2SuperPowers.Players;
|
||||
|
||||
public interface IPlayerHud {
|
||||
void Initialize(BasePlugin pluginRef);
|
||||
void ShowMessage(CCSPlayerController player, string message, TimeSpan? duration = null);
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Cs2SuperPowers.Players;
|
||||
|
||||
public interface IValidation<in TEntity>
|
||||
{
|
||||
bool Validate(TEntity? entity);
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
|
||||
namespace Cs2SuperPowers.Players;
|
||||
|
||||
public static class PlayerControllerExtensions
|
||||
{
|
||||
public static CCSPlayerController SetNewHealth(this CCSPlayerController player, int health)
|
||||
{
|
||||
var pawn = player.PlayerPawn.Value;
|
||||
if (pawn == null) return player;
|
||||
|
||||
player.MaxHealth = health;
|
||||
pawn.MaxHealth = health;
|
||||
|
||||
player.Health = health;
|
||||
pawn.Health = health;
|
||||
|
||||
Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth");
|
||||
return player;
|
||||
}
|
||||
|
||||
public static CCSPlayerController SetMaxHealth(this CCSPlayerController player, int maxHealth)
|
||||
{
|
||||
var pawn = player.PlayerPawn.Value;
|
||||
if (pawn == null) return player;
|
||||
|
||||
player.MaxHealth = maxHealth;
|
||||
pawn.MaxHealth = maxHealth;
|
||||
|
||||
player.Health = Math.Min(maxHealth, player.Health);
|
||||
pawn.Health = Math.Min(maxHealth, pawn.Health);;
|
||||
|
||||
Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth");
|
||||
return player;
|
||||
}
|
||||
|
||||
public static float GetSpeed(this CCSPlayerController player)
|
||||
{
|
||||
var pawn = player.PlayerPawn.Value;
|
||||
if (pawn == null) return 1.0f;
|
||||
return pawn.VelocityModifier;
|
||||
}
|
||||
|
||||
public static CCSPlayerController SetNewSpeed(this CCSPlayerController player, float speed)
|
||||
{
|
||||
var pawn = player.PlayerPawn.Value;
|
||||
if (pawn == null) return player;
|
||||
|
||||
pawn.VelocityModifier = speed;
|
||||
Utilities.SetStateChanged(pawn, "CCSPlayer_MovementServices", "m_flVelocityModifier");
|
||||
return player;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
|
||||
namespace Cs2SuperPowers.Players;
|
||||
|
||||
public class PlayerHud : IPlayerHud
|
||||
{
|
||||
private readonly Dictionary<CCSPlayerController, DisposableMessage> _playerMessages = new();
|
||||
private readonly List<Delegate> _registeredDelegates = new();
|
||||
|
||||
public void Initialize(BasePlugin pluginRef)
|
||||
{
|
||||
Listeners.OnTick onTickListener = OnTick;
|
||||
_registeredDelegates.Add(onTickListener);
|
||||
pluginRef.RegisterListener(onTickListener);
|
||||
}
|
||||
|
||||
public void ShowMessage(CCSPlayerController player, string message, TimeSpan? duration = null)
|
||||
{
|
||||
duration ??= TimeSpan.FromSeconds(10);
|
||||
if (_playerMessages.ContainsKey(player))
|
||||
{
|
||||
_playerMessages.Remove(player);
|
||||
}
|
||||
_playerMessages.Add(player, new DisposableMessage(message, DateTime.UtcNow.Add(duration.Value)));
|
||||
}
|
||||
|
||||
private void OnTick()
|
||||
{
|
||||
var toRemove = new List<CCSPlayerController>();
|
||||
|
||||
foreach (var playerMessage in _playerMessages.ToList())
|
||||
{
|
||||
if (playerMessage.Value.DisplayUntil >= DateTime.UtcNow)
|
||||
{
|
||||
playerMessage.Key.PrintToCenterHtml(playerMessage.Value.Message);
|
||||
}
|
||||
else
|
||||
{
|
||||
toRemove.Add(playerMessage.Key);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var player in toRemove)
|
||||
{
|
||||
Action? wrappedCallback = null;
|
||||
wrappedCallback = () =>
|
||||
{
|
||||
_playerMessages.Remove(player);
|
||||
if (wrappedCallback != null)
|
||||
{
|
||||
_registeredDelegates.Remove(wrappedCallback);
|
||||
}
|
||||
};
|
||||
_registeredDelegates.Add(wrappedCallback);
|
||||
Server.NextFrame(wrappedCallback);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
record DisposableMessage(string Message, DateTime DisplayUntil);
|
||||
@@ -0,0 +1,20 @@
|
||||
using CounterStrikeSharp.API.Core;
|
||||
|
||||
namespace Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
public class IsAlive : IValidation<CCSPlayerController>
|
||||
{
|
||||
public bool Validate(CCSPlayerController? player)
|
||||
{
|
||||
return player?.PlayerPawn.Value?.LifeState == (byte)LifeState_t.LIFE_ALIVE;
|
||||
}
|
||||
}
|
||||
|
||||
public static class IsAliveExtensions
|
||||
{
|
||||
public static ValidationBuilder<CCSPlayerController> IsAlive(this ValidationBuilder<CCSPlayerController> builder)
|
||||
{
|
||||
builder.Add(new IsAlive());
|
||||
return builder;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
using CounterStrikeSharp.API.Core;
|
||||
|
||||
namespace Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
public class IsValid : IValidation<CCSPlayerController>
|
||||
{
|
||||
public bool Validate(CCSPlayerController? player)
|
||||
{
|
||||
return player?.IsValid == true;
|
||||
}
|
||||
}
|
||||
|
||||
public static class IsValidExtensions
|
||||
{
|
||||
public static ValidationBuilder<CCSPlayerController> IsValid(this ValidationBuilder<CCSPlayerController> builder)
|
||||
{
|
||||
builder.Add(new IsValid());
|
||||
return builder;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
using Cs2SuperPowers.Utils;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class AirStrike(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 21;
|
||||
public override string Name => "Air Strike";
|
||||
|
||||
public override string Description => "Decoys thrown by you launch an airstrike (5 second cooldown).";
|
||||
|
||||
public override char ChatColor => ChatColors.Red;
|
||||
|
||||
public override string HtmlColor => "#FF0000";
|
||||
|
||||
private readonly Dictionary<CCSPlayerController, DateTime> _lastUse = new();
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventRoundStart>(OnRoundStart);
|
||||
RegisterEventHandler<EventDecoyStarted>(OnDecoyStarted);
|
||||
}
|
||||
|
||||
private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo _)
|
||||
{
|
||||
_lastUse.Clear();
|
||||
|
||||
foreach (var player in Utilities.GetPlayers())
|
||||
{
|
||||
if (!Ensure.Player(player).IsValid().IsAlive().Check() || !IsAssignedTo(player!))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
NextFrame(() =>
|
||||
{
|
||||
player.GiveNamedItem("weapon_decoy");
|
||||
});
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private HookResult OnDecoyStarted(EventDecoyStarted @event, GameEventInfo _)
|
||||
{
|
||||
var player = @event.Userid;
|
||||
if (!Ensure.Player(player).IsValid().Check() || !IsAssignedTo(player!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
// Check cooldown (skip if nodelay is enabled)
|
||||
var now = DateTime.UtcNow;
|
||||
DateTime lastUseTime = default;
|
||||
bool isOnCooldown = !GlobalConfig.NoDelayEnabled && _lastUse.TryGetValue(player!, out lastUseTime) && (now - lastUseTime).TotalSeconds < 5;
|
||||
|
||||
// Always give a new decoy, regardless of cooldown!
|
||||
player!.GiveNamedItem("weapon_decoy");
|
||||
|
||||
if (isOnCooldown)
|
||||
{
|
||||
double secondsRemaining = Math.Ceiling(5 - (now - lastUseTime).TotalSeconds);
|
||||
player.PrintToCenterAlert($"Air Strike is on cooldown! {ChatColors.DarkRed}{secondsRemaining}{ChatColors.Default}s remaining");
|
||||
return HookResult.Continue;
|
||||
}
|
||||
_lastUse[player!] = now;
|
||||
|
||||
var pos = new Vector(@event.X, @event.Y, @event.Z);
|
||||
|
||||
// Airstrike: spawn grenades above the target, spread over an area, falling down
|
||||
var random = new Random();
|
||||
int grenadeCount = GlobalConfig.GetAirStrikeCount(20);
|
||||
float airstrikeHeight = 800.0f; // Height above the detonation point
|
||||
float spreadRadius = 300.0f; // How far from the center grenades can land
|
||||
|
||||
for (int i = 0; i < grenadeCount; i++)
|
||||
{
|
||||
// Random offset in a circle around the target
|
||||
double angle = random.NextDouble() * 2 * Math.PI;
|
||||
double radius = Math.Sqrt(random.NextDouble()) * spreadRadius; // sqrt for uniform distribution
|
||||
|
||||
float offsetX = (float)(Math.Cos(angle) * radius);
|
||||
float offsetY = (float)(Math.Sin(angle) * radius);
|
||||
|
||||
// Spawn position: above the ground, with random spread
|
||||
var spawnPos = new Vector(
|
||||
pos.X + offsetX,
|
||||
pos.Y + offsetY,
|
||||
pos.Z + airstrikeHeight + (float)(random.NextDouble() * 100.0 - 50.0) // small vertical variation
|
||||
);
|
||||
|
||||
// Angle: straight down, maybe with a little randomization
|
||||
float pitch = -90f + (float)(random.NextDouble() * 10.0 - 5.0); // -90 is straight down
|
||||
float yaw = (float)(random.NextDouble() * 360.0);
|
||||
var ang = new QAngle(pitch, yaw, 0);
|
||||
|
||||
// Velocity: mostly downward, with a little horizontal for realism
|
||||
float downwardSpeed = (float)(random.NextDouble() * 200.0 + 800.0); // 800-1000 units/sec down
|
||||
float horizontalSpeed = (float)(random.NextDouble() * 100.0); // up to 100 units/sec sideways
|
||||
|
||||
// Calculate horizontal direction
|
||||
float horizAngle = (float)(random.NextDouble() * 2 * Math.PI);
|
||||
var horizontal = new Vector(
|
||||
(float)Math.Cos(horizAngle) * horizontalSpeed,
|
||||
(float)Math.Sin(horizAngle) * horizontalSpeed,
|
||||
0
|
||||
);
|
||||
|
||||
var velocity = new Vector(
|
||||
horizontal.X,
|
||||
horizontal.Y,
|
||||
-downwardSpeed
|
||||
);
|
||||
|
||||
var createdGrenade = GrenadeSpawner.CreateGrenade(spawnPos, ang, velocity, player.PlayerPawn.Value);
|
||||
}
|
||||
return HookResult.Continue;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class ArmBreaker(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 6;
|
||||
public override string Name => "Arms Breaker";
|
||||
|
||||
public override string Description => $"You have 25% chance to disarm victim on hit.";
|
||||
|
||||
public override char ChatColor => ChatColors.LightBlue;
|
||||
|
||||
private readonly Random _random = new();
|
||||
|
||||
public override string HtmlColor => "#D6E6FF";
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventPlayerHurt>(OnPlayerHurt);
|
||||
}
|
||||
|
||||
private HookResult OnPlayerHurt(EventPlayerHurt @event, GameEventInfo info)
|
||||
{
|
||||
var attacker = @event.Attacker;
|
||||
var victim = @event.Userid;
|
||||
|
||||
if (
|
||||
!Ensure.Player(victim).IsValid().IsAlive().Check() ||
|
||||
!Ensure.Player(attacker).IsValid().Check() ||
|
||||
attacker == victim ||
|
||||
!IsAssignedTo(attacker!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
// Check for at least 1 player in the opposing team
|
||||
var attackerTeam = attacker!.Team;
|
||||
var enemyCount = Utilities.GetPlayers().Count(p =>
|
||||
p.IsValid && p.Team != CsTeam.None && p.Team != CsTeam.Spectator && p.Team != attackerTeam);
|
||||
if (enemyCount < 1)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
if (_random.NextDouble() <= 0.25)
|
||||
{
|
||||
var weaponServices = victim!.PlayerPawn?.Value?.WeaponServices;
|
||||
if (weaponServices?.MyWeapons == null) return HookResult.Continue;
|
||||
|
||||
foreach (var weapon in weaponServices.MyWeapons)
|
||||
{
|
||||
var weaponName = weapon.Value?.DesignerName;
|
||||
if (weaponName != null && !weaponName.Contains("weapon_knife") && !weaponName.Contains("weapon_c4"))
|
||||
{
|
||||
victim.DropActiveWeapon();
|
||||
}
|
||||
}
|
||||
}
|
||||
return HookResult.Continue;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
using CounterStrikeSharp.API.Core;
|
||||
|
||||
namespace Cs2SuperPowers.Powers.Assign;
|
||||
|
||||
public interface IPowerAssignLogic
|
||||
{
|
||||
void Initialize(BasePlugin pluginRef, IReadOnlyCollection<ISuperPower> powers);
|
||||
}
|
||||
@@ -0,0 +1,149 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers.Assign;
|
||||
|
||||
public class RandomAssignLogic : IPowerAssignLogic
|
||||
{
|
||||
// Configuration for special rounds
|
||||
private const double SpecialRoundChance = 0.25;
|
||||
|
||||
// Powers that can be assigned during special rounds (everyone gets the same power)
|
||||
private readonly string[] SpecialRoundPowers =
|
||||
{
|
||||
"Go Fast", "Grenade Launcher", "Air Strike", "Not So Decoy", "I Am Chicken!"
|
||||
};
|
||||
|
||||
private readonly List<Delegate> _registeredHandlers = new();
|
||||
|
||||
public void Initialize(BasePlugin pluginRef, IReadOnlyCollection<ISuperPower> powers)
|
||||
{
|
||||
BasePlugin.GameEventHandler<EventPlayerDisconnect> disconnectHandler = (@event, _) =>
|
||||
{
|
||||
var player = @event.Userid;
|
||||
|
||||
if (!Ensure.Player(player).IsValid().Check()) return HookResult.Continue;
|
||||
PlayerPowers.Instance.RemovePower(player!);
|
||||
|
||||
return HookResult.Continue;
|
||||
};
|
||||
_registeredHandlers.Add(disconnectHandler);
|
||||
pluginRef.RegisterEventHandler(disconnectHandler);
|
||||
|
||||
|
||||
BasePlugin.GameEventHandler<EventRoundStart> roundStartHandler = (_, _) =>
|
||||
{
|
||||
var gameRules = Utilities
|
||||
.FindAllEntitiesByDesignerName<CBaseEntity>("cs_gamerules")
|
||||
.Single()
|
||||
.As<CCSGameRulesProxy>()
|
||||
.GameRules!;
|
||||
|
||||
if (gameRules.WarmupPeriod)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
var activePlayerCount = Utilities.GetPlayers().Count(player =>
|
||||
player.IsValid && player.Team != CsTeam.None && player.Team != CsTeam.Spectator);
|
||||
var randomAssignablePowers = powers
|
||||
.Where(p => p.CanBeRandomlyAssigned && p.MinimumPlayersRequired <= activePlayerCount)
|
||||
.ToArray();
|
||||
if (randomAssignablePowers.Length == 0)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
var random = new Random();
|
||||
var isSpecialRound = random.NextDouble() < SpecialRoundChance;
|
||||
|
||||
if (isSpecialRound)
|
||||
{
|
||||
// Special round: everyone gets the same power
|
||||
var specialRoundCandidates = randomAssignablePowers
|
||||
.Where(p => SpecialRoundPowers.Contains(p.Name))
|
||||
.ToArray();
|
||||
var specialPower = specialRoundCandidates.Length == 0
|
||||
? null
|
||||
: specialRoundCandidates[random.Next(specialRoundCandidates.Length)];
|
||||
|
||||
if (specialPower != null)
|
||||
{
|
||||
// Assign the same power to all players (without individual messages)
|
||||
foreach (var player in Utilities.GetPlayers())
|
||||
{
|
||||
if (player.Team == CsTeam.Spectator || player.Team == CsTeam.None) continue;
|
||||
PlayerPowers.Instance.AddPower(player!, specialPower, showMessages: false);
|
||||
}
|
||||
|
||||
// Announce special round to all players
|
||||
Server.PrintToChatAll($"{ChatColors.Gold}SPECIAL ROUND!{ChatColors.Default}");
|
||||
Server.PrintToChatAll($"{ChatColors.Yellow}Everyone has the same power: {ChatColors.Default}{specialPower.ChatColor}{specialPower.Name}{ChatColors.Default}");
|
||||
}
|
||||
else
|
||||
{
|
||||
// Fallback to normal assignment if special power not found
|
||||
foreach (var player in Utilities.GetPlayers())
|
||||
{
|
||||
if (player.Team == CsTeam.Spectator || player.Team == CsTeam.None) continue;
|
||||
var randomPower = randomAssignablePowers.OrderBy(_ => random.Next()).First();
|
||||
PlayerPowers.Instance.AddPower(player!, randomPower, showMessages: true);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Normal round: random powers for each player
|
||||
foreach (var player in Utilities.GetPlayers())
|
||||
{
|
||||
if (player.Team == CsTeam.Spectator || player.Team == CsTeam.None) continue;
|
||||
var randomPower = randomAssignablePowers.OrderBy(_ => random.Next()).First();
|
||||
PlayerPowers.Instance.AddPower(player!, randomPower, showMessages: true);
|
||||
}
|
||||
|
||||
// Show individual powers to each team
|
||||
foreach (var player in Utilities.GetPlayers())
|
||||
{
|
||||
var team = player.Team;
|
||||
|
||||
player.PrintToChat($"Your {ChatColors.Blue}Team {ChatColors.Default}powers are:");
|
||||
PlayerPowers.Instance
|
||||
.GetAssignedPowers()
|
||||
.Where(x => x.Player.Team == team)
|
||||
.Select(x => {
|
||||
player.PrintToChat($"{ChatColors.DarkRed} ► {x.Player.PlayerName} {ChatColors.Default}: {x.Power.ChatColor}{x.Power.Name}");
|
||||
return x;
|
||||
})
|
||||
.ToList();
|
||||
}
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
};
|
||||
_registeredHandlers.Add(roundStartHandler);
|
||||
pluginRef.RegisterEventHandler(roundStartHandler, HookMode.Pre);
|
||||
|
||||
BasePlugin.GameEventHandler<EventPlayerDeath> deathHandler = (@event, _) =>
|
||||
{
|
||||
var victim = @event.Userid;
|
||||
var attacker = @event.Attacker;
|
||||
|
||||
if (victim == null || attacker == null || victim == attacker) return HookResult.Continue;
|
||||
|
||||
if (!PlayerPowers.Instance.TryGetValue(attacker, out var attackerPower))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
victim.PrintToChat($"You have been killed by {ChatColors.DarkRed}{attacker.PlayerName}{ChatColors.Lime}");
|
||||
victim.PrintToChat($"His/her super power was: {attackerPower!.ChatColor}{attackerPower.Name}");
|
||||
|
||||
return HookResult.Continue;
|
||||
};
|
||||
_registeredHandlers.Add(deathHandler);
|
||||
pluginRef.RegisterEventHandler(deathHandler);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
using System.Text;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using Cs2SuperPowers.Players;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public abstract class BasePower(IPlayerHud playerHud) : ISuperPower
|
||||
{
|
||||
private readonly HashSet<ulong> _playerIds = new();
|
||||
|
||||
protected BasePlugin? Plugin { get; private set; }
|
||||
|
||||
public abstract int Id { get; }
|
||||
public abstract string Name { get; }
|
||||
public abstract string Description { get; }
|
||||
public abstract char ChatColor { get; }
|
||||
public abstract string HtmlColor { get; }
|
||||
public virtual bool CanBeRandomlyAssigned => true;
|
||||
public virtual int MinimumPlayersRequired => 0;
|
||||
|
||||
public void Initialize(BasePlugin pluginRef)
|
||||
{
|
||||
Plugin = pluginRef;
|
||||
OnInitialize();
|
||||
}
|
||||
|
||||
protected abstract void OnInitialize();
|
||||
|
||||
public virtual void AssignToPlayer(CCSPlayerController player, bool showMessages)
|
||||
{
|
||||
_playerIds.Add(player.SteamID);
|
||||
|
||||
if (showMessages)
|
||||
{
|
||||
player.PrintToChat($"You have been granted the power of {ChatColor}{Name}");
|
||||
player.PrintToChat(Description);
|
||||
|
||||
var centerMessageBuilder = new StringBuilder();
|
||||
centerMessageBuilder.Append("<font class='fontSize-l' class='fontWeight-Bold' color='#FFFFFF'>Your superpower:</font> <br>");
|
||||
centerMessageBuilder.Append($"<font class='fontSize-l' class='fontWeight-Bold' color='{HtmlColor}'>{Name}</font> <br>");
|
||||
centerMessageBuilder.Append($"<font class='fontSize-s' class='fontWeight-Normal' color='#FFFFFF'>{Description}</font> <br>");
|
||||
playerHud.ShowMessage(player, centerMessageBuilder.ToString(), TimeSpan.FromSeconds(10));
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void UnassignFromPlayer(CCSPlayerController player)
|
||||
{
|
||||
_playerIds.Remove(player.SteamID);
|
||||
}
|
||||
|
||||
private readonly List<Delegate> _registeredDelegates = new();
|
||||
|
||||
protected void RegisterEventHandler<T>(BasePlugin.GameEventHandler<T> handler, HookMode hookMode = HookMode.Post)
|
||||
where T : GameEvent
|
||||
{
|
||||
_registeredDelegates.Add(handler);
|
||||
Plugin!.RegisterEventHandler(handler, hookMode);
|
||||
}
|
||||
|
||||
protected void RegisterListener<T>(T handler) where T : Delegate
|
||||
{
|
||||
_registeredDelegates.Add(handler);
|
||||
Plugin!.RegisterListener(handler);
|
||||
}
|
||||
|
||||
protected void AddTimer(float seconds, Action callback, bool repeat = false)
|
||||
{
|
||||
if (repeat)
|
||||
{
|
||||
_registeredDelegates.Add(callback);
|
||||
Plugin!.AddTimer(seconds, callback);
|
||||
}
|
||||
else
|
||||
{
|
||||
Action? wrappedCallback = null;
|
||||
wrappedCallback = () =>
|
||||
{
|
||||
callback();
|
||||
if (wrappedCallback != null)
|
||||
{
|
||||
_registeredDelegates.Remove(wrappedCallback);
|
||||
}
|
||||
};
|
||||
_registeredDelegates.Add(wrappedCallback);
|
||||
Plugin!.AddTimer(seconds, wrappedCallback);
|
||||
}
|
||||
}
|
||||
|
||||
protected void NextFrame(Action callback)
|
||||
{
|
||||
Action? wrappedCallback = null;
|
||||
wrappedCallback = () =>
|
||||
{
|
||||
callback();
|
||||
if (wrappedCallback != null)
|
||||
{
|
||||
_registeredDelegates.Remove(wrappedCallback);
|
||||
}
|
||||
};
|
||||
_registeredDelegates.Add(wrappedCallback);
|
||||
Server.NextFrame(wrappedCallback);
|
||||
}
|
||||
|
||||
protected bool IsAssignedTo(CCSPlayerController player)
|
||||
{
|
||||
return _playerIds.Contains(player.SteamID);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,156 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class BlindingLight(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 22;
|
||||
public override string Name => "Blinding Light";
|
||||
|
||||
public override string Description => $"Inflict a blinding flash of light that disorients enemies. Press E (Use) to activate the power.";
|
||||
|
||||
public override char ChatColor => ChatColors.BlueGrey;
|
||||
|
||||
public override string HtmlColor => "#cdcece";
|
||||
|
||||
private readonly List<BlindingLightInfo> _registrations = new();
|
||||
|
||||
private const int SecondsBetweenActivations = 8;
|
||||
|
||||
public override void AssignToPlayer(CCSPlayerController player, bool showMessages)
|
||||
{
|
||||
base.AssignToPlayer(player, showMessages);
|
||||
if (!_registrations.Any(r => r.Player == player))
|
||||
{
|
||||
_registrations.Add(new BlindingLightInfo(player, DateTime.MinValue));
|
||||
}
|
||||
Plugin!.Logger.LogInformation("BlindingLight assigned to {PlayerName} ({SteamID})", player.PlayerName, player.SteamID);
|
||||
}
|
||||
|
||||
public override void UnassignFromPlayer(CCSPlayerController player)
|
||||
{
|
||||
base.UnassignFromPlayer(player);
|
||||
var registration = _registrations.FirstOrDefault(r => r.Player == player);
|
||||
if (registration != null)
|
||||
{
|
||||
_registrations.Remove(registration);
|
||||
}
|
||||
Plugin!.Logger.LogInformation("BlindingLight unassigned from {PlayerName} ({SteamID})", player.PlayerName, player.SteamID);
|
||||
}
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterListener<Listeners.OnTick>(OnTick);
|
||||
RegisterEventHandler<EventRoundStart>(OnRoundStart);
|
||||
RegisterEventHandler<EventPlayerDeath>(OnPlayerDeath);
|
||||
Plugin!.Logger.LogInformation("BlindingLight initialized!");
|
||||
}
|
||||
|
||||
private HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo info)
|
||||
{
|
||||
var player = @event.Userid;
|
||||
var registration = _registrations
|
||||
.FirstOrDefault(r => r.Player == player);
|
||||
if (registration != null)
|
||||
{
|
||||
registration.WasUsePressedLastTick = false;
|
||||
}
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo info)
|
||||
{
|
||||
_registrations.Clear();
|
||||
foreach (var player in PlayerPowers.Instance.GetPlayersWithPower(this))
|
||||
{
|
||||
_registrations.Add(new BlindingLightInfo(player, DateTime.MinValue));
|
||||
}
|
||||
Plugin!.Logger.LogInformation("BlindingLight: Round start, registered {Count} players", _registrations.Count);
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private void OnTick()
|
||||
{
|
||||
foreach (var registration in _registrations.ToList())
|
||||
{
|
||||
if (!Ensure.Player(registration.Player).IsValid().Check())
|
||||
{
|
||||
_registrations.Remove(registration);
|
||||
continue;
|
||||
}
|
||||
|
||||
var usePressed = registration.Player.Buttons.HasFlag(PlayerButtons.Use);
|
||||
var canUsePower = (DateTime.UtcNow - registration.LastUse).TotalSeconds > SecondsBetweenActivations;
|
||||
|
||||
if (usePressed && !registration.WasUsePressedLastTick)
|
||||
{
|
||||
Plugin!.Logger.LogInformation("BlindingLight: {PlayerName} pressed use! CanUse: {CanUse}", registration.Player.PlayerName, canUsePower);
|
||||
if (canUsePower)
|
||||
{
|
||||
ActivatePower(registration);
|
||||
}
|
||||
else
|
||||
{
|
||||
var secondsBeforeNextUse =
|
||||
SecondsBetweenActivations - (int)(DateTime.UtcNow - registration.LastUse).TotalSeconds;
|
||||
registration.Player
|
||||
.PrintToCenterAlert($"You need to wait {ChatColors.DarkRed}{secondsBeforeNextUse} {ChatColors.Default}seconds before using the power.");
|
||||
}
|
||||
}
|
||||
|
||||
registration.WasUsePressedLastTick = usePressed;
|
||||
}
|
||||
}
|
||||
|
||||
private void ActivatePower(BlindingLightInfo registration)
|
||||
{
|
||||
// Check for at least 1 player in the opposing team
|
||||
var playerTeam = registration.Player.Team;
|
||||
var enemyCount = Utilities.GetPlayers().Count(p =>
|
||||
p.IsValid && p.Team != CsTeam.None && p.Team != CsTeam.Spectator && p.Team != playerTeam);
|
||||
Plugin!.Logger.LogInformation("BlindingLight: Activating for {PlayerName}, enemy count: {EnemyCount}", registration.Player.PlayerName, enemyCount);
|
||||
|
||||
if (enemyCount < 1)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var flashProjectile = Utilities.CreateEntityByName<CFlashbangProjectile>("flashbang_projectile");
|
||||
if (flashProjectile == null || !flashProjectile.IsValid)
|
||||
{
|
||||
Plugin!.Logger.LogError("BlindingLight: Failed to create flashbang projectile!");
|
||||
return;
|
||||
}
|
||||
|
||||
var player = registration.Player;
|
||||
var pos = player.PlayerPawn.Value!.AbsOrigin;
|
||||
pos!.Z += 10;
|
||||
|
||||
flashProjectile.TicksAtZeroVelocity = 100;
|
||||
flashProjectile.TeamNum = player.TeamNum;
|
||||
flashProjectile.Teleport(pos, null, new Vector(0, 0, -10));
|
||||
flashProjectile.DispatchSpawn();
|
||||
flashProjectile.AcceptInput("InitializeSpawnFromWorld", player.PlayerPawn.Value, player.PlayerPawn.Value);
|
||||
flashProjectile.DetonateTime = 0;
|
||||
|
||||
Plugin!.Logger.LogInformation("BlindingLight: Flashbang created and detonated!");
|
||||
registration.UpdateUse();
|
||||
}
|
||||
}
|
||||
|
||||
public record BlindingLightInfo(CCSPlayerController Player, DateTime LastUse)
|
||||
{
|
||||
public DateTime LastUse { get; private set; } = LastUse;
|
||||
public bool WasUsePressedLastTick { get; set; } = false;
|
||||
|
||||
public void UpdateUse()
|
||||
{
|
||||
LastUse = DateTime.UtcNow;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class BulletStorm(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 13;
|
||||
public override string Name => "Bullet Storm";
|
||||
|
||||
public override string Description => $"Gain effectively unlimited reserve ammo so you can keep reloading without ever running dry.";
|
||||
|
||||
public override char ChatColor => ChatColors.Olive;
|
||||
|
||||
public override string HtmlColor => "#0000FF";
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventWeaponFire>(OnWeaponFire);
|
||||
RegisterEventHandler<EventWeaponReload>(OnWeaponReload);
|
||||
}
|
||||
|
||||
private HookResult OnWeaponFire(EventWeaponFire @event, GameEventInfo info)
|
||||
{
|
||||
var player = @event.Userid;
|
||||
if (!Ensure.Player(player).IsValid().Check() || !IsAssignedTo(player!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
RefillReserveAmmo(player!);
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private HookResult OnWeaponReload(EventWeaponReload @event, GameEventInfo info)
|
||||
{
|
||||
var player = @event.Userid;
|
||||
if (!Ensure.Player(player).IsValid().Check() || !IsAssignedTo(player!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
RefillReserveAmmo(player!);
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private static void RefillReserveAmmo(CCSPlayerController player)
|
||||
{
|
||||
var activeWeaponHandle = player.PlayerPawn.Value?.WeaponServices?.ActiveWeapon;
|
||||
if (activeWeaponHandle?.Value != null)
|
||||
{
|
||||
activeWeaponHandle.Value.ReserveAmmo[0] = 999;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class DoubleJump(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 28;
|
||||
public override string Name => "Double Jump";
|
||||
public override string Description => "Jump again in mid-air! A classic double jump ability.";
|
||||
public override char ChatColor => ChatColors.Blue;
|
||||
public override string HtmlColor => "#0000FF";
|
||||
|
||||
private readonly Dictionary<CCSPlayerController, bool> _canDoubleJump = new();
|
||||
private readonly Dictionary<CCSPlayerController, bool> _wasOnGround = new();
|
||||
private readonly Dictionary<CCSPlayerController, bool> _requireJumpRelease = new();
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterListener<Listeners.OnTick>(OnTick);
|
||||
RegisterEventHandler<EventRoundStart>(OnRoundStart);
|
||||
RegisterEventHandler<EventPlayerHurt>(OnPlayerHurt);
|
||||
}
|
||||
|
||||
private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo _)
|
||||
{
|
||||
_canDoubleJump.Clear();
|
||||
_wasOnGround.Clear();
|
||||
_requireJumpRelease.Clear();
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
public override void AssignToPlayer(CCSPlayerController player, bool showMessages)
|
||||
{
|
||||
base.AssignToPlayer(player, showMessages);
|
||||
_canDoubleJump[player] = true;
|
||||
_wasOnGround[player] = true;
|
||||
_requireJumpRelease[player] = false;
|
||||
}
|
||||
|
||||
public override void UnassignFromPlayer(CCSPlayerController player)
|
||||
{
|
||||
base.UnassignFromPlayer(player);
|
||||
_canDoubleJump.Remove(player);
|
||||
_wasOnGround.Remove(player);
|
||||
_requireJumpRelease.Remove(player);
|
||||
}
|
||||
|
||||
private void OnTick()
|
||||
{
|
||||
foreach (var player in Utilities.GetPlayers())
|
||||
{
|
||||
if (!player.IsValid || !player.PawnIsAlive)
|
||||
continue;
|
||||
|
||||
if (!IsAssignedTo(player))
|
||||
continue;
|
||||
|
||||
var pawn = player.PlayerPawn.Value;
|
||||
if (pawn == null || !pawn.IsValid)
|
||||
continue;
|
||||
|
||||
var isOnGround = pawn.GroundEntity.IsValid;
|
||||
var jumpPressed = player.Buttons.HasFlag(PlayerButtons.Jump);
|
||||
var wasOnGroundLastTick = _wasOnGround.GetValueOrDefault(player, true);
|
||||
|
||||
if (isOnGround)
|
||||
{
|
||||
_canDoubleJump[player] = true;
|
||||
_requireJumpRelease[player] = false;
|
||||
}
|
||||
else if (wasOnGroundLastTick)
|
||||
{
|
||||
_canDoubleJump[player] = true;
|
||||
_requireJumpRelease[player] = jumpPressed;
|
||||
}
|
||||
|
||||
if (!isOnGround && !jumpPressed)
|
||||
{
|
||||
_requireJumpRelease[player] = false;
|
||||
}
|
||||
|
||||
if (!isOnGround &&
|
||||
jumpPressed &&
|
||||
!_requireJumpRelease.GetValueOrDefault(player, false) &&
|
||||
_canDoubleJump.GetValueOrDefault(player, false))
|
||||
{
|
||||
var velocity = pawn.AbsVelocity;
|
||||
velocity.Z = Math.Max(velocity.Z, 300.0f);
|
||||
pawn.Teleport(pawn.AbsOrigin, null, velocity);
|
||||
_canDoubleJump[player] = false;
|
||||
_requireJumpRelease[player] = true;
|
||||
}
|
||||
|
||||
_wasOnGround[player] = isOnGround;
|
||||
}
|
||||
}
|
||||
|
||||
private HookResult OnPlayerHurt(EventPlayerHurt @event, GameEventInfo info)
|
||||
{
|
||||
var victim = @event.Userid;
|
||||
if (!Ensure.Player(victim).IsValid().Check() || !IsAssignedTo(victim!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
bool isWorldDamage = !Ensure.Player(@event.Attacker).IsValid().Check();
|
||||
bool hasNoWeapon = string.IsNullOrEmpty(@event.Weapon);
|
||||
|
||||
if (!isWorldDamage || !hasNoWeapon)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
var pawn = victim!.PlayerPawn.Value;
|
||||
if (pawn == null || !pawn.IsValid)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
pawn.Health = Math.Min(pawn.MaxHealth, pawn.Health + @event.DmgHealth);
|
||||
return HookResult.Stop;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class DroppedNades(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
private readonly Dictionary<CCSPlayerController, DateTime> _lastUse = new();
|
||||
|
||||
public override int Id => 34;
|
||||
public override string Name => "Dropped Nades";
|
||||
public override string Description => "MAG-7 shots drop 5 grenades on the ground. This power is force-only.";
|
||||
public override char ChatColor => ChatColors.DarkRed;
|
||||
public override string HtmlColor => "#AA0000";
|
||||
public override bool CanBeRandomlyAssigned => false;
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventRoundStart>(OnRoundStart);
|
||||
RegisterEventHandler<EventWeaponFire>(OnWeaponFire);
|
||||
}
|
||||
|
||||
private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo info)
|
||||
{
|
||||
_lastUse.Clear();
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private HookResult OnWeaponFire(EventWeaponFire @event, GameEventInfo info)
|
||||
{
|
||||
var controller = @event.Userid;
|
||||
if (!Ensure.Player(controller).IsValid().Check() || !IsAssignedTo(controller!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
var pawn = controller!.PlayerPawn.Value;
|
||||
var weapon = pawn?.WeaponServices?.ActiveWeapon.Value;
|
||||
if (pawn == null || !pawn.IsValid || weapon == null || weapon.DesignerName != "weapon_mag7")
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
var now = DateTime.UtcNow;
|
||||
if (!GlobalConfig.NoDelayEnabled &&
|
||||
_lastUse.TryGetValue(controller, out var lastUseTime) &&
|
||||
(now - lastUseTime).TotalSeconds < 0.35)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
_lastUse[controller] = now;
|
||||
|
||||
var origin = pawn.AbsOrigin;
|
||||
if (origin == null)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
int grenadeCount = GlobalConfig.GetDroppedNadesCount(5);
|
||||
var random = new Random();
|
||||
var viewAngle = pawn.V_angle;
|
||||
float baseYawRad = viewAngle.Y * MathF.PI / 180f;
|
||||
var forward = new Vector(MathF.Cos(baseYawRad), MathF.Sin(baseYawRad), 0.0f);
|
||||
var right = new Vector(-forward.Y, forward.X, 0.0f);
|
||||
|
||||
int droppedGrenades = 0;
|
||||
int attempts = 0;
|
||||
int maxAttempts = grenadeCount + 8;
|
||||
|
||||
while (droppedGrenades < grenadeCount && attempts < maxAttempts)
|
||||
{
|
||||
int i = attempts;
|
||||
attempts++;
|
||||
float lateralOffset = (float)(random.NextDouble() * 18.0 - 9.0);
|
||||
float forwardOffset = (float)(random.NextDouble() * 12.0 + 16.0);
|
||||
var spawnPos = new Vector(
|
||||
origin.X + forward.X * forwardOffset + right.X * lateralOffset,
|
||||
origin.Y + forward.Y * forwardOffset + right.Y * lateralOffset,
|
||||
origin.Z + 10.0f
|
||||
);
|
||||
|
||||
float yaw = viewAngle.Y + (float)(random.NextDouble() * 16.0 - 8.0);
|
||||
var angle = new QAngle(8.0f, yaw, 0.0f);
|
||||
var velocity = new Vector(
|
||||
forward.X * (float)(random.NextDouble() * 40.0 + 45.0) + right.X * (float)(random.NextDouble() * 16.0 - 8.0),
|
||||
forward.Y * (float)(random.NextDouble() * 40.0 + 45.0) + right.Y * (float)(random.NextDouble() * 16.0 - 8.0),
|
||||
(float)(random.NextDouble() * 12.0 + 8.0)
|
||||
);
|
||||
|
||||
var grenadeWeapon = controller.GiveNamedItem<CHEGrenade>("weapon_hegrenade");
|
||||
if (grenadeWeapon == null || !grenadeWeapon.IsValid)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (grenadeWeapon.IsHeldByPlayer)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
grenadeWeapon.Teleport(spawnPos, angle, velocity);
|
||||
droppedGrenades++;
|
||||
}
|
||||
return HookResult.Continue;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Utils;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class ExplosiveBullets(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 30;
|
||||
public override string Name => "Explosive Bullets";
|
||||
public override string Description => "Every bullet hit causes a small explosion.";
|
||||
public override char ChatColor => ChatColors.Orange;
|
||||
public override string HtmlColor => "#FF4500";
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventPlayerHurt>(OnPlayerHurt);
|
||||
}
|
||||
|
||||
private HookResult OnPlayerHurt(EventPlayerHurt @event, GameEventInfo info)
|
||||
{
|
||||
var attacker = @event.Attacker;
|
||||
var victim = @event.Userid;
|
||||
|
||||
if (!Ensure.Player(attacker).IsValid().Check() ||
|
||||
!Ensure.Player(victim).IsValid().Check() ||
|
||||
attacker == victim ||
|
||||
!IsAssignedTo(attacker!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(@event.Weapon) || @event.Weapon.Contains("grenade", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
var attackerPawn = attacker!.PlayerPawn.Value;
|
||||
var victimPawn = victim!.PlayerPawn.Value;
|
||||
if (victimPawn == null || attackerPawn == null)
|
||||
return HookResult.Continue;
|
||||
|
||||
var pos = victimPawn.AbsOrigin;
|
||||
if (pos == null)
|
||||
return HookResult.Continue;
|
||||
|
||||
pos.Z += 20;
|
||||
|
||||
// Create explosion with a small grenade at victim's position
|
||||
var ang = new QAngle(0, 0, 0);
|
||||
var velocity = new Vector(0, 0, 0);
|
||||
|
||||
var grenade = GrenadeSpawner.CreateGrenade(pos, ang, velocity, attackerPawn);
|
||||
|
||||
// Detonate it immediately
|
||||
Server.NextFrame(() =>
|
||||
{
|
||||
if (grenade != null && grenade.IsValid)
|
||||
{
|
||||
grenade.AcceptInput("InitializeSpawnFromWorld", attackerPawn, attackerPawn);
|
||||
grenade.DetonateTime = 0;
|
||||
}
|
||||
});
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class FinalMission(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 8;
|
||||
public override string Name => "Final Mission";
|
||||
|
||||
public override string Description => $"Upon death, unleash a powerful explosion that eliminates all players within a specified radius, turning your sacrifice into a final act of devastation.";
|
||||
|
||||
public override char ChatColor => ChatColors.Purple;
|
||||
|
||||
public override string HtmlColor => "#F5CB42";
|
||||
public override int MinimumPlayersRequired => 4;
|
||||
|
||||
private const float ExplosionRadius = 500.0f;
|
||||
private const int ExplosionDamage = 999;
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventPlayerDeath>(OnPlayerDeath);
|
||||
}
|
||||
|
||||
private HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo info)
|
||||
{
|
||||
var player = @event.Userid;
|
||||
if (!Ensure.Player(player).IsValid().Check() || !IsAssignedTo(player!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
// Check for at least 4 valid (non-spectator, non-none) players total
|
||||
var validPlayerCount = Utilities.GetPlayers().Count(p =>
|
||||
p.IsValid && p.Team != CsTeam.None && p.Team != CsTeam.Spectator);
|
||||
if (validPlayerCount < 4)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
var playerPawn = player!.PlayerPawn.Value;
|
||||
var origin = playerPawn?.AbsOrigin;
|
||||
if (playerPawn == null || origin == null)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
var explosionCenter = new Vector(origin.X, origin.Y, origin.Z);
|
||||
Server.NextFrame(() =>
|
||||
{
|
||||
foreach (var target in Utilities.GetPlayers())
|
||||
{
|
||||
if (!Ensure.Player(target).IsValid().IsAlive().Check())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var targetPawn = target.PlayerPawn.Value;
|
||||
var targetOrigin = targetPawn?.AbsOrigin;
|
||||
if (targetPawn == null || targetOrigin == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var deltaX = targetOrigin.X - explosionCenter.X;
|
||||
var deltaY = targetOrigin.Y - explosionCenter.Y;
|
||||
var deltaZ = targetOrigin.Z - explosionCenter.Z;
|
||||
var distanceSquared = deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ;
|
||||
if (distanceSquared > ExplosionRadius * ExplosionRadius)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
targetPawn.Health = Math.Max(0, targetPawn.Health - ExplosionDamage);
|
||||
Utilities.SetStateChanged(targetPawn, "CBaseEntity", "m_iHealth");
|
||||
}
|
||||
});
|
||||
|
||||
Server.PrintToChatAll($"{ChatColors.DarkRed}► {ChatColors.Green} {player.PlayerName}: {ChatColors.Lime}explodes!!!");
|
||||
|
||||
var fileNames = new[] { "radiobotfallback01", "radiobotfallback02", "radiobotfallback04" };
|
||||
AddTimer(0.1f, () =>
|
||||
{
|
||||
var randomFile = fileNames[new Random().Next(fileNames.Length)];
|
||||
player.ExecuteClientCommand($"play vo/agents/balkan/{randomFile}.vsnd");
|
||||
});
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class FlashKing(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 17;
|
||||
public override string Name => "Flash King";
|
||||
|
||||
public override string Description => $"With this superpower, your flashbangs blind enemies for three times as long.";
|
||||
|
||||
public override char ChatColor => ChatColors.LightBlue;
|
||||
|
||||
public override string HtmlColor => "#D6E6FF";
|
||||
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventRoundStart>(OnRoundStart);
|
||||
RegisterEventHandler<EventPlayerBlind>(OnPlayerBlinded);
|
||||
}
|
||||
|
||||
private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo _)
|
||||
{
|
||||
foreach (var player in Utilities.GetPlayers())
|
||||
{
|
||||
if (!Ensure.Player(player).IsValid().IsAlive().Check() || !IsAssignedTo(player!))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
NextFrame(() =>
|
||||
{
|
||||
player.GiveNamedItem("weapon_flashbang");
|
||||
player.GiveNamedItem("weapon_flashbang");
|
||||
});
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private HookResult OnPlayerBlinded(EventPlayerBlind @event, GameEventInfo info)
|
||||
{
|
||||
var victim = @event.Userid;
|
||||
var attacker = @event.Attacker;
|
||||
|
||||
if (!Ensure.Player(victim).IsValid().Check() || !IsAssignedTo(attacker!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
var playerPawn = victim!.PlayerPawn.Value;
|
||||
|
||||
if (attacker != victim && attacker!.TeamNum != playerPawn!.TeamNum)
|
||||
{
|
||||
playerPawn!.FlashDuration = playerPawn!.FlashDuration * 3;
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class FlashProof(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 3;
|
||||
public override string Name => "Flash Proof";
|
||||
|
||||
public override string Description => $"You cannot be blind by flashes. You will gain new flash every time your flash explodes.";
|
||||
|
||||
public override char ChatColor => ChatColors.LightBlue;
|
||||
|
||||
public override string HtmlColor => "#D6E6FF";
|
||||
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventRoundStart>(OnRoundStart);
|
||||
RegisterEventHandler<EventPlayerBlind>(OnPlayerBlinded);
|
||||
RegisterEventHandler<EventFlashbangDetonate>(OnFlashbangDetonate);
|
||||
}
|
||||
|
||||
private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo _)
|
||||
{
|
||||
foreach (var player in Utilities.GetPlayers())
|
||||
{
|
||||
if (!Ensure.Player(player).IsValid().IsAlive().Check() || !IsAssignedTo(player!))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
NextFrame(() =>
|
||||
{
|
||||
player.GiveNamedItem("weapon_flashbang");
|
||||
player.GiveNamedItem("weapon_flashbang");
|
||||
});
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private HookResult OnPlayerBlinded(EventPlayerBlind @event, GameEventInfo info)
|
||||
{
|
||||
var player = @event.Userid;
|
||||
|
||||
if (!Ensure.Player(player).IsValid().Check() || !IsAssignedTo(player!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
var playerPawn = player!.PlayerPawn.Value;
|
||||
playerPawn!.FlashDuration = 0.0f;
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private HookResult OnFlashbangDetonate(EventFlashbangDetonate @event, GameEventInfo info)
|
||||
{
|
||||
var player = @event.Userid;
|
||||
|
||||
if (!Ensure.Player(player).IsValid().IsAlive().Check() || !IsAssignedTo(player!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
player!.GiveNamedItem("weapon_flashbang");
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
}
|
||||
+192
@@ -0,0 +1,192 @@
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class Ghost(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 7;
|
||||
public override string Name => "The Ghost";
|
||||
|
||||
public override string Description => $"You are invisible to other players - but will show up for few seconds after you will take/give damage.";
|
||||
|
||||
public override char ChatColor => ChatColors.White;
|
||||
|
||||
private readonly Random _random = new Random();
|
||||
|
||||
public override string HtmlColor => "#FFFFFF";
|
||||
public override int MinimumPlayersRequired => 4;
|
||||
|
||||
private readonly Dictionary<ulong, int> _visibilityTokens = new();
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventRoundStart>(OnRoundStart);
|
||||
RegisterEventHandler<EventPlayerHurt>(OnPlayerHurt);
|
||||
RegisterEventHandler<EventRoundEnd>(OnRoundEnd);
|
||||
}
|
||||
|
||||
private HookResult OnRoundEnd(EventRoundEnd @event, GameEventInfo info)
|
||||
{
|
||||
foreach (var player in PlayerPowers.Instance.GetPlayersWithPower(this))
|
||||
{
|
||||
_visibilityTokens[player.SteamID] = _visibilityTokens.GetValueOrDefault(player.SteamID) + 1;
|
||||
NextFrame(() =>
|
||||
{
|
||||
SetPlayerVisibility(player, true);
|
||||
});
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo info)
|
||||
{
|
||||
var validPlayersWithPower = PlayerPowers.Instance
|
||||
.GetPlayersWithPower(this)
|
||||
.Where(player => Ensure.Player(player).IsValid().Check());
|
||||
|
||||
foreach (var player in validPlayersWithPower)
|
||||
{
|
||||
NextFrame(() =>
|
||||
{
|
||||
SetPlayerVisibility(player, false);
|
||||
});
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
public override void UnassignFromPlayer(CCSPlayerController player)
|
||||
{
|
||||
base.UnassignFromPlayer(player);
|
||||
NextFrame(() =>
|
||||
{
|
||||
SetPlayerVisibility(player, true);
|
||||
});
|
||||
}
|
||||
|
||||
private HookResult OnPlayerHurt(EventPlayerHurt @event, GameEventInfo info)
|
||||
{
|
||||
var attacker = @event.Attacker;
|
||||
var victim = @event.Userid;
|
||||
|
||||
if (!Ensure.Player(victim).IsValid().IsAlive().Check() ||
|
||||
!Ensure.Player(attacker).IsValid().Check())
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
// Check for at least 4 valid (non-spectator, non-none) players total
|
||||
var validPlayerCount = Utilities.GetPlayers().Count(p =>
|
||||
p.IsValid && p.Team != CsTeam.None && p.Team != CsTeam.Spectator);
|
||||
if (validPlayerCount < 4)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
if (IsAssignedTo(victim!))
|
||||
{
|
||||
RevealGhostTemporarily(victim!);
|
||||
}
|
||||
else if (IsAssignedTo(attacker!))
|
||||
{
|
||||
RevealGhostTemporarily(attacker!);
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private void RevealGhostTemporarily(CCSPlayerController player)
|
||||
{
|
||||
if (!Ensure.Player(player).IsValid().IsAlive().Check())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var token = _visibilityTokens.GetValueOrDefault(player.SteamID) + 1;
|
||||
_visibilityTokens[player.SteamID] = token;
|
||||
SetPlayerVisibility(player, true);
|
||||
|
||||
AddTimer(_random.Next(1, 5), () =>
|
||||
{
|
||||
if (!IsAssignedTo(player) || _visibilityTokens.GetValueOrDefault(player.SteamID) != token)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
SetPlayerVisibility(player, false);
|
||||
});
|
||||
}
|
||||
|
||||
private void SetPlayerVisibility(CCSPlayerController player, bool visible)
|
||||
{
|
||||
if (!IsAssignedTo(player) && !visible)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var playerPawn = player.PlayerPawn.Value;
|
||||
if (playerPawn != null)
|
||||
{
|
||||
var color = visible
|
||||
? Color.FromArgb(255, 255, 255, 255)
|
||||
: Color.FromArgb(0, 255, 255, 255);
|
||||
var shadowStrength = visible ? 1.0f : 0.0f;
|
||||
|
||||
playerPawn.Render = color;
|
||||
playerPawn.ShadowStrength = shadowStrength;
|
||||
Utilities.SetStateChanged(playerPawn, "CBaseModelEntity", "m_clrRender");
|
||||
|
||||
var activeWeapon = playerPawn.WeaponServices?.ActiveWeapon.Value;
|
||||
if (activeWeapon != null && activeWeapon.IsValid)
|
||||
{
|
||||
activeWeapon.Render = color;
|
||||
activeWeapon.ShadowStrength = shadowStrength;
|
||||
Utilities.SetStateChanged(activeWeapon, "CBaseModelEntity", "m_clrRender");
|
||||
}
|
||||
|
||||
var skeleton = playerPawn.CBodyComponent?.SceneNode?.GetSkeletonInstance();
|
||||
if (skeleton != null)
|
||||
{
|
||||
skeleton.MaterialGroup.Value = visible ? (uint)0 : 1;
|
||||
}
|
||||
|
||||
var myWeapons = playerPawn.WeaponServices?.MyWeapons;
|
||||
if (myWeapons != null)
|
||||
{
|
||||
foreach (var gun in myWeapons)
|
||||
{
|
||||
var weapon = gun.Value;
|
||||
if (weapon != null)
|
||||
{
|
||||
weapon.Render = color;
|
||||
weapon.ShadowStrength = shadowStrength;
|
||||
Utilities.SetStateChanged(weapon, "CBaseModelEntity", "m_clrRender");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var myWearables = playerPawn.MyWearables;
|
||||
if (myWearables != null)
|
||||
{
|
||||
foreach (var wearableHandle in myWearables)
|
||||
{
|
||||
var wearable = wearableHandle.Value;
|
||||
if (wearable == null || !wearable.IsValid)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
wearable.Render = color;
|
||||
wearable.ShadowStrength = shadowStrength;
|
||||
Utilities.SetStateChanged(wearable, "CBaseModelEntity", "m_clrRender");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class GoFast(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 19;
|
||||
public override string Name => "Go Fast";
|
||||
|
||||
public override string Description => $"Your movement speed is increased by 50%";
|
||||
|
||||
public override char ChatColor => ChatColors.Green;
|
||||
|
||||
public override string HtmlColor => "#009905";
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventRoundStart>(OnRoundStart);
|
||||
}
|
||||
|
||||
private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo _)
|
||||
{
|
||||
foreach (var player in PlayerPowers.Instance.GetPlayersWithPower(this))
|
||||
{
|
||||
if (!Ensure.Player(player).IsValid().Check())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
NextFrame(() =>
|
||||
{
|
||||
player.SetNewSpeed(player.GetSpeed() * 1.5f);
|
||||
player.GravityScale += 5;
|
||||
});
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
using Cs2SuperPowers.Utils;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class GrenadeLauncher(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 11;
|
||||
public override string Name => "Grenade Launcher";
|
||||
|
||||
public override string Description => "Every shot from your pistol launches a grenade (0.5s cooldown).";
|
||||
|
||||
public override char ChatColor => ChatColors.Red;
|
||||
|
||||
public override string HtmlColor => "#FF0000";
|
||||
|
||||
private readonly Dictionary<CCSPlayerController, DateTime> _lastUse = new();
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventRoundStart>(OnRoundStart);
|
||||
RegisterEventHandler<EventWeaponFire>(OnWeaponFire);
|
||||
}
|
||||
|
||||
private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo _)
|
||||
{
|
||||
_lastUse.Clear();
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private HookResult OnWeaponFire(EventWeaponFire @event, GameEventInfo info)
|
||||
{
|
||||
var controller = @event.Userid;
|
||||
if (!Ensure.Player(controller).IsValid().Check() || !IsAssignedTo(controller!))
|
||||
return HookResult.Continue;
|
||||
|
||||
// Only pistols
|
||||
var weapon = controller!.PlayerPawn.Value?.WeaponServices?.ActiveWeapon.Value;
|
||||
if (weapon == null)
|
||||
return HookResult.Continue;
|
||||
|
||||
// List of pistol weapon names (classnames)
|
||||
var pistolClassNames = new[]
|
||||
{
|
||||
"weapon_glock", "weapon_usp_silencer", "weapon_hkp2000", "weapon_p250",
|
||||
"weapon_fiveseven", "weapon_tec9", "weapon_cz75a", "weapon_deagle",
|
||||
"weapon_revolver", "weapon_elite"
|
||||
};
|
||||
|
||||
if (!pistolClassNames.Contains(weapon.DesignerName))
|
||||
return HookResult.Continue;
|
||||
|
||||
// Check cooldown (skip if nodelay is enabled)
|
||||
var now = DateTime.UtcNow;
|
||||
if (!GlobalConfig.NoDelayEnabled && _lastUse.TryGetValue(controller!, out var lastUseTime) && (now - lastUseTime).TotalSeconds < 0.5)
|
||||
return HookResult.Continue;
|
||||
_lastUse[controller!] = now;
|
||||
|
||||
var pawn = controller!.PlayerPawn.Value;
|
||||
if (pawn == null || !pawn.IsValid)
|
||||
return HookResult.Continue;
|
||||
|
||||
var pos = pawn.AbsOrigin;
|
||||
if (pos == null) return HookResult.Continue;
|
||||
pos = new Vector(pos.X, pos.Y, pos.Z + 64f);
|
||||
|
||||
// Forward vector from the player's view angles
|
||||
var ang = pawn.V_angle;
|
||||
float yaw = ang.Y * MathF.PI / 180f;
|
||||
float pitch = ang.X * MathF.PI / 180f;
|
||||
var forward = new Vector(
|
||||
MathF.Cos(yaw) * MathF.Cos(pitch),
|
||||
MathF.Sin(yaw) * MathF.Cos(pitch),
|
||||
-MathF.Sin(pitch)
|
||||
);
|
||||
|
||||
// Spawn farther in front of the player so the grenade does not collide with the shooter.
|
||||
const float spawnAhead = 72f;
|
||||
pos = new Vector(
|
||||
pos.X + forward.X * spawnAhead,
|
||||
pos.Y + forward.Y * spawnAhead,
|
||||
pos.Z + forward.Z * 24f
|
||||
);
|
||||
|
||||
const float speed = 1100f;
|
||||
|
||||
int grenadeCount = GlobalConfig.GetGrenadeLauncherCount(1);
|
||||
for (int i = 0; i < grenadeCount; i++)
|
||||
{
|
||||
// Add slight random spread for multiple grenades
|
||||
var random = new Random();
|
||||
var spreadAng = new QAngle(
|
||||
ang.X + (float)(random.NextDouble() * 10.0 - 5.0), // ±5° pitch
|
||||
ang.Y + (float)(random.NextDouble() * 10.0 - 5.0), // ±5° yaw
|
||||
ang.Z
|
||||
);
|
||||
|
||||
float spreadYaw = spreadAng.Y * MathF.PI / 180f;
|
||||
float spreadPitch = spreadAng.X * MathF.PI / 180f;
|
||||
var spreadForward = new Vector(
|
||||
MathF.Cos(spreadYaw) * MathF.Cos(spreadPitch),
|
||||
MathF.Sin(spreadYaw) * MathF.Cos(spreadPitch),
|
||||
-MathF.Sin(spreadPitch)
|
||||
);
|
||||
|
||||
var velocity = new Vector(
|
||||
spreadForward.X * speed,
|
||||
spreadForward.Y * speed,
|
||||
spreadForward.Z * speed + 100f
|
||||
);
|
||||
|
||||
GrenadeSpawner.CreateGrenade(pos, spreadAng, velocity, pawn);
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class IAmChicken(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 10;
|
||||
public override string Name => "I Am Chicken!";
|
||||
|
||||
public override string Description => $"You become Chicken! You're harder to hit but have 30% of HP.";
|
||||
|
||||
public override char ChatColor => ChatColors.Orange;
|
||||
|
||||
public override string HtmlColor => "#FF8B42";
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventRoundStart>(OnRoundStart);
|
||||
}
|
||||
|
||||
private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo info)
|
||||
{
|
||||
var random = new Random();
|
||||
foreach (var player in PlayerPowers.Instance.GetPlayersWithPower(this))
|
||||
{
|
||||
if (!Ensure.Player(player).IsValid().Check())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var playerPawn = player.PlayerPawn?.Value;
|
||||
if (playerPawn == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
NextFrame(() =>
|
||||
{
|
||||
SetPlayerModel(player, "models/chicken/chicken.vmdl");
|
||||
playerPawn!.CBodyComponent!.SceneNode!.GetSkeletonInstance().MaterialGroup.Value =
|
||||
(uint)random.Next(1, 4);
|
||||
|
||||
playerPawn.MaxHealth = 30;
|
||||
playerPawn.Health = 30;
|
||||
Utilities.SetStateChanged(player, "CCSPlayerPawn", "m_iMaxHealth");
|
||||
});
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private void SetPlayerModel(CCSPlayerController player, string model)
|
||||
{
|
||||
var pawn = player.PlayerPawn?.Value;
|
||||
if (pawn == null) return;
|
||||
|
||||
NextFrame(() =>
|
||||
{
|
||||
pawn.SetModel(model);
|
||||
var originalRender = pawn.Render;
|
||||
pawn.Render = Color.FromArgb(255, originalRender.R, originalRender.G, originalRender.B);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class IronBody(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 18;
|
||||
public override string Name => "Iron Body";
|
||||
|
||||
public override string Description => $"You can only be killed by headshots.";
|
||||
|
||||
public override char ChatColor => ChatColors.LightPurple;
|
||||
|
||||
public override string HtmlColor => "#8B4513";
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventPlayerHurt>(OnPlayerHurt);
|
||||
}
|
||||
|
||||
private HookResult OnPlayerHurt(EventPlayerHurt @event, GameEventInfo info)
|
||||
{
|
||||
var attacker = @event.Attacker;
|
||||
var victim = @event.Userid;
|
||||
if (@event.Hitgroup == (int)HitGroup_t.HITGROUP_HEAD)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
if (
|
||||
!Ensure.Player(victim).IsValid().Check() ||
|
||||
!Ensure.Player(attacker).IsValid().Check() ||
|
||||
attacker == victim ||
|
||||
!IsAssignedTo(victim!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
var playerPawn = victim!.PlayerPawn.Value;
|
||||
var newHealth = playerPawn!.Health + @event.DmgHealth;
|
||||
|
||||
if (newHealth > 100)
|
||||
newHealth = 100;
|
||||
|
||||
playerPawn.Health = newHealth;
|
||||
return HookResult.Stop;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class IronHead(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 4;
|
||||
public override string Name => "Iron Head";
|
||||
|
||||
public override string Description => $"You cannot be killed by head shots.";
|
||||
|
||||
public override char ChatColor => ChatColors.LightPurple;
|
||||
|
||||
public override string HtmlColor => "#8B4513";
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventPlayerHurt>(OnPlayerHurt);
|
||||
}
|
||||
|
||||
private HookResult OnPlayerHurt(EventPlayerHurt @event, GameEventInfo info)
|
||||
{
|
||||
var attacker = @event.Attacker;
|
||||
var victim = @event.Userid;
|
||||
if (@event.Hitgroup != (int)HitGroup_t.HITGROUP_HEAD)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
if (
|
||||
!Ensure.Player(victim).IsValid().Check() ||
|
||||
!Ensure.Player(attacker).IsValid().Check() ||
|
||||
attacker == victim ||
|
||||
!IsAssignedTo(victim!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
var playerPawn = victim!.PlayerPawn.Value;
|
||||
var newHealth = playerPawn!.Health + @event.DmgHealth;
|
||||
|
||||
if (newHealth > 100)
|
||||
newHealth = 100;
|
||||
|
||||
playerPawn.Health = newHealth;
|
||||
return HookResult.Stop;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class Jetpack(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
private const float MaxFuel = 180.0f;
|
||||
private const float FuelBurnPerTick = 0.8f;
|
||||
private const float FuelRechargePerTick = 0.9f;
|
||||
private const float LiftPerTick = 14.0f;
|
||||
private const float MaxVerticalSpeed = 260.0f;
|
||||
private static readonly TimeSpan HudRefreshInterval = TimeSpan.FromMilliseconds(125);
|
||||
|
||||
public override int Id => 33;
|
||||
public override string Name => "Jetpack";
|
||||
public override string Description => "Hold Jump (Space) to fly with a fuel-based jetpack.";
|
||||
public override char ChatColor => ChatColors.Orange;
|
||||
public override string HtmlColor => "#FF8C00";
|
||||
|
||||
private readonly Dictionary<CCSPlayerController, float> _fuelByPlayer = new();
|
||||
private readonly Dictionary<CCSPlayerController, DateTime> _lastHudUpdate = new();
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterListener<Listeners.OnTick>(OnTick);
|
||||
RegisterEventHandler<EventRoundStart>(OnRoundStart);
|
||||
}
|
||||
|
||||
private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo info)
|
||||
{
|
||||
_fuelByPlayer.Clear();
|
||||
_lastHudUpdate.Clear();
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
public override void AssignToPlayer(CCSPlayerController player, bool showMessages)
|
||||
{
|
||||
base.AssignToPlayer(player, showMessages);
|
||||
_fuelByPlayer[player] = MaxFuel;
|
||||
_lastHudUpdate.Remove(player);
|
||||
}
|
||||
|
||||
public override void UnassignFromPlayer(CCSPlayerController player)
|
||||
{
|
||||
base.UnassignFromPlayer(player);
|
||||
_fuelByPlayer.Remove(player);
|
||||
_lastHudUpdate.Remove(player);
|
||||
}
|
||||
|
||||
private void OnTick()
|
||||
{
|
||||
foreach (var player in Utilities.GetPlayers())
|
||||
{
|
||||
if (!player.IsValid || !player.PawnIsAlive)
|
||||
continue;
|
||||
|
||||
if (!IsAssignedTo(player))
|
||||
continue;
|
||||
|
||||
var pawn = player.PlayerPawn.Value;
|
||||
if (pawn == null || !pawn.IsValid)
|
||||
continue;
|
||||
|
||||
float fuel = _fuelByPlayer.GetValueOrDefault(player, MaxFuel);
|
||||
bool isJumpPressed = player.Buttons.HasFlag(PlayerButtons.Jump);
|
||||
|
||||
if (isJumpPressed && fuel > 0.0f)
|
||||
{
|
||||
var currentVelocity = pawn.AbsVelocity;
|
||||
currentVelocity.Z = Math.Min(currentVelocity.Z + LiftPerTick, MaxVerticalSpeed);
|
||||
pawn.Teleport(pawn.AbsOrigin, null, currentVelocity);
|
||||
fuel = Math.Max(0.0f, fuel - FuelBurnPerTick);
|
||||
}
|
||||
else
|
||||
{
|
||||
fuel = Math.Min(MaxFuel, fuel + FuelRechargePerTick);
|
||||
}
|
||||
|
||||
_fuelByPlayer[player] = fuel;
|
||||
|
||||
if (isJumpPressed)
|
||||
{
|
||||
var now = DateTime.UtcNow;
|
||||
if (!_lastHudUpdate.TryGetValue(player, out var lastHudUpdate) ||
|
||||
now - lastHudUpdate >= HudRefreshInterval)
|
||||
{
|
||||
_lastHudUpdate[player] = now;
|
||||
player.PrintToCenterHtml(BuildFuelMessage(fuel));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static string BuildFuelMessage(float fuel)
|
||||
{
|
||||
int percent = (int)MathF.Round((fuel / MaxFuel) * 100.0f);
|
||||
int filledBars = (int)MathF.Round((fuel / MaxFuel) * 10.0f);
|
||||
filledBars = Math.Clamp(filledBars, 0, 10);
|
||||
string bar = new string('|', filledBars).PadRight(10, '.');
|
||||
string color = percent > 60 ? "#4CAF50" : percent > 30 ? "#FFC107" : "#F44336";
|
||||
return $"<font color='#FFFFFF'>Jetpack Fuel:</font> <font color='{color}'>{percent}%</font><br><font color='{color}'>{bar}</font>";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
using Cs2SuperPowers.Utils;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class NotSoDecoy(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 24;
|
||||
public override string Name => "Not So Decoy";
|
||||
|
||||
public override string Description => "Decoys thrown by you spawn 20 grenades when thrown (5 second cooldown).";
|
||||
|
||||
public override char ChatColor => ChatColors.Red;
|
||||
|
||||
public override string HtmlColor => "#FF0000";
|
||||
|
||||
private readonly Dictionary<CCSPlayerController, DateTime> _lastUse = new();
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventRoundStart>(OnRoundStart);
|
||||
RegisterEventHandler<EventDecoyStarted>(OnDecoyStarted);
|
||||
}
|
||||
|
||||
private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo _)
|
||||
{
|
||||
_lastUse.Clear();
|
||||
|
||||
foreach (var player in Utilities.GetPlayers())
|
||||
{
|
||||
if (!Ensure.Player(player).IsValid().IsAlive().Check() || !IsAssignedTo(player!))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
Server.NextFrame(() =>
|
||||
{
|
||||
player.GiveNamedItem("weapon_decoy");
|
||||
});
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private HookResult OnDecoyStarted(EventDecoyStarted @event, GameEventInfo _)
|
||||
{
|
||||
var player = @event.Userid;
|
||||
if (!Ensure.Player(player).IsValid().Check() || !IsAssignedTo(player!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
// Check cooldown (skip if nodelay is enabled)
|
||||
var now = DateTime.UtcNow;
|
||||
DateTime lastUseTime = default;
|
||||
bool isOnCooldown = !GlobalConfig.NoDelayEnabled && _lastUse.TryGetValue(player!, out lastUseTime) && (now - lastUseTime).TotalSeconds < 5;
|
||||
|
||||
// Always give a new decoy, regardless of cooldown!
|
||||
player!.GiveNamedItem("weapon_decoy");
|
||||
|
||||
if (isOnCooldown)
|
||||
{
|
||||
double secondsRemaining = Math.Ceiling(5 - (now - lastUseTime).TotalSeconds);
|
||||
player.PrintToCenterAlert($"Not So Decoy is on cooldown! {ChatColors.DarkRed}{secondsRemaining}{ChatColors.Default}s remaining");
|
||||
return HookResult.Continue;
|
||||
}
|
||||
_lastUse[player!] = now;
|
||||
|
||||
var pos = new Vector(@event.X, @event.Y, @event.Z);
|
||||
|
||||
// Spawn grenades (with boost level) in a loop with random angles and velocities
|
||||
var random = new Random();
|
||||
int grenadeCount = GlobalConfig.GetNotSoDecoyCount(20);
|
||||
for (int i = 0; i < grenadeCount; i++)
|
||||
{
|
||||
// Random pitch between -45 and 45 degrees, yaw between 0 and 360
|
||||
float pitch = (float)(random.NextDouble() * 90.0 - 45.0);
|
||||
float yaw = (float)(random.NextDouble() * 360.0);
|
||||
var ang = new QAngle(pitch, yaw, 0);
|
||||
|
||||
// Random speed between 400 and 900 units
|
||||
float speed = (float)(random.NextDouble() * 500.0 + 400.0);
|
||||
|
||||
// Convert angles to a forward vector
|
||||
float pitchRad = pitch * MathF.PI / 180f;
|
||||
float yawRad = yaw * MathF.PI / 180f;
|
||||
var forward = new Vector(
|
||||
MathF.Cos(yawRad) * MathF.Cos(pitchRad),
|
||||
MathF.Sin(yawRad) * MathF.Cos(pitchRad),
|
||||
-MathF.Sin(pitchRad));
|
||||
|
||||
// Add some random upward velocity for the "jump"
|
||||
float upward = (float)(random.NextDouble() * 200.0 + 200.0);
|
||||
|
||||
var velocity = new Vector(
|
||||
forward.X * speed,
|
||||
forward.Y * speed,
|
||||
forward.Z * speed + upward);
|
||||
|
||||
var createdGrenade = GrenadeSpawner.CreateGrenade(pos, ang, velocity, player.PlayerPawn.Value);
|
||||
}
|
||||
return HookResult.Continue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class OneShot(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
private const double InstantKillChance = 0.25;
|
||||
private readonly Random _random = new();
|
||||
|
||||
public override int Id => 23;
|
||||
public override string Name => "One Shot";
|
||||
|
||||
public override string Description => $"Each damaging hit has a {(int)(InstantKillChance * 100)}% chance to instantly eliminate the enemy.";
|
||||
|
||||
public override char ChatColor => ChatColors.Magenta;
|
||||
|
||||
public override string HtmlColor => "#ff5CD9";
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventPlayerHurt>(OnPlayerHurt);
|
||||
}
|
||||
|
||||
private HookResult OnPlayerHurt(EventPlayerHurt @event, GameEventInfo info)
|
||||
{
|
||||
var attacker = @event.Attacker;
|
||||
var victim = @event.Userid;
|
||||
|
||||
if (!Ensure.Player(attacker).IsValid().IsAlive().Check() ||
|
||||
!Ensure.Player(victim).IsValid().Check() ||
|
||||
attacker == victim ||
|
||||
!IsAssignedTo(attacker!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
// Check for at least 1 player in the opposing team
|
||||
var attackerTeam = attacker!.Team;
|
||||
var enemyCount = Utilities.GetPlayers().Count(p =>
|
||||
p.IsValid && p.Team != CsTeam.None && p.Team != CsTeam.Spectator && p.Team != attackerTeam);
|
||||
if (enemyCount < 1)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
var victimPawn = victim!.PlayerPawn.Value;
|
||||
if (victimPawn == null)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
if (_random.NextDouble() > InstantKillChance)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
victimPawn.Health = 0;
|
||||
Utilities.SetStateChanged(victimPawn, "CBaseEntity", "m_iHealth");
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class PanicTeleport(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 16;
|
||||
public override string Name => "Panic Teleport";
|
||||
|
||||
public override string Description => $"Save a single location with the use key, then teleport back to that position whenever you press the use key again.";
|
||||
|
||||
public override char ChatColor => ChatColors.BlueGrey;
|
||||
|
||||
public override string HtmlColor => "#cdcece";
|
||||
|
||||
private readonly List<PanicTeleportInfo> _registrations = new();
|
||||
|
||||
public override void AssignToPlayer(CCSPlayerController player, bool showMessages)
|
||||
{
|
||||
base.AssignToPlayer(player, showMessages);
|
||||
if (_registrations.All(registration => registration.Player != player))
|
||||
{
|
||||
_registrations.Add(new PanicTeleportInfo(player, null));
|
||||
}
|
||||
}
|
||||
|
||||
public override void UnassignFromPlayer(CCSPlayerController player)
|
||||
{
|
||||
base.UnassignFromPlayer(player);
|
||||
var registration = _registrations.FirstOrDefault(r => r.Player == player);
|
||||
if (registration != null)
|
||||
{
|
||||
_registrations.Remove(registration);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterListener<Listeners.OnTick>(OnTick);
|
||||
RegisterEventHandler<EventRoundStart>(OnRoundStart);
|
||||
RegisterEventHandler<EventPlayerDeath>(OnPlayerDeath);
|
||||
}
|
||||
|
||||
private HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo info)
|
||||
{
|
||||
var player = @event.Userid;
|
||||
var registration = _registrations
|
||||
.FirstOrDefault(r => r.Player == player);
|
||||
if (registration != null)
|
||||
{
|
||||
registration.SavedLocation = null;
|
||||
registration.WasUsePressedLastTick = false;
|
||||
}
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo info)
|
||||
{
|
||||
_registrations.Clear();
|
||||
foreach (var player in PlayerPowers.Instance.GetPlayersWithPower(this))
|
||||
{
|
||||
_registrations.Add(new PanicTeleportInfo(player, null));
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private void OnTick()
|
||||
{
|
||||
foreach (var registration in _registrations)
|
||||
{
|
||||
var usePressed = registration.Player.Buttons.HasFlag(PlayerButtons.Use);
|
||||
if (usePressed && !registration.WasUsePressedLastTick)
|
||||
{
|
||||
// Key was just pressed (not held)
|
||||
HandleUseKeyPress(registration);
|
||||
}
|
||||
registration.WasUsePressedLastTick = usePressed;
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleUseKeyPress(PanicTeleportInfo registration)
|
||||
{
|
||||
var player = registration.Player;
|
||||
|
||||
if (!Ensure.Player(player).IsValid().Check() || player.PlayerPawn?.Value == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (registration.SavedLocation == null)
|
||||
{
|
||||
// Save current location
|
||||
var currentPos = player.PlayerPawn.Value.AbsOrigin;
|
||||
if (currentPos != null)
|
||||
{
|
||||
registration.SavedLocation = new Vector(currentPos.X, currentPos.Y, currentPos.Z);
|
||||
registration.SavedLocation.Z += 10;
|
||||
player.PrintToCenterAlert($"{ChatColor}Location saved! Press use key again to teleport back.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Teleport to saved location
|
||||
var savedPos = registration.SavedLocation;
|
||||
player.PlayerPawn.Value.Teleport(savedPos, null, null);
|
||||
registration.SavedLocation = null;
|
||||
player.PrintToCenterAlert($"{ChatColor}Teleported. Press use to save a new location.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public record PanicTeleportInfo(CCSPlayerController Player, Vector? SavedLocation)
|
||||
{
|
||||
public Vector? SavedLocation { get; set; } = SavedLocation;
|
||||
public bool WasUsePressedLastTick { get; set; } = false;
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class Phoenix(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 2;
|
||||
public override string Name => "Phoenix Rising";
|
||||
|
||||
public override string Description => $"You will be reborn after your first death like Phoenix from the ashes.";
|
||||
|
||||
public override char ChatColor => ChatColors.DarkRed;
|
||||
|
||||
public override string HtmlColor => "#ff5C0A";
|
||||
public override int MinimumPlayersRequired => 4;
|
||||
|
||||
private HashSet<CCSPlayerController> _phoenixUses = new HashSet<CCSPlayerController>();
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventRoundStart>(OnRoundStart);
|
||||
RegisterEventHandler<EventPlayerDeath>(OnPlayerDeath);
|
||||
}
|
||||
|
||||
private HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo _)
|
||||
{
|
||||
var player = @event.Userid;
|
||||
if (!Ensure.Player(player).IsValid().Check() || !IsAssignedTo(player!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
// Check for at least 4 valid (non-spectator, non-none) players total
|
||||
var validPlayerCount = Utilities.GetPlayers().Count(p =>
|
||||
p.IsValid && p.Team != CsTeam.None && p.Team != CsTeam.Spectator);
|
||||
if (validPlayerCount < 4)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
if (_phoenixUses.Contains(player!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
Server.NextFrame(() =>
|
||||
{
|
||||
var newHealth = 120;
|
||||
player!.SetNewHealth(newHealth);
|
||||
player!.Respawn();
|
||||
_phoenixUses.Add(player);
|
||||
|
||||
player.PrintToChat($"{ChatColors.DarkRed}Phoenix {ChatColors.Green}rises.");
|
||||
});
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo _)
|
||||
{
|
||||
_phoenixUses = new HashSet<CCSPlayerController>();
|
||||
foreach (var player in Utilities.GetPlayers())
|
||||
{
|
||||
if (!Ensure.Player(player).IsValid().Check() || !IsAssignedTo(player!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
Server.NextFrame(() =>
|
||||
{
|
||||
player.SetNewHealth(50);
|
||||
});
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class PowerThief(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 15;
|
||||
public override string Name => "Power Thief";
|
||||
|
||||
public override string Description => $"With a 25% chance on hit, you can permanently strip your enemies of their current superpower.";
|
||||
|
||||
public override char ChatColor => ChatColors.LightYellow;
|
||||
|
||||
public override string HtmlColor => "#f8e1ab";
|
||||
|
||||
private readonly Random _random = new();
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventPlayerHurt>(OnPlayerHurt);
|
||||
}
|
||||
|
||||
private HookResult OnPlayerHurt(EventPlayerHurt @event, GameEventInfo info)
|
||||
{
|
||||
var attacker = @event.Attacker;
|
||||
var victim = @event.Userid;
|
||||
|
||||
if (
|
||||
!Ensure.Player(victim).IsValid().Check() ||
|
||||
!Ensure.Player(attacker).IsValid().Check() ||
|
||||
attacker == victim ||
|
||||
!IsAssignedTo(attacker!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
// Check for at least 1 player in the opposing team
|
||||
var attackerTeam = attacker!.Team;
|
||||
var enemyCount = Utilities.GetPlayers().Count(p =>
|
||||
p.IsValid && p.Team != CsTeam.None && p.Team != CsTeam.Spectator && p.Team != attackerTeam);
|
||||
if (enemyCount < 1)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
if (_random.NextDouble() <= 0.25)
|
||||
{
|
||||
StealSuperpower(victim!, attacker!);
|
||||
}
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private void StealSuperpower(CCSPlayerController victim, CCSPlayerController attacker)
|
||||
{
|
||||
if (!PlayerPowers.Instance.TryGetValue(victim, out var power)) return;
|
||||
|
||||
PlayerPowers.Instance.RemovePower(victim);
|
||||
victim.SetMaxHealth(100);
|
||||
attacker.PrintToChat($"You have stolen {ChatColors.Red}{victim.PlayerName} {ChatColors.Default}superpower {power!.ChatColor}{power.Name}.");
|
||||
victim.PrintToChat($"Your superpower {power.ChatColor}{power.Name} {ChatColors.Red}was stolen! You're a regular guy/gal now.");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class Rambo(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 5;
|
||||
public override string Name => "John Rambo";
|
||||
|
||||
public override string Description => $"You start with additional random health, negev, kevlar and hand grenades. Enemy team gets 5000 cash.";
|
||||
|
||||
public override char ChatColor => ChatColors.Green;
|
||||
|
||||
public override string HtmlColor => "#009905";
|
||||
public override int MinimumPlayersRequired => 4;
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventRoundStart>(OnRoundStart);
|
||||
}
|
||||
|
||||
private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo _)
|
||||
{
|
||||
var random = new Random();
|
||||
var ramboPlayers = PlayerPowers.Instance.GetPlayersWithPower(this).ToList();
|
||||
var validPlayerCount = Utilities.GetPlayers().Count(player =>
|
||||
player.IsValid && player.Team != CsTeam.None && player.Team != CsTeam.Spectator);
|
||||
if (validPlayerCount < MinimumPlayersRequired)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
// If there are any Rambo players, give enemy team 5000 cash
|
||||
if (ramboPlayers.Count > 0)
|
||||
{
|
||||
var ramboTeam = ramboPlayers.First().Team;
|
||||
foreach (var player in Utilities.GetPlayers())
|
||||
{
|
||||
if (!Ensure.Player(player).IsValid().Check())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (player.Team != ramboTeam && player.Team != CsTeam.None && player.Team != CsTeam.Spectator)
|
||||
{
|
||||
Server.NextFrame(() =>
|
||||
{
|
||||
if (player.InGameMoneyServices != null)
|
||||
{
|
||||
player.InGameMoneyServices.Account += 5000;
|
||||
Utilities.SetStateChanged(player, "CCSPlayerController", "m_pInGameMoneyServices");
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var player in ramboPlayers)
|
||||
{
|
||||
if (!Ensure.Player(player).IsValid().Check())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
Server.NextFrame(() =>
|
||||
{
|
||||
var newHealth = 100 + random.Next(150, 400);
|
||||
|
||||
player.GiveNamedItem("weapon_negev");
|
||||
player.GiveNamedItem("item_assaultsuit");
|
||||
player.GiveNamedItem("weapon_hegrenade");
|
||||
|
||||
player.SetNewHealth(newHealth);
|
||||
});
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class RandomTeleport(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 29;
|
||||
public override string Name => "Random Teleport";
|
||||
public override string Description => "Teleport to a random position on the map every time you get a kill!";
|
||||
public override char ChatColor => ChatColors.Purple;
|
||||
public override string HtmlColor => "#800080";
|
||||
|
||||
private readonly Random _random = new();
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventPlayerDeath>(OnPlayerDeath);
|
||||
}
|
||||
|
||||
private HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo info)
|
||||
{
|
||||
var attacker = @event.Attacker;
|
||||
if (!Ensure.Player(attacker).IsValid().IsAlive().Check() || !IsAssignedTo(attacker!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
var pawn = attacker!.PlayerPawn.Value;
|
||||
if (pawn == null || !pawn.IsValid)
|
||||
return HookResult.Continue;
|
||||
|
||||
// Find random valid player to teleport near
|
||||
var validPlayers = Utilities.GetPlayers()
|
||||
.Where(p => p.IsValid && p.PawnIsAlive && p != attacker)
|
||||
.ToList();
|
||||
|
||||
if (validPlayers.Count > 0)
|
||||
{
|
||||
// Teleport near a random player
|
||||
var targetPlayer = validPlayers[_random.Next(validPlayers.Count)];
|
||||
var targetPos = targetPlayer.PlayerPawn.Value!.AbsOrigin!;
|
||||
|
||||
// Random offset of 100-300 units
|
||||
var offset = new Vector(
|
||||
(float)(_random.NextDouble() * 400 - 200),
|
||||
(float)(_random.NextDouble() * 400 - 200),
|
||||
50
|
||||
);
|
||||
|
||||
pawn.Teleport(targetPos + offset, null, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
// If no other players, teleport in a random direction from current position
|
||||
var currentPos = pawn.AbsOrigin!;
|
||||
var offset = new Vector(
|
||||
(float)(_random.NextDouble() * 600 - 300),
|
||||
(float)(_random.NextDouble() * 600 - 300),
|
||||
100
|
||||
);
|
||||
pawn.Teleport(currentPos + offset, null, null);
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class RiseFromTheDead(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 1;
|
||||
public override string Name => "Rise From the Dead";
|
||||
|
||||
public override string Description => $"You have {(int)(ReviveChance * 100)}% chance to rise from the dead.";
|
||||
|
||||
public override char ChatColor => ChatColors.Red;
|
||||
|
||||
public override string HtmlColor => "#ff5C0A";
|
||||
public override int MinimumPlayersRequired => 4;
|
||||
|
||||
private const double ReviveChance = 0.35;
|
||||
|
||||
private readonly Random _random = new();
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventPlayerDeath>(OnPlayerDeath);
|
||||
}
|
||||
|
||||
private HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo _)
|
||||
{
|
||||
var player = @event.Userid;
|
||||
if (!Ensure.Player(player).IsValid().Check() || !IsAssignedTo(player!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
// Check for at least 4 valid (non-spectator, non-none) players total
|
||||
var validPlayerCount = Utilities.GetPlayers().Count(p =>
|
||||
p.IsValid && p.Team != CsTeam.None && p.Team != CsTeam.Spectator);
|
||||
if (validPlayerCount < 4)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
if (_random.NextDouble() <= ReviveChance)
|
||||
{
|
||||
Server.NextFrame(() =>
|
||||
{
|
||||
player!.MaxHealth = 70;
|
||||
player.Health = 70;
|
||||
player.Respawn();
|
||||
player.PrintToChat($"You have been raised from {ChatColors.DarkRed}the dead.");
|
||||
});
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class Shield(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 32;
|
||||
public override string Name => "Shield";
|
||||
public override string Description => "Hold E (Use) to activate a shield that blocks all damage! Shield has 100 energy points (regenerates 10 per second when not in use).";
|
||||
public override char ChatColor => ChatColors.Yellow;
|
||||
public override string HtmlColor => "#FFFF00";
|
||||
|
||||
private readonly Dictionary<CCSPlayerController, float> _shieldEnergy = new();
|
||||
private readonly Dictionary<CCSPlayerController, bool> _shieldActive = new();
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterListener<Listeners.OnTick>(OnTick);
|
||||
RegisterEventHandler<EventRoundStart>(OnRoundStart);
|
||||
RegisterEventHandler<EventPlayerHurt>(OnPlayerHurt);
|
||||
}
|
||||
|
||||
private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo _)
|
||||
{
|
||||
_shieldEnergy.Clear();
|
||||
_shieldActive.Clear();
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
public override void AssignToPlayer(CCSPlayerController player, bool showMessages)
|
||||
{
|
||||
base.AssignToPlayer(player, showMessages);
|
||||
_shieldEnergy[player] = 100.0f;
|
||||
_shieldActive[player] = false;
|
||||
}
|
||||
|
||||
public override void UnassignFromPlayer(CCSPlayerController player)
|
||||
{
|
||||
base.UnassignFromPlayer(player);
|
||||
_shieldEnergy.Remove(player);
|
||||
_shieldActive.Remove(player);
|
||||
}
|
||||
|
||||
private void OnTick()
|
||||
{
|
||||
foreach (var player in Utilities.GetPlayers())
|
||||
{
|
||||
if (!player.IsValid || !player.PawnIsAlive)
|
||||
continue;
|
||||
|
||||
if (!IsAssignedTo(player))
|
||||
continue;
|
||||
|
||||
if (!_shieldEnergy.ContainsKey(player))
|
||||
continue;
|
||||
|
||||
var usePressed = player.Buttons.HasFlag(PlayerButtons.Use);
|
||||
|
||||
if (usePressed && _shieldEnergy[player] > 0)
|
||||
{
|
||||
// Shield is active!
|
||||
_shieldActive[player] = true;
|
||||
_shieldEnergy[player] -= 0.5f; // Consume 0.5 energy per tick
|
||||
|
||||
// Update HUD (center alert) every second
|
||||
if (Math.Abs(_shieldEnergy[player] % 20) < 1)
|
||||
{
|
||||
player.PrintToCenterAlert($"{ChatColor}Shield: {Math.Ceiling(_shieldEnergy[player])}%");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Shield not active, regenerate
|
||||
_shieldActive[player] = false;
|
||||
if (_shieldEnergy[player] < 100.0f)
|
||||
{
|
||||
_shieldEnergy[player] += 0.3f; // Regenerate 0.3 per tick
|
||||
if (_shieldEnergy[player] > 100.0f)
|
||||
_shieldEnergy[player] = 100.0f;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private HookResult OnPlayerHurt(EventPlayerHurt @event, GameEventInfo info)
|
||||
{
|
||||
var victim = @event.Userid;
|
||||
|
||||
if (!Ensure.Player(victim).IsValid().Check() || !IsAssignedTo(victim!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
var validatedVictim = victim!;
|
||||
if (_shieldActive.GetValueOrDefault(validatedVictim, false))
|
||||
{
|
||||
var pawn = validatedVictim.PlayerPawn.Value;
|
||||
if (pawn == null || !pawn.IsValid)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
pawn.Health = Math.Min(pawn.MaxHealth, pawn.Health + @event.DmgHealth);
|
||||
Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth");
|
||||
return HookResult.Handled;
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class TeleportOnKill(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 21;
|
||||
public override string Name => "Teleport On Kill";
|
||||
|
||||
public override string Description => $"When you kill an enemy, you teleport to their location (needs at least 4 players)";
|
||||
|
||||
public override char ChatColor => ChatColors.Red;
|
||||
|
||||
public override string HtmlColor => "#FF0000";
|
||||
public override int MinimumPlayersRequired => 4;
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventPlayerDeath>(OnPlayerDeath);
|
||||
}
|
||||
|
||||
private HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo info)
|
||||
{
|
||||
var attacker = @event.Attacker;
|
||||
var victim = @event.Userid;
|
||||
|
||||
if (
|
||||
!Ensure.Player(victim).IsValid().Check() ||
|
||||
!Ensure.Player(attacker).IsValid().Check() ||
|
||||
attacker == victim ||
|
||||
!IsAssignedTo(attacker!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
// Check for at least 4 valid (non-spectator, non-none) players total
|
||||
var validPlayerCount = Utilities.GetPlayers().Count(p =>
|
||||
p.IsValid && p.Team != CsTeam.None && p.Team != CsTeam.Spectator);
|
||||
if (validPlayerCount < 4)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
if (victim!.PlayerPawn?.Value != null && attacker!.PlayerPawn?.Value != null)
|
||||
{
|
||||
var victimPos = victim.PlayerPawn.Value.AbsOrigin;
|
||||
// raise Z a bit to avoid getting stuck in the ground
|
||||
if (victimPos != null)
|
||||
{
|
||||
victimPos.Z += 10;
|
||||
attacker.PlayerPawn.Value.Teleport(victimPos, null, null);
|
||||
}
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class Twister(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 14;
|
||||
public override string Name => "Twister";
|
||||
|
||||
public override string Description => $"Inflict disorienting spins upon your enemies with a 25% chance on each hit, disrupting their aim and movement.";
|
||||
|
||||
public override char ChatColor => ChatColors.Silver;
|
||||
|
||||
public override string HtmlColor => "#00FF00";
|
||||
|
||||
private readonly Random _random = new();
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventPlayerHurt>(OnPlayerHurt);
|
||||
}
|
||||
|
||||
private HookResult OnPlayerHurt(EventPlayerHurt @event, GameEventInfo info)
|
||||
{
|
||||
var attacker = @event.Attacker;
|
||||
var victim = @event.Userid;
|
||||
|
||||
if (
|
||||
!Ensure.Player(victim).IsValid().Check() ||
|
||||
!Ensure.Player(attacker).IsValid().Check() ||
|
||||
attacker == victim ||
|
||||
!IsAssignedTo(attacker!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
// Check for at least 1 player in the opposing team
|
||||
var attackerTeam = attacker!.Team;
|
||||
var enemyCount = Utilities.GetPlayers().Count(p =>
|
||||
p.IsValid && p.Team != CsTeam.None && p.Team != CsTeam.Spectator && p.Team != attackerTeam);
|
||||
if (enemyCount < 1)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
if (_random.NextDouble() <= 0.25)
|
||||
{
|
||||
RotateEnemy(victim!);
|
||||
}
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private void RotateEnemy(CCSPlayerController player)
|
||||
{
|
||||
var currentPosition = player.PlayerPawn.Value!.AbsOrigin;
|
||||
var currentAngles = player.PlayerPawn.Value.V_angle;
|
||||
|
||||
var newAngles = new QAngle(
|
||||
currentAngles.X,
|
||||
currentAngles.Y + _random.Next(-180, 180),
|
||||
currentAngles.Z
|
||||
);
|
||||
player.PlayerPawn.Value.Teleport(currentPosition, newAngles, new Vector(0, 0, 0));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
public class Vampire(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 12;
|
||||
public override string Name => "Vampire";
|
||||
|
||||
public override string Description => $"Drain the life force of your enemies, healing yourself for {(int)(HealModifier * 100)}% of the damage dealt with each shot.";
|
||||
|
||||
public override char ChatColor => ChatColors.Magenta;
|
||||
|
||||
public override string HtmlColor => "#ff5CD9";
|
||||
public override int MinimumPlayersRequired => 4;
|
||||
|
||||
private const double HealModifier = 0.7;
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
RegisterEventHandler<EventPlayerHurt>(OnPlayerHurt);
|
||||
}
|
||||
|
||||
private HookResult OnPlayerHurt(EventPlayerHurt @event, GameEventInfo info)
|
||||
{
|
||||
var attacker = @event.Attacker;
|
||||
var victim = @event.Userid;
|
||||
|
||||
if (
|
||||
!Ensure.Player(victim).IsValid().IsAlive().Check() ||
|
||||
!Ensure.Player(attacker).IsValid().Check() ||
|
||||
attacker == victim ||
|
||||
!IsAssignedTo(attacker!))
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
// Check for at least 4 valid (non-spectator, non-none) players total
|
||||
var validPlayerCount = Utilities.GetPlayers().Count(p =>
|
||||
p.IsValid && p.Team != CsTeam.None && p.Team != CsTeam.Spectator);
|
||||
if (validPlayerCount < 4)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
var attackerPawn = attacker!.PlayerPawn.Value;
|
||||
if (attackerPawn == null)
|
||||
{
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
var healing = (int)(@event.DmgHealth * HealModifier);
|
||||
var newHealth = Math.Min(attackerPawn.Health + healing, attackerPawn.MaxHealth);
|
||||
attackerPawn.Health = newHealth;
|
||||
Utilities.SetStateChanged(attackerPawn, "CBaseEntity", "m_iHealth");
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,291 @@
|
||||
using System.Drawing;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using Cs2SuperPowers.Players;
|
||||
using Cs2SuperPowers.Players.PlayerValidations;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace Cs2SuperPowers.Powers;
|
||||
|
||||
// GlowData class
|
||||
public class GlowData
|
||||
{
|
||||
public CDynamicProp GlowEnt { get; set; } = null!;
|
||||
public CDynamicProp ModelRelay { get; set; } = null!;
|
||||
}
|
||||
|
||||
public class Wallhack(IPlayerHud playerHud) : BasePower(playerHud)
|
||||
{
|
||||
public override int Id => 26;
|
||||
public override string Name => "Wallhack";
|
||||
public override string Description => "See enemies through walls with a glow!";
|
||||
public override char ChatColor => ChatColors.Purple;
|
||||
public override string HtmlColor => "#AB4BD1";
|
||||
|
||||
// Static storage
|
||||
public static List<CCSPlayerController> Wallhackers = [];
|
||||
public static Dictionary<CCSPlayerController, GlowData> GlowData = [];
|
||||
private static BasePlugin? _plugin; // Static reference to plugin!
|
||||
private static readonly List<Delegate> _staticRegisteredDelegates = []; // Store delegates to prevent GC!
|
||||
|
||||
// Static references to event handler delegates to prevent GC!
|
||||
private static readonly BasePlugin.GameEventHandler<EventPlayerDeath> _onPlayerDeathHandler = OnPlayerDeath;
|
||||
private static readonly BasePlugin.GameEventHandler<EventPlayerDisconnect> _onPlayerDisconnectHandler = OnPlayerDisconnect;
|
||||
private static readonly BasePlugin.GameEventHandler<EventPlayerSpawn> _onPlayerSpawnHandler = OnPlayerSpawn;
|
||||
private static readonly BasePlugin.GameEventHandler<EventPlayerTeam> _onPlayerChangeTeamHandler = OnPlayerChangeTeam;
|
||||
// Also store a static reference to OnPlayerTransmit!
|
||||
public static readonly Action<CCheckTransmitInfo, CCSPlayerController> _onPlayerTransmitHandler = OnPlayerTransmit;
|
||||
|
||||
public override void AssignToPlayer(CCSPlayerController player, bool showMessages)
|
||||
{
|
||||
base.AssignToPlayer(player, showMessages);
|
||||
AddWallhacker(player);
|
||||
_plugin?.Logger.LogInformation("Wallhack assigned to {PlayerName}", player.PlayerName);
|
||||
|
||||
// Ensure all alive players have glows (delay slightly just in case!)
|
||||
NextFrame(() =>
|
||||
{
|
||||
foreach (var existingPlayer in Utilities.GetPlayers())
|
||||
{
|
||||
if (IsPlayerValid(existingPlayer) && existingPlayer.PawnIsAlive && existingPlayer.Team >= CsTeam.Terrorist)
|
||||
{
|
||||
if (!GlowData.ContainsKey(existingPlayer))
|
||||
{
|
||||
_plugin?.Logger.LogInformation("Creating glow for {PlayerName}", existingPlayer.PlayerName);
|
||||
Glow(existingPlayer);
|
||||
}
|
||||
}
|
||||
}
|
||||
_plugin?.Logger.LogInformation("Wallhackers: {Count}, GlowData: {GlowCount}", Wallhackers.Count, GlowData.Count);
|
||||
});
|
||||
}
|
||||
|
||||
public override void UnassignFromPlayer(CCSPlayerController player)
|
||||
{
|
||||
base.UnassignFromPlayer(player);
|
||||
RemoveWallhacker(player);
|
||||
_plugin?.Logger.LogInformation("Wallhack unassigned from {PlayerName}", player.PlayerName);
|
||||
}
|
||||
|
||||
protected override void OnInitialize()
|
||||
{
|
||||
_plugin = Plugin; // Set static plugin reference!
|
||||
RegisterEventHandler<EventPlayerDeath>(_onPlayerDeathHandler);
|
||||
RegisterEventHandler<EventPlayerDisconnect>(_onPlayerDisconnectHandler);
|
||||
RegisterEventHandler<EventPlayerSpawn>(_onPlayerSpawnHandler, HookMode.Post);
|
||||
RegisterEventHandler<EventPlayerTeam>(_onPlayerChangeTeamHandler, HookMode.Post);
|
||||
_plugin?.Logger.LogInformation("Wallhack initialized!");
|
||||
|
||||
// Delay creating initial glows until global variables are initialized!
|
||||
NextFrame(() =>
|
||||
{
|
||||
_plugin?.Logger.LogInformation("Creating initial glows for existing players!");
|
||||
foreach (var existingPlayer in Utilities.GetPlayers())
|
||||
{
|
||||
if (IsPlayerValid(existingPlayer) && existingPlayer.PawnIsAlive && existingPlayer.Team >= CsTeam.Terrorist)
|
||||
{
|
||||
if (!GlowData.ContainsKey(existingPlayer))
|
||||
{
|
||||
_plugin?.Logger.LogInformation("Creating glow for {PlayerName} during init", existingPlayer.PlayerName);
|
||||
Glow(existingPlayer);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static HookResult OnPlayerSpawn(EventPlayerSpawn @event, GameEventInfo info)
|
||||
{
|
||||
var player = @event.Userid;
|
||||
_plugin?.Logger.LogInformation("Wallhack: OnPlayerSpawn called for {PlayerName}", player?.PlayerName ?? "NULL");
|
||||
|
||||
if (!IsPlayerValid(player))
|
||||
{
|
||||
_plugin?.Logger.LogInformation("Wallhack: Player invalid, skipping");
|
||||
return HookResult.Continue;
|
||||
}
|
||||
if (player!.Team < CsTeam.Terrorist)
|
||||
{
|
||||
_plugin?.Logger.LogInformation("Wallhack: Player team invalid, skipping");
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
var gameRules = Utilities.FindAllEntitiesByDesignerName<CCSGameRulesProxy>("cs_gamerules").FirstOrDefault();
|
||||
if (gameRules?.GameRules?.WarmupPeriod == true)
|
||||
{
|
||||
_plugin?.Logger.LogInformation("Wallhack: Warmup period, skipping");
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
_plugin?.Logger.LogInformation("Wallhack: Calling Glow for {PlayerName}", player.PlayerName);
|
||||
Glow(player!);
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
public static HookResult OnPlayerDisconnect(EventPlayerDisconnect @event, GameEventInfo info)
|
||||
{
|
||||
var player = @event.Userid;
|
||||
if (!IsPlayerValid(player)) return HookResult.Continue;
|
||||
|
||||
if (GlowData.TryGetValue(player!, out var glowData))
|
||||
{
|
||||
if (glowData.GlowEnt.IsValid)
|
||||
glowData.GlowEnt.Remove();
|
||||
if (glowData.ModelRelay.IsValid)
|
||||
glowData.ModelRelay.Remove();
|
||||
|
||||
GlowData.Remove(player!);
|
||||
}
|
||||
|
||||
Wallhackers.Remove(player!);
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
public static HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo info)
|
||||
{
|
||||
var player = @event.Userid;
|
||||
if (!IsPlayerValid(player)) return HookResult.Continue;
|
||||
if (!GlowData.TryGetValue(player!, out var glowData)) return HookResult.Continue;
|
||||
|
||||
if (glowData.GlowEnt.IsValid)
|
||||
glowData.GlowEnt.Remove();
|
||||
if (glowData.ModelRelay.IsValid)
|
||||
glowData.ModelRelay.Remove();
|
||||
GlowData.Remove(player!);
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
public static HookResult OnPlayerChangeTeam(EventPlayerTeam @event, GameEventInfo info)
|
||||
{
|
||||
var player = @event.Userid;
|
||||
if (!IsPlayerValid(player)) return HookResult.Continue;
|
||||
if (!GlowData.TryGetValue(player!, out var glowData)) return HookResult.Continue;
|
||||
if (!glowData.GlowEnt.IsValid || !glowData.ModelRelay.IsValid) return HookResult.Continue;
|
||||
|
||||
NextWorldUpdate(() =>
|
||||
{
|
||||
glowData.GlowEnt.SetModel(GetPlayerModel(player!));
|
||||
glowData.ModelRelay.SetModel(GetPlayerModel(player!));
|
||||
});
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private static void Glow(CCSPlayerController player)
|
||||
{
|
||||
_plugin?.Logger.LogInformation("Wallhack: Glow() called for {PlayerName}", player.PlayerName);
|
||||
|
||||
// First remove existing glow for this player if it exists
|
||||
if (GlowData.TryGetValue(player, out var existingGlow))
|
||||
{
|
||||
if (existingGlow.GlowEnt.IsValid)
|
||||
existingGlow.GlowEnt.Remove();
|
||||
if (existingGlow.ModelRelay.IsValid)
|
||||
existingGlow.ModelRelay.Remove();
|
||||
GlowData.Remove(player);
|
||||
}
|
||||
|
||||
var glowEntity = Utilities.CreateEntityByName<CDynamicProp>("prop_dynamic");
|
||||
var modelRelay = Utilities.CreateEntityByName<CDynamicProp>("prop_dynamic");
|
||||
|
||||
if (glowEntity == null || modelRelay == null)
|
||||
{
|
||||
_plugin?.Logger.LogError("Wallhack: Failed to create glow entities for {PlayerName}", player.PlayerName);
|
||||
return;
|
||||
}
|
||||
|
||||
modelRelay.Spawnflags = 256;
|
||||
modelRelay.Render = Color.Transparent;
|
||||
modelRelay.RenderMode = RenderMode_t.kRenderNone;
|
||||
modelRelay.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags &= ~(1u << 2);
|
||||
modelRelay.SetModel(GetPlayerModel(player));
|
||||
|
||||
glowEntity.Spawnflags = 256;
|
||||
glowEntity.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags &= ~(1u << 2);
|
||||
glowEntity.Render = Color.FromArgb(1, 0, 0, 0);
|
||||
glowEntity.SetModel(GetPlayerModel(player));
|
||||
|
||||
glowEntity.DispatchSpawn();
|
||||
modelRelay.DispatchSpawn();
|
||||
|
||||
glowEntity.Glow.GlowRange = 5000;
|
||||
glowEntity.Glow.GlowRangeMin = 0;
|
||||
glowEntity.Glow.GlowColorOverride = Color.FromArgb(255, 171, 75, 209);
|
||||
glowEntity.Glow.GlowTeam = -1;
|
||||
glowEntity.Glow.GlowType = 3;
|
||||
|
||||
modelRelay.AcceptInput("FollowEntity", player.Pawn.Value, null, "!activator");
|
||||
glowEntity.AcceptInput("FollowEntity", modelRelay, null, "!activator");
|
||||
|
||||
GlowData.Add(player, new GlowData
|
||||
{
|
||||
GlowEnt = glowEntity,
|
||||
ModelRelay = modelRelay
|
||||
});
|
||||
}
|
||||
|
||||
private static string GetPlayerModel(CCSPlayerController player)
|
||||
{
|
||||
return player.Pawn.Value!.CBodyComponent!.SceneNode!.GetSkeletonInstance().ModelState.ModelName;
|
||||
}
|
||||
|
||||
private static bool IsPlayerValid(CCSPlayerController? plr) => plr != null &&
|
||||
plr.IsValid &&
|
||||
plr.PlayerPawn != null &&
|
||||
plr.PlayerPawn.IsValid &&
|
||||
plr.Connected == PlayerConnectedState.PlayerConnected &&
|
||||
!plr.IsHLTV;
|
||||
|
||||
public static void OnPlayerTransmit(CCheckTransmitInfo info, CCSPlayerController player)
|
||||
{
|
||||
foreach (var entity in GlowData.ToList())
|
||||
{
|
||||
if (Wallhackers.Contains(player!))
|
||||
{
|
||||
if (!IsPlayerValid(entity.Key) || !IsPlayerValid(player)) continue;
|
||||
|
||||
if (entity.Key.Team != player!.Team && player!.Team != CsTeam.Spectator && entity.Key.Team != CsTeam.Spectator)
|
||||
{
|
||||
info.TransmitEntities.Add(entity.Value.ModelRelay);
|
||||
info.TransmitEntities.Add(entity.Value.GlowEnt);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
info.TransmitEntities.Remove(entity.Value.ModelRelay);
|
||||
info.TransmitEntities.Remove(entity.Value.GlowEnt);
|
||||
}
|
||||
}
|
||||
|
||||
public static void AddWallhacker(CCSPlayerController player)
|
||||
{
|
||||
if (!Wallhackers.Contains(player))
|
||||
{
|
||||
Wallhackers.Add(player);
|
||||
}
|
||||
}
|
||||
|
||||
public static void RemoveWallhacker(CCSPlayerController player)
|
||||
{
|
||||
Wallhackers.Remove(player);
|
||||
}
|
||||
|
||||
// Helper to wrap Server.NextWorldUpdate and store delegate to prevent GC!
|
||||
private static void NextWorldUpdate(Action callback)
|
||||
{
|
||||
Action? wrappedCallback = null;
|
||||
wrappedCallback = () =>
|
||||
{
|
||||
callback();
|
||||
if (wrappedCallback != null)
|
||||
{
|
||||
_staticRegisteredDelegates.Remove(wrappedCallback);
|
||||
}
|
||||
};
|
||||
_staticRegisteredDelegates.Add(wrappedCallback);
|
||||
Server.NextWorldUpdate(wrappedCallback);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
|
||||
namespace Cs2SuperPowers.Utils;
|
||||
|
||||
public static class GrenadeSpawner
|
||||
{
|
||||
static MemoryFunctionWithReturn<IntPtr, IntPtr, IntPtr, IntPtr, IntPtr, int, CHEGrenadeProjectile>
|
||||
CHEGrenadeProjectile_CreateFunc = new(
|
||||
"55 4C 89 C1 48 89 E5 41 57 49 89 FF 41 56 49 89 D6"
|
||||
);
|
||||
|
||||
public static CBaseCSGrenadeProjectile? CreateGrenade(Vector position, QAngle angle, Vector velocity, CCSPlayerPawn? owner = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
return CHEGrenadeProjectile_CreateFunc.Invoke(
|
||||
position.Handle,
|
||||
angle.Handle,
|
||||
velocity.Handle,
|
||||
velocity.Handle,
|
||||
owner == null ? IntPtr.Zero : owner.Handle,
|
||||
44
|
||||
);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,888 @@
|
||||
{
|
||||
"runtimeTarget": {
|
||||
"name": ".NETCoreApp,Version=v8.0",
|
||||
"signature": ""
|
||||
},
|
||||
"compilationOptions": {},
|
||||
"targets": {
|
||||
".NETCoreApp,Version=v8.0": {
|
||||
"Cs2SuperPowersPlugin/1.0.0": {
|
||||
"dependencies": {
|
||||
"CounterStrikeSharp.API": "1.0.340"
|
||||
},
|
||||
"runtime": {
|
||||
"Cs2SuperPowersPlugin.dll": {}
|
||||
}
|
||||
},
|
||||
"CounterStrikeSharp.API/1.0.340": {
|
||||
"dependencies": {
|
||||
"McMaster.NETCore.Plugins": "1.4.0",
|
||||
"Microsoft.CSharp": "4.7.0",
|
||||
"Microsoft.DotNet.ApiCompat.Task": "8.0.203",
|
||||
"Microsoft.Extensions.Hosting": "8.0.0",
|
||||
"Microsoft.Extensions.Hosting.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Localization.Abstractions": "8.0.3",
|
||||
"Microsoft.Extensions.Logging": "8.0.0",
|
||||
"Scrutor": "4.2.2",
|
||||
"Serilog.Extensions.Logging": "8.0.0",
|
||||
"Serilog.Sinks.Console": "5.0.0",
|
||||
"Serilog.Sinks.File": "5.0.0",
|
||||
"System.Data.DataSetExtensions": "4.5.0",
|
||||
"Tomlyn": "0.19.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/CounterStrikeSharp.API.dll": {
|
||||
"assemblyVersion": "1.0.340.0",
|
||||
"fileVersion": "1.0.340.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"McMaster.NETCore.Plugins/1.4.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.DotNet.PlatformAbstractions": "3.1.6",
|
||||
"Microsoft.Extensions.DependencyModel": "6.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/netcoreapp3.1/McMaster.NETCore.Plugins.dll": {
|
||||
"assemblyVersion": "1.4.0.0",
|
||||
"fileVersion": "1.4.0.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.CSharp/4.7.0": {},
|
||||
"Microsoft.DotNet.ApiCompat.Task/8.0.203": {},
|
||||
"Microsoft.DotNet.PlatformAbstractions/3.1.6": {
|
||||
"runtime": {
|
||||
"lib/netstandard2.0/Microsoft.DotNet.PlatformAbstractions.dll": {
|
||||
"assemblyVersion": "3.1.6.0",
|
||||
"fileVersion": "3.100.620.31604"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Configuration/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Primitives": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Configuration.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.Abstractions/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Primitives": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Configuration.Abstractions.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.Binder/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Configuration.Binder.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.CommandLine/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Configuration": "8.0.0",
|
||||
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Configuration.CommandLine.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.EnvironmentVariables/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Configuration": "8.0.0",
|
||||
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.FileExtensions/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Configuration": "8.0.0",
|
||||
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.FileProviders.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.FileProviders.Physical": "8.0.0",
|
||||
"Microsoft.Extensions.Primitives": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Configuration.FileExtensions.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.Json/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Configuration": "8.0.0",
|
||||
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Configuration.FileExtensions": "8.0.0",
|
||||
"Microsoft.Extensions.FileProviders.Abstractions": "8.0.0",
|
||||
"System.Text.Json": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Configuration.Json.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.UserSecrets/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Configuration.Json": "8.0.0",
|
||||
"Microsoft.Extensions.FileProviders.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.FileProviders.Physical": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Configuration.UserSecrets.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.0": {
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyModel/6.0.0": {
|
||||
"dependencies": {
|
||||
"System.Buffers": "4.5.1",
|
||||
"System.Memory": "4.5.4",
|
||||
"System.Runtime.CompilerServices.Unsafe": "6.0.0",
|
||||
"System.Text.Encodings.Web": "8.0.0",
|
||||
"System.Text.Json": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/netstandard2.0/Microsoft.Extensions.DependencyModel.dll": {
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.21.52210"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Diagnostics/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Configuration": "8.0.0",
|
||||
"Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Diagnostics.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Diagnostics.Abstractions/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Options": "8.0.0",
|
||||
"System.Diagnostics.DiagnosticSource": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Diagnostics.Abstractions.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.FileProviders.Abstractions/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Primitives": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.FileProviders.Abstractions.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.FileProviders.Physical/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.FileProviders.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.FileSystemGlobbing": "8.0.0",
|
||||
"Microsoft.Extensions.Primitives": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.FileProviders.Physical.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.FileSystemGlobbing/8.0.0": {
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.FileSystemGlobbing.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Hosting/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Configuration": "8.0.0",
|
||||
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Configuration.Binder": "8.0.0",
|
||||
"Microsoft.Extensions.Configuration.CommandLine": "8.0.0",
|
||||
"Microsoft.Extensions.Configuration.EnvironmentVariables": "8.0.0",
|
||||
"Microsoft.Extensions.Configuration.FileExtensions": "8.0.0",
|
||||
"Microsoft.Extensions.Configuration.Json": "8.0.0",
|
||||
"Microsoft.Extensions.Configuration.UserSecrets": "8.0.0",
|
||||
"Microsoft.Extensions.DependencyInjection": "8.0.0",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Diagnostics": "8.0.0",
|
||||
"Microsoft.Extensions.FileProviders.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.FileProviders.Physical": "8.0.0",
|
||||
"Microsoft.Extensions.Hosting.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Logging": "8.0.0",
|
||||
"Microsoft.Extensions.Logging.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Logging.Configuration": "8.0.0",
|
||||
"Microsoft.Extensions.Logging.Console": "8.0.0",
|
||||
"Microsoft.Extensions.Logging.Debug": "8.0.0",
|
||||
"Microsoft.Extensions.Logging.EventLog": "8.0.0",
|
||||
"Microsoft.Extensions.Logging.EventSource": "8.0.0",
|
||||
"Microsoft.Extensions.Options": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Hosting.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Hosting.Abstractions/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.FileProviders.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Logging.Abstractions": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Hosting.Abstractions.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Localization.Abstractions/8.0.3": {
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Localization.Abstractions.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.324.11615"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Logging/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection": "8.0.0",
|
||||
"Microsoft.Extensions.Logging.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Options": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Logging.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Logging.Abstractions/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Logging.Configuration/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Configuration": "8.0.0",
|
||||
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Configuration.Binder": "8.0.0",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Logging": "8.0.0",
|
||||
"Microsoft.Extensions.Logging.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Options": "8.0.0",
|
||||
"Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Logging.Configuration.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Logging.Console/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Logging": "8.0.0",
|
||||
"Microsoft.Extensions.Logging.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Logging.Configuration": "8.0.0",
|
||||
"Microsoft.Extensions.Options": "8.0.0",
|
||||
"System.Text.Json": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Logging.Console.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Logging.Debug/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Logging": "8.0.0",
|
||||
"Microsoft.Extensions.Logging.Abstractions": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Logging.Debug.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Logging.EventLog/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Logging": "8.0.0",
|
||||
"Microsoft.Extensions.Logging.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Options": "8.0.0",
|
||||
"System.Diagnostics.EventLog": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Logging.EventLog.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Logging.EventSource/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Logging": "8.0.0",
|
||||
"Microsoft.Extensions.Logging.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Options": "8.0.0",
|
||||
"Microsoft.Extensions.Primitives": "8.0.0",
|
||||
"System.Text.Json": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Logging.EventSource.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Options/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Primitives": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Options.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Options.ConfigurationExtensions/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Configuration.Binder": "8.0.0",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.Options": "8.0.0",
|
||||
"Microsoft.Extensions.Primitives": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Options.ConfigurationExtensions.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Primitives/8.0.0": {
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Primitives.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Scrutor/4.2.2": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.DependencyModel": "6.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/Scrutor.dll": {
|
||||
"assemblyVersion": "4.0.0.0",
|
||||
"fileVersion": "4.0.0.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Serilog/3.1.1": {
|
||||
"runtime": {
|
||||
"lib/net7.0/Serilog.dll": {
|
||||
"assemblyVersion": "2.0.0.0",
|
||||
"fileVersion": "3.1.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Serilog.Extensions.Logging/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging": "8.0.0",
|
||||
"Serilog": "3.1.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Serilog.Extensions.Logging.dll": {
|
||||
"assemblyVersion": "7.0.0.0",
|
||||
"fileVersion": "8.0.0.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Serilog.Sinks.Console/5.0.0": {
|
||||
"dependencies": {
|
||||
"Serilog": "3.1.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net7.0/Serilog.Sinks.Console.dll": {
|
||||
"assemblyVersion": "5.0.0.0",
|
||||
"fileVersion": "5.0.0.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Serilog.Sinks.File/5.0.0": {
|
||||
"dependencies": {
|
||||
"Serilog": "3.1.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net5.0/Serilog.Sinks.File.dll": {
|
||||
"assemblyVersion": "5.0.0.0",
|
||||
"fileVersion": "5.0.0.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"System.Buffers/4.5.1": {},
|
||||
"System.Data.DataSetExtensions/4.5.0": {},
|
||||
"System.Diagnostics.DiagnosticSource/8.0.0": {},
|
||||
"System.Diagnostics.EventLog/8.0.0": {
|
||||
"runtime": {
|
||||
"lib/net8.0/System.Diagnostics.EventLog.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
},
|
||||
"runtimeTargets": {
|
||||
"runtimes/win/lib/net8.0/System.Diagnostics.EventLog.Messages.dll": {
|
||||
"rid": "win",
|
||||
"assetType": "runtime",
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
},
|
||||
"runtimes/win/lib/net8.0/System.Diagnostics.EventLog.dll": {
|
||||
"rid": "win",
|
||||
"assetType": "runtime",
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"System.Memory/4.5.4": {},
|
||||
"System.Runtime.CompilerServices.Unsafe/6.0.0": {},
|
||||
"System.Text.Encodings.Web/8.0.0": {},
|
||||
"System.Text.Json/8.0.0": {
|
||||
"dependencies": {
|
||||
"System.Text.Encodings.Web": "8.0.0"
|
||||
}
|
||||
},
|
||||
"Tomlyn/0.19.0": {
|
||||
"runtime": {
|
||||
"lib/net8.0/Tomlyn.dll": {
|
||||
"assemblyVersion": "0.19.0.0",
|
||||
"fileVersion": "0.19.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"Cs2SuperPowersPlugin/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
},
|
||||
"CounterStrikeSharp.API/1.0.340": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-d4Sl5+INHZ8l4fptY8IECFKiXd5cSKZyuLNjigZcD5HlY379jq50hSYNsqiG0tzlaCw1WAN0+4HSdS7XyULh3Q==",
|
||||
"path": "counterstrikesharp.api/1.0.340",
|
||||
"hashPath": "counterstrikesharp.api.1.0.340.nupkg.sha512"
|
||||
},
|
||||
"McMaster.NETCore.Plugins/1.4.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-UKw5Z2/QHhkR7kiAJmqdCwVDMQV0lwsfj10+FG676r8DsJWIpxtachtEjE0qBs9WoK5GUQIqxgyFeYUSwuPszg==",
|
||||
"path": "mcmaster.netcore.plugins/1.4.0",
|
||||
"hashPath": "mcmaster.netcore.plugins.1.4.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.CSharp/4.7.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==",
|
||||
"path": "microsoft.csharp/4.7.0",
|
||||
"hashPath": "microsoft.csharp.4.7.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.DotNet.ApiCompat.Task/8.0.203": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-nPEGMojf1mj1oVixe0aiBimSn6xUoZswSjpMPZFMkZ+znYm2GEM5tWGZEWb6OSNIo5gWKyDi1WcI4IL7YiL1Zw==",
|
||||
"path": "microsoft.dotnet.apicompat.task/8.0.203",
|
||||
"hashPath": "microsoft.dotnet.apicompat.task.8.0.203.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.DotNet.PlatformAbstractions/3.1.6": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-jek4XYaQ/PGUwDKKhwR8K47Uh1189PFzMeLqO83mXrXQVIpARZCcfuDedH50YDTepBkfijCZN5U/vZi++erxtg==",
|
||||
"path": "microsoft.dotnet.platformabstractions/3.1.6",
|
||||
"hashPath": "microsoft.dotnet.platformabstractions.3.1.6.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Configuration/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==",
|
||||
"path": "microsoft.extensions.configuration/8.0.0",
|
||||
"hashPath": "microsoft.extensions.configuration.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.Abstractions/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==",
|
||||
"path": "microsoft.extensions.configuration.abstractions/8.0.0",
|
||||
"hashPath": "microsoft.extensions.configuration.abstractions.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.Binder/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-mBMoXLsr5s1y2zOHWmKsE9veDcx8h1x/c3rz4baEdQKTeDcmQAPNbB54Pi/lhFO3K431eEq6PFbMgLaa6PHFfA==",
|
||||
"path": "microsoft.extensions.configuration.binder/8.0.0",
|
||||
"hashPath": "microsoft.extensions.configuration.binder.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.CommandLine/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-NZuZMz3Q8Z780nKX3ifV1fE7lS+6pynDHK71OfU4OZ1ItgvDOhyOC7E6z+JMZrAj63zRpwbdldYFk499t3+1dQ==",
|
||||
"path": "microsoft.extensions.configuration.commandline/8.0.0",
|
||||
"hashPath": "microsoft.extensions.configuration.commandline.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.EnvironmentVariables/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-plvZ0ZIpq+97gdPNNvhwvrEZ92kNml9hd1pe3idMA7svR0PztdzVLkoWLcRFgySYXUJc3kSM3Xw3mNFMo/bxRA==",
|
||||
"path": "microsoft.extensions.configuration.environmentvariables/8.0.0",
|
||||
"hashPath": "microsoft.extensions.configuration.environmentvariables.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.FileExtensions/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-McP+Lz/EKwvtCv48z0YImw+L1gi1gy5rHhNaNIY2CrjloV+XY8gydT8DjMR6zWeL13AFK+DioVpppwAuO1Gi1w==",
|
||||
"path": "microsoft.extensions.configuration.fileextensions/8.0.0",
|
||||
"hashPath": "microsoft.extensions.configuration.fileextensions.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.Json/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-C2wqUoh9OmRL1akaCcKSTmRU8z0kckfImG7zLNI8uyi47Lp+zd5LWAD17waPQEqCz3ioWOCrFUo+JJuoeZLOBw==",
|
||||
"path": "microsoft.extensions.configuration.json/8.0.0",
|
||||
"hashPath": "microsoft.extensions.configuration.json.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.UserSecrets/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-ihDHu2dJYQird9pl2CbdwuNDfvCZdOS0S7SPlNfhPt0B81UTT+yyZKz2pimFZGUp3AfuBRnqUCxB2SjsZKHVUw==",
|
||||
"path": "microsoft.extensions.configuration.usersecrets/8.0.0",
|
||||
"hashPath": "microsoft.extensions.configuration.usersecrets.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==",
|
||||
"path": "microsoft.extensions.dependencyinjection/8.0.0",
|
||||
"hashPath": "microsoft.extensions.dependencyinjection.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==",
|
||||
"path": "microsoft.extensions.dependencyinjection.abstractions/8.0.0",
|
||||
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.DependencyModel/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==",
|
||||
"path": "microsoft.extensions.dependencymodel/6.0.0",
|
||||
"hashPath": "microsoft.extensions.dependencymodel.6.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Diagnostics/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-3PZp/YSkIXrF7QK7PfC1bkyRYwqOHpWFad8Qx+4wkuumAeXo1NHaxpS9LboNA9OvNSAu+QOVlXbMyoY+pHSqcw==",
|
||||
"path": "microsoft.extensions.diagnostics/8.0.0",
|
||||
"hashPath": "microsoft.extensions.diagnostics.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Diagnostics.Abstractions/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==",
|
||||
"path": "microsoft.extensions.diagnostics.abstractions/8.0.0",
|
||||
"hashPath": "microsoft.extensions.diagnostics.abstractions.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.FileProviders.Abstractions/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==",
|
||||
"path": "microsoft.extensions.fileproviders.abstractions/8.0.0",
|
||||
"hashPath": "microsoft.extensions.fileproviders.abstractions.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.FileProviders.Physical/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==",
|
||||
"path": "microsoft.extensions.fileproviders.physical/8.0.0",
|
||||
"hashPath": "microsoft.extensions.fileproviders.physical.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.FileSystemGlobbing/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==",
|
||||
"path": "microsoft.extensions.filesystemglobbing/8.0.0",
|
||||
"hashPath": "microsoft.extensions.filesystemglobbing.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Hosting/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-ItYHpdqVp5/oFLT5QqbopnkKlyFG9EW/9nhM6/yfObeKt6Su0wkBio6AizgRHGNwhJuAtlE5VIjow5JOTrip6w==",
|
||||
"path": "microsoft.extensions.hosting/8.0.0",
|
||||
"hashPath": "microsoft.extensions.hosting.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Hosting.Abstractions/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==",
|
||||
"path": "microsoft.extensions.hosting.abstractions/8.0.0",
|
||||
"hashPath": "microsoft.extensions.hosting.abstractions.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Localization.Abstractions/8.0.3": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-k/kUPm1FQBxcs9/vsM1eF4qIOg2Sovqh/+KUGHur5Mc0Y3OFGuoz9ktBX7LA0gPz53SZhW3W3oaSaMFFcjgM6Q==",
|
||||
"path": "microsoft.extensions.localization.abstractions/8.0.3",
|
||||
"hashPath": "microsoft.extensions.localization.abstractions.8.0.3.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Logging/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==",
|
||||
"path": "microsoft.extensions.logging/8.0.0",
|
||||
"hashPath": "microsoft.extensions.logging.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Logging.Abstractions/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==",
|
||||
"path": "microsoft.extensions.logging.abstractions/8.0.0",
|
||||
"hashPath": "microsoft.extensions.logging.abstractions.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Logging.Configuration/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-ixXXV0G/12g6MXK65TLngYN9V5hQQRuV+fZi882WIoVJT7h5JvoYoxTEwCgdqwLjSneqh1O+66gM8sMr9z/rsQ==",
|
||||
"path": "microsoft.extensions.logging.configuration/8.0.0",
|
||||
"hashPath": "microsoft.extensions.logging.configuration.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Logging.Console/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-e+48o7DztoYog+PY430lPxrM4mm3PbA6qucvQtUDDwVo4MO+ejMw7YGc/o2rnxbxj4isPxdfKFzTxvXMwAz83A==",
|
||||
"path": "microsoft.extensions.logging.console/8.0.0",
|
||||
"hashPath": "microsoft.extensions.logging.console.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Logging.Debug/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-dt0x21qBdudHLW/bjMJpkixv858RRr8eSomgVbU8qljOyfrfDGi1JQvpF9w8S7ziRPtRKisuWaOwFxJM82GxeA==",
|
||||
"path": "microsoft.extensions.logging.debug/8.0.0",
|
||||
"hashPath": "microsoft.extensions.logging.debug.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Logging.EventLog/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-3X9D3sl7EmOu7vQp5MJrmIJBl5XSdOhZPYXUeFfYa6Nnm9+tok8x3t3IVPLhm7UJtPOU61ohFchw8rNm9tIYOQ==",
|
||||
"path": "microsoft.extensions.logging.eventlog/8.0.0",
|
||||
"hashPath": "microsoft.extensions.logging.eventlog.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Logging.EventSource/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-oKcPMrw+luz2DUAKhwFXrmFikZWnyc8l2RKoQwqU3KIZZjcfoJE0zRHAnqATfhRZhtcbjl/QkiY2Xjxp0xu+6w==",
|
||||
"path": "microsoft.extensions.logging.eventsource/8.0.0",
|
||||
"hashPath": "microsoft.extensions.logging.eventsource.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Options/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==",
|
||||
"path": "microsoft.extensions.options/8.0.0",
|
||||
"hashPath": "microsoft.extensions.options.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Options.ConfigurationExtensions/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==",
|
||||
"path": "microsoft.extensions.options.configurationextensions/8.0.0",
|
||||
"hashPath": "microsoft.extensions.options.configurationextensions.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Primitives/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==",
|
||||
"path": "microsoft.extensions.primitives/8.0.0",
|
||||
"hashPath": "microsoft.extensions.primitives.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Scrutor/4.2.2": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-t5VIYA7WJXoJJo7s4DoHakMGwTu+MeEnZumMOhTCH7kz9xWha24G7dJNxWrHPlu0ZdZAS4jDZCxxAnyaBh7uYw==",
|
||||
"path": "scrutor/4.2.2",
|
||||
"hashPath": "scrutor.4.2.2.nupkg.sha512"
|
||||
},
|
||||
"Serilog/3.1.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-P6G4/4Kt9bT635bhuwdXlJ2SCqqn2nhh4gqFqQueCOr9bK/e7W9ll/IoX1Ter948cV2Z/5+5v8pAfJYUISY03A==",
|
||||
"path": "serilog/3.1.1",
|
||||
"hashPath": "serilog.3.1.1.nupkg.sha512"
|
||||
},
|
||||
"Serilog.Extensions.Logging/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-YEAMWu1UnWgf1c1KP85l1SgXGfiVo0Rz6x08pCiPOIBt2Qe18tcZLvdBUuV5o1QHvrs8FAry9wTIhgBRtjIlEg==",
|
||||
"path": "serilog.extensions.logging/8.0.0",
|
||||
"hashPath": "serilog.extensions.logging.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Serilog.Sinks.Console/5.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-IZ6bn79k+3SRXOBpwSOClUHikSkp2toGPCZ0teUkscv4dpDg9E2R2xVsNkLmwddE4OpNVO3N0xiYsAH556vN8Q==",
|
||||
"path": "serilog.sinks.console/5.0.0",
|
||||
"hashPath": "serilog.sinks.console.5.0.0.nupkg.sha512"
|
||||
},
|
||||
"Serilog.Sinks.File/5.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-uwV5hdhWPwUH1szhO8PJpFiahqXmzPzJT/sOijH/kFgUx+cyoDTMM8MHD0adw9+Iem6itoibbUXHYslzXsLEAg==",
|
||||
"path": "serilog.sinks.file/5.0.0",
|
||||
"hashPath": "serilog.sinks.file.5.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.Buffers/4.5.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==",
|
||||
"path": "system.buffers/4.5.1",
|
||||
"hashPath": "system.buffers.4.5.1.nupkg.sha512"
|
||||
},
|
||||
"System.Data.DataSetExtensions/4.5.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-221clPs1445HkTBZPL+K9sDBdJRB8UN8rgjO3ztB0CQ26z//fmJXtlsr6whGatscsKGBrhJl5bwJuKSA8mwFOw==",
|
||||
"path": "system.data.datasetextensions/4.5.0",
|
||||
"hashPath": "system.data.datasetextensions.4.5.0.nupkg.sha512"
|
||||
},
|
||||
"System.Diagnostics.DiagnosticSource/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==",
|
||||
"path": "system.diagnostics.diagnosticsource/8.0.0",
|
||||
"hashPath": "system.diagnostics.diagnosticsource.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.Diagnostics.EventLog/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==",
|
||||
"path": "system.diagnostics.eventlog/8.0.0",
|
||||
"hashPath": "system.diagnostics.eventlog.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.Memory/4.5.4": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==",
|
||||
"path": "system.memory/4.5.4",
|
||||
"hashPath": "system.memory.4.5.4.nupkg.sha512"
|
||||
},
|
||||
"System.Runtime.CompilerServices.Unsafe/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==",
|
||||
"path": "system.runtime.compilerservices.unsafe/6.0.0",
|
||||
"hashPath": "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.Text.Encodings.Web/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==",
|
||||
"path": "system.text.encodings.web/8.0.0",
|
||||
"hashPath": "system.text.encodings.web.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.Text.Json/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==",
|
||||
"path": "system.text.json/8.0.0",
|
||||
"hashPath": "system.text.json.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Tomlyn/0.19.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-GlI2o8R8jbZIaE+YX6uA/VoAOH7zIxYeqxDm7jHW2hqUhuB+q19oKold35FkMuv8IZDoCqsTMolaBv2eBLBmrQ==",
|
||||
"path": "tomlyn/0.19.0",
|
||||
"hashPath": "tomlyn.0.19.0.nupkg.sha512"
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"format": 1,
|
||||
"restore": {
|
||||
"/root/cs2-super-powers/src/Cs2SuperPowers/Cs2SuperPowers.csproj": {}
|
||||
},
|
||||
"projects": {
|
||||
"/root/cs2-super-powers/src/Cs2SuperPowers/Cs2SuperPowers.csproj": {
|
||||
"version": "1.0.0",
|
||||
"restore": {
|
||||
"projectUniqueName": "/root/cs2-super-powers/src/Cs2SuperPowers/Cs2SuperPowers.csproj",
|
||||
"projectName": "Cs2SuperPowersPlugin",
|
||||
"projectPath": "/root/cs2-super-powers/src/Cs2SuperPowers/Cs2SuperPowers.csproj",
|
||||
"packagesPath": "/root/.nuget/packages/",
|
||||
"outputPath": "/root/cs2-super-powers/src/Cs2SuperPowers/obj/",
|
||||
"projectStyle": "PackageReference",
|
||||
"configFilePaths": [
|
||||
"/root/.nuget/NuGet/NuGet.Config"
|
||||
],
|
||||
"originalTargetFrameworks": [
|
||||
"net8.0"
|
||||
],
|
||||
"sources": {
|
||||
"https://api.nuget.org/v3/index.json": {}
|
||||
},
|
||||
"frameworks": {
|
||||
"net8.0": {
|
||||
"targetAlias": "net8.0",
|
||||
"projectReferences": {}
|
||||
}
|
||||
},
|
||||
"warningProperties": {
|
||||
"warnAsError": [
|
||||
"NU1605"
|
||||
]
|
||||
}
|
||||
},
|
||||
"frameworks": {
|
||||
"net8.0": {
|
||||
"targetAlias": "net8.0",
|
||||
"dependencies": {
|
||||
"CounterStrikeSharp.API": {
|
||||
"target": "Package",
|
||||
"version": "[1.0.340, )"
|
||||
}
|
||||
},
|
||||
"imports": [
|
||||
"net461",
|
||||
"net462",
|
||||
"net47",
|
||||
"net471",
|
||||
"net472",
|
||||
"net48",
|
||||
"net481"
|
||||
],
|
||||
"assetTargetFallback": true,
|
||||
"warn": true,
|
||||
"frameworkReferences": {
|
||||
"Microsoft.NETCore.App": {
|
||||
"privateAssets": "all"
|
||||
}
|
||||
},
|
||||
"runtimeIdentifierGraphPath": "/usr/lib/dotnet/sdk/8.0.129/PortableRuntimeIdentifierGraph.json"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
||||
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
||||
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
||||
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/root/.nuget/packages/</NuGetPackageRoot>
|
||||
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/root/.nuget/packages/</NuGetPackageFolders>
|
||||
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
||||
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.8.2</NuGetToolVersion>
|
||||
</PropertyGroup>
|
||||
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<SourceRoot Include="/root/.nuget/packages/" />
|
||||
</ItemGroup>
|
||||
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.extensions.configuration.usersecrets/8.0.0/buildTransitive/net6.0/Microsoft.Extensions.Configuration.UserSecrets.props" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.configuration.usersecrets/8.0.0/buildTransitive/net6.0/Microsoft.Extensions.Configuration.UserSecrets.props')" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<PkgMicrosoft_DotNet_ApiCompat_Task Condition=" '$(PkgMicrosoft_DotNet_ApiCompat_Task)' == '' ">/root/.nuget/packages/microsoft.dotnet.apicompat.task/8.0.203</PkgMicrosoft_DotNet_ApiCompat_Task>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<Import Project="$(NuGetPackageRoot)system.text.json/8.0.0/buildTransitive/net6.0/System.Text.Json.targets" Condition="Exists('$(NuGetPackageRoot)system.text.json/8.0.0/buildTransitive/net6.0/System.Text.Json.targets')" />
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.extensions.options/8.0.0/buildTransitive/net6.0/Microsoft.Extensions.Options.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.options/8.0.0/buildTransitive/net6.0/Microsoft.Extensions.Options.targets')" />
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.extensions.logging.abstractions/8.0.0/buildTransitive/net6.0/Microsoft.Extensions.Logging.Abstractions.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.logging.abstractions/8.0.0/buildTransitive/net6.0/Microsoft.Extensions.Logging.Abstractions.targets')" />
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.extensions.configuration.binder/8.0.0/buildTransitive/netstandard2.0/Microsoft.Extensions.Configuration.Binder.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.configuration.binder/8.0.0/buildTransitive/netstandard2.0/Microsoft.Extensions.Configuration.Binder.targets')" />
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.extensions.configuration.usersecrets/8.0.0/buildTransitive/net6.0/Microsoft.Extensions.Configuration.UserSecrets.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.configuration.usersecrets/8.0.0/buildTransitive/net6.0/Microsoft.Extensions.Configuration.UserSecrets.targets')" />
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,4 @@
|
||||
// <autogenerated />
|
||||
using System;
|
||||
using System.Reflection;
|
||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]
|
||||
@@ -0,0 +1,22 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: System.Reflection.AssemblyCompanyAttribute("Cs2SuperPowersPlugin")]
|
||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+6b9188af13e48a65cfefd8729e5e5469a0b35c1e")]
|
||||
[assembly: System.Reflection.AssemblyProductAttribute("Cs2SuperPowersPlugin")]
|
||||
[assembly: System.Reflection.AssemblyTitleAttribute("Cs2SuperPowersPlugin")]
|
||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||
|
||||
// Generated by the MSBuild WriteCodeFragment class.
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
fc9824fdd39076879a9102cc1b172ceb7340b30cd70e3dd0cdc1e76853ff07aa
|
||||
@@ -0,0 +1,13 @@
|
||||
is_global = true
|
||||
build_property.TargetFramework = net8.0
|
||||
build_property.TargetPlatformMinVersion =
|
||||
build_property.UsingMicrosoftNETSdkWeb =
|
||||
build_property.ProjectTypeGuids =
|
||||
build_property.InvariantGlobalization =
|
||||
build_property.PlatformNeutralAssembly =
|
||||
build_property.EnforceExtendedAnalyzerRules =
|
||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||
build_property.RootNamespace = Cs2SuperPowers
|
||||
build_property.ProjectDir = /root/cs2-super-powers/src/Cs2SuperPowers/
|
||||
build_property.EnableComHosting =
|
||||
build_property.EnableGeneratedComInterfaceComImportInterop =
|
||||
@@ -0,0 +1,8 @@
|
||||
// <auto-generated/>
|
||||
global using global::System;
|
||||
global using global::System.Collections.Generic;
|
||||
global using global::System.IO;
|
||||
global using global::System.Linq;
|
||||
global using global::System.Net.Http;
|
||||
global using global::System.Threading;
|
||||
global using global::System.Threading.Tasks;
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
||||
5eefefd3a6dc2eb1c4e2012b99d9fde56476ddbf4a1872eb47da73d9bc38b56a
|
||||
@@ -0,0 +1,13 @@
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/bin/Debug/net8.0/Cs2SuperPowersPlugin.deps.json
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/bin/Debug/net8.0/Cs2SuperPowersPlugin.dll
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/bin/Debug/net8.0/Cs2SuperPowersPlugin.pdb
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/obj/Debug/net8.0/Cs2SuperPowers.csproj.AssemblyReference.cache
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/obj/Debug/net8.0/Cs2SuperPowers.GeneratedMSBuildEditorConfig.editorconfig
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/obj/Debug/net8.0/Cs2SuperPowers.AssemblyInfoInputs.cache
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/obj/Debug/net8.0/Cs2SuperPowers.AssemblyInfo.cs
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/obj/Debug/net8.0/Cs2SuperPowers.csproj.CoreCompileInputs.cache
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/obj/Debug/net8.0/Cs2SuperPowers.sourcelink.json
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/obj/Debug/net8.0/Cs2SuperPowersPlugin.dll
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/obj/Debug/net8.0/refint/Cs2SuperPowersPlugin.dll
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/obj/Debug/net8.0/Cs2SuperPowersPlugin.pdb
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/obj/Debug/net8.0/ref/Cs2SuperPowersPlugin.dll
|
||||
@@ -0,0 +1 @@
|
||||
{"documents":{"/root/cs2-super-powers/*":"https://raw.githubusercontent.com/daniel-Jones/cs2-super-powers/6b9188af13e48a65cfefd8729e5e5469a0b35c1e/*"}}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,4 @@
|
||||
// <autogenerated />
|
||||
using System;
|
||||
using System.Reflection;
|
||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]
|
||||
@@ -0,0 +1,22 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: System.Reflection.AssemblyCompanyAttribute("Cs2SuperPowersPlugin")]
|
||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+6b9188af13e48a65cfefd8729e5e5469a0b35c1e")]
|
||||
[assembly: System.Reflection.AssemblyProductAttribute("Cs2SuperPowersPlugin")]
|
||||
[assembly: System.Reflection.AssemblyTitleAttribute("Cs2SuperPowersPlugin")]
|
||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||
|
||||
// Generated by the MSBuild WriteCodeFragment class.
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
fc9824fdd39076879a9102cc1b172ceb7340b30cd70e3dd0cdc1e76853ff07aa
|
||||
@@ -0,0 +1,13 @@
|
||||
is_global = true
|
||||
build_property.TargetFramework = net8.0
|
||||
build_property.TargetPlatformMinVersion =
|
||||
build_property.UsingMicrosoftNETSdkWeb =
|
||||
build_property.ProjectTypeGuids =
|
||||
build_property.InvariantGlobalization =
|
||||
build_property.PlatformNeutralAssembly =
|
||||
build_property.EnforceExtendedAnalyzerRules =
|
||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||
build_property.RootNamespace = Cs2SuperPowers
|
||||
build_property.ProjectDir = /root/cs2-super-powers/src/Cs2SuperPowers/
|
||||
build_property.EnableComHosting =
|
||||
build_property.EnableGeneratedComInterfaceComImportInterop =
|
||||
@@ -0,0 +1,8 @@
|
||||
// <auto-generated/>
|
||||
global using global::System;
|
||||
global using global::System.Collections.Generic;
|
||||
global using global::System.IO;
|
||||
global using global::System.Linq;
|
||||
global using global::System.Net.Http;
|
||||
global using global::System.Threading;
|
||||
global using global::System.Threading.Tasks;
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
||||
62926f76f909b1bea4bedcdd9f0707f28f15895e174e05e2e35caa7566aa82f1
|
||||
@@ -0,0 +1,13 @@
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/obj/linux/Debug/net8.0/Cs2SuperPowers.csproj.AssemblyReference.cache
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/obj/linux/Debug/net8.0/Cs2SuperPowers.GeneratedMSBuildEditorConfig.editorconfig
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/obj/linux/Debug/net8.0/Cs2SuperPowers.AssemblyInfoInputs.cache
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/obj/linux/Debug/net8.0/Cs2SuperPowers.AssemblyInfo.cs
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/obj/linux/Debug/net8.0/Cs2SuperPowers.csproj.CoreCompileInputs.cache
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/obj/linux/Debug/net8.0/Cs2SuperPowers.sourcelink.json
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/bin/linux/Debug/net8.0/Cs2SuperPowersPlugin.deps.json
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/bin/linux/Debug/net8.0/Cs2SuperPowersPlugin.dll
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/bin/linux/Debug/net8.0/Cs2SuperPowersPlugin.pdb
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/obj/linux/Debug/net8.0/Cs2SuperPowersPlugin.dll
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/obj/linux/Debug/net8.0/refint/Cs2SuperPowersPlugin.dll
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/obj/linux/Debug/net8.0/Cs2SuperPowersPlugin.pdb
|
||||
/root/cs2-super-powers/src/Cs2SuperPowers/obj/linux/Debug/net8.0/ref/Cs2SuperPowersPlugin.dll
|
||||
@@ -0,0 +1 @@
|
||||
{"documents":{"/root/cs2-super-powers/*":"https://raw.githubusercontent.com/daniel-Jones/cs2-super-powers/6b9188af13e48a65cfefd8729e5e5469a0b35c1e/*"}}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"version": 2,
|
||||
"dgSpecHash": "1KtfxQ9lBL5TWB2RIU02GzpC6CvxvF3J6VAPEJSeMxUm6URxUqqCEht3e11SKXOPO8Yyn73BP4NWeIyQhjkZbQ==",
|
||||
"success": true,
|
||||
"projectFilePath": "/root/cs2-super-powers/src/Cs2SuperPowers/Cs2SuperPowers.csproj",
|
||||
"expectedPackageFiles": [
|
||||
"/root/.nuget/packages/counterstrikesharp.api/1.0.340/counterstrikesharp.api.1.0.340.nupkg.sha512",
|
||||
"/root/.nuget/packages/mcmaster.netcore.plugins/1.4.0/mcmaster.netcore.plugins.1.4.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.csharp/4.7.0/microsoft.csharp.4.7.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.dotnet.apicompat.task/8.0.203/microsoft.dotnet.apicompat.task.8.0.203.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.dotnet.platformabstractions/3.1.6/microsoft.dotnet.platformabstractions.3.1.6.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.configuration/8.0.0/microsoft.extensions.configuration.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.configuration.abstractions/8.0.0/microsoft.extensions.configuration.abstractions.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.configuration.binder/8.0.0/microsoft.extensions.configuration.binder.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.configuration.commandline/8.0.0/microsoft.extensions.configuration.commandline.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.configuration.environmentvariables/8.0.0/microsoft.extensions.configuration.environmentvariables.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.configuration.fileextensions/8.0.0/microsoft.extensions.configuration.fileextensions.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.configuration.json/8.0.0/microsoft.extensions.configuration.json.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.configuration.usersecrets/8.0.0/microsoft.extensions.configuration.usersecrets.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.dependencyinjection/8.0.0/microsoft.extensions.dependencyinjection.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.dependencyinjection.abstractions/8.0.0/microsoft.extensions.dependencyinjection.abstractions.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.dependencymodel/6.0.0/microsoft.extensions.dependencymodel.6.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.diagnostics/8.0.0/microsoft.extensions.diagnostics.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.diagnostics.abstractions/8.0.0/microsoft.extensions.diagnostics.abstractions.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.fileproviders.abstractions/8.0.0/microsoft.extensions.fileproviders.abstractions.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.fileproviders.physical/8.0.0/microsoft.extensions.fileproviders.physical.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.filesystemglobbing/8.0.0/microsoft.extensions.filesystemglobbing.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.hosting/8.0.0/microsoft.extensions.hosting.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.hosting.abstractions/8.0.0/microsoft.extensions.hosting.abstractions.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.localization.abstractions/8.0.3/microsoft.extensions.localization.abstractions.8.0.3.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.logging/8.0.0/microsoft.extensions.logging.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.logging.abstractions/8.0.0/microsoft.extensions.logging.abstractions.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.logging.configuration/8.0.0/microsoft.extensions.logging.configuration.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.logging.console/8.0.0/microsoft.extensions.logging.console.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.logging.debug/8.0.0/microsoft.extensions.logging.debug.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.logging.eventlog/8.0.0/microsoft.extensions.logging.eventlog.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.logging.eventsource/8.0.0/microsoft.extensions.logging.eventsource.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.options/8.0.0/microsoft.extensions.options.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.options.configurationextensions/8.0.0/microsoft.extensions.options.configurationextensions.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.primitives/8.0.0/microsoft.extensions.primitives.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/scrutor/4.2.2/scrutor.4.2.2.nupkg.sha512",
|
||||
"/root/.nuget/packages/serilog/3.1.1/serilog.3.1.1.nupkg.sha512",
|
||||
"/root/.nuget/packages/serilog.extensions.logging/8.0.0/serilog.extensions.logging.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/serilog.sinks.console/5.0.0/serilog.sinks.console.5.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/serilog.sinks.file/5.0.0/serilog.sinks.file.5.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/system.buffers/4.5.1/system.buffers.4.5.1.nupkg.sha512",
|
||||
"/root/.nuget/packages/system.data.datasetextensions/4.5.0/system.data.datasetextensions.4.5.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/system.diagnostics.diagnosticsource/8.0.0/system.diagnostics.diagnosticsource.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/system.diagnostics.eventlog/8.0.0/system.diagnostics.eventlog.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/system.memory/4.5.4/system.memory.4.5.4.nupkg.sha512",
|
||||
"/root/.nuget/packages/system.runtime.compilerservices.unsafe/6.0.0/system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/system.text.encodings.web/8.0.0/system.text.encodings.web.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/system.text.json/8.0.0/system.text.json.8.0.0.nupkg.sha512",
|
||||
"/root/.nuget/packages/tomlyn/0.19.0/tomlyn.0.19.0.nupkg.sha512"
|
||||
],
|
||||
"logs": []
|
||||
}
|
||||
Reference in New Issue
Block a user