v1.1.9 BETA

This commit is contained in:
Juzlus 2025-10-16 19:12:57 +02:00
parent d68896f181
commit 4c333f5d15
31 changed files with 182 additions and 149 deletions

View file

@ -29,7 +29,7 @@ namespace src.player.skills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
if (playerInfo.SkillChance == 1)
if (playerInfo.SkillUsed)
{
player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_used_info")}");
return;
@ -45,7 +45,7 @@ namespace src.player.skills
if (bombTargets.Length == 2)
{
bombTargets[site].AcceptInput("Disable");
playerInfo.SkillChance = 1;
playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}{player.GetTranslation("areareaper_site_disabled", (site == 0 ? 'A' : 'B'))}");
}
else
@ -56,7 +56,7 @@ namespace src.player.skills
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return;
playerInfo.SkillChance = 0;
playerInfo.SkillUsed = false;
SkillUtils.CreateMenu(player, [(player.GetTranslation("bombsite_a"), "a")], (player.GetTranslation("bombsite_b"), "b"));
}

View file

@ -44,7 +44,7 @@ namespace src.player.skills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
if (playerInfo.SkillChance == 1)
if (playerInfo.SkillUsed)
{
player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_used_info")}");
return;
@ -60,7 +60,7 @@ namespace src.player.skills
}
ResetMoney(enemy);
playerInfo.SkillChance = 1;
playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("bankrupt_player_info", enemy.PlayerName));
enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("bankrupt_enemy_info"));
}
@ -69,7 +69,7 @@ namespace src.player.skills
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return;
playerInfo.SkillChance = 0;
playerInfo.SkillUsed = false;
var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
if (enemies.Length > 0)

View file

@ -63,7 +63,7 @@ namespace src.player.skills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
if (playerInfo.SkillChance == 1)
if (playerInfo.SkillUsed)
{
player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_used_info")}");
return;
@ -79,7 +79,7 @@ namespace src.player.skills
}
SetUpPostProcessing(enemy);
playerInfo.SkillChance = 1;
playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("darkness_player_info", enemy.PlayerName));
enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("darkness_enemy_info"));
}
@ -88,7 +88,7 @@ namespace src.player.skills
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return;
playerInfo.SkillChance = 0;
playerInfo.SkillUsed = false;
var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
if (enemies.Length > 0)

View file

@ -55,7 +55,7 @@ namespace src.player.skills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
if (playerInfo.SkillChance == 1)
if (playerInfo.SkillUsed)
{
player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_used_info")}");
return;
@ -71,7 +71,7 @@ namespace src.player.skills
}
deafPlayers.TryAdd(enemy, 0);
playerInfo.SkillChance = 1;
playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("deaf_player_info", enemy.PlayerName));
enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("deaf_enemy_info"));
}
@ -80,7 +80,7 @@ namespace src.player.skills
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return;
playerInfo.SkillChance = 0;
playerInfo.SkillUsed = false;
var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
if (enemies.Length > 0)

View file

@ -29,11 +29,11 @@ namespace src.player.skills
foreach (var player in distancerPlayers.Keys)
{
var playerInfo = jRandomSkills.Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID);
if (playerInfo == null) return;
if (playerInfo == null) continue;
var playerPawn = player.PlayerPawn.Value;
if (playerPawn == null || !playerPawn.IsValid) return;
if (playerPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) return;
if (playerPawn == null || !playerPawn.IsValid) continue;
if (playerPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) continue;
string closetEnemy = "Bot";
double closetDistance = double.MaxValue;

View file

@ -106,9 +106,14 @@ namespace src.player.skills
if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return 0;
Vector pos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + SkillsInfo.GetValue<float>(skillName, "distance"));
camera.Render = Color.FromArgb(0, 255, 255, 255);
camera.Teleport(pos, new QAngle(90, 0, 0));
camera.DispatchSpawn();
Server.NextFrame(() =>
{
camera.SetModel("models/actors/ghost_speaker.vmdl");
camera.Render = Color.FromArgb(0, 255, 255, 255);
camera.Teleport(pos, new QAngle(90, 0, 0));
camera.DispatchSpawn();
});
cameras.AddOrUpdate(player.SteamID, (pawn.CameraServices!.ViewEntity.Raw, camera), (k, v) => (pawn.CameraServices!.ViewEntity.Raw, camera));
return camera.EntityHandle.Raw;
}

View file

@ -28,7 +28,7 @@ namespace src.player.skills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
if (playerInfo.SkillChance == 1)
if (playerInfo.SkillUsed)
{
player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_used_info")}");
return;
@ -48,7 +48,7 @@ namespace src.player.skills
playerInfo.Skill = skill.Skill;
if (skill.Skill != skillName)
playerInfo.SpecialSkill = skillName;
playerInfo.SkillChance = 1;
playerInfo.SkillUsed = true;
if (SkillsInfo.GetValue<bool>(skill.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime())
Instance?.AddTimer(Math.Max((float)(Event.GetFreezeTimeEnd() - DateTime.Now).TotalSeconds, 0), () => {
@ -72,7 +72,7 @@ namespace src.player.skills
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return;
playerInfo.SkillChance = 0;
playerInfo.SkillUsed = false;
var skills = GetSkills(player);
var firstSkill = skills[Instance.Random.Next(skills.Count)];

View file

@ -57,7 +57,7 @@ namespace src.player.skills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
if (playerInfo.SkillChance == 1)
if (playerInfo.SkillUsed)
{
player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_used_info")}");
return;
@ -74,7 +74,7 @@ namespace src.player.skills
glitchedPlayers.TryAdd(enemy, 0);
enemy.ReplicateConVar("sv_disable_radar", "1");
playerInfo.SkillChance = 1;
playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("glitch_player_info", enemy.PlayerName));
enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("glitch_enemy_info"));
}
@ -83,7 +83,7 @@ namespace src.player.skills
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return;
playerInfo.SkillChance = 0;
playerInfo.SkillUsed = false;
var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
if (enemies.Length > 0)

View file

@ -2,7 +2,6 @@
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes;
using CounterStrikeSharp.API.Modules.Utils;
using System.Drawing;
using static src.jRandomSkills;
using System.Collections.Concurrent;
using src.utils;
@ -14,10 +13,12 @@ namespace src.player.skills
private const Skills skillName = Skills.Jackal;
private static readonly ConcurrentDictionary<ulong, byte> playersInAction = [];
private static readonly ConcurrentDictionary<CCSPlayerController, ConcurrentQueue<CBeam>> stepBeams = [];
private static readonly string particleName = "particles/ui/hud/ui_map_def_utility_trail.vpcf";
public static void LoadSkill()
{
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
Instance.RegisterListener<Listeners.OnServerPrecacheResources>((ResourceManifest manifest) => manifest.AddResource(particleName));
}
public static void NewRound()
@ -30,38 +31,6 @@ namespace src.player.skills
playersInAction.Clear();
}
public static void OnTick()
{
if (Server.TickCount % 8 != 0) return;
foreach (var step in stepBeams.ToList())
{
var player = step.Key;
if (!player.IsValid)
{
stepBeams.TryRemove(player, out _);
continue;
}
var pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE || pawn.AbsOrigin == null) continue;
var beams = step.Value;
Vector lastBeamVector = (beams != null && beams.Count > 0 && beams.Last() != null)
? beams.Last().EndPos : pawn.AbsOrigin;
var newBeam = CreateBeamStep(step.Key.Team, lastBeamVector, pawn.AbsOrigin);
if (newBeam != null)
step.Value.Enqueue(newBeam);
if (beams?.Count >= SkillsInfo.GetValue<int>(skillName, "maxStepBeam"))
{
if (beams.TryPeek(out var beam))
beam.AcceptInput("Kill");
step.Value.TryDequeue(out _);
}
}
}
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
{
foreach( var (info, player) in infoList)
@ -85,23 +54,27 @@ namespace src.player.skills
}
}
public static CBeam? CreateBeamStep(CsTeam team, Vector start, Vector stop)
public static void CreatePlayerTrail(CCSPlayerPawn playerPawn)
{
CBeam beam = Utilities.CreateEntityByName<CBeam>("beam")!;
if (beam == null) return null;
if (playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null) return;
beam.DispatchSpawn();
if (!beam.IsValid) return null;
CParticleSystem particle = Utilities.CreateEntityByName<CParticleSystem>("info_particle_system")!;
if (particle == null) return;
beam.Render = team == CsTeam.Terrorist ? Color.FromArgb(100, 255, 165, 0) : Color.FromArgb(100, 173, 216, 230);
beam.Width = 2.0f;
beam.EndWidth = 2.0f;
beam.Teleport(start);
particle.EffectName = particleName;
particle.StartActive = true;
beam.EndPos.X = stop.X;
beam.EndPos.Y = stop.Y;
beam.EndPos.Z = stop.Z;
return beam;
particle.Teleport(playerPawn.AbsOrigin);
particle.DispatchSpawn();
particle.AcceptInput("SetParent", playerPawn, particle, "!activator");
particle.AcceptInput("Start");
Instance.AddTimer(3f, () => {
if (particle != null && particle.IsValid)
particle.AcceptInput("Kill");
CreatePlayerTrail(playerPawn);
});
}
public static void EnableSkill(CCSPlayerController player)
@ -110,7 +83,10 @@ namespace src.player.skills
playersInAction.TryAdd(player.SteamID, 0);
foreach (var _player in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && p.PawnIsAlive && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist))
if (!stepBeams.ContainsKey(_player))
{
stepBeams.TryAdd(_player, []);
CreatePlayerTrail(player.PlayerPawn.Value);
}
}
public static void DisableSkill(CCSPlayerController player)

View file

@ -52,7 +52,7 @@ namespace src.player.skills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
if (playerInfo.SkillChance == 1)
if (playerInfo.SkillUsed)
{
player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_used_info")}");
return;
@ -69,7 +69,7 @@ namespace src.player.skills
jammedPlayers.TryAdd(enemy, 0);
SetCrosshair(enemy, false);
playerInfo.SkillChance = 1;
playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("jammer_player_info", enemy.PlayerName));
enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("jammer_enemy_info"));
}
@ -88,7 +88,7 @@ namespace src.player.skills
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return;
playerInfo.SkillChance = 0;
playerInfo.SkillUsed = false;
var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
if (enemies.Length > 0)

View file

@ -63,7 +63,7 @@ namespace src.player.skills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
if (playerInfo.SkillChance == 1)
if (playerInfo.SkillUsed)
{
player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_used_info")}");
return;
@ -79,7 +79,7 @@ namespace src.player.skills
}
bannedPlayers.AddOrUpdate(enemy.PlayerPawn.Value, 0, (k, v) => 0);
playerInfo.SkillChance = 1;
playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("jumpban_player_info", enemy.PlayerName));
enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("jumpban_enemy_info"));
}
@ -88,7 +88,7 @@ namespace src.player.skills
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return;
playerInfo.SkillChance = 0;
playerInfo.SkillUsed = false;
var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
if (enemies.Length > 0)

View file

@ -44,7 +44,7 @@ namespace src.player.skills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
if (playerInfo.SkillChance == 1)
if (playerInfo.SkillUsed)
{
player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_used_info")}");
return;
@ -60,7 +60,7 @@ namespace src.player.skills
}
SwapHealth(player, enemy);
playerInfo.SkillChance = 1;
playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("lifeswap_player_info", enemy.PlayerName));
enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("lifeswap_enemy_info"));
}
@ -69,7 +69,7 @@ namespace src.player.skills
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return;
playerInfo.SkillChance = 0;
playerInfo.SkillUsed = false;
var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
if (enemies.Length > 0)

View file

@ -55,7 +55,7 @@ namespace src.player.skills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
if (playerInfo.SkillChance == 1)
if (playerInfo.SkillUsed)
{
player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_used_info")}");
return;
@ -75,7 +75,7 @@ namespace src.player.skills
enemy.DesiredFOV = SkillsInfo.GetValue<uint>(skillName, "customFOV");
Utilities.SetStateChanged(enemy, "CBasePlayerController", "m_iDesiredFOV");
playerInfo.SkillChance = 1;
playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("magnifier_player_info", enemy.PlayerName));
enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("magnifier_enemy_info"));
}
@ -84,7 +84,7 @@ namespace src.player.skills
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return;
playerInfo.SkillChance = 0;
playerInfo.SkillUsed = false;
var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
if (enemies.Length > 0)

View file

@ -44,7 +44,7 @@ namespace src.player.skills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
if (playerInfo.SkillChance == 1)
if (playerInfo.SkillUsed)
{
player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_used_info")}");
return;
@ -60,7 +60,7 @@ namespace src.player.skills
}
SwapMoney(player, enemy);
playerInfo.SkillChance = 1;
playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("moneyswap_player_info", enemy.PlayerName));
enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("moneyswap_enemy_info"));
}
@ -69,7 +69,7 @@ namespace src.player.skills
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return;
playerInfo.SkillChance = 0;
playerInfo.SkillUsed = false;
var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
if (enemies.Length > 0)

View file

@ -56,7 +56,7 @@ namespace src.player.skills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
if (playerInfo.SkillChance == 1)
if (playerInfo.SkillUsed)
{
player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_used_info")}");
return;
@ -72,7 +72,7 @@ namespace src.player.skills
}
poisonedPlayers.TryAdd(enemy, 0);
playerInfo.SkillChance = 1;
playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("poison_player_info", enemy.PlayerName));
enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("poison_enemy_info"));
}
@ -81,7 +81,7 @@ namespace src.player.skills
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return;
playerInfo.SkillChance = 0;
playerInfo.SkillUsed = false;
var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
if (enemies.Length > 0)

View file

@ -64,7 +64,7 @@ namespace src.player.skills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
if (playerInfo.SkillChance == 1)
if (playerInfo.SkillUsed)
{
player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_used_info")}");
return;
@ -81,7 +81,7 @@ namespace src.player.skills
bannedPlayers.TryAdd(enemy.SteamID, 0);
CheckWeapon(enemy);
playerInfo.SkillChance = 1;
playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("primaryban_player_info", enemy.PlayerName));
enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("primaryban_enemy_info"));
}
@ -100,7 +100,7 @@ namespace src.player.skills
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return;
playerInfo.SkillChance = 0;
playerInfo.SkillUsed = false;
var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
if (enemies.Length > 0)

View file

@ -29,7 +29,6 @@ namespace src.player.skills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return;
AddMoney(player, -(int)(playerInfo.SkillChance ?? 0));
playerInfo.SkillChance = 0;
}
private static void AddMoney(CCSPlayerController player, int money)

View file

@ -104,10 +104,14 @@ namespace src.player.skills
var pos = pawn.AbsOrigin - SkillUtils.GetForwardVector(pawn.EyeAngles) * SkillsInfo.GetValue<float>(skillName, "distance");
pos.Z += pawn.ViewOffset.Z;
camera.Render = Color.FromArgb(0, 255, 255, 255);
camera.Teleport(pos, new QAngle(0, pawn.EyeAngles.Y, 0));
camera.DispatchSpawn();
camera.AcceptInput("SetParent", pawn, pawn, "!activator");
Server.NextFrame(() =>
{
camera.SetModel("models/actors/ghost_speaker.vmdl");
camera.Render = Color.FromArgb(0, 255, 255, 255);
camera.Teleport(pos, new QAngle(0, pawn.EyeAngles.Y, 0));
camera.DispatchSpawn();
camera.AcceptInput("SetParent", pawn, pawn, "!activator");
});
if (cameras.TryGetValue(player.SteamID, out var cameraInfo))
cameras.AddOrUpdate(player.SteamID, (cameraInfo.Item1, camera, pawn), (k, v) => (cameraInfo.Item1, camera, pawn));

View file

@ -70,7 +70,8 @@ namespace src.player.skills
{
orginalCameraRaw = cameraInfo.Item1;
newCameraRaw = cameraInfo.Item2.EntityHandle.Raw;
} else
}
else
{
orginalCameraRaw = pawn!.CameraServices!.ViewEntity.Raw;
newCameraRaw = CreateCamera(player);
@ -95,11 +96,15 @@ namespace src.player.skills
if (camera == null || !camera.IsValid) return 0;
var pawn = player.PlayerPawn.Value;
camera.Render = Color.FromArgb(0, 255, 255, 255);
camera.Teleport(pawn!.AbsOrigin, pawn.EyeAngles);
camera.DispatchSpawn();
Server.NextFrame(() =>
{
camera.SetModel("models/actors/ghost_speaker.vmdl");
camera.Render = Color.FromArgb(0, 255, 255, 255);
camera.Teleport(pawn!.AbsOrigin, pawn.EyeAngles);
camera.DispatchSpawn();
});
cameras.AddOrUpdate(player.SteamID, (pawn.CameraServices!.ViewEntity.Raw, camera), (v,k) => (pawn.CameraServices!.ViewEntity.Raw, camera));
cameras.AddOrUpdate(player.SteamID, (pawn.CameraServices!.ViewEntity.Raw, camera), (v, k) => (pawn.CameraServices!.ViewEntity.Raw, camera));
return camera.EntityHandle.Raw;
}