v1.0.4
This commit is contained in:
parent
a7009be3e0
commit
898f86f888
137 changed files with 3553 additions and 3780 deletions
66
WASDMenuAPI - SRC Files/Classes/WasdManager.cs
Normal file
66
WASDMenuAPI - SRC Files/Classes/WasdManager.cs
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
using CounterStrikeSharp.API.Core;
|
||||||
|
using WASDSharedAPI;
|
||||||
|
|
||||||
|
namespace WASDMenuAPI.Classes;
|
||||||
|
|
||||||
|
public class WasdManager : IWasdMenuManager
|
||||||
|
{
|
||||||
|
public void OpenMainMenu(CCSPlayerController? player, IWasdMenu? menu)
|
||||||
|
{
|
||||||
|
if(player == null)
|
||||||
|
return;
|
||||||
|
WASDMenuAPI.Players[player.SteamID].OpenMainMenu((WasdMenu?)menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CloseMenu(CCSPlayerController? player)
|
||||||
|
{
|
||||||
|
if(player == null)
|
||||||
|
return;
|
||||||
|
WASDMenuAPI.Players[player.SteamID].OpenMainMenu(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CloseSubMenu(CCSPlayerController? player)
|
||||||
|
{
|
||||||
|
if(player == null)
|
||||||
|
return;
|
||||||
|
WASDMenuAPI.Players[player.SteamID].CloseSubMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CloseAllSubMenus(CCSPlayerController? player)
|
||||||
|
{
|
||||||
|
if(player == null)
|
||||||
|
return;
|
||||||
|
WASDMenuAPI.Players[player.SteamID].CloseAllSubMenus();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OpenSubMenu(CCSPlayerController? player, IWasdMenu? menu)
|
||||||
|
{
|
||||||
|
if (player == null)
|
||||||
|
return;
|
||||||
|
WASDMenuAPI.Players[player.SteamID].OpenSubMenu(menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IWasdMenu CreateMenu(string title = "", string controlText = "")
|
||||||
|
{
|
||||||
|
WasdMenu menu = new WasdMenu
|
||||||
|
{
|
||||||
|
Title = title,
|
||||||
|
ControlText = controlText
|
||||||
|
};
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool HasMenu(CCSPlayerController? player)
|
||||||
|
{
|
||||||
|
if (player == null)
|
||||||
|
return false;
|
||||||
|
return WASDMenuAPI.Players.ContainsKey(player.SteamID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateActiveMenu(CCSPlayerController? player, Dictionary<string, Action<CCSPlayerController, IWasdMenuOption>> list)
|
||||||
|
{
|
||||||
|
if (player == null)
|
||||||
|
return;
|
||||||
|
WASDMenuAPI.Players[player.SteamID].UpdateActiveMenu(list);
|
||||||
|
}
|
||||||
|
}
|
||||||
25
WASDMenuAPI - SRC Files/Classes/WasdMenu.cs
Normal file
25
WASDMenuAPI - SRC Files/Classes/WasdMenu.cs
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
using CounterStrikeSharp.API.Core;
|
||||||
|
using WASDSharedAPI;
|
||||||
|
|
||||||
|
namespace WASDMenuAPI.Classes;
|
||||||
|
|
||||||
|
public class WasdMenu : IWasdMenu
|
||||||
|
{
|
||||||
|
public string Title { get; set; } = "";
|
||||||
|
public string ControlText { get; set; } = "";
|
||||||
|
public LinkedList<IWasdMenuOption>? Options { get; set; } = new();
|
||||||
|
public LinkedListNode<IWasdMenuOption>? Prev { get; set; } = null;
|
||||||
|
public LinkedListNode<IWasdMenuOption> Add(string display, Action<CCSPlayerController, IWasdMenuOption> onChoice)
|
||||||
|
{
|
||||||
|
if (Options == null)
|
||||||
|
Options = new();
|
||||||
|
WasdMenuOption newOption = new WasdMenuOption
|
||||||
|
{
|
||||||
|
OptionDisplay = display,
|
||||||
|
OnChoose = onChoice,
|
||||||
|
Index = Options.Count,
|
||||||
|
Parent = this
|
||||||
|
};
|
||||||
|
return Options.AddLast(newOption);
|
||||||
|
}
|
||||||
|
}
|
||||||
13
WASDMenuAPI - SRC Files/Classes/WasdMenuOption.cs
Normal file
13
WASDMenuAPI - SRC Files/Classes/WasdMenuOption.cs
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
using CounterStrikeSharp.API.Core;
|
||||||
|
using WASDMenuAPI.Classes;
|
||||||
|
using WASDSharedAPI;
|
||||||
|
|
||||||
|
namespace WASDMenuAPI;
|
||||||
|
|
||||||
|
public class WasdMenuOption : IWasdMenuOption
|
||||||
|
{
|
||||||
|
public IWasdMenu? Parent { get; set; }
|
||||||
|
public string? OptionDisplay { get; set; }
|
||||||
|
public Action<CCSPlayerController, IWasdMenuOption>? OnChoose { get; set; }
|
||||||
|
public int Index { get; set; }
|
||||||
|
}
|
||||||
229
WASDMenuAPI - SRC Files/Classes/WasdMenuPlayer.cs
Normal file
229
WASDMenuAPI - SRC Files/Classes/WasdMenuPlayer.cs
Normal file
|
|
@ -0,0 +1,229 @@
|
||||||
|
using System.Text;
|
||||||
|
using CounterStrikeSharp.API;
|
||||||
|
using CounterStrikeSharp.API.Core;
|
||||||
|
using WASDMenuAPI.Classes;
|
||||||
|
using WASDSharedAPI;
|
||||||
|
|
||||||
|
namespace WASDMenuAPI;
|
||||||
|
|
||||||
|
public class WasdMenuPlayer
|
||||||
|
{
|
||||||
|
public CCSPlayerController player { get; set; }
|
||||||
|
public WasdMenu? MainMenu = null;
|
||||||
|
public LinkedListNode<IWasdMenuOption>? CurrentChoice = null;
|
||||||
|
public LinkedListNode<IWasdMenuOption>? MenuStart = null;
|
||||||
|
public string CenterHtml = "";
|
||||||
|
public int VisibleOptions = 3;
|
||||||
|
public PlayerButtons Buttons { get; set; }
|
||||||
|
|
||||||
|
public int scrollIndex = 0;
|
||||||
|
public int maxLength = 21;
|
||||||
|
public int scrollJump = 3;
|
||||||
|
|
||||||
|
public void OpenMainMenu(WasdMenu? menu)
|
||||||
|
{
|
||||||
|
if (menu == null)
|
||||||
|
{
|
||||||
|
MainMenu = null;
|
||||||
|
CurrentChoice = null;
|
||||||
|
CenterHtml = "";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
MainMenu = menu;
|
||||||
|
CurrentChoice = MainMenu.Options?.First;
|
||||||
|
MenuStart = CurrentChoice;
|
||||||
|
UpdateCenterHtml();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OpenSubMenu(IWasdMenu? menu)
|
||||||
|
{
|
||||||
|
if (menu == null)
|
||||||
|
{
|
||||||
|
CurrentChoice = MainMenu?.Options?.First;
|
||||||
|
MenuStart = CurrentChoice;
|
||||||
|
UpdateCenterHtml();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CurrentChoice = menu.Options?.First;
|
||||||
|
MenuStart = CurrentChoice;
|
||||||
|
UpdateCenterHtml();
|
||||||
|
}
|
||||||
|
public void GoBackToPrev(LinkedListNode<IWasdMenuOption>? menu)
|
||||||
|
{
|
||||||
|
if (menu == null)
|
||||||
|
{
|
||||||
|
CurrentChoice = MainMenu?.Options?.First;
|
||||||
|
MenuStart = CurrentChoice;
|
||||||
|
UpdateCenterHtml();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CurrentChoice = menu;
|
||||||
|
if (CurrentChoice.Value.Index >= 5 )
|
||||||
|
{
|
||||||
|
MenuStart = CurrentChoice;
|
||||||
|
for (int i = 0; i < VisibleOptions; i++)
|
||||||
|
{
|
||||||
|
MenuStart = MenuStart?.Previous;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
MenuStart = CurrentChoice.List?.First;
|
||||||
|
UpdateCenterHtml();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CloseSubMenu()
|
||||||
|
{
|
||||||
|
if (CurrentChoice?.Value.Parent?.Prev == null)
|
||||||
|
return;
|
||||||
|
GoBackToPrev(CurrentChoice?.Value.Parent.Prev);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CloseAllSubMenus()
|
||||||
|
{
|
||||||
|
OpenSubMenu(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Choose()
|
||||||
|
{
|
||||||
|
CurrentChoice?.Value.OnChoose?.Invoke(player, CurrentChoice.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ScrollDown()
|
||||||
|
{
|
||||||
|
if(CurrentChoice == null || MainMenu == null)
|
||||||
|
return;
|
||||||
|
scrollIndex = 0;
|
||||||
|
CurrentChoice = CurrentChoice.Next ?? CurrentChoice.List?.First;
|
||||||
|
MenuStart = CurrentChoice!.Value.Index >= VisibleOptions ? MenuStart!.Next : CurrentChoice.List?.First;
|
||||||
|
UpdateCenterHtml();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ScrollUp()
|
||||||
|
{
|
||||||
|
if(CurrentChoice == null || MainMenu == null)
|
||||||
|
return;
|
||||||
|
scrollIndex = 0;
|
||||||
|
CurrentChoice = CurrentChoice.Previous ?? CurrentChoice.List?.Last;
|
||||||
|
if (CurrentChoice == CurrentChoice?.List?.Last && CurrentChoice?.Value.Index >= VisibleOptions)
|
||||||
|
{
|
||||||
|
MenuStart = CurrentChoice;
|
||||||
|
for (int i = 0; i < VisibleOptions - 1; i++)
|
||||||
|
MenuStart = MenuStart?.Previous;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
MenuStart = CurrentChoice!.Value.Index >= VisibleOptions ? MenuStart!.Previous : CurrentChoice.List?.First;
|
||||||
|
UpdateCenterHtml();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateCenterHtml()
|
||||||
|
{
|
||||||
|
if (CurrentChoice == null || MainMenu == null || MenuStart == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
StringBuilder builder = new();
|
||||||
|
string endControl = "";
|
||||||
|
LinkedListNode<IWasdMenuOption>? option = MenuStart;
|
||||||
|
|
||||||
|
if (option?.Value?.Parent?.Title != "")
|
||||||
|
builder.AppendLine($"{option.Value.Parent?.Title}</u><font class='fontSize-m' color='white'><br>");
|
||||||
|
|
||||||
|
if (option?.Value?.Parent?.ControlText != "")
|
||||||
|
endControl = option?.Value?.Parent?.ControlText ?? "";
|
||||||
|
|
||||||
|
int shown = 0;
|
||||||
|
int maxOptions = VisibleOptions;
|
||||||
|
|
||||||
|
while (shown < maxOptions && option != null && option.Value != null)
|
||||||
|
{
|
||||||
|
/* if (shown == maxOptions - 1 && option.Next != null)
|
||||||
|
{
|
||||||
|
builder.AppendLine(
|
||||||
|
$"<img src='https://raw.githubusercontent.com/oqyh/cs2-Kill-Sound-GoldKingZ/main/Resources/arrow.gif' class=''> <img src='https://raw.githubusercontent.com/oqyh/cs2-Kill-Sound-GoldKingZ/main/Resources/arrow.gif' class=''> <img src='https://raw.githubusercontent.com/oqyh/cs2-Kill-Sound-GoldKingZ/main/Resources/arrow.gif' class=''> <br>");
|
||||||
|
break;
|
||||||
|
}*/
|
||||||
|
string text = option.Value.OptionDisplay!;
|
||||||
|
if (option == CurrentChoice)
|
||||||
|
{
|
||||||
|
if (text.Length > maxLength)
|
||||||
|
{
|
||||||
|
if (scrollIndex >= text.Length - maxLength)
|
||||||
|
{
|
||||||
|
text = text.Substring(scrollIndex);
|
||||||
|
if (Server.TickCount % 32 == 0)
|
||||||
|
scrollIndex = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
text = text.Substring(scrollIndex, maxLength);
|
||||||
|
if (Server.TickCount % 32 == 0)
|
||||||
|
scrollIndex += scrollJump;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.AppendLine($"</font><font color='purple'>[ </font><font color='orange'>{text}</font><font color='purple'> ]</font><font color='white'> <br>");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
builder.AppendLine($"{text.Substring(0, maxLength)} <br>");
|
||||||
|
|
||||||
|
option = option.Next;
|
||||||
|
shown++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(endControl))
|
||||||
|
builder.AppendLine(endControl);
|
||||||
|
|
||||||
|
builder.AppendLine("</div>");
|
||||||
|
CenterHtml = builder.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateActiveMenu(Dictionary<string, Action<CCSPlayerController, IWasdMenuOption>> list)
|
||||||
|
{
|
||||||
|
if (list.Count == 0)
|
||||||
|
{
|
||||||
|
OpenMainMenu(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MainMenu == null || MainMenu.Options == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
MainMenu.Options.Clear();
|
||||||
|
bool choiceExists = false;
|
||||||
|
|
||||||
|
foreach (var item in list)
|
||||||
|
{
|
||||||
|
WasdMenuOption newOption = new WasdMenuOption
|
||||||
|
{
|
||||||
|
OptionDisplay = item.Key,
|
||||||
|
OnChoose = item.Value,
|
||||||
|
Index = MainMenu.Options.Count,
|
||||||
|
Parent = MainMenu
|
||||||
|
};
|
||||||
|
MainMenu.Options.AddLast(newOption);
|
||||||
|
|
||||||
|
if (CurrentChoice?.Value?.OptionDisplay == item.Key)
|
||||||
|
{
|
||||||
|
CurrentChoice = MainMenu.Options?.Last;
|
||||||
|
choiceExists = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!choiceExists)
|
||||||
|
CurrentChoice = MainMenu.Options?.First;
|
||||||
|
|
||||||
|
if (CurrentChoice != null)
|
||||||
|
{
|
||||||
|
if (CurrentChoice.Value.Index >= VisibleOptions)
|
||||||
|
{
|
||||||
|
MenuStart = CurrentChoice;
|
||||||
|
for (int i = 0; i < VisibleOptions - 1; i++)
|
||||||
|
MenuStart = MenuStart?.Previous;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
MenuStart = MainMenu.Options?.First;
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateCenterHtml();
|
||||||
|
}
|
||||||
|
}
|
||||||
13
WASDMenuAPI - SRC Files/Interfaces/IWasdMenu.cs
Normal file
13
WASDMenuAPI - SRC Files/Interfaces/IWasdMenu.cs
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
using CounterStrikeSharp.API.Core;
|
||||||
|
|
||||||
|
namespace WASDSharedAPI;
|
||||||
|
|
||||||
|
public interface IWasdMenu
|
||||||
|
{
|
||||||
|
public string? Title { get; set; }
|
||||||
|
public string? ControlText { get; set; }
|
||||||
|
public LinkedList<IWasdMenuOption>? Options { get; set; }
|
||||||
|
// previous option node
|
||||||
|
public LinkedListNode<IWasdMenuOption>? Prev { get; set; }
|
||||||
|
public LinkedListNode<IWasdMenuOption> Add(string display, Action<CCSPlayerController, IWasdMenuOption> onChoice);
|
||||||
|
}
|
||||||
21
WASDMenuAPI - SRC Files/Interfaces/IWasdMenuManager.cs
Normal file
21
WASDMenuAPI - SRC Files/Interfaces/IWasdMenuManager.cs
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
using CounterStrikeSharp.API.Core;
|
||||||
|
|
||||||
|
namespace WASDSharedAPI;
|
||||||
|
|
||||||
|
public interface IWasdMenuManager
|
||||||
|
{
|
||||||
|
//open the menu as main menu
|
||||||
|
public void OpenMainMenu(CCSPlayerController? player, IWasdMenu? menu);
|
||||||
|
//close all menus
|
||||||
|
public void CloseMenu(CCSPlayerController? player);
|
||||||
|
//close current submenu and go to previous menu/submenu
|
||||||
|
public void CloseSubMenu(CCSPlayerController? player);
|
||||||
|
//close all submenus and go to main menu
|
||||||
|
public void CloseAllSubMenus(CCSPlayerController? player);
|
||||||
|
//open menu as submenu
|
||||||
|
public void OpenSubMenu(CCSPlayerController? player, IWasdMenu? menu);
|
||||||
|
//create new menu object
|
||||||
|
public IWasdMenu CreateMenu(string title = "", string ControlText = "");
|
||||||
|
public bool HasMenu(CCSPlayerController? player);
|
||||||
|
public void UpdateActiveMenu(CCSPlayerController? player, Dictionary<string, Action<CCSPlayerController, IWasdMenuOption>> list);
|
||||||
|
}
|
||||||
11
WASDMenuAPI - SRC Files/Interfaces/IWasdMenuOption.cs
Normal file
11
WASDMenuAPI - SRC Files/Interfaces/IWasdMenuOption.cs
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
using CounterStrikeSharp.API.Core;
|
||||||
|
|
||||||
|
namespace WASDSharedAPI;
|
||||||
|
|
||||||
|
public interface IWasdMenuOption
|
||||||
|
{
|
||||||
|
public IWasdMenu? Parent { get; set; }
|
||||||
|
public string? OptionDisplay { get; set; }
|
||||||
|
public Action<CCSPlayerController, IWasdMenuOption>? OnChoose { get; set; }
|
||||||
|
public int Index { get; set; }
|
||||||
|
}
|
||||||
73
WASDMenuAPI - SRC Files/WASDMenuAPI.cs
Normal file
73
WASDMenuAPI - SRC Files/WASDMenuAPI.cs
Normal file
|
|
@ -0,0 +1,73 @@
|
||||||
|
using CounterStrikeSharp.API;
|
||||||
|
using CounterStrikeSharp.API.Core;
|
||||||
|
using WASDMenuAPI.Classes;
|
||||||
|
|
||||||
|
namespace WASDMenuAPI;
|
||||||
|
|
||||||
|
public class WASDMenuAPI
|
||||||
|
{
|
||||||
|
public string ModuleName => "WASDMenuAPI";
|
||||||
|
public string ModuleVersion => "1.0.2";
|
||||||
|
public string ModuleAuthor => "Interesting";
|
||||||
|
|
||||||
|
public static readonly Dictionary<ulong, WasdMenuPlayer> Players = [];
|
||||||
|
|
||||||
|
public static void LoadPlugin(BasePlugin basePlugin, bool hotReload)
|
||||||
|
{
|
||||||
|
var wasdMenuManager = new WasdManager();
|
||||||
|
basePlugin.RegisterEventHandler<EventPlayerActivate>((@event, info) =>
|
||||||
|
{
|
||||||
|
if (@event.Userid != null)
|
||||||
|
Players[@event.Userid.SteamID] = new WasdMenuPlayer
|
||||||
|
{
|
||||||
|
player = @event.Userid,
|
||||||
|
Buttons = 0
|
||||||
|
};
|
||||||
|
return HookResult.Continue;
|
||||||
|
});
|
||||||
|
basePlugin.RegisterEventHandler<EventPlayerDisconnect>((@event, info) =>
|
||||||
|
{
|
||||||
|
if (@event.Userid != null) Players.Remove(@event.Userid.SteamID);
|
||||||
|
return HookResult.Continue;
|
||||||
|
});
|
||||||
|
|
||||||
|
basePlugin.RegisterListener<Listeners.OnTick>(OnTick);
|
||||||
|
|
||||||
|
if(hotReload)
|
||||||
|
foreach (var pl in Utilities.GetPlayers())
|
||||||
|
{
|
||||||
|
Players[pl.SteamID] = new WasdMenuPlayer
|
||||||
|
{
|
||||||
|
player = pl,
|
||||||
|
Buttons = pl.Buttons
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OnTick()
|
||||||
|
{
|
||||||
|
foreach (var player in Players.Values.Where(p => p.MainMenu != null))
|
||||||
|
{
|
||||||
|
if ((player.Buttons & PlayerButtons.Forward) == 0 && (player.player.Buttons & PlayerButtons.Forward) != 0)
|
||||||
|
{
|
||||||
|
player.ScrollUp();
|
||||||
|
}
|
||||||
|
else if((player.Buttons & PlayerButtons.Back) == 0 && (player.player.Buttons & PlayerButtons.Back) != 0)
|
||||||
|
{
|
||||||
|
player.ScrollDown();
|
||||||
|
}
|
||||||
|
else if((player.Buttons & PlayerButtons.Use) == 0 && (player.player.Buttons & PlayerButtons.Use) != 0)
|
||||||
|
{
|
||||||
|
player.Choose();
|
||||||
|
}
|
||||||
|
|
||||||
|
player.Buttons = player.player.Buttons;
|
||||||
|
if(player.CenterHtml != "")
|
||||||
|
Server.NextFrame(() =>
|
||||||
|
player.player.PrintToCenterHtml(player.CenterHtml)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
13
WASDMenuAPI - SRC Files/WASDMenuAPI.csproj
Normal file
13
WASDMenuAPI - SRC Files/WASDMenuAPI.csproj
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.246" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
25
WASDMenuAPI - SRC Files/WASDMenuAPI.sln
Normal file
25
WASDMenuAPI - SRC Files/WASDMenuAPI.sln
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.9.34728.123
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WASDMenuAPI", "WASDMenuAPI.csproj", "{0119D01B-2F71-4918-B638-795C423E143F}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{0119D01B-2F71-4918-B638-795C423E143F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{0119D01B-2F71-4918-B638-795C423E143F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{0119D01B-2F71-4918-B638-795C423E143F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{0119D01B-2F71-4918-B638-795C423E143F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {33517EB0-9056-4518-864C-37D0AFF4124B}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<None Remove="src\command\Command.cs~RF4f34d1e7.TMP" />
|
||||||
<None Remove="src\player\skills\RespWroga.cs~RF528d210.TMP" />
|
<None Remove="src\player\skills\RespWroga.cs~RF528d210.TMP" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
@ -17,6 +18,12 @@
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="WASDMenuAPI">
|
||||||
|
<HintPath>F:\CS2 Server\server\game\csgo\addons\counterstrikesharp\plugins\jRandomSkills\WASDMenuAPI.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Update="Properties\Resources.Designer.cs">
|
<Compile Update="Properties\Resources.Designer.cs">
|
||||||
<DesignTime>True</DesignTime>
|
<DesignTime>True</DesignTime>
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ namespace jRandomSkills
|
||||||
{
|
{
|
||||||
if (player == null) return;
|
if (player == null) return;
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (playerInfo == null) return;
|
if (playerInfo == null || playerInfo.IsDrawing) return;
|
||||||
|
|
||||||
var playerPawn = player.PlayerPawn.Value;
|
var playerPawn = player.PlayerPawn.Value;
|
||||||
if (playerPawn?.CBodyComponent == null) return;
|
if (playerPawn?.CBodyComponent == null) return;
|
||||||
|
|
@ -106,6 +106,9 @@ namespace jRandomSkills
|
||||||
skillPlayer.SpecialSkill = src.player.Skills.None;
|
skillPlayer.SpecialSkill = src.player.Skills.None;
|
||||||
Instance.SkillAction(skill.Skill.ToString(), "EnableSkill", [targetPlayer]);
|
Instance.SkillAction(skill.Skill.ToString(), "EnableSkill", [targetPlayer]);
|
||||||
|
|
||||||
|
if (skill.Display)
|
||||||
|
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{skill.Name}{ChatColors.Lime}: {skill.Description}", false);
|
||||||
|
|
||||||
player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――");
|
player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――");
|
||||||
SkillUtils.PrintToChat(player, $"{Localization.GetTranslation("done_setskill")}: {ChatColors.LightRed}{skill.Name} {ChatColors.Lime}{Localization.GetTranslation("for_setskill")} {ChatColors.LightRed}{targetPlayer.PlayerName}", false);
|
SkillUtils.PrintToChat(player, $"{Localization.GetTranslation("done_setskill")}: {ChatColors.LightRed}{skill.Name} {ChatColors.Lime}{Localization.GetTranslation("for_setskill")} {ChatColors.LightRed}{targetPlayer.PlayerName}", false);
|
||||||
player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――");
|
player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――");
|
||||||
|
|
@ -175,17 +178,21 @@ namespace jRandomSkills
|
||||||
private static void StartGame(CommandInfo command)
|
private static void StartGame(CommandInfo command)
|
||||||
{
|
{
|
||||||
int cheats = command.GetArg(1) == "sv" ? 1 : 0;
|
int cheats = command.GetArg(1) == "sv" ? 1 : 0;
|
||||||
Server.ExecuteCommand($"mp_freezetime {(cheats == 1 ? 0 : 5)}");
|
Server.ExecuteCommand($"mp_freezetime {(cheats == 1 ? 0 : 15)}");
|
||||||
Server.ExecuteCommand("mp_warmup_end");
|
|
||||||
Server.ExecuteCommand("mp_restartgame 1");
|
|
||||||
|
|
||||||
Instance.AddTimer(2.0f, () => {
|
|
||||||
Server.PrintToChatAll($" {ChatColors.Green}{Localization.GetTranslation("game_start")}");
|
|
||||||
Server.ExecuteCommand("mp_forcecamera 0");
|
|
||||||
Server.ExecuteCommand($"mp_freezetime {(cheats == 1 ? 0 : 5)}");
|
|
||||||
Server.ExecuteCommand("mp_overtime_enable 1");
|
Server.ExecuteCommand("mp_overtime_enable 1");
|
||||||
Server.ExecuteCommand($"sv_cheats {cheats}");
|
Server.ExecuteCommand($"sv_cheats {cheats}");
|
||||||
});
|
Server.ExecuteCommand("mp_forcecamera 0");
|
||||||
|
|
||||||
|
if (Instance?.GameRules?.WarmupPeriod == true)
|
||||||
|
{
|
||||||
|
Server.ExecuteCommand("mp_warmup_end");
|
||||||
|
Server.PrintToChatAll($" {ChatColors.Green}{Localization.GetTranslation("game_start")}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Server.ExecuteCommand("mp_restartgame 2");
|
||||||
|
Instance?.AddTimer(2.0f, () => Server.PrintToChatAll($" {ChatColors.Green}{Localization.GetTranslation("game_start")}"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
|
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
|
||||||
|
|
@ -299,7 +306,7 @@ namespace jRandomSkills
|
||||||
Server.ExecuteCommand(param);
|
Server.ExecuteCommand(param);
|
||||||
}
|
}
|
||||||
|
|
||||||
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_ONLY)]
|
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
|
||||||
private static void Command_SetStaticSkill(CCSPlayerController? player, CommandInfo command)
|
private static void Command_SetStaticSkill(CCSPlayerController? player, CommandInfo command)
|
||||||
{
|
{
|
||||||
Debug.WriteToDebug($"Player {player?.PlayerPawn} used the css_setstaticskill {command.ArgString} command.");
|
Debug.WriteToDebug($"Player {player?.PlayerPawn} used the css_setstaticskill {command.ArgString} command.");
|
||||||
|
|
@ -348,6 +355,9 @@ namespace jRandomSkills
|
||||||
Event.staticSkills.Add(targetPlayer.SteamID, skill);
|
Event.staticSkills.Add(targetPlayer.SteamID, skill);
|
||||||
Instance.SkillAction(skill.Skill.ToString(), "EnableSkill", [targetPlayer]);
|
Instance.SkillAction(skill.Skill.ToString(), "EnableSkill", [targetPlayer]);
|
||||||
|
|
||||||
|
if (skill.Display)
|
||||||
|
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{skill.Name}{ChatColors.Lime}: {skill.Description}", false);
|
||||||
|
|
||||||
player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――");
|
player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――");
|
||||||
SkillUtils.PrintToChat(player, $"{Localization.GetTranslation("done_setskill")}: {ChatColors.LightRed}{skill.Name} {ChatColors.Lime}{Localization.GetTranslation("for_setskill")} {ChatColors.LightRed}{targetPlayer.PlayerName}", false);
|
SkillUtils.PrintToChat(player, $"{Localization.GetTranslation("done_setskill")}: {ChatColors.LightRed}{skill.Name} {ChatColors.Lime}{Localization.GetTranslation("for_setskill")} {ChatColors.LightRed}{targetPlayer.PlayerName}", false);
|
||||||
player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――");
|
player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――");
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ using CounterStrikeSharp.API.Modules.Commands;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using jRandomSkills.src.utils;
|
using jRandomSkills.src.utils;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using WASDSharedAPI;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
{
|
{
|
||||||
|
|
@ -19,6 +20,7 @@ namespace jRandomSkills
|
||||||
public List<jSkill_PlayerInfo> SkillPlayer { get; } = [];
|
public List<jSkill_PlayerInfo> SkillPlayer { get; } = [];
|
||||||
public Random Random { get; } = new Random();
|
public Random Random { get; } = new Random();
|
||||||
public CCSGameRules? GameRules { get; set; }
|
public CCSGameRules? GameRules { get; set; }
|
||||||
|
public IWasdMenuManager? MenuManager;
|
||||||
|
|
||||||
public override string ModuleName => "[CS2] [ jRandomSkills ]";
|
public override string ModuleName => "[CS2] [ jRandomSkills ]";
|
||||||
public override string ModuleAuthor => "D3X, Juzlus";
|
public override string ModuleAuthor => "D3X, Juzlus";
|
||||||
|
|
@ -32,9 +34,10 @@ namespace jRandomSkills
|
||||||
Config.Initialize();
|
Config.Initialize();
|
||||||
Localization.Load();
|
Localization.Load();
|
||||||
Debug.Load();
|
Debug.Load();
|
||||||
Event.Load();
|
|
||||||
PlayerOnTick.Load();
|
PlayerOnTick.Load();
|
||||||
|
Event.Load();
|
||||||
Command.Load();
|
Command.Load();
|
||||||
|
WASDMenuAPI.WASDMenuAPI.LoadPlugin(Instance, hotReload);
|
||||||
LoadAllSkills();
|
LoadAllSkills();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
"areareaper_desc": "You can choose a bomb site to deactivate",
|
"areareaper_desc": "You can choose a bomb site to deactivate",
|
||||||
"areareaper_incorrect_site": "No such bomb site found.",
|
"areareaper_incorrect_site": "No such bomb site found.",
|
||||||
"areareaper_no_site": "No bomb sites found.",
|
"areareaper_no_site": "No bomb sites found.",
|
||||||
"areareaper_select_info": "Choose the bomb site you want to deactivate:",
|
"areareaper_select_info": "Select site to deactivate:",
|
||||||
"areareaper_site_disabled": "Bomb site {0} has been deactivated - no bombs can be planted there!",
|
"areareaper_site_disabled": "Bomb site {0} has been deactivated - no bombs can be planted there!",
|
||||||
"areareaper_used_info": "Your skill has already been used.",
|
"areareaper_used_info": "Your skill has already been used.",
|
||||||
|
|
||||||
|
|
@ -66,19 +66,19 @@
|
||||||
"darkness_desc": "Applies a darkness effect to a chosen enemy",
|
"darkness_desc": "Applies a darkness effect to a chosen enemy",
|
||||||
"darkness_enemy_info": "Let the lights go out.",
|
"darkness_enemy_info": "Let the lights go out.",
|
||||||
"darkness_player_info": "Darkness has overtaken player '{0}'.",
|
"darkness_player_info": "Darkness has overtaken player '{0}'.",
|
||||||
"darkness_select_info": "Choose the player you want to apply the darkness effect to:",
|
"darkness_select_info": "Select player for darkness:",
|
||||||
|
|
||||||
"deactivator": "Deactivator",
|
"deactivator": "Deactivator",
|
||||||
"deactivator_desc": "Choose a player whose skill you want to disable",
|
"deactivator_desc": "Choose a player whose skill you want to disable",
|
||||||
"deactivator_enemy_info": "Your skill has been disabled.",
|
"deactivator_enemy_info": "Your skill has been disabled.",
|
||||||
"deactivator_player_info": "Player '{0}'s skill has been disabled.",
|
"deactivator_player_info": "Player '{0}'s skill has been disabled.",
|
||||||
"deactivator_select_info": "Choose the player whose skill you want to disable:",
|
"deactivator_select_info": "Disable a player's skill:",
|
||||||
|
|
||||||
"deaf": "Deaf",
|
"deaf": "Deaf",
|
||||||
"deaf_desc": "Choose a player to mute all sounds for",
|
"deaf_desc": "Choose a player to mute all sounds for",
|
||||||
"deaf_enemy_info": "Your headphones have left the game.",
|
"deaf_enemy_info": "Your headphones have left the game.",
|
||||||
"deaf_player_info": "Sound has been disabled for player '{0}'.",
|
"deaf_player_info": "Sound has been disabled for player '{0}'.",
|
||||||
"deaf_select_info": "Choose the player for whom you want to mute all sounds:",
|
"deaf_select_info": "Mute all sounds for player:",
|
||||||
|
|
||||||
"disarmament": "Disarmament",
|
"disarmament": "Disarmament",
|
||||||
"disarmament_desc": "You have a random chance to make an enemy drop their weapon on hit",
|
"disarmament_desc": "You have a random chance to make an enemy drop their weapon on hit",
|
||||||
|
|
@ -93,7 +93,7 @@
|
||||||
"duplicator": "Duplicator",
|
"duplicator": "Duplicator",
|
||||||
"duplicator_desc": "Choose a player to copy their skill",
|
"duplicator_desc": "Choose a player to copy their skill",
|
||||||
"duplicator_player_info": "Player '{0}'s skill has been copied.",
|
"duplicator_player_info": "Player '{0}'s skill has been copied.",
|
||||||
"duplicator_select_info": "Choose the player whose skill you want to copy:",
|
"duplicator_select_info": "Copy a player's skill:",
|
||||||
|
|
||||||
"dwarf": "Dwarf",
|
"dwarf": "Dwarf",
|
||||||
"dwarf_desc": "Random character size at the start of the round",
|
"dwarf_desc": "Random character size at the start of the round",
|
||||||
|
|
@ -129,6 +129,11 @@
|
||||||
"frozendecoy": "Freezing Decoy",
|
"frozendecoy": "Freezing Decoy",
|
||||||
"frozendecoy_desc": "Your decoy freezes all nearby players",
|
"frozendecoy_desc": "Your decoy freezes all nearby players",
|
||||||
|
|
||||||
|
"gambler": "Gambler",
|
||||||
|
"gambler_desc": "Select a skill from the list provided.",
|
||||||
|
"gambler_select_info": "Select your skill:",
|
||||||
|
"gambler_more": "<font class='fontSize-m' color='#00FF00'>Refresh for $100</font>",
|
||||||
|
|
||||||
"ghost": "Ghost",
|
"ghost": "Ghost",
|
||||||
"ghost_desc": "You are completely invisible",
|
"ghost_desc": "You are completely invisible",
|
||||||
|
|
||||||
|
|
@ -139,7 +144,7 @@
|
||||||
"glitch_desc": "Disables the radar for a chosen enemy",
|
"glitch_desc": "Disables the radar for a chosen enemy",
|
||||||
"glitch_enemy_info": "Your radar has been disabled.",
|
"glitch_enemy_info": "Your radar has been disabled.",
|
||||||
"glitch_player_info": "Player '{0}'s radar has been disabled.",
|
"glitch_player_info": "Player '{0}'s radar has been disabled.",
|
||||||
"glitch_select_info": "Choose the player whose radar you want to disable:",
|
"glitch_select_info": "Turn off player's radar:",
|
||||||
|
|
||||||
"glue": "Glue",
|
"glue": "Glue",
|
||||||
"glue_desc": "Your grenades stick to walls",
|
"glue_desc": "Your grenades stick to walls",
|
||||||
|
|
@ -171,13 +176,19 @@
|
||||||
"jammer_desc": "Choose a player to disable their crosshair",
|
"jammer_desc": "Choose a player to disable their crosshair",
|
||||||
"jammer_enemy_info": "Your crosshair has been disabled.",
|
"jammer_enemy_info": "Your crosshair has been disabled.",
|
||||||
"jammer_player_info": "Player '{0}'s crosshair has been disabled.",
|
"jammer_player_info": "Player '{0}'s crosshair has been disabled.",
|
||||||
"jammer_select_info": "Choose the player whose crosshair you want to disable:",
|
"jammer_select_info": "Disable player's crosshair:",
|
||||||
|
|
||||||
|
"jester": "Jester",
|
||||||
|
"jester_desc": "In jester mode, you cannot get or take any damage. This mode changes every few seconds.",
|
||||||
|
"jester_mode": "Jester Mode",
|
||||||
|
"jester_on": "ON",
|
||||||
|
"jester_off": "OFF",
|
||||||
|
|
||||||
"jumpban": "Legless",
|
"jumpban": "Legless",
|
||||||
"jumpban_desc": "Choose a player who cannot jump",
|
"jumpban_desc": "Choose a player who cannot jump",
|
||||||
"jumpban_enemy_info": "Someone cut off your legs.",
|
"jumpban_enemy_info": "Someone cut off your legs.",
|
||||||
"jumpban_player_info": "Player '{0}' can no longer jump.",
|
"jumpban_player_info": "Player '{0}' can no longer jump.",
|
||||||
"jumpban_select_info": "Choose the player who cannot jump:",
|
"jumpban_select_info": "Ban player from jumping:",
|
||||||
|
|
||||||
"jumpingjack": "Jumping Jack",
|
"jumpingjack": "Jumping Jack",
|
||||||
"jumpingjack_desc": "Jumping restores health",
|
"jumpingjack_desc": "Jumping restores health",
|
||||||
|
|
@ -189,7 +200,7 @@
|
||||||
"lifeswap_desc": "Choose a player to swap health with",
|
"lifeswap_desc": "Choose a player to swap health with",
|
||||||
"lifeswap_enemy_info": "Someone borrowed your health.",
|
"lifeswap_enemy_info": "Someone borrowed your health.",
|
||||||
"lifeswap_player_info": "You swapped health with player '{0}'.",
|
"lifeswap_player_info": "You swapped health with player '{0}'.",
|
||||||
"lifeswap_select_info": "Choose the player to swap health with:",
|
"lifeswap_select_info": "Swap health with player:",
|
||||||
|
|
||||||
"longknife": "Long Knife",
|
"longknife": "Long Knife",
|
||||||
"longknife_desc": "A primary knife attack deals damage regardless of distance",
|
"longknife_desc": "A primary knife attack deals damage regardless of distance",
|
||||||
|
|
@ -201,7 +212,7 @@
|
||||||
"magnifier_desc": "Forces the enemy's screen to zoom in, reducing their field of view",
|
"magnifier_desc": "Forces the enemy's screen to zoom in, reducing their field of view",
|
||||||
"magnifier_enemy_info": "Your field of view has been distorted!",
|
"magnifier_enemy_info": "Your field of view has been distorted!",
|
||||||
"magnifier_player_info": "Player '{0}' has been forced into zoom mode.",
|
"magnifier_player_info": "Player '{0}' has been forced into zoom mode.",
|
||||||
"magnifier_select_info": "Select the player whose screen you want to magnify:",
|
"magnifier_select_info": "Magnify player's screen:",
|
||||||
|
|
||||||
"medic": "Medic",
|
"medic": "Medic",
|
||||||
"medic_desc": "Click [css_useSkill] to use a healing charge that restores 50 health",
|
"medic_desc": "Click [css_useSkill] to use a healing charge that restores 50 health",
|
||||||
|
|
@ -210,7 +221,7 @@
|
||||||
"moneyswap_desc": "Choose a player to swap money with",
|
"moneyswap_desc": "Choose a player to swap money with",
|
||||||
"moneyswap_enemy_info": "The tax office got you.",
|
"moneyswap_enemy_info": "The tax office got you.",
|
||||||
"moneyswap_player_info": "You swapped money with player '{0}'.",
|
"moneyswap_player_info": "You swapped money with player '{0}'.",
|
||||||
"moneyswap_select_info": "Choose the player to swap money with:",
|
"moneyswap_select_info": "Swap money with player:",
|
||||||
|
|
||||||
"muhammed": "Muhammed",
|
"muhammed": "Muhammed",
|
||||||
"muhammed_desc": "You explode upon death, killing nearby players",
|
"muhammed_desc": "You explode upon death, killing nearby players",
|
||||||
|
|
@ -257,13 +268,13 @@
|
||||||
"poison_desc": "Choose a player who will take damage every few seconds",
|
"poison_desc": "Choose a player who will take damage every few seconds",
|
||||||
"poison_enemy_info": "You have been poisoned.",
|
"poison_enemy_info": "You have been poisoned.",
|
||||||
"poison_player_info": "Player '{0}' has been poisoned.",
|
"poison_player_info": "Player '{0}' has been poisoned.",
|
||||||
"poison_select_info": "Choose the player who will take damage every few seconds:",
|
"poison_select_info": "Poison a player:",
|
||||||
|
|
||||||
"primaryban": "No Rifles",
|
"primaryban": "No Rifles",
|
||||||
"primaryban_desc": "Choose a player who cannot use rifles",
|
"primaryban_desc": "Choose a player who cannot use rifles",
|
||||||
"primaryban_enemy_info": "You can no longer use rifles.",
|
"primaryban_enemy_info": "You can no longer use rifles.",
|
||||||
"primaryban_player_info": "Player '{0}' can no longer use rifles.",
|
"primaryban_player_info": "Player '{0}' can no longer use rifles.",
|
||||||
"primaryban_select_info": "Choose the player to ban from using rifles:",
|
"primaryban_select_info": "Ban rifles for player:",
|
||||||
|
|
||||||
"prosthesis": "Prosthesis",
|
"prosthesis": "Prosthesis",
|
||||||
"prosthesis_desc": "Arms and legs are bulletproof",
|
"prosthesis_desc": "Arms and legs are bulletproof",
|
||||||
|
|
@ -353,7 +364,7 @@
|
||||||
"thief_desc": "You can steal a skill from a chosen player",
|
"thief_desc": "You can steal a skill from a chosen player",
|
||||||
"thief_enemy_info": "Your skill has been stolen.",
|
"thief_enemy_info": "Your skill has been stolen.",
|
||||||
"thief_player_info": "Player '{0}'s skill has been stolen.",
|
"thief_player_info": "Player '{0}'s skill has been stolen.",
|
||||||
"thief_select_info": "Choose the player whose skill you want to steal:",
|
"thief_select_info": "Steal a player's skill:",
|
||||||
|
|
||||||
"thirdeye": "Third Eye",
|
"thirdeye": "Third Eye",
|
||||||
"thirdeye_desc": "Click [css_useSkill] to activate third-person view",
|
"thirdeye_desc": "Click [css_useSkill] to activate third-person view",
|
||||||
|
|
@ -394,7 +405,7 @@
|
||||||
"no_player": "No matching player found.",
|
"no_player": "No matching player found.",
|
||||||
"duplicate_player": "More than one player found with the same name.",
|
"duplicate_player": "More than one player found with the same name.",
|
||||||
"selectplayerskill_command": "Type /t",
|
"selectplayerskill_command": "Type /t",
|
||||||
"selectplayerskill_incorrect_enemy_index": "No player found with that index.",
|
"selectplayerskill_incorrect_enemy_index": "No players were found to select.",
|
||||||
|
|
||||||
"skill_not_found_setskill": "No such CHATCOLORS.REDskill found",
|
"skill_not_found_setskill": "No such CHATCOLORS.REDskill found",
|
||||||
"player_not_found_setskill": "No such CHATCOLORS.REDplayer found",
|
"player_not_found_setskill": "No such CHATCOLORS.REDplayer found",
|
||||||
|
|
@ -420,7 +431,12 @@
|
||||||
"vote_alredy_voted": "You have already voted!",
|
"vote_alredy_voted": "You have already voted!",
|
||||||
"vote_vote": "Vote",
|
"vote_vote": "Vote",
|
||||||
|
|
||||||
|
"bombsite_a": "Bombsite A",
|
||||||
|
"bombsite_b": "Bombsite B",
|
||||||
|
|
||||||
"teammate_skills": "Your teammates' skills",
|
"teammate_skills": "Your teammates' skills",
|
||||||
"summary_start": "======SUMMARY=OF=THE=LAST=ROUND======",
|
"summary_start": "======SUMMARY=OF=THE=LAST=ROUND======",
|
||||||
"summary_end": "======================================="
|
"summary_end": "=======================================",
|
||||||
|
|
||||||
|
"menu_controlls": "<font class='fontSize-m' color='cyan'>W/S - Scroll</font> <font class='fontSize-m' color='white'> | </font> <font class='fontSize-m' color='green'>E - Select</font> <br>"
|
||||||
}
|
}
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
"areareaper_desc": "Możesz wybrać strefę detonacji, którą chcesz dezaktywować",
|
"areareaper_desc": "Możesz wybrać strefę detonacji, którą chcesz dezaktywować",
|
||||||
"areareaper_incorrect_site": "Nie znaleziono takiej strefy detonacji.",
|
"areareaper_incorrect_site": "Nie znaleziono takiej strefy detonacji.",
|
||||||
"areareaper_no_site": "Nie znaleziono żadnej strefy detonacji.",
|
"areareaper_no_site": "Nie znaleziono żadnej strefy detonacji.",
|
||||||
"areareaper_select_info": "Wybierz strefę detonacji, którą chcesz dezaktywować:",
|
"areareaper_select_info": "Wybierz strefę do dezaktyw.:",
|
||||||
"areareaper_site_disabled": "Strefa detonacji {0} została dezaktywowana - nie można na niej podłożyć bomby!",
|
"areareaper_site_disabled": "Strefa detonacji {0} została dezaktywowana - nie można na niej podłożyć bomby!",
|
||||||
"areareaper_used_info": "Twoja moc została już wykorzystana.",
|
"areareaper_used_info": "Twoja moc została już wykorzystana.",
|
||||||
|
|
||||||
|
|
@ -66,19 +66,19 @@
|
||||||
"darkness_desc": "Nadaje efekt ciemności wybranemu przeciwnikowi",
|
"darkness_desc": "Nadaje efekt ciemności wybranemu przeciwnikowi",
|
||||||
"darkness_enemy_info": "Niech zgasną światła.",
|
"darkness_enemy_info": "Niech zgasną światła.",
|
||||||
"darkness_player_info": "Ciemność opanowała gracza '{0}'.",
|
"darkness_player_info": "Ciemność opanowała gracza '{0}'.",
|
||||||
"darkness_select_info": "Wybierz gracza, któremu chcesz nadać efekt ciemności:",
|
"darkness_select_info": "Nałóż efekt ciemności:",
|
||||||
|
|
||||||
"deactivator": "Deaktywator",
|
"deactivator": "Deaktywator",
|
||||||
"deactivator_desc": "Wybierasz gracza, którego supermoc chcesz wyłączyć",
|
"deactivator_desc": "Wybierasz gracza, którego supermoc chcesz wyłączyć",
|
||||||
"deactivator_enemy_info": "Twoja supermoc została wyłączona.",
|
"deactivator_enemy_info": "Twoja supermoc została wyłączona.",
|
||||||
"deactivator_player_info": "Moc gracza '{0}' została wyłączona.",
|
"deactivator_player_info": "Moc gracza '{0}' została wyłączona.",
|
||||||
"deactivator_select_info": "Wybierz gracza, którego supermoc chcesz wyłączyć:",
|
"deactivator_select_info": "Wyłącz moc gracza:",
|
||||||
|
|
||||||
"deaf": "Głuchy",
|
"deaf": "Głuchy",
|
||||||
"deaf_desc": "Wybierasz gracza, dla którego chcesz wyłączyć wszystkie dźwięki",
|
"deaf_desc": "Wybierasz gracza, dla którego chcesz wyłączyć wszystkie dźwięki",
|
||||||
"deaf_enemy_info": "Słuchawki opuściły grę.",
|
"deaf_enemy_info": "Słuchawki opuściły grę.",
|
||||||
"deaf_player_info": "Dźwięk został wyłączony dla gracza '{0}'.",
|
"deaf_player_info": "Dźwięk został wyłączony dla gracza '{0}'.",
|
||||||
"deaf_select_info": "Wybierz gracza, dla którego chcesz wyłączyć wszystkie dźwięki:",
|
"deaf_select_info": "Wycisz dźwięki gracza:",
|
||||||
|
|
||||||
"disarmament": "Rozbrojenie",
|
"disarmament": "Rozbrojenie",
|
||||||
"disarmament_desc": "Masz losową szanse na wyrzucenie broni wroga po trafieniu",
|
"disarmament_desc": "Masz losową szanse na wyrzucenie broni wroga po trafieniu",
|
||||||
|
|
@ -93,7 +93,7 @@
|
||||||
"duplicator": "Duplikator",
|
"duplicator": "Duplikator",
|
||||||
"duplicator_desc": "Wybierasz gracza, od którego chcesz skopiować supermoc",
|
"duplicator_desc": "Wybierasz gracza, od którego chcesz skopiować supermoc",
|
||||||
"duplicator_player_info": "Moc gracza '{0}' została skopiowana.",
|
"duplicator_player_info": "Moc gracza '{0}' została skopiowana.",
|
||||||
"duplicator_select_info": "Wybierz gracza, od którego chcesz skopiować supermoc:",
|
"duplicator_select_info": "Skopiuj moc gracza:",
|
||||||
|
|
||||||
"dwarf": "Mini Majk",
|
"dwarf": "Mini Majk",
|
||||||
"dwarf_desc": "Losowa wielkość postaci na początku rundy",
|
"dwarf_desc": "Losowa wielkość postaci na początku rundy",
|
||||||
|
|
@ -129,6 +129,11 @@
|
||||||
"frozendecoy": "Zamrażający Wabik",
|
"frozendecoy": "Zamrażający Wabik",
|
||||||
"frozendecoy_desc": "Twój decoy zamraża wszystkich graczy w pobliżu",
|
"frozendecoy_desc": "Twój decoy zamraża wszystkich graczy w pobliżu",
|
||||||
|
|
||||||
|
"gambler": "Hazardzista",
|
||||||
|
"gambler_desc": "Wybierz umiejętność z podanej listy.",
|
||||||
|
"gambler_select_info": "Wybierz umiejętność:",
|
||||||
|
"gambler_more": "<font class='fontSize-m' color='#00FF00'>Odśwież za $100</font>",
|
||||||
|
|
||||||
"ghost": "Duszek",
|
"ghost": "Duszek",
|
||||||
"ghost_desc": "Jesteś całkowicie niewidzialny",
|
"ghost_desc": "Jesteś całkowicie niewidzialny",
|
||||||
|
|
||||||
|
|
@ -139,7 +144,7 @@
|
||||||
"glitch_desc": "Wyłączasz radar wybranemu przeciwnikowi",
|
"glitch_desc": "Wyłączasz radar wybranemu przeciwnikowi",
|
||||||
"glitch_enemy_info": "Twój radar został wyłączony.",
|
"glitch_enemy_info": "Twój radar został wyłączony.",
|
||||||
"glitch_player_info": "Radar gracza '{0}' został wyłączony.",
|
"glitch_player_info": "Radar gracza '{0}' został wyłączony.",
|
||||||
"glitch_select_info": "Wybierz gracza, dla którego chcesz wyłączyć radar:",
|
"glitch_select_info": "Wyłącz radar dla gracza:",
|
||||||
|
|
||||||
"glue": "Klej",
|
"glue": "Klej",
|
||||||
"glue_desc": "Twoje granaty przyklejają się do ścian",
|
"glue_desc": "Twoje granaty przyklejają się do ścian",
|
||||||
|
|
@ -171,13 +176,19 @@
|
||||||
"jammer_desc": "Wybierasz gracza, dla którego chcesz wyłączyć celownik",
|
"jammer_desc": "Wybierasz gracza, dla którego chcesz wyłączyć celownik",
|
||||||
"jammer_enemy_info": "Twój celownik został wyłączony.",
|
"jammer_enemy_info": "Twój celownik został wyłączony.",
|
||||||
"jammer_player_info": "Celownik gracza '{0}' została wyłączona.",
|
"jammer_player_info": "Celownik gracza '{0}' została wyłączona.",
|
||||||
"jammer_select_info": "Wybierz gracza, dla którego chcesz wyłączyć celownik:",
|
"jammer_select_info": "Wyłącz celownik dla gracza:",
|
||||||
|
|
||||||
|
"jester": "Błazen",
|
||||||
|
"jester_desc": "W trybie błazna nie możesz zadawać ani otrzymywać obrażeń. Tryb zmienia się co kilka sekund.",
|
||||||
|
"jester_mode": "Tryb Błazna",
|
||||||
|
"jester_on": "WŁ.",
|
||||||
|
"jester_off": "WYŁ.",
|
||||||
|
|
||||||
"jumpban": "Beznogi",
|
"jumpban": "Beznogi",
|
||||||
"jumpban_desc": "Wybierasz gracza, który nie będzie mógł skakać",
|
"jumpban_desc": "Wybierasz gracza, który nie będzie mógł skakać",
|
||||||
"jumpban_enemy_info": "Ktoś odciął ci nogi.",
|
"jumpban_enemy_info": "Ktoś odciął ci nogi.",
|
||||||
"jumpban_player_info": "Gracz '{0}' nie może teraz skakać.",
|
"jumpban_player_info": "Gracz '{0}' nie może teraz skakać.",
|
||||||
"jumpban_select_info": "Wybierz gracza, który nie będzie mógł skakać:",
|
"jumpban_select_info": "Zablokuj skok dla gracza:",
|
||||||
|
|
||||||
"jumpingjack": "Pajacyk",
|
"jumpingjack": "Pajacyk",
|
||||||
"jumpingjack_desc": "Skakanie przywraca zdrowie",
|
"jumpingjack_desc": "Skakanie przywraca zdrowie",
|
||||||
|
|
@ -189,7 +200,7 @@
|
||||||
"lifeswap_desc": "Wybierasz gracza, z którym chcesz wymienić się zdrowiem",
|
"lifeswap_desc": "Wybierasz gracza, z którym chcesz wymienić się zdrowiem",
|
||||||
"lifeswap_enemy_info": "Ktoś pożyczył sobie twoje zdrowie.",
|
"lifeswap_enemy_info": "Ktoś pożyczył sobie twoje zdrowie.",
|
||||||
"lifeswap_player_info": "Wymieniłeś się zdrowiem z graczem '{0}'.",
|
"lifeswap_player_info": "Wymieniłeś się zdrowiem z graczem '{0}'.",
|
||||||
"lifeswap_select_info": "Wybierz gracza, z którym chcesz wymienić się zdrowiem:",
|
"lifeswap_select_info": "Zamień się zdrowiem z graczem:",
|
||||||
|
|
||||||
"longknife": "Długi Nóż",
|
"longknife": "Długi Nóż",
|
||||||
"longknife_desc": "Podstawowy atak nożem zadaje obrażenia niezależnie od odległości",
|
"longknife_desc": "Podstawowy atak nożem zadaje obrażenia niezależnie od odległości",
|
||||||
|
|
@ -201,7 +212,7 @@
|
||||||
"magnifier_desc": "Przybiżasz ekran wybranemu przeciwnikowi",
|
"magnifier_desc": "Przybiżasz ekran wybranemu przeciwnikowi",
|
||||||
"magnifier_enemy_info": "Twoje pole widzenia zostało zniekształcone!",
|
"magnifier_enemy_info": "Twoje pole widzenia zostało zniekształcone!",
|
||||||
"magnifier_player_info": "Gracz '{0}' został zmuszony do przejścia w tryb powiększenia.",
|
"magnifier_player_info": "Gracz '{0}' został zmuszony do przejścia w tryb powiększenia.",
|
||||||
"magnifier_select_info": "Wybierz gracza, którego ekran chcesz powiększyć:",
|
"magnifier_select_info": "Powiększ ekran gracza:",
|
||||||
|
|
||||||
"medic": "Medyk",
|
"medic": "Medyk",
|
||||||
"medic_desc": "Kliknij [css_useSkill], aby użyć ładunku leczniczego, który przywraca 50 punktów zdrowia",
|
"medic_desc": "Kliknij [css_useSkill], aby użyć ładunku leczniczego, który przywraca 50 punktów zdrowia",
|
||||||
|
|
@ -210,7 +221,7 @@
|
||||||
"moneyswap_desc": "Wybierasz gracza, z którym chcesz zamienić się pieniędzmi",
|
"moneyswap_desc": "Wybierasz gracza, z którym chcesz zamienić się pieniędzmi",
|
||||||
"moneyswap_enemy_info": "Urząd skarbowy cię dopadł.",
|
"moneyswap_enemy_info": "Urząd skarbowy cię dopadł.",
|
||||||
"moneyswap_player_info": "Wymieniłeś swoje pieniądze z graczem '{0}'.",
|
"moneyswap_player_info": "Wymieniłeś swoje pieniądze z graczem '{0}'.",
|
||||||
"moneyswap_select_info": "Wybierz gracza, z którym chcesz zamienić się pieniędzmi:",
|
"moneyswap_select_info": "Zamień się kasą z graczem:",
|
||||||
|
|
||||||
"muhammed": "Muhammed",
|
"muhammed": "Muhammed",
|
||||||
"muhammed_desc": "Po śmierci eksplodujesz i zabijasz graczy znajdujących się w zasięgu",
|
"muhammed_desc": "Po śmierci eksplodujesz i zabijasz graczy znajdujących się w zasięgu",
|
||||||
|
|
@ -257,13 +268,13 @@
|
||||||
"poison_desc": "Wybierasz gracza, który co kilka sekund będzie otrzymywał obrażenia",
|
"poison_desc": "Wybierasz gracza, który co kilka sekund będzie otrzymywał obrażenia",
|
||||||
"poison_enemy_info": "Zostałeś otruty.",
|
"poison_enemy_info": "Zostałeś otruty.",
|
||||||
"poison_player_info": "Gracz '{0}' został otruty.",
|
"poison_player_info": "Gracz '{0}' został otruty.",
|
||||||
"poison_select_info": "Wybierz gracza, który co kilka sekund będzie otrzymywał obrażenia:",
|
"poison_select_info": "Zatruj gracza:",
|
||||||
|
|
||||||
"primaryban": "Brak Karabinów",
|
"primaryban": "Brak Karabinów",
|
||||||
"primaryban_desc": "Wybierasz gracza, który nie może używać karabinów",
|
"primaryban_desc": "Wybierasz gracza, który nie może używać karabinów",
|
||||||
"primaryban_enemy_info": "Nie możesz już używać karabinów.",
|
"primaryban_enemy_info": "Nie możesz już używać karabinów.",
|
||||||
"primaryban_player_info": "Gracz '{0}' nie może już używać karabinów.",
|
"primaryban_player_info": "Gracz '{0}' nie może już używać karabinów.",
|
||||||
"primaryban_select_info": "Wybierz gracza, któremu chcesz zabronić używania karabinów:",
|
"primaryban_select_info": "Zablokuj karabiny dla gracza:",
|
||||||
|
|
||||||
"prosthesis": "Proteza",
|
"prosthesis": "Proteza",
|
||||||
"prosthesis_desc": "Ramiona i nogi są kuloodporne",
|
"prosthesis_desc": "Ramiona i nogi są kuloodporne",
|
||||||
|
|
@ -353,7 +364,7 @@
|
||||||
"thief_desc": "Możesz ukraść supermoc wybranemu graczowi",
|
"thief_desc": "Możesz ukraść supermoc wybranemu graczowi",
|
||||||
"thief_enemy_info": "Twoja supermoc została skradziona.",
|
"thief_enemy_info": "Twoja supermoc została skradziona.",
|
||||||
"thief_player_info": "Moc gracza '{0}' została skradziona.",
|
"thief_player_info": "Moc gracza '{0}' została skradziona.",
|
||||||
"thief_select_info": "Wybierz gracza, którego supermoc chcesz ukraść:",
|
"thief_select_info": "Ukradnij moc gracza:",
|
||||||
|
|
||||||
"thirdeye": "Trzecie Oko",
|
"thirdeye": "Trzecie Oko",
|
||||||
"thirdeye_desc": "Kliknij [css_useSkill], aby aktywować trzecią osobę",
|
"thirdeye_desc": "Kliknij [css_useSkill], aby aktywować trzecią osobę",
|
||||||
|
|
@ -394,7 +405,7 @@
|
||||||
"no_player": "Nie znaleziono pasującego gracza.",
|
"no_player": "Nie znaleziono pasującego gracza.",
|
||||||
"duplicate_player": "Znaleziono więcej niż jednego gracza o tej samej nazwie.",
|
"duplicate_player": "Znaleziono więcej niż jednego gracza o tej samej nazwie.",
|
||||||
"selectplayerskill_command": "Wpisz /t",
|
"selectplayerskill_command": "Wpisz /t",
|
||||||
"selectplayerskill_incorrect_enemy_index": "Nie znaleziono gracza o takim index'ie.",
|
"selectplayerskill_incorrect_enemy_index": "Nie znaleziono graczy do wyboru.",
|
||||||
|
|
||||||
"skill_not_found_setskill": "Nie znaleziono takiej CHATCOLORS.REDsupermocy",
|
"skill_not_found_setskill": "Nie znaleziono takiej CHATCOLORS.REDsupermocy",
|
||||||
"player_not_found_setskill": "Nie znaleziono takiego CHATCOLORS.REDgracza",
|
"player_not_found_setskill": "Nie znaleziono takiego CHATCOLORS.REDgracza",
|
||||||
|
|
@ -420,7 +431,12 @@
|
||||||
"vote_alredy_voted": "Już zagłosowałeś!",
|
"vote_alredy_voted": "Już zagłosowałeś!",
|
||||||
"vote_vote": "Głosowanie",
|
"vote_vote": "Głosowanie",
|
||||||
|
|
||||||
|
"bombsite_a": "Strefa detonacji A",
|
||||||
|
"bombsite_b": "Strefa detonacji B",
|
||||||
|
|
||||||
"teammate_skills": "Supermoce twoich sojuszników",
|
"teammate_skills": "Supermoce twoich sojuszników",
|
||||||
"summary_start": "======PODSUMOWANIE=Z=OSTATNIEJ=RUNDY======",
|
"summary_start": "======PODSUMOWANIE=Z=OSTATNIEJ=RUNDY======",
|
||||||
"summary_end": "============================================"
|
"summary_end": "============================================",
|
||||||
|
|
||||||
|
"menu_controlls": "<font class='fontSize-m' color='cyan'>W/S – Przewijanie</font> <font class='fontSize-m' color='white'> | </font> <font class='fontSize-m' color='green'>E - Wybierz</font> <br>"
|
||||||
}
|
}
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
"areareaper_desc": "Você pode escolher um local de bomba para desativar",
|
"areareaper_desc": "Você pode escolher um local de bomba para desativar",
|
||||||
"areareaper_incorrect_site": "Nenhum local de bomba encontrado.",
|
"areareaper_incorrect_site": "Nenhum local de bomba encontrado.",
|
||||||
"areareaper_no_site": "Nenhum local de bomba encontrado.",
|
"areareaper_no_site": "Nenhum local de bomba encontrado.",
|
||||||
"areareaper_select_info": "Escolha o local de bomba que deseja desativar:",
|
"areareaper_select_info": "Escolha área p/ desativar:",
|
||||||
"areareaper_site_disabled": "Local de bomba {0} foi desativado - nenhuma bomba pode ser plantada lá!",
|
"areareaper_site_disabled": "Local de bomba {0} foi desativado - nenhuma bomba pode ser plantada lá!",
|
||||||
"areareaper_used_info": "Seu poder já foi usado.",
|
"areareaper_used_info": "Seu poder já foi usado.",
|
||||||
|
|
||||||
|
|
@ -66,19 +66,19 @@
|
||||||
"darkness_desc": "Aplica um efeito de escuridão a um inimigo escolhido",
|
"darkness_desc": "Aplica um efeito de escuridão a um inimigo escolhido",
|
||||||
"darkness_enemy_info": "Que as luzes se apaguem.",
|
"darkness_enemy_info": "Que as luzes se apaguem.",
|
||||||
"darkness_player_info": "A escuridão tomou conta do jogador '{0}'.",
|
"darkness_player_info": "A escuridão tomou conta do jogador '{0}'.",
|
||||||
"darkness_select_info": "Escolha o jogador ao qual deseja aplicar o efeito de escuridão:",
|
"darkness_select_info": "Escolha jogador: escuridão:",
|
||||||
|
|
||||||
"deactivator": "Desativador",
|
"deactivator": "Desativador",
|
||||||
"deactivator_desc": "Escolha um jogador cuja habilidade você deseja desativar",
|
"deactivator_desc": "Escolha um jogador cuja habilidade você deseja desativar",
|
||||||
"deactivator_enemy_info": "Sua habilidade foi desativada.",
|
"deactivator_enemy_info": "Sua habilidade foi desativada.",
|
||||||
"deactivator_player_info": "A habilidade do jogador '{0}' foi desativada.",
|
"deactivator_player_info": "A habilidade do jogador '{0}' foi desativada.",
|
||||||
"deactivator_select_info": "Escolha o jogador cuja habilidade você deseja desativar:",
|
"deactivator_select_info": "Desativar skill do jogador:",
|
||||||
|
|
||||||
"deaf": "Surdo",
|
"deaf": "Surdo",
|
||||||
"deaf_desc": "Escolha um jogador para silenciar todos os sons",
|
"deaf_desc": "Escolha um jogador para silenciar todos os sons",
|
||||||
"deaf_enemy_info": "Seus fones de ouvido saíram do jogo.",
|
"deaf_enemy_info": "Seus fones de ouvido saíram do jogo.",
|
||||||
"deaf_player_info": "O som foi desativado para o jogador '{0}'.",
|
"deaf_player_info": "O som foi desativado para o jogador '{0}'.",
|
||||||
"deaf_select_info": "Escolha o jogador para quem deseja silenciar todos os sons:",
|
"deaf_select_info": "Silenciar jogador:",
|
||||||
|
|
||||||
"disarmament": "Desarmamento",
|
"disarmament": "Desarmamento",
|
||||||
"disarmament_desc": "Você tem uma chance aleatória de fazer um inimigo largar sua arma ao acertá-lo",
|
"disarmament_desc": "Você tem uma chance aleatória de fazer um inimigo largar sua arma ao acertá-lo",
|
||||||
|
|
@ -93,7 +93,7 @@
|
||||||
"duplicator": "Duplicador",
|
"duplicator": "Duplicador",
|
||||||
"duplicator_desc": "Escolha um jogador para copiar sua habilidade",
|
"duplicator_desc": "Escolha um jogador para copiar sua habilidade",
|
||||||
"duplicator_player_info": "A habilidade do jogador '{0}' foi copiada.",
|
"duplicator_player_info": "A habilidade do jogador '{0}' foi copiada.",
|
||||||
"duplicator_select_info": "Escolha o jogador cuja habilidade você deseja copiar:",
|
"duplicator_select_info": "Copiar skill do jogador:",
|
||||||
|
|
||||||
"dwarf": "Anão",
|
"dwarf": "Anão",
|
||||||
"dwarf_desc": "Tamanho de personagem aleatório no início da rodada",
|
"dwarf_desc": "Tamanho de personagem aleatório no início da rodada",
|
||||||
|
|
@ -129,6 +129,11 @@
|
||||||
"frozendecoy": "Chamariz Congelante",
|
"frozendecoy": "Chamariz Congelante",
|
||||||
"frozendecoy_desc": "Seu chamariz congela todos os jogadores próximos",
|
"frozendecoy_desc": "Seu chamariz congela todos os jogadores próximos",
|
||||||
|
|
||||||
|
"gambler": "Apostador",
|
||||||
|
"gambler_desc": "Selecione uma habilidade da lista.",
|
||||||
|
"gambler_select_info": "Escolha sua habilidade:",
|
||||||
|
"gambler_more": "<font class='fontSize-m' color='#00FF00'>Atualizar por $100</font>",
|
||||||
|
|
||||||
"ghost": "Fantasma",
|
"ghost": "Fantasma",
|
||||||
"ghost_desc": "Você é completamente invisível",
|
"ghost_desc": "Você é completamente invisível",
|
||||||
|
|
||||||
|
|
@ -139,7 +144,7 @@
|
||||||
"glitch_desc": "Desativa o radar de um inimigo escolhido",
|
"glitch_desc": "Desativa o radar de um inimigo escolhido",
|
||||||
"glitch_enemy_info": "Seu radar foi desativado.",
|
"glitch_enemy_info": "Seu radar foi desativado.",
|
||||||
"glitch_player_info": "O radar do jogador '{0}' foi desativado.",
|
"glitch_player_info": "O radar do jogador '{0}' foi desativado.",
|
||||||
"glitch_select_info": "Escolha o jogador cujo radar você deseja desativar:",
|
"glitch_select_info": "Desativar radar do jogador:",
|
||||||
|
|
||||||
"glue": "Cola",
|
"glue": "Cola",
|
||||||
"glue_desc": "Suas granadas grudam nas paredes",
|
"glue_desc": "Suas granadas grudam nas paredes",
|
||||||
|
|
@ -171,13 +176,19 @@
|
||||||
"jammer_desc": "Escolha um jogador para desativar sua mira",
|
"jammer_desc": "Escolha um jogador para desativar sua mira",
|
||||||
"jammer_enemy_info": "Sua mira foi desativada.",
|
"jammer_enemy_info": "Sua mira foi desativada.",
|
||||||
"jammer_player_info": "A mira do jogador '{0}' foi desativada.",
|
"jammer_player_info": "A mira do jogador '{0}' foi desativada.",
|
||||||
"jammer_select_info": "Escolha o jogador cuja mira você deseja desativar:",
|
"jammer_select_info": "Desativar mira do jogador:",
|
||||||
|
|
||||||
|
"jester": "Bobo",
|
||||||
|
"jester_desc": "No modo bobo você não pode causar nem receber dano. Esse modo muda a cada poucos segundos.",
|
||||||
|
"jester_mode": "Modo Bobo",
|
||||||
|
"jester_on": "LIG.",
|
||||||
|
"jester_off": "DESL.",
|
||||||
|
|
||||||
"jumpban": "Sem Pernas",
|
"jumpban": "Sem Pernas",
|
||||||
"jumpban_desc": "Escolha um jogador que não poderá pular",
|
"jumpban_desc": "Escolha um jogador que não poderá pular",
|
||||||
"jumpban_enemy_info": "Alguém cortou suas pernas.",
|
"jumpban_enemy_info": "Alguém cortou suas pernas.",
|
||||||
"jumpban_player_info": "O jogador '{0}' não pode mais pular.",
|
"jumpban_player_info": "O jogador '{0}' não pode mais pular.",
|
||||||
"jumpban_select_info": "Escolha o jogador que não poderá pular:",
|
"jumpban_select_info": "Banir pulo do jogador:",
|
||||||
|
|
||||||
"jumpingjack": "Pula-Pula",
|
"jumpingjack": "Pula-Pula",
|
||||||
"jumpingjack_desc": "Pular restaura saúde",
|
"jumpingjack_desc": "Pular restaura saúde",
|
||||||
|
|
@ -189,7 +200,7 @@
|
||||||
"lifeswap_desc": "Escolha um jogador para trocar saúde com ele",
|
"lifeswap_desc": "Escolha um jogador para trocar saúde com ele",
|
||||||
"lifeswap_enemy_info": "Alguém pegou sua saúde emprestada.",
|
"lifeswap_enemy_info": "Alguém pegou sua saúde emprestada.",
|
||||||
"lifeswap_player_info": "Você trocou saúde com o jogador '{0}'.",
|
"lifeswap_player_info": "Você trocou saúde com o jogador '{0}'.",
|
||||||
"lifeswap_select_info": "Escolha o jogador com quem deseja trocar saúde:",
|
"lifeswap_select_info": "Trocar vida com jogador:",
|
||||||
|
|
||||||
"longknife": "Faca Longa",
|
"longknife": "Faca Longa",
|
||||||
"longknife_desc": "Um ataque com faca primária causa dano independentemente da distância",
|
"longknife_desc": "Um ataque com faca primária causa dano independentemente da distância",
|
||||||
|
|
@ -201,7 +212,7 @@
|
||||||
"magnifier_desc": "Força a tela do inimigo a ampliar, reduzindo seu campo de visão",
|
"magnifier_desc": "Força a tela do inimigo a ampliar, reduzindo seu campo de visão",
|
||||||
"magnifier_enemy_info": "Seu campo de visão foi distorcido!",
|
"magnifier_enemy_info": "Seu campo de visão foi distorcido!",
|
||||||
"magnifier_player_info": "O jogador ‘{0}’ foi forçado a entrar no modo de zoom.",
|
"magnifier_player_info": "O jogador ‘{0}’ foi forçado a entrar no modo de zoom.",
|
||||||
"magnifier_select_info": "Selecione o jogador cuja tela você deseja ampliar:",
|
"magnifier_select_info": "Ampliar tela do jogador:",
|
||||||
|
|
||||||
"medic": "Médico",
|
"medic": "Médico",
|
||||||
"medic_desc": "Clique em [css_useSkill] para usar uma carga de cura que restaura 50 de saúde",
|
"medic_desc": "Clique em [css_useSkill] para usar uma carga de cura que restaura 50 de saúde",
|
||||||
|
|
@ -210,7 +221,7 @@
|
||||||
"moneyswap_desc": "Escolha um jogador para trocar dinheiro com ele",
|
"moneyswap_desc": "Escolha um jogador para trocar dinheiro com ele",
|
||||||
"moneyswap_enemy_info": "A receita federal te pegou.",
|
"moneyswap_enemy_info": "A receita federal te pegou.",
|
||||||
"moneyswap_player_info": "Você trocou dinheiro com o jogador '{0}'.",
|
"moneyswap_player_info": "Você trocou dinheiro com o jogador '{0}'.",
|
||||||
"moneyswap_select_info": "Escolha o jogador com quem deseja trocar dinheiro:",
|
"moneyswap_select_info": "Trocar dinheiro c/ jogador:",
|
||||||
|
|
||||||
"muhammed": "Muhammed",
|
"muhammed": "Muhammed",
|
||||||
"muhammed_desc": "Você explode ao morrer, matando jogadores próximos",
|
"muhammed_desc": "Você explode ao morrer, matando jogadores próximos",
|
||||||
|
|
@ -257,13 +268,13 @@
|
||||||
"poison_desc": "Escolha um jogador que receberá dano a cada poucos segundos",
|
"poison_desc": "Escolha um jogador que receberá dano a cada poucos segundos",
|
||||||
"poison_enemy_info": "Você foi envenenado.",
|
"poison_enemy_info": "Você foi envenenado.",
|
||||||
"poison_player_info": "O jogador '{0}' foi envenenado.",
|
"poison_player_info": "O jogador '{0}' foi envenenado.",
|
||||||
"poison_select_info": "Escolha o jogador que receberá dano a cada poucos segundos:",
|
"poison_select_info": "Envenenar jogador:",
|
||||||
|
|
||||||
"primaryban": "Sem Rifles",
|
"primaryban": "Sem Rifles",
|
||||||
"primaryban_desc": "Escolha um jogador que não poderá usar rifles",
|
"primaryban_desc": "Escolha um jogador que não poderá usar rifles",
|
||||||
"primaryban_enemy_info": "Você não pode mais usar rifles.",
|
"primaryban_enemy_info": "Você não pode mais usar rifles.",
|
||||||
"primaryban_player_info": "O jogador '{0}' não pode mais usar rifles.",
|
"primaryban_player_info": "O jogador '{0}' não pode mais usar rifles.",
|
||||||
"primaryban_select_info": "Escolha o jogador para proibir de usar rifles:",
|
"primaryban_select_info": "Banir rifles do jogador:",
|
||||||
|
|
||||||
"prosthesis": "Prótese",
|
"prosthesis": "Prótese",
|
||||||
"prosthesis_desc": "Braços e pernas são à prova de balas",
|
"prosthesis_desc": "Braços e pernas são à prova de balas",
|
||||||
|
|
@ -353,7 +364,7 @@
|
||||||
"thief_desc": "Você pode roubar uma habilidade de um jogador escolhido",
|
"thief_desc": "Você pode roubar uma habilidade de um jogador escolhido",
|
||||||
"thief_enemy_info": "Sua habilidade foi roubada.",
|
"thief_enemy_info": "Sua habilidade foi roubada.",
|
||||||
"thief_player_info": "A habilidade do jogador '{0}' foi roubada.",
|
"thief_player_info": "A habilidade do jogador '{0}' foi roubada.",
|
||||||
"thief_select_info": "Escolha o jogador cuja habilidade você deseja roubar:",
|
"thief_select_info": "Roubar skill do jogador:",
|
||||||
|
|
||||||
"thirdeye": "Terceiro Olho",
|
"thirdeye": "Terceiro Olho",
|
||||||
"thirdeye_desc": "Clique em [css_useSkill] para ativar a visão em terceira pessoa",
|
"thirdeye_desc": "Clique em [css_useSkill] para ativar a visão em terceira pessoa",
|
||||||
|
|
@ -394,7 +405,7 @@
|
||||||
"no_player": "Nenhum jogador correspondente encontrado.",
|
"no_player": "Nenhum jogador correspondente encontrado.",
|
||||||
"duplicate_player": "Mais de um jogador encontrado com o mesmo nome.",
|
"duplicate_player": "Mais de um jogador encontrado com o mesmo nome.",
|
||||||
"selectplayerskill_command": "Digite /t",
|
"selectplayerskill_command": "Digite /t",
|
||||||
"selectplayerskill_incorrect_enemy_index": "Nenhum jogador encontrado com esse índice.",
|
"selectplayerskill_incorrect_enemy_index": "Não foram encontrados jogadores para selecionar.",
|
||||||
|
|
||||||
"skill_not_found_setskill": "Nenhuma habilidade CHATCOLORS.RED encontrada",
|
"skill_not_found_setskill": "Nenhuma habilidade CHATCOLORS.RED encontrada",
|
||||||
"player_not_found_setskill": "Nenhum jogador CHATCOLORS.RED encontrado",
|
"player_not_found_setskill": "Nenhum jogador CHATCOLORS.RED encontrado",
|
||||||
|
|
@ -420,7 +431,12 @@
|
||||||
"vote_alredy_voted": "Você já votou!",
|
"vote_alredy_voted": "Você já votou!",
|
||||||
"vote_vote": "Votar",
|
"vote_vote": "Votar",
|
||||||
|
|
||||||
|
"bombsite_a": "Zona de detonação A",
|
||||||
|
"bombsite_b": "Zona de detonação B",
|
||||||
|
|
||||||
"teammate_skills": "Habilidades dos seus companheiros de equipe",
|
"teammate_skills": "Habilidades dos seus companheiros de equipe",
|
||||||
"summary_start": "=======RESUMO=DA=ÚLTIMA=RODADA=======",
|
"summary_start": "=======RESUMO=DA=ÚLTIMA=RODADA=======",
|
||||||
"summary_end": "======================================="
|
"summary_end": "=======================================",
|
||||||
|
|
||||||
|
"menu_controlls": "<font class='fontSize-m' color='cyan'>W/S - Rolar</font> <font class='fontSize-m' color='white'> | </font> <font class='fontSize-m' color='green'>E - Selecionar</font> <br>"
|
||||||
}
|
}
|
||||||
|
|
@ -129,6 +129,11 @@
|
||||||
"frozendecoy": "冰冻诱饵",
|
"frozendecoy": "冰冻诱饵",
|
||||||
"frozendecoy_desc": "你的诱饵弹会冻结附近的所有玩家",
|
"frozendecoy_desc": "你的诱饵弹会冻结附近的所有玩家",
|
||||||
|
|
||||||
|
"gambler": "赌徒",
|
||||||
|
"gambler_desc": "从提供的列表中选择一个技能。",
|
||||||
|
"gambler_select_info": "选择你的技能:",
|
||||||
|
"gambler_more": "<font class='fontSize-m' color='#00FF00'>刷新 $100</font>",
|
||||||
|
|
||||||
"ghost": "幽灵",
|
"ghost": "幽灵",
|
||||||
"ghost_desc": "你完全隐形",
|
"ghost_desc": "你完全隐形",
|
||||||
|
|
||||||
|
|
@ -173,6 +178,12 @@
|
||||||
"jammer_player_info": "玩家 '{0}' 的准星已被禁用。",
|
"jammer_player_info": "玩家 '{0}' 的准星已被禁用。",
|
||||||
"jammer_select_info": "选择你想禁用其准星的玩家:",
|
"jammer_select_info": "选择你想禁用其准星的玩家:",
|
||||||
|
|
||||||
|
"jester": "小丑",
|
||||||
|
"jester_desc": "在小丑模式下,你不能造成或受到任何伤害。此模式每隔几秒会变化。",
|
||||||
|
"jester_mode": "小丑模式",
|
||||||
|
"jester_on": "开",
|
||||||
|
"jester_off": "关",
|
||||||
|
|
||||||
"jumpban": "无腿",
|
"jumpban": "无腿",
|
||||||
"jumpban_desc": "选择一个玩家使其无法跳跃",
|
"jumpban_desc": "选择一个玩家使其无法跳跃",
|
||||||
"jumpban_enemy_info": "有人切断了你的腿。",
|
"jumpban_enemy_info": "有人切断了你的腿。",
|
||||||
|
|
@ -394,7 +405,7 @@
|
||||||
"no_player": "未找到匹配的玩家。",
|
"no_player": "未找到匹配的玩家。",
|
||||||
"duplicate_player": "找到多个同名玩家。",
|
"duplicate_player": "找到多个同名玩家。",
|
||||||
"selectplayerskill_command": "输入 /t",
|
"selectplayerskill_command": "输入 /t",
|
||||||
"selectplayerskill_incorrect_enemy_index": "未找到该索引的玩家。",
|
"selectplayerskill_incorrect_enemy_index": "未找到可供选择的玩家。",
|
||||||
|
|
||||||
"skill_not_found_setskill": "未找到 CHATCOLORS.RED 技能",
|
"skill_not_found_setskill": "未找到 CHATCOLORS.RED 技能",
|
||||||
"player_not_found_setskill": "未找到 CHATCOLORS.RED 玩家",
|
"player_not_found_setskill": "未找到 CHATCOLORS.RED 玩家",
|
||||||
|
|
@ -420,7 +431,12 @@
|
||||||
"vote_alredy_voted": "您已投票!",
|
"vote_alredy_voted": "您已投票!",
|
||||||
"vote_vote": "投票",
|
"vote_vote": "投票",
|
||||||
|
|
||||||
|
"bombsite_a": "爆轰区A",
|
||||||
|
"bombsite_b": "爆轰区B",
|
||||||
|
|
||||||
"teammate_skills": "你队友的技能",
|
"teammate_skills": "你队友的技能",
|
||||||
"summary_start": "=============上一回合总结==============",
|
"summary_start": "=============上一回合总结==============",
|
||||||
"summary_end": "======================================="
|
"summary_end": "=======================================",
|
||||||
|
|
||||||
|
"menu_controlls": "<font class='fontSize-m' color='cyan'>W/S - 滚动</font> <font class='fontSize-m' color='white'> | </font> <font class='fontSize-m' color='green'>E - 选择</font> <br>"
|
||||||
}
|
}
|
||||||
|
|
@ -1,14 +1,47 @@
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
|
using CounterStrikeSharp.API.Core.Attributes;
|
||||||
|
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||||
|
using CounterStrikeSharp.API.Modules.UserMessages;
|
||||||
|
|
||||||
namespace jRandomSkills.src.player;
|
namespace jRandomSkills.src.player;
|
||||||
|
|
||||||
public interface ISkill
|
public interface ISkill
|
||||||
{
|
{
|
||||||
public static void LoadSkill() { }
|
public static void LoadSkill() { }
|
||||||
public static void EnableSkill(CCSPlayerController player) { }
|
public static void EnableSkill(CCSPlayerController _) { }
|
||||||
public static void DisableSkill(CCSPlayerController player) { }
|
public static void DisableSkill(CCSPlayerController _) { }
|
||||||
public static void UseSkill(CCSPlayerController player) { }
|
public static void UseSkill(CCSPlayerController _) { }
|
||||||
public static void TypeSkill(CCSPlayerController player, string[] commands) { }
|
public static void TypeSkill(CCSPlayerController _, string[] __) { }
|
||||||
|
|
||||||
|
public static void OnTakeDamage(DynamicHook _) { }
|
||||||
|
public static void OnEntitySpawned(CEntityInstance _) { }
|
||||||
|
public static void OnTick() { }
|
||||||
|
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList _) { }
|
||||||
|
|
||||||
|
public static void NewRound() { }
|
||||||
|
public static void PlayerMakeSound(UserMessage _) { }
|
||||||
|
public static void PlayerBlind(EventPlayerBlind _) { }
|
||||||
|
public static void PlayerHurt(EventPlayerHurt _) { }
|
||||||
|
public static void PlayerDeath(EventPlayerDeath _) { }
|
||||||
|
public static void PlayerJump(EventPlayerJump _) { }
|
||||||
|
|
||||||
|
public static void WeaponFire(EventWeaponFire _) { }
|
||||||
|
public static void WeaponEquip(EventItemEquip _) { }
|
||||||
|
public static void WeaponPickup(EventItemPickup _) { }
|
||||||
|
public static void WeaponReload(EventWeaponReload _) { }
|
||||||
|
public static void GrenadeThrown(EventGrenadeThrown _) { }
|
||||||
|
|
||||||
|
public static void BombBeginplant(EventBombBeginplant _) { }
|
||||||
|
public static void BombPlanted(EventBombPlanted _) { }
|
||||||
|
public static void BombBegindefuse(EventBombBegindefuse _) { }
|
||||||
|
|
||||||
|
public static void DecoyStarted(EventDecoyStarted _) { }
|
||||||
|
public static void DecoyDetonate(EventDecoyDetonate _) { }
|
||||||
|
|
||||||
|
public static void SmokegrenadeDetonate(EventSmokegrenadeDetonate _) { }
|
||||||
|
public static void SmokegrenadeExpired(EventSmokegrenadeExpired _) { }
|
||||||
|
|
||||||
|
public class SkillConfig { }
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum Skills
|
public enum Skills
|
||||||
|
|
@ -48,6 +81,7 @@ public enum Skills
|
||||||
FragileBomb,
|
FragileBomb,
|
||||||
FriendlyFire,
|
FriendlyFire,
|
||||||
FrozenDecoy,
|
FrozenDecoy,
|
||||||
|
Gambler,
|
||||||
Ghost,
|
Ghost,
|
||||||
Glaz,
|
Glaz,
|
||||||
Glitch,
|
Glitch,
|
||||||
|
|
@ -60,6 +94,7 @@ public enum Skills
|
||||||
InfiniteAmmo,
|
InfiniteAmmo,
|
||||||
Jackal,
|
Jackal,
|
||||||
Jammer,
|
Jammer,
|
||||||
|
Jester,
|
||||||
JumpBan,
|
JumpBan,
|
||||||
JumpingJack,
|
JumpingJack,
|
||||||
KillerFlash,
|
KillerFlash,
|
||||||
|
|
|
||||||
|
|
@ -1,33 +1,218 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
|
using CounterStrikeSharp.API.Core.Attributes;
|
||||||
using CounterStrikeSharp.API.Modules.Cvars;
|
using CounterStrikeSharp.API.Modules.Cvars;
|
||||||
|
using CounterStrikeSharp.API.Modules.Memory;
|
||||||
|
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||||
|
using CounterStrikeSharp.API.Modules.UserMessages;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using jRandomSkills.src.utils;
|
using jRandomSkills.src.utils;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using static jRandomSkills.Config;
|
using static CounterStrikeSharp.API.Core.Listeners;
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
{
|
{
|
||||||
public static partial class Event
|
public static partial class Event
|
||||||
{
|
{
|
||||||
private static readonly jSkill_SkillInfo noneSkill = new(Skills.None, Config.GetValue<string>(Skills.None, "color"), false);
|
public static bool enableTransmit = false;
|
||||||
|
public static readonly jSkill_SkillInfo noneSkill = new(Skills.None, Config.GetValue<string>(Skills.None, "color"), false);
|
||||||
|
|
||||||
private static jSkill_SkillInfo ctSkill = noneSkill;
|
private static jSkill_SkillInfo ctSkill = noneSkill;
|
||||||
private static jSkill_SkillInfo tSkill = noneSkill;
|
private static jSkill_SkillInfo tSkill = noneSkill;
|
||||||
private static jSkill_SkillInfo allSkill = noneSkill;
|
private static jSkill_SkillInfo allSkill = noneSkill;
|
||||||
private static List<jSkill_SkillInfo> debugSkills = new(SkillData.Skills);
|
private static List<jSkill_SkillInfo> debugSkills = new(SkillData.Skills);
|
||||||
|
|
||||||
|
public static readonly Config.DefaultSkillInfo[] terroristSkills = Config.LoadedConfig.SkillsInfo.Where(s => s.OnlyTeam == (int)CsTeam.Terrorist).ToArray();
|
||||||
|
public static readonly Config.DefaultSkillInfo[] counterterroristSkills = Config.LoadedConfig.SkillsInfo.Where(s => s.OnlyTeam == (int)CsTeam.CounterTerrorist).ToArray();
|
||||||
|
private static readonly Config.DefaultSkillInfo[] allTeamsSkills = Config.LoadedConfig.SkillsInfo.Where(s => s.OnlyTeam == 0).ToArray();
|
||||||
|
|
||||||
private static readonly Dictionary<ulong, List<jSkill_SkillInfo>> playersSkills = [];
|
private static readonly Dictionary<ulong, List<jSkill_SkillInfo>> playersSkills = [];
|
||||||
public static readonly Dictionary<ulong, jSkill_SkillInfo> staticSkills = [];
|
public static readonly Dictionary<ulong, jSkill_SkillInfo> staticSkills = [];
|
||||||
|
|
||||||
public static void Load()
|
public static void Load()
|
||||||
{
|
{
|
||||||
Instance.RegisterEventHandler<EventPlayerConnectFull>((@event, info) =>
|
Instance.RegisterEventHandler<EventPlayerConnectFull>(PlayerConnectFull);
|
||||||
|
Instance.RegisterEventHandler<EventPlayerDisconnect>(PlayerDisconnect);
|
||||||
|
Instance.RegisterEventHandler<EventRoundStart>(RoundStart);
|
||||||
|
Instance.RegisterEventHandler<EventRoundEnd>(RoundEnd);
|
||||||
|
|
||||||
|
Instance.RegisterEventHandler<EventPlayerDeath>(PlayerDeath);
|
||||||
|
Instance.RegisterEventHandler<EventPlayerBlind>(PlayerBlind);
|
||||||
|
Instance.RegisterEventHandler<EventPlayerHurt>(PlayerHurt);
|
||||||
|
Instance.RegisterEventHandler<EventPlayerJump>(PlayerJump);
|
||||||
|
|
||||||
|
Instance.RegisterEventHandler<EventWeaponFire>(WeaponFire);
|
||||||
|
Instance.RegisterEventHandler<EventItemEquip>(WeaponEquip);
|
||||||
|
Instance.RegisterEventHandler<EventItemPickup>(WeaponPickup);
|
||||||
|
Instance.RegisterEventHandler<EventWeaponReload>(WeaponReload);
|
||||||
|
Instance.RegisterEventHandler<EventGrenadeThrown>(GrenadeThrown);
|
||||||
|
|
||||||
|
Instance.RegisterEventHandler<EventBombBeginplant>(BombBeginplant);
|
||||||
|
Instance.RegisterEventHandler<EventBombPlanted>(BombPlanted);
|
||||||
|
Instance.RegisterEventHandler<EventBombBegindefuse>(BombBegindefuse);
|
||||||
|
|
||||||
|
Instance.RegisterEventHandler<EventDecoyStarted>(DecoyStarted);
|
||||||
|
Instance.RegisterEventHandler<EventDecoyDetonate>(DecoyDetonate);
|
||||||
|
|
||||||
|
Instance.RegisterEventHandler<EventSmokegrenadeDetonate>(SmokegrenadeDetonate);
|
||||||
|
Instance.RegisterEventHandler<EventSmokegrenadeExpired>(SmokegrenadeExpired);
|
||||||
|
|
||||||
|
Instance.RegisterListener<OnPlayerButtonsChanged>(CheckUseSkill);
|
||||||
|
Instance.RegisterListener<OnEntitySpawned>(EntitySpawned);
|
||||||
|
Instance.RegisterListener<OnTick>(OnTick);
|
||||||
|
|
||||||
|
Instance.HookUserMessage(208, PlayerMakeSound);
|
||||||
|
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HookResult PlayerMakeSound(UserMessage um)
|
||||||
|
{
|
||||||
|
foreach (var playerSkill in Instance.SkillPlayer)
|
||||||
|
if (!playerSkill.IsDrawing)
|
||||||
|
Instance.SkillAction(playerSkill.Skill.ToString(), "PlayerMakeSound", [um]);
|
||||||
|
return HookResult.Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HookResult WeaponFire(EventWeaponFire @event, GameEventInfo info)
|
||||||
|
{
|
||||||
|
foreach (var playerSkill in Instance.SkillPlayer)
|
||||||
|
if (!playerSkill.IsDrawing)
|
||||||
|
Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponFire", [@event]);
|
||||||
|
return HookResult.Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HookResult WeaponEquip(EventItemEquip @event, GameEventInfo info)
|
||||||
|
{
|
||||||
|
foreach (var playerSkill in Instance.SkillPlayer)
|
||||||
|
if (!playerSkill.IsDrawing)
|
||||||
|
Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponEquip", [@event]);
|
||||||
|
return HookResult.Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HookResult WeaponPickup(EventItemPickup @event, GameEventInfo info)
|
||||||
|
{
|
||||||
|
foreach (var playerSkill in Instance.SkillPlayer)
|
||||||
|
if (!playerSkill.IsDrawing)
|
||||||
|
Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponPickup", [@event]);
|
||||||
|
return HookResult.Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HookResult WeaponReload(EventWeaponReload @event, GameEventInfo info)
|
||||||
|
{
|
||||||
|
foreach (var playerSkill in Instance.SkillPlayer)
|
||||||
|
if (!playerSkill.IsDrawing)
|
||||||
|
Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponReload", [@event]);
|
||||||
|
return HookResult.Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HookResult GrenadeThrown(EventGrenadeThrown @event, GameEventInfo info)
|
||||||
|
{
|
||||||
|
foreach (var playerSkill in Instance.SkillPlayer)
|
||||||
|
if (!playerSkill.IsDrawing)
|
||||||
|
Instance.SkillAction(playerSkill.Skill.ToString(), "GrenadeThrown", [@event]);
|
||||||
|
return HookResult.Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HookResult BombBeginplant(EventBombBeginplant @event, GameEventInfo info)
|
||||||
|
{
|
||||||
|
foreach (var playerSkill in Instance.SkillPlayer)
|
||||||
|
if (!playerSkill.IsDrawing)
|
||||||
|
Instance.SkillAction(playerSkill.Skill.ToString(), "BombBeginplant", [@event]);
|
||||||
|
return HookResult.Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HookResult BombPlanted(EventBombPlanted @event, GameEventInfo info)
|
||||||
|
{
|
||||||
|
foreach (var playerSkill in Instance.SkillPlayer)
|
||||||
|
if (!playerSkill.IsDrawing)
|
||||||
|
Instance.SkillAction(playerSkill.Skill.ToString(), "BombPlanted", [@event]);
|
||||||
|
return HookResult.Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HookResult BombBegindefuse(EventBombBegindefuse @event, GameEventInfo info)
|
||||||
|
{
|
||||||
|
foreach (var playerSkill in Instance.SkillPlayer)
|
||||||
|
if (!playerSkill.IsDrawing)
|
||||||
|
Instance.SkillAction(playerSkill.Skill.ToString(), "BombBegindefuse", [@event]);
|
||||||
|
return HookResult.Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HookResult DecoyStarted(EventDecoyStarted @event, GameEventInfo info)
|
||||||
|
{
|
||||||
|
foreach (var playerSkill in Instance.SkillPlayer)
|
||||||
|
if (!playerSkill.IsDrawing)
|
||||||
|
Instance.SkillAction(playerSkill.Skill.ToString(), "DecoyStarted", [@event]);
|
||||||
|
return HookResult.Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HookResult DecoyDetonate(EventDecoyDetonate @event, GameEventInfo info)
|
||||||
|
{
|
||||||
|
foreach (var playerSkill in Instance.SkillPlayer)
|
||||||
|
if (!playerSkill.IsDrawing)
|
||||||
|
Instance.SkillAction(playerSkill.Skill.ToString(), "DecoyDetonate", [@event]);
|
||||||
|
return HookResult.Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HookResult SmokegrenadeDetonate(EventSmokegrenadeDetonate @event, GameEventInfo info)
|
||||||
|
{
|
||||||
|
foreach (var playerSkill in Instance.SkillPlayer)
|
||||||
|
if (!playerSkill.IsDrawing)
|
||||||
|
Instance.SkillAction(playerSkill.Skill.ToString(), "SmokegrenadeDetonate", [@event]);
|
||||||
|
return HookResult.Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HookResult SmokegrenadeExpired(EventSmokegrenadeExpired @event, GameEventInfo info)
|
||||||
|
{
|
||||||
|
foreach (var playerSkill in Instance.SkillPlayer)
|
||||||
|
if (!playerSkill.IsDrawing)
|
||||||
|
Instance.SkillAction(playerSkill.Skill.ToString(), "SmokegrenadeExpired", [@event]);
|
||||||
|
return HookResult.Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HookResult PlayerHurt(EventPlayerHurt @event, GameEventInfo info)
|
||||||
|
{
|
||||||
|
foreach (var playerSkill in Instance.SkillPlayer)
|
||||||
|
if (!playerSkill.IsDrawing)
|
||||||
|
Instance.SkillAction(playerSkill.Skill.ToString(), "PlayerHurt", [@event]);
|
||||||
|
return HookResult.Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HookResult PlayerJump(EventPlayerJump @event, GameEventInfo info)
|
||||||
|
{
|
||||||
|
foreach (var playerSkill in Instance.SkillPlayer)
|
||||||
|
if (!playerSkill.IsDrawing)
|
||||||
|
Instance.SkillAction(playerSkill.Skill.ToString(), "PlayerJump", [@event]);
|
||||||
|
return HookResult.Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HookResult PlayerBlind(EventPlayerBlind @event, GameEventInfo info)
|
||||||
|
{
|
||||||
|
foreach (var playerSkill in Instance.SkillPlayer)
|
||||||
|
if (!playerSkill.IsDrawing)
|
||||||
|
Instance.SkillAction(playerSkill.Skill.ToString(), "PlayerBlind", [@event]);
|
||||||
|
return HookResult.Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HookResult OnTakeDamage(DynamicHook h)
|
||||||
|
{
|
||||||
|
foreach (var playerSkill in Instance.SkillPlayer)
|
||||||
|
if (!playerSkill.IsDrawing)
|
||||||
|
Instance.SkillAction(playerSkill.Skill.ToString(), "OnTakeDamage", [h]);
|
||||||
|
return HookResult.Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void OnTick()
|
||||||
|
{
|
||||||
|
foreach (var playerSkill in Instance.SkillPlayer)
|
||||||
|
if (!playerSkill.IsDrawing)
|
||||||
|
Instance.SkillAction(playerSkill.Skill.ToString(), "OnTick");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HookResult PlayerConnectFull(EventPlayerConnectFull @event, GameEventInfo info)
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
|
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
if (player == null || !player.IsValid) return HookResult.Continue;
|
||||||
|
|
||||||
Instance.SkillPlayer.Add(new jSkill_PlayerInfo
|
Instance.SkillPlayer.Add(new jSkill_PlayerInfo
|
||||||
|
|
@ -56,36 +241,48 @@ namespace jRandomSkills
|
||||||
.Replace("{AUTHOR2}", $" {ChatColors.Red}Juzlus{ChatColors.Green} ({ChatColors.Red}https://github.com/Juzlus/jRandomSkills{ChatColors.Green})", StringComparison.OrdinalIgnoreCase));
|
.Replace("{AUTHOR2}", $" {ChatColors.Red}Juzlus{ChatColors.Green} ({ChatColors.Red}https://github.com/Juzlus/jRandomSkills{ChatColors.Green})", StringComparison.OrdinalIgnoreCase));
|
||||||
|
|
||||||
return HookResult.Continue;
|
return HookResult.Continue;
|
||||||
});
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDisconnect>((@event, info) =>
|
private static HookResult PlayerDisconnect(EventPlayerDisconnect @event, GameEventInfo info)
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
|
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
if (player == null || !player.IsValid) return HookResult.Continue;
|
||||||
|
|
||||||
var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (skillPlayer != null)
|
if (skillPlayer != null)
|
||||||
{
|
|
||||||
Instance.SkillPlayer.Remove(skillPlayer);
|
Instance.SkillPlayer.Remove(skillPlayer);
|
||||||
|
return HookResult.Continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
return HookResult.Continue;
|
private static HookResult RoundStart(EventRoundStart @event, GameEventInfo info)
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundStart>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
enableTransmit = false;
|
||||||
|
Instance.AddTimer(.1f, () => DisableAll());
|
||||||
|
foreach (var player in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist))
|
||||||
{
|
{
|
||||||
var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (skillPlayer != null)
|
if (skillPlayer == null) continue;
|
||||||
skillPlayer.IsDrawing = true;
|
skillPlayer.IsDrawing = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Instance.RemoveListener<CheckTransmit>(CheckTransmit);
|
||||||
|
int freezetime = ConVar.Find("mp_freezetime")?.GetPrimitiveValue<Int32>() ?? 0;
|
||||||
|
Instance.AddTimer(Math.Max(freezetime - Config.LoadedConfig.Settings.SkillTimeBeforeStart, 0) + .3f, SetSkill);
|
||||||
return HookResult.Continue;
|
return HookResult.Continue;
|
||||||
});
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
private static void DisableAll()
|
||||||
|
{
|
||||||
|
foreach (var player in Utilities.GetPlayers().Where(p => !p.IsBot))
|
||||||
|
{
|
||||||
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
|
if (playerInfo == null) return;
|
||||||
|
Instance.SkillAction(playerInfo.Skill.ToString(), "DisableSkill", [player]);
|
||||||
|
Instance.SkillAction(playerInfo.Skill.ToString(), "NewRound");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HookResult RoundEnd(EventRoundEnd @event, GameEventInfo info)
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
|
|
@ -118,15 +315,70 @@ namespace jRandomSkills
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return HookResult.Continue;
|
return HookResult.Continue;
|
||||||
});
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
private static HookResult PlayerDeath(EventPlayerDeath @event, GameEventInfo info)
|
||||||
{
|
{
|
||||||
Config.DefaultSkillInfo[] terroristSkills = Config.LoadedConfig.SkillsInfo.Where(s => s.OnlyTeam == (int)CsTeam.Terrorist).ToArray();
|
var victim = @event.Userid;
|
||||||
Config.DefaultSkillInfo[] counterterroristSkills = Config.LoadedConfig.SkillsInfo.Where(s => s.OnlyTeam == (int)CsTeam.CounterTerrorist).ToArray();
|
var attacker = @event.Attacker;
|
||||||
Config.DefaultSkillInfo[] allTeamsSkills = Config.LoadedConfig.SkillsInfo.Where(s => s.OnlyTeam == 0).ToArray();
|
if (victim == null || attacker == null) return HookResult.Continue;
|
||||||
|
|
||||||
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID);
|
||||||
|
if (playerInfo == null || playerInfo.IsDrawing) return HookResult.Continue;
|
||||||
|
Instance.SkillAction(playerInfo.Skill.ToString(), "PlayerDeath", [@event]);
|
||||||
|
Instance.SkillAction(playerInfo.Skill.ToString(), "DisableSkill", [victim]);
|
||||||
|
|
||||||
|
if (victim == attacker) return HookResult.Continue;
|
||||||
|
if (Config.LoadedConfig.Settings.KillerSkillInfo)
|
||||||
|
{
|
||||||
|
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
|
||||||
|
if (attackerInfo != null)
|
||||||
|
{
|
||||||
|
var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == attackerInfo.Skill);
|
||||||
|
var specialSkillData = SkillData.Skills.FirstOrDefault(s => s.Skill == attackerInfo.SpecialSkill);
|
||||||
|
if (skillData == null || specialSkillData == null) return HookResult.Continue;
|
||||||
|
string skillDesc = skillData.Description;
|
||||||
|
|
||||||
|
SkillUtils.PrintToChat(victim, $"{Localization.GetTranslation("enemy_skill")} {ChatColors.DarkRed}{attacker.PlayerName}{ChatColors.Lime}:", false);
|
||||||
|
SkillUtils.PrintToChat(victim, $"{ChatColors.DarkRed}{(attackerInfo.SpecialSkill == Skills.None ? skillData.Name : $"{specialSkillData.Name} -> {skillData.Name}")}{ChatColors.Lime} - {skillDesc}", false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return HookResult.Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void CheckUseSkill(CCSPlayerController player, PlayerButtons pressed, PlayerButtons released)
|
||||||
|
{
|
||||||
|
string? button = Config.LoadedConfig.Settings.AlternativeSkillButton;
|
||||||
|
if (string.IsNullOrEmpty(button)) return;
|
||||||
|
|
||||||
|
if (Enum.TryParse<PlayerButtons>(button, out var skillButton))
|
||||||
|
{
|
||||||
|
if (pressed != skillButton) return;
|
||||||
|
} else return;
|
||||||
|
|
||||||
|
if (player == null) return;
|
||||||
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
|
if (playerInfo == null || playerInfo.IsDrawing) return;
|
||||||
|
|
||||||
|
var playerPawn = player.PlayerPawn.Value;
|
||||||
|
if (playerPawn?.CBodyComponent == null) return;
|
||||||
|
if (!player.IsValid || !player.PawnIsAlive) return;
|
||||||
|
|
||||||
|
Debug.WriteToDebug($"Player {player.PlayerName} used the skill: {playerInfo.Skill} by PlayerButtons: {pressed}");
|
||||||
|
Instance.SkillAction(playerInfo.Skill.ToString(), "UseSkill", [player]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void EntitySpawned(CEntityInstance entity)
|
||||||
|
{
|
||||||
|
foreach (var playerSkill in Instance.SkillPlayer)
|
||||||
|
if (!playerSkill.IsDrawing)
|
||||||
|
Instance.SkillAction(playerSkill.Skill.ToString(), "OnEntitySpawned", [entity]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void SetSkill()
|
||||||
|
{
|
||||||
|
var validPlayers = Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && p .Team is CsTeam.CounterTerrorist or CsTeam.Terrorist).ToList();
|
||||||
|
|
||||||
if (Config.LoadedConfig.Settings.GameMode == (int)Config.GameModes.TeamSkills)
|
if (Config.LoadedConfig.Settings.GameMode == (int)Config.GameModes.TeamSkills)
|
||||||
{
|
{
|
||||||
|
|
@ -147,15 +399,21 @@ namespace jRandomSkills
|
||||||
else if (Config.LoadedConfig.Settings.GameMode == (int)Config.GameModes.Debug && debugSkills.Count == 0)
|
else if (Config.LoadedConfig.Settings.GameMode == (int)Config.GameModes.Debug && debugSkills.Count == 0)
|
||||||
debugSkills = new(SkillData.Skills);
|
debugSkills = new(SkillData.Skills);
|
||||||
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in validPlayers)
|
||||||
{
|
{
|
||||||
var playerTeam = player.Team;
|
if (player == null) continue;
|
||||||
var teammates = Utilities.GetPlayers().Where(p => p.Team == playerTeam && p != player);
|
var teammates = validPlayers.Where(p => p.Team == player.Team && p != player);
|
||||||
string teammateSkills = "";
|
string teammateSkills = "";
|
||||||
|
|
||||||
var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (skillPlayer != null)
|
if (skillPlayer == null) continue;
|
||||||
|
|
||||||
|
if (player.PlayerPawn.Value == null || !player.PlayerPawn.IsValid)
|
||||||
{
|
{
|
||||||
|
skillPlayer.Skill = Skills.None;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
skillPlayer.IsDrawing = false;
|
skillPlayer.IsDrawing = false;
|
||||||
jSkill_SkillInfo randomSkill = new(Skills.None, Config.GetValue<string>(Skills.None, "color"), false);
|
jSkill_SkillInfo randomSkill = new(Skills.None, Config.GetValue<string>(Skills.None, "color"), false);
|
||||||
|
|
||||||
|
|
@ -169,7 +427,7 @@ namespace jRandomSkills
|
||||||
List<jSkill_SkillInfo> skillList = new(SkillData.Skills);
|
List<jSkill_SkillInfo> skillList = new(SkillData.Skills);
|
||||||
skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None);
|
skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None);
|
||||||
|
|
||||||
if (Utilities.GetPlayers().FindAll(p => p.Team == player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).Count == 1)
|
if (validPlayers.Count(p => p.Team == player.Team) == 1)
|
||||||
{
|
{
|
||||||
Config.DefaultSkillInfo[] skillsNeedsTeammates = Config.LoadedConfig.SkillsInfo.Where(s => s.NeedsTeammates).ToArray();
|
Config.DefaultSkillInfo[] skillsNeedsTeammates = Config.LoadedConfig.SkillsInfo.Where(s => s.NeedsTeammates).ToArray();
|
||||||
skillList.RemoveAll(s => skillsNeedsTeammates.Any(s2 => s2.Name == s.Skill.ToString()));
|
skillList.RemoveAll(s => skillsNeedsTeammates.Any(s2 => s2.Name == s.Skill.ToString()));
|
||||||
|
|
@ -209,13 +467,14 @@ namespace jRandomSkills
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
skillPlayer.Skill = randomSkill.Skill;
|
|
||||||
skillPlayer.SpecialSkill = Skills.None;
|
|
||||||
Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{randomSkill.Name}\".");
|
|
||||||
|
|
||||||
if (randomSkill.Display)
|
if (randomSkill.Display)
|
||||||
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{randomSkill.Name}{ChatColors.Lime}: {randomSkill.Description}", false);
|
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{randomSkill.Name}{ChatColors.Lime}: {randomSkill.Description}", false);
|
||||||
|
|
||||||
|
skillPlayer.Skill = randomSkill.Skill;
|
||||||
|
skillPlayer.SpecialSkill = Skills.None;
|
||||||
|
Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", new [] { player });
|
||||||
|
Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{randomSkill.Name}\".");
|
||||||
|
|
||||||
if (Config.LoadedConfig.Settings.TeamMateSkillInfo)
|
if (Config.LoadedConfig.Settings.TeamMateSkillInfo)
|
||||||
{
|
{
|
||||||
Instance?.AddTimer(0.5f, () =>
|
Instance?.AddTimer(0.5f, () =>
|
||||||
|
|
@ -240,58 +499,15 @@ namespace jRandomSkills
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (enableTransmit)
|
||||||
|
Instance?.RegisterListener<CheckTransmit>(CheckTransmit);
|
||||||
}
|
}
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
var victim = @event.Userid;
|
foreach (var playerSkill in Instance.SkillPlayer)
|
||||||
var attacker = @event.Attacker;
|
if (!playerSkill.IsDrawing)
|
||||||
|
Instance.SkillAction(playerSkill.Skill.ToString(), "CheckTransmit", [infoList]);
|
||||||
if (victim == null || attacker == null || victim == attacker) return HookResult.Continue;
|
|
||||||
|
|
||||||
if(Config.LoadedConfig.Settings.KillerSkillInfo)
|
|
||||||
{
|
|
||||||
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
|
|
||||||
if (attackerInfo != null)
|
|
||||||
{
|
|
||||||
var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == attackerInfo.Skill);
|
|
||||||
var specialSkillData = SkillData.Skills.FirstOrDefault(s => s.Skill == attackerInfo.SpecialSkill);
|
|
||||||
if (skillData == null || specialSkillData == null) return HookResult.Continue;
|
|
||||||
string skillDesc = skillData.Description;
|
|
||||||
|
|
||||||
SkillUtils.PrintToChat(victim, $"{Localization.GetTranslation("enemy_skill")} {ChatColors.DarkRed}{attacker.PlayerName}{ChatColors.Lime}:", false);
|
|
||||||
SkillUtils.PrintToChat(victim, $"{ChatColors.DarkRed}{(attackerInfo.SpecialSkill == Skills.None ? skillData.Name : $"{specialSkillData.Name} -> {skillData.Name}")}{ChatColors.Lime} - {skillDesc}", false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<Listeners.OnPlayerButtonsChanged>((CCSPlayerController player, PlayerButtons pressed, PlayerButtons released) =>
|
|
||||||
{
|
|
||||||
string? button = Config.LoadedConfig.Settings.AlternativeSkillButton;
|
|
||||||
if (string.IsNullOrEmpty(button)) return;
|
|
||||||
|
|
||||||
if (Enum.TryParse<PlayerButtons>(button, out var skillButton))
|
|
||||||
{
|
|
||||||
if (pressed != skillButton) return;
|
|
||||||
} else return;
|
|
||||||
|
|
||||||
if (player == null) return;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo == null) return;
|
|
||||||
|
|
||||||
var playerPawn = player.PlayerPawn.Value;
|
|
||||||
if (playerPawn?.CBodyComponent == null) return;
|
|
||||||
if (!player.IsValid || !player.PawnIsAlive) return;
|
|
||||||
|
|
||||||
Debug.WriteToDebug($"Player {player.PlayerName} used the skill: {playerInfo.Skill} by PlayerButtons: {pressed}");
|
|
||||||
Instance.SkillAction(playerInfo.Skill.ToString(), "UseSkill", [player]);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[GeneratedRegex(@"\{AUTHOR1\}", RegexOptions.IgnoreCase, "pl-PL")]
|
[GeneratedRegex(@"\{AUTHOR1\}", RegexOptions.IgnoreCase, "pl-PL")]
|
||||||
|
|
|
||||||
|
|
@ -91,7 +91,10 @@ namespace jRandomSkills
|
||||||
var observeredPlayerSpecialSkillInfo = SkillData.Skills.FirstOrDefault(s => s.Skill == observeredPlayerSkill.SpecialSkill);
|
var observeredPlayerSpecialSkillInfo = SkillData.Skills.FirstOrDefault(s => s.Skill == observeredPlayerSkill.SpecialSkill);
|
||||||
if (observeredPlayerSpecialSkillInfo == null) return;
|
if (observeredPlayerSpecialSkillInfo == null) return;
|
||||||
|
|
||||||
infoLine = $"<font class='fontSize-l' class='fontWeight-Bold' color='#FFFFFF'>{Localization.GetTranslation("observer_skill")} {observeredPlayerSkill.PlayerName}:</font> <br>";
|
string pName = observeredPlayerSkill.PlayerName;
|
||||||
|
if (pName.Length > 18)
|
||||||
|
pName = $"{pName.Substring(0, 17)}...";
|
||||||
|
infoLine = $"<font class='fontSize-l' class='fontWeight-Bold' color='#FFFFFF'>{Localization.GetTranslation("observer_skill")} {pName}:</font> <br>";
|
||||||
skillLine = $"<font class='fontSize-l' class='fontWeight-Bold' color='{observeredPlayerSkillInfo.Color}'>{(observeredPlayerSkill.SpecialSkill == Skills.None ? observeredPlayerSkillInfo.Name : $"{observeredPlayerSpecialSkillInfo.Name}({observeredPlayerSkillInfo.Name})")}</font> <br>";
|
skillLine = $"<font class='fontSize-l' class='fontWeight-Bold' color='{observeredPlayerSkillInfo.Color}'>{(observeredPlayerSkill.SpecialSkill == Skills.None ? observeredPlayerSkillInfo.Name : $"{observeredPlayerSpecialSkillInfo.Name}({observeredPlayerSkillInfo.Name})")}</font> <br>";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Memory;
|
|
||||||
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
|
|
@ -16,31 +15,30 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static HookResult OnTakeDamage(DynamicHook h)
|
public static void OnTakeDamage(DynamicHook h)
|
||||||
{
|
{
|
||||||
CEntityInstance param = h.GetParam<CEntityInstance>(0);
|
CEntityInstance param = h.GetParam<CEntityInstance>(0);
|
||||||
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
|
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
|
||||||
|
|
||||||
if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null)
|
if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null)
|
||||||
return HookResult.Continue;
|
return;
|
||||||
|
|
||||||
CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle);
|
CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle);
|
||||||
CCSPlayerPawn victimPawn = new(param.Handle);
|
CCSPlayerPawn victimPawn = new(param.Handle);
|
||||||
|
|
||||||
if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player")
|
if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player")
|
||||||
return HookResult.Continue;
|
return;
|
||||||
|
|
||||||
if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null)
|
if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null)
|
||||||
return HookResult.Continue;
|
return;
|
||||||
|
|
||||||
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
|
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
|
||||||
CCSPlayerController victim = victimPawn.Controller.Value.As<CCSPlayerController>();
|
CCSPlayerController victim = victimPawn.Controller.Value.As<CCSPlayerController>();
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
|
||||||
if (playerInfo == null) return HookResult.Continue;
|
if (playerInfo == null) return;
|
||||||
|
|
||||||
if (attacker.PawnIsAlive)
|
if (attacker.PawnIsAlive)
|
||||||
{
|
{
|
||||||
|
|
@ -60,8 +58,12 @@ namespace jRandomSkills
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void DisableSkill(CCSPlayerController _)
|
||||||
|
{
|
||||||
|
foreach (var hit in hitGroups)
|
||||||
|
Marshal.WriteInt32(hit.Key, 56, hit.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff0000", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff0000", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using jRandomSkills.src.utils;
|
using jRandomSkills.src.utils;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -19,40 +18,14 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
SkillPlayerInfo.Clear();
|
SkillPlayerInfo.Clear();
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
public static void OnTick()
|
||||||
{
|
|
||||||
var player = @event.Userid;
|
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
SkillPlayerInfo.Remove(player.SteamID);
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<OnTick>(() =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
|
|
@ -76,7 +49,6 @@ namespace jRandomSkills
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
using CounterStrikeSharp.API;
|
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
|
|
@ -14,33 +13,17 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void PlayerBlind(EventPlayerBlind @event)
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerBlind>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
var attacker = @event.Attacker;
|
var attacker = @event.Attacker;
|
||||||
|
if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return;
|
||||||
if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return HookResult.Continue;
|
if (attacker == null || !attacker.IsValid) return;
|
||||||
if (attacker == null || !attacker.IsValid) return HookResult.Continue;
|
|
||||||
|
|
||||||
var playerPawn = player.PlayerPawn.Value;
|
var playerPawn = player.PlayerPawn.Value;
|
||||||
if (playerPawn == null || !playerPawn.IsValid) return HookResult.Continue;
|
if (playerPawn == null || !playerPawn.IsValid) return;
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
|
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
|
||||||
|
|
@ -49,9 +32,6 @@ namespace jRandomSkills
|
||||||
playerPawn.FlashDuration = 0.0f;
|
playerPawn.FlashDuration = 0.0f;
|
||||||
else if (attackerInfo?.Skill == skillName)
|
else if (attackerInfo?.Skill == skillName)
|
||||||
playerPawn.FlashDuration = 7.0f;
|
playerPawn.FlashDuration = 7.0f;
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -12,25 +12,18 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
|
public static void PlayerHurt(EventPlayerHurt @event)
|
||||||
{
|
{
|
||||||
var attacker = @event.Attacker;
|
var attacker = @event.Attacker;
|
||||||
var victim = @event.Userid;
|
var victim = @event.Userid;
|
||||||
int hitgroup = @event.Hitgroup;
|
int hitgroup = @event.Hitgroup;
|
||||||
|
|
||||||
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return;
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID);
|
||||||
|
|
||||||
if (playerInfo?.Skill == skillName && hitgroup == (int)HitGroup_t.HITGROUP_HEAD)
|
if (playerInfo?.Skill == skillName && hitgroup == (int)HitGroup_t.HITGROUP_HEAD)
|
||||||
{
|
|
||||||
ApplyIronHeadEffect(victim!, @event.DmgHealth);
|
ApplyIronHeadEffect(victim!, @event.DmgHealth);
|
||||||
return HookResult.Stop;
|
|
||||||
}
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ApplyIronHeadEffect(CCSPlayerController victim, float damage)
|
private static void ApplyIronHeadEffect(CCSPlayerController victim, float damage)
|
||||||
|
|
|
||||||
|
|
@ -16,32 +16,13 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
public static void NewRound()
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
SkillUtils.CloseMenu(player);
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
Instance.AddTimer(0.1f, EnableBombsite);
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundStart>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
EnableBombsite();
|
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
||||||
|
|
@ -78,19 +59,16 @@ namespace jRandomSkills
|
||||||
if (playerInfo == null) return;
|
if (playerInfo == null) return;
|
||||||
playerInfo.SkillChance = 0;
|
playerInfo.SkillChance = 0;
|
||||||
|
|
||||||
SkillUtils.PrintToChat(player, Localization.GetTranslation("areareaper") + ":", false);
|
HashSet<(string, string)> menuItems = [(Localization.GetTranslation("bombsite_a"), "a"), (Localization.GetTranslation("bombsite_b"), "b")];
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("areareaper_select_info")}");
|
SkillUtils.CreateMenu(player, menuItems);
|
||||||
player.PrintToChat($" {ChatColors.Green}· {ChatColors.Red}/t {ChatColors.Green}A");
|
|
||||||
player.PrintToChat($" {ChatColors.Green}· {ChatColors.Red}/t {ChatColors.Green}B");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma warning disable IDE0060 // Usuń nieużywany parametr
|
|
||||||
public static void DisableSkill(CCSPlayerController player)
|
public static void DisableSkill(CCSPlayerController player)
|
||||||
#pragma warning restore IDE0060 // Usuń nieużywany parametr
|
|
||||||
{
|
{
|
||||||
if (Instance.SkillPlayer.FirstOrDefault(p => p.Skill == skillName) != null)
|
SkillUtils.CloseMenu(player);
|
||||||
return;
|
if (Instance.SkillPlayer.FirstOrDefault(p => p.Skill == skillName) != null) return;
|
||||||
EnableBombsite();
|
EnableBombsite();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void EnableBombsite()
|
private static void EnableBombsite()
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Core;
|
|
||||||
using CounterStrikeSharp.API.Modules.Memory;
|
|
||||||
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
|
|
@ -16,25 +14,6 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
||||||
|
|
||||||
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
@ -48,36 +27,34 @@ namespace jRandomSkills
|
||||||
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("armored")}{ChatColors.Lime}: " + Localization.GetTranslation("armored_desc2", newScale), false);
|
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("armored")}{ChatColors.Lime}: " + Localization.GetTranslation("armored_desc2", newScale), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static HookResult OnTakeDamage(DynamicHook h)
|
public static void OnTakeDamage(DynamicHook h)
|
||||||
{
|
{
|
||||||
CEntityInstance param = h.GetParam<CEntityInstance>(0);
|
CEntityInstance param = h.GetParam<CEntityInstance>(0);
|
||||||
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
|
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
|
||||||
|
|
||||||
if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null)
|
if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null)
|
||||||
return HookResult.Continue;
|
return;
|
||||||
|
|
||||||
CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle);
|
CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle);
|
||||||
CCSPlayerPawn victimPawn = new(param.Handle);
|
CCSPlayerPawn victimPawn = new(param.Handle);
|
||||||
|
|
||||||
if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player")
|
if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player")
|
||||||
return HookResult.Continue;
|
return;
|
||||||
|
|
||||||
if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null)
|
if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null)
|
||||||
return HookResult.Continue;
|
return;
|
||||||
|
|
||||||
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
|
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
|
||||||
CCSPlayerController victim = victimPawn.Controller.Value.As<CCSPlayerController>();
|
CCSPlayerController victim = victimPawn.Controller.Value.As<CCSPlayerController>();
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID);
|
||||||
if (playerInfo == null) return HookResult.Continue;
|
if (playerInfo == null) return;
|
||||||
|
|
||||||
if (playerInfo.Skill == skillName && victim.PawnIsAlive)
|
if (playerInfo.Skill == skillName && victim.PawnIsAlive)
|
||||||
{
|
{
|
||||||
float? skillChance = playerInfo.SkillChance;
|
float? skillChance = playerInfo.SkillChance;
|
||||||
param2.Damage *= skillChance ?? 1f;
|
param2.Damage *= skillChance ?? 1f;
|
||||||
}
|
}
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#d1430a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = .65f, float chanceTo = .85f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#d1430a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = .65f, float chanceTo = .85f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,9 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
|
public static void PlayerHurt(EventPlayerHurt @event)
|
||||||
{
|
{
|
||||||
var damage = @event.DmgHealth;
|
var damage = @event.DmgHealth;
|
||||||
var victim = @event.Userid;
|
var victim = @event.Userid;
|
||||||
|
|
@ -24,17 +25,14 @@ namespace jRandomSkills
|
||||||
var weapon = @event.Weapon;
|
var weapon = @event.Weapon;
|
||||||
HitGroup_t hitgroup = (HitGroup_t)@event.Hitgroup;
|
HitGroup_t hitgroup = (HitGroup_t)@event.Hitgroup;
|
||||||
|
|
||||||
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return;
|
||||||
if (nades.Contains(weapon)) return HookResult.Continue;
|
if (nades.Contains(weapon)) return;
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
if (playerInfo?.Skill != skillName) return;
|
||||||
|
|
||||||
if (IsBehind(attacker!, victim!))
|
if (IsBehind(attacker!, victim!))
|
||||||
SkillUtils.TakeHealth(victim!.PlayerPawn.Value, (int)(damage * (damageMultiplier - 1f)));
|
SkillUtils.TakeHealth(victim!.PlayerPawn.Value, (int)(damage * (damageMultiplier - 1f)));
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool IsBehind(CCSPlayerController attacker, CCSPlayerController victim)
|
private static bool IsBehind(CCSPlayerController attacker, CCSPlayerController victim)
|
||||||
|
|
|
||||||
|
|
@ -14,31 +14,6 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
var playerPawn = player.PlayerPawn.Value;
|
|
||||||
|
|
||||||
if (playerInfo?.Skill == skillName && playerPawn != null)
|
|
||||||
{
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
DisableSkill(player);
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
@ -46,6 +21,12 @@ namespace jRandomSkills
|
||||||
ApplyGravityModifier(player);
|
ApplyGravityModifier(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void NewRound()
|
||||||
|
{
|
||||||
|
foreach (var player in Utilities.GetPlayers())
|
||||||
|
DisableSkill(player);
|
||||||
|
}
|
||||||
|
|
||||||
public static void DisableSkill(CCSPlayerController player)
|
public static void DisableSkill(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return;
|
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return;
|
||||||
|
|
|
||||||
|
|
@ -18,46 +18,30 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void PlayerHurt(EventPlayerHurt @event)
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
var victim = @event.Userid;
|
var victim = @event.Userid;
|
||||||
var attacker = @event.Attacker;
|
var attacker = @event.Attacker;
|
||||||
var weapon = @event.Weapon;
|
var weapon = @event.Weapon;
|
||||||
|
|
||||||
if (weapon != "decoy") return HookResult.Continue;
|
if (weapon != "decoy") return;
|
||||||
if (!Instance.IsPlayerValid(victim) || !Instance.IsPlayerValid(attacker)) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(victim) || !Instance.IsPlayerValid(attacker)) return;
|
||||||
|
|
||||||
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
||||||
if (attackerInfo?.Skill != skillName) return HookResult.Continue;
|
if (attackerInfo?.Skill != skillName) return;
|
||||||
|
|
||||||
SkillUtils.TakeHealth(victim!.PlayerPawn.Value, damageDeal);
|
SkillUtils.TakeHealth(victim!.PlayerPawn.Value, damageDeal);
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<Listeners.OnEntitySpawned>(@event =>
|
public static void OnEntitySpawned(CEntityInstance entity)
|
||||||
{
|
{
|
||||||
var name = @event.DesignerName;
|
var name = entity.DesignerName;
|
||||||
if (name != "decoy_projectile")
|
if (name != "decoy_projectile")
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var decoy = @event.As<CDecoyProjectile>();
|
var decoy = entity.As<CDecoyProjectile>();
|
||||||
if (decoy == null || !decoy.IsValid || decoy.OwnerEntity == null || decoy.OwnerEntity.Value == null || !decoy.OwnerEntity.Value.IsValid) return;
|
if (decoy == null || !decoy.IsValid || decoy.OwnerEntity == null || decoy.OwnerEntity.Value == null || !decoy.OwnerEntity.Value.IsValid) return;
|
||||||
|
|
||||||
var pawn = decoy.OwnerEntity.Value.As<CCSPlayerPawn>();
|
var pawn = decoy.OwnerEntity.Value.As<CCSPlayerPawn>();
|
||||||
|
|
@ -69,26 +53,21 @@ namespace jRandomSkills
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) return;
|
if (playerInfo?.Skill != skillName) return;
|
||||||
decoys.Add(decoy);
|
decoys.Add(decoy);
|
||||||
});
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventDecoyStarted>((@event, info) =>
|
public static void DecoyStarted(EventDecoyStarted @event)
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
if (player == null || !player.IsValid) return;
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
if (playerInfo?.Skill != skillName) return;
|
||||||
|
|
||||||
var decoy = decoys.FirstOrDefault(d => d.Index == @event.Entityid);
|
var decoy = decoys.FirstOrDefault(d => d.Index == @event.Entityid);
|
||||||
if (decoy != null && decoy.IsValid)
|
if (decoy != null && decoy.IsValid)
|
||||||
decoy.Remove();
|
decoy.Remove();
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<Listeners.OnTick>(OnTick);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnTick()
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
foreach (var decoy in decoys)
|
foreach (var decoy in decoys)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
using CounterStrikeSharp.API;
|
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
|
|
@ -14,44 +13,21 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void PlayerHurt(EventPlayerHurt @event)
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
var attacker = @event!.Attacker;
|
var attacker = @event!.Attacker;
|
||||||
var victim = @event!.Userid;
|
var victim = @event!.Userid;
|
||||||
|
|
||||||
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim)
|
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return;
|
||||||
return HookResult.Continue;
|
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
||||||
|
|
||||||
if (playerInfo?.Skill == skillName && victim!.PawnIsAlive)
|
if (playerInfo?.Skill == skillName && victim!.PawnIsAlive)
|
||||||
{
|
|
||||||
if (Instance.Random.NextDouble() <= playerInfo.SkillChance)
|
if (Instance.Random.NextDouble() <= playerInfo.SkillChance)
|
||||||
RotateEnemy(victim);
|
RotateEnemy(victim);
|
||||||
}
|
}
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
|
|
|
||||||
|
|
@ -16,38 +16,38 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
|
public static void PlayerHurt(EventPlayerHurt @event)
|
||||||
{
|
{
|
||||||
var victim = @event.Userid;
|
var victim = @event.Userid;
|
||||||
int damage = @event.DmgHealth;
|
int damage = @event.DmgHealth;
|
||||||
HitGroup_t hitGroup = (HitGroup_t)@event.Hitgroup;
|
HitGroup_t hitGroup = (HitGroup_t)@event.Hitgroup;
|
||||||
string weapon = @event.Weapon;
|
string weapon = @event.Weapon;
|
||||||
|
|
||||||
if (noReflectionWeapon.Contains(weapon) || !Instance.IsPlayerValid(victim)) return HookResult.Continue;
|
if (noReflectionWeapon.Contains(weapon) || !Instance.IsPlayerValid(victim)) return;
|
||||||
var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID);
|
var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID);
|
||||||
if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue;
|
if (victimInfo == null || victimInfo.Skill != skillName) return;
|
||||||
|
|
||||||
int chance = Instance.Random.Next(0, 101);
|
int chance = Instance.Random.Next(0, 101);
|
||||||
if (hitGroup == HitGroup_t.HITGROUP_LEFTLEG || hitGroup == HitGroup_t.HITGROUP_RIGHTLEG)
|
if (hitGroup == HitGroup_t.HITGROUP_LEFTLEG || hitGroup == HitGroup_t.HITGROUP_RIGHTLEG)
|
||||||
{
|
{
|
||||||
if (chance > legReflectionChance)
|
if (chance > legReflectionChance)
|
||||||
return HookResult.Continue;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (chance > torseReflectionChance)
|
if (chance > torseReflectionChance)
|
||||||
return HookResult.Continue;
|
return;
|
||||||
|
|
||||||
var pawn = victim!.PlayerPawn.Value;
|
var pawn = victim!.PlayerPawn.Value;
|
||||||
if (pawn == null || !pawn.IsValid) return HookResult.Continue;
|
if (pawn == null || !pawn.IsValid) return;
|
||||||
|
|
||||||
var weaponServices = pawn.WeaponServices;
|
var weaponServices = pawn.WeaponServices;
|
||||||
if (weaponServices == null) return HookResult.Continue;
|
if (weaponServices == null) return;
|
||||||
if (weaponServices.ActiveWeapon == null || !weaponServices.ActiveWeapon.IsValid || weaponServices.ActiveWeapon.Value == null || !weaponServices.ActiveWeapon.Value.IsValid || weaponServices.ActiveWeapon.Value.DesignerName != "weapon_knife") return HookResult.Continue;
|
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);
|
RestoreHealth(victim, damage);
|
||||||
return HookResult.Stop;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void RestoreHealth(CCSPlayerController victim, float damage)
|
private static void RestoreHealth(CCSPlayerController victim, float damage)
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -17,10 +16,9 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
Instance.RegisterListener<OnTick>(OnTick);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnTick()
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
|
|
@ -34,6 +32,7 @@ namespace jRandomSkills
|
||||||
{
|
{
|
||||||
var playerPawn = player.PlayerPawn.Value;
|
var playerPawn = player.PlayerPawn.Value;
|
||||||
if (playerPawn == null || !playerPawn.IsValid) return;
|
if (playerPawn == null || !playerPawn.IsValid) return;
|
||||||
|
if (JumpBan.bannedPlayers.ContainsKey(playerPawn)) return;
|
||||||
|
|
||||||
var flags = (PlayerFlags)playerPawn.Flags;
|
var flags = (PlayerFlags)playerPawn.Flags;
|
||||||
var buttons = player.Buttons;
|
var buttons = player.Buttons;
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Core.Attributes;
|
using CounterStrikeSharp.API.Core.Attributes;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -12,62 +11,30 @@ namespace jRandomSkills
|
||||||
public class C4Camouflage : ISkill
|
public class C4Camouflage : ISkill
|
||||||
{
|
{
|
||||||
private const Skills skillName = Skills.C4Camouflage;
|
private const Skills skillName = Skills.C4Camouflage;
|
||||||
private static bool exists = false;
|
|
||||||
private static readonly Dictionary<ulong, List<uint>> invisibleEntities = [];
|
private static readonly Dictionary<ulong, List<uint>> invisibleEntities = [];
|
||||||
|
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
DisableSkill(player);
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerPawn = player.PlayerPawn?.Value;
|
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void WeaponPickup(EventItemPickup @event)
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
if (player == null || !player.IsValid || player.PlayerPawn.Value == null) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(player)) return;
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
DisableSkill(player);
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventItemPickup>((@event, info) =>
|
|
||||||
{
|
|
||||||
var player = @event.Userid;
|
|
||||||
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
if (playerInfo?.Skill != skillName) return;
|
||||||
EnableSkill(player!);
|
EnableSkill(player!);
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventItemEquip>((@event, info) =>
|
public static void WeaponEquip(EventItemEquip @event)
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
var weapon = @event.Item;
|
var weapon = @event.Item;
|
||||||
|
|
||||||
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(player)) return;
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
if (playerInfo?.Skill != skillName) return;
|
||||||
|
|
||||||
if (weapon == "c4")
|
if (weapon == "c4")
|
||||||
{
|
{
|
||||||
|
|
@ -79,22 +46,6 @@ namespace jRandomSkills
|
||||||
SetPlayerVisibility(player!, true);
|
SetPlayerVisibility(player!, true);
|
||||||
SetWeaponVisibility(player!, true);
|
SetWeaponVisibility(player!, true);
|
||||||
}
|
}
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
DisableSkill(player);
|
|
||||||
}
|
|
||||||
Instance.RemoveListener<CheckTransmit>(CheckTransmit);
|
|
||||||
exists = false;
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
|
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
|
||||||
|
|
@ -111,10 +62,7 @@ namespace jRandomSkills
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
if (!exists)
|
Event.enableTransmit = true;
|
||||||
Instance.RegisterListener<CheckTransmit>(CheckTransmit);
|
|
||||||
exists = true;
|
|
||||||
|
|
||||||
if (player == null || !player.IsValid) return;
|
if (player == null || !player.IsValid) return;
|
||||||
var playerPawn = player.PlayerPawn.Value;
|
var playerPawn = player.PlayerPawn.Value;
|
||||||
|
|
||||||
|
|
@ -129,7 +77,6 @@ namespace jRandomSkills
|
||||||
SetWeaponVisibility(player, false);
|
SetWeaponVisibility(player, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static void DisableSkill(CCSPlayerController player)
|
public static void DisableSkill(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
SetPlayerVisibility(player, true);
|
SetPlayerVisibility(player, true);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
using CounterStrikeSharp.API;
|
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
|
|
@ -14,47 +13,24 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void PlayerHurt(EventPlayerHurt @event)
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
var attacker = @event.Attacker;
|
var attacker = @event.Attacker;
|
||||||
var victim = @event.Userid;
|
var victim = @event.Userid;
|
||||||
|
|
||||||
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return;
|
||||||
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
||||||
|
|
||||||
if (attackerInfo?.Skill == skillName && victim!.PawnIsAlive)
|
if (attackerInfo?.Skill == skillName && victim!.PawnIsAlive)
|
||||||
{
|
|
||||||
if (Instance.Random.NextDouble() <= attackerInfo.SkillChance)
|
if (Instance.Random.NextDouble() <= attackerInfo.SkillChance)
|
||||||
{
|
{
|
||||||
var victimPawn = victim.PlayerPawn?.Value;
|
var victimPawn = victim.PlayerPawn?.Value;
|
||||||
if (victimPawn != null)
|
if (victimPawn != null)
|
||||||
{
|
|
||||||
victimPawn.AbsVelocity.Z = 300f;
|
victimPawn.AbsVelocity.Z = 300f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
using jRandomSkills.src.utils;
|
using jRandomSkills.src.utils;
|
||||||
using CounterStrikeSharp.API.Core.Attributes;
|
using CounterStrikeSharp.API.Core.Attributes;
|
||||||
|
|
@ -13,8 +12,6 @@ namespace jRandomSkills
|
||||||
public class Chicken : ISkill
|
public class Chicken : ISkill
|
||||||
{
|
{
|
||||||
private const Skills skillName = Skills.Chicken;
|
private const Skills skillName = Skills.Chicken;
|
||||||
private static bool roundEnd = false;
|
|
||||||
private static bool exists = false;
|
|
||||||
private static readonly string[] disabledWeapons =
|
private static readonly string[] disabledWeapons =
|
||||||
[
|
[
|
||||||
"weapon_ak47", "weapon_m4a4", "weapon_m4a1", "weapon_m4a1_silencer",
|
"weapon_ak47", "weapon_m4a4", "weapon_m4a1", "weapon_m4a1_silencer",
|
||||||
|
|
@ -30,70 +27,21 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
roundEnd = false;
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
DisableSkill(player);
|
|
||||||
}
|
|
||||||
roundEnd = true;
|
|
||||||
Instance.RemoveListener<CheckTransmit>(CheckTransmit);
|
|
||||||
exists = false;
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
|
||||||
{
|
|
||||||
var player = @event.Userid;
|
|
||||||
if (player == null || !player.IsValid || player.PlayerPawn.Value == null) return HookResult.Continue;
|
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
DisableSkill(player);
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventItemPickup>((@event, info) =>
|
|
||||||
{
|
|
||||||
var player = @event.Userid;
|
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
|
||||||
SetWeaponAttack(player, true);
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundStart>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
SetWeaponAttack(player, false);
|
SetWeaponAttack(player, false);
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<OnTick>(OnTick);
|
public static void WeaponPickup(EventItemPickup @event)
|
||||||
|
{
|
||||||
|
var player = @event.Userid;
|
||||||
|
if (player == null || !player.IsValid) return;
|
||||||
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
|
if (playerInfo?.Skill != skillName) return;
|
||||||
|
SetWeaponAttack(player, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
|
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
|
||||||
|
|
@ -112,10 +60,7 @@ namespace jRandomSkills
|
||||||
var playerPawn = player.PlayerPawn?.Value;
|
var playerPawn = player.PlayerPawn?.Value;
|
||||||
if (playerPawn != null && playerPawn.IsValid)
|
if (playerPawn != null && playerPawn.IsValid)
|
||||||
{
|
{
|
||||||
if (!exists)
|
Event.enableTransmit = true;
|
||||||
Instance.RegisterListener<CheckTransmit>(CheckTransmit);
|
|
||||||
exists = true;
|
|
||||||
|
|
||||||
playerPawn.VelocityModifier = 1.1f;
|
playerPawn.VelocityModifier = 1.1f;
|
||||||
|
|
||||||
playerPawn.Health = 50;
|
playerPawn.Health = 50;
|
||||||
|
|
@ -165,7 +110,7 @@ namespace jRandomSkills
|
||||||
|
|
||||||
private static void SetWeaponAttack(CCSPlayerController player, bool disableWeapon)
|
private static void SetWeaponAttack(CCSPlayerController player, bool disableWeapon)
|
||||||
{
|
{
|
||||||
if (roundEnd || player == null || !player.IsValid) return;
|
if (player == null || !player.IsValid) return;
|
||||||
var pawn = player?.PlayerPawn?.Value;
|
var pawn = player?.PlayerPawn?.Value;
|
||||||
if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null || pawn.WeaponServices.MyWeapons == null) return;
|
if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null || pawn.WeaponServices.MyWeapons == null) return;
|
||||||
|
|
||||||
|
|
@ -200,7 +145,7 @@ namespace jRandomSkills
|
||||||
Instance.AddTimer(1f, () => chickens.TryAdd(player, chickenModel));
|
Instance.AddTimer(1f, () => chickens.TryAdd(player, chickenModel));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnTick()
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
foreach (var valuePair in chickens)
|
foreach (var valuePair in chickens)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -14,18 +14,17 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventBombBeginplant>((@event, info) =>
|
public static void BombBeginplant(EventBombBeginplant @event)
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
|
if (!Instance.IsPlayerValid(player)) return;
|
||||||
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
|
|
||||||
|
|
||||||
var anyChillOut = Instance.SkillPlayer.FirstOrDefault(p => p.Skill == skillName);
|
var anyChillOut = Instance.SkillPlayer.FirstOrDefault(p => p.Skill == skillName);
|
||||||
if (anyChillOut != null)
|
if (anyChillOut != null)
|
||||||
{
|
{
|
||||||
var bombEntities = Utilities.FindAllEntitiesByDesignerName<CC4>("weapon_c4").ToList();
|
var bombEntities = Utilities.FindAllEntitiesByDesignerName<CC4>("weapon_c4").ToList();
|
||||||
|
|
||||||
if (bombEntities.Count != 0)
|
if (bombEntities.Count != 0)
|
||||||
{
|
{
|
||||||
var bomb = bombEntities.FirstOrDefault();
|
var bomb = bombEntities.FirstOrDefault();
|
||||||
|
|
@ -33,9 +32,6 @@ namespace jRandomSkills
|
||||||
bomb.ArmedTime = Server.CurrentTime + bombArmedTime;
|
bomb.ArmedTime = Server.CurrentTime + bombArmedTime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#343deb", CsTeam onlyTeam = CsTeam.CounterTerrorist, bool needsTeammates = false, float bombArmedTime = 10f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#343deb", CsTeam onlyTeam = CsTeam.CounterTerrorist, bool needsTeammates = false, float bombArmedTime = 10f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
|
|
||||||
|
|
@ -12,23 +12,21 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
|
public static void PlayerHurt(EventPlayerHurt @event)
|
||||||
{
|
{
|
||||||
var damage = @event.DmgHealth;
|
var damage = @event.DmgHealth;
|
||||||
var attacker = @event.Attacker;
|
var attacker = @event.Attacker;
|
||||||
var victim = @event.Userid;
|
var victim = @event.Userid;
|
||||||
var weapon = @event.Weapon;
|
var weapon = @event.Weapon;
|
||||||
|
|
||||||
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return;
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
if (playerInfo?.Skill != skillName) return;
|
||||||
|
|
||||||
if (weapon == "knife")
|
if (weapon == "knife")
|
||||||
SkillUtils.TakeHealth(victim!.PlayerPawn.Value, 9999);
|
SkillUtils.TakeHealth(victim!.PlayerPawn.Value, 9999);
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#88a31a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#88a31a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using jRandomSkills.src.utils;
|
using jRandomSkills.src.utils;
|
||||||
using System.Collections.Generic;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -18,40 +17,33 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in defaultPostProcessings.Keys)
|
foreach (var player in defaultPostProcessings.Keys)
|
||||||
DisableSkill(player);
|
DisableSkill(player);
|
||||||
foreach (var postProcessing in newPostProcessing)
|
foreach (var postProcessing in newPostProcessing)
|
||||||
postProcessing.Remove();
|
postProcessing.Remove();
|
||||||
newPostProcessing.Clear();
|
newPostProcessing.Clear();
|
||||||
return HookResult.Continue;
|
foreach (var player in Utilities.GetPlayers())
|
||||||
});
|
SkillUtils.CloseMenu(player);
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
if (Server.TickCount % 32 != 0) return;
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
foreach (var player in Utilities.GetPlayers())
|
||||||
SetUpPostProcessing(player, true);
|
{
|
||||||
return HookResult.Continue;
|
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();
|
||||||
|
|
||||||
|
HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
|
||||||
|
SkillUtils.UpdateMenu(player, menuItems);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
||||||
|
|
@ -87,23 +79,20 @@ namespace jRandomSkills
|
||||||
if (playerInfo == null) return;
|
if (playerInfo == null) return;
|
||||||
playerInfo.SkillChance = 0;
|
playerInfo.SkillChance = 0;
|
||||||
|
|
||||||
SkillUtils.PrintToChat(player, Localization.GetTranslation("darkness") + ":", 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();
|
||||||
|
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("darkness_select_info")}");
|
|
||||||
var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).ToArray();
|
|
||||||
if (enemies.Length > 0)
|
if (enemies.Length > 0)
|
||||||
{
|
{
|
||||||
foreach (var enemy in enemies)
|
HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
|
||||||
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}");
|
SkillUtils.CreateMenu(player, menuItems);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DisableSkill(CCSPlayerController player)
|
public static void DisableSkill(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
SetUpPostProcessing(player, true);
|
SetUpPostProcessing(player, true);
|
||||||
|
SkillUtils.CloseMenu(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void SetUpPostProcessing(CCSPlayerController player, bool dontCreateNew = false)
|
private static void SetUpPostProcessing(CCSPlayerController player, bool dontCreateNew = false)
|
||||||
|
|
|
||||||
|
|
@ -13,34 +13,39 @@ namespace jRandomSkills
|
||||||
|
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
public static void NewRound()
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
SkillUtils.CloseMenu(player);
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void OnTick()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
|
if (Server.TickCount % 32 != 0) return;
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
|
if (!SkillUtils.HasMenu(player)) continue;
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
DisableSkill(player);
|
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();
|
||||||
|
if (enemies.Length > 0)
|
||||||
|
{
|
||||||
|
HashSet<(string, string)> menuItems = [];
|
||||||
|
foreach (var enemy in enemies)
|
||||||
|
{
|
||||||
|
var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID);
|
||||||
|
if (enemyInfo == null) continue;
|
||||||
|
var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill);
|
||||||
|
if (skillData == null) continue;
|
||||||
|
menuItems.Add(($"{enemy.PlayerName} : {skillData.Name}", enemy.Index.ToString()));
|
||||||
|
}
|
||||||
|
SkillUtils.CreateMenu(player, menuItems);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
||||||
|
|
@ -68,24 +73,22 @@ namespace jRandomSkills
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
SkillUtils.PrintToChat(player, Localization.GetTranslation("deactivator") + ":", 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();
|
||||||
|
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("deactivator_select_info")}");
|
|
||||||
var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).ToArray();
|
|
||||||
if (enemies.Length > 0)
|
if (enemies.Length > 0)
|
||||||
{
|
{
|
||||||
|
HashSet<(string, string)> menuItems = [];
|
||||||
foreach (var enemy in enemies)
|
foreach (var enemy in enemies)
|
||||||
{
|
{
|
||||||
var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID);
|
var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID);
|
||||||
if (enemyInfo == null) continue;
|
if (enemyInfo == null) continue;
|
||||||
var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill);
|
var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill);
|
||||||
if (skillData == null) continue;
|
if (skillData == null) continue;
|
||||||
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}: {ChatColors.Red}{skillData.Name}");
|
menuItems.Add(($"{enemy.PlayerName} : {skillData.Name}", enemy.Index.ToString()));
|
||||||
}
|
}
|
||||||
|
SkillUtils.CreateMenu(player, menuItems);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DisableSkill(CCSPlayerController player)
|
public static void DisableSkill(CCSPlayerController player)
|
||||||
|
|
@ -93,6 +96,7 @@ namespace jRandomSkills
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (playerInfo == null) return;
|
if (playerInfo == null) return;
|
||||||
playerInfo.SpecialSkill = Skills.None;
|
playerInfo.SpecialSkill = Skills.None;
|
||||||
|
SkillUtils.CloseMenu(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void DeacitvateSkill(CCSPlayerController player, CCSPlayerController enemy)
|
private static void DeacitvateSkill(CCSPlayerController player, CCSPlayerController enemy)
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
|
using CounterStrikeSharp.API.Modules.UserMessages;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using jRandomSkills.src.utils;
|
using jRandomSkills.src.utils;
|
||||||
|
|
@ -14,50 +15,38 @@ namespace jRandomSkills
|
||||||
|
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
deafPlayers.Clear();
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
|
||||||
{
|
|
||||||
var player = @event.Userid;
|
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
|
||||||
DisableSkill(player);
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in deafPlayers)
|
foreach (var player in deafPlayers)
|
||||||
DisableSkill(player);
|
DisableSkill(player);
|
||||||
return HookResult.Continue;
|
deafPlayers.Clear();
|
||||||
});
|
foreach (var player in Utilities.GetPlayers())
|
||||||
|
SkillUtils.CloseMenu(player);
|
||||||
|
}
|
||||||
|
|
||||||
Instance.HookUserMessage(208, um =>
|
public static void PlayerMakeSound(UserMessage um)
|
||||||
{
|
{
|
||||||
var soundevent = um.ReadUInt("soundevent_hash");
|
|
||||||
var userIndex = um.ReadUInt("source_entity_index");
|
|
||||||
|
|
||||||
foreach (var player in deafPlayers)
|
foreach (var player in deafPlayers)
|
||||||
um.Recipients.Remove(player);
|
um.Recipients.Remove(player);
|
||||||
|
}
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void OnTick()
|
||||||
}, HookMode.Pre);
|
{
|
||||||
|
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();
|
||||||
|
|
||||||
|
HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
|
||||||
|
SkillUtils.UpdateMenu(player, menuItems);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
||||||
|
|
@ -93,23 +82,20 @@ namespace jRandomSkills
|
||||||
if (playerInfo == null) return;
|
if (playerInfo == null) return;
|
||||||
playerInfo.SkillChance = 0;
|
playerInfo.SkillChance = 0;
|
||||||
|
|
||||||
SkillUtils.PrintToChat(player, Localization.GetTranslation("deaf") + ":", 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();
|
||||||
|
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("deaf_select_info")}");
|
|
||||||
var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).ToArray();
|
|
||||||
if (enemies.Length > 0)
|
if (enemies.Length > 0)
|
||||||
{
|
{
|
||||||
foreach (var enemy in enemies)
|
HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
|
||||||
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}");
|
SkillUtils.CreateMenu(player, menuItems);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DisableSkill(CCSPlayerController player)
|
public static void DisableSkill(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
deafPlayers.Remove(player);
|
deafPlayers.Remove(player);
|
||||||
|
SkillUtils.CloseMenu(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#dae01f", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#dae01f", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
using CounterStrikeSharp.API;
|
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
|
|
@ -14,38 +13,22 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void PlayerHurt(EventPlayerHurt @event)
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
var attacker = @event.Attacker;
|
var attacker = @event.Attacker;
|
||||||
var victim = @event.Userid;
|
var victim = @event.Userid;
|
||||||
|
|
||||||
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return;
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
||||||
|
|
||||||
if (playerInfo?.Skill == skillName && victim!.PawnIsAlive)
|
if (playerInfo?.Skill == skillName && victim!.PawnIsAlive)
|
||||||
{
|
{
|
||||||
if (Instance.Random.NextDouble() <= playerInfo.SkillChance)
|
if (Instance.Random.NextDouble() <= playerInfo?.SkillChance)
|
||||||
{
|
{
|
||||||
var weaponServices = victim.PlayerPawn?.Value?.WeaponServices;
|
var weaponServices = victim.PlayerPawn?.Value?.WeaponServices;
|
||||||
if (weaponServices?.ActiveWeapon == null) return HookResult.Continue;
|
if (weaponServices?.ActiveWeapon == null) return;
|
||||||
|
|
||||||
var weaponName = weaponServices?.ActiveWeapon?.Value?.DesignerName;
|
var weaponName = weaponServices?.ActiveWeapon?.Value?.DesignerName;
|
||||||
if (weaponName != null && !weaponName.Contains("weapon_knife") && !weaponName.Contains("weapon_c4"))
|
if (weaponName != null && !weaponName.Contains("weapon_knife") && !weaponName.Contains("weapon_c4"))
|
||||||
|
|
@ -53,8 +36,6 @@ namespace jRandomSkills
|
||||||
//victim.DropActiveWeapon();
|
//victim.DropActiveWeapon();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using jRandomSkills.src.utils;
|
using jRandomSkills.src.utils;
|
||||||
using static jRandomSkills.jRandomSkills;
|
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
{
|
{
|
||||||
|
|
@ -15,34 +14,14 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
foreach (var player in distancerPlayers)
|
|
||||||
DisableSkill(player);
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<Listeners.OnTick>(OnTick);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnTick()
|
public static void NewRound()
|
||||||
|
{
|
||||||
|
distancerPlayers.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
foreach (var player in distancerPlayers)
|
foreach (var player in distancerPlayers)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -14,23 +14,19 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
|
public static void PlayerHurt(EventPlayerHurt @event)
|
||||||
{
|
{
|
||||||
var attacker = @event.Attacker;
|
var attacker = @event.Attacker;
|
||||||
var victim = @event.Userid;
|
var victim = @event.Userid;
|
||||||
|
|
||||||
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return;
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
||||||
|
|
||||||
if (playerInfo?.Skill == skillName && victim!.PawnIsAlive)
|
if (playerInfo?.Skill == skillName && victim!.PawnIsAlive)
|
||||||
{
|
|
||||||
HealAttacker(attacker!, @event.DmgHealth);
|
HealAttacker(attacker!, @event.DmgHealth);
|
||||||
}
|
}
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void HealAttacker(CCSPlayerController attacker, float damage)
|
private static void HealAttacker(CCSPlayerController attacker, float damage)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -13,23 +13,39 @@ namespace jRandomSkills
|
||||||
|
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
public static void NewRound()
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
SkillUtils.CloseMenu(player);
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
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 != player && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||||
|
if (enemies.Length > 0)
|
||||||
|
{
|
||||||
|
HashSet<(string, string)> menuItems = [];
|
||||||
|
foreach (var enemy in enemies)
|
||||||
|
{
|
||||||
|
var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID);
|
||||||
|
if (enemyInfo == null) continue;
|
||||||
|
var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill);
|
||||||
|
if (skillData == null) continue;
|
||||||
|
menuItems.Add(($"{enemy.PlayerName} : {skillData.Name}", enemy.Index.ToString()));
|
||||||
|
}
|
||||||
|
SkillUtils.CreateMenu(player, menuItems);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
||||||
|
|
@ -57,24 +73,22 @@ namespace jRandomSkills
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
SkillUtils.PrintToChat(player, Localization.GetTranslation("duplicator") + ":", false);
|
var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p != player && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
|
||||||
|
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("duplicator_select_info")}");
|
|
||||||
var enemies = Utilities.GetPlayers().Where(p => p != player && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).ToArray();
|
|
||||||
if (enemies.Length > 0)
|
if (enemies.Length > 0)
|
||||||
{
|
{
|
||||||
|
HashSet<(string, string)> menuItems = [];
|
||||||
foreach (var enemy in enemies)
|
foreach (var enemy in enemies)
|
||||||
{
|
{
|
||||||
var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID);
|
var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID);
|
||||||
if (enemyInfo == null) continue;
|
if (enemyInfo == null) continue;
|
||||||
var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill);
|
var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill);
|
||||||
if (skillData == null) continue;
|
if (skillData == null) continue;
|
||||||
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}: {ChatColors.Red}{skillData.Name}");
|
menuItems.Add(($"{enemy.PlayerName} : {skillData.Name}", enemy.Index.ToString()));
|
||||||
}
|
}
|
||||||
|
SkillUtils.CreateMenu(player, menuItems);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DisableSkill(CCSPlayerController player)
|
public static void DisableSkill(CCSPlayerController player)
|
||||||
|
|
@ -82,6 +96,7 @@ namespace jRandomSkills
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (playerInfo == null) return;
|
if (playerInfo == null) return;
|
||||||
playerInfo.SpecialSkill = Skills.None;
|
playerInfo.SpecialSkill = Skills.None;
|
||||||
|
SkillUtils.CloseMenu(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void DuplicateSkill(CCSPlayerController player, CCSPlayerController enemy)
|
private static void DuplicateSkill(CCSPlayerController player, CCSPlayerController enemy)
|
||||||
|
|
@ -90,11 +105,13 @@ namespace jRandomSkills
|
||||||
var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID);
|
var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID);
|
||||||
|
|
||||||
if (playerInfo != null && enemyInfo != null)
|
if (playerInfo != null && enemyInfo != null)
|
||||||
|
{
|
||||||
|
Instance.AddTimer(.1f, () =>
|
||||||
{
|
{
|
||||||
playerInfo.Skill = enemyInfo.Skill;
|
playerInfo.Skill = enemyInfo.Skill;
|
||||||
playerInfo.SpecialSkill = skillName;
|
playerInfo.SpecialSkill = skillName;
|
||||||
Instance.SkillAction(enemyInfo.Skill.ToString(), "EnableSkill", [player]);
|
Instance.SkillAction(enemyInfo.Skill.ToString(), "EnableSkill", [player]);
|
||||||
|
});
|
||||||
player.PrintToChat($" {ChatColors.Green}" + Localization.GetTranslation("duplicator_player_info", enemy.PlayerName));
|
player.PrintToChat($" {ChatColors.Green}" + Localization.GetTranslation("duplicator_player_info", enemy.PlayerName));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,49 +14,18 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
player.Respawn();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
if (!Instance.IsPlayerValid(player)) continue;
|
||||||
DisableSkill(player);
|
DisableSkill(player);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
|
||||||
{
|
|
||||||
var player = @event.Userid;
|
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
|
||||||
DisableSkill(player);
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static unsafe void EnableSkill(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
var playerPawn = player.PlayerPawn?.Value;
|
var playerPawn = player.PlayerPawn?.Value;
|
||||||
if (playerPawn != null && player.IsValid)
|
if (playerPawn != null && player.IsValid)
|
||||||
|
|
@ -67,6 +36,7 @@ namespace jRandomSkills
|
||||||
// playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().Scale = newSize;
|
// playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().Scale = newSize;
|
||||||
if (playerPawn.CBodyComponent == null || playerPawn.CBodyComponent.SceneNode == null) return;
|
if (playerPawn.CBodyComponent == null || playerPawn.CBodyComponent.SceneNode == null) return;
|
||||||
playerPawn.CBodyComponent.SceneNode.Scale = newSize;
|
playerPawn.CBodyComponent.SceneNode.Scale = newSize;
|
||||||
|
|
||||||
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent");
|
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent");
|
||||||
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("dwarf")}{ChatColors.Lime}: " + Localization.GetTranslation("dwarf_desc2", newSize), false);
|
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("dwarf")}{ChatColors.Lime}: " + Localization.GetTranslation("dwarf_desc2", newSize), false);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using jRandomSkills.src.utils;
|
using jRandomSkills.src.utils;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -17,43 +16,14 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) return;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
{
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
SkillPlayerInfo.Clear();
|
SkillPlayerInfo.Clear();
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
public static void OnTick()
|
||||||
{
|
|
||||||
var player = @event.Userid;
|
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
SkillPlayerInfo.Remove(player.SteamID);
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<OnTick>(() =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
|
|
@ -62,7 +32,6 @@ namespace jRandomSkills
|
||||||
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
|
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
|
||||||
UpdateHUD(player, skillInfo);
|
UpdateHUD(player, skillInfo);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Memory;
|
|
||||||
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
|
|
@ -18,24 +17,6 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
@ -65,28 +46,27 @@ namespace jRandomSkills
|
||||||
heProjectile.DetonateTime = 0;
|
heProjectile.DetonateTime = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static HookResult OnTakeDamage(DynamicHook h)
|
public static void OnTakeDamage(DynamicHook h)
|
||||||
{
|
{
|
||||||
CEntityInstance param = h.GetParam<CEntityInstance>(0);
|
CEntityInstance param = h.GetParam<CEntityInstance>(0);
|
||||||
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
|
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
|
||||||
|
|
||||||
if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null)
|
if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null)
|
||||||
return HookResult.Continue;
|
return;
|
||||||
|
|
||||||
CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle);
|
CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle);
|
||||||
if (attackerPawn.DesignerName != "player")
|
if (attackerPawn.DesignerName != "player")
|
||||||
return HookResult.Continue;
|
return;
|
||||||
|
|
||||||
if (attackerPawn == null || attackerPawn.Controller?.Value == null)
|
if (attackerPawn == null || attackerPawn.Controller?.Value == null)
|
||||||
return HookResult.Continue;
|
return;
|
||||||
|
|
||||||
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
|
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
|
||||||
if (playerInfo == null || playerInfo.Skill != skillName) return HookResult.Continue;
|
if (playerInfo == null || playerInfo.Skill != skillName) return;
|
||||||
|
|
||||||
if (Instance.Random.NextDouble() <= playerInfo.SkillChance)
|
if (Instance.Random.NextDouble() <= playerInfo.SkillChance)
|
||||||
SpawnExplosion(param2.DamagePosition);
|
SpawnExplosion(param2.DamagePosition);
|
||||||
return HookResult.Continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#9c0000", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float damage = 10f, float damageRadius = 190f, float chanceFrom = .15f, float chanceTo = .3f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#9c0000", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float damage = 10f, float damageRadius = 190f, float chanceFrom = .15f, float chanceTo = .3f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
|
|
||||||
|
|
@ -10,56 +10,40 @@ namespace jRandomSkills
|
||||||
public class FalconEye : ISkill
|
public class FalconEye : ISkill
|
||||||
{
|
{
|
||||||
private const Skills skillName = Skills.FalconEye;
|
private const Skills skillName = Skills.FalconEye;
|
||||||
private static bool blocked = false;
|
|
||||||
private static readonly float distance = Config.GetValue<float>(skillName, "distance");
|
private static readonly float distance = Config.GetValue<float>(skillName, "distance");
|
||||||
private static readonly Dictionary<ulong, (uint, CDynamicProp)> cameras = [];
|
private static readonly Dictionary<ulong, (uint, CDynamicProp)> cameras = [];
|
||||||
|
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
public static void NewRound()
|
||||||
{
|
{
|
||||||
blocked = true;
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
if (cameras.TryGetValue(player.SteamID, out _))
|
|
||||||
DisableSkill(player);
|
|
||||||
|
|
||||||
foreach (var camera in cameras)
|
foreach (var camera in cameras)
|
||||||
camera.Value.Item2.Remove();
|
camera.Value.Item2.Remove();
|
||||||
cameras.Clear();
|
cameras.Clear();
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
public static void WeaponPickup(EventItemPickup @event)
|
||||||
{
|
|
||||||
blocked = false;
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventItemPickup>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(player)) return;
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
if (playerInfo?.Skill != skillName) return ;
|
||||||
|
|
||||||
var pawn = player!.PlayerPawn.Value;
|
var pawn = player!.PlayerPawn.Value;
|
||||||
if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return HookResult.Continue;
|
if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return;
|
||||||
|
|
||||||
if (cameras.TryGetValue(player!.SteamID, out var cameraInfo) && cameraInfo.Item1 == pawn.CameraServices.ViewEntity.Raw)
|
if (cameras.TryGetValue(player!.SteamID, out var cameraInfo) && cameraInfo.Item1 == pawn.CameraServices.ViewEntity.Raw)
|
||||||
BlockWeapon(player, true);
|
BlockWeapon(player, true);
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<Listeners.OnTick>(OnTick);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void UseSkill(CCSPlayerController player)
|
public static void UseSkill(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
var playerPawn = player.PlayerPawn.Value;
|
var playerPawn = player.PlayerPawn.Value;
|
||||||
if (playerPawn?.CBodyComponent == null || blocked) return;
|
if (playerPawn?.CBodyComponent == null) return;
|
||||||
ChangeCamera(player);
|
ChangeCamera(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -68,7 +52,7 @@ namespace jRandomSkills
|
||||||
ChangeCamera(player, true);
|
ChangeCamera(player, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnTick()
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item2.IsValid)
|
if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item2.IsValid)
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
|
using CounterStrikeSharp.API.Modules.UserMessages;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using jRandomSkills.src.utils;
|
using jRandomSkills.src.utils;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -15,50 +15,24 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
||||||
Instance.RegisterListener<OnTick>(UpdateSpeed);
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerPawn = player.PlayerPawn.Value;
|
|
||||||
if (playerPawn == null || !playerPawn.IsValid) continue;
|
|
||||||
|
|
||||||
playerPawn.VelocityModifier = 1;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void PlayerMakeSound(UserMessage um)
|
||||||
});
|
|
||||||
|
|
||||||
Instance.HookUserMessage(208, um =>
|
|
||||||
{
|
{
|
||||||
var soundevent = um.ReadUInt("soundevent_hash");
|
var soundevent = um.ReadUInt("soundevent_hash");
|
||||||
var userIndex = um.ReadUInt("source_entity_index");
|
var userIndex = um.ReadUInt("source_entity_index");
|
||||||
|
|
||||||
if (userIndex == 0) return HookResult.Continue;
|
if (userIndex == 0) return;
|
||||||
if (!Instance.footstepSoundEvents.Contains(soundevent)) return HookResult.Continue;
|
if (!Instance.footstepSoundEvents.Contains(soundevent)) return;
|
||||||
|
|
||||||
var player = Utilities.GetPlayers().FirstOrDefault(p => p.Pawn?.Value != null && p.Pawn.Value.IsValid && p.Pawn.Value.Index == userIndex);
|
var player = Utilities.GetPlayers().FirstOrDefault(p => p.Pawn?.Value != null && p.Pawn.Value.IsValid && p.Pawn.Value.Index == userIndex);
|
||||||
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(player)) return;
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
if (playerInfo?.Skill != skillName) return;
|
||||||
|
|
||||||
if (player!.Buttons.HasFlag(PlayerButtons.Speed) || player.Buttons.HasFlag(PlayerButtons.Duck))
|
if (player!.Buttons.HasFlag(PlayerButtons.Speed) || player.Buttons.HasFlag(PlayerButtons.Duck))
|
||||||
{
|
|
||||||
um.Recipients.Clear();
|
um.Recipients.Clear();
|
||||||
return HookResult.Handled;
|
|
||||||
}
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
}, HookMode.Pre);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
@ -85,7 +59,7 @@ namespace jRandomSkills
|
||||||
playerPawn.VelocityModifier = 1;
|
playerPawn.VelocityModifier = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void UpdateSpeed()
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Memory;
|
|
||||||
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
|
|
@ -23,41 +22,16 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
||||||
|
Instance.RegisterListener<OnServerPrecacheResources>((ResourceManifest manifest) => manifest.AddResource(propModel));
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) return;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
SkillPlayerInfo.Clear();
|
SkillPlayerInfo.Clear();
|
||||||
barricades.Clear();
|
barricades.Clear();
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
public static void OnTick()
|
||||||
{
|
|
||||||
var player = @event.Userid;
|
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
SkillPlayerInfo.Remove(player.SteamID);
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<OnTick>(() =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
|
|
@ -66,14 +40,6 @@ namespace jRandomSkills
|
||||||
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
|
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
|
||||||
UpdateHUD(player, skillInfo);
|
UpdateHUD(player, skillInfo);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<OnServerPrecacheResources>((ResourceManifest manifest) =>
|
|
||||||
{
|
|
||||||
manifest.AddResource(propModel);
|
|
||||||
});
|
|
||||||
|
|
||||||
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
@ -153,19 +119,19 @@ namespace jRandomSkills
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static HookResult OnTakeDamage(DynamicHook h)
|
public static void OnTakeDamage(DynamicHook h)
|
||||||
{
|
{
|
||||||
CEntityInstance param = h.GetParam<CEntityInstance>(0);
|
CEntityInstance param = h.GetParam<CEntityInstance>(0);
|
||||||
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
|
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
|
||||||
|
|
||||||
if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null)
|
if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null)
|
||||||
return HookResult.Continue;
|
return;
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(param.Entity.Name)) return HookResult.Continue;
|
if (string.IsNullOrEmpty(param.Entity.Name)) return;
|
||||||
if (!param.Entity.Name.StartsWith("FortniteWall")) return HookResult.Continue;
|
if (!param.Entity.Name.StartsWith("FortniteWall")) return;
|
||||||
|
|
||||||
var box = param.As<CDynamicProp>();
|
var box = param.As<CDynamicProp>();
|
||||||
if (box == null || !box.IsValid) return HookResult.Continue;
|
if (box == null || !box.IsValid) return;
|
||||||
box.EmitSound("Wood_Plank.BulletImpact", volume: 1f);
|
box.EmitSound("Wood_Plank.BulletImpact", volume: 1f);
|
||||||
|
|
||||||
if (barricades.TryGetValue(box.Index, out int health))
|
if (barricades.TryGetValue(box.Index, out int health))
|
||||||
|
|
@ -175,7 +141,6 @@ namespace jRandomSkills
|
||||||
if (health <= 0) box.Remove();
|
if (health <= 0) box.Remove();
|
||||||
}
|
}
|
||||||
else box.Remove();
|
else box.Remove();
|
||||||
return HookResult.Continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class PlayerSkillInfo
|
public class PlayerSkillInfo
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
||||||
using CounterStrikeSharp.API.Modules.Memory;
|
|
||||||
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
|
|
@ -22,25 +21,21 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
public static void NewRound()
|
||||||
{
|
{
|
||||||
bombHealth = maxBombHealth;
|
bombHealth = maxBombHealth;
|
||||||
plantedC4 = null;
|
plantedC4 = null;
|
||||||
triggerC4 = null;
|
triggerC4 = null;
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventBombPlanted>((@event, info) =>
|
public static void BombPlanted(EventBombPlanted _)
|
||||||
{
|
{
|
||||||
var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault();
|
var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault();
|
||||||
if (plantedBomb == null) return HookResult.Continue;
|
if (plantedBomb == null) return;
|
||||||
plantedC4 = plantedBomb;
|
plantedC4 = plantedBomb;
|
||||||
CreateTrigger();
|
CreateTrigger();
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void CreateTrigger()
|
private static void CreateTrigger()
|
||||||
|
|
@ -82,38 +77,37 @@ namespace jRandomSkills
|
||||||
SkillUtils.TerminateRound(CsTeam.CounterTerrorist);
|
SkillUtils.TerminateRound(CsTeam.CounterTerrorist);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static HookResult OnTakeDamage(DynamicHook h)
|
public static void OnTakeDamage(DynamicHook h)
|
||||||
{
|
{
|
||||||
CEntityInstance param = h.GetParam<CEntityInstance>(0);
|
CEntityInstance param = h.GetParam<CEntityInstance>(0);
|
||||||
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
|
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
|
||||||
|
|
||||||
if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null)
|
if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null)
|
||||||
return HookResult.Continue;
|
return;
|
||||||
|
|
||||||
CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle);
|
CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle);
|
||||||
|
|
||||||
if (attackerPawn.DesignerName != "player" || param.DesignerName != "trigger_multiple")
|
if (attackerPawn.DesignerName != "player" || param.DesignerName != "trigger_multiple")
|
||||||
return HookResult.Continue;
|
return;
|
||||||
|
|
||||||
CTriggerMultiple trigger = new(param.Handle);
|
CTriggerMultiple trigger = new(param.Handle);
|
||||||
|
|
||||||
if (attackerPawn == null || attackerPawn.Controller?.Value == null || trigger == null || !trigger.Globalname.StartsWith("planted_bomb_prop_"))
|
if (attackerPawn == null || attackerPawn.Controller?.Value == null || trigger == null || !trigger.Globalname.StartsWith("planted_bomb_prop_"))
|
||||||
return HookResult.Continue;
|
return;
|
||||||
|
|
||||||
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
|
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
|
||||||
if (playerInfo == null || playerInfo.Skill != skillName) return HookResult.Continue;
|
if (playerInfo == null || playerInfo.Skill != skillName) return;
|
||||||
|
|
||||||
bombHealth -= (int)param2.TotalledDamage;
|
bombHealth -= (int)param2.TotalledDamage;
|
||||||
if (bombHealth <= 0)
|
if (bombHealth <= 0)
|
||||||
{
|
{
|
||||||
RemoveBomb();
|
RemoveBomb();
|
||||||
return HookResult.Continue;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Server.PrintToChatAll($" {ChatColors.Gold}{Localization.GetTranslation("fragilebomb_bomb_health")}: {ChatColors.Red}{bombHealth}{ChatColors.Gold}/{ChatColors.Green}{maxBombHealth}");
|
Server.PrintToChatAll($" {ChatColors.Gold}{Localization.GetTranslation("fragilebomb_bomb_health")}: {ChatColors.Red}{bombHealth}{ChatColors.Gold}/{ChatColors.Green}{maxBombHealth}");
|
||||||
return HookResult.Continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#5d00ff", CsTeam onlyTeam = CsTeam.CounterTerrorist, bool needsTeammates = false, int maxBombHealth = 1000) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#5d00ff", CsTeam onlyTeam = CsTeam.CounterTerrorist, bool needsTeammates = false, int maxBombHealth = 1000) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,9 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
|
public static void PlayerHurt(EventPlayerHurt @event)
|
||||||
{
|
{
|
||||||
var damage = @event.DmgHealth;
|
var damage = @event.DmgHealth;
|
||||||
var victim = @event.Userid;
|
var victim = @event.Userid;
|
||||||
|
|
@ -24,20 +25,17 @@ namespace jRandomSkills
|
||||||
var weapon = @event.Weapon;
|
var weapon = @event.Weapon;
|
||||||
HitGroup_t hitgroup = (HitGroup_t)@event.Hitgroup;
|
HitGroup_t hitgroup = (HitGroup_t)@event.Hitgroup;
|
||||||
|
|
||||||
if (nades.Contains(weapon)) return HookResult.Continue;
|
if (nades.Contains(weapon)) return;
|
||||||
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return;
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
||||||
if (playerInfo?.Skill != skillName || attacker!.Team != victim!.Team) return HookResult.Continue;
|
if (playerInfo?.Skill != skillName || attacker!.Team != victim!.Team) return;
|
||||||
|
|
||||||
Server.ExecuteCommand("mp_autokick 0");
|
Server.ExecuteCommand("mp_autokick 0");
|
||||||
|
|
||||||
var pawn = victim.PlayerPawn.Value;
|
var pawn = victim.PlayerPawn.Value;
|
||||||
if (pawn == null || !pawn.IsValid) return HookResult.Continue;
|
if (pawn == null || !pawn.IsValid) return;
|
||||||
SkillUtils.AddHealth(pawn, damage + (int)(damage * healthMultiplier), pawn.MaxHealth);
|
SkillUtils.AddHealth(pawn, damage + (int)(damage * healthMultiplier), pawn.MaxHealth);
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff0000", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = true, float healthMultiplier = 1.5f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff0000", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = true, float healthMultiplier = 1.5f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -18,53 +17,35 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundStart>((@event, info) =>
|
public static void NewRound()
|
||||||
{
|
{
|
||||||
decoys.Clear();
|
decoys.Clear();
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void DecoyStarted(EventDecoyStarted @event)
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventDecoyStarted>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
if (player == null || !player.IsValid) return;
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
if (playerInfo?.Skill != skillName) return;
|
||||||
decoys.Add(new Vector(@event.X, @event.Y, @event.Z));
|
decoys.Add(new Vector(@event.X, @event.Y, @event.Z));
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventDecoyDetonate>((@event, @info) =>
|
public static void DecoyDetonate(EventDecoyDetonate @event)
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
if (player == null || !player.IsValid) return;
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
if (playerInfo?.Skill != skillName) return;
|
||||||
decoys.RemoveAll(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z);
|
decoys.RemoveAll(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z);
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<OnTick>(() =>
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
foreach (Vector decoyPos in decoys)
|
foreach (Vector decoyPos in decoys)
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers().Where(p => p.Team == CsTeam.Terrorist || p.Team == CsTeam.CounterTerrorist))
|
||||||
{
|
{
|
||||||
var pawn = player.PlayerPawn.Value;
|
var pawn = player.PlayerPawn.Value;
|
||||||
if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return;
|
if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return;
|
||||||
|
|
@ -75,7 +56,6 @@ namespace jRandomSkills
|
||||||
pawn.VelocityModifier = (float)Math.Pow(modifier, slownessMultiplier);
|
pawn.VelocityModifier = (float)Math.Pow(modifier, slownessMultiplier);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
112
jRandomSkills - SRC Files/src/player/skills/Gambler.cs
Normal file
112
jRandomSkills - SRC Files/src/player/skills/Gambler.cs
Normal file
|
|
@ -0,0 +1,112 @@
|
||||||
|
using CounterStrikeSharp.API;
|
||||||
|
using CounterStrikeSharp.API.Core;
|
||||||
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
|
using jRandomSkills.src.player;
|
||||||
|
using jRandomSkills.src.utils;
|
||||||
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
|
namespace jRandomSkills
|
||||||
|
{
|
||||||
|
public class Gambler : ISkill
|
||||||
|
{
|
||||||
|
private const Skills skillName = Skills.Gambler;
|
||||||
|
private static readonly int refreshPrice = Config.GetValue<int>(skillName, "refreshPrice");
|
||||||
|
|
||||||
|
public static void LoadSkill()
|
||||||
|
{
|
||||||
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void NewRound()
|
||||||
|
{
|
||||||
|
foreach (var player in Utilities.GetPlayers())
|
||||||
|
SkillUtils.CloseMenu(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
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.SkillChance == 1)
|
||||||
|
{
|
||||||
|
player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("areareaper_used_info")}");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var skill = SkillData.Skills.FirstOrDefault(s => s.Name.Equals(commands[0], StringComparison.OrdinalIgnoreCase) || s.Skill.ToString().Equals(commands[0], StringComparison.OrdinalIgnoreCase));
|
||||||
|
if (skill == null)
|
||||||
|
{
|
||||||
|
player.PrintToChat($" {ChatColors.Red}" + Localization.GetTranslation("skill_not_found_setskill"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (skill.Skill == skillName)
|
||||||
|
TakeMoney(player);
|
||||||
|
Instance.AddTimer(.1f, () =>
|
||||||
|
{
|
||||||
|
playerInfo.Skill = skill.Skill;
|
||||||
|
playerInfo.SkillChance = 1;
|
||||||
|
Instance.SkillAction(skill.Skill.ToString(), "EnableSkill", [player]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void TakeMoney(CCSPlayerController player)
|
||||||
|
{
|
||||||
|
if (player == null || !player.IsValid || player.InGameMoneyServices == null) return;
|
||||||
|
var account = player.InGameMoneyServices.Account;
|
||||||
|
player.InGameMoneyServices.Account = Math.Max(0, account - refreshPrice);
|
||||||
|
Utilities.SetStateChanged(player, "CCSPlayerController", "m_pInGameMoneyServices");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
{
|
||||||
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
|
if (playerInfo == null) return;
|
||||||
|
playerInfo.SkillChance = 0;
|
||||||
|
|
||||||
|
var skills = GetSkills(player);
|
||||||
|
var firstSkill = skills[Instance.Random.Next(skills.Count)];
|
||||||
|
skills.Remove(firstSkill);
|
||||||
|
var secondSkill = skills[Instance.Random.Next(skills.Count)];
|
||||||
|
|
||||||
|
HashSet<(string, string)> menuItems = [(firstSkill.Name, firstSkill.Skill.ToString()),
|
||||||
|
(secondSkill.Name, secondSkill.Skill.ToString()),
|
||||||
|
(Localization.GetTranslation("gambler_more"), skillName.ToString())];
|
||||||
|
SkillUtils.CreateMenu(player, menuItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void DisableSkill(CCSPlayerController player)
|
||||||
|
{
|
||||||
|
SkillUtils.CloseMenu(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<jSkill_SkillInfo> GetSkills(CCSPlayerController player)
|
||||||
|
{
|
||||||
|
var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
|
if (skillPlayer == null) return [Event.noneSkill];
|
||||||
|
|
||||||
|
List<jSkill_SkillInfo> skillList = new(SkillData.Skills);
|
||||||
|
skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None);
|
||||||
|
|
||||||
|
if (Utilities.GetPlayers().FindAll(p => p.Team == player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).Count == 1)
|
||||||
|
{
|
||||||
|
Config.DefaultSkillInfo[] skillsNeedsTeammates = Config.LoadedConfig.SkillsInfo.Where(s => s.NeedsTeammates).ToArray();
|
||||||
|
skillList.RemoveAll(s => skillsNeedsTeammates.Any(s2 => s2.Name == s.Skill.ToString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player.Team == CsTeam.Terrorist)
|
||||||
|
skillList.RemoveAll(s => Event.counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString()));
|
||||||
|
else
|
||||||
|
skillList.RemoveAll(s => Event.terroristSkills.Any(s2 => s2.Name == s.Skill.ToString()));
|
||||||
|
|
||||||
|
return skillList.Count == 0 ? [Event.noneSkill] : skillList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#7eff47", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int refreshPrice = 150) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
{
|
||||||
|
public int RefreshPrice { get; set; } = refreshPrice;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -6,7 +6,6 @@ using CounterStrikeSharp.API.Core.Attributes;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using jRandomSkills.src.utils;
|
using jRandomSkills.src.utils;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -14,8 +13,6 @@ namespace jRandomSkills
|
||||||
public class Ghost : ISkill
|
public class Ghost : ISkill
|
||||||
{
|
{
|
||||||
private const Skills skillName = Skills.Ghost;
|
private const Skills skillName = Skills.Ghost;
|
||||||
private static bool roundEnd = false;
|
|
||||||
private static bool exists = false;
|
|
||||||
private static readonly string[] disabledWeapons =
|
private static readonly string[] disabledWeapons =
|
||||||
[
|
[
|
||||||
"weapon_deagle", "weapon_revolver", "weapon_glock", "weapon_usp_silencer",
|
"weapon_deagle", "weapon_revolver", "weapon_glock", "weapon_usp_silencer",
|
||||||
|
|
@ -36,83 +33,34 @@ namespace jRandomSkills
|
||||||
return;
|
return;
|
||||||
|
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
roundEnd = false;
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
DisableSkill(player);
|
|
||||||
}
|
|
||||||
roundEnd = true;
|
|
||||||
Instance.RemoveListener<CheckTransmit>(CheckTransmit);
|
|
||||||
exists = false;
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
|
||||||
{
|
|
||||||
var player = @event.Userid;
|
|
||||||
if (player == null || !player.IsValid || player.PlayerPawn.Value == null) return HookResult.Continue;
|
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
DisableSkill(player);
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventItemPickup>((@event, info) =>
|
|
||||||
{
|
|
||||||
var player = @event.Userid;
|
|
||||||
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
|
||||||
|
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
|
||||||
SetWeaponVisibility(player!, false);
|
|
||||||
SetWeaponAttack(player!, true);
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventItemEquip>((@event, info) =>
|
|
||||||
{
|
|
||||||
var player = @event.Userid;
|
|
||||||
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
|
||||||
|
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
|
||||||
SetWeaponVisibility(player!, false);
|
|
||||||
SetWeaponAttack(player!, true);
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundStart>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
SetWeaponAttack(player, false);
|
SetWeaponAttack(player, false);
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<OnTick>(OnTick);
|
public static void WeaponPickup(EventItemPickup @event)
|
||||||
|
{
|
||||||
|
var player = @event.Userid;
|
||||||
|
if (!Instance.IsPlayerValid(player)) return;
|
||||||
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
||||||
|
|
||||||
|
if (playerInfo?.Skill != skillName) return;
|
||||||
|
SetWeaponVisibility(player!, false);
|
||||||
|
SetWeaponAttack(player!, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WeaponEquip(EventItemEquip @event)
|
||||||
|
{
|
||||||
|
var player = @event.Userid;
|
||||||
|
if (!Instance.IsPlayerValid(player)) return;
|
||||||
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
||||||
|
|
||||||
|
if (playerInfo?.Skill != skillName) return;
|
||||||
|
SetWeaponVisibility(player!, false);
|
||||||
|
SetWeaponAttack(player!, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
|
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
|
||||||
|
|
@ -129,10 +77,7 @@ namespace jRandomSkills
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
if (!exists)
|
Event.enableTransmit = true;
|
||||||
Instance.RegisterListener<CheckTransmit>(CheckTransmit);
|
|
||||||
exists = true;
|
|
||||||
|
|
||||||
SetPlayerVisibility(player, false);
|
SetPlayerVisibility(player, false);
|
||||||
SetWeaponVisibility(player, false);
|
SetWeaponVisibility(player, false);
|
||||||
SetWeaponAttack(player, true);
|
SetWeaponAttack(player, true);
|
||||||
|
|
@ -146,7 +91,7 @@ namespace jRandomSkills
|
||||||
invisibleEntities.Remove(player.SteamID);
|
invisibleEntities.Remove(player.SteamID);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnTick()
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
|
|
@ -207,7 +152,7 @@ namespace jRandomSkills
|
||||||
|
|
||||||
private static void SetWeaponAttack(CCSPlayerController player, bool disableWeapon)
|
private static void SetWeaponAttack(CCSPlayerController player, bool disableWeapon)
|
||||||
{
|
{
|
||||||
if (roundEnd || player == null || !player.IsValid) return;
|
if (player == null || !player.IsValid) return;
|
||||||
var pawn = player?.PlayerPawn?.Value;
|
var pawn = player?.PlayerPawn?.Value;
|
||||||
if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return;
|
if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,49 +11,26 @@ namespace jRandomSkills
|
||||||
public class Glaz : ISkill
|
public class Glaz : ISkill
|
||||||
{
|
{
|
||||||
private const Skills skillName = Skills.Glaz;
|
private const Skills skillName = Skills.Glaz;
|
||||||
private static bool exists = false;
|
|
||||||
private readonly static List<int> smokes = [];
|
private readonly static List<int> smokes = [];
|
||||||
|
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, @info) =>
|
|
||||||
{
|
|
||||||
smokes.Clear();
|
|
||||||
Instance.AddTimer(2f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, @info) =>
|
public static void NewRound()
|
||||||
{
|
{
|
||||||
smokes.Clear();
|
smokes.Clear();
|
||||||
Instance.RemoveListener<Listeners.CheckTransmit>(CheckTransmit);
|
}
|
||||||
exists = false;
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventSmokegrenadeDetonate>((@event, @info) =>
|
public static void SmokegrenadeDetonate(EventSmokegrenadeDetonate @event)
|
||||||
{
|
{
|
||||||
smokes.Add(@event.Entityid);
|
smokes.Add(@event.Entityid);
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventSmokegrenadeExpired>((@event, @info) =>
|
public static void SmokegrenadeExpired(EventSmokegrenadeExpired @event)
|
||||||
{
|
{
|
||||||
smokes.Remove(@event.Entityid);
|
smokes.Remove(@event.Entityid);
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
|
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
|
||||||
|
|
@ -74,9 +51,7 @@ namespace jRandomSkills
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
if (!exists)
|
Event.enableTransmit = true;
|
||||||
Instance.RegisterListener<Listeners.CheckTransmit>(CheckTransmit);
|
|
||||||
exists = true;
|
|
||||||
SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade);
|
SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,30 +14,30 @@ namespace jRandomSkills
|
||||||
|
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
public static void NewRound()
|
||||||
{
|
{
|
||||||
Instance.AddTimer(0.1f, () =>
|
glitchedPlayers.Clear();
|
||||||
|
foreach (var player in Utilities.GetPlayers())
|
||||||
|
SkillUtils.CloseMenu(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
|
if (Server.TickCount % 32 != 0) return;
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
if (!SkillUtils.HasMenu(player)) continue;
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
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();
|
||||||
|
|
||||||
|
HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
|
||||||
|
SkillUtils.UpdateMenu(player, menuItems);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
foreach (var player in glitchedPlayers)
|
|
||||||
DisableSkill(player);
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
||||||
|
|
@ -74,24 +74,21 @@ namespace jRandomSkills
|
||||||
if (playerInfo == null) return;
|
if (playerInfo == null) return;
|
||||||
playerInfo.SkillChance = 0;
|
playerInfo.SkillChance = 0;
|
||||||
|
|
||||||
SkillUtils.PrintToChat(player, Localization.GetTranslation("glitch") + ":", 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();
|
||||||
|
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("glitch_select_info")}");
|
|
||||||
var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).ToArray();
|
|
||||||
if (enemies.Length > 0)
|
if (enemies.Length > 0)
|
||||||
{
|
{
|
||||||
foreach (var enemy in enemies)
|
HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
|
||||||
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}");
|
SkillUtils.CreateMenu(player, menuItems);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DisableSkill(CCSPlayerController player)
|
public static void DisableSkill(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
player.ReplicateConVar("sv_disable_radar", "0");
|
player.ReplicateConVar("sv_disable_radar", "0");
|
||||||
glitchedPlayers.Remove(player);
|
glitchedPlayers.Remove(player);
|
||||||
|
SkillUtils.CloseMenu(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#f542ef", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#f542ef", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
|
|
||||||
|
|
@ -12,14 +12,15 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterListener<Listeners.OnEntitySpawned>(@event =>
|
public static void OnEntitySpawned(CEntityInstance entity)
|
||||||
{
|
{
|
||||||
var name = @event.DesignerName;
|
var name = entity.DesignerName;
|
||||||
if (!name.EndsWith("_projectile"))
|
if (!name.EndsWith("_projectile"))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var grenade = @event.As<CBaseCSGrenadeProjectile>();
|
var grenade = entity.As<CBaseCSGrenadeProjectile>();
|
||||||
if (grenade.OwnerEntity.Value == null || !grenade.OwnerEntity.Value.IsValid) return;
|
if (grenade.OwnerEntity.Value == null || !grenade.OwnerEntity.Value.IsValid) return;
|
||||||
|
|
||||||
var pawn = grenade.OwnerEntity.Value.As<CCSPlayerPawn>();
|
var pawn = grenade.OwnerEntity.Value.As<CCSPlayerPawn>();
|
||||||
|
|
@ -31,7 +32,6 @@ namespace jRandomSkills
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) return;
|
if (playerInfo?.Skill != skillName) return;
|
||||||
grenade.Bounces = 555;
|
grenade.Bounces = 555;
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#fff52e", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#fff52e", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using jRandomSkills.src.utils;
|
using jRandomSkills.src.utils;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -18,51 +17,11 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
{
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
SkillPlayerInfo.Clear();
|
SkillPlayerInfo.Clear();
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
|
||||||
{
|
|
||||||
var player = @event.Userid;
|
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
SkillPlayerInfo.Remove(player.SteamID);
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<OnTick>(() =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
|
|
||||||
UpdateHUD(player, skillInfo);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
@ -75,6 +34,17 @@ namespace jRandomSkills
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void OnTick()
|
||||||
|
{
|
||||||
|
foreach (var player in Utilities.GetPlayers())
|
||||||
|
{
|
||||||
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
|
if (playerInfo?.Skill == skillName)
|
||||||
|
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
|
||||||
|
UpdateHUD(player, skillInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void DisableSkill(CCSPlayerController player)
|
public static void DisableSkill(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
SkillPlayerInfo.Remove(player.SteamID);
|
SkillPlayerInfo.Remove(player.SteamID);
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -18,55 +17,37 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundStart>((@event, info) =>
|
public static void NewRound()
|
||||||
{
|
{
|
||||||
smokes.Clear();
|
smokes.Clear();
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void SmokegrenadeDetonate(EventSmokegrenadeDetonate @event)
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventSmokegrenadeDetonate>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
if (player == null || !player.IsValid) return;
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
if (playerInfo?.Skill != skillName) return;
|
||||||
smokes.Add(new Vector(@event.X, @event.Y, @event.Z));
|
smokes.Add(new Vector(@event.X, @event.Y, @event.Z));
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventSmokegrenadeExpired>((@event, @info) =>
|
public static void SmokegrenadeExpired(EventSmokegrenadeExpired @event)
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
if (player == null || !player.IsValid) return;
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
if (playerInfo?.Skill != skillName) return;
|
||||||
smokes.RemoveAll(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z);
|
smokes.RemoveAll(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z);
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<OnEntitySpawned>(@event =>
|
public static void OnEntitySpawned(CEntityInstance entity)
|
||||||
{
|
{
|
||||||
var name = @event.DesignerName;
|
var name = entity.DesignerName;
|
||||||
if (name != "smokegrenade_projectile") return;
|
if (name != "smokegrenade_projectile") return;
|
||||||
|
|
||||||
var grenade = @event.As<CBaseCSGrenadeProjectile>();
|
var grenade = entity.As<CBaseCSGrenadeProjectile>();
|
||||||
if (grenade == null || !grenade.IsValid || grenade.OwnerEntity == null || !grenade.OwnerEntity.IsValid || grenade.OwnerEntity.Value == null || !grenade.OwnerEntity.Value.IsValid) return;
|
if (grenade == null || !grenade.IsValid || grenade.OwnerEntity == null || !grenade.OwnerEntity.IsValid || grenade.OwnerEntity.Value == null || !grenade.OwnerEntity.Value.IsValid) return;
|
||||||
|
|
||||||
var pawn = grenade.OwnerEntity.Value.As<CCSPlayerPawn>();
|
var pawn = grenade.OwnerEntity.Value.As<CCSPlayerPawn>();
|
||||||
|
|
@ -80,14 +61,14 @@ namespace jRandomSkills
|
||||||
|
|
||||||
Server.NextFrame(() =>
|
Server.NextFrame(() =>
|
||||||
{
|
{
|
||||||
var smoke = @event.As<CSmokeGrenadeProjectile>();
|
var smoke = entity.As<CSmokeGrenadeProjectile>();
|
||||||
smoke.SmokeColor.X = 0;
|
smoke.SmokeColor.X = 0;
|
||||||
smoke.SmokeColor.Y = 255;
|
smoke.SmokeColor.Y = 255;
|
||||||
smoke.SmokeColor.Z = 0;
|
smoke.SmokeColor.Z = 0;
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
|
|
||||||
Instance.RegisterListener<OnTick>(() =>
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
foreach (Vector smokePos in smokes)
|
foreach (Vector smokePos in smokes)
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
|
|
@ -95,7 +76,6 @@ namespace jRandomSkills
|
||||||
if (player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid && player.PlayerPawn.Value.AbsOrigin != null)
|
if (player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid && player.PlayerPawn.Value.AbsOrigin != null)
|
||||||
if (SkillUtils.GetDistance(smokePos, player.PlayerPawn.Value.AbsOrigin) <= smokeRadius)
|
if (SkillUtils.GetDistance(smokePos, player.PlayerPawn.Value.AbsOrigin) <= smokeRadius)
|
||||||
AddHealth(player.PlayerPawn.Value, smokeHeal);
|
AddHealth(player.PlayerPawn.Value, smokeHeal);
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -11,41 +11,15 @@ namespace jRandomSkills
|
||||||
private const Skills skillName = Skills.Hermit;
|
private const Skills skillName = Skills.Hermit;
|
||||||
private static readonly Dictionary<string, int> dictionary = new()
|
private static readonly Dictionary<string, int> dictionary = new()
|
||||||
{
|
{
|
||||||
{ "weapon_glock", 120 },
|
{ "weapon_glock", 120 }, { "weapon_usp_silencer", 24 }, { "weapon_hkp2000", 52 }, { "weapon_p250", 26 },
|
||||||
{ "weapon_usp_silencer", 24 },
|
{ "weapon_cz75", 12 }, { "weapon_deagle", 35 }, { "weapon_fiveseven", 100 }, { "weapon_elite", 120 },
|
||||||
{ "weapon_hkp2000", 52 },
|
{ "weapon_tec9", 90 }, { "weapon_revolver", 8 }, { "weapon_mac10", 100 }, { "weapon_mp9", 120 },
|
||||||
{ "weapon_p250", 26 },
|
{ "weapon_mp7", 120 }, { "weapon_mp5", 120 }, { "weapon_mp5sd", 120 }, { "weapon_ump45", 100 },
|
||||||
{ "weapon_cz75", 12 },
|
{ "weapon_p90", 100 }, { "weapon_bizon", 120 }, { "weapon_ak47", 90 }, { "weapon_m4a1", 90 },
|
||||||
{ "weapon_deagle", 35 },
|
{ "weapon_m4a1_silencer", 80 }, { "weapon_galilar", 90 }, { "weapon_famas", 90 }, { "weapon_aug", 90 },
|
||||||
{ "weapon_fiveseven", 100 },
|
{ "weapon_sg556", 90 }, { "weapon_ssg08", 90 }, { "weapon_awp", 30 }, { "weapon_scar20", 90 },
|
||||||
{ "weapon_elite", 120 },
|
{ "weapon_g3sg1", 90 }, { "weapon_nova", 32 }, { "weapon_xm1014", 32 }, { "weapon_sawedoff", 32 },
|
||||||
{ "weapon_tec9", 90 },
|
{ "weapon_mag7", 32 }, { "weapon_m249", 200 }, { "weapon_negev", 300 }
|
||||||
{ "weapon_revolver", 8 },
|
|
||||||
{ "weapon_mac10", 100 },
|
|
||||||
{ "weapon_mp9", 120 },
|
|
||||||
{ "weapon_mp7", 120 },
|
|
||||||
{ "weapon_mp5", 120 },
|
|
||||||
{ "weapon_mp5sd", 120 },
|
|
||||||
{ "weapon_ump45", 100 },
|
|
||||||
{ "weapon_p90", 100 },
|
|
||||||
{ "weapon_bizon", 120 },
|
|
||||||
{ "weapon_ak47", 90 },
|
|
||||||
{ "weapon_m4a1", 90 },
|
|
||||||
{ "weapon_m4a1_silencer", 80 },
|
|
||||||
{ "weapon_galilar", 90 },
|
|
||||||
{ "weapon_famas", 90 },
|
|
||||||
{ "weapon_aug", 90 },
|
|
||||||
{ "weapon_sg556", 90 },
|
|
||||||
{ "weapon_ssg08", 90 },
|
|
||||||
{ "weapon_awp", 30 },
|
|
||||||
{ "weapon_scar20", 90 },
|
|
||||||
{ "weapon_g3sg1", 90 },
|
|
||||||
{ "weapon_nova", 32 },
|
|
||||||
{ "weapon_xm1014", 32 },
|
|
||||||
{ "weapon_sawedoff", 32 },
|
|
||||||
{ "weapon_mag7", 32 },
|
|
||||||
{ "weapon_m249", 200 },
|
|
||||||
{ "weapon_negev", 300 }
|
|
||||||
};
|
};
|
||||||
private static readonly Dictionary<string, int> maxReserveAmmo = dictionary;
|
private static readonly Dictionary<string, int> maxReserveAmmo = dictionary;
|
||||||
|
|
||||||
|
|
@ -54,20 +28,21 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
public static void PlayerDeath(EventPlayerDeath @event)
|
||||||
{
|
{
|
||||||
var attacker = @event.Attacker;
|
var attacker = @event.Attacker;
|
||||||
if (!Instance.IsPlayerValid(attacker)) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(attacker)) return;
|
||||||
|
|
||||||
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
||||||
if (attackerInfo?.Skill != skillName) return HookResult.Continue;
|
if (attackerInfo?.Skill != skillName) return;
|
||||||
|
|
||||||
var pawn = attacker!.PlayerPawn.Value;
|
var pawn = attacker!.PlayerPawn.Value;
|
||||||
if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return HookResult.Continue;
|
if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return;
|
||||||
|
|
||||||
var weapon = pawn.WeaponServices.ActiveWeapon.Value;
|
var weapon = pawn.WeaponServices.ActiveWeapon.Value;
|
||||||
if (weapon == null || !weapon.IsValid || weapon.VData == null) return HookResult.Continue;
|
if (weapon == null || !weapon.IsValid || weapon.VData == null) return;
|
||||||
|
|
||||||
var maxReserveAmmoClip = maxReserveAmmo.TryGetValue(weapon.DesignerName, out var reserve) ? reserve : 100;
|
var maxReserveAmmoClip = maxReserveAmmo.TryGetValue(weapon.DesignerName, out var reserve) ? reserve : 100;
|
||||||
weapon.Clip1 = weapon.VData.MaxClip1;
|
weapon.Clip1 = weapon.VData.MaxClip1;
|
||||||
|
|
@ -76,9 +51,6 @@ namespace jRandomSkills
|
||||||
Utilities.SetStateChanged(weapon, "CBasePlayerWeapon", "m_iClip1");
|
Utilities.SetStateChanged(weapon, "CBasePlayerWeapon", "m_iClip1");
|
||||||
Utilities.SetStateChanged(weapon, "CBasePlayerWeapon", "m_pReserveAmmo");
|
Utilities.SetStateChanged(weapon, "CBasePlayerWeapon", "m_pReserveAmmo");
|
||||||
SkillUtils.AddHealth(pawn, healthToAdd);
|
SkillUtils.AddHealth(pawn, healthToAdd);
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ded678", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int healthToAdd = 25) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ded678", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int healthToAdd = 25) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
|
|
||||||
|
|
@ -16,24 +16,9 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void OnEntitySpawned(CEntityInstance @event)
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<Listeners.OnEntitySpawned>(@event =>
|
|
||||||
{
|
{
|
||||||
var name = @event.DesignerName;
|
var name = @event.DesignerName;
|
||||||
if (!name.EndsWith("hegrenade_projectile"))
|
if (!name.EndsWith("hegrenade_projectile"))
|
||||||
|
|
@ -54,7 +39,6 @@ namespace jRandomSkills
|
||||||
hegrenade.Damage *= damageMultiplier;
|
hegrenade.Damage *= damageMultiplier;
|
||||||
hegrenade.DmgRadius *= damageRadiusMultiplier;
|
hegrenade.DmgRadius *= damageRadiusMultiplier;
|
||||||
});
|
});
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -16,25 +16,6 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
{
|
|
||||||
string model = GetEnemyModel(player);
|
|
||||||
SetPlayerModel(player, model);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -12,48 +12,38 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventWeaponFire>((@event, info) =>
|
public static void WeaponFire(EventWeaponFire @event)
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
|
if (!Instance.IsPlayerValid(player)) return;
|
||||||
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
|
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
||||||
|
|
||||||
if (playerInfo?.Skill == skillName)
|
if (playerInfo?.Skill == skillName)
|
||||||
ApplyInfiniteAmmo(player!);
|
ApplyInfiniteAmmo(player!);
|
||||||
|
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventGrenadeThrown>((@event, info) =>
|
public static void GrenadeThrown(EventGrenadeThrown @event)
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
|
if (!Instance.IsPlayerValid(player)) return;
|
||||||
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
|
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
||||||
|
|
||||||
if (playerInfo?.Skill == skillName)
|
if (playerInfo?.Skill == skillName)
|
||||||
player!.GiveNamedItem($"weapon_{@event.Weapon}");
|
player!.GiveNamedItem($"weapon_{@event.Weapon}");
|
||||||
|
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventWeaponReload>((@event, info) =>
|
public static void WeaponReload(EventWeaponReload @event)
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
|
if (!Instance.IsPlayerValid(player)) return;
|
||||||
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
|
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
||||||
|
|
||||||
if (playerInfo?.Skill == skillName)
|
if (playerInfo?.Skill == skillName)
|
||||||
ApplyInfiniteAmmo(player!);
|
ApplyInfiniteAmmo(player!);
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ApplyInfiniteAmmo(CCSPlayerController player)
|
private static void ApplyInfiniteAmmo(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -18,24 +18,9 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
foreach (var beams in stepBeams.Values)
|
foreach (var beams in stepBeams.Values)
|
||||||
foreach (var beam in beams)
|
foreach (var beam in beams)
|
||||||
|
|
@ -44,13 +29,9 @@ namespace jRandomSkills
|
||||||
stepBeams.Clear();
|
stepBeams.Clear();
|
||||||
Instance.RemoveListener<Listeners.CheckTransmit>(CheckTransmit);
|
Instance.RemoveListener<Listeners.CheckTransmit>(CheckTransmit);
|
||||||
exists = false;
|
exists = false;
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<Listeners.OnTick>(OnTick);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnTick()
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
if (Server.TickCount % 8 != 0) return;
|
if (Server.TickCount % 8 != 0) return;
|
||||||
foreach (var step in stepBeams.ToList())
|
foreach (var step in stepBeams.ToList())
|
||||||
|
|
|
||||||
|
|
@ -15,30 +15,31 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in jammedPlayers)
|
foreach (var player in jammedPlayers)
|
||||||
SetCrosshair(player, true);
|
SetCrosshair(player, true);
|
||||||
jammedPlayers.Clear();
|
jammedPlayers.Clear();
|
||||||
return HookResult.Continue;
|
foreach (var player in Utilities.GetPlayers())
|
||||||
});
|
SkillUtils.CloseMenu(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();
|
||||||
|
|
||||||
|
HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
|
||||||
|
SkillUtils.UpdateMenu(player, menuItems);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
||||||
|
|
@ -85,24 +86,21 @@ namespace jRandomSkills
|
||||||
if (playerInfo == null) return;
|
if (playerInfo == null) return;
|
||||||
playerInfo.SkillChance = 0;
|
playerInfo.SkillChance = 0;
|
||||||
|
|
||||||
SkillUtils.PrintToChat(player, Localization.GetTranslation("jammer") + ":", 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();
|
||||||
|
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("jammer_select_info")}");
|
|
||||||
var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).ToArray();
|
|
||||||
if (enemies.Length > 0)
|
if (enemies.Length > 0)
|
||||||
{
|
{
|
||||||
foreach (var enemy in enemies)
|
HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
|
||||||
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}");
|
SkillUtils.CreateMenu(player, menuItems);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DisableSkill(CCSPlayerController player)
|
public static void DisableSkill(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
SetCrosshair(player, true);
|
SetCrosshair(player, true);
|
||||||
jammedPlayers.Remove(player);
|
jammedPlayers.Remove(player);
|
||||||
|
SkillUtils.CloseMenu(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#42f5a7", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#42f5a7", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
|
|
||||||
123
jRandomSkills - SRC Files/src/player/skills/Jester.cs
Normal file
123
jRandomSkills - SRC Files/src/player/skills/Jester.cs
Normal file
|
|
@ -0,0 +1,123 @@
|
||||||
|
using CounterStrikeSharp.API;
|
||||||
|
using CounterStrikeSharp.API.Core;
|
||||||
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
|
using jRandomSkills.src.player;
|
||||||
|
using jRandomSkills.src.utils;
|
||||||
|
using System.Drawing;
|
||||||
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
|
namespace jRandomSkills
|
||||||
|
{
|
||||||
|
public class Jester : ISkill
|
||||||
|
{
|
||||||
|
private const Skills skillName = Skills.Jester;
|
||||||
|
private static bool jesterMode = false;
|
||||||
|
private static bool jesterStarted = false;
|
||||||
|
private static readonly float minTime = Config.GetValue<float>(skillName, "minTime");
|
||||||
|
private static readonly float maxTime = Config.GetValue<float>(skillName, "maxTime");
|
||||||
|
|
||||||
|
public static void LoadSkill()
|
||||||
|
{
|
||||||
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void NewRound()
|
||||||
|
{
|
||||||
|
jesterStarted = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void PlayerHurt(EventPlayerHurt @event)
|
||||||
|
{
|
||||||
|
if (!jesterMode) return;
|
||||||
|
var attacker = @event.Attacker;
|
||||||
|
var victim = @event.Userid;
|
||||||
|
int hitgroup = @event.Hitgroup;
|
||||||
|
|
||||||
|
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return;
|
||||||
|
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
||||||
|
var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.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;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void EnableSkill(CCSPlayerController _)
|
||||||
|
{
|
||||||
|
if (!jesterStarted)
|
||||||
|
{
|
||||||
|
float wait = (float)Instance.Random.NextDouble() * (maxTime - minTime) + minTime;
|
||||||
|
Instance.AddTimer(wait, ChangeMode);
|
||||||
|
jesterStarted = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ChangeMode()
|
||||||
|
{
|
||||||
|
if (Instance.SkillPlayer.Any(p => p.Skill == skillName))
|
||||||
|
{
|
||||||
|
jesterMode = !jesterMode;
|
||||||
|
foreach (var player in Utilities.GetPlayers().Where(p => !p.IsBot && p.PawnIsAlive))
|
||||||
|
{
|
||||||
|
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) continue;
|
||||||
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
||||||
|
if (playerInfo?.Skill == skillName)
|
||||||
|
{
|
||||||
|
SetPlayerColor(player.PlayerPawn.Value);
|
||||||
|
player.ExecuteClientCommand("play sounds/weapons/taser/taser_charge_ready");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
float wait = (float)Instance.Random.NextDouble() * (maxTime - minTime) + minTime;
|
||||||
|
Instance.AddTimer(wait, ChangeMode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void SetPlayerColor(CCSPlayerPawn pawn)
|
||||||
|
{
|
||||||
|
var color = jesterMode ? Color.FromArgb(255, 128, 0, 128) : Color.FromArgb(255, 255, 255, 255);
|
||||||
|
pawn.Render = color;
|
||||||
|
Utilities.SetStateChanged(pawn, "CBaseModelEntity", "m_clrRender");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OnTick()
|
||||||
|
{
|
||||||
|
foreach (var player in Utilities.GetPlayers().Where(p => !p.IsBot && p.PawnIsAlive))
|
||||||
|
{
|
||||||
|
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) continue;
|
||||||
|
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) return;
|
||||||
|
|
||||||
|
string infoLine = $"<font class='fontSize-l' class='fontWeight-Bold' color='#FFFFFF'>{Localization.GetTranslation("your_skill")}:</font> <br>";
|
||||||
|
string skillLine = $"<font class='fontSize-l' class='fontWeight-Bold' color='{skillData.Color}'>{skillData.Name}</font> <br>";
|
||||||
|
string remainingLine = $"<font class='fontSize-m' color='#FFFFFF'>{Localization.GetTranslation("jester_mode")}: <font color='{(jesterMode ? "#00ff00" : "#ff0000")}'>{Localization.GetTranslation(jesterMode ? "jester_on" : "jester_off")}</font></font> <br>";
|
||||||
|
|
||||||
|
var hudContent = infoLine + skillLine + remainingLine;
|
||||||
|
player.PrintToCenterHtml(hudContent);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#8f108f", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float minTime = 10f, float maxTime = 25f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
{
|
||||||
|
public float MinTime { get; set; } = minTime;
|
||||||
|
public float MaxTime { get; set; } = maxTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -10,55 +10,51 @@ namespace jRandomSkills
|
||||||
public class JumpBan : ISkill
|
public class JumpBan : ISkill
|
||||||
{
|
{
|
||||||
private const Skills skillName = Skills.JumpBan;
|
private const Skills skillName = Skills.JumpBan;
|
||||||
private static readonly Dictionary<CCSPlayerPawn, int> bannedPlayers = [];
|
public static readonly Dictionary<CCSPlayerPawn, int> bannedPlayers = [];
|
||||||
|
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
bannedPlayers.Clear();
|
bannedPlayers.Clear();
|
||||||
return HookResult.Continue;
|
foreach (var player in Utilities.GetPlayers())
|
||||||
});
|
SkillUtils.CloseMenu(player);
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerJump>((@event, info) =>
|
|
||||||
{
|
|
||||||
var player = @event.Userid;
|
|
||||||
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return HookResult.Continue;
|
|
||||||
if (!bannedPlayers.TryGetValue(player.PlayerPawn.Value, out _)) return HookResult.Continue;
|
|
||||||
bannedPlayers[player.PlayerPawn.Value] = Server.TickCount + 10;
|
|
||||||
return HookResult.Stop;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<Listeners.OnTick>(OnTick);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnTick()
|
public static void PlayerJump(EventPlayerJump @event)
|
||||||
|
{
|
||||||
|
var player = @event.Userid;
|
||||||
|
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return;
|
||||||
|
if (!bannedPlayers.TryGetValue(player.PlayerPawn.Value, out _)) return;
|
||||||
|
bannedPlayers[player.PlayerPawn.Value] = Server.TickCount + 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
foreach (var item in bannedPlayers)
|
foreach (var item in bannedPlayers)
|
||||||
{
|
{
|
||||||
var pawn = item.Key;
|
var pawn = item.Key;
|
||||||
var time = item.Value;
|
var time = item.Value;
|
||||||
if (time > Server.TickCount)
|
if (time > Server.TickCount)
|
||||||
|
if (pawn != null && pawn.IsValid)
|
||||||
pawn.AbsVelocity.Z = -100;
|
pawn.AbsVelocity.Z = -100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
|
||||||
|
HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
|
||||||
|
SkillUtils.UpdateMenu(player, menuItems);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
||||||
|
|
@ -94,24 +90,21 @@ namespace jRandomSkills
|
||||||
if (playerInfo == null) return;
|
if (playerInfo == null) return;
|
||||||
playerInfo.SkillChance = 0;
|
playerInfo.SkillChance = 0;
|
||||||
|
|
||||||
SkillUtils.PrintToChat(player, Localization.GetTranslation("jumpban") + ":", 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();
|
||||||
|
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("jumpban_select_info")}");
|
|
||||||
var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).ToArray();
|
|
||||||
if (enemies.Length > 0)
|
if (enemies.Length > 0)
|
||||||
{
|
{
|
||||||
foreach (var enemy in enemies)
|
HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
|
||||||
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}");
|
SkillUtils.CreateMenu(player, menuItems);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DisableSkill(CCSPlayerController player)
|
public static void DisableSkill(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return;
|
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return;
|
||||||
bannedPlayers.Remove(player.PlayerPawn.Value);
|
bannedPlayers.Remove(player.PlayerPawn.Value);
|
||||||
|
SkillUtils.CloseMenu(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#b01e5d", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#b01e5d", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
|
|
||||||
|
|
@ -13,17 +13,15 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerJump>((@event, info) =>
|
public static void PlayerJump(EventPlayerJump @event)
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
if (player == null || !player.IsValid) return;
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
if (playerInfo?.Skill != skillName) return;
|
||||||
|
|
||||||
SkillUtils.AddHealth(player.PlayerPawn.Value, addHealth);
|
SkillUtils.AddHealth(player.PlayerPawn.Value, addHealth);
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a86eff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int healthToAdd = 3) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a86eff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int healthToAdd = 3) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -15,37 +16,19 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void PlayerBlind(EventPlayerBlind @event)
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerBlind>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
var attacker = @event.Attacker;
|
var attacker = @event.Attacker;
|
||||||
if (!Instance.IsPlayerValid(player) || !Instance.IsPlayerValid(attacker)) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(player) || !Instance.IsPlayerValid(attacker)) return;
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
||||||
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
||||||
|
|
||||||
if (attackerInfo?.Skill == skillName && playerInfo?.Skill != Skills.AntyFlash && player!.PlayerPawn.Value!.FlashDuration >= flashDuration)
|
if (attackerInfo?.Skill == skillName && playerInfo?.Skill != Skills.AntyFlash && player!.PlayerPawn.Value!.FlashDuration >= flashDuration)
|
||||||
player?.PlayerPawn?.Value?.CommitSuicide(false, true);
|
player?.PlayerPawn?.Value?.CommitSuicide(false, true);
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -13,23 +13,29 @@ namespace jRandomSkills
|
||||||
|
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
public static void NewRound()
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
SkillUtils.CloseMenu(player);
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
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();
|
||||||
|
|
||||||
|
HashSet<(string, string)> menuItems = enemies.Select(e => ($"{e.PlayerName} : {e.PawnHealth} HP", e.Index.ToString())).ToHashSet();
|
||||||
|
SkillUtils.UpdateMenu(player, menuItems);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
||||||
|
|
@ -65,18 +71,14 @@ namespace jRandomSkills
|
||||||
if (playerInfo == null) return;
|
if (playerInfo == null) return;
|
||||||
playerInfo.SkillChance = 0;
|
playerInfo.SkillChance = 0;
|
||||||
|
|
||||||
SkillUtils.PrintToChat(player, Localization.GetTranslation("lifeswap") + ":", 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();
|
||||||
|
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("lifeswap_select_info")}");
|
|
||||||
var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).ToArray();
|
|
||||||
if (enemies.Length > 0)
|
if (enemies.Length > 0)
|
||||||
{
|
{
|
||||||
foreach (var enemy in enemies)
|
HashSet<(string, string)> menuItems = enemies.Select(e => ($"{e.PlayerName} : {e.PawnHealth} HP", e.Index.ToString())).ToHashSet();
|
||||||
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}");
|
SkillUtils.CreateMenu(player, menuItems);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void SwapHealth(CCSPlayerController player, CCSPlayerController enemy)
|
private static void SwapHealth(CCSPlayerController player, CCSPlayerController enemy)
|
||||||
|
|
@ -92,6 +94,11 @@ namespace jRandomSkills
|
||||||
Utilities.SetStateChanged(enemyPawn, "CBaseEntity", "m_iHealth");
|
Utilities.SetStateChanged(enemyPawn, "CBaseEntity", "m_iHealth");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void DisableSkill(CCSPlayerController player)
|
||||||
|
{
|
||||||
|
SkillUtils.CloseMenu(player);
|
||||||
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a3651a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a3651a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Core;
|
|
||||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using CS2TraceRay.Class;
|
using CS2TraceRay.Class;
|
||||||
|
|
@ -16,23 +15,24 @@ namespace jRandomSkills
|
||||||
private const Skills skillName = Skills.LongKnife;
|
private const Skills skillName = Skills.LongKnife;
|
||||||
private static readonly float maxDistance = Config.GetValue<float>(skillName, "maxDistance");
|
private static readonly float maxDistance = Config.GetValue<float>(skillName, "maxDistance");
|
||||||
|
|
||||||
public unsafe static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventWeaponFire>((@event, info) =>
|
public unsafe static void WeaponFire(EventWeaponFire @event)
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(player)) return;
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
if (playerInfo?.Skill != skillName) return;
|
||||||
|
|
||||||
var pawn = player!.PlayerPawn.Value;
|
var pawn = player!.PlayerPawn.Value;
|
||||||
if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null || pawn.WeaponServices == null) return HookResult.Continue;
|
if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null || pawn.WeaponServices == null) return;
|
||||||
|
|
||||||
var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value;
|
var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value;
|
||||||
if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.DesignerName != "weapon_knife") return HookResult.Continue;
|
if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.DesignerName != "weapon_knife") return;
|
||||||
|
|
||||||
Vector eyePos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z);
|
Vector eyePos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z);
|
||||||
Vector endPos = eyePos + SkillUtils.GetForwardVector(pawn.EyeAngles) * maxDistance;
|
Vector endPos = eyePos + SkillUtils.GetForwardVector(pawn.EyeAngles) * maxDistance;
|
||||||
|
|
@ -55,13 +55,11 @@ namespace jRandomSkills
|
||||||
CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray);
|
CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray);
|
||||||
|
|
||||||
if (!trace.HitPlayer(out CCSPlayerController? target) || target == null)
|
if (!trace.HitPlayer(out CCSPlayerController? target) || target == null)
|
||||||
return HookResult.Continue;
|
return;
|
||||||
|
|
||||||
if (target.Handle == player.Handle || target.PlayerPawn.Value == null || !target.PlayerPawn.Value.IsValid || trace.Distance() <= 70) return HookResult.Continue;
|
if (target.Handle == player.Handle || target.PlayerPawn.Value == null || !target.PlayerPawn.Value.IsValid || trace.Distance() <= 70) return;
|
||||||
target.PlayerPawn.Value.EmitSound("Player.DamageBody.Onlooker");
|
target.PlayerPawn.Value.EmitSound("Player.DamageBody.Onlooker");
|
||||||
SkillUtils.TakeHealth(target.PlayerPawn.Value, Instance.Random.Next(21, 34));
|
SkillUtils.TakeHealth(target.PlayerPawn.Value, Instance.Random.Next(21, 34));
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#c9f8ff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float maxDistance = 4096f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#c9f8ff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float maxDistance = 4096f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Core;
|
|
||||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using CS2TraceRay.Class;
|
using CS2TraceRay.Class;
|
||||||
|
|
@ -16,39 +15,24 @@ namespace jRandomSkills
|
||||||
private const Skills skillName = Skills.LongZeus;
|
private const Skills skillName = Skills.LongZeus;
|
||||||
private static readonly float maxDistance = Config.GetValue<float>(skillName, "maxDistance");
|
private static readonly float maxDistance = Config.GetValue<float>(skillName, "maxDistance");
|
||||||
|
|
||||||
public unsafe static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public unsafe static void WeaponFire(EventWeaponFire @event)
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventWeaponFire>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(player)) return;
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
if (playerInfo?.Skill != skillName) return;
|
||||||
|
|
||||||
var pawn = player!.PlayerPawn.Value;
|
var pawn = player!.PlayerPawn.Value;
|
||||||
if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null || pawn.WeaponServices == null) return HookResult.Continue;
|
if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null || pawn.WeaponServices == null) return;
|
||||||
|
|
||||||
var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value;
|
var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value;
|
||||||
if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.DesignerName != "weapon_taser") return HookResult.Continue;
|
if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.DesignerName != "weapon_taser") return;
|
||||||
|
|
||||||
Vector eyePos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z);
|
Vector eyePos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z);
|
||||||
Vector endPos = eyePos + SkillUtils.GetForwardVector(pawn.EyeAngles) * maxDistance;
|
Vector endPos = eyePos + SkillUtils.GetForwardVector(pawn.EyeAngles) * maxDistance;
|
||||||
|
|
@ -71,12 +55,10 @@ namespace jRandomSkills
|
||||||
CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray);
|
CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray);
|
||||||
|
|
||||||
if (!trace.HitPlayer(out CCSPlayerController? target) || target == null)
|
if (!trace.HitPlayer(out CCSPlayerController? target) || target == null)
|
||||||
return HookResult.Continue;
|
return;
|
||||||
|
|
||||||
if (target.Handle == player.Handle) return HookResult.Continue;
|
if (target.Handle == player.Handle) return;
|
||||||
SkillUtils.TakeHealth(target.PlayerPawn.Value, 9999);
|
SkillUtils.TakeHealth(target.PlayerPawn.Value, 9999);
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -15,30 +15,30 @@ namespace jRandomSkills
|
||||||
|
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
public static void NewRound()
|
||||||
{
|
{
|
||||||
Instance.AddTimer(0.1f, () =>
|
playersFOV.Clear();
|
||||||
|
foreach (var player in Utilities.GetPlayers())
|
||||||
|
SkillUtils.CloseMenu(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
|
if (Server.TickCount % 32 != 0) return;
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
if (!SkillUtils.HasMenu(player)) continue;
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
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();
|
||||||
|
|
||||||
|
HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
|
||||||
|
SkillUtils.UpdateMenu(player, menuItems);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
foreach (var player in playersFOV.Keys)
|
|
||||||
DisableSkill(player);
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
||||||
|
|
@ -79,18 +79,14 @@ namespace jRandomSkills
|
||||||
if (playerInfo == null) return;
|
if (playerInfo == null) return;
|
||||||
playerInfo.SkillChance = 0;
|
playerInfo.SkillChance = 0;
|
||||||
|
|
||||||
SkillUtils.PrintToChat(player, Localization.GetTranslation("magnifier") + ":", 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();
|
||||||
|
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("magnifier_select_info")}");
|
|
||||||
var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).ToArray();
|
|
||||||
if (enemies.Length > 0)
|
if (enemies.Length > 0)
|
||||||
{
|
{
|
||||||
foreach (var enemy in enemies)
|
HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
|
||||||
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}");
|
SkillUtils.CreateMenu(player, menuItems);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DisableSkill(CCSPlayerController player)
|
public static void DisableSkill(CCSPlayerController player)
|
||||||
|
|
@ -101,6 +97,7 @@ namespace jRandomSkills
|
||||||
Utilities.SetStateChanged(player, "CBasePlayerController", "m_iDesiredFOV");
|
Utilities.SetStateChanged(player, "CBasePlayerController", "m_iDesiredFOV");
|
||||||
}
|
}
|
||||||
playersFOV.Remove(player);
|
playersFOV.Remove(player);
|
||||||
|
SkillUtils.CloseMenu(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#9ba882", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, uint customFOV = 50) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#9ba882", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, uint customFOV = 50) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using jRandomSkills.src.utils;
|
using jRandomSkills.src.utils;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -19,40 +18,14 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) return;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
SkillPlayerInfo.Clear();
|
SkillPlayerInfo.Clear();
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
public static void OnTick()
|
||||||
{
|
|
||||||
var player = @event.Userid;
|
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
SkillPlayerInfo.Remove(player.SteamID);
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<OnTick>(() =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
|
|
@ -61,7 +34,6 @@ namespace jRandomSkills
|
||||||
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
|
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
|
||||||
UpdateHUD(player, skillInfo);
|
UpdateHUD(player, skillInfo);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -13,23 +13,29 @@ namespace jRandomSkills
|
||||||
|
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
public static void NewRound()
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
SkillUtils.CloseMenu(player);
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
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();
|
||||||
|
|
||||||
|
HashSet<(string, string)> menuItems = enemies.Select(e => ($"{e.PlayerName} : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account)}$", e.Index.ToString())).ToHashSet();
|
||||||
|
SkillUtils.UpdateMenu(player, menuItems);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
||||||
|
|
@ -65,19 +71,14 @@ namespace jRandomSkills
|
||||||
if (playerInfo == null) return;
|
if (playerInfo == null) return;
|
||||||
playerInfo.SkillChance = 0;
|
playerInfo.SkillChance = 0;
|
||||||
|
|
||||||
SkillUtils.PrintToChat(player, Localization.GetTranslation("moneyswap") + ":", 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();
|
||||||
|
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("moneyswap_select_info")}");
|
|
||||||
var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).ToArray();
|
|
||||||
if (enemies.Length > 0)
|
if (enemies.Length > 0)
|
||||||
{
|
{
|
||||||
foreach (var enemy in enemies)
|
HashSet<(string, string)> menuItems = enemies.Select(e => ($"{e.PlayerName} : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account)}$", e.Index.ToString())).ToHashSet();
|
||||||
if (enemy != null && enemy.IsValid && enemy.InGameMoneyServices != null)
|
SkillUtils.CreateMenu(player, menuItems);
|
||||||
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}: ${enemy.InGameMoneyServices.Account}");
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void SwapMoney(CCSPlayerController player, CCSPlayerController enemy)
|
private static void SwapMoney(CCSPlayerController player, CCSPlayerController enemy)
|
||||||
|
|
@ -96,6 +97,11 @@ namespace jRandomSkills
|
||||||
Utilities.SetStateChanged(enemy, "CCSPlayerController", "m_pInGameMoneyServices");
|
Utilities.SetStateChanged(enemy, "CCSPlayerController", "m_pInGameMoneyServices");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void DisableSkill(CCSPlayerController player)
|
||||||
|
{
|
||||||
|
SkillUtils.CloseMenu(player);
|
||||||
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#52f54c", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#52f54c", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
|
using CounterStrikeSharp.API.Modules.Entities;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -15,18 +17,16 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
public static void PlayerDeath(EventPlayerDeath @event)
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
if (!IsDeadPlayerValid(player)) return HookResult.Continue;
|
if (!IsDeadPlayerValid(player)) return;
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
||||||
if (playerInfo?.Skill == skillName)
|
if (playerInfo?.Skill == skillName)
|
||||||
SpawnExplosion(player!);
|
SpawnExplosion(player!);
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void SpawnExplosion(CCSPlayerController player)
|
private static void SpawnExplosion(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Core.Attributes;
|
using CounterStrikeSharp.API.Core.Attributes;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -12,7 +11,6 @@ namespace jRandomSkills
|
||||||
public class Ninja : ISkill
|
public class Ninja : ISkill
|
||||||
{
|
{
|
||||||
private const Skills skillName = Skills.Ninja;
|
private const Skills skillName = Skills.Ninja;
|
||||||
private static bool exists = false;
|
|
||||||
private static readonly float idlePercentInvisibility = Config.GetValue<float>(skillName, "idlePercentInvisibility");
|
private static readonly float idlePercentInvisibility = Config.GetValue<float>(skillName, "idlePercentInvisibility");
|
||||||
private static readonly float duckPercentInvisibility = Config.GetValue<float>(skillName, "duckPercentInvisibility");
|
private static readonly float duckPercentInvisibility = Config.GetValue<float>(skillName, "duckPercentInvisibility");
|
||||||
private static readonly float knifePercentInvisibility = Config.GetValue<float>(skillName, "knifePercentInvisibility");
|
private static readonly float knifePercentInvisibility = Config.GetValue<float>(skillName, "knifePercentInvisibility");
|
||||||
|
|
@ -22,83 +20,31 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
DisableSkill(player);
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerPawn = player.PlayerPawn?.Value;
|
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundStart>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
DisableSkill(player);
|
|
||||||
invisibilityChanged.Clear();
|
invisibilityChanged.Clear();
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
|
||||||
{
|
|
||||||
var player = @event.Userid;
|
|
||||||
if (player == null || !player.IsValid || player.PlayerPawn.Value == null) return HookResult.Continue;
|
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
DisableSkill(player);
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventItemPickup>((@event, info) =>
|
|
||||||
{
|
|
||||||
var player = @event.Userid;
|
|
||||||
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
|
||||||
|
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
|
||||||
UpdateNinja(player);
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventItemEquip>((@event, info) =>
|
|
||||||
{
|
|
||||||
var player = @event.Userid;
|
|
||||||
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
|
||||||
|
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
|
||||||
UpdateNinja(player);
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
DisableSkill(player);
|
|
||||||
}
|
}
|
||||||
Instance.RemoveListener<CheckTransmit>(CheckTransmit);
|
|
||||||
exists = false;
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<OnTick>(OnTick);
|
public static void WeaponEquip(EventItemEquip @event)
|
||||||
|
{
|
||||||
|
var player = @event.Userid;
|
||||||
|
if (!Instance.IsPlayerValid(player)) return;
|
||||||
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
||||||
|
|
||||||
|
if (playerInfo?.Skill != skillName) return;
|
||||||
|
UpdateNinja(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WeaponPickup(EventItemPickup @event)
|
||||||
|
{
|
||||||
|
var player = @event.Userid;
|
||||||
|
if (!Instance.IsPlayerValid(player)) return;
|
||||||
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
||||||
|
|
||||||
|
if (playerInfo?.Skill != skillName) return;
|
||||||
|
UpdateNinja(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
|
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
|
||||||
|
|
@ -113,7 +59,7 @@ namespace jRandomSkills
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnTick()
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
|
|
@ -123,11 +69,9 @@ namespace jRandomSkills
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController _)
|
||||||
{
|
{
|
||||||
if (!exists)
|
Event.enableTransmit = true;
|
||||||
Instance.RegisterListener<CheckTransmit>(CheckTransmit);
|
|
||||||
exists = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DisableSkill(CCSPlayerController player)
|
public static void DisableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -12,25 +12,20 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
|
public static void PlayerHurt(EventPlayerHurt @event)
|
||||||
{
|
{
|
||||||
var damage = @event.DmgHealth;
|
var damage = @event.DmgHealth;
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
var weapon = @event.Weapon;
|
var weapon = @event.Weapon;
|
||||||
|
|
||||||
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(player)) return;
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
if (playerInfo?.Skill != skillName) return;
|
||||||
|
|
||||||
if (weapon == "hegrenade" || weapon == "inferno")
|
if (weapon == "hegrenade" || weapon == "inferno")
|
||||||
{
|
|
||||||
SkillUtils.AddHealth(player!.PlayerPawn.Value, damage);
|
SkillUtils.AddHealth(player!.PlayerPawn.Value, damage);
|
||||||
damage = 0;
|
|
||||||
return HookResult.Stop;
|
|
||||||
}
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a38c1a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a38c1a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -14,43 +13,24 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
Server.ExecuteCommand("weapon_accuracy_nospread 0");
|
Server.ExecuteCommand("weapon_accuracy_nospread 0");
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<OnTick>(OnTick);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController _)
|
||||||
{
|
{
|
||||||
Server.ExecuteCommand("weapon_accuracy_nospread 1");
|
Server.ExecuteCommand("weapon_accuracy_nospread 1");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DisableSkill(CCSPlayerController player)
|
public static void DisableSkill(CCSPlayerController _)
|
||||||
{
|
{
|
||||||
Server.ExecuteCommand("weapon_accuracy_nospread 0");
|
Server.ExecuteCommand("weapon_accuracy_nospread 0");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnTick()
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using jRandomSkills.src.utils;
|
using jRandomSkills.src.utils;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -18,42 +17,14 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
{
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
SkillPlayerInfo.Clear();
|
SkillPlayerInfo.Clear();
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
public static void OnTick()
|
||||||
{
|
|
||||||
var player = @event.Userid;
|
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
SkillPlayerInfo.Remove(player.SteamID);
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<OnTick>(() =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
|
|
@ -62,7 +33,6 @@ namespace jRandomSkills
|
||||||
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
|
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
|
||||||
UpdateHUD(player, skillInfo);
|
UpdateHUD(player, skillInfo);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -12,11 +12,8 @@ namespace jRandomSkills
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig : Config.DefaultSkillInfo
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#FFFFFF", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
{
|
|
||||||
public SkillConfig(Skills skill = skillName, bool active = true, string color = "#FFFFFF", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Memory;
|
|
||||||
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
|
|
@ -14,35 +13,33 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static HookResult OnTakeDamage(DynamicHook h)
|
public static void OnTakeDamage(DynamicHook h)
|
||||||
{
|
{
|
||||||
CEntityInstance param = h.GetParam<CEntityInstance>(0);
|
CEntityInstance param = h.GetParam<CEntityInstance>(0);
|
||||||
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
|
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
|
||||||
|
|
||||||
if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null)
|
if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null)
|
||||||
return HookResult.Continue;
|
return;
|
||||||
|
|
||||||
CCSPlayerPawn attackerPawn = new CCSPlayerPawn(param2.Attacker.Value.Handle);
|
CCSPlayerPawn attackerPawn = new CCSPlayerPawn(param2.Attacker.Value.Handle);
|
||||||
CCSPlayerPawn victimPawn = new CCSPlayerPawn(param.Handle);
|
CCSPlayerPawn victimPawn = new CCSPlayerPawn(param.Handle);
|
||||||
|
|
||||||
if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player")
|
if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player")
|
||||||
return HookResult.Continue;
|
return;
|
||||||
|
|
||||||
if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null)
|
if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null)
|
||||||
return HookResult.Continue;
|
return;
|
||||||
|
|
||||||
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
|
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
|
||||||
CCSPlayerController victim = victimPawn.Controller.Value.As<CCSPlayerController>();
|
CCSPlayerController victim = victimPawn.Controller.Value.As<CCSPlayerController>();
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
|
||||||
if (playerInfo == null) return HookResult.Continue;
|
if (playerInfo == null) return;
|
||||||
|
|
||||||
if (playerInfo.Skill == skillName && attacker.PawnIsAlive)
|
if (playerInfo.Skill == skillName && attacker.PawnIsAlive)
|
||||||
param2.Damage = 1000f;
|
param2.Damage = 1000f;
|
||||||
return HookResult.Changed;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig : Config.DefaultSkillInfo
|
public class SkillConfig : Config.DefaultSkillInfo
|
||||||
|
|
|
||||||
|
|
@ -13,23 +13,22 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
|
public static void PlayerHurt(EventPlayerHurt @event)
|
||||||
{
|
{
|
||||||
var attacker = @event.Attacker;
|
var attacker = @event.Attacker;
|
||||||
var victim = @event.Userid;
|
var victim = @event.Userid;
|
||||||
int damage = @event.DmgHealth;
|
int damage = @event.DmgHealth;
|
||||||
var hitgroup = (HitGroup_t)@event.Hitgroup;
|
var hitgroup = (HitGroup_t)@event.Hitgroup;
|
||||||
|
|
||||||
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return;
|
||||||
var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID);
|
var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID);
|
||||||
if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue;
|
if (victimInfo == null || victimInfo.Skill != skillName) return;
|
||||||
|
|
||||||
HitGroup_t[] disabledHitbox = [HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG];
|
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)
|
if (hitgroup != HitGroup_t.HITGROUP_HEAD)
|
||||||
RestoreHealth(victim!, damage);
|
RestoreHealth(victim!, damage);
|
||||||
return HookResult.Stop;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void RestoreHealth(CCSPlayerController victim, float damage)
|
private static void RestoreHealth(CCSPlayerController victim, float damage)
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using jRandomSkills.src.utils;
|
using jRandomSkills.src.utils;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -21,20 +20,18 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterListener<OnTick>(() =>
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
if (!Instance.IsPlayerValid(player)) return;
|
if (!Instance.IsPlayerValid(player)) return;
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (playerInfo?.Skill == skillName)
|
if (playerInfo?.Skill == skillName)
|
||||||
{
|
|
||||||
GiveAdditionalJump(player);
|
GiveAdditionalJump(player);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
using CounterStrikeSharp.API;
|
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
|
|
@ -14,28 +13,12 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!IsDeadPlayerValid(player)) continue;
|
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void PlayerDeath(EventPlayerDeath @event)
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return HookResult.Continue;
|
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return;
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (playerInfo?.Skill == skillName)
|
if (playerInfo?.Skill == skillName)
|
||||||
|
|
@ -47,9 +30,6 @@ namespace jRandomSkills
|
||||||
SkillUtils.PrintToChat(player, Localization.GetTranslation("phoenix_respawn"), false); ;
|
SkillUtils.PrintToChat(player, Localization.GetTranslation("phoenix_respawn"), false); ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using jRandomSkills.src.utils;
|
using jRandomSkills.src.utils;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -17,34 +16,14 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
PlayerPilotInfo.Clear();
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
}
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
PlayerPilotInfo.Remove(player.SteamID);
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void OnTick()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<OnTick>(() =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
|
|
@ -52,7 +31,6 @@ namespace jRandomSkills
|
||||||
if (playerInfo?.Skill == skillName)
|
if (playerInfo?.Skill == skillName)
|
||||||
HandlePilot(player);
|
HandlePilot(player);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Memory;
|
using CounterStrikeSharp.API.Modules.Memory;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -16,33 +15,19 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundStart>((@event, @info) =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
Schema.SetSchemaValue<bool>(player!.PlayerPawn!.Value!.Handle, "CCSPlayerPawn", "m_bInBombZone", false);
|
|
||||||
}
|
}
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventBombPlanted>((@event, info) =>
|
public static void BombPlanted(EventBombPlanted @event)
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(player)) return;
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
if (playerInfo?.Skill != skillName) return;
|
||||||
|
|
||||||
var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault();
|
var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault();
|
||||||
if (plantedBomb != null)
|
if (plantedBomb != null)
|
||||||
Server.NextFrame(() => plantedBomb.C4Blow = (float)Server.EngineTime + extraC4BlowTime);
|
Server.NextFrame(() => plantedBomb.C4Blow = (float)Server.EngineTime + extraC4BlowTime);
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<OnTick>(OnTick);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DisableSkill(CCSPlayerController player)
|
public static void DisableSkill(CCSPlayerController player)
|
||||||
|
|
@ -51,7 +36,7 @@ namespace jRandomSkills
|
||||||
Schema.SetSchemaValue<bool>(player!.PlayerPawn.Value!.Handle, "CCSPlayerPawn", "m_bInBombZone", false);
|
Schema.SetSchemaValue<bool>(player!.PlayerPawn.Value!.Handle, "CCSPlayerPawn", "m_bInBombZone", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnTick()
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -17,36 +17,17 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
foreach (var player in poisonedPlayers)
|
|
||||||
DisableSkill(player);
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<Listeners.OnTick>(OnTick);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnTick()
|
public static void NewRound()
|
||||||
|
{
|
||||||
|
poisonedPlayers.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OnTick()
|
||||||
|
{
|
||||||
|
if (Server.TickCount % (int)(64 * cooldown) == 0)
|
||||||
{
|
{
|
||||||
if (Server.TickCount % (int)(64 * cooldown) != 0) return;
|
|
||||||
foreach (var player in poisonedPlayers)
|
foreach (var player in poisonedPlayers)
|
||||||
{
|
{
|
||||||
var pawn = player.PlayerPawn.Value;
|
var pawn = player.PlayerPawn.Value;
|
||||||
|
|
@ -55,6 +36,20 @@ namespace jRandomSkills
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
|
||||||
|
HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
|
||||||
|
SkillUtils.UpdateMenu(player, menuItems);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
||||||
{
|
{
|
||||||
if (player == null || !player.IsValid || !player.PawnIsAlive) return;
|
if (player == null || !player.IsValid || !player.PawnIsAlive) return;
|
||||||
|
|
@ -88,23 +83,20 @@ namespace jRandomSkills
|
||||||
if (playerInfo == null) return;
|
if (playerInfo == null) return;
|
||||||
playerInfo.SkillChance = 0;
|
playerInfo.SkillChance = 0;
|
||||||
|
|
||||||
SkillUtils.PrintToChat(player, Localization.GetTranslation("poison") + ":", 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();
|
||||||
|
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("poison_select_info")}");
|
|
||||||
var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).ToArray();
|
|
||||||
if (enemies.Length > 0)
|
if (enemies.Length > 0)
|
||||||
{
|
{
|
||||||
foreach (var enemy in enemies)
|
HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
|
||||||
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}");
|
SkillUtils.CreateMenu(player, menuItems);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DisableSkill(CCSPlayerController player)
|
public static void DisableSkill(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
poisonedPlayers.Remove(player);
|
poisonedPlayers.Remove(player);
|
||||||
|
SkillUtils.CloseMenu(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#902eff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 1, int damage = 1) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#902eff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 1, int damage = 1) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
|
|
||||||
|
|
@ -20,38 +20,38 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
bannedPlayers.Clear();
|
bannedPlayers.Clear();
|
||||||
return HookResult.Continue;
|
foreach (var player in Utilities.GetPlayers())
|
||||||
});
|
SkillUtils.CloseMenu(player);
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventItemEquip>((@event, info) =>
|
public static void WeaponEquip(EventItemEquip @event)
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
var weapon = @event.Item;
|
var weapon = @event.Item;
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
if (player == null || !player.IsValid) return;
|
||||||
if (!bannedPlayers.Contains(player.SteamID) || !disabledWeapons.Contains(weapon)) return HookResult.Continue;
|
if (!bannedPlayers.Contains(player.SteamID) || !disabledWeapons.Contains(weapon)) return;
|
||||||
player.ExecuteClientCommand("slot3");
|
player.ExecuteClientCommand("slot3");
|
||||||
return HookResult.Stop;
|
}
|
||||||
});
|
|
||||||
|
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();
|
||||||
|
|
||||||
|
HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
|
||||||
|
SkillUtils.UpdateMenu(player, menuItems);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
public static void TypeSkill(CCSPlayerController player, string[] commands)
|
||||||
|
|
@ -98,23 +98,20 @@ namespace jRandomSkills
|
||||||
if (playerInfo == null) return;
|
if (playerInfo == null) return;
|
||||||
playerInfo.SkillChance = 0;
|
playerInfo.SkillChance = 0;
|
||||||
|
|
||||||
SkillUtils.PrintToChat(player, Localization.GetTranslation("primaryban") + ":", 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();
|
||||||
|
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("primaryban_select_info")}");
|
|
||||||
var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).ToArray();
|
|
||||||
if (enemies.Length > 0)
|
if (enemies.Length > 0)
|
||||||
{
|
{
|
||||||
foreach (var enemy in enemies)
|
HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
|
||||||
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}");
|
SkillUtils.CreateMenu(player, menuItems);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
|
||||||
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DisableSkill(CCSPlayerController player)
|
public static void DisableSkill(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
bannedPlayers.Remove(player.SteamID);
|
bannedPlayers.Remove(player.SteamID);
|
||||||
|
SkillUtils.CloseMenu(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ffc061", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ffc061", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates)
|
||||||
|
|
|
||||||
|
|
@ -13,23 +13,22 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
|
public static void PlayerHurt(EventPlayerHurt @event)
|
||||||
{
|
{
|
||||||
var attacker = @event.Attacker;
|
var attacker = @event.Attacker;
|
||||||
var victim = @event.Userid;
|
var victim = @event.Userid;
|
||||||
int damage = @event.DmgHealth;
|
int damage = @event.DmgHealth;
|
||||||
var hitgroup = (HitGroup_t)@event.Hitgroup;
|
var hitgroup = (HitGroup_t)@event.Hitgroup;
|
||||||
|
|
||||||
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return;
|
||||||
var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID);
|
var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID);
|
||||||
if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue;
|
if (victimInfo == null || victimInfo.Skill != skillName) return;
|
||||||
|
|
||||||
HitGroup_t[] disabledHitbox = [HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG];
|
HitGroup_t[] disabledHitbox = [HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG];
|
||||||
if (disabledHitbox.Contains(hitgroup))
|
if (disabledHitbox.Contains(hitgroup))
|
||||||
RestoreHealth(victim!, damage);
|
RestoreHealth(victim!, damage);
|
||||||
return HookResult.Stop;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void RestoreHealth(CCSPlayerController victim, float damage)
|
private static void RestoreHealth(CCSPlayerController victim, float damage)
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using jRandomSkills.src.utils;
|
using jRandomSkills.src.utils;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -20,54 +19,35 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
SkillPlayerInfo.Clear();
|
SkillPlayerInfo.Clear();
|
||||||
bombLocation = null;
|
bombLocation = null;
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
public static void PlayerDeath(EventPlayerDeath @event)
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
if (player == null || !player.IsValid) return;
|
||||||
|
|
||||||
var pawn = player.PlayerPawn.Value;
|
var pawn = player.PlayerPawn.Value;
|
||||||
if (pawn == null || !pawn.IsValid) return HookResult.Continue;
|
if (pawn == null || !pawn.IsValid) return;
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (playerInfo?.Skill == skillName)
|
if (playerInfo?.Skill == skillName)
|
||||||
SkillPlayerInfo.Remove(pawn);
|
SkillPlayerInfo.Remove(pawn);
|
||||||
|
}
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void BombPlanted(EventBombPlanted _)
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventBombPlanted>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault();
|
var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault();
|
||||||
if (plantedBomb != null)
|
if (plantedBomb != null)
|
||||||
bombLocation = plantedBomb.AbsOrigin;
|
bombLocation = plantedBomb.AbsOrigin;
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<OnTick>(() =>
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
if (bombLocation == null) return;
|
if (bombLocation == null) return;
|
||||||
foreach (var skillInfo in SkillPlayerInfo)
|
foreach (var skillInfo in SkillPlayerInfo)
|
||||||
|
|
@ -103,7 +83,6 @@ namespace jRandomSkills
|
||||||
if (playerController == null || !player.Controller.IsValid) return;
|
if (playerController == null || !player.Controller.IsValid) return;
|
||||||
UpdateHUD(playerController.As<CCSPlayerController>(), info);
|
UpdateHUD(playerController.As<CCSPlayerController>(), info);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
using CounterStrikeSharp.API;
|
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
|
|
@ -16,31 +15,15 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void PlayerHurt(EventPlayerHurt @event)
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
var attacker = @event!.Attacker;
|
var attacker = @event.Attacker;
|
||||||
var victim = @event!.Userid;
|
var victim = @event.Userid;
|
||||||
|
|
||||||
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim)
|
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim)
|
||||||
return HookResult.Continue;
|
return;
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
|
||||||
|
|
||||||
|
|
@ -49,9 +32,6 @@ namespace jRandomSkills
|
||||||
if (Instance.Random.NextDouble() <= playerInfo.SkillChance)
|
if (Instance.Random.NextDouble() <= playerInfo.SkillChance)
|
||||||
PushEnemy(victim, attacker!.PlayerPawn.Value!.EyeAngles);
|
PushEnemy(victim, attacker!.PlayerPawn.Value!.EyeAngles);
|
||||||
}
|
}
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -15,36 +15,19 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill != skillName) continue;
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void PlayerHurt(EventPlayerHurt @event)
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
var victim = @event.Userid;
|
var victim = @event.Userid;
|
||||||
int damage = @event.DmgHealth;
|
int damage = @event.DmgHealth;
|
||||||
string weapon = @event.Weapon;
|
string weapon = @event.Weapon;
|
||||||
|
|
||||||
if (weapon != "inferno" || !Instance.IsPlayerValid(victim)) return HookResult.Continue;
|
if (weapon != "inferno" || !Instance.IsPlayerValid(victim)) return;
|
||||||
var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID);
|
var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID);
|
||||||
if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue;
|
if (victimInfo == null || victimInfo.Skill != skillName) return ;
|
||||||
|
|
||||||
RestoreHealth(victim!, damage * regenerationMultiplier);
|
RestoreHealth(victim!, damage * regenerationMultiplier);
|
||||||
return HookResult.Stop;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@
|
||||||
using CounterStrikeSharp.API.Modules.Memory;
|
using CounterStrikeSharp.API.Modules.Memory;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -14,10 +13,9 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
Instance.RegisterListener<OnTick>(OnTick);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnTick()
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -14,10 +13,9 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
Instance.RegisterListener<OnTick>(CheckRadarowiec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void CheckRadarowiec()
|
public static void OnTick()
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -15,21 +15,6 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
if (!Instance.IsPlayerValid(player)) continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using jRandomSkills.src.utils;
|
using jRandomSkills.src.utils;
|
||||||
using System.Collections.Immutable;
|
using System.Collections.Immutable;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -26,42 +25,14 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
{
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
SkillPlayerInfo.Clear();
|
SkillPlayerInfo.Clear();
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
public static void OnTick()
|
||||||
{
|
|
||||||
var player = @event.Userid;
|
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
SkillPlayerInfo.Remove(player.SteamID);
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<OnTick>(() =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
|
|
@ -70,7 +41,6 @@ namespace jRandomSkills
|
||||||
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
|
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
|
||||||
UpdateHUD(player, skillInfo);
|
UpdateHUD(player, skillInfo);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
|
|
@ -16,35 +16,46 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventItemEquip>((@event, info) =>
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
{
|
||||||
|
zombies.Remove(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void DisableSkill(CCSPlayerController player)
|
||||||
|
{
|
||||||
|
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return;
|
||||||
|
zombies.Remove(player);
|
||||||
|
SetPlayerColor(player.PlayerPawn.Value, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WeaponEquip(EventItemEquip @event)
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
var weapon = @event.Item;
|
var weapon = @event.Item;
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
if (player == null || !player.IsValid) return;
|
||||||
if (!zombies.Contains(player) || weapon == "c4") return HookResult.Continue;
|
if (!zombies.Contains(player) || weapon == "c4") return;
|
||||||
player.ExecuteClientCommand("slot3");
|
player.ExecuteClientCommand("slot3");
|
||||||
return HookResult.Stop;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundStart>((@event, info) =>
|
public static void NewRound()
|
||||||
{
|
{
|
||||||
foreach (var player in zombies)
|
foreach (var player in zombies)
|
||||||
DisableSkill(player);
|
DisableSkill(player);
|
||||||
zombies.Clear();
|
zombies.Clear();
|
||||||
return HookResult.Stop;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
public static void PlayerDeath(EventPlayerDeath @event)
|
||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid || zombies.Contains(player)) return HookResult.Continue;
|
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid || zombies.Contains(player)) return;
|
||||||
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
if (playerInfo?.Skill != skillName) return;
|
||||||
|
|
||||||
var pawn = player.PlayerPawn.Value;
|
var pawn = player.PlayerPawn.Value;
|
||||||
if (pawn.AbsOrigin == null) return HookResult.Continue;
|
if (pawn.AbsOrigin == null) return;
|
||||||
Vector deadPosition = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z);
|
Vector deadPosition = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z);
|
||||||
QAngle deadRotation = new(pawn.EyeAngles.X, pawn.EyeAngles.Y, pawn.EyeAngles.Z);
|
QAngle deadRotation = new(pawn.EyeAngles.X, pawn.EyeAngles.Y, pawn.EyeAngles.Z);
|
||||||
|
|
||||||
|
|
@ -58,21 +69,6 @@ namespace jRandomSkills
|
||||||
player.ExecuteClientCommand("slot3");
|
player.ExecuteClientCommand("slot3");
|
||||||
Instance.AddTimer(1, () => player.ExecuteClientCommand("slot3"));
|
Instance.AddTimer(1, () => player.ExecuteClientCommand("slot3"));
|
||||||
});
|
});
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
|
||||||
{
|
|
||||||
zombies.Remove(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void DisableSkill(CCSPlayerController player)
|
|
||||||
{
|
|
||||||
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return;
|
|
||||||
zombies.Remove(player);
|
|
||||||
SetPlayerColor(player.PlayerPawn.Value, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void SetPlayerColor(CCSPlayerPawn pawn, bool normal)
|
private static void SetPlayerColor(CCSPlayerPawn pawn, bool normal)
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using jRandomSkills.src.player;
|
using jRandomSkills.src.player;
|
||||||
using jRandomSkills.src.utils;
|
using jRandomSkills.src.utils;
|
||||||
using static CounterStrikeSharp.API.Core.Listeners;
|
|
||||||
using static jRandomSkills.jRandomSkills;
|
using static jRandomSkills.jRandomSkills;
|
||||||
|
|
||||||
namespace jRandomSkills
|
namespace jRandomSkills
|
||||||
|
|
@ -17,40 +16,14 @@ namespace jRandomSkills
|
||||||
public static void LoadSkill()
|
public static void LoadSkill()
|
||||||
{
|
{
|
||||||
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
|
||||||
{
|
|
||||||
Instance.AddTimer(0.1f, () =>
|
|
||||||
{
|
|
||||||
foreach (var player in Utilities.GetPlayers())
|
|
||||||
{
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
EnableSkill(player);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
public static void NewRound()
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
|
|
||||||
{
|
{
|
||||||
SkillPlayerInfo.Clear();
|
SkillPlayerInfo.Clear();
|
||||||
return HookResult.Continue;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
public static void OnTick()
|
||||||
{
|
|
||||||
var player = @event.Userid;
|
|
||||||
if (player == null || !player.IsValid) return HookResult.Continue;
|
|
||||||
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
|
||||||
if (playerInfo?.Skill == skillName)
|
|
||||||
SkillPlayerInfo.Remove(player.SteamID);
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
|
|
||||||
Instance.RegisterListener<OnTick>(() =>
|
|
||||||
{
|
{
|
||||||
foreach (var player in Utilities.GetPlayers())
|
foreach (var player in Utilities.GetPlayers())
|
||||||
{
|
{
|
||||||
|
|
@ -59,26 +32,22 @@ namespace jRandomSkills
|
||||||
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
|
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
|
||||||
UpdateHUD(player, skillInfo);
|
UpdateHUD(player, skillInfo);
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
|
public static void PlayerHurt(EventPlayerHurt @event)
|
||||||
{
|
{
|
||||||
var attacker = @event.Attacker;
|
var attacker = @event.Attacker;
|
||||||
var victim = @event.Userid;
|
var victim = @event.Userid;
|
||||||
int damage = @event.DmgHealth;
|
int damage = @event.DmgHealth;
|
||||||
|
|
||||||
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return HookResult.Continue;
|
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return;
|
||||||
if (SkillPlayerInfo.TryGetValue(victim!.SteamID, out var skillInfo))
|
if (SkillPlayerInfo.TryGetValue(victim!.SteamID, out var skillInfo))
|
||||||
{
|
{
|
||||||
if (!victim.IsValid || !victim.PawnIsAlive || !skillInfo.CanUse) return HookResult.Continue;
|
if (!victim.IsValid || !victim.PawnIsAlive || !skillInfo.CanUse) return;
|
||||||
skillInfo.CanUse = false;
|
skillInfo.CanUse = false;
|
||||||
skillInfo.Cooldown = DateTime.Now;
|
skillInfo.Cooldown = DateTime.Now;
|
||||||
RestoreHealth(victim, damage);
|
RestoreHealth(victim, damage);
|
||||||
return HookResult.Stop;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return HookResult.Continue;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnableSkill(CCSPlayerController player)
|
public static void EnableSkill(CCSPlayerController player)
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue