public void OnSpawning(SpawningEventArgs ev) { if (Tracking.PlayersInvisibleByCommand.Contains(ev.Player)) { Tracking.PlayersInvisibleByCommand.Remove(ev.Player); } Timing.CallDelayed(Subclass.Instance.CommonUtilsEnabled ? 2f : 0.1f, () => { Tracking.QueuedCassieMessages.Clear(); if (Tracking.NextSpawnWave.Contains(ev.Player) && Tracking.NextSpawnWaveGetsRole.ContainsKey(ev.Player.Role)) { Tracking.RemoveAndAddRoles(ev.Player, true); Tracking.AddClass(ev.Player, Tracking.NextSpawnWaveGetsRole[ev.Player.Role]); } else { if (!Tracking.PlayersWithSubclasses.ContainsKey(ev.Player)) { Tracking.RemoveAndAddRoles(ev.Player, false, Subclass.Instance.Scp035Enabled && scp035.API.Scp035Data.GetScp035()?.Id == ev.Player.Id); } } foreach (string message in Tracking.QueuedCassieMessages) { Cassie.Message(message, true, false); Log.Debug($"Sending message via cassie: {message}", Subclass.Instance.Config.Debug); } Tracking.CheckRoundEnd(); }); }
public void MaybeAddRoles(EPlayer player, bool is035 = false) { if (!rolesForClass.ContainsKey(player.Role)) { rolesForClass.Add(player.Role, Subclass.Instance.Classes.Values.Count(e => e.BoolOptions["Enabled"] && e.AffectsRoles.Contains(player.Role))); } if (rolesForClass[player.Role] > 0) { List <Team> teamsAlive = EPlayer.List.Select(p1 => p1.Team).ToList(); teamsAlive.RemoveAll(t => t == Team.RIP); foreach (var item in Tracking.PlayersWithSubclasses.Where(s => s.Value.EndsRoundWith != Team.RIP)) { teamsAlive.Remove(item.Key.Team); teamsAlive.Add(item.Value.EndsRoundWith); } teamsAlive.ForEach(t => { if (t == Team.CDP) { t = Team.CHI; } else if (t == Team.RSC) { t = Team.MTF; } else if (t == Team.TUT) { t = Team.SCP; } }); if (!Subclass.Instance.Config.AdditiveChance) { Log.Debug($"Evaluating possible subclasses for player with name {player.Nickname}", Subclass.Instance.Config.Debug); foreach (SubClass subClass in Subclass.Instance.Classes.Values.Where(e => e.BoolOptions["Enabled"] && e.AffectsRoles.Contains(player.Role) && (!e.IntOptions.ContainsKey("MaxSpawnPerRound") || Tracking.ClassesSpawned(e) < e.IntOptions["MaxSpawnPerRound"]) && (!e.BoolOptions.ContainsKey("OnlyAffectsSpawnWave") || !e.BoolOptions["OnlyAffectsSpawnWave"]))) { Log.Debug($"Evaluating possible subclass {subClass.Name} for player with name {player.Nickname}", Subclass.Instance.Config.Debug); if ((rnd.NextDouble() * 100) < subClass.FloatOptions["ChanceToGet"] && (!subClass.IntOptions.ContainsKey("MaxAlive") || Tracking.PlayersWithSubclasses.Where(e => e.Value.Name == subClass.Name).Count() < subClass.IntOptions["MaxAlive"]) && (subClass.EndsRoundWith == Team.RIP || teamsAlive.Contains(subClass.EndsRoundWith))) { Log.Debug($"{player.Nickname} attempting to be given subclass {subClass.Name}", Subclass.Instance.Config.Debug); Tracking.AddClass(player, subClass, is035); } else { Log.Debug($"Player with name {player.Nickname} did not get subclass {subClass.Name}", Subclass.Instance.Config.Debug); } } } else { Log.Debug($"Evaluating possible subclasses for player with name {player.Nickname}", Subclass.Instance.Config.Debug); double num = (rnd.NextDouble() * 100); if (!Subclass.Instance.ClassesAdditive.ContainsKey(player.Role)) { return; } foreach (var possibity in Subclass.Instance.ClassesAdditive[player.Role].Where(e => e.Key.BoolOptions["Enabled"] && e.Key.AffectsRoles.Contains(player.Role) && (!e.Key.BoolOptions.ContainsKey("OnlyAffectsSpawnWave") || !e.Key.BoolOptions["OnlyAffectsSpawnWave"]))) { Log.Debug($"Evaluating possible subclass {possibity.Key.Name} for player with name {player.Nickname}", Subclass.Instance.Config.Debug); if (num < possibity.Value && (!possibity.Key.IntOptions.ContainsKey("MaxAlive") || Tracking.PlayersWithSubclasses.Where(e => e.Value.Name == possibity.Key.Name).Count() < possibity.Key.IntOptions["MaxAlive"]) && (!possibity.Key.IntOptions.ContainsKey("MaxSpawnPerRound") || Tracking.ClassesSpawned(possibity.Key) < possibity.Key.IntOptions["MaxSpawnPerRound"]) && (possibity.Key.EndsRoundWith == Team.RIP || teamsAlive.Contains(possibity.Key.EndsRoundWith))) { Log.Debug($"{player.Nickname} attempting to be given subclass {possibity.Key.Name}", Subclass.Instance.Config.Debug); Tracking.AddClass(player, possibity.Key, is035); break; } else { Log.Debug($"Player with name {player.Nickname} did not get subclass {possibity.Key.Name}", Subclass.Instance.Config.Debug); } } } } else { Log.Debug($"No subclasses for {player.Role}", Subclass.Instance.Config.Debug); } }
public bool Execute(ArraySegment <string> arguments, ICommandSender sender, out string response) { if (sender is PlayerCommandSender player) { Player p = Player.Get(player.SenderId); if (!p.CheckPermission("sc.giveclass")) { response = "You do not have the necessary permissions to run this command. Requires: sc.giveclass"; return(false); } if (arguments.Count == 0) { response = "Command syntax should be subclass (player id) [class]."; return(false); } try { if (Player.Get(Int32.Parse(arguments.Array[arguments.Offset])) != null) { Player player1 = Player.Get(Int32.Parse(arguments.Array[arguments.Offset])); if (!Subclass.Instance.Classes.ContainsKey(String.Join(" ", arguments.Array.Segment(arguments.Offset + 1)))) { response = "Class not found."; return(false); } else { if (!Subclass.Instance.Classes[String.Join(" ", arguments.Array.Segment(arguments.Offset + 1))].AffectsRoles.Contains(player1.Role)) { response = "They are not the proper role for this class."; return(false); } else { Tracking.RemoveAndAddRoles(player1, true); Tracking.AddClass(player1, Subclass.Instance.Classes[String.Join(" ", arguments.Array.Segment(arguments.Offset + 1))]); response = "Success."; return(true); } } } else { response = "Player not found."; return(false); } } catch { if (!Subclass.Instance.Classes.ContainsKey(String.Join(" ", arguments.Array.Segment(arguments.Offset)))) { response = "Class not found."; return(false); } else { if (!Subclass.Instance.Classes[String.Join(" ", arguments.Array.Segment(arguments.Offset))].AffectsRoles.Contains(p.Role)) { response = "You are not the proper role for this class."; return(false); } else { Tracking.RemoveAndAddRoles(p, true); Tracking.AddClass(p, Subclass.Instance.Classes[String.Join(" ", arguments.Array.Segment(arguments.Offset))]); response = "Success."; return(true); } } } } response = ""; return(false); }