commit
f73dd5a4df
33 changed files with 189 additions and 53 deletions
|
|
@ -31,7 +31,7 @@ namespace src
|
||||||
public override string ModuleName => "[CS2] [ jRandomSkills ]";
|
public override string ModuleName => "[CS2] [ jRandomSkills ]";
|
||||||
public override string ModuleAuthor => "D3X (Original), Juzlus (Modifier), ByDexterTR (Contributor)";
|
public override string ModuleAuthor => "D3X (Original), Juzlus (Modifier), ByDexterTR (Contributor)";
|
||||||
public override string ModuleDescription => "Plugin adds random skills every round for CS2 by D3X. Modified by Juzlus.";
|
public override string ModuleDescription => "Plugin adds random skills every round for CS2 by D3X. Modified by Juzlus.";
|
||||||
public override string ModuleVersion => "1.2.4.b1";
|
public override string ModuleVersion => "1.2.4.b2";
|
||||||
|
|
||||||
public override void Load(bool hotReload)
|
public override void Load(bool hotReload)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,9 @@ namespace src.player
|
||||||
public static partial class Event
|
public static partial class Event
|
||||||
{
|
{
|
||||||
private static Timer? setSkillTimer = null;
|
private static Timer? setSkillTimer = null;
|
||||||
|
private const int MaxSetSkillRetries = 6;
|
||||||
|
private static int setSkillRetries;
|
||||||
|
private static int gameRulesPolls;
|
||||||
private static DateTime freezeTimeEnd = DateTime.MinValue;
|
private static DateTime freezeTimeEnd = DateTime.MinValue;
|
||||||
private static bool isTransmitRegistered = false;
|
private static bool isTransmitRegistered = false;
|
||||||
public static readonly jSkill_SkillInfo noneSkill = new(Skills.None, SkillsInfo.GetValue<string>(Skills.None, "color"), false);
|
public static readonly jSkill_SkillInfo noneSkill = new(Skills.None, SkillsInfo.GetValue<string>(Skills.None, "color"), false);
|
||||||
|
|
@ -682,6 +685,10 @@ namespace src.player
|
||||||
var victim = @event.Userid;
|
var victim = @event.Userid;
|
||||||
if (victim == null || !victim.IsValid) return HookResult.Continue;
|
if (victim == null || !victim.IsValid) return HookResult.Continue;
|
||||||
|
|
||||||
|
Ninja.RevealOnDeath(victim.Index);
|
||||||
|
Ghost.RevealOnDeath(victim.Index);
|
||||||
|
C4Camouflage.RevealOnDeath(victim.Index);
|
||||||
|
|
||||||
if (!SkillUtils.TryConsumeKillCredit(victim.Index, out uint attackerIndex, out string? weapon))
|
if (!SkillUtils.TryConsumeKillCredit(victim.Index, out uint attackerIndex, out string? weapon))
|
||||||
return HookResult.Continue;
|
return HookResult.Continue;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,19 @@ namespace src.player
|
||||||
string flag = Config.LoadedConfig.VIPFlag;
|
string flag = Config.LoadedConfig.VIPFlag;
|
||||||
if (string.IsNullOrWhiteSpace(flag)) return false;
|
if (string.IsNullOrWhiteSpace(flag)) return false;
|
||||||
|
|
||||||
return AdminManager.PlayerHasPermissions(player, flag);
|
return HasPermission(player, flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool HasPermission(CCSPlayerController player, string permission)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return AdminManager.PlayerHasPermissions(player, permission);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static jSkill_SkillInfo ChooseSkillByRarityAndMax(List<jSkill_SkillInfo> candidates, Dictionary<Skills, int> assignmentCounts, Config.GameModes gameMode, bool vip)
|
private static jSkill_SkillInfo ChooseSkillByRarityAndMax(List<jSkill_SkillInfo> candidates, Dictionary<Skills, int> assignmentCounts, Config.GameModes gameMode, bool vip)
|
||||||
|
|
@ -88,6 +100,7 @@ namespace src.player
|
||||||
{
|
{
|
||||||
bool isWarmup = Instance.GameRules == null || Instance.GameRules.WarmupPeriod == true;
|
bool isWarmup = Instance.GameRules == null || Instance.GameRules.WarmupPeriod == true;
|
||||||
isTransmitRegistered = false;
|
isTransmitRegistered = false;
|
||||||
|
setSkillRetries = 0;
|
||||||
SkillUtils.ClearKillCredits();
|
SkillUtils.ClearKillCredits();
|
||||||
SkillUtils.ClearCurses();
|
SkillUtils.ClearCurses();
|
||||||
Instance.AddTimer(.1f, () => DisableAll(), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
|
Instance.AddTimer(.1f, () => DisableAll(), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
|
||||||
|
|
@ -336,7 +349,7 @@ namespace src.player
|
||||||
List<jSkill_SkillInfo> skillList = [.. ctx.BaseList];
|
List<jSkill_SkillInfo> skillList = [.. ctx.BaseList];
|
||||||
|
|
||||||
if (!player.IsBot && ctx.RequiredPermissions.Count != 0)
|
if (!player.IsBot && ctx.RequiredPermissions.Count != 0)
|
||||||
skillList.RemoveAll(s => ctx.RequiredPermissions.TryGetValue(s.Skill, out var perm) && !AdminManager.PlayerHasPermissions(player, perm));
|
skillList.RemoveAll(s => ctx.RequiredPermissions.TryGetValue(s.Skill, out var perm) && !HasPermission(player, perm));
|
||||||
|
|
||||||
if (gameMode != Config.GameModes.FullRandom)
|
if (gameMode != Config.GameModes.FullRandom)
|
||||||
skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill);
|
skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill);
|
||||||
|
|
@ -419,12 +432,19 @@ namespace src.player
|
||||||
var skillPlayer = PlayerManager.GetPlayerByIndex(player.Index);
|
var skillPlayer = PlayerManager.GetPlayerByIndex(player.Index);
|
||||||
if (skillPlayer == null) continue;
|
if (skillPlayer == null) continue;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
var pick = PickSkillForPlayer(player, skillPlayer, ctx, assignmentCounts, gameMode);
|
var pick = PickSkillForPlayer(player, skillPlayer, ctx, assignmentCounts, gameMode);
|
||||||
nextRoundPicks[player.Index] = pick;
|
nextRoundPicks[player.Index] = pick;
|
||||||
|
|
||||||
if (pick.Skill != Skills.None)
|
if (pick.Skill != Skills.None)
|
||||||
assignmentCounts[pick.Skill] = assignmentCounts.TryGetValue(pick.Skill, out var c) ? c + 1 : 1;
|
assignmentCounts[pick.Skill] = assignmentCounts.TryGetValue(pick.Skill, out var c) ? c + 1 : 1;
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Debug.WriteToDebug($"PrecomputeSkills failed for {skillPlayer.PlayerName}: {ex.Message}", DebugCategory.Skill);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
PerfLog.End("PrecomputeSkills total", perfStart, 2.0);
|
PerfLog.End("PrecomputeSkills total", perfStart, 2.0);
|
||||||
}
|
}
|
||||||
|
|
@ -450,6 +470,12 @@ namespace src.player
|
||||||
: DateTime.Now.AddSeconds(skillDescriptionHudExpired.Value);
|
: DateTime.Now.AddSeconds(skillDescriptionHudExpired.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static int CountConnectedPlayers()
|
||||||
|
{
|
||||||
|
try { return Utilities.GetPlayers().Count(p => p != null && p.IsValid && !p.IsHLTV); }
|
||||||
|
catch { return 0; }
|
||||||
|
}
|
||||||
|
|
||||||
private static void SetSkillCore()
|
private static void SetSkillCore()
|
||||||
{
|
{
|
||||||
setSkillTimer = null;
|
setSkillTimer = null;
|
||||||
|
|
@ -460,11 +486,16 @@ namespace src.player
|
||||||
// GameRules null = not ready; keep polling so skills land right after warmup ends.
|
// GameRules null = not ready; keep polling so skills land right after warmup ends.
|
||||||
if (Instance.GameRules == null || Instance.GameRules.WarmupPeriod == true)
|
if (Instance.GameRules == null || Instance.GameRules.WarmupPeriod == true)
|
||||||
{
|
{
|
||||||
|
if (++gameRulesPolls % 10 == 0)
|
||||||
|
Debug.WriteToDebug($"SetSkill waiting: gameRules={(Instance.GameRules == null ? "null" : "warmup")}, poll {gameRulesPolls}.", DebugCategory.Skill);
|
||||||
|
|
||||||
setSkillTimer?.Kill();
|
setSkillTimer?.Kill();
|
||||||
setSkillTimer = Instance.AddTimer(1f, SetSkill, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
|
setSkillTimer = Instance.AddTimer(1f, SetSkill, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gameRulesPolls = 0;
|
||||||
|
|
||||||
var validPlayers = Utilities.GetPlayers()
|
var validPlayers = Utilities.GetPlayers()
|
||||||
.Where(p => p != null && p.IsValid && !p.IsHLTV)
|
.Where(p => p != null && p.IsValid && !p.IsHLTV)
|
||||||
.Where(p =>
|
.Where(p =>
|
||||||
|
|
@ -501,6 +532,7 @@ namespace src.player
|
||||||
}
|
}
|
||||||
|
|
||||||
PickContext? pickContext = null;
|
PickContext? pickContext = null;
|
||||||
|
int assigned = 0;
|
||||||
|
|
||||||
foreach (var player in validPlayers)
|
foreach (var player in validPlayers)
|
||||||
{
|
{
|
||||||
|
|
@ -586,6 +618,7 @@ namespace src.player
|
||||||
|
|
||||||
Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{SkillNames.Get(randomSkill.Skill)}\".", DebugCategory.Skill);
|
Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{SkillNames.Get(randomSkill.Skill)}\".", DebugCategory.Skill);
|
||||||
UpdateSkillHudExpired(skillPlayer, randomSkill.Skill);
|
UpdateSkillHudExpired(skillPlayer, randomSkill.Skill);
|
||||||
|
assigned++;
|
||||||
|
|
||||||
if (randomSkill.Display)
|
if (randomSkill.Display)
|
||||||
Instance?.AddTimer(.6f, () =>
|
Instance?.AddTimer(.6f, () =>
|
||||||
|
|
@ -626,6 +659,20 @@ namespace src.player
|
||||||
}
|
}
|
||||||
|
|
||||||
nextRoundPicks.Clear();
|
nextRoundPicks.Clear();
|
||||||
|
|
||||||
|
if (assigned == 0 && CountConnectedPlayers() > 0)
|
||||||
|
{
|
||||||
|
if (setSkillRetries < MaxSetSkillRetries)
|
||||||
|
{
|
||||||
|
setSkillRetries++;
|
||||||
|
Debug.WriteToDebug($"SetSkill assigned nothing (valid={validPlayers.Count}, connected={CountConnectedPlayers()}); retry {setSkillRetries}/{MaxSetSkillRetries} in .5s.", DebugCategory.Skill);
|
||||||
|
setSkillTimer = Instance?.AddTimer(.5f, SetSkill, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Debug.WriteToDebug($"SetSkill assigned nothing (valid={validPlayers.Count}, connected={CountConnectedPlayers()}) and gave up after {MaxSetSkillRetries} retries.", DebugCategory.Skill);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
setSkillRetries = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -668,7 +715,7 @@ namespace src.player
|
||||||
List<jSkill_SkillInfo> skillList = [.. SkillData.Skills];
|
List<jSkill_SkillInfo> skillList = [.. SkillData.Skills];
|
||||||
skillList.RemoveAll(s => s?.Skill == Skills.None);
|
skillList.RemoveAll(s => s?.Skill == Skills.None);
|
||||||
if (!player.IsBot)
|
if (!player.IsBot)
|
||||||
skillList.RemoveAll(s => !string.IsNullOrEmpty(SkillsInfo.GetValue<string>(s.Skill, "requiredPermission")) && !AdminManager.PlayerHasPermissions(player, SkillsInfo.GetValue<string>(s.Skill, "requiredPermission")));
|
skillList.RemoveAll(s => !string.IsNullOrEmpty(SkillsInfo.GetValue<string>(s.Skill, "requiredPermission")) && !HasPermission(player, SkillsInfo.GetValue<string>(s.Skill, "requiredPermission")));
|
||||||
|
|
||||||
if (gameMode != Config.GameModes.FullRandom)
|
if (gameMode != Config.GameModes.FullRandom)
|
||||||
skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill);
|
skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Cvars;
|
using CounterStrikeSharp.API.Modules.Cvars;
|
||||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
||||||
|
|
@ -53,6 +53,7 @@ namespace src.player.skills
|
||||||
if (SkillPlayerInfo.IsEmpty) return;
|
if (SkillPlayerInfo.IsEmpty) return;
|
||||||
|
|
||||||
float cooldown = SkillsInfo.GetValue<float>(skillName, "cooldown");
|
float cooldown = SkillsInfo.GetValue<float>(skillName, "cooldown");
|
||||||
|
bool freezeTime = SkillUtils.IsFreezeTime();
|
||||||
|
|
||||||
foreach (var player in PlayerManager.GetTickPlayers())
|
foreach (var player in PlayerManager.GetTickPlayers())
|
||||||
{
|
{
|
||||||
|
|
@ -67,7 +68,7 @@ namespace src.player.skills
|
||||||
var buttons = player.Buttons;
|
var buttons = player.Buttons;
|
||||||
bool isAttack2 = (buttons & PlayerButtons.Attack2) != 0;
|
bool isAttack2 = (buttons & PlayerButtons.Attack2) != 0;
|
||||||
|
|
||||||
if (skillInfo.CanUse && isAttack2)
|
if (skillInfo.CanUse && isAttack2 && !freezeTime)
|
||||||
{
|
{
|
||||||
var weapon = playerPawn.WeaponServices?.ActiveWeapon?.Value;
|
var weapon = playerPawn.WeaponServices?.ActiveWeapon?.Value;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -99,6 +99,11 @@ namespace src.player.skills
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void RevealOnDeath(uint playerIndex)
|
||||||
|
{
|
||||||
|
invisiblePlayers.TryRemove(playerIndex, out _);
|
||||||
|
}
|
||||||
|
|
||||||
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
|
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
|
||||||
{
|
{
|
||||||
if (invisiblePlayers.IsEmpty) return;
|
if (invisiblePlayers.IsEmpty) return;
|
||||||
|
|
|
||||||
|
|
@ -211,7 +211,7 @@ namespace src.player.skills
|
||||||
targetToPlayer.TryRemove(targetIndex, out _);
|
targetToPlayer.TryRemove(targetIndex, out _);
|
||||||
|
|
||||||
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
||||||
if (target != null && target.IsValid && target.PawnIsAlive && !SkillUtils.IsFreezeTime())
|
if (target != null && target.IsValid && target.PawnIsAlive)
|
||||||
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("carefulbullets_disable_info"));
|
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("carefulbullets_disable_info"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -294,6 +294,8 @@ namespace src.player.skills
|
||||||
|
|
||||||
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo)
|
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo)
|
||||||
{
|
{
|
||||||
|
if (SkillsInfo.GetValue<bool>(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return;
|
||||||
|
|
||||||
if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null || damageInfo.Attacker == null || damageInfo.Attacker.Value == null)
|
if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null || damageInfo.Attacker == null || damageInfo.Attacker.Value == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Timers;
|
using CounterStrikeSharp.API.Modules.Timers;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
|
|
@ -150,7 +150,7 @@ namespace src.player.skills
|
||||||
if (target != null && target.IsValid)
|
if (target != null && target.IsValid)
|
||||||
{
|
{
|
||||||
SetUpPostProcessing(target, true);
|
SetUpPostProcessing(target, true);
|
||||||
if (target.PawnIsAlive && !SkillUtils.IsFreezeTime())
|
if (target.PawnIsAlive)
|
||||||
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("darkness_disable_info"));
|
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("darkness_disable_info"));
|
||||||
}
|
}
|
||||||
playersInDark.TryRemove(targetIndex, out _);
|
playersInDark.TryRemove(targetIndex, out _);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.UserMessages;
|
using CounterStrikeSharp.API.Modules.UserMessages;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
|
|
@ -139,7 +139,7 @@ namespace src.player.skills
|
||||||
deafPlayers.TryRemove(targetIndex, out _);
|
deafPlayers.TryRemove(targetIndex, out _);
|
||||||
|
|
||||||
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
||||||
if (target != null && target.IsValid && target.PawnIsAlive && !SkillUtils.IsFreezeTime())
|
if (target != null && target.IsValid && target.PawnIsAlive)
|
||||||
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("deaf_disable_info"));
|
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("deaf_disable_info"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using src.utils;
|
using src.utils;
|
||||||
|
|
@ -139,7 +139,7 @@ namespace src.player.skills
|
||||||
cursedPlayers.TryRemove(targetIndex, out _);
|
cursedPlayers.TryRemove(targetIndex, out _);
|
||||||
|
|
||||||
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
||||||
if (target != null && target.IsValid && target.PawnIsAlive && !SkillUtils.IsFreezeTime())
|
if (target != null && target.IsValid && target.PawnIsAlive)
|
||||||
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("expensiveammo_disable_info"));
|
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("expensiveammo_disable_info"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Cvars;
|
using CounterStrikeSharp.API.Modules.Cvars;
|
||||||
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||||
|
|
@ -171,6 +171,8 @@ namespace src.player.skills
|
||||||
|
|
||||||
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo)
|
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo)
|
||||||
{
|
{
|
||||||
|
if (SkillsInfo.GetValue<bool>(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return;
|
||||||
|
|
||||||
if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null) return;
|
if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null) return;
|
||||||
|
|
||||||
if (HandleBarrelHit(damagedEntity)) return;
|
if (HandleBarrelHit(damagedEntity)) return;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
|
|
@ -121,6 +121,8 @@ namespace src.player.skills
|
||||||
|
|
||||||
public static void BulletImpact(EventBulletImpact @event)
|
public static void BulletImpact(EventBulletImpact @event)
|
||||||
{
|
{
|
||||||
|
if (SkillsInfo.GetValue<bool>(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return;
|
||||||
|
|
||||||
var player = PlayerManager.GetPlayerEvent(@event.Userid);
|
var player = PlayerManager.GetPlayerEvent(@event.Userid);
|
||||||
if (player == null || !player.IsValid) return;
|
if (player == null || !player.IsValid) return;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -85,17 +85,38 @@ namespace src.player.skills
|
||||||
|
|
||||||
private static void ChangeCamera(CCSPlayerController player, bool forceToDefault = false)
|
private static void ChangeCamera(CCSPlayerController player, bool forceToDefault = false)
|
||||||
{
|
{
|
||||||
uint orginalCameraRaw;
|
|
||||||
uint newCameraRaw;
|
|
||||||
var pawn = player.PlayerPawn.Value;
|
var pawn = player.PlayerPawn.Value;
|
||||||
if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return;
|
if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return;
|
||||||
|
|
||||||
if (cameras.TryGetValue(player.Index, out var cameraInfo) && cameraInfo.Item2 != 0)
|
bool tracked = cameras.TryGetValue(player.Index, out var cameraInfo) && cameraInfo.Item2 != 0;
|
||||||
|
|
||||||
|
if (forceToDefault)
|
||||||
|
{
|
||||||
|
if (tracked)
|
||||||
|
{
|
||||||
|
pawn.CameraServices.ViewEntity.Raw = cameraInfo.Item1;
|
||||||
|
Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices");
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockWeapon(player, false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint orginalCameraRaw;
|
||||||
|
uint newCameraRaw;
|
||||||
|
|
||||||
|
if (tracked)
|
||||||
{
|
{
|
||||||
orginalCameraRaw = cameraInfo.Item1;
|
orginalCameraRaw = cameraInfo.Item1;
|
||||||
|
|
||||||
var camera = Utilities.GetEntityFromIndex<CDynamicProp>((int)cameraInfo.Item2);
|
var camera = Utilities.GetEntityFromIndex<CDynamicProp>((int)cameraInfo.Item2);
|
||||||
if (camera == null || !camera.IsValid) return;
|
if (camera == null || !camera.IsValid)
|
||||||
|
{
|
||||||
|
pawn.CameraServices.ViewEntity.Raw = orginalCameraRaw;
|
||||||
|
Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices");
|
||||||
|
BlockWeapon(player, false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
newCameraRaw = camera.EntityHandle.Raw;
|
newCameraRaw = camera.EntityHandle.Raw;
|
||||||
}
|
}
|
||||||
|
|
@ -108,7 +129,7 @@ namespace src.player.skills
|
||||||
if (newCameraRaw == 0)
|
if (newCameraRaw == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
bool defaultCam = forceToDefault || (pawn.CameraServices.ViewEntity.Raw != orginalCameraRaw);
|
bool defaultCam = pawn.CameraServices.ViewEntity.Raw != orginalCameraRaw;
|
||||||
pawn!.CameraServices!.ViewEntity.Raw = defaultCam ? orginalCameraRaw : newCameraRaw;
|
pawn!.CameraServices!.ViewEntity.Raw = defaultCam ? orginalCameraRaw : newCameraRaw;
|
||||||
Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices");
|
Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices");
|
||||||
BlockWeapon(player, !defaultCam);
|
BlockWeapon(player, !defaultCam);
|
||||||
|
|
|
||||||
|
|
@ -143,6 +143,8 @@ namespace src.player.skills
|
||||||
|
|
||||||
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo)
|
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo)
|
||||||
{
|
{
|
||||||
|
if (SkillsInfo.GetValue<bool>(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return;
|
||||||
|
|
||||||
if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null || damageInfo.Attacker == null || damageInfo.Attacker.Value == null)
|
if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null || damageInfo.Attacker == null || damageInfo.Attacker.Value == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,11 @@ namespace src.player.skills
|
||||||
SetWeaponAttack(player!, true);
|
SetWeaponAttack(player!, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void RevealOnDeath(uint playerIndex)
|
||||||
|
{
|
||||||
|
invisiblePlayers.TryRemove(playerIndex, out _);
|
||||||
|
}
|
||||||
|
|
||||||
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
|
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
|
||||||
{
|
{
|
||||||
if (invisiblePlayers.IsEmpty) return;
|
if (invisiblePlayers.IsEmpty) return;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using src.utils;
|
using src.utils;
|
||||||
|
|
@ -194,7 +194,7 @@ namespace src.player.skills
|
||||||
if (!notify) return;
|
if (!notify) return;
|
||||||
|
|
||||||
var targetEvent = PlayerManager.GetPlayerFromEvent(target);
|
var targetEvent = PlayerManager.GetPlayerFromEvent(target);
|
||||||
if (targetEvent != null && targetEvent.IsValid && targetEvent.PawnIsAlive && !SkillUtils.IsFreezeTime())
|
if (targetEvent != null && targetEvent.IsValid && targetEvent.PawnIsAlive)
|
||||||
targetEvent.PrintToChat($" {ChatColors.Green}" + targetEvent.GetTranslation("giant_disable_info"));
|
targetEvent.PrintToChat($" {ChatColors.Green}" + targetEvent.GetTranslation("giant_disable_info"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using src.utils;
|
using src.utils;
|
||||||
|
|
@ -148,7 +148,7 @@ namespace src.player.skills
|
||||||
if (target != null && target.IsValid)
|
if (target != null && target.IsValid)
|
||||||
{
|
{
|
||||||
SkillUtils.SetRadarDisabled(target, ownerTag, false);
|
SkillUtils.SetRadarDisabled(target, ownerTag, false);
|
||||||
if (target.PawnIsAlive && !SkillUtils.IsFreezeTime())
|
if (target.PawnIsAlive)
|
||||||
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("glitch_disable_info"));
|
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("glitch_disable_info"));
|
||||||
}
|
}
|
||||||
glitchedPlayers.TryRemove(targetIndex, out _);
|
glitchedPlayers.TryRemove(targetIndex, out _);
|
||||||
|
|
|
||||||
|
|
@ -331,6 +331,8 @@ namespace src.player.skills
|
||||||
|
|
||||||
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo)
|
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo)
|
||||||
{
|
{
|
||||||
|
if (SkillsInfo.GetValue<bool>(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return;
|
||||||
|
|
||||||
if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null)
|
if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -185,6 +185,8 @@ namespace src.player.skills
|
||||||
|
|
||||||
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo)
|
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo)
|
||||||
{
|
{
|
||||||
|
if (SkillsInfo.GetValue<bool>(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return;
|
||||||
|
|
||||||
if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null || damageInfo.Attacker == null || damageInfo.Attacker.Value == null)
|
if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null || damageInfo.Attacker == null || damageInfo.Attacker.Value == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using src.utils;
|
using src.utils;
|
||||||
|
|
@ -166,7 +166,7 @@ namespace src.player.skills
|
||||||
SetCrosshair(target1, true);
|
SetCrosshair(target1, true);
|
||||||
SetCrosshair(target2, true);
|
SetCrosshair(target2, true);
|
||||||
|
|
||||||
if (target1.PawnIsAlive && !SkillUtils.IsFreezeTime())
|
if (target1.PawnIsAlive)
|
||||||
target1.PrintToChat($" {ChatColors.Green}" + target1.GetTranslation("jammer_disable_info"));
|
target1.PrintToChat($" {ChatColors.Green}" + target1.GetTranslation("jammer_disable_info"));
|
||||||
}
|
}
|
||||||
jammedPlayers.TryRemove(targetIndex, out _);
|
jammedPlayers.TryRemove(targetIndex, out _);
|
||||||
|
|
|
||||||
|
|
@ -135,7 +135,7 @@ namespace src.player.skills
|
||||||
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
||||||
if (target != null && target.IsValid)
|
if (target != null && target.IsValid)
|
||||||
{
|
{
|
||||||
if (target.PawnIsAlive && !SkillUtils.IsFreezeTime())
|
if (target.PawnIsAlive)
|
||||||
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("jetkick_disable_info"));
|
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("jetkick_disable_info"));
|
||||||
}
|
}
|
||||||
targetedPlayers.TryRemove(targetIndex, out _);
|
targetedPlayers.TryRemove(targetIndex, out _);
|
||||||
|
|
|
||||||
|
|
@ -41,9 +41,16 @@ namespace src.player.skills
|
||||||
var player = PlayerManager.GetPlayerEvent(@event.Userid);
|
var player = PlayerManager.GetPlayerEvent(@event.Userid);
|
||||||
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return;
|
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return;
|
||||||
if (!bannedPlayers.TryGetValue(player.Index, out _)) return;
|
if (!bannedPlayers.TryGetValue(player.Index, out _)) return;
|
||||||
bannedPlayers.AddOrUpdate(player.Index, Server.TickCount + 10, (k, v) => Server.TickCount + 10);
|
|
||||||
|
var pawn = player.PlayerPawn.Value;
|
||||||
|
if (pawn.AbsVelocity != null && pawn.AbsVelocity.Z > 0)
|
||||||
|
pawn.AbsVelocity.Z = 0;
|
||||||
|
|
||||||
|
bannedPlayers.AddOrUpdate(player.Index, Server.TickCount + JumpBlockTicks, (k, v) => Server.TickCount + JumpBlockTicks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private const int JumpBlockTicks = 24;
|
||||||
|
|
||||||
public static void OnTick()
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
if (bannedPlayers.IsEmpty) return;
|
if (bannedPlayers.IsEmpty) return;
|
||||||
|
|
@ -59,8 +66,8 @@ namespace src.player.skills
|
||||||
var pawn = player.PlayerPawn.Value;
|
var pawn = player.PlayerPawn.Value;
|
||||||
if (pawn == null || !pawn.IsValid) continue;
|
if (pawn == null || !pawn.IsValid) continue;
|
||||||
|
|
||||||
if (time > Server.TickCount)
|
if (time > Server.TickCount && pawn.AbsVelocity != null && pawn.AbsVelocity.Z > -300)
|
||||||
pawn.AbsVelocity.Z = -100;
|
pawn.AbsVelocity.Z = -300;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Server.TickCount % 32 != 0) return;
|
if (Server.TickCount % 32 != 0) return;
|
||||||
|
|
@ -149,7 +156,7 @@ namespace src.player.skills
|
||||||
bannedPlayers.TryRemove(targetIndex, out _);
|
bannedPlayers.TryRemove(targetIndex, out _);
|
||||||
|
|
||||||
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
||||||
if (target != null && target.IsValid && target.PawnIsAlive && !SkillUtils.IsFreezeTime())
|
if (target != null && target.IsValid)
|
||||||
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("jumpban_disable_info"));
|
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("jumpban_disable_info"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using src.utils;
|
using src.utils;
|
||||||
|
|
@ -153,7 +153,7 @@ namespace src.player.skills
|
||||||
cursedPlayers.TryRemove(targetIndex, out _);
|
cursedPlayers.TryRemove(targetIndex, out _);
|
||||||
|
|
||||||
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
||||||
if (target != null && target.IsValid && target.PawnIsAlive && !SkillUtils.IsFreezeTime())
|
if (target != null && target.IsValid && target.PawnIsAlive)
|
||||||
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("jumpcurse_disable_info"));
|
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("jumpcurse_disable_info"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using src.utils;
|
using src.utils;
|
||||||
|
|
@ -168,7 +168,7 @@ namespace src.player.skills
|
||||||
Utilities.SetStateChanged(target, "CBasePlayerController", "m_iDesiredFOV");
|
Utilities.SetStateChanged(target, "CBasePlayerController", "m_iDesiredFOV");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target.PawnIsAlive && !SkillUtils.IsFreezeTime())
|
if (target.PawnIsAlive)
|
||||||
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("magnifier_disable_info"));
|
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("magnifier_disable_info"));
|
||||||
}
|
}
|
||||||
playersWithFov.TryRemove(targetIndex, out _);
|
playersWithFov.TryRemove(targetIndex, out _);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Core.Attributes;
|
using CounterStrikeSharp.API.Core.Attributes;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
|
|
@ -147,7 +147,7 @@ namespace src.player.skills
|
||||||
RemoveVolume(targetIndex);
|
RemoveVolume(targetIndex);
|
||||||
|
|
||||||
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
||||||
if (target != null && target.IsValid && target.PawnIsAlive && !SkillUtils.IsFreezeTime())
|
if (target != null && target.IsValid && target.PawnIsAlive)
|
||||||
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("nightmare_disable_info"));
|
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("nightmare_disable_info"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,11 @@ namespace src.player.skills
|
||||||
UpdateNinja(player);
|
UpdateNinja(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void RevealOnDeath(uint playerIndex)
|
||||||
|
{
|
||||||
|
invisiblePlayers.TryRemove(playerIndex, out _);
|
||||||
|
}
|
||||||
|
|
||||||
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
|
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
|
||||||
{
|
{
|
||||||
if (invisiblePlayers.IsEmpty) return;
|
if (invisiblePlayers.IsEmpty) return;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.utils;
|
using jRandomSkills.src.utils;
|
||||||
|
|
@ -171,7 +171,7 @@ namespace src.player.skills
|
||||||
targetToPlayer.TryRemove(targetIndex, out _);
|
targetToPlayer.TryRemove(targetIndex, out _);
|
||||||
|
|
||||||
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
||||||
if (target != null && target.IsValid && target.PawnIsAlive && !SkillUtils.IsFreezeTime())
|
if (target != null && target.IsValid && target.PawnIsAlive)
|
||||||
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("poison_disable_info"));
|
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("poison_disable_info"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
|
|
@ -142,7 +142,7 @@ namespace src.player.skills
|
||||||
bannedPlayers.TryRemove(targetIndex, out _);
|
bannedPlayers.TryRemove(targetIndex, out _);
|
||||||
|
|
||||||
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
||||||
if (target != null && target.IsValid && target.PawnIsAlive && !SkillUtils.IsFreezeTime())
|
if (target != null && target.IsValid && target.PawnIsAlive)
|
||||||
{
|
{
|
||||||
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("primaryban_disable_info"));
|
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("primaryban_disable_info"));
|
||||||
SetWeaponAttack(target, false);
|
SetWeaponAttack(target, false);
|
||||||
|
|
|
||||||
|
|
@ -138,6 +138,8 @@ namespace src.player.skills
|
||||||
|
|
||||||
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo)
|
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo)
|
||||||
{
|
{
|
||||||
|
if (SkillsInfo.GetValue<bool>(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return;
|
||||||
|
|
||||||
if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null || damageInfo.Attacker == null || damageInfo.Attacker.Value == null)
|
if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null || damageInfo.Attacker == null || damageInfo.Attacker.Value == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,7 @@ namespace src.player.skills
|
||||||
|
|
||||||
List<CCSPlayerController> allowed = [];
|
List<CCSPlayerController> allowed = [];
|
||||||
|
|
||||||
if (emitter != null)
|
if (emitter != null && CanEmit(emitter, out _))
|
||||||
foreach (var recipient in um.Recipients)
|
foreach (var recipient in um.Recipients)
|
||||||
{
|
{
|
||||||
if (recipient == null || !recipient.IsValid) continue;
|
if (recipient == null || !recipient.IsValid) continue;
|
||||||
|
|
@ -110,23 +110,47 @@ namespace src.player.skills
|
||||||
|
|
||||||
float volume = SkillsInfo.GetValue<float>(skillName, "soundVolume");
|
float volume = SkillsInfo.GetValue<float>(skillName, "soundVolume");
|
||||||
|
|
||||||
foreach (var player in PlayerManager.GetTickPlayers()
|
foreach (var player in PlayerManager.GetTickPlayers())
|
||||||
.Where(p => p != null && p.IsValid && p.PlayerPawn.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0))
|
|
||||||
{
|
{
|
||||||
|
if (!CanEmit(player, out var pawn)) continue;
|
||||||
|
|
||||||
var entities = EntityManager.GetPlayerEntities(player.Index, "empty_prop");
|
var entities = EntityManager.GetPlayerEntities(player.Index, "empty_prop");
|
||||||
|
|
||||||
if (entities.Count == 0)
|
if (entities.Count == 0)
|
||||||
{
|
{
|
||||||
player.PlayerPawn.Value!.EmitSound(soundEventName, volume: volume);
|
pawn!.EmitSound(soundEventName, volume: volume);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var entity = Utilities.GetEntityFromIndex<CDynamicProp>((int)entities[0]);
|
var entity = Utilities.GetEntityFromIndex<CDynamicProp>((int)entities[0]);
|
||||||
if (entity != null && entity.IsValid)
|
if (entity == null || !entity.IsValid || IsAtWorldOrigin(entity.AbsOrigin)) continue;
|
||||||
|
|
||||||
entity.EmitSound(soundEventName, volume: volume);
|
entity.EmitSound(soundEventName, volume: volume);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static bool CanEmit(CCSPlayerController? player, out CCSPlayerPawn? pawn)
|
||||||
|
{
|
||||||
|
pawn = null;
|
||||||
|
|
||||||
|
if (player == null || !player.IsValid || player.IsHLTV) return false;
|
||||||
|
if (player.Team != CsTeam.Terrorist && player.Team != CsTeam.CounterTerrorist) return false;
|
||||||
|
|
||||||
|
var playerPawn = player.PlayerPawn?.Value;
|
||||||
|
if (playerPawn == null || !playerPawn.IsValid) return false;
|
||||||
|
if (playerPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE || playerPawn.Health <= 0) return false;
|
||||||
|
if (IsAtWorldOrigin(playerPawn.AbsOrigin)) return false;
|
||||||
|
|
||||||
|
pawn = playerPawn;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool IsAtWorldOrigin(Vector? origin)
|
||||||
|
{
|
||||||
|
if (origin == null) return true;
|
||||||
|
return MathF.Abs(origin.X) < 1f && MathF.Abs(origin.Y) < 1f && MathF.Abs(origin.Z) < 1f;
|
||||||
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#e3ed8c", 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 cooldown = 2, float soundVolume = 1f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#e3ed8c", 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 cooldown = 2, float soundVolume = 1f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
|
||||||
{
|
{
|
||||||
public float SoundVolume { get; set; } = soundVolume;
|
public float SoundVolume { get; set; } = soundVolume;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using src.utils;
|
using src.utils;
|
||||||
|
|
@ -59,7 +59,7 @@ namespace src.player.skills
|
||||||
infectedPlayers.TryRemove(targetIndex, out _);
|
infectedPlayers.TryRemove(targetIndex, out _);
|
||||||
|
|
||||||
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
||||||
if (target != null && target.IsValid && target.PawnIsAlive && !SkillUtils.IsFreezeTime())
|
if (target != null && target.IsValid && target.PawnIsAlive)
|
||||||
target.PrintToChat($" {ChatColors.Green}{target.GetTranslation("wildthrow_disable_info")}");
|
target.PrintToChat($" {ChatColors.Green}{target.GetTranslation("wildthrow_disable_info")}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue