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(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); }