using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.utils; using src.utils; using System.Collections.Concurrent; using static src.jRandomSkills; namespace src.player.skills { public class KillerFlash : ISkill { private const Skills skillName = Skills.KillerFlash; private readonly static ConcurrentDictionary playersWithSkill = []; public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color")); } public static void PlayerBlind(EventPlayerBlind @event) { var player = PlayerManager.GetPlayerEvent(@event.Userid); var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); if (!Instance.IsPlayerValid(player) || !Instance.IsPlayerValid(attacker)) return; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); var attackerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); if (!SkillsInfo.GetValue(skillName, "friendlyFire") && player!.Team == attacker!.Team) return; if (attackerInfo?.Skill == skillName && playerInfo?.Skill != Skills.AntyFlash && player!.PlayerPawn.Value!.FlashDuration >= SkillsInfo.GetValue(skillName, "flashDuration")) SkillUtils.TakeHealth(player.PlayerPawn.Value, 9999, attacker, KillfeedIcons.Flashbang); } public static void GrenadeThrown(EventGrenadeThrown @event) { var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; var weapon = @event.Weapon; if (weapon != "flashbang") return; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) { playersWithSkill[player.Index] = grenadesLeft - 1; player!.GiveNamedItem($"weapon_{weapon}"); SkillUtils.UpdateGrenadeCount(player, CsItem.FlashbangGrenade, grenadesLeft - 1); } } public static void WeaponEquip(EventItemEquip @event) { var player = PlayerManager.GetPlayerEvent(@event.Userid); var weapon = @event.Item; if (player == null || !player.IsValid) return; if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) SkillUtils.UpdateGrenadeCount(player, CsItem.FlashbangGrenade, grenadesLeft); } public static void WeaponPickup(EventItemPickup @event) { var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; var weapon = @event.Item; if (string.IsNullOrEmpty(weapon) || weapon != "flashbang") return; if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) SkillUtils.UpdateGrenadeCount(player, CsItem.FlashbangGrenade, grenadesLeft); } public static void EnableSkill(CCSPlayerController player) { if (player == null || !player.IsValid) return; int flashbangLimit = SkillUtils.CvarValue("ammo_grenade_limit_flashbang", 2); int grenadeLimit = SkillsInfo.GetValue(skillName, "grenadeLimit"); if (grenadeLimit > flashbangLimit) { playersWithSkill.TryAdd(player.Index, grenadeLimit); SkillUtils.TryGiveWeapon(player, CsItem.FlashbangGrenade); SkillUtils.UpdateGrenadeCount(player, CsItem.FlashbangGrenade, grenadeLimit); } else SkillUtils.TryGiveWeapon(player, CsItem.FlashbangGrenade, grenadeLimit, false); } public static void DisableSkill(CCSPlayerController player) { if (player == null || !player.IsValid) return; playersWithSkill.TryRemove(player.Index, out _); SkillUtils.UpdateGrenadeCount(player, CsItem.FlashbangGrenade, 1); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#57bcff", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = 1, Rarity rarity = Rarity.Epic, float flashDuration = 1f, bool friendlyFire = true, int grenadeLimit = 1) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity) { public float FlashDuration { get; set; } = flashDuration; public bool FriendlyFire { get; set; } = friendlyFire; public int GrenadeLimit { get; set; } = grenadeLimit; } } }