Esempio n. 1
0
        public void TagPlayer(DistancePlayer player)
        {
            if (TaggedPlayer == player)
            {
                Log.Debug("Player same");
                return;
            }
            if (player == null)
            {
                Log.Debug("Player null");
                TaggedPlayer = null;
                return;
            }

            var    lastTagData       = TaggedPlayer?.GetExternalData <ReverseTagData>();
            double lastSecondsTagged = lastTagData == null ? 0.0 : lastTagData.SecondsTagged;

            TimeOfLastTag = Plugin.Server.ModeTime;
            var networkTagData = new Distance::Events.ReverseTag.TaggedPlayer.Data(player.Index, lastSecondsTagged, TimeOfLastTag);

            DistanceServerMain.GetEvent <Events.ServerToClient.TaggedPlayer>().Fire(UnityEngine.RPCMode.Others, networkTagData);

            TaggedPlayer = player;

            LockTagBubbleFor(5);
        }
Esempio n. 2
0
 public bool IsPlayerInMode(DistancePlayer player)
 {
     return(player.Valid &&
            !player.IsLoading() &&
            player.LevelId == Plugin.Server.CurrentLevelId &&
            player.Car != null &&
            !player.Car.Finished &&
            player.GetExternalData <ReverseTagData>() != null);
 }
Esempio n. 3
0
        public System.Collections.IEnumerator GiveTagBubbleSoon(DistancePlayer fromPlayer, DistancePlayer player)
        {
            yield return(new UnityEngine.WaitForSeconds(1));

            if (IsPlayerInMode(player) && TaggedPlayer == fromPlayer)
            {
                fromPlayer.GetExternalData <ReverseTagData>().SecondsTagged = 0.0;
                TagPlayer(player);
            }
            fromPlayer.SayLocalChat(DistanceChat.Server("ReverseTag:SinglePlayerTransition", "Transitioning out of single-player: your timer has been reset and your tag bubble taken!"));
        }
Esempio n. 4
0
        public void Update()
        {
            if (Finished)
            {
                return;
            }
            if (Plugin.ServerStage != BasicAutoServer.Stage.Started)
            {
                return;
            }

            var playersInMode = GetModePlayers();

            if (playersInMode.Count <= 1)
            {
                IsInSinglePlayerMode = true;
                MaxModeTime         += UnityEngine.Time.deltaTime;
            }
            else if (IsInSinglePlayerMode)
            {
                IsInSinglePlayerMode = false;
                // When transitioning out of single-player mode, give the bubble to the new player to reset the timer:
                if (TaggedPlayer != null)
                {
                    var nonTagged = playersInMode.Find((player) => TaggedPlayer != player);
                    if (nonTagged != null)
                    {
                        TaggedPlayer.GetExternalData <ReverseTagData>().SecondsTagged = 0.0;
                        DistanceServerMainStarter.Instance.StartCoroutine(GiveTagBubbleSoon(TaggedPlayer, nonTagged));
                    }
                }
            }

            if (TaggedPlayer != null && !IsPlayerInMode(TaggedPlayer))
            {
                TagRandomLastPlacePlayer();
                if (!IsPlayerInMode(TaggedPlayer))
                {
                    TagPlayer(null);
                }
            }

            if (TaggedPlayer != null && !IsInSinglePlayerMode)
            {
                TaggedPlayer.GetExternalData <ReverseTagData>().AddSecondsTagged(UnityEngine.Time.deltaTime, WinTime);
            }

            var leader = GetFirstPlacePlayer();

            if (leader != Leader)
            {
                if (leader != null)
                {
                    var colorHex    = Distance::ColorEx.ColorToHexNGUI(Distance::ColorEx.PlayerRainbowColor(leader.Index));
                    var nameColored = $"[{colorHex}]{leader.Name}[-]";
                    var chat        = DistanceChat.Server("Vanilla:TakenTheLead", $"{nameColored} has taken the lead!");
                    chat.ChatType = DistanceChat.ChatTypeEnum.ServerVanilla;
                    Plugin.Server.SayChat(chat);
                }
                Leader = leader;
            }

            var leaderSecondsTagged = Leader == null ? 0.0 : Leader.GetExternalData <ReverseTagData>().SecondsTagged;

            if (leaderSecondsTagged >= WinTime || Plugin.Server.ModeTime >= MaxModeTime)
            {
                Finished = true;

                if (Leader != null)
                {
                    var networkFinishedData = new Distance::Events.ReverseTag.Finished.Data(Leader.Index, leaderSecondsTagged);
                    DistanceServerMain.GetEvent <Events.ServerToClient.ReverseTagFinished>().Fire(UnityEngine.RPCMode.Others, networkFinishedData);
                }

                Log.Debug($"Advancing level because win condition met: {leaderSecondsTagged} >= {WinTime} || {Plugin.Server.ModeTime} > {MaxModeTime}");
                Plugin.AdvanceLevel();
            }

            if (Finished)
            {
                return;
            }

            AdvanceLevelIfOnlyFinishedPlayers();

            var secondsLeft = Math.Max(0.0, Math.Min(WinTime - leaderSecondsTagged, MaxModeTime - Plugin.Server.ModeTime));

            if (secondsLeft <= 30 && !HasShown30SecondWarning)
            {
                HasShown30SecondWarning = true;
                var colorHex = Distance::ColorEx.ColorToHexNGUI(Distance::Colors.orangeRed);
                var chat     = DistanceChat.Server("Vanilla:TimeWarning", $"[{colorHex}]30 seconds left![-]");
                chat.ChatType = DistanceChat.ChatTypeEnum.ServerVanilla;
                Plugin.Server.SayChat(chat);
            }
            else if (secondsLeft <= 10 && !HasShown10SecondWarning)
            {
                HasShown10SecondWarning = true;
                var colorHex = Distance::ColorEx.ColorToHexNGUI(Distance::Colors.orangeRed);
                var chat     = DistanceChat.Server("Vanilla:TimeWarning", $"[{colorHex}]10 seconds left![-]");
                chat.ChatType = DistanceChat.ChatTypeEnum.ServerVanilla;
                Plugin.Server.SayChat(chat);
            }
        }