Пример #1
0
        public override void EnterState(GameLevel gameLevel)
        {
            gameLevel.DoForAllPlayers(player =>
            {
                player.RemoveAllEffects();

                player.SetGameMode(GameMode.Adventure);
            });

            GameLevelInfo gameLevelInfo = gameLevel.GameLevelInfo;

            //Spawn Lobby NPC
            if (gameLevelInfo.LobbyNPCLocation == null)
            {
                gameLevelInfo.LobbyNPCLocation = new PlayerLocation(260.5, 15, 251.5);

                File.WriteAllText(GameController.GetGameLevelInfoLocation(gameLevel.GameType, gameLevel.LevelName), JsonConvert.SerializeObject(gameLevel.GameLevelInfo, Formatting.Indented));
                SkyUtil.log($"LobbyNPCLocation Updated with default value for {gameLevel.LevelName}");
            }

            _spawnedEntities = PlayerNPC.SpawnLobbyNPC(gameLevel, gameLevelInfo.GameType, gameLevel.GameLevelInfo.LobbyNPCLocation);

            gameLevel.AddPendingTask(() =>
            {
                //Spawn Lobby Map/Image
                if (gameLevelInfo.LobbyMapLocation.Y < 0)         //Default == -1
                {
                    gameLevelInfo.LobbyMapLocation = new BlockCoordinates(252, 15, 249);

                    File.WriteAllText(GameController.GetGameLevelInfoLocation(gameLevel.GameType, gameLevel.LevelName), JsonConvert.SerializeObject(gameLevel.GameLevelInfo, Formatting.Indented));
                }

                _spawnedEntities.AddRange(MapUtil.SpawnMapImage(@"C:\Users\Administrator\Desktop\dl\map-images\TestImage.png", 7, 4, gameLevel, gameLevelInfo.LobbyMapLocation));
            });
        }
Пример #2
0
        public override void HandleLeave(GameLevel gameLevel, SkyPlayer player)
        {
            base.HandleLeave(gameLevel, player);

            if (((MurderLevel)gameLevel).Murderer == player)
            {
                //Re-select murderer
                List <SkyPlayer> players = gameLevel.GetPlayersInTeam(MurderTeam.Innocent);
                int murdererIdx          = Random.Next(players.Count);

                int i = 0;
                foreach (SkyPlayer gamePlayer in players)
                {
                    if (++i == murdererIdx)
                    {
                        gameLevel.SetPlayerTeam(gamePlayer, MurderTeam.Murderer);

                        InitializeMurderer(gamePlayer);
                        gameLevel.DoForAllPlayers(playerLoop =>
                        {
                            if (playerLoop == gamePlayer)
                            {
                                return;
                            }

                            TitleUtil.SendCenteredSubtitle(playerLoop, "§fA new §c§lMurderer\n§fhas been selected");
                        });
                        break;
                    }
                }
            }
        }
Пример #3
0
        public override void OnTick(GameLevel gameLevel, int currentTick, out int outTick)
        {
            base.OnTick(gameLevel, currentTick, out outTick);

            int secondsLeft = GetSecondsLeft();

            if (secondsLeft > (MaxGameTime / 2))
            {
                return;                 //Ignore until the ticker has finished
            }
            if (secondsLeft == 0)
            {
                gameLevel.UpdateGameState(GetNextGameState(gameLevel));
                return;
            }

            ITickableInformation tickableInformation = GetTickableInformation(null);

            gameLevel.DoForAllPlayers(player =>
            {
                if (player.KnownPosition.Y < 64)
                {
                    PlayerLocation resetLocation = ((BuildBattleTeam)player.GameTeam).SpawnLocation;
                    resetLocation.Z -= 15;                     //Spawn just outside buildable area

                    player.Teleport(resetLocation);
                }

                SendTickableMessage(gameLevel, player, tickableInformation);
            });
        }
Пример #4
0
        public override void EnterState(GameLevel gameLevel)
        {
            base.EnterState(gameLevel);

            gameLevel.DoForAllPlayers(player =>
            {
                player.Inventory.Clear();
                player.AddExperience(-1000, true);                 //Reset gun cooldowns
            });

            //MurderVictoryType victoryType;

            SkyPlayer murderer = ((MurderLevel)gameLevel).Murderer;

            //Innocents Win (Murderer Dead)
            if (gameLevel.GetPlayersInTeam(MurderTeam.Murderer).Count == 0)
            {
                //victoryType = MurderVictoryType.MURDERER_DEAD;

                gameLevel.DoForAllPlayers(player =>
                {
                    TitleUtil.SendCenteredSubtitle(player, $"§a§lInnocents §r§7§lWin§r\n§7{murderer?.Username ?? "An Unknown Player"} §fwas the Murderer!");
                });
            }
            //Murderer Wins (Innocents + Detective Dead)
            else if (gameLevel.GetPlayersInTeam(MurderTeam.Innocent, MurderTeam.Detective).Count == 0)
            {
                //victoryType = MurderVictoryType.CONQUEST;

                gameLevel.DoForAllPlayers(player =>
                {
                    TitleUtil.SendCenteredSubtitle(player, $"§c§lMurderer §r§7§lWins§r\n§7{murderer?.Username ?? "An Unknown Player"} §fwas the Murderer!");
                });
            }
            //Innocents Win (Timeout)
            else
            {
                //victoryType = MurderVictoryType.TIMEOUT;

                gameLevel.DoForAllPlayers(player =>
                {
                    TitleUtil.SendCenteredSubtitle(player, $"§a§lInnocents §r§7Win\n§7{murderer?.Username ?? "An Unknown Player"} §fwas the Murderer!");
                });
            }
        }
Пример #5
0
        public override void InitializePlayer(GameLevel gameLevel, SkyPlayer player)
        {
            //Runs the join message once the player's permissions have loaded
            player.AddPostLoginTask(() =>
            {
                gameLevel.DoForAllPlayers(gamePlayer =>
                {
                    //§f(§e{gameLevel.GetPlayerCount()}/{gameLevel.GetMaxPlayers()}§f)
                    gamePlayer.BarHandler.AddMinorLine($"§e{player.PlayerGroup.Prefix} {player.Username}§r §7entered the game!");
                });
            });

            player.SendPlayerInventory();
        }
Пример #6
0
        public override void OnTick(GameLevel gameLevel, int currentTick, out int outTick)
        {
            outTick = currentTick;

            if (TimeRemaining-- >= 0)
            {
                string message;
                if (TimeRemaining == 0)
                {
                    message = "§r§f §r";
                }
                else
                {
                    int timeRemaining = TimeRemaining / 2;
                    message = $"§d§lGame Ended:§r §fNext Game in §7{timeRemaining} §fSecond{(timeRemaining != 1 ? "s" : "")}...";
                }

                gameLevel.DoForAllPlayers(player =>
                {
                    player.BarHandler.AddMajorLine(message, 4, 3);
                });
            }
            else
            {
                List <SkyPlayer> remainingPlayers = gameLevel.GetAllPlayers();
                if (remainingPlayers.Count > 0)
                {
                    foreach (SkyPlayer player in remainingPlayers)
                    {
                        gameLevel.RemovePlayer(player);

                        if (SkyCoreAPI.IsRebootQueued)
                        {
                            player.BarHandler.AddMajorLine(("§d§lGame Ending: §r§fMoving to Network Lobby..."), 20, 7);
                            ExternalGameHandler.AddPlayer(player, "hub");
                        }
                        else
                        {
                            ExternalGameHandler.AddPlayer(player, gameLevel.GameType);
                        }
                    }
                }

                Thread.Sleep(5000);

                gameLevel.UpdateGameState(new VoidGameState());
            }
        }
Пример #7
0
        public override void LeaveState(GameLevel gameLevel)
        {
            foreach (MurderGunPartEntity item in GunParts.Values)
            {
                item.DespawnEntity();
            }

            gameLevel.DoForAllPlayers(player =>
            {
                player.SetHideNameTag(false);
                player.IsAlwaysShowName = true;
                player.SetNameTagVisibility(true);
            });

            GunParts.Clear();
        }
Пример #8
0
        public override void LeaveState(GameLevel gameLevel)
        {
            gameLevel.DoForAllPlayers(player =>
            {
                player.RemoveAllEffects();

                player.SetHideNameTag(false);
                player.SetNameTagVisibility(true);

                if (SkyCoreAPI.IsRebootQueued)
                {
                    ExternalGameHandler.AddPlayer(player, "hub");
                }
                else
                {
                    ExternalGameHandler.AddPlayer(player, gameLevel.GameType);
                }
            });
        }
Пример #9
0
        public override void EnterState(GameLevel gameLevel)
        {
            base.EnterState(gameLevel);

            gameLevel.AllowBreak = false;
            gameLevel.AllowBuild = false;

            gameLevel.DoForAllPlayers(player =>
            {
                player.Inventory.Clear();

                player.SetNameTagVisibility(true);

                //Toggle Flight
                player.SetAllowFly(true);
                player.IsFlying = true;

                player.SendAdventureSettings();
            });
        }
Пример #10
0
        public override void OnTick(GameLevel gameLevel, int currentTick, out int outTick)
        {
            outTick = currentTick;

            //Update BarHandlers for all online players every 500 milliseconds (1 tick)
            gameLevel.DoForAllPlayers(player => player.BarHandler?.DoTick());

            //DISABLE PARTICLES UNTIL THE 0,0 BUG IS FIXED

            /*if (currentTick % 2 == 0)
             * {
             *      //Do Hub Particles
             *      for (int i = 0; i < ParticleEventCount; i++)
             *      {
             *              Vector3 particleLocation = HubCentreLocation.ToVector3();
             *
             *              particleLocation.X += (Random.Next(2) == 0 ? -1 : 1) * (float)(Random.NextDouble() * 25);
             *              particleLocation.Y += (Random.Next(2) == 0 ? -1 : 1) * (float)(Random.NextDouble() * 15);
             *              particleLocation.Z += (Random.Next(2) == 0 ? -1 : 1) * (float)(Random.NextDouble() * 25);
             *
             *              McpeLevelEvent particleEvent = McpeLevelEvent.CreateObject();
             *              particleEvent.eventId = 0x4000 | (int) ParticleType.WitchSpell;
             *              particleEvent.position = particleLocation;
             *              particleEvent.data = 13369599;
             *              gameLevel.RelayBroadcast(particleEvent);
             *      }
             * }*/

            if (currentTick % 2 == 0)
            {
                foreach (SkyPlayer player in gameLevel.Players.Values)
                {
                    //Player is not initialized yet.
                    if (player == null || !player.IsConnected || player.KnownPosition == null)
                    {
                        continue;
                    }

                    if (IsInPortal(player.KnownPosition))
                    {
                        PlayerLocation teleportLocation = player.KnownPosition;
                        teleportLocation.Z -= 2;

                        player.Teleport(teleportLocation);

                        try
                        {
                            GameUtil.ShowGameList(player);
                        }
                        catch (Exception e)
                        {
                            BugSnagUtil.ReportBug(e, this, player);
                        }
                    }
                    else if (IsInInvisRegion(player.KnownPosition))
                    {
                        if (player.IsGameSpectator)
                        {
                            continue;
                        }

                        //SkyUtil.log($"Isnt Game Spectator in team {player.GameTeam.DisplayName}. Setting to Spectator");
                        gameLevel.SetPlayerTeam(player, HubTeam.Spectator);
                    }
                    else if (player.IsGameSpectator)
                    {
                        //SkyUtil.log($"Is Game Spectator in team {player.GameTeam.DisplayName}. Setting to Player");
                        gameLevel.SetPlayerTeam(player, HubTeam.Player);
                    }
                }
            }
        }
Пример #11
0
        public override void OnTick(GameLevel gameLevel, int currentTick, out int outTick)
        {
            base.OnTick(gameLevel, currentTick, out outTick);

            int secondsLeft;

            if (EndTick == -1)
            {
                secondsLeft = 0;                 //Trigger a initial refresh
            }
            else
            {
                secondsLeft = (EndTick - currentTick) / 2;
            }

            if (secondsLeft > MaxVoteTime / 2)
            {
                return;                 //Ignore until the ticker has finished
            }
            if (secondsLeft == 0)
            {
                //Can't execute first run
                if (_currentVotingPlayer != null)
                {
                    //Tally up votes

                    int currentVoteCount = 0;

                    gameLevel.DoForAllPlayers(player =>
                    {
                        switch (player.Inventory.InHandSlot)
                        {
                        case 2:
                            currentVoteCount += 1;
                            break;

                        case 3:
                            currentVoteCount += 2;
                            break;

                        case 4:
                            currentVoteCount += 3;
                            break;

                        case 5:
                            currentVoteCount += 4;
                            break;

                        case 6:
                            currentVoteCount += 5;
                            break;

                        default:
                            if (player.Inventory.InHandSlot < 2)
                            {
                                currentVoteCount += 1;                                         //2
                            }
                            else if (player.Inventory.InHandSlot > 6)
                            {
                                currentVoteCount += 5;
                            }
                            break;
                        }
                    });

                    _voteTally.TryAdd(_currentVotingPlayer, currentVoteCount);
                }
                else
                {
                    //Reset gamemode during voting phase
                    gameLevel.DoForAllPlayers(player =>
                    {
                        //player.UseCreativeInventory = false;
                        player.UpdateGameMode(GameMode.Adventure, true);
                    });
                }

                //Pick another player, or end the phase if all voting has finished
                BuildBattleLevel buildLevel = (BuildBattleLevel)gameLevel;

                SkyPlayer nextVotePlayer = null;
                do
                {
                    var gameTeam = buildLevel.BuildTeams[++_currentVotingTeam];

                    List <SkyPlayer> teamPlayer = buildLevel.GetPlayersInTeam(gameTeam);
                    if (teamPlayer.Count > 0)
                    {
                        nextVotePlayer = teamPlayer[0];
                    }
                } while (nextVotePlayer == null && _currentVotingTeam < buildLevel.BuildTeams.Count - 1);

                if (nextVotePlayer == null)
                {
                    gameLevel.UpdateGameState(GetNextGameState(gameLevel));
                    return;
                }

                _currentVotingPlayer = nextVotePlayer;

                EndTick = gameLevel.Tick + MaxVoteTime;

                List <PlayerLocation> voteLocations = ((BuildBattleLevel)gameLevel).GetVoteLocations((BuildBattleTeam)_currentVotingPlayer.GameTeam);

                int i = -1;
                gameLevel.DoForAllPlayers(player =>
                {
                    player.SetAllowFly(true);
                    player.IsFlying = true;
                    player.SendAdventureSettings();

                    if (player == _currentVotingPlayer)
                    {
                        player.Inventory.Clear();                         //Remove voting possibility

                        PlayerLocation teleportLocation = (PlayerLocation)((BuildBattleTeam)player.GameTeam).SpawnLocation.Clone();
                        teleportLocation.Y += 10;

                        player.Teleport(teleportLocation);
                    }
                    else
                    {
                        i++;

                        for (int j = 1; j < 6; j++)
                        {
                            player.Inventory.SetInventorySlot(1 + j, new ItemVote(j, _currentVotingPlayer.Username));
                        }

                        player.Inventory.SetHeldItemSlot(4);                         //Default to middle rating if AFK

                        PlayerLocation voteSpawnLocation      = voteLocations[i];
                        BlockCoordinates voteSpawnCoordinates = voteSpawnLocation.GetCoordinates3D();
                        while (!player.Level.IsAir(voteSpawnCoordinates))
                        {
                            voteSpawnCoordinates.Y++;
                        }

                        voteSpawnLocation = new PlayerLocation(voteSpawnCoordinates.X, voteSpawnCoordinates.Y, voteSpawnCoordinates.Z,
                                                               voteSpawnLocation.HeadYaw, voteSpawnLocation.Yaw, voteSpawnLocation.Pitch);

                        player.Teleport(voteSpawnLocation);
                    }

                    TitleUtil.SendCenteredSubtitle(player, $"§d§lVoting for:\n§7{nextVotePlayer.Username}");
                });
            }

            gameLevel.DoForAllPlayers(player =>
            {
                SendTickableMessage(gameLevel, player, GetTickableInformation(_currentVotingPlayer));
            });
        }
        public override void EnterState(GameLevel gameLevel)
        {
            base.EnterState(gameLevel);

            gameLevel.DoForAllPlayers(player =>
            {
                player.Inventory.Clear();
            });

            SkyPlayer winningPlayer = null;
            List <KeyValuePair <SkyPlayer, int> > topPlayers = null;

            if (_voteTally != null)
            {
                topPlayers = new List <KeyValuePair <SkyPlayer, int> >();
                foreach (SkyPlayer player in _voteTally.Keys)
                {
                    topPlayers.Add(new KeyValuePair <SkyPlayer, int>(player, _voteTally[player]));
                }

                topPlayers.Sort((x, y) => 0 - x.Value.CompareTo(y.Value));

                int i = 0;
                foreach (KeyValuePair <SkyPlayer, int> topPlayer in topPlayers)
                {
                    if (++i > 1)                     //Top 1 Player for now
                    {
                        break;
                    }

                    //If the player has left, skip them.
                    if (!gameLevel.PlayerTeamDict.ContainsKey(topPlayer.Key.Username))
                    {
                        i = 0;
                    }
                    else
                    {
                        winningPlayer = topPlayer.Key;
                    }
                }
            }

            string winningPlayerName = winningPlayer == null ? "Unknown..." : winningPlayer.Username;

            List <PlayerLocation> podiumLocations;

            if (winningPlayer == null)
            {
                BuildBattleTeam podiumCentre;
                if (topPlayers == null || topPlayers.Count == 0)
                {
                    //Pick a random team
                    podiumCentre = ((BuildBattleLevel)gameLevel).BuildTeams[0];
                }
                else
                {
                    //Pick a random player
                    podiumCentre = (BuildBattleTeam)topPlayers[0].Key.GameTeam;
                }

                podiumLocations = ((BuildBattleLevel)gameLevel).GetVoteLocations(podiumCentre);
            }
            else
            {
                podiumLocations = ((BuildBattleLevel)gameLevel).GetVoteLocations((BuildBattleTeam)winningPlayer.GameTeam);
            }

            int j = 0;

            gameLevel.DoForAllPlayers(player =>
            {
                player.SetAllowFly(true);
                player.IsFlying = true;

                player.SendAdventureSettings();

                player.Inventory.Clear();

                TitleUtil.SendCenteredSubtitle(player, $"§a§lWinning Builder\n§7{winningPlayerName}");

                if (player == winningPlayer)
                {
                    PlayerLocation teleportLocation = (PlayerLocation)((BuildBattleTeam)player.GameTeam).SpawnLocation.Clone();
                    teleportLocation.Y += 10;

                    player.Teleport(teleportLocation);
                }
                else
                {
                    player.Teleport(podiumLocations[j]);

                    j++;
                }
            });

            RunnableTask.RunTaskLater(() =>
            {
                gameLevel.UpdateGameState(GetNextGameState(gameLevel));
            }, 5000);
        }
Пример #13
0
        public override void EnterState(GameLevel gameLevel)
        {
            base.EnterState(gameLevel);

            GunPartLocations.Clear();
            PlayerSpawnLocations.Clear();

            GunPartLocations.AddRange(((MurderLevelInfo)((MurderLevel)gameLevel).GameLevelInfo).GunPartLocations);
            PlayerSpawnLocations.AddRange(((MurderLevelInfo)((MurderLevel)gameLevel).GameLevelInfo).PlayerSpawnLocations);

            while (PlayerSpawnLocations.Count < gameLevel.GetMaxPlayers())
            {
                PlayerSpawnLocations.Add(((MurderLevelInfo)((MurderLevel)gameLevel).GameLevelInfo).PlayerSpawnLocations[0]);
            }

            EndTick = gameLevel.Tick + MaxGameTime + PreStartTime;

            try
            {
                RunnableTask.RunTask(() =>
                {
                    //Create new collection due to iterating over a live list
                    ICollection <SkyPlayer> players = gameLevel.GetAllPlayers();
                    foreach (SkyPlayer player in players)
                    {
                        player.SetEffect(new Blindness {
                            Duration = 80, Particles = false
                        });                                                                           //Should be 3 seconds?

                        player.SetHideNameTag(true);
                        player.IsAlwaysShowName = false;
                        player.SetNameTagVisibility(false);
                    }

                    List <PlayerLocation> usedSpawnLocations = new List <PlayerLocation>();
                    gameLevel.DoForAllPlayers(player =>
                    {
                        //Pre-add all players to the map to avoid any unnecessary contains
                        if (PlayerAmmoCounts.ContainsKey(player.Username))
                        {
                            PlayerAmmoCounts[player.Username] = 0;
                        }
                        else
                        {
                            PlayerAmmoCounts.Add(player.Username, 0);
                        }

                        if (PlayerGunPartCounts.ContainsKey(player.Username))
                        {
                            PlayerGunPartCounts[player.Username] = 0;
                        }
                        else
                        {
                            PlayerGunPartCounts.Add(player.Username, 0);
                        }

                        player.SetGameMode(GameMode.Adventure);

                        //Avoid spawning two players in the same location
                        PlayerLocation spawnLocation;
                        while (usedSpawnLocations.Contains((spawnLocation = PlayerSpawnLocations[Random.Next(PlayerSpawnLocations.Count)])))
                        {
                            //
                        }

                        usedSpawnLocations.Add(spawnLocation);

                        //Mark spawn position for AFK Check
                        player.SpawnPosition = spawnLocation;
                        player.Teleport(spawnLocation);

                        player.SetHideNameTag(true);
                        player.IsAlwaysShowName = false;
                        player.SetNameTagVisibility(false);

                        player.Freeze(true);

                        player.HungerManager.Hunger = 6;                       //Set food to 'unable to run' level.
                        player.SendUpdateAttributes();                         //TODO: Not required? Or is this required for Hunger
                    });

                    List <MurderTeam> teamRotation = new List <MurderTeam> {
                        MurderTeam.Murderer, MurderTeam.Detective, MurderTeam.Innocent
                    };
                    int offset = Random.Next(teamRotation.Count);
                    for (int i = 0; i < 12; i++)
                    {
                        MurderTeam team = teamRotation[(offset + i) % 3];
                        foreach (SkyPlayer player in players)
                        {
                            TitleUtil.SendCenteredSubtitle(player, team.TeamPrefix + "§l" + team.TeamName);

                            //Poorly enforce speed
                            if (i == 0 || i == 11)
                            {
                                player.Freeze(true);
                                player.SetHideNameTag(true);
                                player.IsAlwaysShowName = false;
                                player.SetNameTagVisibility(false);
                            }
                        }

                        //SkyUtil.log($"Printed scroll {i}/12, with {team.TeamPrefix + "§l" + team.TeamName}");
                        Thread.Sleep(250);
                    }

                    int murdererIdx = Random.Next(players.Count),
                    detectiveIdx    = 0;

                    int idx = 0;
                    while (++idx < 50 && (detectiveIdx = Random.Next(players.Count)) == murdererIdx)
                    {
                        //
                    }

                    //Console.WriteLine($"Rolled Murderer as {murdererIdx} Detective as {detectiveIdx} with 0-{players.Count - 1} possible indexes");

                    idx = 0;
                    foreach (SkyPlayer player in players)
                    {
                        if (idx == murdererIdx)
                        {
                            gameLevel.SetPlayerTeam(player, MurderTeam.Murderer);
                        }
                        else if (idx == detectiveIdx)
                        {
                            gameLevel.SetPlayerTeam(player, MurderTeam.Detective);
                        }
                        else
                        {
                            gameLevel.SetPlayerTeam(player, MurderTeam.Innocent);
                        }

                        idx++;
                    }

                    //Workaround for one player (single murderer)
                    if (((MurderLevel)gameLevel).Detective == null)
                    {
                        ((MurderLevel)gameLevel).Detective = ((MurderLevel)gameLevel).Murderer;
                    }

                    gameLevel.DoForPlayersIn(player =>
                    {
                        TitleUtil.SendCenteredSubtitle(player, "§a§lInnocent §r\n§7Track down the murderer!");
                    }, MurderTeam.Innocent);

                    gameLevel.DoForPlayersIn(player =>
                    {
                        TitleUtil.SendCenteredSubtitle(player, "§9§lDetective §r\n§7Track down the murderer!");

                        player.Inventory.SetInventorySlot(0, new ItemInnocentGun());
                        //SkyUtil.log($"In Slot 0 = {player.Inventory.GetSlots()[0].GetType().FullName}");
                        player.Inventory.SetInventorySlot(9, new ItemArrow());

                        PlayerAmmoCounts[player.Username] = int.MaxValue;
                    }, MurderTeam.Detective);

                    gameLevel.DoForPlayersIn(InitializeMurderer, MurderTeam.Murderer);

                    gameLevel.DoForAllPlayers(player =>
                    {
                        player.SendAdventureSettings();

                        player.Freeze(false);

                        //Ensure this player is at the correct spawn location
                        if (gameLevel.GetBlock(player.KnownPosition).Id != 0)
                        {
                            PlayerLocation newLocation = (PlayerLocation)player.KnownPosition.Clone();
                            newLocation.Y++;

                            player.Teleport(newLocation);
                        }
                    });
                });
            }
            catch (Exception e)
            {
                BugSnagUtil.ReportBug(e, this, gameLevel);
            }
        }
Пример #14
0
        public override void EnterState(GameLevel gameLevel)
        {
            EndTick = gameLevel.Tick + MaxGameTime + PreStartTime;

            RunnableTask.RunTask(() =>
            {
                ICollection <MiNET.Player> players = new List <MiNET.Player>(gameLevel.Players.Values);

                foreach (BuildBattleTeam gameTeam in ((BuildBattleLevel)gameLevel).BuildTeams)
                {
                    foreach (SkyPlayer player in gameLevel.GetPlayersInTeam(gameTeam))
                    {
                        player.IsWorldImmutable = true;                         //Prevent Breaking
                        //player.IsWorldBuilder = false;
                        player.Teleport(gameTeam.SpawnLocation);

                        player.SetAllowFly(true);
                        player.IsFlying = true;

                        player.SendAdventureSettings();

                        player.UseCreativeInventory = true;
                        player.UpdateGameMode(GameMode.Creative, false);

                        player.SetNameTagVisibility(false);
                    }
                }

                List <BuildBattleTheme> categoryRotation = ((BuildBattleLevel)gameLevel).ThemeList;
                {
                    int initialTheme = Random.Next(categoryRotation.Count);
                    for (int i = initialTheme; i < (initialTheme + 12); i++)
                    {
                        BuildBattleTheme category = categoryRotation[i % categoryRotation.Count];
                        foreach (MiNET.Player player in players)
                        {
                            TitleUtil.SendCenteredSubtitle(player, category.ThemeName);
                        }

                        Thread.Sleep(250);
                    }
                }

                SelectedCategory = categoryRotation[Random.Next(categoryRotation.Count)];
                gameLevel.DoForAllPlayers(player =>
                {
                    player.IsWorldImmutable = true;                     //Allow breaking
                    //player.IsWorldBuilder = false;
                    player.SendAdventureSettings();

                    player.UpdateGameMode(GameMode.Creative, true);

                    string secondLine = "§fYou have §75 minutes§f, let's go!";

                    TitleUtil.SendCenteredSubtitle(player, $"{SelectedCategory.ThemeName}\n{secondLine}");

                    player.Inventory.Clear();
                    for (int i = 0; i < SelectedCategory.TemplateItems.Count; i++)
                    {
                        player.Inventory.SetInventorySlot(i, SelectedCategory.TemplateItems[i].GetItem());
                    }

                    //Ensure this player is at the correct spawn location
                    if (gameLevel.GetBlock(player.KnownPosition).Id != 0)
                    {
                        PlayerLocation newLocation = (PlayerLocation)player.KnownPosition.Clone();
                        newLocation.Y++;

                        player.Teleport(newLocation);
                    }
                });

                gameLevel.AllowBreak = true;
                gameLevel.AllowBuild = true;
            });
        }