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 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 ModuleVersion => "1.2.4.b1";
|
||||
public override string ModuleVersion => "1.2.4.b2";
|
||||
|
||||
public override void Load(bool hotReload)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -20,6 +20,9 @@ namespace src.player
|
|||
public static partial class Event
|
||||
{
|
||||
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 bool isTransmitRegistered = 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;
|
||||
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))
|
||||
return HookResult.Continue;
|
||||
|
||||
|
|
|
|||
|
|
@ -26,7 +26,19 @@ namespace src.player
|
|||
string flag = Config.LoadedConfig.VIPFlag;
|
||||
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)
|
||||
|
|
@ -88,6 +100,7 @@ namespace src.player
|
|||
{
|
||||
bool isWarmup = Instance.GameRules == null || Instance.GameRules.WarmupPeriod == true;
|
||||
isTransmitRegistered = false;
|
||||
setSkillRetries = 0;
|
||||
SkillUtils.ClearKillCredits();
|
||||
SkillUtils.ClearCurses();
|
||||
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];
|
||||
|
||||
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)
|
||||
skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill);
|
||||
|
|
@ -419,12 +432,19 @@ namespace src.player
|
|||
var skillPlayer = PlayerManager.GetPlayerByIndex(player.Index);
|
||||
if (skillPlayer == null) continue;
|
||||
|
||||
try
|
||||
{
|
||||
var pick = PickSkillForPlayer(player, skillPlayer, ctx, assignmentCounts, gameMode);
|
||||
nextRoundPicks[player.Index] = pick;
|
||||
|
||||
if (pick.Skill != Skills.None)
|
||||
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);
|
||||
}
|
||||
|
|
@ -450,6 +470,12 @@ namespace src.player
|
|||
: 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()
|
||||
{
|
||||
setSkillTimer = null;
|
||||
|
|
@ -460,11 +486,16 @@ namespace src.player
|
|||
// GameRules null = not ready; keep polling so skills land right after warmup ends.
|
||||
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 = Instance.AddTimer(1f, SetSkill, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
|
||||
return;
|
||||
}
|
||||
|
||||
gameRulesPolls = 0;
|
||||
|
||||
var validPlayers = Utilities.GetPlayers()
|
||||
.Where(p => p != null && p.IsValid && !p.IsHLTV)
|
||||
.Where(p =>
|
||||
|
|
@ -501,6 +532,7 @@ namespace src.player
|
|||
}
|
||||
|
||||
PickContext? pickContext = null;
|
||||
int assigned = 0;
|
||||
|
||||
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);
|
||||
UpdateSkillHudExpired(skillPlayer, randomSkill.Skill);
|
||||
assigned++;
|
||||
|
||||
if (randomSkill.Display)
|
||||
Instance?.AddTimer(.6f, () =>
|
||||
|
|
@ -626,6 +659,20 @@ namespace src.player
|
|||
}
|
||||
|
||||
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];
|
||||
skillList.RemoveAll(s => s?.Skill == Skills.None);
|
||||
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)
|
||||
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.Modules.Cvars;
|
||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
||||
|
|
@ -53,6 +53,7 @@ namespace src.player.skills
|
|||
if (SkillPlayerInfo.IsEmpty) return;
|
||||
|
||||
float cooldown = SkillsInfo.GetValue<float>(skillName, "cooldown");
|
||||
bool freezeTime = SkillUtils.IsFreezeTime();
|
||||
|
||||
foreach (var player in PlayerManager.GetTickPlayers())
|
||||
{
|
||||
|
|
@ -67,7 +68,7 @@ namespace src.player.skills
|
|||
var buttons = player.Buttons;
|
||||
bool isAttack2 = (buttons & PlayerButtons.Attack2) != 0;
|
||||
|
||||
if (skillInfo.CanUse && isAttack2)
|
||||
if (skillInfo.CanUse && isAttack2 && !freezeTime)
|
||||
{
|
||||
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)
|
||||
{
|
||||
if (invisiblePlayers.IsEmpty) return;
|
||||
|
|
|
|||
|
|
@ -211,7 +211,7 @@ namespace src.player.skills
|
|||
targetToPlayer.TryRemove(targetIndex, out _);
|
||||
|
||||
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"));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -294,6 +294,8 @@ namespace src.player.skills
|
|||
|
||||
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)
|
||||
return;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Timers;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
|
|
@ -150,7 +150,7 @@ namespace src.player.skills
|
|||
if (target != null && target.IsValid)
|
||||
{
|
||||
SetUpPostProcessing(target, true);
|
||||
if (target.PawnIsAlive && !SkillUtils.IsFreezeTime())
|
||||
if (target.PawnIsAlive)
|
||||
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("darkness_disable_info"));
|
||||
}
|
||||
playersInDark.TryRemove(targetIndex, out _);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.UserMessages;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
|
|
@ -139,7 +139,7 @@ namespace src.player.skills
|
|||
deafPlayers.TryRemove(targetIndex, out _);
|
||||
|
||||
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"));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using src.utils;
|
||||
|
|
@ -139,7 +139,7 @@ namespace src.player.skills
|
|||
cursedPlayers.TryRemove(targetIndex, out _);
|
||||
|
||||
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"));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Cvars;
|
||||
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||
|
|
@ -171,6 +171,8 @@ namespace src.player.skills
|
|||
|
||||
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 (HandleBarrelHit(damagedEntity)) return;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
|
|
@ -121,6 +121,8 @@ namespace src.player.skills
|
|||
|
||||
public static void BulletImpact(EventBulletImpact @event)
|
||||
{
|
||||
if (SkillsInfo.GetValue<bool>(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return;
|
||||
|
||||
var player = PlayerManager.GetPlayerEvent(@event.Userid);
|
||||
if (player == null || !player.IsValid) return;
|
||||
|
||||
|
|
|
|||
|
|
@ -85,17 +85,38 @@ namespace src.player.skills
|
|||
|
||||
private static void ChangeCamera(CCSPlayerController player, bool forceToDefault = false)
|
||||
{
|
||||
uint orginalCameraRaw;
|
||||
uint newCameraRaw;
|
||||
var pawn = player.PlayerPawn.Value;
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
@ -108,7 +129,7 @@ namespace src.player.skills
|
|||
if (newCameraRaw == 0)
|
||||
return;
|
||||
|
||||
bool defaultCam = forceToDefault || (pawn.CameraServices.ViewEntity.Raw != orginalCameraRaw);
|
||||
bool defaultCam = pawn.CameraServices.ViewEntity.Raw != orginalCameraRaw;
|
||||
pawn!.CameraServices!.ViewEntity.Raw = defaultCam ? orginalCameraRaw : newCameraRaw;
|
||||
Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices");
|
||||
BlockWeapon(player, !defaultCam);
|
||||
|
|
|
|||
|
|
@ -143,6 +143,8 @@ namespace src.player.skills
|
|||
|
||||
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)
|
||||
return;
|
||||
|
||||
|
|
|
|||
|
|
@ -58,6 +58,11 @@ namespace src.player.skills
|
|||
SetWeaponAttack(player!, true);
|
||||
}
|
||||
|
||||
public static void RevealOnDeath(uint playerIndex)
|
||||
{
|
||||
invisiblePlayers.TryRemove(playerIndex, out _);
|
||||
}
|
||||
|
||||
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
|
||||
{
|
||||
if (invisiblePlayers.IsEmpty) return;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using src.utils;
|
||||
|
|
@ -194,7 +194,7 @@ namespace src.player.skills
|
|||
if (!notify) return;
|
||||
|
||||
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"));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using src.utils;
|
||||
|
|
@ -148,7 +148,7 @@ namespace src.player.skills
|
|||
if (target != null && target.IsValid)
|
||||
{
|
||||
SkillUtils.SetRadarDisabled(target, ownerTag, false);
|
||||
if (target.PawnIsAlive && !SkillUtils.IsFreezeTime())
|
||||
if (target.PawnIsAlive)
|
||||
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("glitch_disable_info"));
|
||||
}
|
||||
glitchedPlayers.TryRemove(targetIndex, out _);
|
||||
|
|
|
|||
|
|
@ -331,6 +331,8 @@ namespace src.player.skills
|
|||
|
||||
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;
|
||||
|
||||
|
|
|
|||
|
|
@ -185,6 +185,8 @@ namespace src.player.skills
|
|||
|
||||
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)
|
||||
return;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using src.utils;
|
||||
|
|
@ -166,7 +166,7 @@ namespace src.player.skills
|
|||
SetCrosshair(target1, true);
|
||||
SetCrosshair(target2, true);
|
||||
|
||||
if (target1.PawnIsAlive && !SkillUtils.IsFreezeTime())
|
||||
if (target1.PawnIsAlive)
|
||||
target1.PrintToChat($" {ChatColors.Green}" + target1.GetTranslation("jammer_disable_info"));
|
||||
}
|
||||
jammedPlayers.TryRemove(targetIndex, out _);
|
||||
|
|
|
|||
|
|
@ -135,7 +135,7 @@ namespace src.player.skills
|
|||
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
|
||||
if (target != null && target.IsValid)
|
||||
{
|
||||
if (target.PawnIsAlive && !SkillUtils.IsFreezeTime())
|
||||
if (target.PawnIsAlive)
|
||||
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("jetkick_disable_info"));
|
||||
}
|
||||
targetedPlayers.TryRemove(targetIndex, out _);
|
||||
|
|
|
|||
|
|
@ -41,9 +41,16 @@ namespace src.player.skills
|
|||
var player = PlayerManager.GetPlayerEvent(@event.Userid);
|
||||
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) 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()
|
||||
{
|
||||
if (bannedPlayers.IsEmpty) return;
|
||||
|
|
@ -59,8 +66,8 @@ namespace src.player.skills
|
|||
var pawn = player.PlayerPawn.Value;
|
||||
if (pawn == null || !pawn.IsValid) continue;
|
||||
|
||||
if (time > Server.TickCount)
|
||||
pawn.AbsVelocity.Z = -100;
|
||||
if (time > Server.TickCount && pawn.AbsVelocity != null && pawn.AbsVelocity.Z > -300)
|
||||
pawn.AbsVelocity.Z = -300;
|
||||
}
|
||||
|
||||
if (Server.TickCount % 32 != 0) return;
|
||||
|
|
@ -149,7 +156,7 @@ namespace src.player.skills
|
|||
bannedPlayers.TryRemove(targetIndex, out _);
|
||||
|
||||
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"));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using src.utils;
|
||||
|
|
@ -153,7 +153,7 @@ namespace src.player.skills
|
|||
cursedPlayers.TryRemove(targetIndex, out _);
|
||||
|
||||
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"));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using src.utils;
|
||||
|
|
@ -168,7 +168,7 @@ namespace src.player.skills
|
|||
Utilities.SetStateChanged(target, "CBasePlayerController", "m_iDesiredFOV");
|
||||
}
|
||||
|
||||
if (target.PawnIsAlive && !SkillUtils.IsFreezeTime())
|
||||
if (target.PawnIsAlive)
|
||||
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("magnifier_disable_info"));
|
||||
}
|
||||
playersWithFov.TryRemove(targetIndex, out _);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
|
|
@ -147,7 +147,7 @@ namespace src.player.skills
|
|||
RemoveVolume(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"));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,11 @@ namespace src.player.skills
|
|||
UpdateNinja(player);
|
||||
}
|
||||
|
||||
public static void RevealOnDeath(uint playerIndex)
|
||||
{
|
||||
invisiblePlayers.TryRemove(playerIndex, out _);
|
||||
}
|
||||
|
||||
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
|
||||
{
|
||||
if (invisiblePlayers.IsEmpty) return;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using jRandomSkills.src.utils;
|
||||
|
|
@ -171,7 +171,7 @@ namespace src.player.skills
|
|||
targetToPlayer.TryRemove(targetIndex, out _);
|
||||
|
||||
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"));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using System.Collections.Concurrent;
|
||||
|
|
@ -142,7 +142,7 @@ namespace src.player.skills
|
|||
bannedPlayers.TryRemove(targetIndex, out _);
|
||||
|
||||
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"));
|
||||
SetWeaponAttack(target, false);
|
||||
|
|
|
|||
|
|
@ -138,6 +138,8 @@ namespace src.player.skills
|
|||
|
||||
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)
|
||||
return;
|
||||
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ namespace src.player.skills
|
|||
|
||||
List<CCSPlayerController> allowed = [];
|
||||
|
||||
if (emitter != null)
|
||||
if (emitter != null && CanEmit(emitter, out _))
|
||||
foreach (var recipient in um.Recipients)
|
||||
{
|
||||
if (recipient == null || !recipient.IsValid) continue;
|
||||
|
|
@ -110,23 +110,47 @@ namespace src.player.skills
|
|||
|
||||
float volume = SkillsInfo.GetValue<float>(skillName, "soundVolume");
|
||||
|
||||
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))
|
||||
foreach (var player in PlayerManager.GetTickPlayers())
|
||||
{
|
||||
if (!CanEmit(player, out var pawn)) continue;
|
||||
|
||||
var entities = EntityManager.GetPlayerEntities(player.Index, "empty_prop");
|
||||
|
||||
if (entities.Count == 0)
|
||||
{
|
||||
player.PlayerPawn.Value!.EmitSound(soundEventName, volume: volume);
|
||||
pawn!.EmitSound(soundEventName, volume: volume);
|
||||
continue;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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 float SoundVolume { get; set; } = soundVolume;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using src.utils;
|
||||
|
|
@ -59,7 +59,7 @@ namespace src.player.skills
|
|||
infectedPlayers.TryRemove(targetIndex, out _);
|
||||
|
||||
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")}");
|
||||
}
|
||||
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue