diff --git a/[ D3X ] dRandomSkills - SRC Files/Properties/Resources.Designer.cs b/[ D3X ] dRandomSkills - SRC Files/Properties/Resources.Designer.cs new file mode 100644 index 0000000..3631cab --- /dev/null +++ b/[ D3X ] dRandomSkills - SRC Files/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// Ten kod został wygenerowany przez narzędzie. +// Wersja wykonawcza:4.0.30319.42000 +// +// Zmiany w tym pliku mogą spowodować nieprawidłowe zachowanie i zostaną utracone, jeśli +// kod zostanie ponownie wygenerowany. +// +//------------------------------------------------------------------------------ + +namespace dRandomSkills.Properties { + using System; + + + /// + /// Klasa zasobu wymagająca zdefiniowania typu do wyszukiwania zlokalizowanych ciągów itd. + /// + // Ta klasa została automatycznie wygenerowana za pomocą klasy StronglyTypedResourceBuilder + // przez narzędzie, takie jak ResGen lub Visual Studio. + // Aby dodać lub usunąć składową, edytuj plik ResX, a następnie ponownie uruchom narzędzie ResGen + // z opcją /str lub ponownie utwórz projekt VS. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Zwraca buforowane wystąpienie ResourceManager używane przez tę klasę. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("dRandomSkills.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Przesłania właściwość CurrentUICulture bieżącego wątku dla wszystkich + /// przypadków przeszukiwania zasobów za pomocą tej klasy zasobów wymagającej zdefiniowania typu. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/[ D3X ] dRandomSkills - SRC Files/Properties/Resources.resx b/[ D3X ] dRandomSkills - SRC Files/Properties/Resources.resx new file mode 100644 index 0000000..4fdb1b6 --- /dev/null +++ b/[ D3X ] dRandomSkills - SRC Files/Properties/Resources.resx @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/[ D3X ] dRandomSkills - SRC Files/Properties/launchSettings.json b/[ D3X ] dRandomSkills - SRC Files/Properties/launchSettings.json new file mode 100644 index 0000000..a7c25d0 --- /dev/null +++ b/[ D3X ] dRandomSkills - SRC Files/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "dRandomSkills": { + "commandName": "Project", + "nativeDebugging": true + } + } +} \ No newline at end of file diff --git a/[ D3X ] dRandomSkills - SRC Files/dRandomSkills.csproj b/[ D3X ] dRandomSkills - SRC Files/dRandomSkills.csproj index c30d68e..22d8ee0 100644 --- a/[ D3X ] dRandomSkills - SRC Files/dRandomSkills.csproj +++ b/[ D3X ] dRandomSkills - SRC Files/dRandomSkills.csproj @@ -7,8 +7,23 @@ - + + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + diff --git a/[ D3X ] dRandomSkills - SRC Files/dRandomSkills.sln b/[ D3X ] dRandomSkills - SRC Files/dRandomSkills.sln new file mode 100644 index 0000000..92c07f8 --- /dev/null +++ b/[ D3X ] dRandomSkills - SRC Files/dRandomSkills.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.9.34728.123 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dRandomSkills", "dRandomSkills.csproj", "{1412DD25-558C-425A-A7F6-347C970136E5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1412DD25-558C-425A-A7F6-347C970136E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1412DD25-558C-425A-A7F6-347C970136E5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1412DD25-558C-425A-A7F6-347C970136E5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1412DD25-558C-425A-A7F6-347C970136E5}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A00F62BC-56A4-45B7-8843-2B0292BA710D} + EndGlobalSection +EndGlobal diff --git a/[ D3X ] dRandomSkills - SRC Files/src/dRandomSkills.cs b/[ D3X ] dRandomSkills - SRC Files/src/dRandomSkills.cs index eceb28b..1fb31c4 100644 --- a/[ D3X ] dRandomSkills - SRC Files/src/dRandomSkills.cs +++ b/[ D3X ] dRandomSkills - SRC Files/src/dRandomSkills.cs @@ -12,7 +12,7 @@ namespace dRandomSkills public override string ModuleName => "[CS2] D3X - [ Random Skills ]"; public override string ModuleAuthor => "D3X"; public override string ModuleDescription => "Plugin dodaje na serwer losowe moce co runde na serwery CS2 by D3X"; - public override string ModuleVersion => "1.0.1"; + public override string ModuleVersion => "1.0.2"; public override void Load(bool hotReload) { @@ -23,30 +23,35 @@ namespace dRandomSkills PlayerOnTick.Load(); Command.Load(); + // ==== NOWE ==== + MiniMajk.LoadMiniMajk(); + ZamianaMiejsc.LoadZamianaMiejsc(); + + // ==== POPRAWIONE/NAPRAWIONE ==== + Flash.LoadFlash(); PawelJumper.LoadPawelJumper(); - Duszek.LoadDuszek(); BunnyHop.LoadBunnyHop(); Impostor.LoadImpostor(); - Phoenix.LoadPhoenix(); - Muhammed.LoadMuhammed(); - Pilot.LoadPilot(); - Rambo.LoadRambo(); - Bogacz.LoadBogacz(); - Flash.LoadFlash(); - Astronauta.LoadAstronauta(); - Medyk.LoadMedyk(); - Kurczak.LoadKurczak(); OneShot.LoadOneShot(); - Drakula.LoadDrakula(); - AntyFlash.LoadAntyFlash(); + Muhammed.LoadMuhammed(); + Bogacz.LoadBogacz(); + Rambo.LoadRambo(); + Medyk.LoadMedyk(); + Duszek.LoadDuszek(); + Kurczak.LoadKurczak(); + Astronauta.LoadAstronauta(); Rozbrojenie.LoadRozbrojenie(); - ZelaznaGlowa.LoadZelaznaGlowa(); + AntyFlash.LoadAntyFlash(); + ObrotWroga.LoadObrotWroga(); NieskonczoneAmmo.LoadNieskonczoneAmmo(); Katapulta.LoadKatapulta(); - ObrotWroga.LoadObrotWroga(); - Cien.LoadCien(); + Drakula.LoadDrakula(); Teleporter.LoadTeleporter(); - Eliminator.LoadEliminator(); + Saper.LoadEliminator(); + Phoenix.LoadPhoenix(); + Pilot.LoadPilot(); + Cien.LoadCien(); + ZelaznaGlowa.LoadZelaznaGlowa(); } } @@ -55,6 +60,7 @@ namespace dRandomSkills public required ulong SteamID { get; set; } public required string PlayerName { get; set; } public string? Skill { get; set; } + public float? SkillChance { get; set; } public bool IsDrawing { get; set; } } @@ -64,11 +70,14 @@ namespace dRandomSkills public string Description { get; } public string Color { get; } - public dSkill_SkillInfo(string name, string description, string color) + public bool Display { get; } + + public dSkill_SkillInfo(string name, string description, string color, bool display) { Name = name; Description = description; Color = color; + Display = display; } } diff --git a/[ D3X ] dRandomSkills - SRC Files/src/player/PlayerEvents.cs b/[ D3X ] dRandomSkills - SRC Files/src/player/PlayerEvents.cs index 8e0ed30..b4e2773 100644 --- a/[ D3X ] dRandomSkills - SRC Files/src/player/PlayerEvents.cs +++ b/[ D3X ] dRandomSkills - SRC Files/src/player/PlayerEvents.cs @@ -21,6 +21,7 @@ namespace dRandomSkills PlayerName = player.PlayerName, Skill = "", IsDrawing = false, + SkillChance = 1, }); return HookResult.Continue; @@ -73,7 +74,8 @@ namespace dRandomSkills var randomSkill = SkillData.Skills[Instance.Random.Next(SkillData.Skills.Count)]; skillPlayer.Skill = randomSkill.Name; - Utils.PrintToChat(player, $"{ChatColors.DarkRed}{randomSkill.Name}{ChatColors.Lime}: {randomSkill.Description}", false); + if (randomSkill.Display) + Utils.PrintToChat(player, $"{ChatColors.DarkRed}{randomSkill.Name}{ChatColors.Lime}: {randomSkill.Description}", false); if(Config.config.Settings.TeamMateSkillInfo) { diff --git a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/AntyFlash.cs b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/AntyFlash.cs index 2dee199..c4dfd0b 100644 --- a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/AntyFlash.cs +++ b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/AntyFlash.cs @@ -7,7 +7,7 @@ namespace dRandomSkills { public static void LoadAntyFlash() { - Utils.RegisterSkill("Anty Flash", "Posiadasz odporność na flashe", "#D6E6FF"); + Utils.RegisterSkill("Anty Flash", "Posiadasz odporność na flashe i 7 sekund trwają twoje flash'e", "#D6E6FF"); Instance.RegisterEventHandler((@event, info) => { @@ -19,12 +19,11 @@ namespace dRandomSkills if (!IsPlayerValid(player)) return HookResult.Continue; var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - var sameTeam = attacker.Team == player.Team; if (playerInfo?.Skill == "Anty Flash") - { playerPawn.FlashDuration = 0.0f; - } + else if (Instance.skillPlayer.Any(s => s.Skill == "Anty Flash")) + playerPawn.FlashDuration = 7.0f; return HookResult.Continue; }); diff --git a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Astronauta.cs b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Astronauta.cs index 93858b4..b02c1ec 100644 --- a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Astronauta.cs +++ b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Astronauta.cs @@ -1,5 +1,7 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Entities; +using CounterStrikeSharp.API.Modules.Utils; using static dRandomSkills.dRandomSkills; namespace dRandomSkills @@ -8,7 +10,7 @@ namespace dRandomSkills { public static void LoadAstronauta() { - Utils.RegisterSkill("Astronauta", "Otrzymujesz losową ilość grawitacji na start rundy", "#7E10AD"); + Utils.RegisterSkill("Astronauta", "Otrzymujesz losową ilość grawitacji na start rundy", "#7E10AD", false); Instance.RegisterEventHandler((@event, info) => { @@ -21,7 +23,7 @@ namespace dRandomSkills if (playerInfo?.Skill == "Astronauta" && playerPawn != null) { - ApplyGravityModifier(playerPawn); + ApplyGravityModifier(player); } } }); @@ -29,10 +31,11 @@ namespace dRandomSkills }); } - private static void ApplyGravityModifier(CCSPlayerPawn playerPawn) + private static void ApplyGravityModifier(CCSPlayerController player) { - float gravityModifier = (float)Math.Round(Instance.Random.NextDouble() * (0.7f - 0.2f) + 0.2f, 1); - playerPawn.GravityScale = gravityModifier; + float gravityModifier = (float)Math.Round(Instance.Random.NextDouble() * (0.7f - 0.1f) + 0.1f, 1); + Utils.PrintToChat(player, $"{ChatColors.DarkRed}\"Astronauta\"{ChatColors.Lime}: Twoja losowa grawitacja wynosi: {gravityModifier}x", false); + player.Pawn.Value.GravityScale = gravityModifier; } } } \ No newline at end of file diff --git a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Cien.cs b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Cien.cs index 753591f..6cdd898 100644 --- a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Cien.cs +++ b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Cien.cs @@ -10,7 +10,7 @@ namespace dRandomSkills public static void LoadCien() { - Utils.RegisterSkill("Cień", "Teleportujesz się za plecy losowego wroga", "#18171A"); + Utils.RegisterSkill("Cień", "Teleportujesz się za plecy trafionego wroga", "#18171A"); Instance.RegisterEventHandler((@event, info) => { diff --git a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Drakula.cs b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Drakula.cs index 23c20c9..793b07b 100644 --- a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Drakula.cs +++ b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Drakula.cs @@ -6,8 +6,6 @@ namespace dRandomSkills { public static class Drakula { - const float VampirePercentage = 0.3f; - public static void LoadDrakula() { Utils.RegisterSkill("Drakula", "Po trafieniu ofiary otrzymujesz zwrot zdrowia w postaci danego procentu zadanych obrażeń", "#FA050D"); @@ -34,11 +32,12 @@ namespace dRandomSkills var attackerPawn = attacker.PlayerPawn.Value; if (attackerPawn == null) return; - int healing = (int)(damage * VampirePercentage); - int newHealth = Math.Min(attackerPawn.Health + healing, attackerPawn.MaxHealth); + int newHealth = (int)(attackerPawn.Health + (damage * 0.3)); + + attackerPawn.MaxHealth = Math.Max(newHealth, 100); + Utilities.SetStateChanged(attackerPawn, "CBaseEntity", "m_iMaxHealth"); attackerPawn.Health = newHealth; - Utilities.SetStateChanged(attackerPawn, "CBaseEntity", "m_iHealth"); } diff --git a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Duszek.cs b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Duszek.cs index ac2047f..af9e2ee 100644 --- a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Duszek.cs +++ b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Duszek.cs @@ -1,6 +1,7 @@ using System.Drawing; using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; +using static CounterStrikeSharp.API.Core.Listeners; using static dRandomSkills.dRandomSkills; namespace dRandomSkills @@ -36,13 +37,42 @@ namespace dRandomSkills if (!IsValidPlayer(player)) continue; var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == "Duszek") - { SetPlayerVisibility(player, true); - } } return HookResult.Continue; }); + + Instance.RegisterEventHandler((@event, info) => + { + var player = @event.Userid; + if (!IsValidPlayer(player)) return HookResult.Continue; + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + + if (playerInfo?.Skill != "Duszek") return HookResult.Continue; + SetWeaponVisibility(player, false); + return HookResult.Continue; + }); + + Instance.RegisterListener(OnTick); + } + + private static void OnTick() + { + foreach (var player in Utilities.GetPlayers()) + { + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + + if (playerInfo?.Skill == "Duszek") + { + var activeWeapon = player.Pawn.Value.WeaponServices?.ActiveWeapon.Value; + if (activeWeapon != null && activeWeapon.IsValid && activeWeapon.Clip1 != 0) + { + activeWeapon.Clip1 = 0; + activeWeapon.Clip2 = 0; + } + } + } } private static bool IsValidPlayer(CCSPlayerController player) @@ -62,26 +92,37 @@ namespace dRandomSkills playerPawn.ShadowStrength = shadowStrength; Utilities.SetStateChanged(playerPawn, "CBaseModelEntity", "m_clrRender"); - var activeWeapon = playerPawn.WeaponServices?.ActiveWeapon.Value; - if (activeWeapon != null && activeWeapon.IsValid) - { - activeWeapon.Render = color; - activeWeapon.ShadowStrength = shadowStrength; - Utilities.SetStateChanged(activeWeapon, "CBaseModelEntity", "m_clrRender"); - } + SetWeaponVisibility(player, visible); + } + } - var myWeapons = playerPawn.WeaponServices?.MyWeapons; - if (myWeapons != null) + private static void SetWeaponVisibility(CCSPlayerController player, bool visible) + { + if (!IsValidPlayer(player)) return; + var playerPawn = player.PlayerPawn.Value; + + var color = visible ? Color.FromArgb(255, 255, 255, 255) : Color.FromArgb(0, 255, 255, 255); + var shadowStrength = visible ? 1.0f : 0.0f; + + var activeWeapon = playerPawn.WeaponServices?.ActiveWeapon.Value; + if (activeWeapon != null && activeWeapon.IsValid) + { + activeWeapon.Render = color; + activeWeapon.ShadowStrength = shadowStrength; + Utilities.SetStateChanged(activeWeapon, "CBaseModelEntity", "m_clrRender"); + } + + var myWeapons = playerPawn.WeaponServices?.MyWeapons; + if (myWeapons != null) + { + foreach (var gun in myWeapons) { - foreach (var gun in myWeapons) + var weapon = gun.Value; + if (weapon != null) { - var weapon = gun.Value; - if (weapon != null) - { - weapon.Render = color; - weapon.ShadowStrength = shadowStrength; - Utilities.SetStateChanged(weapon, "CBaseModelEntity", "m_clrRender"); - } + weapon.Render = color; + weapon.ShadowStrength = shadowStrength; + Utilities.SetStateChanged(weapon, "CBaseModelEntity", "m_clrRender"); } } } diff --git a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Flash.cs b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Flash.cs index e341321..9234ca9 100644 --- a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Flash.cs +++ b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Flash.cs @@ -1,5 +1,6 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Utils; using static dRandomSkills.dRandomSkills; namespace dRandomSkills @@ -8,7 +9,7 @@ namespace dRandomSkills { public static void LoadFlash() { - Utils.RegisterSkill("Flash", "Otrzymujesz losową ilość speed na start rundy", "#A31912"); + Utils.RegisterSkill("Flash", "Losowa prędkośc postaci na początku rundy", "#A31912", false); Instance.RegisterEventHandler((@event, info) => { @@ -16,18 +17,20 @@ namespace dRandomSkills { foreach (var player in Utilities.GetPlayers()) { - if (!IsPlayerValid(player)) return; + if (!IsPlayerValid(player)) continue; var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != "Flash") return; + if (playerInfo?.Skill != "Flash") continue; var playerPawn = player.PlayerPawn?.Value; if (playerPawn != null) { - float velocityModifier = (float)Instance.Random.NextDouble() * (2.5f - 1.2f) + 1.2f; - playerPawn.VelocityModifier = velocityModifier; - Utilities.SetStateChanged(player, "CCSPlayerPawn", "m_flVelocityModifier"); + float newSpeed = (float)Instance.Random.NextDouble() * (3.0f - 1.2f) + 1.2f; + newSpeed = (float)Math.Round(newSpeed, 2); + playerPawn.VelocityModifier = newSpeed; + Utilities.SetStateChanged(playerPawn, "CCSPlayerPawn", "m_flVelocityModifier"); + Utils.PrintToChat(player, $"{ChatColors.DarkRed}\"Flash\"{ChatColors.Lime}: Twój mnożnik prędkości to {newSpeed}x", false); } } }); diff --git a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Katapulta.cs b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Katapulta.cs index 08216a2..c974ed1 100644 --- a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Katapulta.cs +++ b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Katapulta.cs @@ -1,4 +1,6 @@ +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Utils; using static dRandomSkills.dRandomSkills; namespace dRandomSkills @@ -8,8 +10,31 @@ namespace dRandomSkills public static void LoadKatapulta() { - Utils.RegisterSkill("Katapulta", "Masz 25% szans na podrzucenie wroga", "#FF4500"); - + Utils.RegisterSkill("Katapulta", "Masz losow¹ szanse na podrzucenie wroga", "#FF4500"); + + Instance.RegisterEventHandler((@event, info) => + { + Instance.AddTimer(0.1f, () => + { + foreach (var player in Utilities.GetPlayers()) + { + if (!IsPlayerValid(player)) continue; + + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != "Katapulta") continue; + + float newChance = (float)Instance.Random.NextDouble() * (.40f - .20f) + .20f; + playerInfo.SkillChance = newChance; + newChance = (float)Math.Round(newChance, 2) * 100; + newChance = (float)Math.Round(newChance); + + Utils.PrintToChat(player, $"{ChatColors.DarkRed}\"Katapulta\"{ChatColors.Lime}: Twoje szanse na podrzucenie wroga po trafieniu to: {newChance}%", false); + } + }); + + return HookResult.Continue; + }); + Instance.RegisterEventHandler((@event, info) => { var attacker = @event.Attacker; @@ -23,7 +48,7 @@ namespace dRandomSkills if (attackerInfo?.Skill == "Katapulta" && victim.PawnIsAlive) { - if (Instance.Random.NextDouble() <= 0.25) + if (Instance.Random.NextDouble() <= attackerInfo.SkillChance) { var victimPawn = victim.PlayerPawn?.Value; if (victimPawn != null) @@ -36,5 +61,9 @@ namespace dRandomSkills return HookResult.Continue; }); } + private static bool IsPlayerValid(CCSPlayerController player) + { + return player != null && player.IsValid && player.PlayerPawn?.Value != null; + } } } \ No newline at end of file diff --git a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Kurczak.cs b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Kurczak.cs index 2ef5f30..771810f 100644 --- a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Kurczak.cs +++ b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Kurczak.cs @@ -1,15 +1,30 @@ using System.Drawing; using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; +using static CounterStrikeSharp.API.Core.Listeners; using static dRandomSkills.dRandomSkills; namespace dRandomSkills { public static class Kurczak { + private static string[] pistols = + { + "weapon_deagle", + "weapon_revolver", + "weapon_glock", + "weapon_usp_silencer", + "weapon_cz75a", + "weapon_fiveseven", + "weapon_p250", + "weapon_tec9", + "weapon_elite", + "weapon_hkp2000" + }; + public static void LoadKurczak() { - Utils.RegisterSkill("Kurczak", "Otrzymujesz model kurczaka + jesteś o 10% szybszy", "#FF8B42"); + Utils.RegisterSkill("Kurczak", "Otrzymujesz model kurczaka + jesteś o 10% szybszy - 50hp", "#FF8B42"); Instance.RegisterEventHandler((@event, info) => { @@ -17,10 +32,10 @@ namespace dRandomSkills { foreach (var player in Utilities.GetPlayers()) { - if (!IsPlayerValid(player)) return; + if (!IsPlayerValid(player)) continue; var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != "Kurczak") return; + if (playerInfo?.Skill != "Kurczak") continue; var playerPawn = player.PlayerPawn?.Value; if (playerPawn != null) @@ -29,12 +44,35 @@ namespace dRandomSkills playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().MaterialGroup.Value = (uint)Instance.Random.Next(1, 4); playerPawn.VelocityModifier = 1.1f; Utilities.SetStateChanged(player, "CCSPlayerPawn", "m_flVelocityModifier"); + + playerPawn.Health = 50; + Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth"); } } }); return HookResult.Continue; }); + + Instance.RegisterListener(OnTick); + } + + private static void OnTick() + { + foreach (var player in Utilities.GetPlayers()) + { + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + + if (playerInfo?.Skill == "Kurczak") + { + var activeWeapon = player.Pawn.Value.WeaponServices?.ActiveWeapon.Value; + if (activeWeapon != null && activeWeapon.IsValid && activeWeapon.Clip1 != 0 && !pistols.Contains(activeWeapon?.DesignerName)) + { + activeWeapon.Clip1 = 0; + activeWeapon.Clip2 = 0; + } + } + } } public static void SetPlayerModel(CCSPlayerController player, string model) diff --git a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Medyk.cs b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Medyk.cs index 4b14d26..8c037d3 100644 --- a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Medyk.cs +++ b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Medyk.cs @@ -16,15 +16,14 @@ namespace dRandomSkills { foreach (var player in Utilities.GetPlayers()) { - if (!IsPlayerValid(player)) return; + if (!IsPlayerValid(player)) continue; + player.RemoveItemByDesignerName("weapon_healthshot"); var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != "Medyk") return; + if (playerInfo?.Skill != "Medyk") continue; int healthshot = Instance.Random.Next(1, 10); for (int i = 0; i < healthshot; i++) - { player.GiveNamedItem("weapon_healthshot"); - } } }); @@ -36,10 +35,6 @@ namespace dRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!IsPlayerValid(player)) return HookResult.Continue; - - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != "Medyk") return HookResult.Continue; - player.RemoveItemByDesignerName("weapon_healthshot"); } diff --git a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/MiniMajk.cs b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/MiniMajk.cs new file mode 100644 index 0000000..3462b0e --- /dev/null +++ b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/MiniMajk.cs @@ -0,0 +1,58 @@ +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Utils; +using static dRandomSkills.dRandomSkills; + +namespace dRandomSkills +{ + public static class MiniMajk + { + public static void LoadMiniMajk() + { + string defaultCT = "characters/models/ctm_sas/ctm_sas.vmdl"; + string defaultTT = "characters/models/tm_phoenix/tm_phoenix.vmdl"; + Utils.RegisterSkill("MiniMajk", "Losowa wielkość postaci na początku rundy", "#ffff00", false); + + Instance.RegisterEventHandler((@event, info) => + { + Instance.AddTimer(0.1f, () => + { + foreach (var player in Utilities.GetPlayers()) + { + if (!IsPlayerValid(player)) continue; + + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != "MiniMajk") continue; + + var playerPawn = player.PlayerPawn?.Value; + + if (playerPawn != null) + { + float newSize = (float)Instance.Random.NextDouble() * (.95f - .6f) + .6f; + newSize = (float)Math.Round(newSize, 2); + + playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().Scale = newSize; + playerPawn.SetModel(player.Team == CsTeam.CounterTerrorist ? defaultTT : defaultCT); + playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().Scale = newSize; + playerPawn.SetModel(player.Team == CsTeam.CounterTerrorist ? defaultCT : defaultTT); + + Utils.PrintToChat(player, $"{ChatColors.DarkRed}\"MiniMajk\"{ChatColors.Lime}: Twój mnożnik wielkości to {newSize}x", false); + + Instance.AddTimer(.2f, () => { + if (IsPlayerValid(player)) + playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().Scale = 1; + }); + } + } + }); + + return HookResult.Continue; + }); + } + + private static bool IsPlayerValid(CCSPlayerController player) + { + return player != null && player.IsValid && player.PlayerPawn?.Value != null; + } + } +} \ No newline at end of file diff --git a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/NieskonczoneAmmo.cs b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/NieskonczoneAmmo.cs index 4ab7bfe..24a5b5e 100644 --- a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/NieskonczoneAmmo.cs +++ b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/NieskonczoneAmmo.cs @@ -1,4 +1,5 @@ using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Utils; using static dRandomSkills.dRandomSkills; namespace dRandomSkills @@ -25,6 +26,20 @@ namespace dRandomSkills return HookResult.Continue; }); + Instance.RegisterEventHandler((@event, info) => + { + var player = @event.Userid; + + if (!IsValidPlayer(player)) return HookResult.Continue; + + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + + if (playerInfo?.Skill == "Nieskończone Ammo") + player.GiveNamedItem($"weapon_{@event.Weapon}"); + + return HookResult.Continue; + }); + Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; diff --git a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/ObrotWroga.cs b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/ObrotWroga.cs index b8678e6..c43e3e0 100644 --- a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/ObrotWroga.cs +++ b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/ObrotWroga.cs @@ -1,3 +1,4 @@ +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using static dRandomSkills.dRandomSkills; @@ -8,7 +9,30 @@ namespace dRandomSkills { public static void LoadObrotWroga() { - Utils.RegisterSkill("Obrót Wroga", "Masz 25% szans na obrócenie wroga o 180 stopni po trafieniu", "#00FF00"); + Utils.RegisterSkill("Obrót Wroga", "Masz losową szanse na obrócenie wroga o 180 stopni po trafieniu", "#00FF00", false); + + Instance.RegisterEventHandler((@event, info) => + { + Instance.AddTimer(0.1f, () => + { + foreach (var player in Utilities.GetPlayers()) + { + if (!IsPlayerValid(player)) continue; + + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != "Obrót Wroga") continue; + + float newChance = (float)Instance.Random.NextDouble() * (.40f - .20f) + .20f; + playerInfo.SkillChance = newChance; + newChance = (float)Math.Round(newChance, 2) * 100; + newChance = (float)Math.Round(newChance); + + Utils.PrintToChat(player, $"{ChatColors.DarkRed}\"Obrót Wroga\"{ChatColors.Lime}: Twoje szanse na obrucenie wroga po trafieniu to: {newChance}%", false); + } + }); + + return HookResult.Continue; + }); Instance.RegisterEventHandler((@event, info) => { @@ -22,10 +46,8 @@ namespace dRandomSkills if (playerInfo?.Skill == "Obrót Wroga" && victim.PawnIsAlive) { - if (Instance.Random.NextDouble() <= 0.25) - { + if (Instance.Random.NextDouble() <= playerInfo.SkillChance) RotateEnemy(victim); - } } return HookResult.Continue; diff --git a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Phoenix.cs b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Phoenix.cs index 5367df5..4dc7893 100644 --- a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Phoenix.cs +++ b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Phoenix.cs @@ -1,3 +1,4 @@ +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using static dRandomSkills.dRandomSkills; @@ -6,24 +7,46 @@ namespace dRandomSkills { public static class Phoenix { - private const double ReviveChance = 0.35; - public static void LoadPhoenix() { - Utils.RegisterSkill("Phoenix", "Masz 35% szans na odrodzenie się po śmierci", "#ff5C0A"); + Utils.RegisterSkill("Phoenix", "Masz losową szans na odrodzenie się po śmierci", "#ff5C0A", false); + + Instance.RegisterEventHandler((@event, info) => + { + Instance.AddTimer(0.1f, () => + { + foreach (var player in Utilities.GetPlayers()) + { + if (!IsPlayerValid(player)) continue; + + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != "Phoenix") continue; + + float newChance = (float)Instance.Random.NextDouble() * (.40f - .20f) + .20f; + playerInfo.SkillChance = newChance; + newChance = (float)Math.Round(newChance, 2) * 100; + newChance = (float)Math.Round(newChance); + + Utils.PrintToChat(player, $"{ChatColors.DarkRed}\"Phoenix\"{ChatColors.Lime}: Twoje szanse na odrodzenie się po śmierci: {newChance}%", false); + } + }); + + return HookResult.Continue; + }); Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - if (!IsValidPlayer(player)) return HookResult.Continue; + if (!IsPlayerValid(player)) return HookResult.Continue; var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == "Phoenix") { - if (Instance.Random.NextDouble() <= ReviveChance) + if (Instance.Random.NextDouble() <= playerInfo.SkillChance) { player.Respawn(); + Instance.AddTimer(.2f, () => player.Respawn()); Utils.PrintToChat(player, $"Zostałeś odrodzony z popiołów dzięki mocy: {ChatColors.DarkRed}Phoenix", false); } } @@ -32,7 +55,7 @@ namespace dRandomSkills }); } - private static bool IsValidPlayer(CCSPlayerController player) + private static bool IsPlayerValid(CCSPlayerController player) { return player != null && player.IsValid; } diff --git a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Pilot.cs b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Pilot.cs index 3f00b1c..bb1ad83 100644 --- a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Pilot.cs +++ b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Pilot.cs @@ -12,7 +12,7 @@ namespace dRandomSkills public static void LoadPilot() { - Utils.RegisterSkill("Pilot", "Latanie na noclip przez dany czas", "#1466F5"); + Utils.RegisterSkill("Pilot", "Latanie przez okreœlony czas. Przytrzymaj [USE - E], aby lataæ!", "#1466F5"); Instance.RegisterEventHandler((@event, info) => { diff --git a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Rambo.cs b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Rambo.cs index 96878df..a812d84 100644 --- a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Rambo.cs +++ b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Rambo.cs @@ -1,5 +1,6 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Utils; using static dRandomSkills.dRandomSkills; namespace dRandomSkills @@ -16,7 +17,7 @@ namespace dRandomSkills { foreach (var player in Utilities.GetPlayers()) { - if (IsValidPlayer(player)) continue; + if (!IsValidPlayer(player)) continue; var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == "Rambo") { @@ -39,15 +40,10 @@ namespace dRandomSkills var pawn = player.PlayerPawn?.Value; if (pawn == null) return; - player.Health = Math.Min(player.Health + health, player.MaxHealth); - pawn.Health = Math.Min(pawn.Health + health, pawn.MaxHealth); - - if (health > 100) - { - player.MaxHealth = Math.Min(player.MaxHealth + health, 1000); - pawn.MaxHealth = Math.Min(pawn.MaxHealth + health, 1000); - } + pawn.MaxHealth = Math.Min(pawn.Health + health, 1000); + Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iMaxHealth"); + pawn.Health = pawn.MaxHealth; Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth"); } } diff --git a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Rozbrojenie.cs b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Rozbrojenie.cs index abd0d95..ce8a882 100644 --- a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Rozbrojenie.cs +++ b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Rozbrojenie.cs @@ -1,4 +1,6 @@ +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Utils; using static dRandomSkills.dRandomSkills; namespace dRandomSkills @@ -8,8 +10,31 @@ namespace dRandomSkills public static void LoadRozbrojenie() { - Utils.RegisterSkill("Rozbrojenie", "Masz 25% szans na wyrzucenie broni wroga po trafieniu", "#FF4500"); - + Utils.RegisterSkill("Rozbrojenie", "Masz losow¹ szanse na wyrzucenie broni wroga po trafieniu", "#FF4500", false); + + Instance.RegisterEventHandler((@event, info) => + { + Instance.AddTimer(0.1f, () => + { + foreach (var player in Utilities.GetPlayers()) + { + if (!IsPlayerValid(player)) continue; + + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != "Rozbrojenie") continue; + + float newChance = (float)Instance.Random.NextDouble() * (.40f - .20f) + .20f; + playerInfo.SkillChance = newChance; + newChance = (float)Math.Round(newChance, 2) * 100; + newChance = (float)Math.Round(newChance); + + Utils.PrintToChat(player, $"{ChatColors.DarkRed}\"Rozbrojenie\"{ChatColors.Lime}: Twoje szanse na wyrzucenie broni wroga to: {newChance}%", false); + } + }); + + return HookResult.Continue; + }); + Instance.RegisterEventHandler((@event, info) => { var attacker = @event.Attacker; @@ -23,23 +48,22 @@ namespace dRandomSkills if (playerInfo?.Skill == "Rozbrojenie" && victim.PawnIsAlive) { - if (Instance.Random.NextDouble() <= 0.25) + if (Instance.Random.NextDouble() <= playerInfo.SkillChance) { var weaponServices = victim.PlayerPawn?.Value?.WeaponServices; - if (weaponServices?.MyWeapons == null) return HookResult.Continue; + if (weaponServices?.ActiveWeapon == null) return HookResult.Continue; - foreach (var weapon in weaponServices.MyWeapons) - { - var weaponName = weapon.Value.DesignerName; - if (weaponName != null && !weaponName.Contains("weapon_knife") && !weaponName.Contains("weapon_c4")) - { - victim.DropActiveWeapon(); - } - } + var weaponName = weaponServices?.ActiveWeapon?.Value?.DesignerName; + if (weaponName != null && !weaponName.Contains("weapon_knife") && !weaponName.Contains("weapon_c4")) + victim.DropActiveWeapon(); } } return HookResult.Continue; }); } + private static bool IsPlayerValid(CCSPlayerController player) + { + return player != null && player.IsValid && player.PlayerPawn?.Value != null; + } } } \ No newline at end of file diff --git a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Saper.cs b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Saper.cs new file mode 100644 index 0000000..eb62e59 --- /dev/null +++ b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Saper.cs @@ -0,0 +1,68 @@ +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; +using static dRandomSkills.dRandomSkills; + +namespace dRandomSkills +{ + public static class Saper + { + public static void LoadEliminator() + { + Utils.RegisterSkill("Saper", "Możesz szybciej podłożyć bombę oraz ją zdefować", "#8A2BE2"); + + Instance.RegisterEventHandler((@event, info) => + { + foreach (var player in Utilities.GetPlayers()) + { + if (!IsPlayerValid(player)) return HookResult.Continue; + + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill == "Saper") + { + var bombEntities = Utilities.FindAllEntitiesByDesignerName("weapon_c4").ToList(); + + if (bombEntities.Any()) + { + var bomb = bombEntities.FirstOrDefault(); + if (bomb != null) + { + bomb.BombPlacedAnimation = false; + bomb.ArmedTime = 0.0f; + } + } + } + } + + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + var player = @event.Userid; + + if (IsPlayerValid(player)) + { + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill == "Saper") + { + var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); + if (plantedBomb != null) + { + Server.NextFrame(() => + { + plantedBomb.DefuseCountDown = 0; + }); + } + } + } + + return HookResult.Continue; + }); + } + + private static bool IsPlayerValid(CCSPlayerController player) + { + return player != null && player.IsValid && player.PlayerPawn?.Value != null; + } + } +} \ No newline at end of file diff --git a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Teleporter.cs b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Teleporter.cs index 6efb7bd..b8b5ff0 100644 --- a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Teleporter.cs +++ b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/Teleporter.cs @@ -1,5 +1,8 @@ using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Utils; +using System.Numerics; using static dRandomSkills.dRandomSkills; +using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; namespace dRandomSkills { @@ -16,7 +19,6 @@ namespace dRandomSkills if (!IsValidPlayer(victim) || !IsValidPlayer(attacker)) return HookResult.Continue; - var victimInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID); var attackerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); if (attackerInfo?.Skill == "Teleportator") @@ -38,16 +40,16 @@ namespace dRandomSkills var attackerPawn = attacker.PlayerPawn.Value; var victimPawn = victim.PlayerPawn.Value; - var attackerPosition = attackerPawn.AbsOrigin; - var attackerAngles = attackerPawn.AbsRotation; - var attackerVelocity = attackerPawn.AbsVelocity; + Vector attackerPosition = new Vector(attackerPawn.AbsOrigin.X, attackerPawn.AbsOrigin.Y, attackerPawn.AbsOrigin.Z); + QAngle attackerAngles = new QAngle(attackerPawn.AbsRotation.X, attackerPawn.AbsRotation.Y, attackerPawn.AbsRotation.Z); + Vector attackerVelocity = new Vector(attackerPawn.AbsVelocity.X, attackerPawn.AbsVelocity.Y, attackerPawn.AbsVelocity.Z); - var victimPosition = victimPawn.AbsOrigin; - var victimAngles = victimPawn.AbsRotation; - var victimVelocity = victimPawn.AbsVelocity; + Vector victimPosition = new Vector(victimPawn.AbsOrigin.X, victimPawn.AbsOrigin.Y, victimPawn.AbsOrigin.Z); + QAngle victimAngles = new QAngle(victimPawn.AbsRotation.X, victimPawn.AbsRotation.Y, victimPawn.AbsRotation.Z); + Vector victimVelocity = new Vector(victimPawn.AbsVelocity.X, victimPawn.AbsVelocity.Y, victimPawn.AbsVelocity.Z); - attackerPawn.Teleport(victimPosition, victimAngles, victimVelocity); victimPawn.Teleport(attackerPosition, attackerAngles, attackerVelocity); + attackerPawn.Teleport(victimPosition, victimAngles, victimVelocity); } } } diff --git a/[ D3X ] dRandomSkills - SRC Files/src/player/skills/ZamianaMiejsc.cs b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/ZamianaMiejsc.cs new file mode 100644 index 0000000..79a4b8b --- /dev/null +++ b/[ D3X ] dRandomSkills - SRC Files/src/player/skills/ZamianaMiejsc.cs @@ -0,0 +1,164 @@ +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Utils; +using static CounterStrikeSharp.API.Core.Listeners; +using static dRandomSkills.dRandomSkills; + +namespace dRandomSkills +{ + public static class ZamianaMiejsc + { + private static float timerCooldown = 30f; + private static readonly Dictionary SkillPlayerInfo = new Dictionary(); + public static void LoadZamianaMiejsc() + { + Utils.RegisterSkill("ZamianaMiejsc", "Zamiana miejscami z losowym wrogiem. Kliknij [USE - E], cooldown 30s!", "#1466F5"); + + Instance.RegisterEventHandler((@event, info) => + { + Instance.RegisterListener(CheckHandle); + Instance.AddTimer(0.1f, () => + { + foreach (var player in Utilities.GetPlayers()) + { + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill == "ZamianaMiejsc") + { + SkillPlayerInfo[player.SteamID] = new ZamianaMiejsc_PlayerInfo + { + SteamID = player.SteamID, + CanUse = true, + Cooldown = DateTime.MinValue + }; + } + } + }); + + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + Instance.RemoveListener(CheckHandle); + SkillPlayerInfo.Clear(); + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + var player = @event.Userid; + + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill == "ZamianaMiejsc") + if (SkillPlayerInfo.ContainsKey(player.SteamID)) + SkillPlayerInfo.Remove(player.SteamID); + + return HookResult.Continue; + }); + } + + private static void CheckHandle() + { + foreach (var player in Utilities.GetPlayers()) + { + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill == "ZamianaMiejsc") + { + Handle(player); + } + } + } + + private static void Handle(CCSPlayerController player) + { + var buttons = player.Buttons; + if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + { + if (buttons.HasFlag(PlayerButtons.Use)) + { + if (skillInfo.CanUse) + UseSkill(player, skillInfo); + else + UpdateHUD(player, skillInfo); + } + } + } + + private static void UpdateHUD(CCSPlayerController player, ZamianaMiejsc_PlayerInfo skillInfo = null) + { + float cooldown = 0; + if (skillInfo != null) + { + float time = (float)((skillInfo.Cooldown.Second + timerCooldown) - DateTime.Now.Second); + cooldown = time > 0 ? time : 0; + } + + string infoLine = $"ZamianaMiejsc:
"; + string remainingLine = skillInfo == null ? "Nie znaleziono przeciwnika
" : $"Musisz poczekać jeszcze {cooldown} sekund
"; + + var hudContent = infoLine + remainingLine; + player.PrintToCenterHtml(hudContent); + } + + private static void ActiveUse(CCSPlayerController player) + { + if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + { + skillInfo.CanUse = true; + } + } + + private static void UseSkill(CCSPlayerController player, ZamianaMiejsc_PlayerInfo skillInfo) + { + var playerPawn = player.PlayerPawn.Value; + if (playerPawn?.CBodyComponent == null) return; + + List enemy = Utilities.GetPlayers().FindAll(p => IsPlayerValid(p) && p.Team != player.Team && p.PawnIsAlive); + if (enemy.Count == 0) + { + UpdateHUD(player); + return; + } + + CCSPlayerController randomEnemy = enemy[Instance.Random.Next(0, enemy.Count)]; + if (player.IsValid && player.PawnIsAlive && randomEnemy.IsValid && randomEnemy.PawnIsAlive) + { + skillInfo.CanUse = false; + skillInfo.Cooldown = DateTime.Now; + Instance.AddTimer(timerCooldown, () => ActiveUse(player)); + TeleportPlayers(player, randomEnemy); + } + else + UpdateHUD(player); + } + + private static void TeleportPlayers(CCSPlayerController attacker, CCSPlayerController victim) + { + var attackerPawn = attacker.PlayerPawn.Value; + var victimPawn = victim.PlayerPawn.Value; + + Vector attackerPosition = new Vector(attackerPawn.AbsOrigin.X, attackerPawn.AbsOrigin.Y, attackerPawn.AbsOrigin.Z); + QAngle attackerAngles = new QAngle(attackerPawn.AbsRotation.X, attackerPawn.AbsRotation.Y, attackerPawn.AbsRotation.Z); + Vector attackerVelocity = new Vector(attackerPawn.AbsVelocity.X, attackerPawn.AbsVelocity.Y, attackerPawn.AbsVelocity.Z); + + Vector victimPosition = new Vector(victimPawn.AbsOrigin.X, victimPawn.AbsOrigin.Y, victimPawn.AbsOrigin.Z); + QAngle victimAngles = new QAngle(victimPawn.AbsRotation.X, victimPawn.AbsRotation.Y, victimPawn.AbsRotation.Z); + Vector victimVelocity = new Vector(victimPawn.AbsVelocity.X, victimPawn.AbsVelocity.Y, victimPawn.AbsVelocity.Z); + + victimPawn.Teleport(attackerPosition, attackerAngles, attackerVelocity); + attackerPawn.Teleport(victimPosition, victimAngles, victimVelocity); + } + + private static bool IsPlayerValid(CCSPlayerController player) + { + return player != null && player.IsValid && player.PlayerPawn?.Value != null; + } + + public class ZamianaMiejsc_PlayerInfo + { + public ulong SteamID { get; set; } + public bool CanUse { get; set; } + public DateTime Cooldown { get; set; } + } + } +} \ No newline at end of file diff --git a/[ D3X ] dRandomSkills - SRC Files/src/utils/Utils.cs b/[ D3X ] dRandomSkills - SRC Files/src/utils/Utils.cs index f2cf2bc..1f5a407 100644 --- a/[ D3X ] dRandomSkills - SRC Files/src/utils/Utils.cs +++ b/[ D3X ] dRandomSkills - SRC Files/src/utils/Utils.cs @@ -1,5 +1,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; +using System.Diagnostics; namespace dRandomSkills { @@ -11,11 +12,11 @@ namespace dRandomSkills player.PrintToChat($" {ChatColors.DarkRed}► {ChatColors.Green}[{ChatColors.DarkRed} LOSOWE MOCE {ChatColors.Green}] {checkIcon} {msg}"); } - public static void RegisterSkill(string name, string description, string color) + public static void RegisterSkill(string name, string description, string color, bool display = true) { if (!SkillData.Skills.Any(skill => skill.Name == name)) { - SkillData.Skills.Add(new dSkill_SkillInfo(name, description, color)); + SkillData.Skills.Add(new dSkill_SkillInfo(name, description, color, display)); } } } diff --git a/[ D3X ] dRandomSkills - Server Files/plugins/dRandomSkills/dRandomSkills.dll b/[ D3X ] dRandomSkills - Server Files/plugins/dRandomSkills/dRandomSkills.dll index 4338e36..7e98c3f 100644 Binary files a/[ D3X ] dRandomSkills - Server Files/plugins/dRandomSkills/dRandomSkills.dll and b/[ D3X ] dRandomSkills - Server Files/plugins/dRandomSkills/dRandomSkills.dll differ