This commit is contained in:
Juzlus 2025-09-24 05:31:41 +02:00
parent ac53655184
commit e5ead42dfa
34 changed files with 953 additions and 1333 deletions

View file

@ -56,7 +56,7 @@ namespace src
internal void SkillAction(string skill, string methodName, object[]? param = null) internal void SkillAction(string skill, string methodName, object[]? param = null)
{ {
string className = $"jRandomSkills.{skill}"; string className = $"src.player.skills.{skill}";
Type? type = Type.GetType(className); Type? type = Type.GetType(className);
if (type != null && typeof(ISkill).IsAssignableFrom(type)) if (type != null && typeof(ISkill).IsAssignableFrom(type))

View file

@ -345,7 +345,8 @@
"secondlife_desc": "After death, you respawn with the same amount of health", "secondlife_desc": "After death, you respawn with the same amount of health",
"shade": "Shade", "shade": "Shade",
"shade_desc": "You teleport behind the back of a hit enemy", "shade_desc": "You have a random chance to teleport behind the back of a hit enemy",
"shade_desc2": "Your chances of teleporting behind a hit enemy are: {0}%",
"shade_nospace": "No space available", "shade_nospace": "No space available",
"shortbomb": "Short Fuse", "shortbomb": "Short Fuse",

View file

@ -346,6 +346,7 @@
"shade": "Ombre", "shade": "Ombre",
"shade_desc": "Vous vous téléportez derrière l’ennemi touché", "shade_desc": "Vous vous téléportez derrière l’ennemi touché",
"shade_desc2": "Vos chances de vous téléporter derrière un ennemi touché sont de: {0}%",
"shade_nospace": "Aucun espace disponible", "shade_nospace": "Aucun espace disponible",
"shortbomb": "Mèche Courte", "shortbomb": "Mèche Courte",

View file

@ -345,7 +345,8 @@
"secondlife_desc": "Po śmierci odradzasz się z taką samą ilością zdrowia", "secondlife_desc": "Po śmierci odradzasz się z taką samą ilością zdrowia",
"shade": "Cień", "shade": "Cień",
"shade_desc": "Teleportujesz się za plecy trafionego wroga", "shade_desc": "Masz losową szansę na teleportację za plecy trafionego wroga",
"shade_desc2": "Twoje szanse na teleportację za trafionego wroga wynoszą: {0}%",
"shade_nospace": "Brak miejsca", "shade_nospace": "Brak miejsca",
"shortbomb": "Krótka Bomba", "shortbomb": "Krótka Bomba",

View file

@ -345,7 +345,8 @@
"secondlife_desc": "Após a morte, você renasce com a mesma quantidade de saúde", "secondlife_desc": "Após a morte, você renasce com a mesma quantidade de saúde",
"shade": "Sombra", "shade": "Sombra",
"shade_desc": "Você se teletransporta para trás de um inimigo acertado", "shade_desc": "Você tem uma chance aleatória de se teletransportar para trás de um inimigo atingido",
"shade_desc2": "Suas chances de se teletransportar para trás de um inimigo atingido são: {0}%",
"shade_nospace": "Sem espaço disponível", "shade_nospace": "Sem espaço disponível",
"shortbomb": "Fusível Curto", "shortbomb": "Fusível Curto",

View file

@ -345,7 +345,8 @@
"secondlife_desc": "死亡后你会以相同生命值复活", "secondlife_desc": "死亡后你会以相同生命值复活",
"shade": "阴影", "shade": "阴影",
"shade_desc": "你会传送到被击中敌人的背后", "shade_desc": "你存在随机几率将被击中的敌人传送至其身后",
"shade_desc2": "你传送至击中敌人身后的概率为:{0}%",
"shade_nospace": "无可用空间", "shade_nospace": "无可用空间",
"shortbomb": "短引信", "shortbomb": "短引信",

View file

@ -2,7 +2,6 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using static src.jRandomSkills; using static src.jRandomSkills;
using System.Collections.Concurrent;
using src.utils; using src.utils;
namespace src.player.skills namespace src.player.skills
@ -58,9 +57,7 @@ namespace src.player.skills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return; if (playerInfo == null) return;
playerInfo.SkillChance = 0; playerInfo.SkillChance = 0;
SkillUtils.CreateMenu(player, [(player.GetTranslation("bombsite_a"), "a")], (player.GetTranslation("bombsite_b"), "b"));
ConcurrentBag<(string, string)> menuItems = [(player.GetTranslation("bombsite_a"), "a"), (player.GetTranslation("bombsite_b"), "b")];
SkillUtils.CreateMenu(player, menuItems);
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)

View file

@ -33,7 +33,6 @@ namespace src.player.skills
if (playerInfo == null) return; if (playerInfo == null) return;
player.PlayerPawn.Value.ActualGravityScale = 1; player.PlayerPawn.Value.ActualGravityScale = 1;
playerInfo.SkillChance = 1;
} }
private static void ApplyGravityModifier(CCSPlayerController player) private static void ApplyGravityModifier(CCSPlayerController player)

View file

@ -33,8 +33,6 @@ namespace src.player.skills
if (playerInfo == null) return; if (playerInfo == null) return;
float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue<float>(skillName, "ChanceTo") - SkillsInfo.GetValue<float>(skillName, "ChanceFrom")) + SkillsInfo.GetValue<float>(skillName, "ChanceFrom"); float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue<float>(skillName, "ChanceTo") - SkillsInfo.GetValue<float>(skillName, "ChanceFrom")) + SkillsInfo.GetValue<float>(skillName, "ChanceFrom");
playerInfo.SkillChance = newChance; playerInfo.SkillChance = newChance;
newChance = (float)Math.Round(newChance, 2) * 100;
newChance = (float)Math.Round(newChance);
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", false); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", false);
} }

View file

@ -37,8 +37,6 @@ namespace src.player.skills
if (playerInfo == null) return; if (playerInfo == null) return;
float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue<float>(skillName, "chanceTo") - SkillsInfo.GetValue<float>(skillName, "chanceFrom")) + SkillsInfo.GetValue<float>(skillName, "chanceFrom"); float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue<float>(skillName, "chanceTo") - SkillsInfo.GetValue<float>(skillName, "chanceFrom")) + SkillsInfo.GetValue<float>(skillName, "chanceFrom");
playerInfo.SkillChance = newChance; playerInfo.SkillChance = newChance;
newChance = (float)Math.Round(newChance, 2) * 100;
newChance = (float)Math.Round(newChance);
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", false); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", false);
} }

View file

@ -22,6 +22,9 @@ namespace src.player.skills
"weapon_negev" "weapon_negev"
]; ];
private static readonly ConcurrentDictionary<CCSPlayerController, CBaseModelEntity> chickens = []; private static readonly ConcurrentDictionary<CCSPlayerController, CBaseModelEntity> chickens = [];
private static readonly string defaultCTModel = "characters/models/ctm_sas/ctm_sas.vmdl";
private static readonly string defaultTModel = "characters/models/tm_phoenix/tm_phoenix.vmdl";
private static readonly ConcurrentDictionary<ulong, string> originalModels = [];
public static void LoadSkill() public static void LoadSkill()
{ {
@ -36,6 +39,7 @@ namespace src.player.skills
if (valuePair.Value != null && valuePair.Value.IsValid) if (valuePair.Value != null && valuePair.Value.IsValid)
valuePair.Value.AcceptInput("Kill"); valuePair.Value.AcceptInput("Kill");
chickens.Clear(); chickens.Clear();
originalModels.Clear();
} }
public static void WeaponPickup(EventItemPickup @event) public static void WeaponPickup(EventItemPickup @event)
@ -61,9 +65,12 @@ namespace src.player.skills
SkillUtils.ChangePlayerScale(player, .2f); SkillUtils.ChangePlayerScale(player, .2f);
playerPawn.Render = Color.FromArgb(0, 255, 255, 255); playerPawn.Render = Color.FromArgb(0, 255, 255, 255);
playerPawn.ShadowStrength = 0.0f; playerPawn.ShadowStrength = 0f;
Utilities.SetStateChanged(playerPawn, "CBaseModelEntity", "m_clrRender"); Utilities.SetStateChanged(playerPawn, "CBaseModelEntity", "m_clrRender");
if (playerPawn.CBodyComponent != null && playerPawn.CBodyComponent.SceneNode != null)
originalModels.TryAdd(player.SteamID, playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().ModelState.ModelName);
SetWeaponAttack(player, true); SetWeaponAttack(player, true);
CreateChicken(player); CreateChicken(player);
} }
@ -77,7 +84,7 @@ namespace src.player.skills
{ {
playerPawn.VelocityModifier = 1f; playerPawn.VelocityModifier = 1f;
playerPawn.Health += 50; playerPawn.Health = Math.Min(playerPawn.Health + 50, 100);
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth"); Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth");
SkillUtils.ChangePlayerScale(player, 1); SkillUtils.ChangePlayerScale(player, 1);
@ -95,6 +102,23 @@ namespace src.player.skills
chicken.AcceptInput("Kill"); chicken.AcceptInput("Kill");
chickens.TryRemove(player, out _); chickens.TryRemove(player, out _);
} }
if (originalModels.TryGetValue(player.SteamID, out var model))
{
var pawn = player.PlayerPawn?.Value;
if (pawn == null) return;
Server.NextFrame(() =>
{
if (string.IsNullOrEmpty(model))
model = player.Team == CsTeam.Terrorist ? defaultTModel : defaultCTModel;
pawn.SetModel(model);
var originalRender = pawn.Render;
pawn.Render = Color.FromArgb(255, originalRender.R, originalRender.G, originalRender.B);
originalModels.TryRemove(player.SteamID, out _);
});
}
} }
private static void SetWeaponAttack(CCSPlayerController player, bool disableWeapon) private static void SetWeaponAttack(CCSPlayerController player, bool disableWeapon)

View file

@ -94,8 +94,8 @@ namespace src.player.skills
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
deafPlayers.TryRemove(player, out _);
SkillUtils.CloseMenu(player); SkillUtils.CloseMenu(player);
deafPlayers.TryRemove(player, out _);
} }
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#dae01f", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates) public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#dae01f", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates)

View file

@ -42,8 +42,6 @@ namespace src.player.skills
if (playerInfo == null) return; if (playerInfo == null) return;
float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue<float>(skillName, "chanceTo") - SkillsInfo.GetValue<float>(skillName, "chanceFrom")) + SkillsInfo.GetValue<float>(skillName, "chanceFrom"); float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue<float>(skillName, "chanceTo") - SkillsInfo.GetValue<float>(skillName, "chanceFrom")) + SkillsInfo.GetValue<float>(skillName, "chanceFrom");
playerInfo.SkillChance = newChance; playerInfo.SkillChance = newChance;
newChance = (float)Math.Round(newChance, 2) * 100;
newChance = (float)Math.Round(newChance);
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", false); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", false);
} }

View file

@ -31,12 +31,6 @@ namespace src.player.skills
var playerInfo = jRandomSkills.Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); var playerInfo = jRandomSkills.Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID);
if (playerInfo == null) return; if (playerInfo == null) return;
if (playerInfo.SkillDescriptionHudExpired >= DateTime.Now)
{
playerInfo.PrintHTML = null;
return;
}
var playerPawn = player.PlayerPawn.Value; var playerPawn = player.PlayerPawn.Value;
if (playerPawn == null || !playerPawn.IsValid) return; if (playerPawn == null || !playerPawn.IsValid) return;
if (playerPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; if (playerPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) return;

View file

@ -49,7 +49,6 @@ namespace src.player.skills
var playerPawn = player.PlayerPawn?.Value; var playerPawn = player.PlayerPawn?.Value;
if (playerPawn != null && playerPawn?.CBodyComponent != null) if (playerPawn != null && playerPawn?.CBodyComponent != null)
{ {
playerInfo.SkillChance = 1;
SkillUtils.ChangePlayerScale(player, 1); SkillUtils.ChangePlayerScale(player, 1);
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent"); Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent");
} }

View file

@ -26,8 +26,6 @@ namespace src.player.skills
if (playerInfo == null) return; if (playerInfo == null) return;
float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue<float>(skillName, "ChanceTo") - SkillsInfo.GetValue<float>(skillName, "ChanceFrom")) + SkillsInfo.GetValue<float>(skillName, "ChanceFrom"); float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue<float>(skillName, "ChanceTo") - SkillsInfo.GetValue<float>(skillName, "ChanceFrom")) + SkillsInfo.GetValue<float>(skillName, "ChanceFrom");
playerInfo.SkillChance = newChance; playerInfo.SkillChance = newChance;
newChance = (float)Math.Round(newChance, 2) * 100;
newChance = (float)Math.Round(newChance);
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", false); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", false);
} }

View file

@ -1,3 +1,4 @@
using System.Collections.Concurrent;
using System.Drawing; using System.Drawing;
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
@ -11,22 +12,33 @@ namespace src.player.skills
{ {
private const Skills skillName = Skills.Impostor; private const Skills skillName = Skills.Impostor;
private static readonly string defaultCTModel = "characters/models/ctm_sas/ctm_sas.vmdl"; private static readonly string defaultCTModel = "characters/models/ctm_sas/ctm_sas.vmdl";
private static readonly string defaultTModel = "characters/models/tm_phoenix_heavy/tm_phoenix_heavy.vmdl"; private static readonly string defaultTModel = "characters/models/tm_phoenix/tm_phoenix.vmdl";
private static readonly ConcurrentDictionary<ulong, string> originalModels = [];
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
} }
public static void NewRound()
{
originalModels.Clear();
}
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
{ {
string model = GetEnemyModel(player); string model = GetEnemyModel(player);
if (player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid && player.PlayerPawn.Value.CBodyComponent != null && player.PlayerPawn.Value.CBodyComponent.SceneNode != null)
originalModels.TryAdd(player.SteamID, player.PlayerPawn.Value.CBodyComponent.SceneNode.GetSkeletonInstance().ModelState.ModelName);
SetPlayerModel(player, model); SetPlayerModel(player, model);
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
SetPlayerModel(player, player.Team == CsTeam.Terrorist ? defaultTModel : defaultCTModel); var model = originalModels.TryGetValue(player.SteamID, out var originalModel) && !string.IsNullOrEmpty(originalModel) ? originalModel :
player.Team == CsTeam.Terrorist ? defaultTModel : defaultCTModel;
SetPlayerModel(player, model);
originalModels.TryRemove(player.SteamID, out _);
} }
private static string GetEnemyModel(CCSPlayerController player) private static string GetEnemyModel(CCSPlayerController player)

View file

@ -12,6 +12,7 @@ namespace src.player.skills
public class Jackal : ISkill public class Jackal : ISkill
{ {
private const Skills skillName = Skills.Jackal; private const Skills skillName = Skills.Jackal;
private static readonly ConcurrentDictionary<ulong, byte> playersInAction = [];
private static readonly ConcurrentDictionary<CCSPlayerController, ConcurrentQueue<CBeam>> stepBeams = []; private static readonly ConcurrentDictionary<CCSPlayerController, ConcurrentQueue<CBeam>> stepBeams = [];
public static void LoadSkill() public static void LoadSkill()
@ -26,6 +27,7 @@ namespace src.player.skills
if (beam != null && beam.IsValid) if (beam != null && beam.IsValid)
beam.AcceptInput("Kill"); beam.AcceptInput("Kill");
stepBeams.Clear(); stepBeams.Clear();
playersInAction.Clear();
} }
public static void OnTick() public static void OnTick()
@ -102,9 +104,10 @@ namespace src.player.skills
return beam; return beam;
} }
public static void EnableSkill(CCSPlayerController _) public static void EnableSkill(CCSPlayerController player)
{ {
Event.EnableTransmit(); Event.EnableTransmit();
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)) 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)) if (!stepBeams.ContainsKey(_player))
stepBeams.TryAdd(_player, []); stepBeams.TryAdd(_player, []);
@ -112,11 +115,8 @@ namespace src.player.skills
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); playersInAction.TryRemove(player.SteamID, out _);
if (playerInfo == null) return; if (playersInAction.IsEmpty)
playerInfo.Skill = Skills.None;
if (!Instance.SkillPlayer.Any(s => s.Skill == skillName))
NewRound(); NewRound();
} }

View file

@ -2,6 +2,7 @@ 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;
using System.Collections.Concurrent;
using System.Drawing; using System.Drawing;
using static src.jRandomSkills; using static src.jRandomSkills;
@ -12,6 +13,8 @@ namespace src.player.skills
private const Skills skillName = Skills.Jester; private const Skills skillName = Skills.Jester;
private static bool jesterMode = false; private static bool jesterMode = false;
private static bool jesterStarted = false; private static bool jesterStarted = false;
public static bool GetJesterMode() => jesterMode;
private static readonly ConcurrentBag<CCSPlayerController> jesters = [];
public static void LoadSkill() public static void LoadSkill()
{ {
@ -21,11 +24,17 @@ namespace src.player.skills
public static void NewRound() public static void NewRound()
{ {
jesterStarted = false; jesterStarted = false;
foreach (var jester in jesters)
if (jester != null && jester.IsValid)
DisableSkill(jester);
jesters.Clear();
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
SkillUtils.ResetPrintHTML(player); SkillUtils.ResetPrintHTML(player);
if (player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return;
SetPlayerColor(player.PlayerPawn.Value, true);
} }
public static void PlayerHurt(EventPlayerHurt @event) public static void PlayerHurt(EventPlayerHurt @event)
@ -35,10 +44,17 @@ namespace src.player.skills
var victim = @event.Userid; var victim = @event.Userid;
int hitgroup = @event.Hitgroup; int hitgroup = @event.Hitgroup;
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return; if (!Instance.IsPlayerValid(victim)) return;
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID);
if (!Instance.IsPlayerValid(attacker))
{
if (victimInfo?.Skill == skillName)
RestoreHealth(victim!, @event.DmgHealth);
return;
}
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
if (attackerInfo?.Skill == skillName || victimInfo?.Skill == skillName) if (attackerInfo?.Skill == skillName || victimInfo?.Skill == skillName)
RestoreHealth(victim!, @event.DmgHealth); RestoreHealth(victim!, @event.DmgHealth);
} }
@ -89,9 +105,9 @@ namespace src.player.skills
} }
} }
private static void SetPlayerColor(CCSPlayerPawn pawn) private static void SetPlayerColor(CCSPlayerPawn pawn, bool forceDisable = false)
{ {
var color = jesterMode ? Color.FromArgb(255, 128, 0, 128) : Color.FromArgb(255, 255, 255, 255); var color = jesterMode && !forceDisable ? Color.FromArgb(255, 128, 0, 128) : Color.FromArgb(255, 255, 255, 255);
pawn.Render = color; pawn.Render = color;
Utilities.SetStateChanged(pawn, "CBaseModelEntity", "m_clrRender"); Utilities.SetStateChanged(pawn, "CBaseModelEntity", "m_clrRender");
} }

View file

@ -7,6 +7,7 @@ using CS2TraceRay.Class;
using CS2TraceRay.Enum; using CS2TraceRay.Enum;
using CS2TraceRay.Struct; using CS2TraceRay.Struct;
using src.utils; using src.utils;
using System.Collections.Concurrent;
using System.Drawing; using System.Drawing;
using System.Numerics; using System.Numerics;
using static src.jRandomSkills; using static src.jRandomSkills;
@ -20,6 +21,7 @@ namespace src.player.skills
private static bool hooked = false; private static bool hooked = false;
private const int actionCode = 503; private const int actionCode = 503;
private static readonly ConcurrentDictionary<ulong, byte> playersInAction = [];
private static readonly MemoryFunctionVoid<IntPtr, short> Shoot_Secondary = new(GameData.GetSignature("Shoot_Secondary")); private static readonly MemoryFunctionVoid<IntPtr, short> Shoot_Secondary = new(GameData.GetSignature("Shoot_Secondary"));
public static void LoadSkill() public static void LoadSkill()
@ -29,23 +31,23 @@ namespace src.player.skills
public static void NewRound() public static void NewRound()
{ {
playersInAction.Clear();
hooked = false;
Shoot_Secondary.Unhook(ShootSecondary, HookMode.Pre); Shoot_Secondary.Unhook(ShootSecondary, HookMode.Pre);
} }
public static void EnableSkill(CCSPlayerController _) public static void EnableSkill(CCSPlayerController player)
{ {
if (hooked) return; if (hooked) return;
hooked = true; hooked = true;
Shoot_Secondary.Hook(ShootSecondary, HookMode.Pre); Shoot_Secondary.Hook(ShootSecondary, HookMode.Pre);
playersInAction.TryAdd(player.SteamID, 0);
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); playersInAction.TryRemove(player.SteamID, out _);
if (playerInfo == null) return; if (playersInAction.IsEmpty)
playerInfo.Skill = Skills.None;
if (!Instance.SkillPlayer.Any(p => p.Skill == skillName))
{ {
Shoot_Secondary.Unhook(ShootSecondary, HookMode.Pre); Shoot_Secondary.Unhook(ShootSecondary, HookMode.Pre);
hooked = false; hooked = false;

View file

@ -41,8 +41,6 @@ namespace src.player.skills
if (playerInfo == null) return; if (playerInfo == null) return;
float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue<float>(skillName, "ChanceTo") - SkillsInfo.GetValue<float>(skillName, "ChanceFrom")) + SkillsInfo.GetValue<float>(skillName, "ChanceFrom"); float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue<float>(skillName, "ChanceTo") - SkillsInfo.GetValue<float>(skillName, "ChanceFrom")) + SkillsInfo.GetValue<float>(skillName, "ChanceFrom");
playerInfo.SkillChance = newChance; playerInfo.SkillChance = newChance;
newChance = (float)Math.Round(newChance, 2) * 100;
newChance = (float)Math.Round(newChance);
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", false); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", false);
} }

View file

@ -37,8 +37,6 @@ namespace src.player.skills
if (playerInfo == null) return; if (playerInfo == null) return;
float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue<float>(skillName, "ChanceTo") - SkillsInfo.GetValue<float>(skillName, "ChanceFrom")) + SkillsInfo.GetValue<float>(skillName, "ChanceFrom"); float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue<float>(skillName, "ChanceTo") - SkillsInfo.GetValue<float>(skillName, "ChanceFrom")) + SkillsInfo.GetValue<float>(skillName, "ChanceFrom");
playerInfo.SkillChance = newChance; playerInfo.SkillChance = newChance;
newChance = (float)Math.Round(newChance, 2) * 100;
newChance = (float)Math.Round(newChance);
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", false); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", false);
} }
@ -56,7 +54,7 @@ namespace src.player.skills
player.PlayerPawn.Value.Teleport(currentPosition, currentAngles, newVelocity); player.PlayerPawn.Value.Teleport(currentPosition, currentAngles, newVelocity);
} }
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#1e9ab0", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, float chanceFrom = 1f, float chanceTo = 1f, float jumpVelocity = 300f, float pushVelocity = 400f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates) public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#1e9ab0", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, float chanceFrom = .3f, float chanceTo = .4f, float jumpVelocity = 300f, float pushVelocity = 400f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates)
{ {
public float ChanceFrom { get; set; } = chanceFrom; public float ChanceFrom { get; set; } = chanceFrom;
public float ChanceTo { get; set; } = chanceTo; public float ChanceTo { get; set; } = chanceTo;

View file

@ -19,7 +19,7 @@ namespace src.player.skills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"), false);
} }
public static void NewRound() public static void NewRound()
@ -38,9 +38,19 @@ namespace src.player.skills
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
if (attackerInfo?.Skill == skillName) if (attackerInfo?.Skill == skillName)
if (Instance.Random.NextDouble() <= attackerInfo.SkillChance)
TeleportAttackerBehindVictim(attacker!, victim!); TeleportAttackerBehindVictim(attacker!, victim!);
} }
public static void EnableSkill(CCSPlayerController player)
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return;
float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue<float>(skillName, "ChanceTo") - SkillsInfo.GetValue<float>(skillName, "ChanceFrom")) + SkillsInfo.GetValue<float>(skillName, "ChanceFrom");
playerInfo.SkillChance = newChance;
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", false);
}
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
noSpace.TryRemove(player, out _); noSpace.TryRemove(player, out _);
@ -109,9 +119,11 @@ namespace src.player.skills
noSpace.AddOrUpdate(attacker, Server.TickCount + (64 * 2), (k, v) => Server.TickCount + (64 * 2)); noSpace.AddOrUpdate(attacker, Server.TickCount + (64 * 2), (k, v) => Server.TickCount + (64 * 2));
} }
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#4d4d4d", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, float teleportDistance = 100f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates) public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#4d4d4d", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, float teleportDistance = 100f, float chanceFrom = .3f, float chanceTo = .45f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates)
{ {
public float TeleportDistance { get; set; } = teleportDistance; public float TeleportDistance { get; set; } = teleportDistance;
public float ChanceFrom { get; set; } = chanceFrom;
public float ChanceTo { get; set; } = chanceTo;
} }
} }
} }

View file

@ -12,6 +12,7 @@ namespace src.player.skills
public class Wallhack : ISkill public class Wallhack : ISkill
{ {
private const Skills skillName = Skills.Wallhack; private const Skills skillName = Skills.Wallhack;
private static readonly ConcurrentDictionary<ulong, byte> playersInAction = [];
private static readonly ConcurrentBag<(CDynamicProp, CDynamicProp, CsTeam)> glows = []; private static readonly ConcurrentBag<(CDynamicProp, CDynamicProp, CsTeam)> glows = [];
public static void LoadSkill() public static void LoadSkill()
@ -50,22 +51,21 @@ namespace src.player.skills
glow.Item2.AcceptInput("Kill"); glow.Item2.AcceptInput("Kill");
} }
glows.Clear(); glows.Clear();
playersInAction.Clear();
} }
public static void EnableSkill(CCSPlayerController _) public static void EnableSkill(CCSPlayerController player)
{ {
Event.EnableTransmit(); Event.EnableTransmit();
playersInAction.TryAdd(player.SteamID, 0);
if (glows.IsEmpty) if (glows.IsEmpty)
SetGlowEffectForAll(); SetGlowEffectForAll();
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); playersInAction.TryRemove(player.SteamID, out _);
if (playerInfo == null) return; if (playersInAction.IsEmpty)
playerInfo.Skill = Skills.None;
if (!Instance.SkillPlayer.Any(s => s.Skill == skillName))
NewRound(); NewRound();
} }

View file

@ -8,9 +8,9 @@ using CounterStrikeSharp.API.Modules.Utils;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using WASDMenuAPI.Classes; using WASDMenuAPI.Classes;
using WASDSharedAPI; using WASDSharedAPI;
using static CounterStrikeSharp.API.Core.Listeners;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.player; using src.player;
using src.player.skills;
namespace src.utils namespace src.utils
{ {
@ -97,6 +97,14 @@ namespace src.utils
if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE)
return; return;
if (pawn.Controller.Value != null && pawn.Controller.Value.IsValid)
{
var playerInfo = jRandomSkills.Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == pawn.Controller.Value.SteamID);
if (playerInfo == null) return;
if (playerInfo.Skill == Skills.Jester && Jester.GetJesterMode())
return;
}
int newHealth = (int)(pawn.Health - damage); int newHealth = (int)(pawn.Health - damage);
pawn.Health = newHealth; pawn.Health = newHealth;
Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth"); Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth");

View file

@ -345,7 +345,8 @@
"secondlife_desc": "After death, you respawn with the same amount of health", "secondlife_desc": "After death, you respawn with the same amount of health",
"shade": "Shade", "shade": "Shade",
"shade_desc": "You teleport behind the back of a hit enemy", "shade_desc": "You have a random chance to teleport behind the back of a hit enemy",
"shade_desc2": "Your chances of teleporting behind a hit enemy are: {0}%",
"shade_nospace": "No space available", "shade_nospace": "No space available",
"shortbomb": "Short Fuse", "shortbomb": "Short Fuse",

View file

@ -346,6 +346,7 @@
"shade": "Ombre", "shade": "Ombre",
"shade_desc": "Vous vous téléportez derrière l’ennemi touché", "shade_desc": "Vous vous téléportez derrière l’ennemi touché",
"shade_desc2": "Vos chances de vous téléporter derrière un ennemi touché sont de: {0}%",
"shade_nospace": "Aucun espace disponible", "shade_nospace": "Aucun espace disponible",
"shortbomb": "Mèche Courte", "shortbomb": "Mèche Courte",

View file

@ -345,7 +345,8 @@
"secondlife_desc": "Po śmierci odradzasz się z taką samą ilością zdrowia", "secondlife_desc": "Po śmierci odradzasz się z taką samą ilością zdrowia",
"shade": "Cień", "shade": "Cień",
"shade_desc": "Teleportujesz się za plecy trafionego wroga", "shade_desc": "Masz losową szansę na teleportację za plecy trafionego wroga",
"shade_desc2": "Twoje szanse na teleportację za trafionego wroga wynoszą: {0}%",
"shade_nospace": "Brak miejsca", "shade_nospace": "Brak miejsca",
"shortbomb": "Krótka Bomba", "shortbomb": "Krótka Bomba",

View file

@ -345,7 +345,8 @@
"secondlife_desc": "Após a morte, você renasce com a mesma quantidade de saúde", "secondlife_desc": "Após a morte, você renasce com a mesma quantidade de saúde",
"shade": "Sombra", "shade": "Sombra",
"shade_desc": "Você se teletransporta para trás de um inimigo acertado", "shade_desc": "Você tem uma chance aleatória de se teletransportar para trás de um inimigo atingido",
"shade_desc2": "Suas chances de se teletransportar para trás de um inimigo atingido são: {0}%",
"shade_nospace": "Sem espaço disponível", "shade_nospace": "Sem espaço disponível",
"shortbomb": "Fusível Curto", "shortbomb": "Fusível Curto",

View file

@ -1,458 +0,0 @@
{
"none": "Brak",
"none_desc": "Nie posiadasz żadnej supermocy",
"aimbot": "Aimbot",
"aimbot_desc": "Każdy twój trafiony pocisk liczy się jako strzał w głowę",
"anomaly": "Anomalia",
"anomaly_desc": "Cofasz się o kilka sekund do tyłu",
"antyflash": "Anty Flash",
"antyflash_desc": "Posiadasz odporność na flash'e, a twoje flash'e trwają 7 sekund",
"antyhead": "Żelazna Głowa",
"antyhead_desc": "Nie otrzymujesz obrażeń w głowę",
"areareaper": "Niszczyciel Stref",
"areareaper_desc": "Możesz wybrać strefę detonacji, którą chcesz dezaktywować",
"areareaper_incorrect_site": "Nie znaleziono takiej strefy detonacji.",
"areareaper_no_site": "Nie znaleziono żadnej strefy detonacji.",
"areareaper_select_info": "Wybierz strefę do dezaktyw.:",
"areareaper_site_disabled": "Strefa detonacji {0} została dezaktywowana - nie można na niej podłożyć bomby!",
"areareaper_used_info": "Twoja moc została już wykorzystana.",
"armored": "Gruby",
"armored_desc": "Masz losowy mnożnik otrzymywanych obrażeń",
"armored_desc2": "Twój mnożnik otrzymywanych obrażeń wynosi: {0}x",
"assassin": "Skrytobójca",
"assassin_desc": "Zadajesz większe obrażenia przeciwnikowi od tyłu",
"astronaut": "Astronauta",
"astronaut_desc": "Na początku rundy otrzymujesz losową wartość grawitacji",
"astronaut_desc2": "Twoja losowa grawitacja wynosi: {0}x",
"bankrupt": "Bankrut",
"bankrupt_desc": "Wybierz gracza, który straci wszystkie swoje pieniądze",
"bankrupt_enemy_info": "Stałeś się bankrutem.",
"bankrupt_player_info": "Gracz '{0}' zbankrutował.",
"bankrupt_select_info": "Wybierz gracza do bankrucji:",
"baseball": "Bejsbolista",
"baseball_desc": "Twój wabik odbija się od ścian i natychmiastowo zabija wroga po trafieniu",
"behind": "Obrót Wroga",
"behind_desc": "Masz losową szansę na obrócenie wroga o 180 stopni po trafieniu go",
"behind_desc2": "Twoje szanse na obrócenie wroga po trafieniu to: {0}%",
"blademaster": "Mistrz Ostrza",
"blademaster_desc": "Trzymając nóż, masz duże szanse na odparcie strzału",
"bunnyhop": "Królik",
"bunnyhop_desc": "Otrzymujesz auto \"BunnyHopa\"",
"c4camouflage": "C4 Kamuflaż",
"c4camouflage_desc": "Kiedy trzymasz bombę, jesteś niewidzialny",
"catapult": "Katapulta",
"catapult_desc": "Masz losową szanse na podrzucenie wroga",
"catapult_desc2": "Twoje szanse na podrzucenie wroga po trafieniu to: {0}%",
"chicken": "Kurczak",
"chicken_desc": "Otrzymujesz model kurczaka + jesteś o 10% szybszy - 50hp",
"chillout": "Wyluzowany",
"chillout_desc": "Podłożenie bomby zajmuje znacznie więcej czasu",
"cutter": "Scyzoryk",
"cutter_desc": "Natychmiastowe zabójstwo nożem",
"darkness": "Mrok",
"darkness_desc": "Nadaje efekt ciemności wybranemu przeciwnikowi",
"darkness_enemy_info": "Niech zgasną światła.",
"darkness_player_info": "Ciemność opanowała gracza '{0}'.",
"darkness_select_info": "Nałóż efekt ciemności:",
"deactivator": "Deaktywator",
"deactivator_desc": "Wybierasz gracza, którego supermoc chcesz wyłączyć",
"deactivator_enemy_info": "Twoja supermoc została wyłączona.",
"deactivator_player_info": "Moc gracza '{0}' została wyłączona.",
"deactivator_select_info": "Wyłącz moc gracza:",
"deaf": "Głuchy",
"deaf_desc": "Wybierasz gracza, dla którego chcesz wyłączyć wszystkie dźwięki",
"deaf_enemy_info": "Słuchawki opuściły grę.",
"deaf_player_info": "Dźwięk został wyłączony dla gracza '{0}'.",
"deaf_select_info": "Wycisz dźwięki gracza:",
"disarmament": "Rozbrojenie",
"disarmament_desc": "Masz losową szanse na wyrzucenie broni wroga po trafieniu",
"disarmament_desc2": "Twoje szanse na wyrzucenie broni wroga to: {0}%",
"distancer": "Odległościomierz",
"distancer_desc": "Możesz zobaczyć odległość do najbliższego przeciwnika",
"dash": "Doskok",
"dash_desc": "Wykonaj drugi skok, aby wykonać doskok",
"dracula": "Drakula",
"dracula_desc": "Po trafieniu ofiary odzyskujesz zdrowie równe pewnemu procentowi zadanych obrażeń",
"duplicator": "Duplikator",
"duplicator_desc": "Wybierasz gracza, od którego chcesz skopiować supermoc",
"duplicator_player_info": "Moc gracza '{0}' została skopiowana.",
"duplicator_select_info": "Skopiuj moc gracza:",
"dwarf": "Mini Majk ({0}%)",
"dwarf_desc": "Losowa wielkość postaci na początku rundy",
"dwarf_desc2": "Twój mnożnik wielkości to {0}%",
"enemyspawn": "Resp Wroga",
"enemyspawn_desc": "Kliknij [css_useSkill], aby teleportować się na resp wroga",
"explosiveshot": "Strzał Wybuchowy",
"explosiveshot_desc": "Losowa szansa wystrzelenia pocisku wybuchowego podczas strzelania",
"explosiveshot_desc2": "Twoja szansa na wystrzelenie pocisku wybuchowego: {0}%",
"falconeye": "Oko Sokoła",
"falconeye_desc": "Kliknij [css_useSkill], aby aktywować kamerę z lotu ptaka",
"fastreload": "Szybkie Rączki",
"fastreload_desc": "Kliknij [css_useSkill], aby przeładować broń, którą obecnie trzymasz",
"flash": "Flash",
"flash_desc": "Losowa prędkośc postaci na początku rundy",
"flash_desc2": "Twój mnożnik prędkości to {0}x",
"fortnite": "Fortnite",
"fortnite_desc": "Kliknij [css_useSkill], aby stworzyć barykadę, którą można zniszczyć",
"fragilebomb": "Krucha Bomba",
"fragilebomb_desc": "Strzelanie do bomby powoduje jej uszkodzenie",
"fragilebomb_bomb_health": "Zdrowie bomby",
"friendlyfire": "Ogień Przyjacielski",
"friendlyfire_desc": "Strzelanie do członków drużyny leczy ich",
"frozendecoy": "Zamrażający Wabik",
"frozendecoy_desc": "Twój decoy zamraża wszystkich graczy w pobliżu",
"gambler": "Hazardzista",
"gambler_desc": "Wybierz umiejętność z podanej listy.",
"gambler_select_info": "Wybierz umiejętność:",
"gambler_more": "#00FF00|Odśwież za ${0}",
"ghost": "Duszek",
"ghost_desc": "Jesteś całkowicie niewidzialny",
"glaz": "Glaz",
"glaz_desc": "Nie widzisz granatów dymnych",
"glitch": "Glitch",
"glitch_desc": "Wyłączasz radar wybranemu przeciwnikowi",
"glitch_enemy_info": "Twój radar został wyłączony.",
"glitch_player_info": "Radar gracza '{0}' został wyłączony.",
"glitch_select_info": "Wyłącz radar dla gracza:",
"glue": "Klej",
"glue_desc": "Twoje granaty przyklejają się do ścian",
"godmode": "Nieśmiertelność",
"godmode_desc": "Kliknij [css_useSkill], aby stać się nieśmiertelnym na krótką chwilę",
"godmode_off": "Nieśmiertelność wyłączona",
"godmode_on": "Nieśmiertelność włączona",
"grenadier": "Granatnik",
"grenadier_desc": "Masz nieskończone granaty odłamkowe",
"healingsmoke": "Leczący Dym",
"healingsmoke_desc": "Twoje granaty dymne leczą",
"hermit": "Pustelnik",
"hermit_desc": "Zabijanie przywraca amunicję i część zdrowia",
"holyhandgrenade": "Święty Granat Ręczny",
"holyhandgrenade_desc": "Twoje granaty uderzeniowe zadają podwójne obrażenia i mają podwójny zasięg",
"impostor": "Szpieg",
"impostor_desc": "Na początku rundy otrzymujesz model postaci przeciwnika",
"infiniteammo": "Nieskończone Ammo",
"infiniteammo_desc": "Otrzymujesz nieskończoną ilość amunicji do wszystkich broni",
"jackal": "Stópkarz",
"jackal_desc": "Każdy przeciwnik pozostawia za sobą ślad",
"jammer": "Zakłócacz",
"jammer_desc": "Wybierasz gracza, dla którego chcesz wyłączyć celownik",
"jammer_enemy_info": "Twój celownik został wyłączony.",
"jammer_player_info": "Celownik gracza '{0}' została wyłączona.",
"jammer_select_info": "Wyłącz celownik dla gracza:",
"jester": "Błazen",
"jester_desc": "W trybie błazna nie możesz zadawać ani otrzymywać obrażeń. Tryb zmienia się co kilka sekund.",
"jester_mode": "Tryb Błazna",
"jester_on": "WŁ.",
"jester_off": "WYŁ.",
"jumpban": "Beznogi",
"jumpban_desc": "Wybierasz gracza, który nie będzie mógł skakać",
"jumpban_enemy_info": "Ktoś odciął ci nogi.",
"jumpban_player_info": "Gracz '{0}' nie może teraz skakać.",
"jumpban_select_info": "Zablokuj skok dla gracza:",
"jumpingjack": "Pajacyk",
"jumpingjack_desc": "Skakanie przywraca zdrowie",
"killerflash": "Zabójczy Flash",
"killerflash_desc": "Każdy całkowicie oślepiony twoim granatem umiera (również ty)",
"lifeswap": "Zamiana Żyć",
"lifeswap_desc": "Wybierasz gracza, z którym chcesz wymienić się zdrowiem",
"lifeswap_enemy_info": "Ktoś pożyczył sobie twoje zdrowie.",
"lifeswap_player_info": "Wymieniłeś się zdrowiem z graczem '{0}'.",
"lifeswap_select_info": "Zamień się zdrowiem z graczem:",
"longknife": "Długi Nóż",
"longknife_desc": "Podstawowy atak nożem zadaje obrażenia niezależnie od odległości",
"longzeus": "Długi Zeus",
"longzeus_desc": "Zeus zadaje obrażenia niezależnie od odległości",
"magnifier": "Lupa",
"magnifier_desc": "Przybiżasz ekran wybranemu przeciwnikowi",
"magnifier_enemy_info": "Twoje pole widzenia zostało zniekształcone!",
"magnifier_player_info": "Gracz '{0}' został zmuszony do przejścia w tryb powiększenia.",
"magnifier_select_info": "Powiększ ekran gracza:",
"medic": "Medyk",
"medic_desc": "Kliknij [css_useSkill], aby użyć ładunku leczniczego, który przywraca 50 punktów zdrowia",
"moneyswap": "Skarbówka",
"moneyswap_desc": "Wybierasz gracza, z którym chcesz zamienić się pieniędzmi",
"moneyswap_enemy_info": "Urząd skarbowy cię dopadł.",
"moneyswap_player_info": "Wymieniłeś swoje pieniądze z graczem '{0}'.",
"moneyswap_select_info": "Zamień się kasą z graczem:",
"muhammed": "Muhammed",
"muhammed_desc": "Po śmierci eksplodujesz i zabijasz graczy znajdujących się w zasięgu",
"ninja": "Ninja",
"ninja_desc": "Stojąc nieruchomo zwiększasz swoją niewidzialność o 33%, kucając o 33%, a trzymając nóż o 33%",
"nonades": "Pancernik",
"nonades_desc": "Granaty nie zadają Ci obrażeń",
"norecoil": "Skupienie",
"norecoil_desc": "Brak odrzutu podczas strzelania",
"noclip": "NoClip",
"noclip_desc": "Kliknij [css_useSkill], aby włączyć noclip na krótki czas",
"oneshot": "Jednostrzałowiec",
"oneshot_desc": "Po trafieniu natychmiast zabijasz przeciwnika",
"onlyhead": "Tylko Głowa",
"onlyhead_desc": "Otrzymujesz obrażenia tylko w głowę",
"paweljumper": "Pawel Jumper",
"paweljumper_desc": "Otrzymujesz losową liczbę dodatkowych skoków",
"paweljumper_desc2": "Otrzymujesz {0} dodatkowych skoków",
"phoenix": "Feniks",
"phoenix_desc": "Masz losową szans na odrodzenie się po śmierci",
"phoenix_desc2": "Twoje szanse na odrodzenie się po śmierci: {0}%",
"phoenix_respawn": "Zostałeś odrodzony z popiołów dzięki mocy: CHATCOLORS.REDPhoenix",
"psychicdefusing": "Zdalne Rozbrajanie",
"psychicdefusing_desc": "Kiedy jesteś blisko bomby, zaczynasz ją rozbrajać",
"psychicdefusing_hud_info": "Pozostało {0} sekund do rozbrojenia",
"pilot": "Pilot",
"pilot_desc": "Latanie przez określony czas. Przytrzymaj [USE - E], aby latać",
"pilot_hud_info": "Paliwo",
"planter": "Samowolka",
"planter_desc": "Bombę można podłożyć w dowolnym miejscu, a czas detonacji wynosi 60 sekund.",
"poison": "Trutka",
"poison_desc": "Wybierasz gracza, który co kilka sekund będzie otrzymywał obrażenia",
"poison_enemy_info": "Zostałeś otruty.",
"poison_player_info": "Gracz '{0}' został otruty.",
"poison_select_info": "Zatruj gracza:",
"primaryban": "Brak Karabinów",
"primaryban_desc": "Wybierasz gracza, który nie może używać karabinów",
"primaryban_enemy_info": "Nie możesz już używać karabinów.",
"primaryban_player_info": "Gracz '{0}' nie może już używać karabinów.",
"primaryban_select_info": "Zablokuj karabiny dla gracza:",
"prosthesis": "Proteza",
"prosthesis_desc": "Ramiona i nogi są kuloodporne",
"push": "Odpychacz",
"push_desc": "Masz losową szansę na odepchnięcie wroga po trafieniu go",
"push_desc2": "Twoje szanse na odepchnięcie wroga to: {0}%",
"pyro": "Pyro",
"pyro_desc": "Molotow przywraca zdrowie",
"quickshot": "Szybkostrzelność",
"quickshot_desc": "Wszystkie pociski są wystrzeliwane bardzo szybko",
"radarhack": "Radarowiec",
"radarhack_desc": "Na radarze widać wrogów",
"rambo": "Rambo",
"rambo_desc": "Na początku rundy otrzymujesz losową ilość zdrowia",
"randomweapon": "Losowa Broń",
"randomweapon_desc": "Kliknij [css_useSkill], aby otrzymać losową broń",
"rezombie": "Re-Zombie",
"rezombie_desc": "Po śmierci odradzasz się jako zombie z większym zdrowiem i bez broni",
"reactivearmor": "Pancerz Reaktywny",
"reactivearmor_desc": "Pancerz pochłania pierwsze otrzymane obrażenia",
"regeneration": "Regeneracja",
"regeneration_desc": "Co kilka sekund odnawiasz zdrowie",
"replicator": "Replikator",
"replicator_desc": "Kliknij [css_useSkill], aby stworzyć swoją replikę, która zadaje obrażenia po trafieniu",
"retreat": "Odwrót",
"retreat_desc": "Kliknij [css_useSkill], aby powrócić na resp",
"returntosender": "Zwrot do Nadawcy",
"returntosender_desc": "Pierwsze trafienie wroga powoduje, że wraca on na swój resp",
"richboy": "Bogacz",
"richboy_desc": "Na początku rundy otrzymujesz losową kwotę gotówki",
"robinhood": "Robin Hood",
"robinhood_desc": "Zadanie obrażeń przeciwnikowi powoduje kradzież jego pieniędzy",
"rubber": "Gumowe Kule",
"rubber_desc": "Twoje pociski znacznie spowalniają graczy",
"saper": "Saper",
"saper_desc": "Możesz szybciej podłożyć bombę i ją rozbroić",
"secondlife": "Druga Szansa",
"secondlife_desc": "Po śmierci odradzasz się z taką samą ilością zdrowia",
"shade": "Cień",
"shade_desc": "Teleportujesz się za plecy trafionego wroga",
"shade_nospace": "Brak miejsca",
"shortbomb": "Krótka Bomba",
"shortbomb_desc": "Bomba wybucha znacznie szybciej",
"silent": "Cichociemny",
"silent_desc": "Twoje kroki i skoki są niesłyszalne dla INNYCH graczy",
"sniperelite": "SzeliS",
"sniperelite_desc": "Kliknij [css_useSkill], aby zamienić aktualną broń na AWP",
"soldier": "Żołnierz {0}%",
"soldier_desc": "Masz losowy mnożnik obrażeń",
"soldier_desc2": "A AAAAAAAAAAAAAAAAAAAAAA",
"soundmaker": "Dźwiękowiec",
"soundmaker_desc": "Kliknij [css_useSkill], aby wywołać dzwięk u każdego przeciwnika",
"spectator": "Obserwator",
"spectator_desc": "Kliknij [css_useSkill], aby obserwować losowego przeciwnika",
"swapposition": "Zamiana Miejsc",
"swapposition_desc": "Kliknij [css_useSkill], aby zamienić się miejscami z losowym przeciwnikiem",
"teleporter": "Teleporter",
"teleporter_desc": "Zamieniasz się miejscami z trafionym przeciwnikiem",
"thief": "Złodziej",
"thief_desc": "Możesz ukraść supermoc wybranemu graczowi",
"thief_enemy_info": "Twoja supermoc została skradziona.",
"thief_player_info": "Moc gracza '{0}' została skradziona.",
"thief_select_info": "Ukradnij moc gracza:",
"thief_incorrect_skill": "Tej umiejętności nie można wybrać!",
"thirdeye": "Trzecie Oko",
"thirdeye_desc": "Kliknij [css_useSkill], aby aktywować trzecią osobę",
"thorns": "Ciernie",
"thorns_desc": "Twój przeciwnik otrzymuje część obrażeń, które zadał ci",
"toxicsmoke": "Toksyczny Dym",
"toxicsmoke_desc": "Twoje granaty dymny zadają obrażenia",
"wallhack": "Wallhack",
"wallhack_desc": "Widzisz wrogów przez ściany",
"watchmaker": "Zegarmistrz",
"watchmaker_desc": "Każdy rzut granatem zmienia czas rundy",
"watchmaker_ct": "Czas rundy został skrócony o {0} sekund.",
"watchmaker_tt": "Czas rundy został wydłużony o {0} sekund",
"weaponsswap": "Zamiana Broni",
"weaponsswap_desc": "Kliknij [css_useSkill], aby zamienić się bronią z losowym przeciwnikiem",
"weaponsswap_hud_info2": "Nie posiadasz broni na zamiane",
"zeus": "Zeus",
"zeus_desc": "Zeus x27 natychmiastowo się odnawia",
"your_skill": "",
"enemy_skill": "Supermoc przeciwnika",
"observer_skill": "Moc gracza",
"welcome_message": "Witaj {PLAYER} na serwerze {SERVER_NAME}!\nAktualna wersja jRandomSkills: {VERSION} ({SKILLS_COUNT} supermocy).\n\nPierwotnie plugin stworzona przez:\n{AUTHOR1}\nZmodyfikowany i ulepszony przez:\n{AUTHOR2}\nOficjalny discord: https://discord.gg/9H8EZYBpPF",
"drawing_skill": "",
"disabled_weapon": "Nie możesz używać tej broni",
"hud_info": "Poczekaj jeszcze {0} sekund",
"hud_info_no_enemy": "Nie znaleziono przeciwnika",
"active_hud_info": "Działa jeszcze przez {0} milisekund",
"skills_menu": "Lista Super Mocy",
"no_player": "Nie znaleziono pasującego gracza.",
"duplicate_player": "Znaleziono więcej niż jednego gracza o tej samej nazwie.",
"selectplayerskill_command": "Wpisz /t",
"selectplayerskill_incorrect_enemy_index": "Nie znaleziono graczy do wyboru.",
"skill_not_found_setskill": "Nie znaleziono takiej CHATCOLORS.REDsupermocy",
"player_not_found_setskill": "Nie znaleziono takiego CHATCOLORS.REDgracza",
"correct_form_setskill": "Poprawne użycie: CHATCOLORS.RED!setskill <nick> <supermoc>",
"correct_form_setscore": "Poprawne użycie: CHATCOLORS.RED!setscore <CT> <TT>",
"done_setskill": "Ustawiono Supermoc",
"error_setskill": "Nie udało się ustawić CHATCOLORS.REDsupermocy",
"for_setskill": "dla",
"invalid_map": "Nazwa mapy została wprowadzona nieprawidłowo!",
"loading_map": "Ładowanie nowej mapy",
"pause": "Mecz został wstrzymany.",
"unpause": "Mecz został wznowiony.",
"healed": "Zostałeś uleczony.",
"game_start": "Gra rozpoczęta!",
"reload": "Tłumaczenia i konfigi zostały ponownie załadowane.",
"vote_started": "Głosowanie rozpoczęte: '{0}'",
"vote_timeout": "Głosowanie '{0}' przekroczyło limit czasu!",
"vote_wait": "Musisz poczekać, zanim rozpoczniesz kolejne głosowanie!",
"vote_same_wait": "Musisz poczekać, zanim ponownie rozpoczniesz to samo głosowanie!",
"vote_not_enough_players": "Za mało graczy, aby rozpocząć głosowanie!",
"vote_alredy_voted": "Już zagłosowałeś!",
"vote_vote": "Głosowanie",
"bombsite_a": "Strefa detonacji A",
"bombsite_b": "Strefa detonacji B",
"teammate_skills": "Supermoce twoich sojuszników",
"summary_start": "======PODSUMOWANIE=Z=OSTATNIEJ=RUNDY======",
"summary_end": "============================================",
"menu_controlls_scroll": "W/S - Scroll",
"menu_controlls_padding": " | ",
"menu_controlls_select": "E - Select"
}

View file

@ -345,7 +345,8 @@
"secondlife_desc": "死亡后你会以相同生命值复活", "secondlife_desc": "死亡后你会以相同生命值复活",
"shade": "阴影", "shade": "阴影",
"shade_desc": "你会传送到被击中敌人的背后", "shade_desc": "你存在随机几率将被击中的敌人传送至其身后",
"shade_desc2": "你传送至击中敌人身后的概率为:{0}%",
"shade_nospace": "无可用空间", "shade_nospace": "无可用空间",
"shortbomb": "短引信", "shortbomb": "短引信",

View file

@ -312,8 +312,12 @@ This plugin uses content from the following projects:
- #### Skill improvements: - #### Skill improvements:
- ##### Long Knife: - ##### Long Knife:
- ###### A secondary knife attack also deals damage. - ###### A secondary knife attack also deals damage.
- ###### Fixed a mistake where the player's skill was shown as `None` after death.
- ##### Wallhack: - ##### Wallhack:
- ###### Glows are created just once, instead of being created again for each player. - ###### Glows are created just once, instead of being created again for each player.
- ###### Fixed a mistake where the player's skill was shown as `None` after death.
- ##### Jackal:
- ###### Fixed a mistake where the player's skill was shown as `None` after death.
- ##### Position Swap: - ##### Position Swap:
- ###### Added a configurable cooldown at the start of the round. - ###### Added a configurable cooldown at the start of the round.
- ##### Spectator: - ##### Spectator:
@ -338,12 +342,23 @@ This plugin uses content from the following projects:
- ##### Chicken: - ##### Chicken:
- ###### The method used to attach the chicken has changed. - ###### The method used to attach the chicken has changed.
- ###### Player with skill can see a model of your chicken. - ###### Player with skill can see a model of your chicken.
- ###### Fixed hitboxes after returning to normal model.
- ###### Fixed a bug that added extra health after deactivating skill.
- ##### C4 Camouflage: - ##### C4 Camouflage:
- ###### Fixed an issue with weapons not being visible after death. - ###### Fixed an issue with weapons not being visible after death.
- ##### Blade Master: - ##### Blade Master:
- ###### Movement speed with a knife has been reduced by 10% (configurable). - ###### Movement speed with a knife has been reduced by 10% (configurable).
- ##### AntyFlash: - ##### AntyFlash:
- ###### Added the option in config to change the flash duration of your flashes. - ###### Added the option in config to change the flash duration of your flashes.
- ##### Jester:
- ###### Fixed an issue where you could take damage from other skills or bombs.
- ###### Fixed a bug where the player was always purple.
- ##### Shade:
- ###### Added an option to set the chance of teleportation after hitting an enemy in the config.
- ##### Impostor:
- ###### Setting the player model after deactivating the skill.
- ###### The default model for terrorists has been changed.
</details> </details>
<details> <details>