This commit is contained in:
Juzlus 2025-02-14 01:39:32 +01:00
parent 68f26a22f4
commit 68776c3382
28 changed files with 819 additions and 116 deletions

View file

@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 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.
// </auto-generated>
//------------------------------------------------------------------------------
namespace dRandomSkills.Properties {
using System;
/// <summary>
/// Klasa zasobu wymagająca zdefiniowania typu do wyszukiwania zlokalizowanych ciągów itd.
/// </summary>
// 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() {
}
/// <summary>
/// Zwraca buforowane wystąpienie ResourceManager używane przez tę klasę.
/// </summary>
[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;
}
}
/// <summary>
/// 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.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

View file

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 1.3
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">1.3</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1">this is my long string</data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
[base64 mime encoded serialized .NET Framework object]
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
[base64 mime encoded string representing a byte array form of the .NET Framework object]
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View file

@ -0,0 +1,8 @@
{
"profiles": {
"dRandomSkills": {
"commandName": "Project",
"nativeDebugging": true
}
}
}

View file

@ -7,8 +7,23 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.264" /> <PackageReference Include="CounterStrikeSharp.API" Version="1.0.305" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
</Project> </Project>

View file

@ -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

View file

@ -12,7 +12,7 @@ namespace dRandomSkills
public override string ModuleName => "[CS2] D3X - [ Random Skills ]"; public override string ModuleName => "[CS2] D3X - [ Random Skills ]";
public override string ModuleAuthor => "D3X"; 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 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) public override void Load(bool hotReload)
{ {
@ -23,30 +23,35 @@ namespace dRandomSkills
PlayerOnTick.Load(); PlayerOnTick.Load();
Command.Load(); Command.Load();
// ==== NOWE ====
MiniMajk.LoadMiniMajk();
ZamianaMiejsc.LoadZamianaMiejsc();
// ==== POPRAWIONE/NAPRAWIONE ====
Flash.LoadFlash();
PawelJumper.LoadPawelJumper(); PawelJumper.LoadPawelJumper();
Duszek.LoadDuszek();
BunnyHop.LoadBunnyHop(); BunnyHop.LoadBunnyHop();
Impostor.LoadImpostor(); Impostor.LoadImpostor();
Phoenix.LoadPhoenix();
Muhammed.LoadMuhammed();
Pilot.LoadPilot();
Rambo.LoadRambo();
Bogacz.LoadBogacz();
Flash.LoadFlash();
Astronauta.LoadAstronauta();
Medyk.LoadMedyk();
Kurczak.LoadKurczak();
OneShot.LoadOneShot(); OneShot.LoadOneShot();
Drakula.LoadDrakula(); Muhammed.LoadMuhammed();
AntyFlash.LoadAntyFlash(); Bogacz.LoadBogacz();
Rambo.LoadRambo();
Medyk.LoadMedyk();
Duszek.LoadDuszek();
Kurczak.LoadKurczak();
Astronauta.LoadAstronauta();
Rozbrojenie.LoadRozbrojenie(); Rozbrojenie.LoadRozbrojenie();
ZelaznaGlowa.LoadZelaznaGlowa(); AntyFlash.LoadAntyFlash();
ObrotWroga.LoadObrotWroga();
NieskonczoneAmmo.LoadNieskonczoneAmmo(); NieskonczoneAmmo.LoadNieskonczoneAmmo();
Katapulta.LoadKatapulta(); Katapulta.LoadKatapulta();
ObrotWroga.LoadObrotWroga(); Drakula.LoadDrakula();
Cien.LoadCien();
Teleporter.LoadTeleporter(); 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 ulong SteamID { get; set; }
public required string PlayerName { get; set; } public required string PlayerName { get; set; }
public string? Skill { get; set; } public string? Skill { get; set; }
public float? SkillChance { get; set; }
public bool IsDrawing { get; set; } public bool IsDrawing { get; set; }
} }
@ -64,11 +70,14 @@ namespace dRandomSkills
public string Description { get; } public string Description { get; }
public string Color { 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; Name = name;
Description = description; Description = description;
Color = color; Color = color;
Display = display;
} }
} }

View file

@ -21,6 +21,7 @@ namespace dRandomSkills
PlayerName = player.PlayerName, PlayerName = player.PlayerName,
Skill = "", Skill = "",
IsDrawing = false, IsDrawing = false,
SkillChance = 1,
}); });
return HookResult.Continue; return HookResult.Continue;
@ -73,6 +74,7 @@ namespace dRandomSkills
var randomSkill = SkillData.Skills[Instance.Random.Next(SkillData.Skills.Count)]; var randomSkill = SkillData.Skills[Instance.Random.Next(SkillData.Skills.Count)];
skillPlayer.Skill = randomSkill.Name; skillPlayer.Skill = randomSkill.Name;
if (randomSkill.Display)
Utils.PrintToChat(player, $"{ChatColors.DarkRed}{randomSkill.Name}{ChatColors.Lime}: {randomSkill.Description}", false); Utils.PrintToChat(player, $"{ChatColors.DarkRed}{randomSkill.Name}{ChatColors.Lime}: {randomSkill.Description}", false);
if(Config.config.Settings.TeamMateSkillInfo) if(Config.config.Settings.TeamMateSkillInfo)

View file

@ -7,7 +7,7 @@ namespace dRandomSkills
{ {
public static void LoadAntyFlash() 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<EventPlayerBlind>((@event, info) => Instance.RegisterEventHandler<EventPlayerBlind>((@event, info) =>
{ {
@ -19,12 +19,11 @@ namespace dRandomSkills
if (!IsPlayerValid(player)) return HookResult.Continue; if (!IsPlayerValid(player)) return HookResult.Continue;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
var sameTeam = attacker.Team == player.Team;
if (playerInfo?.Skill == "Anty Flash") if (playerInfo?.Skill == "Anty Flash")
{
playerPawn.FlashDuration = 0.0f; playerPawn.FlashDuration = 0.0f;
} else if (Instance.skillPlayer.Any(s => s.Skill == "Anty Flash"))
playerPawn.FlashDuration = 7.0f;
return HookResult.Continue; return HookResult.Continue;
}); });

View file

@ -1,5 +1,7 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities;
using CounterStrikeSharp.API.Modules.Utils;
using static dRandomSkills.dRandomSkills; using static dRandomSkills.dRandomSkills;
namespace dRandomSkills namespace dRandomSkills
@ -8,7 +10,7 @@ namespace dRandomSkills
{ {
public static void LoadAstronauta() 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<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {
@ -21,7 +23,7 @@ namespace dRandomSkills
if (playerInfo?.Skill == "Astronauta" && playerPawn != null) 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); float gravityModifier = (float)Math.Round(Instance.Random.NextDouble() * (0.7f - 0.1f) + 0.1f, 1);
playerPawn.GravityScale = gravityModifier; Utils.PrintToChat(player, $"{ChatColors.DarkRed}\"Astronauta\"{ChatColors.Lime}: Twoja losowa grawitacja wynosi: {gravityModifier}x", false);
player.Pawn.Value.GravityScale = gravityModifier;
} }
} }
} }

View file

@ -10,7 +10,7 @@ namespace dRandomSkills
public static void LoadCien() 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<EventPlayerHurt>((@event, info) => Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
{ {

View file

@ -6,8 +6,6 @@ namespace dRandomSkills
{ {
public static class Drakula public static class Drakula
{ {
const float VampirePercentage = 0.3f;
public static void LoadDrakula() public static void LoadDrakula()
{ {
Utils.RegisterSkill("Drakula", "Po trafieniu ofiary otrzymujesz zwrot zdrowia w postaci danego procentu zadanych obrażeń", "#FA050D"); 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; var attackerPawn = attacker.PlayerPawn.Value;
if (attackerPawn == null) return; if (attackerPawn == null) return;
int healing = (int)(damage * VampirePercentage); int newHealth = (int)(attackerPawn.Health + (damage * 0.3));
int newHealth = Math.Min(attackerPawn.Health + healing, attackerPawn.MaxHealth);
attackerPawn.MaxHealth = Math.Max(newHealth, 100);
Utilities.SetStateChanged(attackerPawn, "CBaseEntity", "m_iMaxHealth");
attackerPawn.Health = newHealth; attackerPawn.Health = newHealth;
Utilities.SetStateChanged(attackerPawn, "CBaseEntity", "m_iHealth"); Utilities.SetStateChanged(attackerPawn, "CBaseEntity", "m_iHealth");
} }

View file

@ -1,6 +1,7 @@
using System.Drawing; using System.Drawing;
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using static CounterStrikeSharp.API.Core.Listeners;
using static dRandomSkills.dRandomSkills; using static dRandomSkills.dRandomSkills;
namespace dRandomSkills namespace dRandomSkills
@ -36,13 +37,42 @@ namespace dRandomSkills
if (!IsValidPlayer(player)) continue; if (!IsValidPlayer(player)) continue;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == "Duszek") if (playerInfo?.Skill == "Duszek")
{
SetPlayerVisibility(player, true); SetPlayerVisibility(player, true);
} }
}
return HookResult.Continue; return HookResult.Continue;
}); });
Instance.RegisterEventHandler<EventItemEquip>((@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>(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) private static bool IsValidPlayer(CCSPlayerController player)
@ -62,6 +92,18 @@ namespace dRandomSkills
playerPawn.ShadowStrength = shadowStrength; playerPawn.ShadowStrength = shadowStrength;
Utilities.SetStateChanged(playerPawn, "CBaseModelEntity", "m_clrRender"); Utilities.SetStateChanged(playerPawn, "CBaseModelEntity", "m_clrRender");
SetWeaponVisibility(player, visible);
}
}
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; var activeWeapon = playerPawn.WeaponServices?.ActiveWeapon.Value;
if (activeWeapon != null && activeWeapon.IsValid) if (activeWeapon != null && activeWeapon.IsValid)
{ {
@ -86,5 +128,4 @@ namespace dRandomSkills
} }
} }
} }
}
} }

View file

@ -1,5 +1,6 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using static dRandomSkills.dRandomSkills; using static dRandomSkills.dRandomSkills;
namespace dRandomSkills namespace dRandomSkills
@ -8,7 +9,7 @@ namespace dRandomSkills
{ {
public static void LoadFlash() 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<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {
@ -16,18 +17,20 @@ namespace dRandomSkills
{ {
foreach (var player in Utilities.GetPlayers()) foreach (var player in Utilities.GetPlayers())
{ {
if (!IsPlayerValid(player)) return; if (!IsPlayerValid(player)) continue;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); 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; var playerPawn = player.PlayerPawn?.Value;
if (playerPawn != null) if (playerPawn != null)
{ {
float velocityModifier = (float)Instance.Random.NextDouble() * (2.5f - 1.2f) + 1.2f; float newSpeed = (float)Instance.Random.NextDouble() * (3.0f - 1.2f) + 1.2f;
playerPawn.VelocityModifier = velocityModifier; newSpeed = (float)Math.Round(newSpeed, 2);
Utilities.SetStateChanged(player, "CCSPlayerPawn", "m_flVelocityModifier"); 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);
} }
} }
}); });

View file

@ -1,4 +1,6 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using static dRandomSkills.dRandomSkills; using static dRandomSkills.dRandomSkills;
namespace dRandomSkills namespace dRandomSkills
@ -8,7 +10,30 @@ namespace dRandomSkills
public static void LoadKatapulta() 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<EventRoundFreezeEnd>((@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<EventPlayerHurt>((@event, info) => Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
{ {
@ -23,7 +48,7 @@ namespace dRandomSkills
if (attackerInfo?.Skill == "Katapulta" && victim.PawnIsAlive) if (attackerInfo?.Skill == "Katapulta" && victim.PawnIsAlive)
{ {
if (Instance.Random.NextDouble() <= 0.25) if (Instance.Random.NextDouble() <= attackerInfo.SkillChance)
{ {
var victimPawn = victim.PlayerPawn?.Value; var victimPawn = victim.PlayerPawn?.Value;
if (victimPawn != null) if (victimPawn != null)
@ -36,5 +61,9 @@ namespace dRandomSkills
return HookResult.Continue; return HookResult.Continue;
}); });
} }
private static bool IsPlayerValid(CCSPlayerController player)
{
return player != null && player.IsValid && player.PlayerPawn?.Value != null;
}
} }
} }

View file

@ -1,15 +1,30 @@
using System.Drawing; using System.Drawing;
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using static CounterStrikeSharp.API.Core.Listeners;
using static dRandomSkills.dRandomSkills; using static dRandomSkills.dRandomSkills;
namespace dRandomSkills namespace dRandomSkills
{ {
public static class Kurczak 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() 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<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {
@ -17,10 +32,10 @@ namespace dRandomSkills
{ {
foreach (var player in Utilities.GetPlayers()) foreach (var player in Utilities.GetPlayers())
{ {
if (!IsPlayerValid(player)) return; if (!IsPlayerValid(player)) continue;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); 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; var playerPawn = player.PlayerPawn?.Value;
if (playerPawn != null) if (playerPawn != null)
@ -29,12 +44,35 @@ namespace dRandomSkills
playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().MaterialGroup.Value = (uint)Instance.Random.Next(1, 4); playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().MaterialGroup.Value = (uint)Instance.Random.Next(1, 4);
playerPawn.VelocityModifier = 1.1f; playerPawn.VelocityModifier = 1.1f;
Utilities.SetStateChanged(player, "CCSPlayerPawn", "m_flVelocityModifier"); Utilities.SetStateChanged(player, "CCSPlayerPawn", "m_flVelocityModifier");
playerPawn.Health = 50;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth");
} }
} }
}); });
return HookResult.Continue; return HookResult.Continue;
}); });
Instance.RegisterListener<OnTick>(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) public static void SetPlayerModel(CCSPlayerController player, string model)

View file

@ -16,16 +16,15 @@ namespace dRandomSkills
{ {
foreach (var player in Utilities.GetPlayers()) 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); 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); int healthshot = Instance.Random.Next(1, 10);
for (int i = 0; i < healthshot; i++) for (int i = 0; i < healthshot; i++)
{
player.GiveNamedItem("weapon_healthshot"); player.GiveNamedItem("weapon_healthshot");
} }
}
}); });
return HookResult.Continue; return HookResult.Continue;
@ -36,10 +35,6 @@ namespace dRandomSkills
foreach (var player in Utilities.GetPlayers()) foreach (var player in Utilities.GetPlayers())
{ {
if (!IsPlayerValid(player)) return HookResult.Continue; 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"); player.RemoveItemByDesignerName("weapon_healthshot");
} }

View file

@ -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<EventRoundFreezeEnd>((@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;
}
}
}

View file

@ -1,4 +1,5 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using static dRandomSkills.dRandomSkills; using static dRandomSkills.dRandomSkills;
namespace dRandomSkills namespace dRandomSkills
@ -25,6 +26,20 @@ namespace dRandomSkills
return HookResult.Continue; return HookResult.Continue;
}); });
Instance.RegisterEventHandler<EventGrenadeThrown>((@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<EventWeaponReload>((@event, info) => Instance.RegisterEventHandler<EventWeaponReload>((@event, info) =>
{ {
var player = @event.Userid; var player = @event.Userid;

View file

@ -1,3 +1,4 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using static dRandomSkills.dRandomSkills; using static dRandomSkills.dRandomSkills;
@ -8,7 +9,30 @@ namespace dRandomSkills
{ {
public static void LoadObrotWroga() 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<EventRoundFreezeEnd>((@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<EventPlayerHurt>((@event, info) => Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
{ {
@ -22,11 +46,9 @@ namespace dRandomSkills
if (playerInfo?.Skill == "Obrót Wroga" && victim.PawnIsAlive) if (playerInfo?.Skill == "Obrót Wroga" && victim.PawnIsAlive)
{ {
if (Instance.Random.NextDouble() <= 0.25) if (Instance.Random.NextDouble() <= playerInfo.SkillChance)
{
RotateEnemy(victim); RotateEnemy(victim);
} }
}
return HookResult.Continue; return HookResult.Continue;
}); });

View file

@ -1,3 +1,4 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using static dRandomSkills.dRandomSkills; using static dRandomSkills.dRandomSkills;
@ -6,24 +7,46 @@ namespace dRandomSkills
{ {
public static class Phoenix public static class Phoenix
{ {
private const double ReviveChance = 0.35;
public static void LoadPhoenix() 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<EventRoundFreezeEnd>((@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<EventPlayerDeath>((@event, info) => Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
{ {
var player = @event.Userid; 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); var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == "Phoenix") if (playerInfo?.Skill == "Phoenix")
{ {
if (Instance.Random.NextDouble() <= ReviveChance) if (Instance.Random.NextDouble() <= playerInfo.SkillChance)
{ {
player.Respawn(); player.Respawn();
Instance.AddTimer(.2f, () => player.Respawn());
Utils.PrintToChat(player, $"Zostałeś odrodzony z popiołów dzięki mocy: {ChatColors.DarkRed}Phoenix", false); 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; return player != null && player.IsValid;
} }

View file

@ -12,7 +12,7 @@ namespace dRandomSkills
public static void LoadPilot() 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<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {

View file

@ -1,5 +1,6 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using static dRandomSkills.dRandomSkills; using static dRandomSkills.dRandomSkills;
namespace dRandomSkills namespace dRandomSkills
@ -16,7 +17,7 @@ namespace dRandomSkills
{ {
foreach (var player in Utilities.GetPlayers()) foreach (var player in Utilities.GetPlayers())
{ {
if (IsValidPlayer(player)) continue; if (!IsValidPlayer(player)) continue;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == "Rambo") if (playerInfo?.Skill == "Rambo")
{ {
@ -39,15 +40,10 @@ namespace dRandomSkills
var pawn = player.PlayerPawn?.Value; var pawn = player.PlayerPawn?.Value;
if (pawn == null) return; if (pawn == null) return;
player.Health = Math.Min(player.Health + health, player.MaxHealth); pawn.MaxHealth = Math.Min(pawn.Health + health, 1000);
pawn.Health = Math.Min(pawn.Health + health, pawn.MaxHealth); Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iMaxHealth");
if (health > 100)
{
player.MaxHealth = Math.Min(player.MaxHealth + health, 1000);
pawn.MaxHealth = Math.Min(pawn.MaxHealth + health, 1000);
}
pawn.Health = pawn.MaxHealth;
Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth"); Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth");
} }
} }

View file

@ -1,4 +1,6 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using static dRandomSkills.dRandomSkills; using static dRandomSkills.dRandomSkills;
namespace dRandomSkills namespace dRandomSkills
@ -8,7 +10,30 @@ namespace dRandomSkills
public static void LoadRozbrojenie() 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<EventRoundFreezeEnd>((@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<EventPlayerHurt>((@event, info) => Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
{ {
@ -23,23 +48,22 @@ namespace dRandomSkills
if (playerInfo?.Skill == "Rozbrojenie" && victim.PawnIsAlive) if (playerInfo?.Skill == "Rozbrojenie" && victim.PawnIsAlive)
{ {
if (Instance.Random.NextDouble() <= 0.25) if (Instance.Random.NextDouble() <= playerInfo.SkillChance)
{ {
var weaponServices = victim.PlayerPawn?.Value?.WeaponServices; 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 = weaponServices?.ActiveWeapon?.Value?.DesignerName;
{
var weaponName = weapon.Value.DesignerName;
if (weaponName != null && !weaponName.Contains("weapon_knife") && !weaponName.Contains("weapon_c4")) if (weaponName != null && !weaponName.Contains("weapon_knife") && !weaponName.Contains("weapon_c4"))
{
victim.DropActiveWeapon(); victim.DropActiveWeapon();
} }
} }
}
}
return HookResult.Continue; return HookResult.Continue;
}); });
} }
private static bool IsPlayerValid(CCSPlayerController player)
{
return player != null && player.IsValid && player.PlayerPawn?.Value != null;
}
} }
} }

View file

@ -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<EventBombBeginplant>((@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<CC4>("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<EventBombBegindefuse>((@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<CPlantedC4>("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;
}
}
}

View file

@ -1,5 +1,8 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using System.Numerics;
using static dRandomSkills.dRandomSkills; using static dRandomSkills.dRandomSkills;
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
namespace dRandomSkills namespace dRandomSkills
{ {
@ -16,7 +19,6 @@ namespace dRandomSkills
if (!IsValidPlayer(victim) || !IsValidPlayer(attacker)) return HookResult.Continue; 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); var attackerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
if (attackerInfo?.Skill == "Teleportator") if (attackerInfo?.Skill == "Teleportator")
@ -38,16 +40,16 @@ namespace dRandomSkills
var attackerPawn = attacker.PlayerPawn.Value; var attackerPawn = attacker.PlayerPawn.Value;
var victimPawn = victim.PlayerPawn.Value; var victimPawn = victim.PlayerPawn.Value;
var attackerPosition = attackerPawn.AbsOrigin; Vector attackerPosition = new Vector(attackerPawn.AbsOrigin.X, attackerPawn.AbsOrigin.Y, attackerPawn.AbsOrigin.Z);
var attackerAngles = attackerPawn.AbsRotation; QAngle attackerAngles = new QAngle(attackerPawn.AbsRotation.X, attackerPawn.AbsRotation.Y, attackerPawn.AbsRotation.Z);
var attackerVelocity = attackerPawn.AbsVelocity; Vector attackerVelocity = new Vector(attackerPawn.AbsVelocity.X, attackerPawn.AbsVelocity.Y, attackerPawn.AbsVelocity.Z);
var victimPosition = victimPawn.AbsOrigin; Vector victimPosition = new Vector(victimPawn.AbsOrigin.X, victimPawn.AbsOrigin.Y, victimPawn.AbsOrigin.Z);
var victimAngles = victimPawn.AbsRotation; QAngle victimAngles = new QAngle(victimPawn.AbsRotation.X, victimPawn.AbsRotation.Y, victimPawn.AbsRotation.Z);
var victimVelocity = victimPawn.AbsVelocity; Vector victimVelocity = new Vector(victimPawn.AbsVelocity.X, victimPawn.AbsVelocity.Y, victimPawn.AbsVelocity.Z);
attackerPawn.Teleport(victimPosition, victimAngles, victimVelocity);
victimPawn.Teleport(attackerPosition, attackerAngles, attackerVelocity); victimPawn.Teleport(attackerPosition, attackerAngles, attackerVelocity);
attackerPawn.Teleport(victimPosition, victimAngles, victimVelocity);
} }
} }
} }

View file

@ -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<ulong, ZamianaMiejsc_PlayerInfo> SkillPlayerInfo = new Dictionary<ulong, ZamianaMiejsc_PlayerInfo>();
public static void LoadZamianaMiejsc()
{
Utils.RegisterSkill("ZamianaMiejsc", "Zamiana miejscami z losowym wrogiem. Kliknij [USE - E], cooldown 30s!", "#1466F5");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{
Instance.RegisterListener<OnTick>(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<EventRoundEnd>((@event, info) =>
{
Instance.RemoveListener<OnTick>(CheckHandle);
SkillPlayerInfo.Clear();
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@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 = $"<font color='#FFFFFF'>ZamianaMiejsc:</font> <br>";
string remainingLine = skillInfo == null ? "<font color='#FF0000'>Nie znaleziono przeciwnika</font> <br>" : $"<font color='#FFFFFF'>Musisz poczekać jeszcze <font color='#FF0000'>{cooldown}</font> sekund</font> <br>";
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<CCSPlayerController> 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; }
}
}
}

View file

@ -1,5 +1,6 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using System.Diagnostics;
namespace dRandomSkills namespace dRandomSkills
{ {
@ -11,11 +12,11 @@ namespace dRandomSkills
player.PrintToChat($" {ChatColors.DarkRed}► {ChatColors.Green}[{ChatColors.DarkRed} LOSOWE MOCE {ChatColors.Green}] {checkIcon} {msg}"); 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)) 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));
} }
} }
} }