QoE Update
## Added - **`CurseSkillPerPlayer`** (config.json) — limits how many curse skills (Darkness, JumpBan, PrimaryBan, Bankrupt and 14 others) can be stacked on a single player per round. `null` = unlimited (default), `1` = one curse per player, `2` = two. When the limit is reached the target is rejected and the curser gets a chat warning. Enforced centrally in `SkillAction`, so no per-skill code is needed. - **Tripwire cooldown mode** — replaces the fixed wire limit with a Replicator-style cooldown. Players can place as many wires as they want as long as the cooldown is up; remaining time is shown on the HUD. Configurable via `Cooldown` in skillsInfo.json (default 20s). - **Tripwire team colors** — T wires red (255, 64, 64), CT wires blue (64, 128, 255). ## Fixed - **ExpensiveAmmo** also charged money for knife swings and grenade throws. It now only charges when a bullet-firing weapon is fired. - **Knockback** also triggered on grenade throws; bound to the same allowlist. ## Removed - Dead code: `Earthquake.cs` and `HealingChicken.cs` (neither was registered in the `Skills` enum, so neither ever ran), `EntityManager.CreateTrackedEnvShake`, `EntityManager.CreateTrackedChicken`, `PlayerManager.UpdatePlayerSkill`. ## Changed - **Tripwire wires are now removed when the owner dies or loses the skill.** Previously they stayed on the map until the end of the round. - `PlayerEvents.cs` split into three partial files: player events in `PlayerEvents.cs`, round and skill dispatch in `RoundEvents.cs`, entity and weapon hooks in `EntityEvents.cs`. Behaviour is unchanged; all members stay in the same `Event` class. - 28 copy-pasted enemy-gathering LINQ chains reduced to the shared helper (Bankrupt, CarefulBullets, Darkness, Deactivator, Deaf, ExpensiveAmmo, Giant, Glitch, Jammer, JumpBan, JumpCurse, LifeSwap, Magnifier, MoneySwap, Nightmare, Poison, PrimaryBan, WildThrow).
This commit is contained in:
parent
98f6e65b01
commit
b0b50a224f
50 changed files with 1215 additions and 1279 deletions
|
|
@ -36,7 +36,7 @@ namespace src.player.skills
|
|||
if (playerInfo == null || playerInfo.Skill != skillName) continue;
|
||||
if (!SkillUtils.HasMenu(player)) continue;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
ConcurrentBag<(string, string)> menuItems = [];
|
||||
|
||||
foreach (var e in enemies)
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ namespace src.player.skills
|
|||
if (playerInfo == null || playerInfo.Skill != skillName) continue;
|
||||
if (!SkillUtils.HasMenu(player)) continue;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
|
||||
ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))];
|
||||
SkillUtils.UpdateMenu(player, menuItems);
|
||||
|
|
@ -110,7 +110,7 @@ namespace src.player.skills
|
|||
var playerEvent = PlayerManager.GetPlayerFromEvent(player);
|
||||
if (playerEvent == null || !playerEvent.IsValid) return;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
if (enemies.Length > 0)
|
||||
{
|
||||
ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))];
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ namespace src.player.skills
|
|||
if (playerInfo == null || playerInfo.Skill != skillName) continue;
|
||||
if (!SkillUtils.HasMenu(player)) continue;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
|
||||
ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))];
|
||||
SkillUtils.UpdateMenu(player, menuItems);
|
||||
|
|
@ -130,7 +130,7 @@ namespace src.player.skills
|
|||
var playerEvent = PlayerManager.GetPlayerFromEvent(player);
|
||||
if (playerEvent == null || !playerEvent.IsValid) return;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
if (enemies.Length > 0)
|
||||
{
|
||||
ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))];
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ namespace src.player.skills
|
|||
if (playerInfo == null || playerInfo.Skill != skillName) continue;
|
||||
if (!SkillUtils.HasMenu(player)) continue;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
|
||||
ConcurrentBag<(string, string)> menuItems = [];
|
||||
foreach (var enemy in enemies)
|
||||
|
|
@ -85,7 +85,7 @@ namespace src.player.skills
|
|||
var playerEvent = PlayerManager.GetPlayerFromEvent(player);
|
||||
if (playerEvent == null || !playerEvent.IsValid) return;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
if (enemies.Length > 0)
|
||||
{
|
||||
ConcurrentBag<(string, string)> menuItems = [];
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ namespace src.player.skills
|
|||
if (playerInfo == null || playerInfo.Skill != skillName) continue;
|
||||
if (!SkillUtils.HasMenu(player)) continue;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
|
||||
ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))];
|
||||
SkillUtils.UpdateMenu(player, menuItems);
|
||||
|
|
@ -122,7 +122,7 @@ namespace src.player.skills
|
|||
var playerEvent = PlayerManager.GetPlayerFromEvent(player);
|
||||
if (playerEvent == null || !playerEvent.IsValid) return;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
if (enemies.Length > 0)
|
||||
{
|
||||
ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString())));
|
||||
|
|
|
|||
|
|
@ -1,141 +0,0 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using static src.jRandomSkills;
|
||||
using System.Collections.Concurrent;
|
||||
using src.utils;
|
||||
|
||||
namespace src.player.skills
|
||||
{
|
||||
public class Earthquake : ISkill
|
||||
{
|
||||
//private const Skills skillName = Skills.Earthquake;
|
||||
//private static readonly ConcurrentDictionary<uint, PlayerSkillInfo> SkillPlayerInfo = [];
|
||||
//private static readonly object setLock = new();
|
||||
|
||||
//public static void LoadSkill()
|
||||
//{
|
||||
// SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
|
||||
//}
|
||||
|
||||
//public static void NewRound()
|
||||
//{
|
||||
// lock (setLock)
|
||||
// SkillPlayerInfo.Clear();
|
||||
//}
|
||||
|
||||
//public static void EnableSkill(CCSPlayerController player)
|
||||
//{
|
||||
// SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo
|
||||
// {
|
||||
// SteamID = player.Index,
|
||||
// CanUse = true,
|
||||
// Cooldown = DateTime.MinValue,
|
||||
// });
|
||||
//}
|
||||
|
||||
//public static void DisableSkill(CCSPlayerController player)
|
||||
//{
|
||||
// SkillPlayerInfo.TryRemove(player.Index, out _);
|
||||
// SkillUtils.ResetPrintHTML(player);
|
||||
//}
|
||||
|
||||
//public static void PlayerDeath(EventPlayerDeath @event)
|
||||
//{
|
||||
// var player = PlayerManager.GetPlayerEvent(@event.Userid);
|
||||
// if (player == null || !player.IsValid) return;
|
||||
// var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index);
|
||||
// if (playerInfo?.Skill == skillName)
|
||||
// SkillPlayerInfo.TryRemove(player.Index, out _);
|
||||
//}
|
||||
|
||||
//public static void OnTick()
|
||||
//{
|
||||
// foreach (var player in PlayerManager.GetTickPlayers())
|
||||
// {
|
||||
// var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index);
|
||||
// if (playerInfo?.Skill == skillName)
|
||||
// if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo))
|
||||
// UpdateHUD(player, skillInfo);
|
||||
// }
|
||||
//}
|
||||
|
||||
//private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo)
|
||||
//{
|
||||
// float cooldown = 0;
|
||||
// if (skillInfo != null)
|
||||
// {
|
||||
// float time = (int)Math.Ceiling((skillInfo.Cooldown.AddSeconds(SkillsInfo.GetValue<float>(skillName, "cooldown")) - DateTime.Now).TotalSeconds);
|
||||
// cooldown = Math.Max(time, 0);
|
||||
|
||||
// if (cooldown == 0 && skillInfo?.CanUse == false)
|
||||
// skillInfo.CanUse = true;
|
||||
// }
|
||||
|
||||
// if (cooldown == 0)
|
||||
// return;
|
||||
|
||||
// var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index);
|
||||
// if (playerInfo == null) return;
|
||||
|
||||
// string remainingLine = $"{player.GetTranslation("hud_info", $"<font color='#FF0000'>{cooldown}</font>")}";
|
||||
//}
|
||||
|
||||
//public static void UseSkill(CCSPlayerController player)
|
||||
//{
|
||||
// var playerPawn = player.PlayerPawn.Value;
|
||||
// if (playerPawn?.CBodyComponent == null) return;
|
||||
|
||||
// if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo))
|
||||
// {
|
||||
// if (!player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return;
|
||||
// if (skillInfo.CanUse)
|
||||
// {
|
||||
// skillInfo.CanUse = false;
|
||||
// skillInfo.Cooldown = DateTime.Now;
|
||||
// MakeShake(player);
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
//private static void MakeShake(CCSPlayerController player)
|
||||
//{
|
||||
// foreach (var enemy in PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid && p.PawnIsAlive))
|
||||
// CreateShake(player);
|
||||
//}
|
||||
|
||||
//private static void CreateShake(CCSPlayerController player)
|
||||
//{
|
||||
// var pawn = player.PlayerPawn.Value;
|
||||
// if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return;
|
||||
|
||||
// var shake = EntityManager.CreateTrackedEnvShake(player.Index);
|
||||
// if (shake == null || !shake.IsValid) return;
|
||||
|
||||
// shake.Amplitude = SkillsInfo.GetValue<float>(skillName, "amplitude");
|
||||
// shake.Frequency = SkillsInfo.GetValue<float>(skillName, "frequency");
|
||||
// shake.Duration = SkillsInfo.GetValue<float>(skillName, "duration");
|
||||
// shake.Radius = SkillsInfo.GetValue<float>(skillName, "radius");
|
||||
|
||||
// shake.Teleport(new Vector(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z));
|
||||
// shake.AcceptInput("SetParent", pawn, pawn, "!activator");
|
||||
// shake.AcceptInput("StartShake");
|
||||
//}
|
||||
|
||||
//public class PlayerSkillInfo
|
||||
//{
|
||||
// public ulong SteamID { get; set; }
|
||||
// public bool CanUse { get; set; }
|
||||
// public DateTime Cooldown { get; set; }
|
||||
//}
|
||||
|
||||
//public class SkillConfig(Skills skill = skillName, bool active = false, string color = "#42f59b", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Common, float cooldown = 16f, float amplitude = 15f, float frequency = 500f, float duration = 8f, float radius = 50f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
|
||||
//{
|
||||
// public float Cooldown { get; set; } = cooldown;
|
||||
// public float Amplitude { get; set; } = amplitude;
|
||||
// public float Frequency { get; set; } = frequency;
|
||||
// public float Duration { get; set; } = duration;
|
||||
// public float Radius { get; set; } = radius;
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
|
@ -41,6 +41,7 @@ namespace src.player.skills
|
|||
var player = PlayerManager.GetPlayerEvent(@event.Userid);
|
||||
if (player == null || !player.IsValid) return;
|
||||
if (!cursedPlayers.ContainsKey(player.Index)) return;
|
||||
if (!SkillUtils.FiresBullets(@event.Weapon)) return;
|
||||
|
||||
var moneyServices = player.InGameMoneyServices;
|
||||
if (moneyServices == null) return;
|
||||
|
|
@ -61,7 +62,7 @@ namespace src.player.skills
|
|||
if (playerInfo == null || playerInfo.Skill != skillName) continue;
|
||||
if (!SkillUtils.HasMenu(player)) continue;
|
||||
|
||||
var enemies = GetSelectableEnemies(player);
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
|
||||
ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))];
|
||||
SkillUtils.UpdateMenu(player, menuItems);
|
||||
|
|
@ -119,7 +120,7 @@ namespace src.player.skills
|
|||
var playerEvent = PlayerManager.GetPlayerFromEvent(player);
|
||||
if (playerEvent == null || !playerEvent.IsValid) return;
|
||||
|
||||
var enemies = GetSelectableEnemies(player);
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
if (enemies.Length > 0)
|
||||
{
|
||||
ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))];
|
||||
|
|
@ -154,15 +155,6 @@ namespace src.player.skills
|
|||
SkillUtils.CloseMenu(player);
|
||||
}
|
||||
|
||||
private static CCSPlayerController[] GetSelectableEnemies(CCSPlayerController player)
|
||||
{
|
||||
return [.. PlayerManager.GetTickPlayers()
|
||||
.Where(p => p != null && p.IsValid)
|
||||
.Select(PlayerManager.GetPlayerEvent)
|
||||
.Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None)
|
||||
.Cast<CCSPlayerController>()];
|
||||
}
|
||||
|
||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#e0c341", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Common, int moneyPerShot = 50) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
|
||||
{
|
||||
public int MoneyPerShot { get; set; } = moneyPerShot;
|
||||
|
|
|
|||
|
|
@ -175,14 +175,8 @@ namespace src.player.skills
|
|||
|
||||
private static CCSPlayerController[] GetSelectableEnemies(CCSPlayerController player)
|
||||
{
|
||||
return [.. PlayerManager.GetTickPlayers()
|
||||
.Where(p => p != null && p.IsValid)
|
||||
.Select(PlayerManager.GetPlayerEvent)
|
||||
.Where(p => p != null && p.IsValid && p.Team != player.Team && !p.IsHLTV
|
||||
&& p.Team != CsTeam.Spectator && p.Team != CsTeam.None
|
||||
&& p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0
|
||||
&& PlayerManager.GetPlayerByIndex(p.Index)?.Skill != Skills.Chicken)
|
||||
.Cast<CCSPlayerController>()];
|
||||
return [.. SkillUtils.GetSelectableEnemies(player, true)
|
||||
.Where(p => PlayerManager.GetPlayerByIndex(p.Index)?.Skill != Skills.Chicken)];
|
||||
}
|
||||
|
||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#8ad3ff", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Common, float minScale = 1.1f, float maxScale = 1.4f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ namespace src.player.skills
|
|||
if (playerInfo == null || playerInfo.Skill != skillName) continue;
|
||||
if (!SkillUtils.HasMenu(player)) continue;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
|
||||
ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString())));
|
||||
SkillUtils.UpdateMenu(player, menuItems);
|
||||
|
|
@ -129,7 +129,7 @@ namespace src.player.skills
|
|||
var playerEvent = PlayerManager.GetPlayerFromEvent(player);
|
||||
if (playerEvent == null || !playerEvent.IsValid) return;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
if (enemies.Length > 0)
|
||||
{
|
||||
ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString())));
|
||||
|
|
|
|||
|
|
@ -1,82 +0,0 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Timers;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using src.utils;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Drawing;
|
||||
using static src.jRandomSkills;
|
||||
using Timer = CounterStrikeSharp.API.Modules.Timers.Timer;
|
||||
|
||||
namespace src.player.skills
|
||||
{
|
||||
public class HealingChicken : ISkill
|
||||
{
|
||||
//private const Skills skillName = Skills.HealingChicken;
|
||||
//private readonly static ConcurrentDictionary<uint, List<Timer>> playerSmokes = [];
|
||||
//private static readonly object setLock = new();
|
||||
|
||||
//public static void LoadSkill()
|
||||
//{
|
||||
// SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
|
||||
//}
|
||||
|
||||
//public static void NewRound()
|
||||
//{
|
||||
|
||||
//}
|
||||
|
||||
//public static void EnableSkill(CCSPlayerController player)
|
||||
//{
|
||||
// SpawnChicken(player);
|
||||
//}
|
||||
|
||||
//public static void DisableSkill(CCSPlayerController player)
|
||||
//{
|
||||
|
||||
//}
|
||||
|
||||
//private static void SpawnChicken(CCSPlayerController player)
|
||||
//{
|
||||
// if (player == null || !player.IsValid) return;
|
||||
|
||||
// var pawn = player.PlayerPawn.Value;
|
||||
// if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return;
|
||||
|
||||
// int amount = SkillsInfo.GetValue<int>(skillName, "amount");
|
||||
// for (int i = 0; i < 1; i++)
|
||||
// {
|
||||
// CChicken? chicken = EntityManager.CreateTrackedChicken(player.Index);
|
||||
// if (chicken == null || !chicken.IsValid) continue;
|
||||
|
||||
// chicken.Render = Color.Green;
|
||||
// Vector offset = new (
|
||||
// (float)(100 * Math.Cos(2 * Math.PI * i / amount)),
|
||||
// (float)(100 * Math.Sin(2 * Math.PI * i / amount)),
|
||||
// 0
|
||||
// );
|
||||
|
||||
// chicken.Teleport(pawn.AbsOrigin + offset);
|
||||
|
||||
// // Schema.SetSchemaValue(chicken.Handle, "CChicken", "m_leader", player.PlayerPawn.Raw);
|
||||
// Vector? spawn = SkillUtils.GetSpawnPointVector(player);
|
||||
// Schema.SetSchemaValue(chicken.Handle, "CChicken", "m_vecPathGoal", spawn);
|
||||
|
||||
// Instance.AddTickTimer(1, () =>
|
||||
// {
|
||||
// if (chicken == null || !chicken.IsValid) return;
|
||||
|
||||
// Server.PrintToChatAll($"{chicken.PathGoal}, {chicken.UpdateTimer.Duration}, {chicken.UpdateTimer.Timescale}");
|
||||
// }, TimerFlags.REPEAT | TimerFlags.STOP_ON_MAPCHANGE);
|
||||
// }
|
||||
//}
|
||||
|
||||
//public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#b5ab8f", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Common, int amount = 3, int heal = 2, int tickCooldown = 16) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
|
||||
//{
|
||||
// public int Amount { get; set; } = amount;
|
||||
// public int Heal { get; set; } = heal;
|
||||
// public int TickCooldown { get; set; } = tickCooldown;
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
|
@ -64,7 +64,7 @@ namespace src.player.skills
|
|||
if (playerInfo == null || playerInfo.Skill != skillName) continue;
|
||||
if (!SkillUtils.HasMenu(player)) continue;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
|
||||
ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString())));
|
||||
SkillUtils.UpdateMenu(player, menuItems);
|
||||
|
|
@ -151,7 +151,7 @@ namespace src.player.skills
|
|||
var playerEvent = PlayerManager.GetPlayerFromEvent(player);
|
||||
if (playerEvent == null || !playerEvent.IsValid) return;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
if (enemies.Length > 0)
|
||||
{
|
||||
ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString())));
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ namespace src.player.skills
|
|||
if (playerInfo == null || playerInfo.Skill != skillName) continue;
|
||||
if (!SkillUtils.HasMenu(player)) continue;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
|
||||
ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))];
|
||||
SkillUtils.UpdateMenu(player, menuItems);
|
||||
|
|
@ -127,7 +127,7 @@ namespace src.player.skills
|
|||
var playerEvent = PlayerManager.GetPlayerFromEvent(player);
|
||||
if (playerEvent == null || !playerEvent.IsValid) return;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
if (enemies.Length > 0)
|
||||
{
|
||||
ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString())));
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@ namespace src.player.skills
|
|||
if (playerInfo == null || playerInfo.Skill != skillName) continue;
|
||||
if (!SkillUtils.HasMenu(player)) continue;
|
||||
|
||||
var enemies = GetSelectableEnemies(player);
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
|
||||
ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))];
|
||||
SkillUtils.UpdateMenu(player, menuItems);
|
||||
|
|
@ -134,7 +134,7 @@ namespace src.player.skills
|
|||
var playerEvent = PlayerManager.GetPlayerFromEvent(player);
|
||||
if (playerEvent == null || !playerEvent.IsValid) return;
|
||||
|
||||
var enemies = GetSelectableEnemies(player);
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
if (enemies.Length > 0)
|
||||
{
|
||||
ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))];
|
||||
|
|
@ -169,15 +169,6 @@ namespace src.player.skills
|
|||
SkillUtils.CloseMenu(player);
|
||||
}
|
||||
|
||||
private static CCSPlayerController[] GetSelectableEnemies(CCSPlayerController player)
|
||||
{
|
||||
return [.. PlayerManager.GetTickPlayers()
|
||||
.Where(p => p != null && p.IsValid)
|
||||
.Select(PlayerManager.GetPlayerEvent)
|
||||
.Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None)
|
||||
.Cast<CCSPlayerController>()];
|
||||
}
|
||||
|
||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#7ad1c4", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Common, float jumpVelocity = 301f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
|
||||
{
|
||||
public float JumpVelocity { get; set; } = jumpVelocity;
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ namespace src.player.skills
|
|||
|
||||
var playerInfo = PlayerManager.GetPlayerByIndex(player.Index);
|
||||
if (playerInfo?.Skill != skillName) return;
|
||||
if (!SkillUtils.FiresBullets(@event.Weapon)) return;
|
||||
|
||||
var pawn = player.PlayerPawn?.Value;
|
||||
if (pawn == null || !pawn.IsValid || pawn.Health <= 0) return;
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ namespace src.player.skills
|
|||
if (playerInfo == null || playerInfo.Skill != skillName) continue;
|
||||
if (!SkillUtils.HasMenu(player)) continue;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
|
||||
ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => ($"\u202A{e.PlayerName}\u202C : {e?.PlayerPawn?.Value?.Health ?? 0} HP", e.Index.ToString())));
|
||||
SkillUtils.UpdateMenu(player, menuItems);
|
||||
|
|
@ -86,7 +86,7 @@ namespace src.player.skills
|
|||
if (playerInfo == null) return;
|
||||
playerInfo.SkillUsed = false;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
if (enemies.Length > 0)
|
||||
{
|
||||
ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => ($"\u202A{e.PlayerName}\u202C : {e.PawnHealth} HP", e.Index.ToString())));
|
||||
|
|
|
|||
|
|
@ -128,7 +128,7 @@ namespace src.player.skills
|
|||
var playerEvent = PlayerManager.GetPlayerFromEvent(player);
|
||||
if (playerEvent == null || !playerEvent.IsValid) return;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
if (enemies.Length > 0)
|
||||
{
|
||||
ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString())));
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ namespace src.player.skills
|
|||
if (playerInfo == null || playerInfo.Skill != skillName) continue;
|
||||
if (!SkillUtils.HasMenu(player)) continue;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
|
||||
ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => ($"\u202A{e.PlayerName}\u202C : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account + e.InGameMoneyServices.CashSpentThisRound)}$", e.Index.ToString()))];
|
||||
SkillUtils.UpdateMenu(player, menuItems);
|
||||
|
|
@ -85,7 +85,7 @@ namespace src.player.skills
|
|||
if (playerInfo == null) return;
|
||||
playerInfo.SkillUsed = false;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
if (enemies.Length > 0)
|
||||
{
|
||||
ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => ($"\u202A{e.PlayerName}\u202C : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account + e.InGameMoneyServices.CashSpentThisRound)}$", e.Index.ToString()))];
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ namespace src.player.skills
|
|||
if (playerInfo == null || playerInfo.Skill != skillName) continue;
|
||||
if (!SkillUtils.HasMenu(player)) continue;
|
||||
|
||||
var enemies = GetSelectableEnemies(player);
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))];
|
||||
SkillUtils.UpdateMenu(player, menuItems);
|
||||
}
|
||||
|
|
@ -72,7 +72,7 @@ namespace src.player.skills
|
|||
var playerEvent = PlayerManager.GetPlayerFromEvent(player);
|
||||
if (playerEvent == null || !playerEvent.IsValid) return;
|
||||
|
||||
var enemies = GetSelectableEnemies(player);
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
if (enemies.Length > 0)
|
||||
{
|
||||
ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))];
|
||||
|
|
@ -225,17 +225,6 @@ namespace src.player.skills
|
|||
EntityManager.DestroyEntity(volumeIndex);
|
||||
}
|
||||
|
||||
private static CCSPlayerController[] GetSelectableEnemies(CCSPlayerController player)
|
||||
{
|
||||
return [.. PlayerManager.GetTickPlayers()
|
||||
.Where(p => p != null && p.IsValid)
|
||||
.Select(PlayerManager.GetPlayerEvent)
|
||||
.Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null
|
||||
&& p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV
|
||||
&& p.Team != CsTeam.Spectator && p.Team != CsTeam.None)
|
||||
.Select(p => p!)];
|
||||
}
|
||||
|
||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#5b2c6f", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Rare, string postProcessing = "lighting/postprocessing/effects/death_cam_phase1_low_violence.vpost", float fadeTime = .25f, float minExposure = .5f, float maxExposure = 2f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
|
||||
{
|
||||
public string PostProcessing { get; set; } = postProcessing;
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@ namespace src.player.skills
|
|||
if (playerInfo == null || playerInfo.Skill != skillName) continue;
|
||||
if (!SkillUtils.HasMenu(player)) continue;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
|
||||
ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString())));
|
||||
SkillUtils.UpdateMenu(player, menuItems);
|
||||
|
|
@ -139,7 +139,7 @@ namespace src.player.skills
|
|||
var playerEvent = PlayerManager.GetPlayerFromEvent(player);
|
||||
if (playerEvent == null || !playerEvent.IsValid) return;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
if (enemies.Length > 0)
|
||||
{
|
||||
ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString())));
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ namespace src.player.skills
|
|||
if (playerInfo == null || playerInfo.Skill != skillName) continue;
|
||||
if (!SkillUtils.HasMenu(player)) continue;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
|
||||
ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString())));
|
||||
SkillUtils.UpdateMenu(player, menuItems);
|
||||
|
|
@ -134,7 +134,7 @@ namespace src.player.skills
|
|||
var playerEvent = PlayerManager.GetPlayerFromEvent(player);
|
||||
if (playerEvent == null || !playerEvent.IsValid) return;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
if (enemies.Length > 0)
|
||||
{
|
||||
ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString())));
|
||||
|
|
|
|||
|
|
@ -14,10 +14,13 @@ namespace src.player.skills
|
|||
private const Skills skillName = Skills.Tripwire;
|
||||
|
||||
private static readonly ConcurrentDictionary<uint, WireInfo> wires = [];
|
||||
private static readonly ConcurrentDictionary<uint, int> wireCount = [];
|
||||
private static readonly ConcurrentDictionary<uint, PlayerSkillInfo> SkillPlayerInfo = [];
|
||||
private static readonly ConcurrentDictionary<(uint Owner, uint Target), (int Slot, int ExpiryTick)> revealed = [];
|
||||
private static readonly object setLock = new();
|
||||
|
||||
private static readonly Color terroristWire = Color.FromArgb(255, 255, 64, 64);
|
||||
private static readonly Color counterTerroristWire = Color.FromArgb(255, 64, 128, 255);
|
||||
|
||||
public static void LoadSkill()
|
||||
{
|
||||
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
|
||||
|
|
@ -31,11 +34,22 @@ namespace src.player.skills
|
|||
DestroyWire(wire.BeamIndex);
|
||||
|
||||
wires.Clear();
|
||||
wireCount.Clear();
|
||||
SkillPlayerInfo.Clear();
|
||||
revealed.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
public static void EnableSkill(CCSPlayerController player)
|
||||
{
|
||||
if (player == null || !player.IsValid) return;
|
||||
|
||||
SkillPlayerInfo[player.Index] = new PlayerSkillInfo
|
||||
{
|
||||
CanUse = true,
|
||||
Cooldown = DateTime.MinValue,
|
||||
};
|
||||
}
|
||||
|
||||
public static void PlayerDisconnect(uint playerIndex)
|
||||
{
|
||||
RemovePlayerWires(playerIndex);
|
||||
|
|
@ -43,15 +57,32 @@ namespace src.player.skills
|
|||
foreach (var key in revealed.Keys)
|
||||
if (key.Owner == playerIndex || key.Target == playerIndex)
|
||||
revealed.TryRemove(key, out _);
|
||||
|
||||
SkillPlayerInfo.TryRemove(playerIndex, out _);
|
||||
}
|
||||
|
||||
public static void DisableSkill(CCSPlayerController player)
|
||||
{
|
||||
if (player == null) return;
|
||||
RemovePlayerWires(player.Index);
|
||||
ClearOwner(player.Index);
|
||||
SkillUtils.ResetPrintHTML(player);
|
||||
}
|
||||
|
||||
public static void PlayerDeath(EventPlayerDeath @event)
|
||||
{
|
||||
var player = @event.Userid;
|
||||
if (player == null || !player.IsValid) return;
|
||||
|
||||
ClearOwner(player.Index);
|
||||
SkillUtils.ResetPrintHTML(player);
|
||||
}
|
||||
|
||||
private static void ClearOwner(uint ownerIndex)
|
||||
{
|
||||
RemovePlayerWires(ownerIndex);
|
||||
|
||||
foreach (var key in revealed.Keys)
|
||||
if (key.Owner == player.Index)
|
||||
if (key.Owner == ownerIndex)
|
||||
revealed.TryRemove(key, out _);
|
||||
}
|
||||
|
||||
|
|
@ -65,7 +96,7 @@ namespace src.player.skills
|
|||
wires.TryRemove(kvp.Key, out _);
|
||||
}
|
||||
|
||||
wireCount.TryRemove(ownerIndex, out _);
|
||||
SkillPlayerInfo.TryRemove(ownerIndex, out _);
|
||||
}
|
||||
|
||||
private static void DestroyWire(uint beamIndex)
|
||||
|
|
@ -92,12 +123,7 @@ namespace src.player.skills
|
|||
var playerEvent = PlayerManager.GetPlayerFromEvent(player);
|
||||
if (playerEvent == null || !playerEvent.IsValid) return;
|
||||
|
||||
int maxWires = SkillsInfo.GetValue<int>(skillName, "maxWires");
|
||||
if (wireCount.TryGetValue(player.Index, out int placed) && placed >= maxWires)
|
||||
{
|
||||
playerEvent.PrintToChat($" {ChatColors.Red}" + playerEvent.GetTranslation("tripwire_limit_info", maxWires));
|
||||
return;
|
||||
}
|
||||
if (!SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo) || !skillInfo.CanUse) return;
|
||||
|
||||
if (!TryPlaceWire(player))
|
||||
{
|
||||
|
|
@ -105,10 +131,29 @@ namespace src.player.skills
|
|||
return;
|
||||
}
|
||||
|
||||
wireCount.AddOrUpdate(player.Index, 1, (_, v) => v + 1);
|
||||
skillInfo.CanUse = false;
|
||||
skillInfo.Cooldown = DateTime.Now;
|
||||
|
||||
playerEvent.PrintToChat($" {ChatColors.Green}" + playerEvent.GetTranslation("tripwire_placed_info"));
|
||||
}
|
||||
|
||||
private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo)
|
||||
{
|
||||
float time = (int)Math.Ceiling((skillInfo.Cooldown.AddSeconds(SkillsInfo.GetValue<float>(skillName, "cooldown")) - DateTime.Now).TotalSeconds);
|
||||
float cooldown = Math.Max(time, 0);
|
||||
|
||||
if (cooldown == 0 && !skillInfo.CanUse)
|
||||
skillInfo.CanUse = true;
|
||||
|
||||
var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index);
|
||||
if (playerInfo == null) return;
|
||||
|
||||
if (cooldown == 0)
|
||||
playerInfo.PrintHTML = null;
|
||||
else
|
||||
playerInfo.PrintHTML = $"{player.GetTranslation("hud_info", $"<font color='#FF0000'>{cooldown}</font>")}";
|
||||
}
|
||||
|
||||
private static bool TryPlaceWire(CCSPlayerController player)
|
||||
{
|
||||
var pawn = player.PlayerPawn?.Value;
|
||||
|
|
@ -138,7 +183,9 @@ namespace src.player.skills
|
|||
|
||||
if (EntityManager.OverBudget()) return false;
|
||||
|
||||
var beam = EntityManager.CreateTrackedBeam(player.Index, start, end, Color.FromArgb(255, 255, 40, 40));
|
||||
Color wireColor = player.Team == CsTeam.Terrorist ? terroristWire : counterTerroristWire;
|
||||
|
||||
var beam = EntityManager.CreateTrackedBeam(player.Index, start, end, wireColor);
|
||||
if (beam == null || !beam.IsValid) return false;
|
||||
|
||||
beam.Width = SkillsInfo.GetValue<float>(skillName, "wireWidth");
|
||||
|
|
@ -156,6 +203,18 @@ namespace src.player.skills
|
|||
|
||||
public static void OnTick()
|
||||
{
|
||||
if (!SkillPlayerInfo.IsEmpty && Server.TickCount % 8 == 0)
|
||||
{
|
||||
foreach (var player in PlayerManager.GetTickPlayers())
|
||||
{
|
||||
if (player == null || !player.IsValid) continue;
|
||||
if (!SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) continue;
|
||||
|
||||
if (PlayerManager.GetPlayerByIndex(player.Index)?.Skill == skillName)
|
||||
UpdateHUD(player, skillInfo);
|
||||
}
|
||||
}
|
||||
|
||||
if (revealed.IsEmpty && wires.IsEmpty) return;
|
||||
|
||||
int tick = Server.TickCount;
|
||||
|
|
@ -243,14 +302,20 @@ namespace src.player.skills
|
|||
public required Vector End { get; set; }
|
||||
}
|
||||
|
||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff3b3b", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Rare, float radarDuration = 5f, float triggerRadius = 24f, float wireHeight = 30f, float wireWidth = 1.5f, float maxWallDistance = 400f, int maxWires = 2) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
|
||||
public class PlayerSkillInfo
|
||||
{
|
||||
public bool CanUse { get; set; }
|
||||
public DateTime Cooldown { get; set; }
|
||||
}
|
||||
|
||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff3b3b", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Rare, float radarDuration = 5f, float triggerRadius = 24f, float wireHeight = 30f, float wireWidth = 1.5f, float maxWallDistance = 400f, float cooldown = 20f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
|
||||
{
|
||||
public float RadarDuration { get; set; } = radarDuration;
|
||||
public float TriggerRadius { get; set; } = triggerRadius;
|
||||
public float WireHeight { get; set; } = wireHeight;
|
||||
public float WireWidth { get; set; } = wireWidth;
|
||||
public float MaxWallDistance { get; set; } = maxWallDistance;
|
||||
public int MaxWires { get; set; } = maxWires;
|
||||
public float Cooldown { get; set; } = cooldown;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ namespace src.player.skills
|
|||
var playerEvent = PlayerManager.GetPlayerFromEvent(player);
|
||||
if (playerEvent == null || !playerEvent.IsValid) return;
|
||||
|
||||
var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
var enemies = SkillUtils.GetSelectableEnemies(player, true);
|
||||
if (enemies.Length > 0)
|
||||
{
|
||||
ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString())));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue