public async Task Stop() { CommandWindow.Log("Stopping round"); RoundManager.Broadcast("Round has ended."); RoundTime = 600; State = RoundState.INTERMISSION; await Task.Delay(6000); Players.ToList().ForEach(p => { if (p.Status == PlayerStatus.ALIVE) { p.ReviveUnsafe(); TTTPlayer.ClearInventoryUnsafe(PlayerTool.getSteamPlayer(p.SteamID)); } }); await Task.Delay(6000); State = RoundState.SETUP; LevelManager.ClearBarricadesUnsafe(); C4Manager.ClearC4(); TrackerGunManager.ClearTrackedPlayers(); }
protected override void execute(CSteamID executor, string parameter) { SteamPlayer ply = PlayerTool.getSteamPlayer(executor); if (ply is null) { return; } TTTPlayer tttplayer = PlayerManager.GetTTTPlayer(executor); switch (parameter) { case "t": tttplayer.Role = PlayerRole.TRAITOR; tttplayer.SendMessage("Role set to traitor"); InterfaceManager.ToggleShop(ply.player, tttplayer, 8501); break; case "d": tttplayer.Role = PlayerRole.DETECTIVE; tttplayer.SendMessage("Role set to detective"); InterfaceManager.ToggleShop(ply.player, tttplayer, 8502); break; } tttplayer.SendMessage(parameter); }
private void OnEnemyConnected(SteamPlayer steamPlayer) { TTTPlayer createdPlayer = PlayerManager.CreateTTTPlayer(steamPlayer.playerID.steamID, PlayerRole.NONE, PlayerStatus.DEAD); Round.AddPlayer(createdPlayer); createdPlayer.Revive(); createdPlayer.SendMessage($"Welcome {steamPlayer.playerID.playerName} to TTTUnturned"); }
private void OnPlayerDied(PlayerLife sender, EDeathCause cause, ELimb limb, CSteamID instigator) { TTTPlayer tttPly = PlayerManager.GetTTTPlayer(sender.channel.owner.playerID.steamID); tttPly.SetStatus(PlayerStatus.DEAD); tttPly.Revive(); InterfaceManager.SendUIEffectTextUnsafe(8490, tttPly.SteamID, true, "RoleValue", "WAITING"); InterfaceManager.SendUIEffectTextUnsafe(8490, tttPly.SteamID, true, "TimerValue", "00:00"); }
private void OnChatted(SteamPlayer player, EChatMode mode, ref Color chatted, ref bool isRich, string text, ref bool isVisible) { TTTPlayer tttPlayer = PlayerManager.GetTTTPlayer(player.playerID.steamID); if (tttPlayer is null) { return; } if (mode == EChatMode.GLOBAL && GetState() != RoundState.SETUP && !player.isAdmin) { tttPlayer.SendMessage("Global chat is disabled during rounds, press K for area"); isVisible = false; } }
private void OnPluginKeyTick(Player player, uint simulation, byte key, bool state) { if (!state || key != 0) { return; } TTTPlayer tttPlayer = PlayerManager.GetTTTPlayer(player.channel.owner.playerID.steamID); if (tttPlayer is null) { return; } if (tttPlayer.GetStatus() == PlayerStatus.DEAD) { return; } if (RoundManager.GetState() != RoundState.LIVE) { return; } if (KeyCooldowns.ContainsKey(player.channel.owner.playerID.steamID)) { long lastPressed = KeyCooldowns[player.channel.owner.playerID.steamID]; // 1 second key cooldown on menu if (DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - lastPressed < 300) { return; } KeyCooldowns.Remove(player.channel.owner.playerID.steamID); } KeyCooldowns.Add(player.channel.owner.playerID.steamID, DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()); if (tttPlayer.Role == PlayerRole.TRAITOR) { ToggleShop(player, tttPlayer, 8501); } else if (tttPlayer.Role == PlayerRole.DETECTIVE) { ToggleShop(player, tttPlayer, 8502); } }
public static void ToggleShop(Player player, TTTPlayer tttPlayer, ushort effectID) { if (UIToggled.Contains(tttPlayer.SteamID)) { UIToggled.Remove(tttPlayer.SteamID); ClearUIEffectUnsafe(effectID, tttPlayer.SteamID); player.setPluginWidgetFlag(EPluginWidgetFlags.Modal, false); player.setPluginWidgetFlag(EPluginWidgetFlags.ForceBlur, false); } else { UIToggled.Add(tttPlayer.SteamID); SendUIEffectUnsafe(effectID, 8470, tttPlayer.SteamID, true); SendUIEffectTextUnsafe(8470, tttPlayer.SteamID, true, "CreditsValue", tttPlayer.Credits.ToString()); player.setPluginWidgetFlag(EPluginWidgetFlags.Modal, true); player.setPluginWidgetFlag(EPluginWidgetFlags.ForceBlur, true); } }
public async Task Start() { try { CommandWindow.Log("Warmup Starting"); RoundManager.Broadcast("Warmup Starting"); State = RoundState.WARMUP; LevelManager.RespawnItems(); Players.ToList().ForEach(p => InterfaceManager.ClearAllUI(p.SteamID)); await Task.Delay(6000); Players.ToList().ForEach(p => { p.SetStatus(PlayerStatus.ALIVE); p.TeleportToMapUnsafe(); TTTPlayer.ClearInventoryUnsafe(PlayerTool.getSteamPlayer(p.SteamID)); }); await Task.Delay(15000); CommandWindow.Log("Round is live"); RoundManager.Broadcast("The round has started."); RoleManager.GeneratePlayerRoles(); Players.ToList().ForEach(p => { if (p.GetRole() == PlayerRole.TRAITOR || p.GetRole() == PlayerRole.DETECTIVE) { p.SetCredits(2); } }); State = RoundState.LIVE; } catch (Exception ex) { CommandWindow.Log(ex); } }
public static void Prefix(byte amount, Vector3 newRagdoll, EDeathCause newCause, ELimb newLimb, CSteamID newKiller, ref EPlayerKill kill, bool trackKill, ERagdollEffect newRagdollEffect, bool canCauseBleeding, PlayerLife __instance) { Player ply = __instance.channel.owner.player; if (ply is null) { return; } TTTPlayer player = PlayerManager.GetTTTPlayer(ply.channel.owner.playerID.steamID); if (player is null) { return; } if (player.Armor) { amount = (byte)Math.Floor(amount * 0.70f); } }
public static void GeneratePlayerRoles() { if (RoundManager.GetAllAlivePlayers().Count < Main.Config.MinimumPlayers) { RoundManager.StopRound(); return; } Random rng = new Random(); List <CSteamID> tickets = new List <CSteamID>(); RoundManager.GetAllPlayers().ForEach(p => { tickets.Add(p.SteamID); }); int traitorCount = (int)Math.Floor(RoundManager.GetAllPlayers().Count / 4.0); int detectiveCount = (int)Math.Floor(RoundManager.GetAllPlayers().Count / 8.0); if (traitorCount == 0) { traitorCount = 1; } if (detectiveCount == 0) { detectiveCount = 1; } GroupInfo oldTraitorGroup = GroupManager.getGroupInfo((CSteamID)1); if (!(oldTraitorGroup is null)) { UnityThread.executeCoroutine(DeleteTraitorGroup()); } UnityThread.executeCoroutine(CreateTraitorGroup()); for (var i = 0; i < traitorCount; i++) { CSteamID selectedTraitor = tickets[rng.Next(tickets.Count)]; TTTPlayer tttPlayer = PlayerManager.GetTTTPlayer(selectedTraitor); if (tttPlayer is null) { return; } tttPlayer.SetRole(PlayerRole.TRAITOR); tttPlayer.SendMessageUnsafe("You are a <color=#C72D35>Traitor</color>"); UnityThread.executeCoroutine(SetSteamGroupEnumerator(tttPlayer.SteamID)); InterfaceManager.SendUIEffectUnsafe(8499, 8490, tttPlayer.SteamID, true); InterfaceManager.SendUIEffectTextUnsafe(8490, tttPlayer.SteamID, true, "RoleValue", "TRAITOR"); tickets.RemoveAll(x => x == selectedTraitor); } for (var i = 0; i < detectiveCount; i++) { CSteamID selectedDetective = tickets[rng.Next(tickets.Count)]; TTTPlayer tttPlayer = PlayerManager.GetTTTPlayer(selectedDetective); tttPlayer.SetRole(PlayerRole.DETECTIVE); tttPlayer.SendMessageUnsafe("You are a <color=#2263A9>Detective</color>"); tttPlayer.AddItemUnsafe(10); InterfaceManager.SendUIEffectUnsafe(8496, 8490, tttPlayer.SteamID, true); InterfaceManager.SendUIEffectTextUnsafe(8490, tttPlayer.SteamID, true, "RoleValue", "DETECTIVE"); tickets.RemoveAll(x => x == selectedDetective); } tickets.ToList().ForEach(steamID => { TTTPlayer tttPlayer = PlayerManager.GetTTTPlayer(steamID); tttPlayer.SetRole(PlayerRole.INNOCENT); tttPlayer.SendMessageUnsafe("You are a <color=#24B938>Innocent</color>"); InterfaceManager.SendUIEffectUnsafe(8497, 8490, tttPlayer.SteamID, true); InterfaceManager.SendUIEffectTextUnsafe(8490, tttPlayer.SteamID, true, "RoleValue", "INNOCENT"); tickets.RemoveAll(x => x == steamID); }); }
public void RemovePlayer(TTTPlayer player) => Players.Remove(player);
public void AddPlayer(TTTPlayer player) => Players.Add(player);
public void OnEffectButtonClicked(Player player, string buttonName) { TTTPlayer tttPlayer = PlayerManager.GetTTTPlayer(player.channel.owner.playerID.steamID); if (buttonName.Substring(0, 2) == "T_") { if (tttPlayer.Role != PlayerRole.TRAITOR) { return; } switch (buttonName.Remove(0, 2)) { case "ChargeButton": if (tttPlayer.Credits >= 4) { player.inventory.forceAddItem(new Item(1241, true), true); tttPlayer.SendMessage("You redeemed C4"); tttPlayer.RemoveCredits(4); } else { tttPlayer.SendMessage("You do not have enough credits"); } break; case "LMGButton": if (tttPlayer.Credits >= 3) { player.inventory.forceAddItem(new Item(126, true), true); tttPlayer.SendMessage("You redeemed LMG"); tttPlayer.RemoveCredits(3); } else { tttPlayer.SendMessage("You do not have enough credits"); } break; case "BombVestButton": if (tttPlayer.Credits >= 5) { player.inventory.forceAddItem(new Item(1013, true), true); tttPlayer.SendMessage("You redeemed Bomb Vest"); tttPlayer.RemoveCredits(5); } else { tttPlayer.SendMessage("You do not have enough credits"); } break; case "BodyArmourButton": if (tttPlayer.Armor == false) { if (tttPlayer.Credits >= 2) { tttPlayer.Armor = true; tttPlayer.SendMessage("You redeemed Armor Vest"); tttPlayer.RemoveCredits(2); } else { tttPlayer.SendMessage("You do not have enough credits"); } } else { tttPlayer.SendMessage("You already have Armor Vest"); } break; } SendUIEffectTextUnsafe(8470, tttPlayer.SteamID, true, "CreditsValue", tttPlayer.Credits.ToString()); } else if (buttonName.Substring(0, 2) == "D_") { if (tttPlayer.Role != PlayerRole.DETECTIVE) { return; } switch (buttonName.Remove(0, 2)) { case "HealthStationButton": if (tttPlayer.Credits >= 4) { player.inventory.forceAddItem(new Item(1050, true), true); tttPlayer.SendMessage("You redeemed a Health Station"); tttPlayer.RemoveCredits(4); } else { tttPlayer.SendMessage("You do not have enough credits"); } break; case "PrototypeButton": if (tttPlayer.Credits >= 5) { player.inventory.forceAddItem(new Item(1447, true), true); tttPlayer.SendMessage("You redeemed Prototype Scalar"); tttPlayer.RemoveCredits(5); } else { tttPlayer.SendMessage("You do not have enough credits"); } break; case "DefuserButton": if (tttPlayer.Defuser == false) { if (tttPlayer.Credits >= 3) { tttPlayer.Defuser = true; tttPlayer.SendMessage("You redeemed a Defuser"); tttPlayer.RemoveCredits(3); } else { tttPlayer.SendMessage("You do not have enough credits"); } } else { tttPlayer.SendMessage("You already have a Defuser"); } break; case "BodyArmourButton": if (tttPlayer.Armor == false) { if (tttPlayer.Credits >= 2) { tttPlayer.Armor = true; tttPlayer.SendMessage("You redeemed Armor Vest"); tttPlayer.RemoveCredits(2); } else { tttPlayer.SendMessage("You do not have enough credits"); } } else { tttPlayer.SendMessage("You already have Armor Vest"); } break; } SendUIEffectTextUnsafe(8470, tttPlayer.SteamID, true, "CreditsValue", tttPlayer.Credits.ToString()); } }
public static void Prefix(CSteamID steamID, byte id, PlayerAnimator __instance) { Player ply = __instance.channel.owner.player; if (ply is null) { return; } TTTPlayer tttplayer = PlayerManager.GetTTTPlayer(ply.channel.owner.playerID.steamID); if (tttplayer is null) { return; } if (tttplayer.Role == PlayerRole.TRAITOR) { return; } RaycastInfo traceResult = TraceRay(ply, 10f, RayMasks.BARRICADE_INTERACT); if (traceResult is null) { return; } if (traceResult.transform is null) { return; } InteractableCharge charge = traceResult.transform.gameObject.GetComponent <InteractableCharge>(); if (charge is null) { return; } byte x; byte y; ushort plant; ushort index; BarricadeRegion region; if (!BarricadeManager.tryGetInfo(charge.transform, out x, out y, out plant, out index, out region)) { return; } BarricadeManager.instance.channel.send("tellBarricadeOwnerAndGroup", ESteamCall.ALL, ESteamPacket.UPDATE_RELIABLE_BUFFER, new object[] { x, y, plant, index, (ulong)ply.channel.owner.playerID.steamID, (ulong)0 }); if (PlayerManager.GetTTTPlayer(__instance.channel.owner.playerID.steamID).Defuser) { __instance.channel.owner.player.interact.sendSalvageTimeOverride(5f); } else { __instance.channel.owner.player.interact.sendSalvageTimeOverride(10f); } //CSteamID steamID, byte x, byte y, ushort plant, ushort index, ulong newOwner, ulong newGroup }