public override void Added()
        {
            _chatManager.DispatchServerAnnouncement("The game is now a death match. Kill everybody else to win!");

            _entityManager.EventBus.SubscribeEvent <HealthChangedEventArgs>(EventSource.Local, this, OnHealthChanged);
            _playerManager.PlayerStatusChanged += PlayerManagerOnPlayerStatusChanged;
        }
        public override void Added()
        {
            _chatManager.DispatchServerAnnouncement("The game is now a death match. Kill everybody else to win!");

            _entityManager.SubscribeEvent <MobDamageStateChangedMessage>(_onMobDamageStateChanged, this);
            _playerManager.PlayerStatusChanged += PlayerManagerOnPlayerStatusChanged;
        }
Ejemplo n.º 3
0
        public override void Added()
        {
            _chatManager.DispatchServerAnnouncement("There are traitors on the station! Find them, and kill them!");

            _entityManager.EventBus.SubscribeEvent <MobDamageStateChangedMessage>(EventSource.Local, this, _onMobDamageStateChanged);

            Timer.SpawnRepeating(DeadCheckDelay, _checkWinConditions, _checkTimerCancel.Token);
        }
        public override void Added()
        {
            _chatManager.DispatchServerAnnouncement("There are traitors on the station! Find them, and kill them!");

            EntitySystem.Get <AudioSystem>().PlayGlobal("/Audio/Misc/tatoralert.ogg", AudioParams.Default,
                                                        (session) => session.ContentData().Mind?.HasRole <SuspicionTraitorRole>() ?? false);

            Timer.SpawnRepeating(DeadCheckDelay, _checkWinConditions, _checkTimerCancel.Token);
        }
Ejemplo n.º 5
0
    private void OnLoocEnabledChanged(bool val)
    {
        if (_loocEnabled == val)
        {
            return;
        }

        _loocEnabled = val;
        _chatManager.DispatchServerAnnouncement(
            Loc.GetString(val ? "chat-manager-looc-chat-enabled-message" : "chat-manager-looc-chat-disabled-message"));
    }
Ejemplo n.º 6
0
        public override void Added()
        {
            _chatManager.DispatchServerAnnouncement(Loc.GetString("There are traitors on the station! Find them, and kill them!"));

            bool Predicate(IPlayerSession session) => session.ContentData()?.Mind?.HasRole <SuspicionTraitorRole>() ?? false;

            EntitySystem.Get <AudioSystem>().PlayGlobal("/Audio/Misc/tatoralert.ogg", AudioParams.Default, Predicate);

            EntitySystem.Get <DoorSystem>().AccessType = DoorSystem.AccessTypes.AllowAllNoExternal;

            Timer.SpawnRepeating(DeadCheckDelay, _checkWinConditions, _checkTimerCancel.Token);
        }
Ejemplo n.º 7
0
        public override void Added()
        {
            _chatManager.DispatchServerAnnouncement(Loc.GetString("rule-death-match-added-announcement"));

            _entityManager.EventBus.SubscribeEvent <DamageChangedEventArgs>(EventSource.Local, this, OnHealthChanged);
            _playerManager.PlayerStatusChanged += PlayerManagerOnPlayerStatusChanged;
        }
Ejemplo n.º 8
0
        public override bool Start(IReadOnlyList <IPlayerSession> readyPlayers)
        {
            if (readyPlayers.Count < MinPlayers)
            {
                _chatManager.DispatchServerAnnouncement($"Not enough players readied up for the game! There were {readyPlayers.Count} players readied up out of {MinPlayers} needed.");
                return(false);
            }

            var list        = new List <IPlayerSession>(readyPlayers);
            var numTraitors = Math.Max(readyPlayers.Count() % PlayersPerTraitor, MinTraitors);

            for (var i = 0; i < numTraitors; i++)
            {
                var traitor = _random.PickAndTake(list);
                var mind    = traitor.Data.ContentData().Mind;
                mind.AddRole(new SuspicionTraitorRole(mind));
            }

            foreach (var player in list)
            {
                var mind = player.Data.ContentData().Mind;
                mind.AddRole(new SuspicionInnocentRole(mind));
            }

            _gameTicker.AddGameRule <RuleSuspicion>();
            return(true);
        }
Ejemplo n.º 9
0
        public override void Added()
        {
            _chatManager.DispatchServerAnnouncement(Loc.GetString("Hello crew! Have a good shift!"));

            bool Predicate(IPlayerSession session) => session.ContentData()?.Mind?.HasRole <TraitorRole>() ?? false;

            EntitySystem.Get <AudioSystem>().PlayGlobal("/Audio/Misc/tatoralert.ogg", AudioParams.Default, Predicate);
        }
Ejemplo n.º 10
0
        public override void Added()
        {
            _chatManager.DispatchServerAnnouncement(Loc.GetString("Hello crew! Have a good shift!"));

            var filter = Filter.Empty()
                         .AddWhere(session => ((IPlayerSession)session).ContentData()?.Mind?.HasRole <TraitorRole>() ?? false);

            SoundSystem.Play(filter, "/Audio/Misc/tatoralert.ogg", AudioParams.Default);
        }
Ejemplo n.º 11
0
        public override void Added()
        {
            _chatManager.DispatchServerAnnouncement(Loc.GetString("rule-traitor-added-announcement"));

            var filter = Filter.Empty()
                         .AddWhere(session => ((IPlayerSession)session).ContentData()?.Mind?.HasRole <TraitorRole>() ?? false);

            SoundSystem.Play(filter, _addedSound.GetSound(), AudioParams.Default);
        }
Ejemplo n.º 12
0
        private void EndRound()
        {
            OnRoundEndCountdownFinished?.Invoke();
            _gameTicker.EndRound();

            _chatManager.DispatchServerAnnouncement(Loc.GetString("Restarting the round in {0} seconds...", RestartRoundTime));

            Timer.Spawn(TimeSpan.FromSeconds(RestartRoundTime), () => _gameTicker.RestartRound(), CancellationToken.None);
        }
Ejemplo n.º 13
0
        private void _checkWinConditions()
        {
            var traitorsAlive  = 0;
            var innocentsAlive = 0;

            foreach (var playerSession in _playerManager.GetAllPlayers())
            {
                if (playerSession.AttachedEntity == null ||
                    !playerSession.AttachedEntity.TryGetComponent(out SpeciesComponent species))
                {
                    continue;
                }

                if (!species.CurrentDamageState.IsConscious)
                {
                    continue;
                }
                if (playerSession.ContentData().Mind.HasRole <SuspicionTraitorRole>())
                {
                    traitorsAlive++;
                }
                else
                {
                    innocentsAlive++;
                }
            }

            if ((innocentsAlive + traitorsAlive) == 0)
            {
                _chatManager.DispatchServerAnnouncement("Everybody is dead, it's a stalemate!");
                EndRound();
            }

            else if (traitorsAlive == 0)
            {
                _chatManager.DispatchServerAnnouncement("The traitors are dead! The innocents win.");
                EndRound();
            }
            else if (innocentsAlive == 0)
            {
                _chatManager.DispatchServerAnnouncement("The innocents are dead! The traitors win.");
                EndRound();
            }
        }
Ejemplo n.º 14
0
        public override bool Start(IReadOnlyList <IPlayerSession> readyPlayers, bool force = false)
        {
            if (!force && readyPlayers.Count < MinPlayers)
            {
                _chatManager.DispatchServerAnnouncement($"Not enough players readied up for the game! There were {readyPlayers.Count} players readied up out of {MinPlayers} needed.");
                return(false);
            }

            var list     = new List <IPlayerSession>(readyPlayers);
            var prefList = new List <IPlayerSession>();

            foreach (var player in list)
            {
                if (!readyProfiles.ContainsKey(player.Name))
                {
                    continue;
                }
                var profile = readyProfiles[player.Name];
                if (profile.AntagPreferences.Contains(_prototypeManager.Index <AntagPrototype>(TraitorID).Name))
                {
                    prefList.Add(player);
                }
            }

            var numTraitors = FloatMath.Clamp(readyPlayers.Count % PlayersPerTraitor,
                                              MinTraitors, readyPlayers.Count);

            for (var i = 0; i < numTraitors; i++)
            {
                IPlayerSession traitor;
                if (prefList.Count() == 0)
                {
                    traitor = _random.PickAndTake(list);
                    Logger.InfoS("preset", "Insufficient preferred traitors, picking at random.");
                }
                else
                {
                    traitor = _random.PickAndTake(prefList);
                    list.Remove(traitor);
                    Logger.InfoS("preset", "Selected a preferred traitor.");
                }
                var mind           = traitor.Data.ContentData().Mind;
                var antagPrototype = _prototypeManager.Index <AntagPrototype>(TraitorID);
                mind.AddRole(new SuspicionTraitorRole(mind, antagPrototype));
            }

            foreach (var player in list)
            {
                var mind           = player.Data.ContentData().Mind;
                var antagPrototype = _prototypeManager.Index <AntagPrototype>(InnocentID);
                mind.AddRole(new SuspicionInnocentRole(mind, antagPrototype));
            }

            _gameTicker.AddGameRule <RuleSuspicion>();
            return(true);
        }
Ejemplo n.º 15
0
        public override void HandleMessage(EuiMessageBase msg)
        {
            switch (msg)
            {
            case AdminAnnounceEuiMsg.Close:
                Close();
                break;

            case AdminAnnounceEuiMsg.DoAnnounce doAnnounce:
                if (!_adminManager.HasAdminFlag(Player, AdminFlags.Admin))
                {
                    Close();
                    break;
                }

                switch (doAnnounce.AnnounceType)
                {
                case AdminAnnounceType.Server:
                    _chatManager.DispatchServerAnnouncement(doAnnounce.Announcement);
                    break;

                // TODO: Per-station announcement support
                case AdminAnnounceType.Station:
                    _chatSystem.DispatchGlobalAnnouncement(doAnnounce.Announcement, doAnnounce.Announcer, colorOverride: Color.Gold);
                    break;
                }

                StateDirty();

                if (doAnnounce.CloseAfter)
                {
                    Close();
                }

                break;
            }
        }
Ejemplo n.º 16
0
        public override void HandleMessage(EuiMessageBase msg)
        {
            switch (msg)
            {
            case AdminAnnounceEuiMsg.Close:
                Close();
                break;

            case AdminAnnounceEuiMsg.DoAnnounce doAnnounce:
                if (!_adminManager.HasAdminFlag(Player, AdminFlags.Admin))
                {
                    Close();
                    break;
                }

                switch (doAnnounce.AnnounceType)
                {
                case AdminAnnounceType.Server:
                    _chatManager.DispatchServerAnnouncement(doAnnounce.Announcement);
                    break;

                case AdminAnnounceType.Station:
                    _chatManager.DispatchStationAnnouncement(doAnnounce.Announcement, doAnnounce.Announcer);
                    break;
                }

                StateDirty();

                if (doAnnounce.CloseAfter)
                {
                    Close();
                }

                break;
            }
        }
Ejemplo n.º 17
0
        public override bool Start(IReadOnlyList <IPlayerSession> readyPlayers, bool force = false)
        {
            MinPlayers             = _cfg.GetCVar(CCVars.SuspicionMinPlayers);
            MinTraitors            = _cfg.GetCVar(CCVars.SuspicionMinTraitors);
            PlayersPerTraitor      = _cfg.GetCVar(CCVars.SuspicionPlayersPerTraitor);
            TraitorStartingBalance = _cfg.GetCVar(CCVars.SuspicionStartingBalance);

            if (!force && readyPlayers.Count < MinPlayers)
            {
                _chatManager.DispatchServerAnnouncement($"Not enough players readied up for the game! There were {readyPlayers.Count} players readied up out of {MinPlayers} needed.");
                return(false);
            }

            if (readyPlayers.Count == 0)
            {
                _chatManager.DispatchServerAnnouncement("No players readied up! Can't start Suspicion.");
                return(false);
            }

            var list     = new List <IPlayerSession>(readyPlayers);
            var prefList = new List <IPlayerSession>();

            foreach (var player in list)
            {
                if (!ReadyProfiles.ContainsKey(player.UserId))
                {
                    continue;
                }
                var profile = ReadyProfiles[player.UserId];
                if (profile.AntagPreferences.Contains(_prototypeManager.Index <AntagPrototype>(TraitorID).Name))
                {
                    prefList.Add(player);
                }

                player.AttachedEntity?.EnsureComponent <SuspicionRoleComponent>();
            }

            var numTraitors = MathHelper.Clamp(readyPlayers.Count / PlayersPerTraitor,
                                               MinTraitors, readyPlayers.Count);

            var traitors = new List <SuspicionTraitorRole>();

            for (var i = 0; i < numTraitors; i++)
            {
                IPlayerSession traitor;
                if (prefList.Count == 0)
                {
                    if (list.Count == 0)
                    {
                        Logger.InfoS("preset", "Insufficient ready players to fill up with traitors, stopping the selection.");
                        break;
                    }
                    traitor = _random.PickAndTake(list);
                    Logger.InfoS("preset", "Insufficient preferred traitors, picking at random.");
                }
                else
                {
                    traitor = _random.PickAndTake(prefList);
                    list.Remove(traitor);
                    Logger.InfoS("preset", "Selected a preferred traitor.");
                }
                var mind           = traitor.Data.ContentData().Mind;
                var antagPrototype = _prototypeManager.Index <AntagPrototype>(TraitorID);
                var traitorRole    = new SuspicionTraitorRole(mind, antagPrototype);
                mind.AddRole(traitorRole);
                traitors.Add(traitorRole);
                // creadth: we need to create uplink for the antag.
                // PDA should be in place already, so we just need to
                // initiate uplink account.
                var uplinkAccount =
                    new UplinkAccount(mind.OwnedEntity.Uid,
                                      TraitorStartingBalance);
                var inventory = mind.OwnedEntity.GetComponent <InventoryComponent>();
                if (!inventory.TryGetSlotItem(EquipmentSlotDefines.Slots.IDCARD, out ItemComponent pdaItem))
                {
                    continue;
                }

                var pda = pdaItem.Owner;

                var pdaComponent = pda.GetComponent <PDAComponent>();
                if (pdaComponent.IdSlotEmpty)
                {
                    continue;
                }

                pdaComponent.InitUplinkAccount(uplinkAccount);
            }

            foreach (var player in list)
            {
                var mind           = player.Data.ContentData().Mind;
                var antagPrototype = _prototypeManager.Index <AntagPrototype>(InnocentID);
                mind.AddRole(new SuspicionInnocentRole(mind, antagPrototype));
            }

            foreach (var traitor in traitors)
            {
                traitor.GreetSuspicion(traitors, _chatManager);
            }

            _gameTicker.AddGameRule <RuleSuspicion>();
            return(true);
        }
        public override bool Start(IReadOnlyList <IPlayerSession> readyPlayers, bool force = false)
        {
            MinPlayers        = _cfg.GetCVar <int>("game.suspicion_min_players");
            MinTraitors       = _cfg.GetCVar <int>("game.suspicion_min_traitors");
            PlayersPerTraitor = _cfg.GetCVar <int>("game.suspicion_players_per_traitor");

            if (!force && readyPlayers.Count < MinPlayers)
            {
                _chatManager.DispatchServerAnnouncement($"Not enough players readied up for the game! There were {readyPlayers.Count} players readied up out of {MinPlayers} needed.");
                return(false);
            }

            if (readyPlayers.Count == 0)
            {
                _chatManager.DispatchServerAnnouncement($"No players readied up! Can't start Suspicion.");
                return(false);
            }

            var list     = new List <IPlayerSession>(readyPlayers);
            var prefList = new List <IPlayerSession>();

            foreach (var player in list)
            {
                if (!readyProfiles.ContainsKey(player.Name))
                {
                    continue;
                }
                var profile = readyProfiles[player.Name];
                if (profile.AntagPreferences.Contains(_prototypeManager.Index <AntagPrototype>(TraitorID).Name))
                {
                    prefList.Add(player);
                }

                player.AttachedEntity?.EnsureComponent <SuspicionRoleComponent>();
            }

            var numTraitors = MathHelper.Clamp(readyPlayers.Count / PlayersPerTraitor,
                                               MinTraitors, readyPlayers.Count);

            var traitors = new List <SuspicionTraitorRole>();

            for (var i = 0; i < numTraitors; i++)
            {
                IPlayerSession traitor;
                if (prefList.Count == 0)
                {
                    if (list.Count == 0)
                    {
                        Logger.InfoS("preset", "Insufficient ready players to fill up with traitors, stopping the selection.");
                        break;
                    }
                    traitor = _random.PickAndTake(list);
                    Logger.InfoS("preset", "Insufficient preferred traitors, picking at random.");
                }
                else
                {
                    traitor = _random.PickAndTake(prefList);
                    list.Remove(traitor);
                    Logger.InfoS("preset", "Selected a preferred traitor.");
                }
                var mind           = traitor.Data.ContentData().Mind;
                var antagPrototype = _prototypeManager.Index <AntagPrototype>(TraitorID);
                var traitorRole    = new SuspicionTraitorRole(mind, antagPrototype);
                mind.AddRole(traitorRole);
                traitors.Add(traitorRole);
            }

            foreach (var player in list)
            {
                var mind           = player.Data.ContentData().Mind;
                var antagPrototype = _prototypeManager.Index <AntagPrototype>(InnocentID);
                mind.AddRole(new SuspicionInnocentRole(mind, antagPrototype));
            }

            foreach (var traitor in traitors)
            {
                traitor.GreetSuspicion(traitors, _chatManager);
            }

            _gameTicker.AddGameRule <RuleSuspicion>();
            return(true);
        }
 private void WatchdogOnUpdateReceived()
 {
     _chatManager.DispatchServerAnnouncement(Loc.GetString("server-updates-received"));
     _updateOnRoundEnd = true;
     ServerEmptyUpdateRestartCheck();
 }
        public override bool Start(IReadOnlyList <IPlayerSession> readyPlayers, bool force = false)
        {
            MinPlayers             = _cfg.GetCVar(CCVars.SuspicionMinPlayers);
            MinTraitors            = _cfg.GetCVar(CCVars.SuspicionMinTraitors);
            PlayersPerTraitor      = _cfg.GetCVar(CCVars.SuspicionPlayersPerTraitor);
            TraitorStartingBalance = _cfg.GetCVar(CCVars.SuspicionStartingBalance);

            if (!force && readyPlayers.Count < MinPlayers)
            {
                _chatManager.DispatchServerAnnouncement($"Not enough players readied up for the game! There were {readyPlayers.Count} players readied up out of {MinPlayers} needed.");
                return(false);
            }

            if (readyPlayers.Count == 0)
            {
                _chatManager.DispatchServerAnnouncement("No players readied up! Can't start Suspicion.");
                return(false);
            }

            var list     = new List <IPlayerSession>(readyPlayers);
            var prefList = new List <IPlayerSession>();

            foreach (var player in list)
            {
                if (!ReadyProfiles.ContainsKey(player.UserId))
                {
                    continue;
                }
                prefList.Add(player);

                player.AttachedEntity?.EnsureComponent <SuspicionRoleComponent>();
            }

            var numTraitors = MathHelper.Clamp(readyPlayers.Count / PlayersPerTraitor,
                                               MinTraitors, readyPlayers.Count);

            var traitors = new List <SuspicionTraitorRole>();

            for (var i = 0; i < numTraitors; i++)
            {
                IPlayerSession traitor;
                if (prefList.Count == 0)
                {
                    if (list.Count == 0)
                    {
                        Logger.InfoS("preset", "Insufficient ready players to fill up with traitors, stopping the selection.");
                        break;
                    }
                    traitor = _random.PickAndTake(list);
                    Logger.InfoS("preset", "Insufficient preferred traitors, picking at random.");
                }
                else
                {
                    traitor = _random.PickAndTake(prefList);
                    list.Remove(traitor);
                    Logger.InfoS("preset", "Selected a preferred traitor.");
                }
                var mind           = traitor.Data.ContentData()?.Mind;
                var antagPrototype = _prototypeManager.Index <AntagPrototype>(TraitorID);

                DebugTools.AssertNotNull(mind?.OwnedEntity);

                var traitorRole = new SuspicionTraitorRole(mind !, antagPrototype);
                mind !.AddRole(traitorRole);
                traitors.Add(traitorRole);

                // creadth: we need to create uplink for the antag.
                // PDA should be in place already, so we just need to
                // initiate uplink account.
                var uplinkAccount = new UplinkAccount(TraitorStartingBalance, mind.OwnedEntity !.Uid);
                var accounts      = EntityManager.EntitySysManager.GetEntitySystem <UplinkAccountsSystem>();
                accounts.AddNewAccount(uplinkAccount);

                // try to place uplink
                if (!EntityManager.EntitySysManager.GetEntitySystem <UplinkSystem>()
                    .AddUplink(mind.OwnedEntity, uplinkAccount))
                {
                    continue;
                }
            }

            foreach (var player in list)
            {
                var mind           = player.Data.ContentData()?.Mind;
                var antagPrototype = _prototypeManager.Index <AntagPrototype>(InnocentID);

                DebugTools.AssertNotNull(mind);

                mind !.AddRole(new SuspicionInnocentRole(mind, antagPrototype));
            }

            foreach (var traitor in traitors)
            {
                traitor.GreetSuspicion(traitors, _chatManager);
            }

            EntitySystem.Get <GameTicker>().AddGameRule <RuleSuspicion>();
            return(true);
        }
Ejemplo n.º 21
0
    public override void Started()
    {
        _chatManager.DispatchServerAnnouncement(Loc.GetString("rule-death-match-added-announcement"));

        _playerManager.PlayerStatusChanged += OnPlayerStatusChanged;
    }