v1.10.0
This commit is contained in:
parent
ae13d6a15c
commit
53917a8b4b
62 changed files with 2643 additions and 935 deletions
|
|
@ -1,9 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup />
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Update="Properties\Resources.resx">
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
|
@ -8,7 +8,7 @@
|
|||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace src.player.skills.Properties {
|
||||
namespace jRandomSkills.Properties {
|
||||
using System;
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -14,14 +14,14 @@
|
|||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.361" />
|
||||
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.362" />
|
||||
<PackageReference Include="CS2TraceRay" Version="1.0.9" />
|
||||
<PackageReference Include="MaxMind.Db" Version="4.3.4" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\WASDMenuAPI - SRC Files\WASDMenuAPI.csproj" />
|
||||
<ProjectReference Include="..\..\..\source\repos\WASDMenuAPI-master\WASDMenuAPI\WASDMenuAPI.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
@ -3,7 +3,9 @@ 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}") = "!jRandomSkills", "!jRandomSkills.csproj", "{1412DD25-558C-425A-A7F6-347C970136E5}"
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "jRandomSkills", "jRandomSkills.csproj", "{1412DD25-558C-425A-A7F6-347C970136E5}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WASDMenuAPI", "..\..\..\source\repos\WASDMenuAPI-master\WASDMenuAPI\WASDMenuAPI.csproj", "{E13A84FA-EAB5-CAC7-8143-DD55AB40EAB5}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
|
|
@ -15,6 +17,10 @@ Global
|
|||
{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
|
||||
{E13A84FA-EAB5-CAC7-8143-DD55AB40EAB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{E13A84FA-EAB5-CAC7-8143-DD55AB40EAB5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E13A84FA-EAB5-CAC7-8143-DD55AB40EAB5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E13A84FA-EAB5-CAC7-8143-DD55AB40EAB5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
|
|
|||
|
|
@ -78,6 +78,9 @@ namespace src.command
|
|||
if (playerPawn?.CBodyComponent == null) return;
|
||||
if (!player.IsValid || !player.PawnIsAlive) return;
|
||||
|
||||
if (SkillsInfo.GetValue<bool>(playerInfo.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime())
|
||||
return;
|
||||
|
||||
string[] commands = _.ArgString.Trim().Split(" ", StringSplitOptions.RemoveEmptyEntries);
|
||||
Debug.WriteToDebug($"Player {player.PlayerName} used the skill: {playerInfo.Skill}");
|
||||
if (commands == null || commands.Length == 0)
|
||||
|
|
@ -464,14 +467,12 @@ namespace src.command
|
|||
if (player == null || !player.IsValid) return;
|
||||
if (!string.IsNullOrEmpty(config.NormalCommands.ChangeLanguageCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.NormalCommands.ChangeLanguageCommand.Permissions)) return;
|
||||
|
||||
string fileName;
|
||||
string fileName = Config.LoadedConfig.LanguageSystem.DefaultLangCode;
|
||||
string newLangCode = command.GetArg(1).ToUpper();
|
||||
foreach (var langInfo in Config.LoadedConfig.LanguageSystem.LanguageInfos)
|
||||
if (langInfo.IsoCodes.Contains(newLangCode))
|
||||
fileName = langInfo.FileName;
|
||||
if (!Localization.HasTranslation(newLangCode))
|
||||
fileName = Config.LoadedConfig.LanguageSystem.DefaultLangCode;
|
||||
else
|
||||
if (Localization.HasTranslation(newLangCode))
|
||||
fileName = newLangCode.ToLower();
|
||||
Localization.ChangePlayerLanguage(player, fileName);
|
||||
}
|
||||
|
|
@ -508,17 +509,5 @@ namespace src.command
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -27,7 +27,7 @@ namespace src
|
|||
public override string ModuleName => "[CS2] [ jRandomSkills ]";
|
||||
public override string ModuleAuthor => "D3X, Juzlus";
|
||||
public override string ModuleDescription => "Plugin adds random skills every round for CS2 by D3X. Modified by Juzlus.";
|
||||
public override string ModuleVersion => "1.1.9f";
|
||||
public override string ModuleVersion => "1.10.0";
|
||||
|
||||
public override void Load(bool hotReload)
|
||||
{
|
||||
|
|
|
|||
477
jRandomSkills - SRC Files/src/lang/de.json
Normal file
477
jRandomSkills - SRC Files/src/lang/de.json
Normal file
|
|
@ -0,0 +1,477 @@
|
|||
{
|
||||
"none": "Keine",
|
||||
"none_desc": "Du hast keine Fertigkeit",
|
||||
|
||||
"aimbot": "Aimbot",
|
||||
"aimbot_desc": "Jede Kugel, die du triffst, zählt als Kopfschuss",
|
||||
|
||||
"anomaly": "Anomalie",
|
||||
"anomaly_desc": "Du spulst die Zeit um einige Sekunden zurück",
|
||||
|
||||
"antyflash": "Anti-Flash",
|
||||
"antyflash_desc": "Du bist immun gegen Blendgranaten und deine Blendgranaten halten 7 Sekunden lang",
|
||||
|
||||
"antyhead": "Eiserner Kopf",
|
||||
"antyhead_desc": "Du erleidest keinen Schaden durch Kopfschüsse",
|
||||
|
||||
"areareaper": "Zone Reaper",
|
||||
"areareaper_desc": "Du kannst einen Bombenort auswählen, den du deaktivieren möchtest",
|
||||
"areareaper_incorrect_site": "Kein solcher Bombenort gefunden",
|
||||
"areareaper_no_site": "Keine Bombenstandorte gefunden.",
|
||||
"areareaper_select_info": "Standort zum Deaktivieren auswählen:",
|
||||
"areareaper_site_disabled": "Bombenstandort {0} wurde deaktiviert – dort können keine Bomben platziert werden!",
|
||||
"areareaper_used_info": "Deine Fähigkeit wurde bereits eingesetzt.",
|
||||
|
||||
"armored": "Gepanzert",
|
||||
"armored_desc": "Du hast einen zufälligen Schadensmultiplikator",
|
||||
"armored_desc2": "Dein Schadensmultiplikator beträgt: {0}x",
|
||||
|
||||
"assassin": "Attentäter",
|
||||
"assassin_desc": "Du fügst Gegnern von hinten erhöhten Schaden zu",
|
||||
|
||||
"astronaut": "Astronaut",
|
||||
"astronaut_desc": "Du erhältst zu Beginn der Runde einen zufälligen Schwerkraftwert",
|
||||
"astronaut_desc2": "Deine zufällige Schwerkraft beträgt: {0}x",
|
||||
|
||||
"moneyswap": "Steuerbeamter",
|
||||
"moneyswap_desc": "Wähle einen Spieler aus, mit dem du Geld tauschen möchtest",
|
||||
"moneyswap_enemy_info": "Das Finanzamt hat dich erwischt.",
|
||||
"moneyswap_player_info": "Du hast Geld mit dem Spieler \"{0}\" getauscht.",
|
||||
"moneyswap_select_info": "Geld mit Spieler tauschen:",
|
||||
|
||||
"baseball": "Baseballspieler",
|
||||
"baseball_desc": "Deine Attrappe prallt von Wänden ab und tötet einen Gegner sofort beim Aufprall.",
|
||||
|
||||
"behind": "Feind drehen",
|
||||
"behind_desc": "Du hast eine zufällige Chance, einen Feind um 180 Grad zu drehen, wenn du ihn triffst",
|
||||
"behind_desc2": "Deine Chance, einen Feind bei einem Treffer zu drehen, beträgt: {0} %",
|
||||
|
||||
"blademaster": "Schwertmeister",
|
||||
"blademaster_desc": "Wenn du ein Messer hältst, hast du eine hohe Chance, einen Schuss abzuwehren",
|
||||
|
||||
"bunnyhop": "Hase",
|
||||
"bunnyhop_desc": "Du erhältst automatisch bunnyhop",
|
||||
|
||||
"c4camouflage": "C4-Tarnung",
|
||||
"c4camouflage_desc": "Du bist unsichtbar, während du die Bombe hältst",
|
||||
|
||||
"carefulbullets": "Vorsichtige Kugeln",
|
||||
"carefulbullets_desc": "Wähle einen Spieler aus, der für jeden Fehlschuss Schaden nimmt",
|
||||
"carefulbullets_enemy_info": "Von nun an wird Ungenauigkeit buchstäblich wehtun.",
|
||||
"carefulbullets_player_info": "‚{0}‘ muss jetzt vorsichtiger sein.",
|
||||
"carefulbullets_select_info": "Fehler schaden dem Spieler:",
|
||||
|
||||
"catapult": "Katapult",
|
||||
"catapult_desc": "Du hast eine zufällige Chance, einen Gegner nach oben zu schleudern",
|
||||
"catapult_desc2": "Deine Chance, einen Gegner bei einem Treffer zu schleudern, beträgt: {0} %",
|
||||
|
||||
"chicken": "Huhn",
|
||||
"chicken_desc": "Du erhältst ein Huhn-Modell + 10 % schnellere Bewegung – 50 HP",
|
||||
|
||||
"chillout": "Chillout",
|
||||
"chillout_desc": "Das Platzieren der Bombe dauert deutlich länger",
|
||||
|
||||
"cutter": "Cutter",
|
||||
"cutter_desc": "Sofortiger Tod mit einem Messer",
|
||||
|
||||
"cypher": "Kamera",
|
||||
"cypher_desc": "Klicken Sie auf [css_useSkill], um eine Kamera zu erstellen/zu wechseln",
|
||||
"cypher_nospace": "Die Kamera muss im rechten Winkel zur Wand positioniert werden",
|
||||
|
||||
"darkness": "Dunkelheit",
|
||||
"darkness_desc": "Wendet einen Dunkelheitseffekt auf einen ausgewählten Gegner an",
|
||||
"darkness_enemy_info": "Lass die Lichter ausgehen",
|
||||
"darkness_player_info": "Die Dunkelheit hat den Spieler \"{0}\" überwältigt.",
|
||||
"darkness_select_info": "Wähle einen Spieler für die Dunkelheit aus:",
|
||||
|
||||
"deactivator": "Deaktivator",
|
||||
"deactivator_desc": "Wähle einen Spieler aus, dessen Fähigkeit du deaktivieren möchtest",
|
||||
"deactivator_enemy_info": "Deine Fähigkeit wurde deaktiviert",
|
||||
"deactivator_player_info": "Die Fähigkeit des Spielers ‚{0}‘ wurde deaktiviert",
|
||||
"deactivator_select_info": "Fähigkeit eines Spielers deaktivieren:",
|
||||
|
||||
"deaf": "Taub",
|
||||
"deaf_desc": "Wähle einen Spieler aus, für den alle Sounds stummgeschaltet werden sollen",
|
||||
"deaf_enemy_info": "Deine Kopfhörer haben das Spiel verlassen.",
|
||||
"deaf_player_info": "Der Ton für den Spieler ‚{0}‘ wurde deaktiviert.",
|
||||
"deaf_select_info": "Alle Töne für den Spieler stummschalten:",
|
||||
|
||||
"disarmament": "Entwaffnung",
|
||||
"disarmament_desc": "Du hast eine zufällige Chance, einen Gegner bei einem Treffer seine Waffe fallen zu lassen.",
|
||||
"disarmament_desc2": "Ihre Chance, einen Gegner zu entwaffnen, beträgt: {0} %",
|
||||
|
||||
"distancer": "Entfernungsmesser",
|
||||
"distancer_desc": "Sie können die Entfernung zum nächsten Gegner sehen",
|
||||
|
||||
"dash": "Sprinten",
|
||||
"dash_desc": "Führe einen zweiten Sprung aus, um zu sprinten",
|
||||
|
||||
"dracula": "Dracula",
|
||||
"dracula_desc": "Wenn du einen Gegner triffst, wird deine Gesundheit um einen Prozentsatz des verursachten Schadens wiederhergestellt",
|
||||
|
||||
"duplicator": "Duplikator",
|
||||
"duplicator_desc": "Wähle einen Spieler aus, dessen Fertigkeit du kopieren möchtest",
|
||||
"duplicator_player_info": "Die Fertigkeit des Spielers ‚{0}‘ wurde kopiert.",
|
||||
"duplicator_select_info": "Kopiere die Fertigkeit eines Spielers:",
|
||||
|
||||
"dwarf": "Zwerg",
|
||||
"dwarf_desc": "Zufällige Charaktergröße zu Beginn der Runde",
|
||||
"dwarf_desc2": "Dein Größenmultiplikator beträgt: {0}x",
|
||||
|
||||
"enemyspawn": "Feindes-Spawn",
|
||||
"enemyspawn_desc": "Klicke auf [css_useSkill], um zum Feindes-Spawn zu teleportieren",
|
||||
|
||||
"explosiveshot": "Explosiver Schuss",
|
||||
"explosiveshot_desc": "Zufällige Chance, beim Schießen eine explosive Kugel abzufeuern",
|
||||
"explosiveshot_desc2": "Deine Chance, eine explosive Kugel abzufeuern: {0} %",
|
||||
|
||||
"falconeye": "Falkenauge",
|
||||
"falconeye_desc": "Klicke auf [css_useSkill], um eine Vogelperspektive zu aktivieren",
|
||||
|
||||
"fastreload": "Schnellnachladen",
|
||||
"fastreload_desc": "Klicke auf [css_useSkill], um die Waffe, die du gerade hältst, nachzuladen",
|
||||
|
||||
"flash": "Blitz",
|
||||
"flash_desc": "Zufällige Spielergeschwindigkeit zu Beginn der Runde",
|
||||
"flash_desc2": "Dein Geschwindigkeitsmultiplikator beträgt: {0}x",
|
||||
|
||||
"fortnite": "Fortnite",
|
||||
"fortnite_desc": "Klicke auf [css_useSkill], um eine zerstörbare Barrikade zu erstellen",
|
||||
|
||||
"fragilebomb": "Fragile Bombe",
|
||||
"fragilebomb_desc": "Das Schießen auf die Bombe beschädigt sie",
|
||||
"fragilebomb_bomb_health": "Bombengesundheit",
|
||||
|
||||
"friendlyfire": "Friendly Fire",
|
||||
"friendlyfire_desc": "Das Schießen auf Teamkameraden heilt sie",
|
||||
|
||||
"frozendecoy": "Eisige Attrappe",
|
||||
"frozendecoy_desc": "Deine Attrappe friert alle Spieler in der Nähe ein",
|
||||
|
||||
"gambler": "Zocker",
|
||||
"gambler_desc": "Wähle eine Fertigkeit aus der Liste aus.",
|
||||
"gambler_select_info": "Wähle deine Fähigkeit aus:",
|
||||
"gambler_more": "#00FF00|Aktualisieren für ${0}",
|
||||
"gambler_no_money": "Nicht genug Geld.",
|
||||
|
||||
"ghost": "Geist",
|
||||
"ghost_desc": "Du bist vollständig unsichtbar",
|
||||
|
||||
"glaz": "Glaz",
|
||||
"glaz_desc": "Du kannst durch Rauchgranaten hindurchsehen",
|
||||
|
||||
"glitch": "Glitch",
|
||||
"glitch_desc": "Deaktiviert das Radar für einen ausgewählten Gegner",
|
||||
"glitch_enemy_info": "Dein Radar wurde deaktiviert",
|
||||
"glitch_player_info": "Das Radar des Spielers ‚{0}‘ wurde deaktiviert.",
|
||||
"glitch_select_info": "Radar des Spielers ausschalten:",
|
||||
|
||||
"glue": "Glue",
|
||||
"glue_desc": "Deine Granaten haften an Wänden",
|
||||
|
||||
"godmode": "Gott-Modus",
|
||||
"godmode_desc": "Klicke auf [css_useSkill], um für kurze Zeit unsterblich zu werden",
|
||||
"godmode_off": "Unsterblichkeit deaktiviert",
|
||||
"godmode_on": "Unsterblichkeit aktiviert",
|
||||
|
||||
"grenadier": "Grenadier",
|
||||
"grenadier_desc": "Du hast unendlich viele Granaten",
|
||||
|
||||
"healingsmoke": "Heilender Rauch",
|
||||
"healingsmoke_desc": "Deine Rauchgranaten heilen",
|
||||
|
||||
"hermit": "Einsiedler",
|
||||
"hermit_desc": "Durch das Töten von Gegnern werden Munition und ein Teil der Gesundheit wiederhergestellt",
|
||||
|
||||
"holyhandgrenade": "Heilige Handgranate",
|
||||
"holyhandgrenade_desc": "Deine HE-Granaten verursachen doppelten Schaden und haben doppelte Reichweite",
|
||||
|
||||
"iana": "Hologramm",
|
||||
"iana_desc": "Klicken Sie auf [css_useSkill], um Ihr Hologramm für einige Sekunden zu steuern",
|
||||
|
||||
"impostor": "Betrüger",
|
||||
"impostor_desc": "Du beginnst die Runde mit einem feindlichen Spielermodell",
|
||||
|
||||
"infiniteammo": "Unendliche Munition",
|
||||
"infiniteammo_desc": "Du erhältst unendliche Munition für alle deine Waffen",
|
||||
|
||||
"jackal": "Spürhund",
|
||||
"jackal_desc": "Jeder Gegner hinterlässt eine Spur",
|
||||
|
||||
"jammer": "Störsender",
|
||||
"jammer_desc": "Wähle einen Spieler aus, um dessen Fadenkreuz zu deaktivieren",
|
||||
"jammer_enemy_info": "Dein Fadenkreuz wurde deaktiviert.",
|
||||
"jammer_player_info": "Das Fadenkreuz von Spieler ‚{0}‘ wurde deaktiviert.",
|
||||
"jammer_select_info": "Fadenkreuz des Spielers deaktivieren:",
|
||||
|
||||
"jester": "Narr",
|
||||
"jester_desc": "Im Narrenmodus kannst du keinen Schaden erleiden oder verursachen. Dieser Modus ändert sich alle paar Sekunden.",
|
||||
"jester_mode": "Jester-Modus",
|
||||
"jester_on": "EIN",
|
||||
"jester_off": "AUS",
|
||||
|
||||
"jumpban": "Beinlos",
|
||||
"jumpban_desc": "Wähle einen Spieler, der nicht springen kann",
|
||||
"jumpban_enemy_info": "Jemand hat dir die Beine abgeschnitten.",
|
||||
"jumpban_player_info": "Der Spieler ‚{0}‘ kann nicht mehr springen.",
|
||||
"jumpban_select_info": "Spieler vom Springen ausschließen:",
|
||||
|
||||
"jumpingjack": "Jumping Jack",
|
||||
"jumpingjack_desc": "Durch Springen wird die Gesundheit wiederhergestellt",
|
||||
|
||||
"killerflash": "Killer Flash",
|
||||
"killerflash_desc": "Jeder, der durch deine Blendgranate vollständig geblendet wird, stirbt (einschließlich dir selbst)",
|
||||
|
||||
"lifeswap": "Lebensaustausch",
|
||||
"lifeswap_desc": "Wähle einen Spieler aus, mit dem du deine Gesundheit austauschen möchtest",
|
||||
"lifeswap_enemy_info": "Jemand hat sich deine Gesundheit ausgeliehen",
|
||||
"lifeswap_player_info": "Du hast deine Gesundheit mit dem Spieler \"{0}\" ausgetauscht",
|
||||
"lifeswap_select_info": "Tausche Gesundheit mit Spieler:",
|
||||
|
||||
"longknife": "Langes Messer",
|
||||
"longknife_desc": "Ein Messerangriff verursacht unabhängig von der Entfernung Schaden",
|
||||
|
||||
"longzeus": "Langer Zeus",
|
||||
"longzeus_desc": "Zeus verursacht unabhängig von der Entfernung Schaden",
|
||||
|
||||
"magnifier": "Lupe",
|
||||
"magnifier_desc": "Vergrößert den Bildschirm des Gegners und verringert dessen Sichtfeld",
|
||||
"magnifier_enemy_info": "Dein Sichtfeld wurde verzerrt!",
|
||||
"magnifier_player_info": "Der Spieler ‚{0}‘ wurde in den Zoom-Modus versetzt.",
|
||||
"magnifier_select_info": "Bildschirm des Spielers vergrößern:",
|
||||
|
||||
"medic": "Sanitäter",
|
||||
"medic_desc": "Klicke auf [css_useSkill], um eine Heilungsladung zu verwenden, die 50 Gesundheitspunkte wiederherstellt",
|
||||
|
||||
"bankrupt": "Bankrott",
|
||||
"bankrupt_desc": "Wähle den Spieler aus, der sein gesamtes Geld verlieren wird",
|
||||
"bankrupt_enemy_info": "Du bist bankrott.",
|
||||
"bankrupt_player_info": "Der Spieler ‚{0}‘ ist bankrott.",
|
||||
"bankrupt_select_info": "Wähle einen Spieler aus, der bankrott gehen soll:",
|
||||
|
||||
"muhammed": "Muhammed",
|
||||
"muhammed_desc": "Du explodierst beim Tod und tötest Spieler in deiner Nähe",
|
||||
"muhammed_explosion": "ALLAHU AKBAR!!!",
|
||||
|
||||
"ninja": "Ninja",
|
||||
"ninja_desc": "Wenn du stillstehst, erhöht sich deine Unsichtbarkeit um 33 %, wenn du dich duckst um 33 % und wenn du ein Messer hältst um 33 %",
|
||||
|
||||
"nonades": "No-Nades",
|
||||
"nonades_desc": "Granaten fügen dir keinen Schaden zu",
|
||||
|
||||
"norecoil": "Fokus",
|
||||
"norecoil_desc": "Kein Rückstoß beim Schießen",
|
||||
|
||||
"noclip": "NoClip",
|
||||
"noclip_desc": "Klicke auf [css_useSkill], um NoClip für kurze Zeit zu aktivieren",
|
||||
|
||||
"oneshot": "One-Shot",
|
||||
"oneshot_desc": "Ein Treffer tötet einen Gegner sofort",
|
||||
|
||||
"onlyhead": "Nur Kopf",
|
||||
"onlyhead_desc": "Du erleidest nur Schaden am Kopf",
|
||||
|
||||
"paweljumper": "Pawel Jumper",
|
||||
"paweljumper_desc": "Du erhältst eine zufällige Anzahl zusätzlicher Sprünge",
|
||||
"paweljumper_desc2": "Du erhältst {0} zusätzliche Sprünge",
|
||||
|
||||
"phoenix": "Phönix",
|
||||
"phoenix_desc": "Du hast eine zufällige Chance, nach dem Tod wieder zu erscheinen",
|
||||
"phoenix_desc2": "Deine Chance, nach dem Tod wieder zu erscheinen: {0} %",
|
||||
"phoenix_respawn": "Du bist dank der Kraft von CHATCOLORS.REDPhoenix aus der Asche auferstanden",
|
||||
|
||||
"psychicdefusing": "Psychic Defusing",
|
||||
"psychicdefusing_desc": "Wenn du dich in der Nähe der Bombe befindest, beginnst du, sie zu entschärfen",
|
||||
"psychicdefusing_hud_info": "{0} Sekunden verbleibend bis zur Entschärfung",
|
||||
|
||||
"pilot": "Pilot",
|
||||
"pilot_desc": "Fliege für eine begrenzte Zeit. Halte [USE - E] gedrückt, um zu fliegen",
|
||||
"pilot_hud_info": "Treibstoff",
|
||||
|
||||
"planter": "Freier Planter",
|
||||
"planter_desc": "Du kannst die Bombe überall platzieren, die Detonationszeit beträgt 60 Sekunden.",
|
||||
|
||||
"poison": "Gift",
|
||||
"poison_desc": "Wähle einen Spieler aus, der alle paar Sekunden Schaden nimmt",
|
||||
"poison_enemy_info": "Du wurdest vergiftet",
|
||||
"poison_player_info": "Der Spieler ‚{0}‘ wurde vergiftet",
|
||||
"poison_select_info": "Einen Spieler vergiften:",
|
||||
|
||||
"primaryban": "Keine Gewehre",
|
||||
"primaryban_desc": "Wähle einen Spieler aus, der keine Gewehre verwenden kann",
|
||||
"primaryban_enemy_info": "Du kannst keine Gewehre mehr verwenden.",
|
||||
"primaryban_player_info": "Der Spieler ‚{0}‘ kann keine Gewehre mehr verwenden.",
|
||||
"primaryban_select_info": "Gewehre für Spieler verbieten:",
|
||||
|
||||
"prosthesis": "Prothese",
|
||||
"prosthesis_desc": "Arme und Beine sind kugelsicher",
|
||||
|
||||
"push": "Pusher",
|
||||
"push_desc": "Du hast eine zufällige Chance, einen Gegner zurückzustoßen, wenn du ihn triffst",
|
||||
"push_desc2": "Deine Chancen, den Gegner zurückzustoßen, betragen: {0} %",
|
||||
|
||||
"pyro": "Pyro",
|
||||
"pyro_desc": "Molotow-Cocktail stellt Gesundheit wieder her",
|
||||
|
||||
"quickshot": "Schnellfeuer",
|
||||
"quickshot_desc": "Alle Kugeln werden sehr schnell abgefeuert",
|
||||
|
||||
"radarhack": "Radar-Hack",
|
||||
"radarhack_desc": "Gegner sind auf dem Radar sichtbar",
|
||||
|
||||
"rambo": "Rambo",
|
||||
"rambo_desc": "Du erhältst zu Beginn der Runde eine zufällige Menge an Gesundheit",
|
||||
|
||||
"randomweapon": "Zufällige Waffe",
|
||||
"randomweapon_desc": "Klicke auf [css_useSkill], um eine zufällige Waffe zu erhalten",
|
||||
|
||||
"rezombie": "Re-Zombie",
|
||||
"rezombie_desc": "Nach dem Tod spawnst du als Zombie mit erhöhter Gesundheit und ohne Waffen",
|
||||
|
||||
"reactivearmor": "Reaktive Rüstung",
|
||||
"reactivearmor_desc": "Die Rüstung absorbiert den ersten erlittenen Schaden",
|
||||
|
||||
"regeneration": "Regeneration",
|
||||
"regeneration_desc": "Du stellst alle paar Sekunden Gesundheit wieder her",
|
||||
|
||||
"replicator": "Replikator",
|
||||
"replicator_desc": "Klicke auf [css_useSkill], um eine Replik zu erstellen, die bei Treffer Schaden verursacht",
|
||||
|
||||
"retreat": "Rückzug",
|
||||
"retreat_desc": "Klicke auf [css_useSkill], um zum Spawn zurückzukehren",
|
||||
|
||||
"returntosender": "Zurück zum Absender",
|
||||
"returntosender_desc": "Der erste Treffer eines Gegners schickt ihn zurück zu seinem Spawn",
|
||||
|
||||
"richboy": "Rich Boy",
|
||||
"richboy_desc": "Du erhältst zu Beginn der Runde einen zufälligen Geldbetrag",
|
||||
|
||||
"robinhood": "Robin Hood",
|
||||
"robinhood_desc": "Wenn du einem Gegner Schaden zufügst, stiehlst du ihm sein Geld",
|
||||
|
||||
"rubber": "Gummigeschosse",
|
||||
"rubber_desc": "Deine Kugeln verlangsamen Spieler erheblich",
|
||||
|
||||
"saper": "Sapper",
|
||||
"saper_desc": "Du kannst Bomben schneller legen und entschärfen",
|
||||
|
||||
"secondlife": "Zweite Chance",
|
||||
"secondlife_desc": "Nach dem Tod spawnst du mit derselben Gesundheitsanzeige wieder",
|
||||
|
||||
"shade": "Schatten",
|
||||
"shade_desc": "Du hast eine zufällige Chance, dich hinter einen getroffenen Gegner zu teleportieren",
|
||||
"shade_desc2": "Deine Chancen, dich hinter einen getroffenen Gegner zu teleportieren, betragen: {0} %",
|
||||
"shade_nospace": "Kein Platz verfügbar",
|
||||
|
||||
"shortbomb": "Kurze Zündschnur",
|
||||
"shortbomb_desc": "Die Bombe explodiert viel schneller",
|
||||
|
||||
"silent": "Leise",
|
||||
"silent_desc": "Deine Schritte und Sprünge sind für ANDERE Spieler lautlos",
|
||||
|
||||
"sniperelite": "Sniper Elite",
|
||||
"sniperelite_customname": "Sniper Elite-Fähigkeit",
|
||||
"sniperelite_desc": "Klicke auf [css_useSkill], um deine aktuelle Waffe gegen eine AWP auszutauschen",
|
||||
|
||||
"soldier": "Soldat",
|
||||
"soldier_desc": "Du hast einen zufälligen Schadensmultiplikator",
|
||||
"soldier_desc2": "Dein Schadensmultiplikator beträgt: {0}x",
|
||||
|
||||
"soundmaker": "Soundmaker",
|
||||
"soundmaker_desc": "Klicke auf [css_useSkill], um für jeden Gegner einen Sound auszulösen",
|
||||
|
||||
"spectator": "Zuschauer",
|
||||
"spectator_desc": "Klicke auf [css_useSkill], um einen zufälligen Gegner zu beobachten",
|
||||
|
||||
"swapposition": "Positionstausch",
|
||||
"swapposition_desc": "Klicke auf [css_useSkill], um mit einem zufälligen Gegner die Plätze zu tauschen",
|
||||
|
||||
"teleporter": "Teleporter",
|
||||
"teleporter_desc": "Du tauschst mit dem getroffenen Gegner die Plätze",
|
||||
|
||||
"thief": "Dieb",
|
||||
"thief_desc": "Du kannst einem ausgewählten Spieler eine Fertigkeit stehlen",
|
||||
"thief_enemy_info": "Deine Fertigkeit wurde gestohlen",
|
||||
"thief_player_info": "Die Fertigkeit des Spielers ‚{0}‘ wurde gestohlen",
|
||||
"thief_select_info": "Fähigkeit eines Spielers stehlen:",
|
||||
"thief_incorrect_skill": "Diese Fähigkeit kann nicht ausgewählt werden!",
|
||||
|
||||
"thirdeye": "Drittes Auge",
|
||||
"thirdeye_desc": "Klicke auf [css_useSkill], um die Third-Person-Ansicht zu aktivieren",
|
||||
|
||||
"thorns": "Dornen",
|
||||
"thorns_desc": "Dein Gegner erhält einen Teil des Schadens, den er dir zugefügt hat",
|
||||
|
||||
"toxicsmoke": "Giftiger Rauch",
|
||||
"toxicsmoke_desc": "Deine Rauchgranaten verursachen Schaden",
|
||||
|
||||
"wallhack": "Wallhack",
|
||||
"wallhack_desc": "Du kannst Feinde durch Wände hindurch sehen",
|
||||
|
||||
"watchmaker": "Uhrmacher",
|
||||
"watchmaker_desc": "Jeder Granatenwurf verändert die Rundenzeit",
|
||||
"watchmaker_ct": "Rundenzeit um {0} Sekunden verkürzt",
|
||||
"watchmaker_tt": "Rundenzeit um {0} Sekunden verlängert",
|
||||
|
||||
"weaponsswap": "Waffenwechsel",
|
||||
"weaponsswap_desc": "Klicke auf [css_useSkill], um mit einem zufälligen Gegner die Waffen zu tauschen",
|
||||
"weaponsswap_hud_info2": "Du hast keine Waffe zum Tauschen",
|
||||
|
||||
"zeus": "Zeus",
|
||||
"zeus_desc": "Zeus x27 lädt sich sofort wieder auf",
|
||||
|
||||
"your_skill": "Deine aktuelle Fertigkeit",
|
||||
"enemy_skill": "Fähigkeit des Gegners",
|
||||
"observer_skill": "Fähigkeit des Spielers",
|
||||
"welcome_message": "Willkommen {PLAYER} bei {SERVER_NAME}",
|
||||
"drawing_skill": "Eine Fertigkeit zeichnen",
|
||||
"disabled_weapon": "Du kannst diese Waffe nicht verwenden",
|
||||
|
||||
"hud_info": "Warte weitere {0} Sekunden",
|
||||
"hud_info_no_enemy": "Kein Feind gefunden",
|
||||
"active_hud_info": "Noch {0} Millisekunden aktiv",
|
||||
|
||||
"skills_menu": "Fähigkeitenliste",
|
||||
"no_player": "Kein passender Spieler gefunden.",
|
||||
"duplicate_player": "Mehr als ein Spieler mit demselben Namen gefunden.",
|
||||
"selectplayerskill_command": "Gib /t ein",
|
||||
"selectplayerskill_incorrect_enemy_index": "Es wurden keine Spieler gefunden, die ausgewählt werden können.",
|
||||
|
||||
"skill_not_found_setskill": "Keine solche CHATCOLORS.REDskill gefunden",
|
||||
"player_not_found_setskill": "Kein solcher CHATCOLORS.REDplayer gefunden",
|
||||
"correct_form_setskill": "Korrekte Verwendung: CHATCOLORS.RED!setskill <Fähigkeit>",
|
||||
"correct_form_setscore": "Korrekte Verwendung: CHATCOLORS.RED!setscore ",
|
||||
"done_setskill": "Fähigkeit festgelegt",
|
||||
"error_setskill": "CHATCOLORS.REDskill konnte nicht festgelegt werden",
|
||||
"for_setskill": "für",
|
||||
|
||||
"invalid_map": "Kartenname falsch eingegeben!",
|
||||
"loading_map": "Neue Karte wird geladen",
|
||||
|
||||
"pause": "Spiel wurde unterbrochen",
|
||||
"unpause": "Spiel wurde fortgesetzt",
|
||||
"healed": "Du wurdest geheilt.",
|
||||
"game_start": "Spiel gestartet!",
|
||||
"reload": "Sprachen und Konfigurationen wurden neu geladen.",
|
||||
"hud_on": "HUD wurde aktiviert.",
|
||||
"hud_off": "HUD wurde deaktiviert.",
|
||||
|
||||
"vote_started": "Abstimmung gestartet: ‚{0}‘",
|
||||
"vote_timeout": "Zeitlimit für Abstimmung ‚{0}‘ abgelaufen!",
|
||||
"vote_wait": "Sie müssen warten, bevor Sie eine weitere Abstimmung starten können!",
|
||||
"vote_same_wait": "Sie müssen warten, bevor Sie dieselbe Abstimmung erneut starten können!",
|
||||
"vote_not_enough_players": "Nicht genügend Spieler, um eine Abstimmung zu starten!",
|
||||
"vote_alredy_voted": "Du hast bereits abgestimmt!",
|
||||
"vote_vote": "Abstimmen",
|
||||
|
||||
"bombsite_a": "Bombenplatz A",
|
||||
"bombsite_b": "Bombenplatz B",
|
||||
"bombplanted": "Die Bombe wurde gelegt\n{0} Sekunden bis zur Detonation",
|
||||
|
||||
"teammate_skills": "Die Fähigkeiten Ihrer Teamkollegen",
|
||||
"summary": "Zusammenfassung der letzten runde",
|
||||
|
||||
"menu_controlls_scroll": "W/S – Scrollen",
|
||||
"menu_controlls_padding": " | ",
|
||||
"menu_controlls_select": "E – Auswählen"
|
||||
}
|
||||
|
|
@ -55,6 +55,12 @@
|
|||
"c4camouflage": "C4 Camouflage",
|
||||
"c4camouflage_desc": "You are invisible while holding the bomb",
|
||||
|
||||
"carefulbullets": "Careful Bullets",
|
||||
"carefulbullets_desc": "Select a player who takes damage for every missed shot",
|
||||
"carefulbullets_enemy_info": "From now on, inaccuracy will literally hurt.",
|
||||
"carefulbullets_player_info": "'{0}' must now be more careful.",
|
||||
"carefulbullets_select_info": "Inaccuracy hurts the player:",
|
||||
|
||||
"catapult": "Catapult",
|
||||
"catapult_desc": "You have a random chance to launch an enemy upwards",
|
||||
"catapult_desc2": "Your chance to launch an enemy on hit is: {0}%",
|
||||
|
|
@ -68,6 +74,10 @@
|
|||
"cutter": "Cutter",
|
||||
"cutter_desc": "Instant kill with a knife",
|
||||
|
||||
"cypher": "Cypher",
|
||||
"cypher_desc": "Click [css_useSkill] to create/switch to a camera",
|
||||
"cypher_nospace": "The camera must be positioned at right angles to the wall",
|
||||
|
||||
"darkness": "Darkness",
|
||||
"darkness_desc": "Applies a darkness effect to a chosen enemy",
|
||||
"darkness_enemy_info": "Let the lights go out.",
|
||||
|
|
@ -176,6 +186,9 @@
|
|||
"holyhandgrenade": "Holy Hand Grenade",
|
||||
"holyhandgrenade_desc": "Your HE grenades deal double damage and have double range",
|
||||
|
||||
"iana": "Hologram",
|
||||
"iana_desc": "Click [css_useSkill] to control your hologram for a few seconds",
|
||||
|
||||
"impostor": "Impostor",
|
||||
"impostor_desc": "You start the round with an enemy player model",
|
||||
|
||||
|
|
@ -357,6 +370,7 @@
|
|||
"silent_desc": "Your footsteps and jumps are silent to OTHER players",
|
||||
|
||||
"sniperelite": "Sniper Elite",
|
||||
"sniperelite_customname": "Sniper Elite Skill",
|
||||
"sniperelite_desc": "Click [css_useSkill] to swap your current weapon for an AWP",
|
||||
|
||||
"soldier": "Soldier",
|
||||
|
|
@ -452,6 +466,7 @@
|
|||
|
||||
"bombsite_a": "Bombsite A",
|
||||
"bombsite_b": "Bombsite B",
|
||||
"bombplanted": "The bomb has been planted\n{0} seconds till detonation",
|
||||
|
||||
"teammate_skills": "Your teammates' skills",
|
||||
"summary": "Summary of the last round",
|
||||
|
|
|
|||
|
|
@ -55,6 +55,12 @@
|
|||
"c4camouflage": "Camouflage C4",
|
||||
"c4camouflage_desc": "Vous êtes invisible en tenant la bombe",
|
||||
|
||||
"carefulbullets": "Balles prudentes",
|
||||
"carefulbullets_desc": "Sélectionnez un joueur qui subit des dégâts à chaque tir manqué",
|
||||
"carefulbullets_enemy_info": "À partir de maintenant, l'inexactitude fera littéralement mal.",
|
||||
"carefulbullets_player_info": "« {0} » doit désormais être plus prudent.",
|
||||
"carefulbullets_select_info": "L'inexactitude nuit au joueur :",
|
||||
|
||||
"catapult": "Catapulte",
|
||||
"catapult_desc": "Vous avez une chance aléatoire de projeter un ennemi en l’air",
|
||||
"catapult_desc2": "Votre chance de projeter un ennemi à l’impact est : {0}%",
|
||||
|
|
@ -68,6 +74,10 @@
|
|||
"cutter": "Trancheur",
|
||||
"cutter_desc": "Coup de couteau = mort instantanée",
|
||||
|
||||
"cypher": "Caméra",
|
||||
"cypher_desc": "Cliquez sur [css_useSkill] pour créer/passer à une caméra.",
|
||||
"cypher_nospace": "La caméra doit être positionnée à angle droit par rapport au mur",
|
||||
|
||||
"darkness": "Obscurité",
|
||||
"darkness_desc": "Applique un effet d’obscurité à un ennemi choisi",
|
||||
"darkness_enemy_info": "Que la lumière s’éteigne.",
|
||||
|
|
@ -176,6 +186,9 @@
|
|||
"holyhandgrenade": "Grenade Sacrée",
|
||||
"holyhandgrenade_desc": "Vos grenades HE infligent le double de dégâts et ont une portée doublée",
|
||||
|
||||
"iana": "Hologramme",
|
||||
"iana_desc": "Cliquez sur [css_useSkill] pour contrôler votre hologramme pendant quelques secondes",
|
||||
|
||||
"impostor": "Imposteur",
|
||||
"impostor_desc": "Vous commencez le round avec un modèle de joueur ennemi",
|
||||
|
||||
|
|
@ -357,6 +370,7 @@
|
|||
"silent_desc": "Vos pas et vos sauts sont silencieux pour les AUTRES joueurs",
|
||||
|
||||
"sniperelite": "Sniper d’Élite",
|
||||
"sniperelite_customname": "Compétence Sniper d’Élite",
|
||||
"sniperelite_desc": "Appuyez sur [css_useSkill] pour échanger votre arme actuelle contre un AWP",
|
||||
|
||||
"soldier": "Soldat",
|
||||
|
|
@ -452,12 +466,12 @@
|
|||
|
||||
"bombsite_a": "Site de bombe A",
|
||||
"bombsite_b": "Site de bombe B",
|
||||
"bombplanted": "La bombe a été posée\n{0} secondes avant l'explosion",
|
||||
|
||||
"teammate_skills": "Compétences de vos coéquipiers",
|
||||
"summary_start": "Résumé du dernier round",
|
||||
"summary_end": "===================================",
|
||||
"summary": "Résumé du dernier round",
|
||||
|
||||
"menu_controlls_scroll": "W/S - Défilement",
|
||||
"menu_controlls_padding": " | ",
|
||||
"menu_controlls_select": "E - Sélectionner"
|
||||
}
|
||||
}
|
||||
|
|
@ -55,6 +55,12 @@
|
|||
"c4camouflage": "C4 Kamuflaż",
|
||||
"c4camouflage_desc": "Kiedy trzymasz bombę, jesteś niewidzialny",
|
||||
|
||||
"carefulbullets": "Ostrożne pociski",
|
||||
"carefulbullets_desc": "Wybierz gracza, który otrzymuje obrażenia za każdy niecelny strzał",
|
||||
"carefulbullets_enemy_info": "Od teraz niecelność będzie dosłownie bolała.",
|
||||
"carefulbullets_player_info": "'{0}' musi teraz być bardziej ostrożny.",
|
||||
"carefulbullets_select_info": "Niedokładność szkodzi graczowi:",
|
||||
|
||||
"catapult": "Katapulta",
|
||||
"catapult_desc": "Masz losową szanse na podrzucenie wroga",
|
||||
"catapult_desc2": "Twoje szanse na podrzucenie wroga po trafieniu to: {0}%",
|
||||
|
|
@ -68,6 +74,10 @@
|
|||
"cutter": "Scyzoryk",
|
||||
"cutter_desc": "Natychmiastowe zabójstwo nożem",
|
||||
|
||||
"cypher": "Kamera",
|
||||
"cypher_desc": "Kliknij [css_useSkill], aby utworzyć/przełączyć się na kamerę",
|
||||
"cypher_nospace": "Kamera musi być ustawiona pod kątem prostym do ściany",
|
||||
|
||||
"darkness": "Mrok",
|
||||
"darkness_desc": "Nadaje efekt ciemności wybranemu przeciwnikowi",
|
||||
"darkness_enemy_info": "Niech zgasną światła.",
|
||||
|
|
@ -176,6 +186,9 @@
|
|||
"holyhandgrenade": "Święty Granat Ręczny",
|
||||
"holyhandgrenade_desc": "Twoje granaty uderzeniowe zadają podwójne obrażenia i mają podwójny zasięg",
|
||||
|
||||
"iana": "Hologram",
|
||||
"iana_desc": "Kliknij [css_useSkill], aby sterować hologramem przez kilka sekund",
|
||||
|
||||
"impostor": "Szpieg",
|
||||
"impostor_desc": "Na początku rundy otrzymujesz model postaci przeciwnika",
|
||||
|
||||
|
|
@ -357,6 +370,7 @@
|
|||
"silent_desc": "Twoje kroki i skoki są niesłyszalne dla INNYCH graczy",
|
||||
|
||||
"sniperelite": "SzeliS",
|
||||
"sniperelite_customname": "Mityczna AWP",
|
||||
"sniperelite_desc": "Kliknij [css_useSkill], aby zamienić aktualną broń na AWP",
|
||||
|
||||
"soldier": "Żołnierz",
|
||||
|
|
@ -452,10 +466,10 @@
|
|||
|
||||
"bombsite_a": "Strefa detonacji A",
|
||||
"bombsite_b": "Strefa detonacji B",
|
||||
"bombplanted": "Bomba została podłożona\n{0} sekund do detonacji",
|
||||
|
||||
"teammate_skills": "Supermoce twoich sojuszników",
|
||||
"summary_start": "Podsumowanie z ostatniej rundy",
|
||||
"summary_end": "============================================",
|
||||
"summary": "Podsumowanie z ostatniej rundy",
|
||||
|
||||
"menu_controlls_scroll": "W/S – Przewijanie",
|
||||
"menu_controlls_padding": " | ",
|
||||
|
|
|
|||
|
|
@ -55,6 +55,12 @@
|
|||
"c4camouflage": "Camuflagem C4",
|
||||
"c4camouflage_desc": "Você fica invisível enquanto segura a bomba",
|
||||
|
||||
"carefulbullets": "Balas cuidadosas",
|
||||
"carefulbullets_desc": "Selecione um jogador que sofra dano por cada tiro errado",
|
||||
"carefulbullets_enemy_info": "A partir de agora, a imprecisão vai literalmente doer.",
|
||||
"carefulbullets_player_info": "Agora, '{0}' precisa ter mais cuidado.",
|
||||
"carefulbullets_select_info": "A imprecisão prejudica o jogador:",
|
||||
|
||||
"catapult": "Catapulta",
|
||||
"catapult_desc": "Você tem uma chance aleatória de lançar um inimigo para cima",
|
||||
"catapult_desc2": "Sua chance de lançar um inimigo ao acertar é: {0}%",
|
||||
|
|
@ -68,6 +74,10 @@
|
|||
"cutter": "Cortador",
|
||||
"cutter_desc": "Mata instantaneamente com uma faca",
|
||||
|
||||
"cypher": "Câmera",
|
||||
"cypher_desc": "Clique em [css_useSkill] para criar/mudar para uma câmera",
|
||||
"cypher_nospace": "A câmera deve ser posicionada em ângulo reto com a parede",
|
||||
|
||||
"darkness": "Escuridão",
|
||||
"darkness_desc": "Aplica um efeito de escuridão a um inimigo escolhido",
|
||||
"darkness_enemy_info": "Que as luzes se apaguem.",
|
||||
|
|
@ -176,6 +186,9 @@
|
|||
"holyhandgrenade": "Granada Sagrada",
|
||||
"holyhandgrenade_desc": "Suas granadas explosivas causam dano dobrado e têm alcance dobrado",
|
||||
|
||||
"iana": "Holograma",
|
||||
"iana_desc": "Clique em [css_useSkill] para controlar seu holograma por alguns segundos",
|
||||
|
||||
"impostor": "Impostor",
|
||||
"impostor_desc": "Você começa a rodada com um modelo de jogador inimigo",
|
||||
|
||||
|
|
@ -357,6 +370,7 @@
|
|||
"silent_desc": "Seus passos e pulos são silenciosos para OUTROS jogadores",
|
||||
|
||||
"sniperelite": "Atirador de Elite",
|
||||
"sniperelite_customname": "Habilidade de Atirador de Elite",
|
||||
"sniperelite_desc": "Clique em [css_useSkill] para trocar sua arma atual por uma AWP",
|
||||
|
||||
"soldier": "Soldado",
|
||||
|
|
@ -452,10 +466,10 @@
|
|||
|
||||
"bombsite_a": "Zona de detonação A",
|
||||
"bombsite_b": "Zona de detonação B",
|
||||
"bombplanted": "A bomba foi colocada\n{0} segundos até a detonação",
|
||||
|
||||
"teammate_skills": "Habilidades dos seus companheiros de equipe",
|
||||
"summary_start": "Resumo da última rodada",
|
||||
"summary_end": "=======================================",
|
||||
"summary": "Resumo da última rodada",
|
||||
|
||||
"menu_controlls_scroll": "W/S - Rolar",
|
||||
"menu_controlls_padding": " | ",
|
||||
|
|
|
|||
|
|
@ -55,6 +55,12 @@
|
|||
"c4camouflage": "C4伪装",
|
||||
"c4camouflage_desc": "你持有炸弹时隐形",
|
||||
|
||||
"carefulbullets": "谨慎的子弹",
|
||||
"carefulbullets_desc": "选择一名球员,每当他投篮未中时就会受到伤害",
|
||||
"carefulbullets_enemy_info": "从现在起,不准确将带来切实的伤害。",
|
||||
"carefulbullets_player_info": "'{0}' 现在必须更加谨慎。",
|
||||
"carefulbullets_select_info": "不准确会伤害玩家:",
|
||||
|
||||
"catapult": "弹射",
|
||||
"catapult_desc": "你有随机几率将敌人向上弹射",
|
||||
"catapult_desc2": "你击中敌人将其弹射的几率是:{0}%",
|
||||
|
|
@ -68,6 +74,10 @@
|
|||
"cutter": "切割者",
|
||||
"cutter_desc": "用刀可立即杀死敌人",
|
||||
|
||||
"cypher": "相机",
|
||||
"cypher_desc": "点击 [css_useSkill] 创建/切换摄像机",
|
||||
"cypher_nospace": "相机必须与墙壁呈直角放置",
|
||||
|
||||
"darkness": "黑暗",
|
||||
"darkness_desc": "对选定的敌人施加黑暗效果",
|
||||
"darkness_enemy_info": "让灯光熄灭。",
|
||||
|
|
@ -176,6 +186,9 @@
|
|||
"holyhandgrenade": "神圣手榴弹",
|
||||
"holyhandgrenade_desc": "你的高爆手榴弹造成双倍伤害并拥有双倍范围",
|
||||
|
||||
"iana": "全息图",
|
||||
"iana_desc": "点击 [css_useSkill] 可控制你的全息影像数秒",
|
||||
|
||||
"impostor": "冒名顶替者",
|
||||
"impostor_desc": "回合开始时你获得敌方玩家模型",
|
||||
|
||||
|
|
@ -357,6 +370,7 @@
|
|||
"silent_desc": "你的脚步和跳跃对其他玩家无声",
|
||||
|
||||
"sniperelite": "狙击精英",
|
||||
"sniperelite_customname": "狙击精英技能",
|
||||
"sniperelite_desc": "点击 [css_useSkill] 将当前武器替换为AWP",
|
||||
|
||||
"soldier": "士兵",
|
||||
|
|
@ -452,10 +466,10 @@
|
|||
|
||||
"bombsite_a": "爆轰区A",
|
||||
"bombsite_b": "爆轰区B",
|
||||
"bombplanted": "炸弹已安装完毕{0}秒后引爆",
|
||||
|
||||
"teammate_skills": "你队友的技能",
|
||||
"summary_start": "上一回合总结",
|
||||
"summary_end": "=======================================",
|
||||
"summary": "上一回合总结",
|
||||
|
||||
"menu_controlls_scroll": "W/S - 滚动",
|
||||
"menu_controlls_padding": " | ",
|
||||
|
|
|
|||
|
|
@ -64,6 +64,7 @@ public enum Skills
|
|||
BladeMaster,
|
||||
BunnyHop,
|
||||
C4Camouflage,
|
||||
CarefulBullets,
|
||||
Catapult,
|
||||
Chicken,
|
||||
ChillOut,
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ using CounterStrikeSharp.API.Core;
|
|||
using CounterStrikeSharp.API.Core.Attributes;
|
||||
using CounterStrikeSharp.API.Modules.Admin;
|
||||
using CounterStrikeSharp.API.Modules.Cvars;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||
using CounterStrikeSharp.API.Modules.UserMessages;
|
||||
|
|
@ -11,7 +12,6 @@ using src.utils;
|
|||
using System.Collections.Concurrent;
|
||||
using static CounterStrikeSharp.API.Core.Listeners;
|
||||
using static src.jRandomSkills;
|
||||
using static System.Net.Mime.MediaTypeNames;
|
||||
|
||||
namespace src.player
|
||||
{
|
||||
|
|
@ -38,6 +38,7 @@ namespace src.player
|
|||
{
|
||||
Instance.RegisterEventHandler<EventPlayerConnectFull>(PlayerConnectFull);
|
||||
Instance.RegisterEventHandler<EventPlayerDisconnect>(PlayerDisconnect);
|
||||
// Instance.RegisterEventHandler<EventPlayerChat>(PlayerChat);
|
||||
Instance.RegisterEventHandler<EventRoundStart>(RoundStart);
|
||||
Instance.RegisterEventHandler<EventRoundEnd>(RoundEnd);
|
||||
|
||||
|
|
@ -350,6 +351,39 @@ namespace src.player
|
|||
}
|
||||
}
|
||||
|
||||
private static HookResult PlayerChat(EventPlayerChat @event, GameEventInfo info)
|
||||
{
|
||||
var userID = @event.Userid;
|
||||
if (userID == 0 || string.IsNullOrEmpty(@event.Text)) return HookResult.Continue;
|
||||
|
||||
string text = @event.Text.Split(' ')[0].Trim();
|
||||
|
||||
string commandName = text.StartsWith('!') || text.StartsWith('/') ? text[1..] : text;
|
||||
|
||||
foreach (var cmd in Instance.CommandDefinitions)
|
||||
Server.PrintToChatAll("1. " + cmd.Name);
|
||||
|
||||
foreach (var cmd in Instance.CommandListeners.Keys)
|
||||
Server.PrintToChatAll("2. " + cmd?.Target?.ToString());
|
||||
|
||||
var player = Utilities.GetPlayerFromUserid(userID);
|
||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
||||
|
||||
var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||
if (skillPlayer == null) return HookResult.Continue;
|
||||
|
||||
var temp = skillPlayer.SkillHudExpired;
|
||||
skillPlayer.SkillHudExpired = DateTime.MinValue;
|
||||
;
|
||||
Instance.AddTimer(5f, () =>
|
||||
{
|
||||
if (skillPlayer.SkillHudExpired == DateTime.MinValue)
|
||||
skillPlayer.SkillHudExpired = temp;
|
||||
});
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private static HookResult RoundStart(EventRoundStart @event, GameEventInfo info)
|
||||
{
|
||||
lock (setLock)
|
||||
|
|
@ -398,7 +432,10 @@ namespace src.player
|
|||
lock (setLock)
|
||||
{
|
||||
isTransmitRegistered = false;
|
||||
Instance.AddTimer(.1f, () => DisableAll());
|
||||
Instance.AddTimer(.1f, () => {
|
||||
DisableAll();
|
||||
ConVar.Find("sv_legacy_jump")?.SetValue("1");
|
||||
});
|
||||
Instance.RemoveListener<CheckTransmit>(CheckTransmit);
|
||||
playersSkills.Clear();
|
||||
staticSkills.Clear();
|
||||
|
|
|
|||
|
|
@ -23,19 +23,7 @@ namespace src.player.skills
|
|||
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return;
|
||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID);
|
||||
if (playerInfo?.Skill == skillName && hitgroup == (int)HitGroup_t.HITGROUP_HEAD)
|
||||
ApplyIronHeadEffect(victim!, @event.DmgHealth);
|
||||
}
|
||||
|
||||
private static void ApplyIronHeadEffect(CCSPlayerController victim, float damage)
|
||||
{
|
||||
var playerPawn = victim.PlayerPawn.Value;
|
||||
if (playerPawn == null || !playerPawn.IsValid) return;
|
||||
var newHealth = playerPawn.Health + damage;
|
||||
|
||||
if (newHealth > 100)
|
||||
newHealth = 100;
|
||||
|
||||
playerPawn.Health = (int)newHealth;
|
||||
SkillUtils.RestoreHealth(victim);
|
||||
}
|
||||
|
||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#8B4513", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
|
||||
|
|
|
|||
|
|
@ -66,20 +66,7 @@ namespace src.player.skills
|
|||
if (weaponServices.ActiveWeapon == null || !weaponServices.ActiveWeapon.IsValid || weaponServices.ActiveWeapon.Value == null || !weaponServices.ActiveWeapon.Value.IsValid || weaponServices.ActiveWeapon.Value.DesignerName != "weapon_knife")
|
||||
return;
|
||||
|
||||
RestoreHealth(victim, damage);
|
||||
}
|
||||
|
||||
private static void RestoreHealth(CCSPlayerController victim, float damage)
|
||||
{
|
||||
var playerPawn = victim.PlayerPawn.Value;
|
||||
if (playerPawn == null || !playerPawn.IsValid || playerPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) return;
|
||||
var newHealth = playerPawn.Health + damage;
|
||||
|
||||
if (newHealth > 100)
|
||||
newHealth = 100;
|
||||
|
||||
playerPawn.Health = (int)newHealth;
|
||||
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth");
|
||||
SkillUtils.RestoreHealth(victim);
|
||||
}
|
||||
|
||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#cc7504", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float torseReflectionChance = .95f, float legReflectionChance = .80f, float velocityModifier = .85f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ using CounterStrikeSharp.API;
|
|||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using src.utils;
|
||||
using System.Collections.Concurrent;
|
||||
using static src.jRandomSkills;
|
||||
|
||||
namespace src.player.skills
|
||||
|
|
@ -9,6 +10,7 @@ namespace src.player.skills
|
|||
public class BunnyHop : ISkill
|
||||
{
|
||||
private const Skills skillName = Skills.BunnyHop;
|
||||
private static readonly ConcurrentDictionary<ulong, int> playersLastJump = [];
|
||||
|
||||
public static void LoadSkill()
|
||||
{
|
||||
|
|
@ -34,7 +36,13 @@ namespace src.player.skills
|
|||
var flags = (PlayerFlags)playerPawn.Flags;
|
||||
var buttons = player.Buttons;
|
||||
|
||||
if (buttons.HasFlag(PlayerButtons.Jump) && flags.HasFlag(PlayerFlags.FL_ONGROUND) && !playerPawn.MoveType.HasFlag(MoveType_t.MOVETYPE_LADDER))
|
||||
if ((playerPawn.MovementServices?.QueuedButtonChangeMask & (ulong)PlayerButtons.Jump) != 0)
|
||||
playersLastJump.AddOrUpdate(player.SteamID, Server.TickCount, (_, _) => Server.TickCount);
|
||||
|
||||
bool jumpPressed = buttons.HasFlag(PlayerButtons.Jump)
|
||||
|| (playersLastJump.TryGetValue(player.SteamID, out int tick) && tick + 20 >= Server.TickCount);
|
||||
|
||||
if (jumpPressed && flags.HasFlag(PlayerFlags.FL_ONGROUND) && !playerPawn.MoveType.HasFlag(MoveType_t.MOVETYPE_LADDER))
|
||||
{
|
||||
playerPawn.AbsVelocity.Z = SkillsInfo.GetValue<float>(skillName, "jumpVelocity");
|
||||
var maxSpeed = SkillsInfo.GetValue<float>(skillName, "maxSpeed");
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ namespace src.player.skills
|
|||
{
|
||||
foreach (var (info, player) in infoList)
|
||||
{
|
||||
if (player == null) continue;
|
||||
if (player == null || !player.IsValid) continue;
|
||||
foreach (var _player in invisiblePlayers.Keys)
|
||||
if (player.SteamID != _player.SteamID)
|
||||
{
|
||||
|
|
@ -72,8 +72,9 @@ namespace src.player.skills
|
|||
if (entity == null || !entity.IsValid) continue;
|
||||
info.TransmitEntities.Remove(entity.Index);
|
||||
|
||||
var bombIndex = HideBomb(_player);
|
||||
var bombIndex = GetBombIndex();
|
||||
if (bombIndex == null) continue;
|
||||
|
||||
var bombEntity = Utilities.GetEntityFromIndex<CBaseEntity>((int)bombIndex);
|
||||
if (bombEntity == null || !bombEntity.IsValid) continue;
|
||||
info.TransmitEntities.Remove(bombEntity.Index);
|
||||
|
|
@ -124,7 +125,7 @@ namespace src.player.skills
|
|||
particle.AcceptInput("Start");
|
||||
}
|
||||
|
||||
private static uint? HideBomb(CCSPlayerController player)
|
||||
private static uint? GetBombIndex()
|
||||
{
|
||||
var bombEntities = Utilities.FindAllEntitiesByDesignerName<CC4>("weapon_c4").ToList();
|
||||
if (bombEntities.Count == 0) return null;
|
||||
|
|
@ -132,15 +133,6 @@ namespace src.player.skills
|
|||
var bomb = bombEntities.FirstOrDefault();
|
||||
if (bomb == null) return null;
|
||||
|
||||
// if (bomb.OwnerEntity.Index != player.Index) return null;
|
||||
|
||||
bomb.EntitySpottedState.Spotted = false;
|
||||
Utilities.SetStateChanged(bomb, "CCSPlayerPawn", "m_entitySpottedState", Schema.GetSchemaOffset("EntitySpottedState_t", "m_bSpotted"));
|
||||
|
||||
for (int i = 0; i < bomb.EntitySpottedState.SpottedByMask.Length; i++)
|
||||
bomb.EntitySpottedState.SpottedByMask[i] = 0;
|
||||
Utilities.SetStateChanged(bomb, "CCSPlayerPawn", "m_entitySpottedState", Schema.GetSchemaOffset("EntitySpottedState_t", "m_bSpottedByMask"));
|
||||
|
||||
return bomb.Index;
|
||||
}
|
||||
|
||||
|
|
|
|||
153
jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs
Normal file
153
jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs
Normal file
|
|
@ -0,0 +1,153 @@
|
|||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using static src.jRandomSkills;
|
||||
using System.Collections.Concurrent;
|
||||
using src.utils;
|
||||
using CounterStrikeSharp.API;
|
||||
|
||||
namespace src.player.skills
|
||||
{
|
||||
public class CarefulBullets : ISkill
|
||||
{
|
||||
private const Skills skillName = Skills.CarefulBullets;
|
||||
private static readonly ConcurrentDictionary<ulong, byte> targetPlayers = [];
|
||||
private static readonly ConcurrentDictionary<ulong, bool> lastShot = [];
|
||||
private static readonly object setLock = new();
|
||||
|
||||
public static void LoadSkill()
|
||||
{
|
||||
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
|
||||
}
|
||||
|
||||
public static void NewRound()
|
||||
{
|
||||
lock (setLock)
|
||||
{
|
||||
targetPlayers.Clear();
|
||||
lastShot.Clear();
|
||||
}
|
||||
foreach (var player in Utilities.GetPlayers())
|
||||
{
|
||||
DisableSkill(player);
|
||||
SkillUtils.CloseMenu(player);
|
||||
}
|
||||
}
|
||||
|
||||
public static void PlayerDeath(EventPlayerDeath @event)
|
||||
{
|
||||
var player = @event.Userid;
|
||||
if (player == null) return;
|
||||
DisableSkill(player);
|
||||
}
|
||||
|
||||
public static void OnTick()
|
||||
{
|
||||
if (Server.TickCount % 32 != 0) return;
|
||||
foreach (var player in Utilities.GetPlayers())
|
||||
{
|
||||
if (!SkillUtils.HasMenu(player)) continue;
|
||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||
|
||||
if (playerInfo == null || playerInfo.Skill != skillName) continue;
|
||||
var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
|
||||
ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))];
|
||||
SkillUtils.UpdateMenu(player, menuItems);
|
||||
}
|
||||
}
|
||||
|
||||
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
||||
{
|
||||
if (player == null || !player.IsValid || !player.PawnIsAlive) return;
|
||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||
if (playerInfo?.Skill != skillName) return;
|
||||
|
||||
if (playerInfo.SkillUsed)
|
||||
{
|
||||
player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_used_info")}");
|
||||
return;
|
||||
}
|
||||
|
||||
string enemyId = commands[0];
|
||||
var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId);
|
||||
|
||||
if (enemy == null)
|
||||
{
|
||||
player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("selectplayerskill_incorrect_enemy_index"));
|
||||
return;
|
||||
}
|
||||
|
||||
targetPlayers.TryAdd(enemy.SteamID, 0);
|
||||
playerInfo.SkillUsed = true;
|
||||
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("carefulbullets_player_info", enemy.PlayerName));
|
||||
enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("carefulbullets_enemy_info"));
|
||||
}
|
||||
|
||||
public static void EnableSkill(CCSPlayerController player)
|
||||
{
|
||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||
if (playerInfo == null) return;
|
||||
playerInfo.SkillUsed = false;
|
||||
|
||||
var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||
if (enemies.Length > 0)
|
||||
{
|
||||
ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))];
|
||||
SkillUtils.CreateMenu(player, menuItems);
|
||||
}
|
||||
else
|
||||
player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
||||
}
|
||||
|
||||
public static void OnTakeDamage(DynamicHook h)
|
||||
{
|
||||
CEntityInstance param = h.GetParam<CEntityInstance>(0);
|
||||
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
|
||||
|
||||
if (param?.Entity == null || param2?.Attacker?.Value == null)
|
||||
return;
|
||||
|
||||
CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle);
|
||||
|
||||
if (attackerPawn.DesignerName != "player")
|
||||
return;
|
||||
|
||||
if (attackerPawn == null || attackerPawn.Controller?.Value == null)
|
||||
return;
|
||||
|
||||
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
|
||||
|
||||
if (!targetPlayers.ContainsKey(attacker.SteamID) || !attacker.PawnIsAlive)
|
||||
return;
|
||||
|
||||
bool hitPlayer = param.DesignerName == "player";
|
||||
|
||||
if (!lastShot.ContainsKey(attacker.SteamID))
|
||||
{
|
||||
lastShot.TryAdd(attacker.SteamID, hitPlayer);
|
||||
|
||||
Instance.AddTickTimer(1, () =>
|
||||
{
|
||||
if (lastShot.TryRemove(attacker.SteamID, out bool didHit) && !didHit)
|
||||
SkillUtils.TakeHealth(attackerPawn, SkillsInfo.GetValue<int>(skillName, "damageAfterMiss"));
|
||||
lastShot.TryRemove(attacker.SteamID, out _);
|
||||
});
|
||||
}
|
||||
else if (hitPlayer)
|
||||
lastShot.TryUpdate(attacker.SteamID, true, false);
|
||||
}
|
||||
|
||||
public static void DisableSkill(CCSPlayerController player)
|
||||
{
|
||||
targetPlayers.TryRemove(player.SteamID, out _);
|
||||
lastShot.TryRemove(player.SteamID, out _);
|
||||
SkillUtils.CloseMenu(player);
|
||||
}
|
||||
|
||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#db6c35", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int damageAfterMiss = 5) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
|
||||
{
|
||||
public int DamageAfterMiss { get; set; } = damageAfterMiss;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,8 +1,7 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
||||
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||
using CounterStrikeSharp.API.Modules.Timers;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CS2TraceRay.Class;
|
||||
using CS2TraceRay.Struct;
|
||||
|
|
@ -10,6 +9,7 @@ using src.utils;
|
|||
using System.Collections.Concurrent;
|
||||
using System.Drawing;
|
||||
using System.Numerics;
|
||||
using Timer = CounterStrikeSharp.API.Modules.Timers.Timer;
|
||||
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
|
||||
|
||||
namespace src.player.skills
|
||||
|
|
@ -25,7 +25,7 @@ namespace src.player.skills
|
|||
|
||||
public static void LoadSkill()
|
||||
{
|
||||
// SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
|
||||
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
|
||||
jRandomSkills.Instance.AddToManifest(cameraPropModel);
|
||||
jRandomSkills.Instance.AddToManifest(cameraViewModel);
|
||||
}
|
||||
|
|
@ -56,7 +56,9 @@ namespace src.player.skills
|
|||
CameraView = null,
|
||||
CameraActive = false,
|
||||
NextCamera = 0,
|
||||
NoSpace = 0,
|
||||
PlayerCameraRaw = player.PlayerPawn.Value.CameraServices.ViewEntity.Raw,
|
||||
LastAngle = QAngle.Zero
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -85,6 +87,7 @@ namespace src.player.skills
|
|||
playerSkill.CameraProp.AcceptInput("Kill");
|
||||
playerSkill.CameraProp = null;
|
||||
}
|
||||
playerSkill.NextCamera = Server.TickCount + SkillsInfo.GetValue<float>(skillName, "Cooldown") * 64;
|
||||
}
|
||||
|
||||
public static void OnTick()
|
||||
|
|
@ -114,8 +117,13 @@ namespace src.player.skills
|
|||
{
|
||||
if (player.NextCamera > Server.TickCount) return;
|
||||
player.CameraProp = CreateCameraProp(player.Player);
|
||||
if (player.CameraProp == null)
|
||||
{
|
||||
player.NoSpace = Server.TickCount + (64 * 2);
|
||||
return;
|
||||
}
|
||||
player.CameraView = CreateCameraView(player.Player);
|
||||
player.NextCamera = Server.TickCount + SkillsInfo.GetValue<float>(skillName, "Cooldown") * 64;
|
||||
if (player.CameraView == null) return;
|
||||
}
|
||||
|
||||
var pawn = player.Player.PlayerPawn.Value;
|
||||
|
|
@ -123,13 +131,52 @@ namespace src.player.skills
|
|||
return;
|
||||
|
||||
BlockWeapon(player.Player, player.CameraActive);
|
||||
pawn!.CameraServices!.ViewEntity.Raw = player.CameraActive && player.CameraView != null ? player.CameraView.EntityHandle.Raw : player.PlayerCameraRaw;
|
||||
Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices");
|
||||
|
||||
if (player.CameraActive && player.CameraView != null)
|
||||
Server.NextWorldUpdate(() =>
|
||||
{
|
||||
SkillUtils.ApplyScreenColor(player.Player, 0, 0, 255, 20, 100, 1020);
|
||||
}
|
||||
if (pawn != null && pawn.LifeState == (byte)LifeState_t.LIFE_ALIVE)
|
||||
{
|
||||
if (player.CameraActive && player.CameraProp != null)
|
||||
{
|
||||
if ( pawn.AbsRotation != null)
|
||||
player.LastAngle = new QAngle(pawn.AbsRotation.X, pawn.AbsRotation.Y, pawn.AbsRotation.Z);
|
||||
pawn.Teleport(null, player.CameraProp.AbsRotation);
|
||||
}
|
||||
else if (!forceToDefault)
|
||||
pawn.Teleport(null, player.LastAngle);
|
||||
}
|
||||
|
||||
if (player.CameraActive && player.CameraView != null)
|
||||
{
|
||||
pawn!.CameraServices!.ViewEntity.Raw = player.CameraView.EntityHandle.Raw;
|
||||
SkillUtils.ApplyScreenColor(player.Player, 0, 0, 255, 20, 100, 1020);
|
||||
|
||||
Timer? cameraTimer = null;
|
||||
ulong playerSteamID = player.Player.SteamID;
|
||||
|
||||
cameraTimer = jRandomSkills.Instance.AddTimer(2f, () =>
|
||||
{
|
||||
var target = Utilities.GetPlayerFromSteamId(playerSteamID);
|
||||
if (target == null || !target.IsValid || !target.PawnIsAlive)
|
||||
{
|
||||
cameraTimer?.Kill();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!playersInfo.TryGetValue(target, out var playerSkill) || playerSkill.CameraActive == false)
|
||||
{
|
||||
cameraTimer?.Kill();
|
||||
return;
|
||||
}
|
||||
|
||||
SkillUtils.ApplyScreenColor(target, 0, 0, 255, 20, 100, 1020);
|
||||
}, TimerFlags.STOP_ON_MAPCHANGE | TimerFlags.REPEAT);
|
||||
}
|
||||
else
|
||||
pawn!.CameraServices!.ViewEntity.Raw = player.PlayerCameraRaw;
|
||||
|
||||
Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices");
|
||||
});
|
||||
}
|
||||
|
||||
private static CDynamicProp? CreateCameraProp(CCSPlayerController player)
|
||||
|
|
@ -140,7 +187,6 @@ namespace src.player.skills
|
|||
camera.Collision.SolidType = SolidType_t.SOLID_VPHYSICS;
|
||||
camera.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(camera.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2));
|
||||
camera.Entity!.Name = camera.Globalname = $"CypherCamera_{Server.TickCount}_{player.SteamID}";
|
||||
camera.DispatchSpawn();
|
||||
|
||||
var playerPawn = player.PlayerPawn.Value;
|
||||
if (playerPawn == null || !playerPawn.IsValid) return null;
|
||||
|
|
@ -150,10 +196,14 @@ namespace src.player.skills
|
|||
if (cameraVector == null) return null;
|
||||
cameraVector = new Vector(cameraVector.X + diffVector.X, cameraVector.Y + diffVector.Y, cameraVector.Z);
|
||||
|
||||
if (!CheckCameraPosition(cameraVector, player))
|
||||
return null;
|
||||
|
||||
Server.NextFrame(() =>
|
||||
{
|
||||
camera.SetModel(cameraPropModel);
|
||||
camera.Teleport(cameraVector, new QAngle(0, playerPawn.V_angle.Y + 180, 0));
|
||||
camera.DispatchSpawn();
|
||||
});
|
||||
|
||||
return camera;
|
||||
|
|
@ -163,7 +213,6 @@ namespace src.player.skills
|
|||
{
|
||||
var camera = Utilities.CreateEntityByName<CDynamicProp>("prop_dynamic");
|
||||
if (camera == null || !camera.IsValid) return null;
|
||||
camera.DispatchSpawn();
|
||||
|
||||
var playerPawn = player.PlayerPawn.Value;
|
||||
if (playerPawn == null || !playerPawn.IsValid) return null;
|
||||
|
|
@ -172,14 +221,15 @@ namespace src.player.skills
|
|||
Vector diffVector = SkillUtils.GetForwardVector(playerPawn.V_angle) * 25;
|
||||
if (cameraVector == null) return null;
|
||||
|
||||
|
||||
cameraVector = new Vector(cameraVector.X - diffVector.X, cameraVector.Y - diffVector.Y, cameraVector.Z);
|
||||
if (cameraVector == null) return null;
|
||||
|
||||
Server.NextFrame(() =>
|
||||
{
|
||||
camera.SetModel(cameraViewModel);
|
||||
camera.Render = Color.FromArgb(0, 255, 255, 255);
|
||||
camera.Teleport(cameraVector, playerPawn.EyeAngles);
|
||||
camera.DispatchSpawn();
|
||||
});
|
||||
|
||||
return camera;
|
||||
|
|
@ -227,7 +277,7 @@ namespace src.player.skills
|
|||
}
|
||||
}
|
||||
|
||||
private unsafe static Vector? GetNewCameraPosition(CCSPlayerController player)
|
||||
private static Vector? GetNewCameraPosition(CCSPlayerController player)
|
||||
{
|
||||
var playerPawn = player.PlayerPawn.Value;
|
||||
if (playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null) return null;
|
||||
|
|
@ -235,30 +285,54 @@ namespace src.player.skills
|
|||
Vector eyePos = new(playerPawn.AbsOrigin.X, playerPawn.AbsOrigin.Y, playerPawn.AbsOrigin.Z + playerPawn.ViewOffset.Z);
|
||||
Vector endPos = eyePos + SkillUtils.GetForwardVector(playerPawn.V_angle) * 4096f;
|
||||
|
||||
Ray ray = new(Vector3.Zero);
|
||||
CTraceFilter filter = new(playerPawn.Index, playerPawn.Index)
|
||||
{
|
||||
m_nObjectSetMask = 0xf,
|
||||
m_nCollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PROJECTILE,
|
||||
m_nInteractsWith = 8589946881,
|
||||
m_nInteractsExclude = 0,
|
||||
m_nBits = 11,
|
||||
m_bIterateEntities = true,
|
||||
m_bHitTriggers = false,
|
||||
m_nInteractsAs = 0x40000,
|
||||
m_bOnlyHitIfHasPhysics = true
|
||||
};
|
||||
ulong solid = 0x1;
|
||||
ulong window = 0x1000;
|
||||
ulong passBullets = 0x2000;
|
||||
|
||||
filter.m_nHierarchyIds[0] = playerPawn.GetHierarchyId();
|
||||
filter.m_nHierarchyIds[1] = 0;
|
||||
CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray);
|
||||
ulong mask = solid | window | passBullets;
|
||||
ulong contents = playerPawn.Collision.CollisionGroup;
|
||||
CGameTrace trace = TraceRay.TraceShape(eyePos, endPos, mask, contents, player);
|
||||
|
||||
if (trace.HitWorld(out _))
|
||||
return new Vector(trace.EndPos.X, trace.EndPos.Y, trace.EndPos.Z);
|
||||
{
|
||||
Vector3 hitPost = trace.EndPos;
|
||||
Vector3 normal = trace.Normal;
|
||||
|
||||
float offset = 8;
|
||||
Vector finalPos = new(
|
||||
hitPost.X + (normal.X * offset),
|
||||
hitPost.Y + (normal.Y * offset),
|
||||
hitPost.Z + (normal.Z * offset)
|
||||
);
|
||||
|
||||
return finalPos;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static bool CheckCameraPosition(Vector cameraVector, CCSPlayerController player)
|
||||
{
|
||||
var playerPawn = player.PlayerPawn.Value;
|
||||
if (playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null) return false;
|
||||
|
||||
Vector endPos = cameraVector + SkillUtils.GetForwardVector(new QAngle(0, playerPawn.V_angle.Y + 180, 0)) * -5;
|
||||
cameraVector += SkillUtils.GetForwardVector(new QAngle(0, playerPawn.V_angle.Y + 180, 0)) * 5;
|
||||
|
||||
ulong solid = 0x1;
|
||||
ulong window = 0x1000;
|
||||
ulong passBullets = 0x2000;
|
||||
|
||||
ulong mask = solid | window | passBullets;
|
||||
ulong contents = playerPawn.Collision.CollisionGroup;
|
||||
CGameTrace trace = TraceRay.TraceShape(cameraVector, endPos, mask, contents, player);
|
||||
|
||||
if (trace.HitWorld(out _))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private static void UpdateHUD(PlayerSkill playerSkill)
|
||||
{
|
||||
if (playerSkill == null || playerSkill.Player == null) return;
|
||||
|
|
@ -270,7 +344,9 @@ namespace src.player.skills
|
|||
var playerInfo = jRandomSkills.Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == playerSkill?.Player?.SteamID);
|
||||
if (playerInfo == null) return;
|
||||
|
||||
if (cooldown == 0)
|
||||
if (playerSkill.NoSpace >= Server.TickCount)
|
||||
playerInfo.PrintHTML = $"<font color='#FF0000'>{playerSkill.Player.GetTranslation("cypher_nospace")}</font>";
|
||||
else if (cooldown == 0)
|
||||
playerInfo.PrintHTML = null;
|
||||
else if (playerSkill?.CameraProp == null)
|
||||
playerInfo.PrintHTML = $"{playerSkill?.Player.GetTranslation("hud_info", $"<font color='#FF0000'>{cooldown}</font>")}";
|
||||
|
|
@ -284,6 +360,8 @@ namespace src.player.skills
|
|||
public uint PlayerCameraRaw { get; set; }
|
||||
public bool CameraActive { get; set; }
|
||||
public float NextCamera { get; set; }
|
||||
public float NoSpace { get; set; }
|
||||
public required QAngle LastAngle { get; set; }
|
||||
}
|
||||
|
||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#34ebd5", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = true, bool needsTeammates = false, string requiredPermission = "", float cooldown = 30) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ using CounterStrikeSharp.API.Modules.Utils;
|
|||
using src.utils;
|
||||
using System.Collections.Concurrent;
|
||||
using static src.jRandomSkills;
|
||||
using Timer = CounterStrikeSharp.API.Modules.Timers.Timer;
|
||||
|
||||
namespace src.player.skills
|
||||
{
|
||||
|
|
@ -111,34 +112,32 @@ namespace src.player.skills
|
|||
private static void SetUpPostProcessing(CCSPlayerController player, bool turnOff = false)
|
||||
{
|
||||
if (player == null || !player.IsValid) return;
|
||||
var pawn = player.PlayerPawn.Value;
|
||||
if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return;
|
||||
ulong playerSteamID = player.SteamID;
|
||||
|
||||
lock (setLock)
|
||||
{
|
||||
if (!turnOff)
|
||||
{
|
||||
playersInDark.TryAdd(player.SteamID, 0);
|
||||
SkillUtils.ApplyScreenColor(player,
|
||||
r: SkillsInfo.GetValue<int>(skillName, "R"),
|
||||
g: SkillsInfo.GetValue<int>(skillName, "G"),
|
||||
b: SkillsInfo.GetValue<int>(skillName, "B"),
|
||||
a: SkillsInfo.GetValue<int>(skillName, "A"),
|
||||
duration: 100,
|
||||
holdTime: 3000);
|
||||
playersInDark.TryAdd(playerSteamID, 0);
|
||||
ApplyColor(player);
|
||||
|
||||
Instance.AddTimer(2.5f, () => {
|
||||
if (!playersInDark.ContainsKey(player.SteamID))
|
||||
Timer? darkTimer = null;
|
||||
darkTimer = Instance.AddTimer(5f, () => {
|
||||
if (!playersInDark.ContainsKey(playerSteamID))
|
||||
{
|
||||
darkTimer?.Kill();
|
||||
return;
|
||||
}
|
||||
|
||||
if (player.IsValid && player.PawnIsAlive)
|
||||
SkillUtils.ApplyScreenColor(player,
|
||||
r: SkillsInfo.GetValue<int>(skillName, "R"),
|
||||
g: SkillsInfo.GetValue<int>(skillName, "G"),
|
||||
b: SkillsInfo.GetValue<int>(skillName, "B"),
|
||||
a: SkillsInfo.GetValue<int>(skillName, "A"),
|
||||
duration: 100,
|
||||
holdTime: 3000);
|
||||
var target = Utilities.GetPlayerFromSteamId(playerSteamID);
|
||||
if (target == null || !target.IsValid)
|
||||
{
|
||||
darkTimer?.Kill();
|
||||
return;
|
||||
}
|
||||
|
||||
if (target.PawnIsAlive)
|
||||
ApplyColor(player);
|
||||
}, TimerFlags.STOP_ON_MAPCHANGE | TimerFlags.REPEAT);
|
||||
}
|
||||
else
|
||||
|
|
@ -149,6 +148,17 @@ namespace src.player.skills
|
|||
}
|
||||
}
|
||||
|
||||
private static void ApplyColor(CCSPlayerController player)
|
||||
{
|
||||
SkillUtils.ApplyScreenColor(player,
|
||||
r: SkillsInfo.GetValue<int>(skillName, "R"),
|
||||
g: SkillsInfo.GetValue<int>(skillName, "G"),
|
||||
b: SkillsInfo.GetValue<int>(skillName, "B"),
|
||||
a: SkillsInfo.GetValue<int>(skillName, "A"),
|
||||
duration: 100,
|
||||
holdTime: 3000);
|
||||
}
|
||||
|
||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#383838", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int r = 0, int g = 0, int b = 0, int a = 230) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
|
||||
{
|
||||
public int R { get; set; } = r;
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using src.utils;
|
||||
using System.Collections.Concurrent;
|
||||
using static src.jRandomSkills;
|
||||
|
||||
namespace src.player.skills
|
||||
|
|
@ -9,15 +10,22 @@ namespace src.player.skills
|
|||
public class Dash : ISkill
|
||||
{
|
||||
private const Skills skillName = Skills.Dash;
|
||||
private static readonly PlayerFlags[] LF = new PlayerFlags[64];
|
||||
private static readonly int?[] J = new int?[64];
|
||||
private static readonly PlayerButtons[] LB = new PlayerButtons[64];
|
||||
private static readonly ConcurrentDictionary<ulong, PlayerSkillInfo> SkillPlayerInfo = [];
|
||||
private static readonly object setLock = new();
|
||||
|
||||
public static void LoadSkill()
|
||||
{
|
||||
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
|
||||
}
|
||||
|
||||
public static void NewRound()
|
||||
{
|
||||
lock (setLock)
|
||||
{
|
||||
SkillPlayerInfo.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
public static void OnTick()
|
||||
{
|
||||
foreach (var player in Utilities.GetPlayers())
|
||||
|
|
@ -25,11 +33,55 @@ namespace src.player.skills
|
|||
if (!Instance.IsPlayerValid(player)) return;
|
||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||
if (playerInfo?.Skill == skillName)
|
||||
HandleDash(player);
|
||||
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
|
||||
{
|
||||
UpdateHUD(player, skillInfo);
|
||||
HandleDash(player, skillInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void HandleDash(CCSPlayerController player)
|
||||
public static void EnableSkill(CCSPlayerController player)
|
||||
{
|
||||
SkillPlayerInfo.TryAdd(player.SteamID, new PlayerSkillInfo
|
||||
{
|
||||
SteamID = player.SteamID,
|
||||
CanUse = true,
|
||||
Cooldown = DateTime.MinValue,
|
||||
LastFlags = 0,
|
||||
Jumps = 0,
|
||||
LastButtons = 0
|
||||
});
|
||||
}
|
||||
|
||||
public static void DisableSkill(CCSPlayerController player)
|
||||
{
|
||||
SkillPlayerInfo.TryRemove(player.SteamID, out _);
|
||||
SkillUtils.ResetPrintHTML(player);
|
||||
}
|
||||
|
||||
private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo)
|
||||
{
|
||||
float cooldown = 0;
|
||||
if (skillInfo != null)
|
||||
{
|
||||
float time = (int)Math.Ceiling((skillInfo.Cooldown.AddSeconds(SkillsInfo.GetValue<float>(skillName, "cooldown")) - DateTime.Now).TotalSeconds);
|
||||
cooldown = Math.Max(time, 0);
|
||||
|
||||
if (cooldown == 0 && skillInfo?.CanUse == false)
|
||||
skillInfo.CanUse = true;
|
||||
}
|
||||
|
||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID);
|
||||
if (playerInfo == null) return;
|
||||
|
||||
if (cooldown == 0)
|
||||
playerInfo.PrintHTML = null;
|
||||
else
|
||||
playerInfo.PrintHTML = $"{player.GetTranslation("hud_info", $"<font color='#FF0000'>{cooldown}</font>")}";
|
||||
}
|
||||
|
||||
private static void HandleDash(CCSPlayerController player, PlayerSkillInfo skillInfo)
|
||||
{
|
||||
var playerPawn = player.PlayerPawn.Value;
|
||||
if (playerPawn == null || !playerPawn.IsValid) return;
|
||||
|
|
@ -37,55 +89,81 @@ namespace src.player.skills
|
|||
var flags = (PlayerFlags)playerPawn.Flags;
|
||||
var buttons = player.Buttons;
|
||||
|
||||
bool jumpPressed = (buttons & PlayerButtons.Jump) != 0
|
||||
|| (playerPawn.MovementServices?.QueuedButtonChangeMask & (ulong)PlayerButtons.Jump) != 0;
|
||||
|
||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||
if (playerPawn == null || playerInfo == null) return;
|
||||
|
||||
if ((LF[player.Slot] & PlayerFlags.FL_ONGROUND) != 0 && (flags & PlayerFlags.FL_ONGROUND) == 0 && (LB[player.Slot] & PlayerButtons.Jump) == 0 && (buttons & PlayerButtons.Jump) != 0)
|
||||
bool wasOnGround = (skillInfo.LastFlags & PlayerFlags.FL_ONGROUND) != 0;
|
||||
bool isOnGround = (flags & PlayerFlags.FL_ONGROUND) != 0;
|
||||
|
||||
if (wasOnGround && !isOnGround && jumpPressed)
|
||||
skillInfo.Jumps = 0;
|
||||
else if (isOnGround)
|
||||
skillInfo.Jumps = 0;
|
||||
else if (!isOnGround && jumpPressed && skillInfo.Jumps < 1)
|
||||
{
|
||||
}
|
||||
else if ((flags & PlayerFlags.FL_ONGROUND) != 0)
|
||||
{
|
||||
J[player.Slot] = 0;
|
||||
}
|
||||
else if ((LB[player.Slot] & PlayerButtons.Jump) == 0 && (buttons & PlayerButtons.Jump) != 0 && J[player.Slot] < 1)
|
||||
{
|
||||
J[player.Slot]++;
|
||||
bool lastJumpPressed = (skillInfo.LastButtons & PlayerButtons.Jump) != 0;
|
||||
if (!lastJumpPressed && skillInfo.CanUse)
|
||||
{
|
||||
skillInfo.Jumps++;
|
||||
skillInfo.CanUse = false;
|
||||
skillInfo.Cooldown = DateTime.Now;
|
||||
|
||||
float moveX = 0;
|
||||
float moveY = 0;
|
||||
float moveX = 0;
|
||||
float moveY = 0;
|
||||
|
||||
PlayerButtons playerButtons = player.Buttons;
|
||||
if (playerButtons.HasFlag(PlayerButtons.Forward))
|
||||
moveY += 1;
|
||||
if (playerButtons.HasFlag(PlayerButtons.Back))
|
||||
moveY -= 1;
|
||||
if (playerButtons.HasFlag(PlayerButtons.Moveleft))
|
||||
moveX += 1;
|
||||
if (playerButtons.HasFlag(PlayerButtons.Moveright))
|
||||
moveX -= 1;
|
||||
PlayerButtons playerButtons = player.Buttons;
|
||||
if (SkillsInfo.GetValue<bool>(skillName, "anyDirection"))
|
||||
{
|
||||
if (playerButtons.HasFlag(PlayerButtons.Forward))
|
||||
moveY += 1;
|
||||
if (playerButtons.HasFlag(PlayerButtons.Back))
|
||||
moveY -= 1;
|
||||
if (playerButtons.HasFlag(PlayerButtons.Moveleft))
|
||||
moveX += 1;
|
||||
if (playerButtons.HasFlag(PlayerButtons.Moveright))
|
||||
moveX -= 1;
|
||||
|
||||
if (moveX == 0 && moveY == 0)
|
||||
moveY = 1;
|
||||
if (moveX == 0 && moveY == 0)
|
||||
moveY = 1;
|
||||
}
|
||||
else
|
||||
moveY = 1;
|
||||
|
||||
float moveAngle = MathF.Atan2(moveX, moveY) * (180f / MathF.PI);
|
||||
QAngle dashAngles = new(0, playerPawn.EyeAngles.Y + moveAngle, 0);
|
||||
float moveAngle = MathF.Atan2(moveX, moveY) * (180f / MathF.PI);
|
||||
QAngle dashAngles = new(0, playerPawn.EyeAngles.Y + moveAngle, 0);
|
||||
|
||||
Vector newVelocity = SkillUtils.GetForwardVector(dashAngles) * SkillsInfo.GetValue<float>(skillName, "pushVelocity");
|
||||
newVelocity.Z = playerPawn.AbsVelocity.Z + SkillsInfo.GetValue<float>(skillName, "jumpVelocity");
|
||||
Vector newVelocity = SkillUtils.GetForwardVector(dashAngles) * SkillsInfo.GetValue<float>(skillName, "pushVelocity");
|
||||
newVelocity.Z = playerPawn.AbsVelocity.Z + SkillsInfo.GetValue<float>(skillName, "jumpVelocity");
|
||||
|
||||
playerPawn.AbsVelocity.X = newVelocity.X;
|
||||
playerPawn.AbsVelocity.Y = newVelocity.Y;
|
||||
playerPawn.AbsVelocity.Z = newVelocity.Z;
|
||||
playerPawn.AbsVelocity.X = newVelocity.X;
|
||||
playerPawn.AbsVelocity.Y = newVelocity.Y;
|
||||
playerPawn.AbsVelocity.Z = newVelocity.Z;
|
||||
}
|
||||
}
|
||||
|
||||
LF[player.Slot] = flags;
|
||||
LB[player.Slot] = buttons;
|
||||
skillInfo.LastFlags = flags;
|
||||
skillInfo.LastButtons = buttons;
|
||||
}
|
||||
|
||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#42bbfc", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float jumpVelocity = 150f, float pushVelocity = 600f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
|
||||
public class PlayerSkillInfo
|
||||
{
|
||||
public ulong SteamID { get; set; }
|
||||
public bool CanUse { get; set; }
|
||||
public DateTime Cooldown { get; set; }
|
||||
public PlayerFlags LastFlags { get; set; }
|
||||
public int Jumps { get; set; }
|
||||
public PlayerButtons LastButtons { get; set; }
|
||||
}
|
||||
|
||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#42bbfc", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float jumpVelocity = 150f, float pushVelocity = 600f, bool anyDirection = true, float cooldown = 2f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
|
||||
{
|
||||
public float JumpVelocity { get; set; } = jumpVelocity;
|
||||
public float PushVelocity { get; set; } = pushVelocity;
|
||||
public bool AnyDirection { get; set; } = anyDirection;
|
||||
public float Cooldown { get; set; } = cooldown;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -76,7 +76,7 @@ namespace src.player.skills
|
|||
if (entity == null || !entity.IsValid) continue;
|
||||
info.TransmitEntities.Remove(entity.Index);
|
||||
|
||||
var bombIndex = HideBomb(_player);
|
||||
var bombIndex = GetBombIndex(_player);
|
||||
if (bombIndex == null) continue;
|
||||
var bombEntity = Utilities.GetEntityFromIndex<CBaseEntity>((int)bombIndex);
|
||||
if (bombEntity == null || !bombEntity.IsValid) continue;
|
||||
|
|
@ -170,7 +170,7 @@ namespace src.player.skills
|
|||
playerInfo.PrintHTML = $"<font color='#FF0000'>{player.GetTranslation("disabled_weapon")}</font>";
|
||||
}
|
||||
|
||||
private static uint? HideBomb(CCSPlayerController player)
|
||||
private static uint? GetBombIndex(CCSPlayerController player)
|
||||
{
|
||||
var bombEntities = Utilities.FindAllEntitiesByDesignerName<CC4>("weapon_c4").ToList();
|
||||
if (bombEntities.Count == 0) return null;
|
||||
|
|
@ -179,14 +179,6 @@ namespace src.player.skills
|
|||
if (bomb == null) return null;
|
||||
|
||||
if (bomb.OwnerEntity.Index != player.Index) return null;
|
||||
|
||||
bomb.EntitySpottedState.Spotted = false;
|
||||
Utilities.SetStateChanged(bomb, "CCSPlayerPawn", "m_entitySpottedState", Schema.GetSchemaOffset("EntitySpottedState_t", "m_bSpotted"));
|
||||
|
||||
for (int i = 0; i < bomb.EntitySpottedState.SpottedByMask.Length; i++)
|
||||
bomb.EntitySpottedState.SpottedByMask[i] = 0;
|
||||
Utilities.SetStateChanged(bomb, "CCSPlayerPawn", "m_entitySpottedState", Schema.GetSchemaOffset("EntitySpottedState_t", "m_bSpottedByMask"));
|
||||
|
||||
return bomb.Index;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ namespace src.player.skills
|
|||
{
|
||||
foreach (Vector smokePos in smokes.Keys)
|
||||
foreach (var player in Utilities.GetPlayers())
|
||||
if (Server.TickCount % 17 == 0)
|
||||
if (Server.TickCount % 16 == 0)
|
||||
if (player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid && player.PlayerPawn.Value.AbsOrigin != null)
|
||||
if (SkillUtils.GetDistance(smokePos, player.PlayerPawn.Value.AbsOrigin) <= SkillsInfo.GetValue<float>(skillName, "smokeRadius"))
|
||||
AddHealth(player.PlayerPawn.Value, SkillsInfo.GetValue<int>(skillName, "smokeHeal"));
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||
using CounterStrikeSharp.API.Modules.Timers;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
|
|
@ -9,7 +7,7 @@ using CS2TraceRay.Class;
|
|||
using CS2TraceRay.Struct;
|
||||
using src.utils;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Numerics;
|
||||
using Timer = CounterStrikeSharp.API.Modules.Timers.Timer;
|
||||
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
|
||||
|
||||
namespace src.player.skills
|
||||
|
|
@ -22,7 +20,7 @@ namespace src.player.skills
|
|||
|
||||
public static void LoadSkill()
|
||||
{
|
||||
// SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
|
||||
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
|
||||
}
|
||||
|
||||
public static void NewRound()
|
||||
|
|
@ -143,8 +141,9 @@ namespace src.player.skills
|
|||
clone.Teleport(playerPawn.AbsOrigin, new QAngle(0, playerPawn.V_angle.Y, 0));
|
||||
|
||||
playerPawn.Teleport(pos);
|
||||
SkillUtils.ApplyScreenColor(player, 255, 255, 0, 20, 100, 1020);
|
||||
SkillUtils.ApplyScreenColor(player, r: 255, g: 255, b: 0, a: 20, duration: 100, holdTime: 1020);
|
||||
BlockWeapon(playerSkill.Player, true);
|
||||
|
||||
playerSkill.UseTime = Server.TickCount;
|
||||
playerSkill.NextUse = Server.TickCount + 64000;
|
||||
playerSkill.CloneProp = clone;
|
||||
|
|
@ -155,18 +154,25 @@ namespace src.player.skills
|
|||
KillClone(playerSkill);
|
||||
});
|
||||
|
||||
jRandomSkills.Instance.AddTimer(2f, () => {
|
||||
if (playerSkill.CloneProp == null)
|
||||
return;
|
||||
Timer? cloneTimer = null;
|
||||
ulong playerSteamID = player.SteamID;
|
||||
|
||||
if (player.IsValid && player.PawnIsAlive)
|
||||
SkillUtils.ApplyScreenColor(player,
|
||||
r: 255,
|
||||
g: 255,
|
||||
b: 0,
|
||||
a: 20,
|
||||
duration: 100,
|
||||
holdTime: 1020);
|
||||
cloneTimer = jRandomSkills.Instance.AddTimer(2f, () =>
|
||||
{
|
||||
var target = Utilities.GetPlayerFromSteamId(playerSteamID);
|
||||
if (target == null || !target.IsValid || !target.PawnIsAlive)
|
||||
{
|
||||
cloneTimer?.Kill();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!playersInfo.TryGetValue(target, out var playerSkill) || playerSkill.CloneProp == null)
|
||||
{
|
||||
cloneTimer?.Kill();
|
||||
return;
|
||||
}
|
||||
|
||||
SkillUtils.ApplyScreenColor(target, r: 255, g: 255, b: 0, a: 20, duration: 100, holdTime: 1020);
|
||||
}, TimerFlags.STOP_ON_MAPCHANGE | TimerFlags.REPEAT);
|
||||
});
|
||||
|
||||
|
|
@ -181,22 +187,9 @@ namespace src.player.skills
|
|||
Vector eyePos = new(playerPawn.AbsOrigin.X, playerPawn.AbsOrigin.Y, playerPawn.AbsOrigin.Z + 25);
|
||||
endPos.Z += 25;
|
||||
|
||||
Ray ray = new(Vector3.Zero);
|
||||
CTraceFilter filter = new(playerPawn.Index, playerPawn.Index)
|
||||
{
|
||||
m_nObjectSetMask = 0xf,
|
||||
m_nCollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER_MOVEMENT,
|
||||
m_nInteractsWith = playerPawn.GetInteractsWith(),
|
||||
m_nInteractsExclude = 0,
|
||||
m_nBits = 11,
|
||||
m_bIterateEntities = true,
|
||||
m_bHitTriggers = false,
|
||||
m_nInteractsAs = 0x40000
|
||||
};
|
||||
|
||||
filter.m_nHierarchyIds[0] = playerPawn.GetHierarchyId();
|
||||
filter.m_nHierarchyIds[1] = 0;
|
||||
CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray);
|
||||
ulong mask = playerPawn.Collision.CollisionAttribute.InteractsWith;
|
||||
ulong contents = playerPawn.Collision.CollisionGroup;
|
||||
CGameTrace trace = TraceRay.TraceShape(eyePos, endPos, mask, contents, player);
|
||||
|
||||
return !trace.DidHit();
|
||||
}
|
||||
|
|
@ -282,9 +275,7 @@ namespace src.player.skills
|
|||
if (playersInfo.TryGetValue(victim, out var playerSkill) && playerSkill.CloneProp != null)
|
||||
{
|
||||
KillClone(playerSkill);
|
||||
var victimPawn = victim.PlayerPawn.Value;
|
||||
if (victimPawn == null) return;
|
||||
SkillUtils.AddHealth(victimPawn, @event.DmgHealth);
|
||||
SkillUtils.RestoreHealth(victim);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -34,23 +34,31 @@ namespace src.player.skills
|
|||
{
|
||||
foreach( var (info, player) in infoList)
|
||||
{
|
||||
if (player == null) continue;
|
||||
if (player == null || !player.IsValid) continue;
|
||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||
|
||||
var targetHandle = player.Pawn.Value?.ObserverServices?.ObserverTarget.Value?.Handle ?? nint.Zero;
|
||||
bool isObservingJackal = false;
|
||||
|
||||
if (targetHandle != nint.Zero)
|
||||
{
|
||||
var target = Utilities.GetPlayers().FirstOrDefault(p => p?.Pawn?.Value?.Handle == targetHandle);
|
||||
var targetInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == target?.SteamID);
|
||||
if (targetInfo?.Skill == skillName) isObservingJackal = true;
|
||||
}
|
||||
|
||||
bool hasSkill = playerInfo?.Skill == skillName || isObservingJackal;
|
||||
|
||||
foreach (var param in playersStep)
|
||||
{
|
||||
var enemy = param.Key;
|
||||
var step = param.Value;
|
||||
if (step == null || step.IsValid) continue;
|
||||
|
||||
var observedPlayer = Utilities.GetPlayers().FirstOrDefault(p => p?.Pawn?.Value?.Handle == player?.Pawn?.Value?.ObserverServices?.ObserverTarget?.Value?.Handle);
|
||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||
var observerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == observedPlayer?.SteamID);
|
||||
if (step == null || !step.IsValid) continue;
|
||||
|
||||
var entity = Utilities.GetEntityFromIndex<CBaseEntity>((int)step.Index);
|
||||
if (entity == null || !entity.IsValid) continue;
|
||||
|
||||
if (playerInfo?.Skill != skillName && observerInfo?.Skill != skillName)
|
||||
info.TransmitEntities.Remove(entity.Index);
|
||||
else if (enemy.Team == player.Team)
|
||||
if (!hasSkill || enemy.Team == player.Team)
|
||||
info.TransmitEntities.Remove(entity.Index);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,25 +50,13 @@ namespace src.player.skills
|
|||
if (!Instance.IsPlayerValid(attacker))
|
||||
{
|
||||
if (victimInfo?.Skill == skillName)
|
||||
RestoreHealth(victim!, @event.DmgHealth);
|
||||
SkillUtils.RestoreHealth(victim);
|
||||
return;
|
||||
}
|
||||
|
||||
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
||||
if (attackerInfo?.Skill == skillName || victimInfo?.Skill == skillName)
|
||||
RestoreHealth(victim!, @event.DmgHealth);
|
||||
}
|
||||
|
||||
private static void RestoreHealth(CCSPlayerController victim, float damage)
|
||||
{
|
||||
var playerPawn = victim.PlayerPawn.Value;
|
||||
if (playerPawn == null || !playerPawn.IsValid) return;
|
||||
var newHealth = playerPawn.Health + damage;
|
||||
|
||||
if (newHealth > 100)
|
||||
newHealth = 100;
|
||||
|
||||
playerPawn.Health = (int)newHealth;
|
||||
SkillUtils.RestoreHealth(victim);
|
||||
}
|
||||
|
||||
public static void EnableSkill(CCSPlayerController _)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using src.utils;
|
||||
using static src.jRandomSkills;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
||||
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CS2TraceRay.Class;
|
||||
|
|
@ -9,7 +8,6 @@ using CS2TraceRay.Struct;
|
|||
using src.utils;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Drawing;
|
||||
using System.Numerics;
|
||||
using static src.jRandomSkills;
|
||||
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
|
||||
|
||||
|
|
@ -24,6 +22,8 @@ namespace src.player.skills
|
|||
private static readonly ConcurrentDictionary<ulong, byte> playersInAction = [];
|
||||
private static readonly MemoryFunctionVoid<IntPtr, short> Shoot_Secondary = new(GameData.GetSignature("Shoot_Secondary"));
|
||||
|
||||
private static int i = 0;
|
||||
|
||||
public static void LoadSkill()
|
||||
{
|
||||
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
|
||||
|
|
@ -100,23 +100,11 @@ namespace src.player.skills
|
|||
Vector eyePos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z);
|
||||
Vector endPos = eyePos + SkillUtils.GetForwardVector(pawn.EyeAngles) * SkillsInfo.GetValue<float>(skillName, "maxDistance");
|
||||
|
||||
Ray ray = new(Vector3.Zero);
|
||||
CTraceFilter filter = new(pawn.Index, pawn.Index)
|
||||
{
|
||||
m_nObjectSetMask = 0xf,
|
||||
m_nCollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER_MOVEMENT,
|
||||
m_nInteractsWith = pawn.GetInteractsWith(),
|
||||
m_nInteractsExclude = 0,
|
||||
m_nBits = 11,
|
||||
m_bIterateEntities = true,
|
||||
m_bHitTriggers = false,
|
||||
m_nInteractsAs = 0x40000
|
||||
};
|
||||
|
||||
filter.m_nHierarchyIds[0] = pawn.GetHierarchyId();
|
||||
filter.m_nHierarchyIds[1] = 0;
|
||||
CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray);
|
||||
|
||||
ulong hitboxes = 0x2;
|
||||
ulong mask = pawn.Collision.CollisionAttribute.InteractsWith | hitboxes;
|
||||
ulong contents = pawn.Collision.CollisionGroup;
|
||||
CGameTrace trace = TraceRay.TraceShape(eyePos, endPos, mask, contents, player);
|
||||
|
||||
if (Config.LoadedConfig.CS2TraceRayDebug)
|
||||
{
|
||||
CreateLine(eyePos, endPos, Color.FromArgb(255, 255, 255, 0));
|
||||
|
|
@ -126,12 +114,17 @@ namespace src.player.skills
|
|||
if (trace.DidHit())
|
||||
{
|
||||
var val = Activator.CreateInstance(typeof(CBaseEntity), trace.HitEntity) as CBaseEntity;
|
||||
player.PrintToChat($"Hit: {trace.DidHit()}, Entity: {(val == null ? "null" : val.DesignerName)}, Solid: {trace.AllSolid}, Contents: {(Contents)trace.Contents}");
|
||||
player.PrintToChat($"Hit: {trace.DidHit()}, Entity: {(val == null ? "null" : val.DesignerName)}, Solid: {trace.AllSolid}, Contents: {(Contents)trace.Contents}, Hitbox: {trace.HitboxData[0].HitGroup}");
|
||||
}
|
||||
else
|
||||
player.PrintToChat($"Hit: {trace.DidHit()}, Entity: {trace.HitEntity}, Solid: {trace.AllSolid}, Contents: {(Contents)trace.Contents}");
|
||||
player.PrintToChat($"Hit: {trace.DidHit()}, Object: {trace.HitEntity}, Solid: {trace.AllSolid}, Contents: {(Contents)trace.Contents}, Hitbox: {trace.HitboxData[0].HitGroup}");
|
||||
}
|
||||
|
||||
CEntityInstance entityInstance = new(trace.HitEntity);
|
||||
if (string.IsNullOrEmpty(entityInstance.DesignerName))
|
||||
return;
|
||||
|
||||
CBaseEntity entity = entityInstance.As<CBaseEntity>();
|
||||
if (!trace.HitPlayer(out CCSPlayerController? target) || target == null)
|
||||
return;
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ using CS2TraceRay.Enum;
|
|||
using CS2TraceRay.Struct;
|
||||
using src.utils;
|
||||
using System.Drawing;
|
||||
using System.Numerics;
|
||||
using static src.jRandomSkills;
|
||||
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
|
||||
|
||||
|
|
@ -39,22 +38,10 @@ namespace src.player.skills
|
|||
Vector eyePos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z);
|
||||
Vector endPos = eyePos + SkillUtils.GetForwardVector(pawn.EyeAngles) * SkillsInfo.GetValue<float>(skillName, "maxDistance");
|
||||
|
||||
Ray ray = new(Vector3.Zero);
|
||||
CTraceFilter filter = new(pawn.Index, pawn.Index)
|
||||
{
|
||||
m_nObjectSetMask = 0xf,
|
||||
m_nCollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER_MOVEMENT,
|
||||
m_nInteractsWith = pawn.GetInteractsWith(),
|
||||
m_nInteractsExclude = 0,
|
||||
m_nBits = 11,
|
||||
m_bIterateEntities = true,
|
||||
m_bHitTriggers = false,
|
||||
m_nInteractsAs = 0x40000
|
||||
};
|
||||
|
||||
filter.m_nHierarchyIds[0] = pawn.GetHierarchyId();
|
||||
filter.m_nHierarchyIds[1] = 0;
|
||||
CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray);
|
||||
ulong hitboxes = 0x2;
|
||||
ulong mask = pawn.Collision.CollisionAttribute.InteractsWith | hitboxes;
|
||||
ulong contents = pawn.Collision.CollisionGroup;
|
||||
CGameTrace trace = TraceRay.TraceShape(eyePos, endPos, mask, contents, player);
|
||||
|
||||
if (Config.LoadedConfig.CS2TraceRayDebug)
|
||||
{
|
||||
|
|
@ -65,10 +52,10 @@ namespace src.player.skills
|
|||
if (trace.DidHit())
|
||||
{
|
||||
var val = Activator.CreateInstance(typeof(CBaseEntity), trace.HitEntity) as CBaseEntity;
|
||||
player.PrintToChat($"Hit: {trace.DidHit()}, Entity: {(val == null ? "null" : val.DesignerName)}, Solid: {trace.AllSolid}, Contents: {(Contents)trace.Contents}");
|
||||
player.PrintToChat($"Hit: {trace.DidHit()}, Entity: {(val == null ? "null" : val.DesignerName)}, Solid: {trace.AllSolid}, Contents: {(Contents)trace.Contents}, Hitbox: {trace.HitboxData[0].HitGroup}");
|
||||
}
|
||||
else
|
||||
player.PrintToChat($"Hit: {trace.DidHit()}, Entity: {trace.HitEntity}, Solid: {trace.AllSolid}, Contents: {(Contents)trace.Contents}");
|
||||
player.PrintToChat($"Hit: {trace.DidHit()}, Object: {trace.HitEntity}, Solid: {trace.AllSolid}, Contents: {(Contents)trace.Contents}, Hitbox: {trace.HitboxData[0].HitGroup}");
|
||||
}
|
||||
|
||||
if (!trace.HitPlayer(out CCSPlayerController? target) || target == null)
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ namespace src.player.skills
|
|||
if (entity == null || !entity.IsValid) continue;
|
||||
info.TransmitEntities.Remove(entity.Index);
|
||||
|
||||
var bombIndex = HideBomb(_player);
|
||||
var bombIndex = GetBombIndex(_player);
|
||||
if (bombIndex == null) continue;
|
||||
var bombEntity = Utilities.GetEntityFromIndex<CBaseEntity>((int)bombIndex);
|
||||
if (bombEntity == null || !bombEntity.IsValid) continue;
|
||||
|
|
@ -170,7 +170,7 @@ namespace src.player.skills
|
|||
particle.AcceptInput("Start");
|
||||
}
|
||||
|
||||
private static uint? HideBomb(CCSPlayerController player)
|
||||
private static uint? GetBombIndex(CCSPlayerController player)
|
||||
{
|
||||
var bombEntities = Utilities.FindAllEntitiesByDesignerName<CC4>("weapon_c4").ToList();
|
||||
if (bombEntities.Count == 0) return null;
|
||||
|
|
@ -179,14 +179,6 @@ namespace src.player.skills
|
|||
if (bomb == null) return null;
|
||||
|
||||
if (bomb.OwnerEntity.Index != player.Index) return null;
|
||||
|
||||
bomb.EntitySpottedState.Spotted = false;
|
||||
Utilities.SetStateChanged(bomb, "CCSPlayerPawn", "m_entitySpottedState", Schema.GetSchemaOffset("EntitySpottedState_t", "m_bSpotted"));
|
||||
|
||||
for (int i = 0; i < bomb.EntitySpottedState.SpottedByMask.Length; i++)
|
||||
bomb.EntitySpottedState.SpottedByMask[i] = 0;
|
||||
Utilities.SetStateChanged(bomb, "CCSPlayerPawn", "m_entitySpottedState", Schema.GetSchemaOffset("EntitySpottedState_t", "m_bSpottedByMask"));
|
||||
|
||||
return bomb.Index;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using src.utils;
|
||||
using static src.jRandomSkills;
|
||||
|
|
@ -24,8 +25,8 @@ namespace src.player.skills
|
|||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
||||
if (playerInfo?.Skill != skillName) return;
|
||||
|
||||
if (weapon == "hegrenade" || weapon == "inferno")
|
||||
SkillUtils.AddHealth(player!.PlayerPawn.Value, damage);
|
||||
if (weapon == "hegrenade" || weapon == "inferno" || weapon == "decoy" || weapon == "flashbang" || weapon == "smokegrenade" || weapon == "molotov")
|
||||
SkillUtils.RestoreHealth(player);
|
||||
}
|
||||
|
||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a38c1a", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
|
||||
|
|
|
|||
|
|
@ -28,20 +28,7 @@ namespace src.player.skills
|
|||
|
||||
HitGroup_t[] disabledHitbox = [HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG];
|
||||
if (hitgroup != HitGroup_t.HITGROUP_HEAD)
|
||||
RestoreHealth(victim!, damage);
|
||||
}
|
||||
|
||||
private static void RestoreHealth(CCSPlayerController victim, float damage)
|
||||
{
|
||||
var playerPawn = victim.PlayerPawn.Value;
|
||||
if (playerPawn == null || !playerPawn.IsValid) return;
|
||||
var newHealth = playerPawn.Health + damage;
|
||||
|
||||
if (newHealth > 100)
|
||||
newHealth = 100;
|
||||
|
||||
playerPawn.Health = (int)newHealth;
|
||||
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth");
|
||||
SkillUtils.RestoreHealth(victim);
|
||||
}
|
||||
|
||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#3c47de", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
|
||||
|
|
|
|||
|
|
@ -52,18 +52,20 @@ namespace src.player.skills
|
|||
var flags = (PlayerFlags)playerPawn.Flags;
|
||||
var buttons = player.Buttons;
|
||||
|
||||
bool isJumpDown = (playerPawn.MovementServices?.Buttons?.ButtonStates[0] & (ulong)PlayerButtons.Jump) != 0 || (buttons & PlayerButtons.Jump) != 0;
|
||||
bool wasJumpDown = (LB[player.Slot] & PlayerButtons.Jump) != 0;
|
||||
|
||||
bool jumpPressed = (isJumpDown && !wasJumpDown)
|
||||
|| (playerPawn.MovementServices?.QueuedButtonChangeMask & (ulong)PlayerButtons.Jump) != 0;
|
||||
|
||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||
if (playerPawn == null || playerInfo == null) return;
|
||||
|
||||
if ((LF[player.Slot] & PlayerFlags.FL_ONGROUND) != 0 && (flags & PlayerFlags.FL_ONGROUND) == 0 && (LB[player.Slot] & PlayerButtons.Jump) == 0 && (buttons & PlayerButtons.Jump) != 0)
|
||||
{
|
||||
//J[player.Slot] ++;
|
||||
}
|
||||
else if ((flags & PlayerFlags.FL_ONGROUND) != 0)
|
||||
{
|
||||
bool isOnGround = (flags & PlayerFlags.FL_ONGROUND) != 0;
|
||||
|
||||
if (isOnGround)
|
||||
J[player.Slot] = 0;
|
||||
}
|
||||
else if ((LB[player.Slot] & PlayerButtons.Jump) == 0 && (buttons & PlayerButtons.Jump) != 0 && J[player.Slot] < playerInfo.SkillChance)
|
||||
else if (jumpPressed && J[player.Slot] < playerInfo.SkillChance + 1)
|
||||
{
|
||||
J[player.Slot]++;
|
||||
playerPawn.AbsVelocity.Z = 300;
|
||||
|
|
|
|||
|
|
@ -27,6 +27,8 @@ namespace src.player.skills
|
|||
var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault();
|
||||
if (plantedBomb != null)
|
||||
Server.NextFrame(() => plantedBomb.C4Blow = (float)Server.EngineTime + SkillsInfo.GetValue<int>(skillName, "extraC4BlowTime"));
|
||||
|
||||
player!.PrintToCenterAlert(player.GetTranslation("bombplanted", SkillsInfo.GetValue<int>(skillName, "extraC4BlowTime")));
|
||||
}
|
||||
|
||||
public static void DisableSkill(CCSPlayerController player)
|
||||
|
|
|
|||
|
|
@ -28,20 +28,7 @@ namespace src.player.skills
|
|||
|
||||
HitGroup_t[] disabledHitbox = [HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG];
|
||||
if (disabledHitbox.Contains(hitgroup))
|
||||
RestoreHealth(victim!, damage);
|
||||
}
|
||||
|
||||
private static void RestoreHealth(CCSPlayerController victim, float damage)
|
||||
{
|
||||
var playerPawn = victim.PlayerPawn.Value;
|
||||
if (playerPawn == null || !playerPawn.IsValid) return;
|
||||
var newHealth = playerPawn.Health + damage;
|
||||
|
||||
if (newHealth > 100)
|
||||
newHealth = 100;
|
||||
|
||||
playerPawn.Health = (int)newHealth;
|
||||
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth");
|
||||
SkillUtils.RestoreHealth(victim);
|
||||
}
|
||||
|
||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#9c9c9c", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
|
||||
|
|
|
|||
|
|
@ -26,7 +26,8 @@ namespace src.player.skills
|
|||
var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID);
|
||||
if (victimInfo == null || victimInfo.Skill != skillName) return ;
|
||||
|
||||
RestoreHealth(victim!, damage * SkillsInfo.GetValue<float>(skillName, "regenerationMultiplier"));
|
||||
var pawn = victim!.PlayerPawn.Value;
|
||||
SkillUtils.AddHealth(pawn, (int)(damage * SkillsInfo.GetValue<float>(skillName, "regenerationMultiplier")));
|
||||
}
|
||||
|
||||
public static void EnableSkill(CCSPlayerController player)
|
||||
|
|
@ -34,19 +35,6 @@ namespace src.player.skills
|
|||
SkillUtils.TryGiveWeapon(player, player.Team == CsTeam.CounterTerrorist ? CsItem.IncendiaryGrenade : CsItem.Molotov);
|
||||
}
|
||||
|
||||
private static void RestoreHealth(CCSPlayerController victim, float damage)
|
||||
{
|
||||
var playerPawn = victim.PlayerPawn.Value;
|
||||
if (playerPawn == null || !playerPawn.IsValid) return;
|
||||
var newHealth = playerPawn.Health + damage;
|
||||
|
||||
if (newHealth > 100)
|
||||
newHealth = 100;
|
||||
|
||||
playerPawn.Health = (int)newHealth;
|
||||
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth");
|
||||
}
|
||||
|
||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#3c47de", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float regenerationMultiplier = 1.5f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
|
||||
{
|
||||
public float RegenerationMultiplier { get; set; } = regenerationMultiplier;
|
||||
|
|
|
|||
|
|
@ -1,14 +1,11 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
||||
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||
using CounterStrikeSharp.API.Modules.Timers;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CS2TraceRay.Class;
|
||||
using CS2TraceRay.Struct;
|
||||
using src.utils;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Numerics;
|
||||
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
|
||||
using static src.jRandomSkills;
|
||||
|
||||
|
|
@ -170,22 +167,9 @@ namespace src.player.skills
|
|||
Vector eyePos = new(playerPawn.AbsOrigin.X, playerPawn.AbsOrigin.Y, playerPawn.AbsOrigin.Z + 25);
|
||||
endPos.Z += 25;
|
||||
|
||||
Ray ray = new(Vector3.Zero);
|
||||
CTraceFilter filter = new(playerPawn.Index, playerPawn.Index)
|
||||
{
|
||||
m_nObjectSetMask = 0xf,
|
||||
m_nCollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER_MOVEMENT,
|
||||
m_nInteractsWith = playerPawn.GetInteractsWith(),
|
||||
m_nInteractsExclude = 0,
|
||||
m_nBits = 11,
|
||||
m_bIterateEntities = true,
|
||||
m_bHitTriggers = false,
|
||||
m_nInteractsAs = 0x40000
|
||||
};
|
||||
|
||||
filter.m_nHierarchyIds[0] = playerPawn.GetHierarchyId();
|
||||
filter.m_nHierarchyIds[1] = 0;
|
||||
CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray);
|
||||
ulong mask = playerPawn.Collision.CollisionAttribute.InteractsWith;
|
||||
ulong contents = playerPawn.Collision.CollisionGroup;
|
||||
CGameTrace trace = TraceRay.TraceShape(eyePos, endPos, mask, contents, player);
|
||||
|
||||
return !trace.DidHit();
|
||||
}
|
||||
|
|
@ -225,9 +209,7 @@ namespace src.player.skills
|
|||
if (playersInfo.TryGetValue(victim, out var playerSkill) && playerSkill.CloneProp != null)
|
||||
{
|
||||
KillClone(playerSkill);
|
||||
var victimPawn = victim.PlayerPawn.Value;
|
||||
if (victimPawn == null) return;
|
||||
SkillUtils.AddHealth(victimPawn, @event.DmgHealth);
|
||||
SkillUtils.RestoreHealth(victim);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ namespace src.player.skills
|
|||
if (!victim.IsValid || !victim.PawnIsAlive || !skillInfo.CanUse) return;
|
||||
skillInfo.CanUse = false;
|
||||
skillInfo.Cooldown = DateTime.Now;
|
||||
RestoreHealth(victim, damage);
|
||||
SkillUtils.RestoreHealth(victim);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -88,19 +88,6 @@ namespace src.player.skills
|
|||
playerInfo.PrintHTML = $"{player.GetTranslation("hud_info", $"<font color='#FF0000'>{cooldown}</font>")}";
|
||||
}
|
||||
|
||||
private static void RestoreHealth(CCSPlayerController victim, float damage)
|
||||
{
|
||||
var playerPawn = victim.PlayerPawn.Value;
|
||||
if (playerPawn == null || !playerPawn.IsValid) return;
|
||||
var newHealth = playerPawn.Health + damage;
|
||||
|
||||
if (newHealth > 100)
|
||||
newHealth = 100;
|
||||
|
||||
playerPawn.Health = (int)newHealth;
|
||||
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth");
|
||||
}
|
||||
|
||||
public class PlayerSkillInfo
|
||||
{
|
||||
public ulong SteamID { get; set; }
|
||||
|
|
|
|||
|
|
@ -20,6 +20,12 @@ namespace src.player.skills
|
|||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||
if (playerInfo == null) return;
|
||||
int moneyBonus = Instance.Random.Next(SkillsInfo.GetValue<int>(skillName, "minMoney"), SkillsInfo.GetValue<int>(skillName, "maxMoney"));
|
||||
|
||||
var moneyServices = player.InGameMoneyServices;
|
||||
if (moneyServices == null) return;
|
||||
|
||||
moneyBonus = Math.Min(moneyBonus, 16000 - moneyServices.Account);
|
||||
|
||||
playerInfo.SkillChance = moneyBonus;
|
||||
AddMoney(player, moneyBonus);
|
||||
}
|
||||
|
|
@ -28,16 +34,22 @@ namespace src.player.skills
|
|||
{
|
||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||
if (playerInfo == null) return;
|
||||
AddMoney(player, -(int)(playerInfo.SkillChance ?? 0));
|
||||
|
||||
var moneyServices = player.InGameMoneyServices;
|
||||
if (moneyServices == null) return;
|
||||
|
||||
player.PrintToChat(moneyServices.CashSpentThisRound.ToString());
|
||||
int money = Math.Abs((int)playerInfo.SkillChance! - moneyServices.CashSpentThisRound);
|
||||
AddMoney(player, -money, 3000);
|
||||
}
|
||||
|
||||
private static void AddMoney(CCSPlayerController player, int money)
|
||||
private static void AddMoney(CCSPlayerController player, int money, int minimum = 0)
|
||||
{
|
||||
if (player == null || !player.IsValid) return;
|
||||
var moneyServices = player.InGameMoneyServices;
|
||||
if (moneyServices == null) return;
|
||||
|
||||
moneyServices.Account = Math.Min(Math.Max(moneyServices.Account + money, 0), 16000);
|
||||
moneyServices.Account = Math.Clamp(moneyServices.Account + money, minimum, 16000);
|
||||
Utilities.SetStateChanged(player, "CCSPlayerController", "m_pInGameMoneyServices");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +1,8 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using CS2TraceRay.Class;
|
||||
using CS2TraceRay.Struct;
|
||||
using System.Numerics;
|
||||
using static src.jRandomSkills;
|
||||
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
|
||||
using System.Collections.Concurrent;
|
||||
|
|
@ -69,29 +67,18 @@ namespace src.player.skills
|
|||
{
|
||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID);
|
||||
if (playerInfo == null) return;
|
||||
playerInfo.PrintHTML = $"{player.GetTranslation("shade_nospace")}";
|
||||
playerInfo.PrintHTML = $"<font color='#FF0000'>{player.GetTranslation("shade_nospace")}</font>";
|
||||
}
|
||||
|
||||
private unsafe static bool CheckTeleport(CCSPlayerController player, Vector startPos, Vector endPos)
|
||||
{
|
||||
var pawn = player.PlayerPawn.Value;
|
||||
if (pawn == null || !pawn.IsValid) return false;
|
||||
Ray ray = new(new Vector3(-16, -16, -0), new Vector3(16, 16, 72));
|
||||
CTraceFilter filter = new(pawn.Index, pawn.Index)
|
||||
{
|
||||
m_nObjectSetMask = 0xf,
|
||||
m_nCollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER_MOVEMENT,
|
||||
m_nInteractsWith = pawn.GetInteractsWith(),
|
||||
m_nInteractsExclude = 0,
|
||||
m_nBits = 11,
|
||||
m_bIterateEntities = true,
|
||||
m_bHitTriggers = false,
|
||||
m_nInteractsAs = 0x40000
|
||||
};
|
||||
|
||||
filter.m_nHierarchyIds[0] = pawn.GetHierarchyId();
|
||||
filter.m_nHierarchyIds[1] = 0;
|
||||
CGameTrace trace = TraceRay.TraceHull(startPos, endPos, filter, ray);
|
||||
ulong mask = pawn.Collision.CollisionAttribute.InteractsWith;
|
||||
ulong contents = pawn.Collision.CollisionGroup;
|
||||
CGameTrace trace = TraceRay.TraceShape(startPos, endPos, mask, contents, player);
|
||||
|
||||
return !trace.HitWorld(out _);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -26,6 +26,8 @@ namespace src.player.skills
|
|||
var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault();
|
||||
if (plantedBomb != null)
|
||||
Server.NextFrame(() => plantedBomb.C4Blow = (float)Server.EngineTime + SkillsInfo.GetValue<int>(skillName, "detonationTime"));
|
||||
|
||||
player!.PrintToCenterAlert(player.GetTranslation("bombplanted", SkillsInfo.GetValue<int>(skillName, "detonationTime")));
|
||||
}
|
||||
|
||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#f5b74c", CsTeam onlyTeam = CsTeam.Terrorist, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int detonationTime = 20) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
|
||||
|
|
|
|||
|
|
@ -1,19 +1,23 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using static src.jRandomSkills;
|
||||
using System.Collections.Concurrent;
|
||||
using src.utils;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Drawing;
|
||||
using static src.jRandomSkills;
|
||||
|
||||
namespace src.player.skills
|
||||
{
|
||||
public class SniperElite : ISkill
|
||||
{
|
||||
private const Skills skillName = Skills.SniperElite;
|
||||
private static readonly ConcurrentDictionary<ulong, List<CEntityInstance>> playerAWPs = [];
|
||||
private static readonly ConcurrentDictionary<ulong, string> sniperElites = [];
|
||||
private static readonly ConcurrentDictionary<ulong, List<uint>> playerAWPIndexes = [];
|
||||
private static readonly ConcurrentDictionary<ulong, string> savedWeapons = [];
|
||||
private static readonly ConcurrentDictionary<ulong, byte> isProcessing = [];
|
||||
private static readonly object setLock = new();
|
||||
|
||||
private const string weapon_awp = "weapon_awp";
|
||||
private static readonly string[] rifles = [ "weapon_mp9", "weapon_mac10", "weapon_bizon", "weapon_mp7", "weapon_ump45", "weapon_p90",
|
||||
"weapon_mp5sd", "weapon_famas", "weapon_galilar", "weapon_m4a1", "weapon_m4a1_silencer", "weapon_ak47",
|
||||
"weapon_aug", "weapon_sg553", "weapon_ssg08", "weapon_awp", "weapon_scar20", "weapon_g3sg1",
|
||||
|
|
@ -29,8 +33,9 @@ namespace src.player.skills
|
|||
|
||||
lock (setLock)
|
||||
{
|
||||
sniperElites.Clear();
|
||||
playerAWPs.Clear();
|
||||
savedWeapons.Clear();
|
||||
playerAWPIndexes.Clear();
|
||||
isProcessing.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -38,6 +43,7 @@ namespace src.player.skills
|
|||
{
|
||||
var player = @event.Userid;
|
||||
if (player == null || !player.IsValid) return;
|
||||
|
||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||
if (playerInfo?.Skill == skillName)
|
||||
DisableSkill(player);
|
||||
|
|
@ -47,118 +53,169 @@ namespace src.player.skills
|
|||
{
|
||||
var player = @event.Userid;
|
||||
if (player == null || !player.IsValid) return;
|
||||
|
||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||
if (playerInfo?.Skill == skillName)
|
||||
{
|
||||
if (rifles.Contains(@event.Item) && @event.Item != weapon_awp)
|
||||
savedWeapons.AddOrUpdate(player.SteamID, string.Empty, (_, _) => string.Empty);
|
||||
DeleteDroppedAWP(player);
|
||||
}
|
||||
}
|
||||
|
||||
public static void EnableSkill(CCSPlayerController player)
|
||||
{
|
||||
sniperElites.TryAdd(player.SteamID, "weapon_awp");
|
||||
savedWeapons.TryAdd(player.SteamID, string.Empty);
|
||||
}
|
||||
|
||||
public static void DisableSkill(CCSPlayerController player)
|
||||
{
|
||||
sniperElites.TryRemove(player.SteamID, out _);
|
||||
playerAWPs.TryRemove(player.SteamID, out _);
|
||||
player.ExecuteClientCommand("slot3");
|
||||
|
||||
if (playerAWPIndexes.TryGetValue(player.SteamID, out var AWPs))
|
||||
foreach (var index in AWPs.ToList())
|
||||
{
|
||||
var ent = Utilities.GetEntityFromIndex<CBaseEntity>((int)index);
|
||||
if (ent != null && ent.IsValid)
|
||||
ent.AcceptInput("Kill");
|
||||
}
|
||||
|
||||
if (savedWeapons.TryGetValue(player.SteamID, out string? savedWeapon) && !string.IsNullOrWhiteSpace(savedWeapon))
|
||||
Server.NextFrame(() =>
|
||||
player.PlayerPawn.Value?.ItemServices?.As<CCSPlayer_ItemServices>().GiveNamedItem<CEntityInstance>(savedWeapon));
|
||||
|
||||
Server.NextFrame(() => player.ExecuteClientCommand("lastinv"));
|
||||
|
||||
savedWeapons.TryRemove(player.SteamID, out _);
|
||||
playerAWPIndexes.TryRemove(player.SteamID, out _);
|
||||
isProcessing.TryRemove(player.SteamID, out _);
|
||||
}
|
||||
|
||||
public static void UseSkill(CCSPlayerController player)
|
||||
{
|
||||
var playerPawn = player.PlayerPawn.Value;
|
||||
if (playerPawn?.CBodyComponent == null) return;
|
||||
|
||||
if (sniperElites.ContainsKey(player.SteamID))
|
||||
if (player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid || isProcessing.ContainsKey(player.SteamID)) return;
|
||||
if (savedWeapons.ContainsKey(player.SteamID))
|
||||
RemoveAndGiveWeapon(player);
|
||||
}
|
||||
|
||||
private static void RemoveAndGiveWeapon(CCSPlayerController player)
|
||||
{
|
||||
string holdedWeapon = "weapon_awp";
|
||||
if (sniperElites.TryGetValue(player.SteamID, out string? weapon))
|
||||
if (!string.IsNullOrEmpty(weapon))
|
||||
holdedWeapon = weapon;
|
||||
|
||||
ulong steamID = player.SteamID;
|
||||
try
|
||||
{
|
||||
if (!isProcessing.TryAdd(steamID, 0)) return;
|
||||
|
||||
CBasePlayerWeapon? activeRifle = GetActiveRifle(player);
|
||||
string weaponToGive = weapon_awp;
|
||||
|
||||
if (activeRifle != null && activeRifle.IsValid)
|
||||
RemoveWeapon(player, activeRifle.DesignerName);
|
||||
{
|
||||
string currentWeaponName = SkillUtils.GetDesignerName(activeRifle);
|
||||
bool isScriptAWP = false;
|
||||
|
||||
sniperElites.TryAdd(player.SteamID, (activeRifle != null && activeRifle.IsValid) ? SkillUtils.GetDesignerName(activeRifle) : "weapon_awp");
|
||||
Server.NextFrame(() => {
|
||||
string weapon = holdedWeapon ?? "weapon_awp";
|
||||
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return;
|
||||
var createdWeapon = player.PlayerPawn.Value?.ItemServices?.As<CCSPlayer_ItemServices>().GiveNamedItem<CEntityInstance>(weapon);
|
||||
lock (setLock)
|
||||
isScriptAWP = playerAWPIndexes.TryGetValue(steamID, out var indexes) && indexes.Contains(activeRifle.Index);
|
||||
|
||||
if (createdWeapon != null && createdWeapon.IsValid && createdWeapon.DesignerName == "weapon_awp")
|
||||
if (isScriptAWP)
|
||||
{
|
||||
lock (setLock)
|
||||
if (savedWeapons.TryGetValue(steamID, out var savedWeapon) && !string.IsNullOrEmpty(savedWeapon))
|
||||
{
|
||||
if (playerAWPs.TryGetValue(player.SteamID, out var list))
|
||||
list.Add(createdWeapon);
|
||||
else
|
||||
playerAWPs.TryAdd(player.SteamID, [createdWeapon]);
|
||||
weaponToGive = savedWeapon;
|
||||
savedWeapons.AddOrUpdate(steamID, string.Empty, (_, _) => string.Empty);
|
||||
}
|
||||
else
|
||||
{
|
||||
isProcessing.TryRemove(steamID, out _);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
savedWeapons.AddOrUpdate(steamID, currentWeaponName, (_, _) => currentWeaponName);
|
||||
weaponToGive = weapon_awp + "_script";
|
||||
}
|
||||
|
||||
activeRifle.AcceptInput("Kill");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (savedWeapons.TryGetValue(steamID, out string? savedWeapon) && !string.IsNullOrEmpty(savedWeapon))
|
||||
{
|
||||
weaponToGive = savedWeapon;
|
||||
savedWeapons.AddOrUpdate(steamID, string.Empty, (_, _) => string.Empty);
|
||||
}
|
||||
else
|
||||
weaponToGive = weapon_awp + "_script";
|
||||
}
|
||||
|
||||
Server.NextFrame(() =>
|
||||
{
|
||||
if (player != null && player.IsValid && player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid)
|
||||
{
|
||||
var createdWeapon = player.PlayerPawn.Value?.ItemServices?.As<CCSPlayer_ItemServices>().GiveNamedItem<CEntityInstance>(weaponToGive.Replace("_script", ""));
|
||||
|
||||
if (createdWeapon != null && createdWeapon.IsValid && weaponToGive.EndsWith("_script"))
|
||||
{
|
||||
CBasePlayerWeapon weapon = createdWeapon.As<CBasePlayerWeapon>();
|
||||
if (weapon?.AttributeManager.Item.NetworkedDynamicAttributes != null)
|
||||
weapon.AttributeManager.Item.CustomName = player.GetTranslation("sniperelite_customname");
|
||||
|
||||
lock (setLock)
|
||||
{
|
||||
if (!playerAWPIndexes.ContainsKey(steamID))
|
||||
playerAWPIndexes.TryAdd(steamID, []);
|
||||
|
||||
if (playerAWPIndexes.TryGetValue(steamID, out var list))
|
||||
list.Add(createdWeapon.Index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DeleteDroppedAWP(player);
|
||||
isProcessing.TryRemove(steamID, out _);
|
||||
});
|
||||
}
|
||||
catch { }
|
||||
catch {
|
||||
isProcessing.TryRemove(steamID, out _);
|
||||
}
|
||||
}
|
||||
|
||||
private static void DeleteDroppedAWP(CCSPlayerController player)
|
||||
private static void DeleteDroppedAWP(CCSPlayerController? player)
|
||||
{
|
||||
var pawn = player.PlayerPawn.Value;
|
||||
if (pawn == null || !pawn.IsValid) return;
|
||||
var weaponServices = pawn.WeaponServices;
|
||||
if (weaponServices == null) return;
|
||||
if (player == null || !player.IsValid) return;
|
||||
|
||||
ConcurrentBag<uint> playerWeapons = [.. weaponServices.MyWeapons.Where(w => w != null && w.IsValid && w.Value != null && w.Value.IsValid)
|
||||
.Select(w => w.Value!.Index)];
|
||||
var pawn = player.PlayerPawn.Value;
|
||||
if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return;
|
||||
|
||||
var myWeapons = pawn.WeaponServices.MyWeapons;
|
||||
ConcurrentBag<uint> myWeaponsIndexes = [.. myWeapons
|
||||
.Where(w => w != null && w.IsValid && w.Value != null && w.Value.IsValid)
|
||||
.Select(w => w.Value!.Index)];
|
||||
|
||||
lock (setLock)
|
||||
{
|
||||
if (playerAWPs.TryGetValue(player.SteamID, out var AWPs))
|
||||
foreach (var awp in AWPs.ToList())
|
||||
{
|
||||
if (awp != null && awp.IsValid)
|
||||
if (playerAWPIndexes.TryGetValue(player.SteamID, out var AWPs))
|
||||
foreach (var index in AWPs.ToList())
|
||||
if (!myWeaponsIndexes.Contains(index))
|
||||
{
|
||||
if (!playerWeapons.Contains(awp.Index))
|
||||
{
|
||||
awp.AcceptInput("Kill");
|
||||
AWPs.Remove(awp);
|
||||
}
|
||||
var ent = Utilities.GetEntityFromIndex<CBaseEntity>((int)index);
|
||||
if (ent != null && ent.IsValid)
|
||||
ent.AcceptInput("Kill");
|
||||
|
||||
AWPs.Remove(index);
|
||||
}
|
||||
else
|
||||
AWPs.Remove(awp!);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static CBasePlayerWeapon? GetActiveRifle(CCSPlayerController player)
|
||||
{
|
||||
CBasePlayerWeapon? rifle = null;
|
||||
var pawn = player.PlayerPawn.Value;
|
||||
if (pawn == null || !pawn.IsValid) return rifle;
|
||||
var weaponServices = pawn.WeaponServices;
|
||||
if (weaponServices == null) return rifle;
|
||||
|
||||
foreach (var weapon in weaponServices.MyWeapons)
|
||||
if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid)
|
||||
if (rifles.Contains(weapon.Value.DesignerName))
|
||||
rifle = weapon.Value;
|
||||
return rifle;
|
||||
}
|
||||
|
||||
private static void RemoveWeapon(CCSPlayerController player, string designerName)
|
||||
{
|
||||
var pawn = player.PlayerPawn.Value;
|
||||
if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return;
|
||||
|
||||
foreach (var item in pawn.WeaponServices.MyWeapons)
|
||||
if (item != null && item.IsValid && item.Value != null && item.Value.IsValid && item.Value.DesignerName == designerName)
|
||||
item.Value.AcceptInput("Kill");
|
||||
if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return null;
|
||||
|
||||
var activeWeapon = pawn.WeaponServices?.ActiveWeapon.Value;
|
||||
if (activeWeapon != null && activeWeapon.IsValid && rifles.Contains(activeWeapon.DesignerName))
|
||||
return activeWeapon;
|
||||
return null;
|
||||
}
|
||||
|
||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#e0873a", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ using CounterStrikeSharp.API.Modules.Memory;
|
|||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using src.utils;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Runtime.InteropServices;
|
||||
using static src.jRandomSkills;
|
||||
|
||||
namespace src.player.skills
|
||||
|
|
@ -19,7 +20,8 @@ namespace src.player.skills
|
|||
|
||||
public static void LoadSkill()
|
||||
{
|
||||
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
||||
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
|
||||
}
|
||||
|
||||
public static void NewRound()
|
||||
|
|
|
|||
|
|
@ -21,11 +21,6 @@ namespace src.player.skills
|
|||
bombPlanted = false;
|
||||
}
|
||||
|
||||
public static void DisableSkill(CCSPlayerController player)
|
||||
{
|
||||
SkillUtils.ResetPrintHTML(player);
|
||||
}
|
||||
|
||||
public static void BombPlanted(EventBombPlanted _)
|
||||
{
|
||||
bombPlanted = true;
|
||||
|
|
@ -56,30 +51,10 @@ namespace src.player.skills
|
|||
else
|
||||
Localization.PrintTranslationToChatAll($" {ChatColors.LightBlue}{{0}}", ["watchmaker_ct"], [roundTime]);
|
||||
player.EmitSound(SkillsInfo.GetValue<string>(skillName, "SoundEvent"));
|
||||
}
|
||||
|
||||
public static void OnTick()
|
||||
{
|
||||
if (bombPlanted) return;
|
||||
if (SkillUtils.IsFreezeTime()) return;
|
||||
foreach (var player in Utilities.GetPlayers())
|
||||
{
|
||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||
if (playerInfo?.Skill == skillName)
|
||||
UpdateHUD(player);
|
||||
}
|
||||
}
|
||||
|
||||
private static void UpdateHUD(CCSPlayerController player)
|
||||
{
|
||||
var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == skillName);
|
||||
if (skillData == null || Instance?.GameRules == null || Instance?.GameRules?.RoundTime == null || Instance.GameRules?.RoundStartTime == null) return;
|
||||
|
||||
int seconds = 1 + (int)(Instance.GameRules.RoundTime - (Server.CurrentTime - Instance.GameRules.RoundStartTime));
|
||||
|
||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID);
|
||||
if (playerInfo == null) return;
|
||||
playerInfo.PrintHTML = SkillUtils.SecondsToTimer(seconds);
|
||||
var proxy = Utilities.FindAllEntitiesByDesignerName<CCSGameRulesProxy>("cs_gamerules").FirstOrDefault();
|
||||
if (proxy == null) return;
|
||||
Utilities.SetStateChanged(proxy, "CCSGameRulesProxy", "m_pGameRules");
|
||||
}
|
||||
|
||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff462e", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int changeRoundTime = 7, string soundEvent = "UIPanorama.sidemenu_select") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ namespace src.utils
|
|||
KillerSkillChatInfo = true;
|
||||
TeamMateSkillChatInfo = true;
|
||||
SummaryAfterTheRound = true;
|
||||
DebugMode = true;
|
||||
DebugMode = false;
|
||||
AlternativeSkillButton = null;
|
||||
SkillTimeBeforeStart = 7;
|
||||
SkillHudDuration = 999;
|
||||
|
|
@ -107,7 +107,7 @@ namespace src.utils
|
|||
FlashingHtmlHudFix = true;
|
||||
CS2TraceRayDebug = false;
|
||||
DisableSpectateHUD = false;
|
||||
DisableHUDOnDeathPermission = "@jRandmosSkills/death";
|
||||
DisableHUDOnDeathPermission = "@jRandomSkills/death";
|
||||
DisableSkillsOnRoundEnd = false;
|
||||
|
||||
LanguageSystem = new LanguageSystem
|
||||
|
|
@ -116,11 +116,12 @@ namespace src.utils
|
|||
DisableGeoLite = false,
|
||||
LanguageInfos =
|
||||
[
|
||||
new LanguageInfo("CN, TW, HK, MO, SG", "pt-br"),
|
||||
new LanguageInfo("PT, BR, AO, CV, GW, MZ, ST, TL", "zh"),
|
||||
new LanguageInfo("ZH, CN, TW, HK, MO, SG", "zh"),
|
||||
new LanguageInfo("PT-BR, PT, BR, AO, CV, GW, MZ, ST, TL", "pt-br"),
|
||||
new LanguageInfo("FR, MC, HT", "fr"),
|
||||
new LanguageInfo("DE, AT, CH, LI, LU, BE", "de"),
|
||||
new LanguageInfo("PL", "pl"),
|
||||
new LanguageInfo("GB, US", "en")
|
||||
new LanguageInfo("EN, GB, US", "en")
|
||||
]
|
||||
};
|
||||
|
||||
|
|
@ -158,25 +159,25 @@ namespace src.utils
|
|||
|
||||
NormalCommands = new NormalCommands
|
||||
{
|
||||
SetSkillCommand = new NormalCommand("ustawskill, ustaw_skill, setskill, set_skill, definirhabilidade, configurarhabilidade, 设置技能, 配置技能", "@jRandmosSkills/admin"),
|
||||
SkillsListCommand = new NormalCommand("supermoc, skille, listamocy, supermoce, skills, listaHabilidades, habilidades, 技能列表, 超能力列表", "@jRandmosSkills/admin"),
|
||||
UseSkillCommand = new NormalCommand("t, useSkill, usarHabilidade, 技能使用, 使用技能", "@jRandmosSkills/admin"),
|
||||
HealCommand = new NormalCommand("heal, ulecz, curar, tratar, 治疗, 治愈", "@jRandmosSkills/admin"),
|
||||
ConsoleCommand = new NormalCommand("console, sv, 控制台, 服务器", "@jRandmosSkills/owner"),
|
||||
SetSkillCommand = new NormalCommand("ustawskill, ustaw_skill, setskill, set_skill, definirhabilidade, configurarhabilidade, 设置技能, 配置技能", "@jRandomSkills/admin"),
|
||||
SkillsListCommand = new NormalCommand("supermoc, skille, listamocy, supermoce, skills, listaHabilidades, habilidades, 技能列表, 超能力列表", "@jRandomSkills/admin"),
|
||||
UseSkillCommand = new NormalCommand("t, useSkill, usarHabilidade, 技能使用, 使用技能", "@jRandomSkills/admin"),
|
||||
HealCommand = new NormalCommand("heal, ulecz, curar, tratar, 治疗, 治愈", "@jRandomSkills/admin"),
|
||||
ConsoleCommand = new NormalCommand("console, sv, 控制台, 服务器", "@jRandomSkills/owner"),
|
||||
HudCommand = new NormalCommand("hud, hood", ""),
|
||||
SetStaticSkillCommand = new NormalCommand("ustawstatycznyskill, ustaw_statyczny_skill, setstaticskill, set_static_skill", "@jRandmosSkills/admin"),
|
||||
SetStaticSkillCommand = new NormalCommand("ustawstatycznyskill, ustaw_statyczny_skill, setstaticskill, set_static_skill", "@jRandomSkills/admin"),
|
||||
ChangeLanguageCommand = new NormalCommand("lang, language, changelang, change_lang, jezyk, język", ""),
|
||||
ReloadCommand = new NormalCommand("reload, refresh", "@jRandmosSkills/admin"),
|
||||
ReloadCommand = new NormalCommand("reload, refresh", "@jRandomSkills/admin"),
|
||||
};
|
||||
|
||||
VotingCommands = new VotingCommands
|
||||
{
|
||||
StartGameCommand = new StartGameCommand(true, "start, go, começar, iniciar, 开始, 启动", "@jRandmosSkills/admin", "mp_freezetime 15; mp_forcecamera 0; mp_overtime_enable 1; sv_cheats 0", "mp_freezetime 0; mp_forcecamera 0; mp_overtime_enable 1; sv_cheats 1", 15, 60, 15, 500, 2),
|
||||
ChangeMapCommand = new VotingCommand(true, "map, mapa, changemap, zmienmape, zmienmape, mudarMapa, trocarMapa, 更换地图, 更改地图", "@jRandmosSkills/admin", 25, 90, 15, 500, 2),
|
||||
SwapCommand = new VotingCommand(true, "swap, zmiana, trocar, 交换, 切换", "@jRandmosSkills/admin", 15, 90, 15, 20, 2),
|
||||
ShuffleCommand = new VotingCommand(true, "shuffle, embaralhar, 随机排序, 洗牌", "@jRandmosSkills/admin", 15, 90, 15, 20, 2),
|
||||
PauseCommand = new VotingCommand(true, "pause, unpause, pausar, despausar, 暂停, 恢复", "@jRandmosSkills/admin", 15, 60, 15, 2, 2),
|
||||
SetScoreCommand = new VotingCommand(true, "setscore, wynik, definirPontuacao, configurarPontos, 设置分数, 调整分数", "@jRandmosSkills/owner", 15, 90, 15, 90, 2),
|
||||
StartGameCommand = new StartGameCommand(true, "start, go, começar, iniciar, 开始, 启动", "@jRandomSkills/admin", "mp_freezetime 15; mp_forcecamera 0; mp_overtime_enable 1; sv_cheats 0", "mp_freezetime 0; mp_forcecamera 0; mp_overtime_enable 1; sv_cheats 1", 15, 60, 15, 500, 2),
|
||||
ChangeMapCommand = new VotingCommand(true, "map, mapa, changemap, zmienmape, zmienmape, mudarMapa, trocarMapa, 更换地图, 更改地图", "@jRandomSkills/admin", 25, 90, 15, 500, 2),
|
||||
SwapCommand = new VotingCommand(true, "swap, zmiana, trocar, 交换, 切换", "@jRandomSkills/admin", 15, 90, 15, 20, 2),
|
||||
ShuffleCommand = new VotingCommand(true, "shuffle, embaralhar, 随机排序, 洗牌", "@jRandomSkills/admin", 15, 90, 15, 20, 2),
|
||||
PauseCommand = new VotingCommand(true, "pause, unpause, pausar, despausar, 暂停, 恢复", "@jRandomSkills/admin", 15, 60, 15, 2, 2),
|
||||
SetScoreCommand = new VotingCommand(true, "setscore, wynik, definirPontuacao, configurarPontos, 设置分数, 调整分数", "@jRandomSkills/owner", 15, 90, 15, 90, 2),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ using CounterStrikeSharp.API.Modules.Utils;
|
|||
using src.player;
|
||||
using src.player.skills;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Globalization;
|
||||
using System.Runtime.InteropServices;
|
||||
using WASDMenuAPI.Classes;
|
||||
using WASDSharedAPI;
|
||||
|
|
@ -110,14 +111,23 @@ namespace src.utils
|
|||
if (scale <= 0 || skeleton == null) return;
|
||||
|
||||
skeleton.Scale = scale;
|
||||
playerPawn.AcceptInput("SetScale", null, null, scale.ToString());
|
||||
Server.NextFrame(() => Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent"));
|
||||
playerPawn.AcceptInput("SetScale", null, null, scale.ToString(CultureInfo.InvariantCulture));
|
||||
Server.NextWorldUpdate(() => Utilities.SetStateChanged(player.PlayerPawn.Value!, "CBaseEntity", "m_CBodyComponent"));
|
||||
}
|
||||
|
||||
public static Vector? GetSpawnPointVector(CCSPlayerController player, bool enemySpawn = false)
|
||||
{
|
||||
var spawns = Utilities.FindAllEntitiesByDesignerName<SpawnPoint>(player.Team == CsTeam.Terrorist && !enemySpawn
|
||||
? "info_player_terrorist" : "info_player_counterterrorist").ToList();
|
||||
if (player == null || player.Team is CsTeam.None or CsTeam.Spectator) return null;
|
||||
|
||||
CsTeam targetTeam = enemySpawn
|
||||
? (player.Team == CsTeam.CounterTerrorist ? CsTeam.Terrorist : CsTeam.CounterTerrorist)
|
||||
: player.Team;
|
||||
|
||||
string spawnPointName = targetTeam == CsTeam.CounterTerrorist
|
||||
? "info_player_counterterrorist"
|
||||
: "info_player_terrorist";
|
||||
|
||||
var spawns = Utilities.FindAllEntitiesByDesignerName<SpawnPoint>(spawnPointName).ToList();
|
||||
if (spawns.Count != 0)
|
||||
{
|
||||
var randomSpawn = spawns[jRandomSkills.Instance.Random.Next(spawns.Count)];
|
||||
|
|
@ -208,6 +218,19 @@ namespace src.utils
|
|||
Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iMaxHealth");
|
||||
}
|
||||
|
||||
public static void RestoreHealth(CCSPlayerController? player)
|
||||
{
|
||||
if (player == null || !player.IsValid || player.PlayerPawn == null)
|
||||
return;
|
||||
|
||||
CBasePlayerPawn? pawn = player.PlayerPawn.Value;
|
||||
if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE)
|
||||
return;
|
||||
|
||||
pawn.Health = (int)player.PawnHealth;
|
||||
Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth");
|
||||
}
|
||||
|
||||
public static string GetDesignerName(CBasePlayerWeapon? weapon)
|
||||
{
|
||||
if (weapon == null || !weapon.IsValid) return string.Empty;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue