120 lines
No EOL
5.7 KiB
C#
120 lines
No EOL
5.7 KiB
C#
using CounterStrikeSharp.API;
|
|
using CounterStrikeSharp.API.Core;
|
|
using CounterStrikeSharp.API.Modules.Utils;
|
|
using jRandomSkills.src.player;
|
|
using jRandomSkills.src.utils;
|
|
using static jRandomSkills.jRandomSkills;
|
|
using System.Collections.Concurrent;
|
|
|
|
namespace jRandomSkills
|
|
{
|
|
public class Gambler : ISkill
|
|
{
|
|
private const Skills skillName = Skills.Gambler;
|
|
|
|
public static void LoadSkill()
|
|
{
|
|
SkillUtils.RegisterSkill(skillName, SkillsInfo.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}{player.GetTranslation("areareaper_used_info")}");
|
|
return;
|
|
}
|
|
|
|
var skill = SkillData.Skills.FirstOrDefault(s => player.GetSkillName(s.Skill).Equals(commands[0], StringComparison.OrdinalIgnoreCase) || s.Skill.ToString().Equals(commands[0], StringComparison.OrdinalIgnoreCase));
|
|
if (skill == null)
|
|
{
|
|
player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("skill_not_found_setskill"));
|
|
return;
|
|
}
|
|
|
|
if (skill.Skill == skillName)
|
|
TakeMoney(player);
|
|
Instance.AddTimer(.1f, () =>
|
|
{
|
|
playerInfo.Skill = skill.Skill;
|
|
if (skill.Skill != skillName)
|
|
playerInfo.SpecialSkill = skillName;
|
|
playerInfo.SkillChance = 1;
|
|
|
|
if (SkillsInfo.GetValue<bool>(skill.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime())
|
|
Instance?.AddTimer(Math.Max((float)(Event.freezeTimeEnd - DateTime.Now).TotalSeconds, 0), () => {
|
|
if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID && p.Skill == skill.Skill) == null) return;
|
|
Instance?.SkillAction(skill.Skill.ToString(), "EnableSkill", new[] { player });
|
|
});
|
|
else
|
|
Instance?.SkillAction(skill.Skill.ToString(), "EnableSkill", new[] { 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 - SkillsInfo.GetValue<int>(skillName, "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)];
|
|
|
|
ConcurrentBag<(string, string)> menuItems = [(player.GetSkillName(firstSkill.Skill), firstSkill.Skill.ToString()),
|
|
(player.GetSkillName(secondSkill.Skill), secondSkill.Skill.ToString())];
|
|
SkillUtils.CreateMenu(player, menuItems, (player.GetTranslation("gambler_more", SkillsInfo.GetValue<int>(skillName, "refreshPrice")), skillName.ToString()));
|
|
}
|
|
|
|
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)
|
|
{
|
|
SkillsInfo.DefaultSkillInfo[] skillsNeedsTeammates = SkillsInfo.LoadedConfig.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 disableOnFreezeTime = false, bool needsTeammates = false, int refreshPrice = 150) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates)
|
|
{
|
|
public int RefreshPrice { get; set; } = refreshPrice;
|
|
}
|
|
}
|
|
} |