Example #1
0
 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();
     });
 }
Example #2
0
        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);
        }