コード例 #1
0
        private void DelayedProcessing(PlayerNetworkSession playerSession, ConnectedPackage package)
        {
            Player player = playerSession.Player;

            if (ForwardAllPlayers)
            {
                var transfer = McpeTransfer.CreateObject();
                transfer.endpoint = ForwardTarget;
                player.SendPackage(transfer, true);

                return;
            }

            List <Package> messages = package.Messages;

            foreach (var message in messages)
            {
                //message.DatagramSequenceNumber = package._datagramSequenceNumber;
                //message.ReliableMessageNumber = package._reliableMessageNumber;
                //message.OrderingChannel = package._orderingChannel;
                //message.OrderingIndex = package._orderingIndex;

                if (message is SplitPartPackage)
                {
                    HandleSplitMessage(playerSession, package, (SplitPartPackage)message, player);

                    continue;
                }

                message.Timer.Restart();
                HandlePackage(message, playerSession);
                message.PutPool();                 // Handled in HandlePacket now()
            }
        }
コード例 #2
0
        //[Authorize(Permission = UserPermission.Op)]
        public void DisplayRestartNotice(Player currentPlayer)
        {
            var players = currentPlayer.Level.GetSpawnedPlayers();

            foreach (var player in players)
            {
                player.AddPopup(new Popup()
                {
                    Priority = 100, MessageType = MessageType.Tip, Message = "SERVER WILL RESTART!", Duration = 20 * 10,
                });

                player.AddPopup(new Popup()
                {
                    Priority = 100, MessageType = MessageType.Popup, Message = "Transfering all players!", Duration = 20 * 10,
                });
            }

            foreach (var player in players)
            {
                McpeTransfer transfer = McpeTransfer.CreateObject();
                transfer.serverAddress = "yodamine.com";
                transfer.port          = 19132;
                player.SendPackage(transfer);
            }
        }
コード例 #3
0
ファイル: CommandHandler.cs プロジェクト: wqd1019dqw/Alex
        public void ServerTransferTest(Player player)
        {
            McpeTransfer transfer = McpeTransfer.CreateObject();

            transfer.serverAddress = "test.pmmp.io";
            transfer.port          = 19132;

            player.SendPacket(transfer);
        }
コード例 #4
0
        /// <summary>
        ///		Transfers the player to a different server
        ///		Note, only supports IPv4 addresses
        /// </summary>
        /// <param name="endpoint">The endpoint to transfer to</param>
        /// <exception cref="NotSupportedException">Thrown when the endpoint isn't an IPv4 Address</exception>
        public void TransferToServer(IPEndPoint endpoint)
        {
            if (endpoint.AddressFamily == AddressFamily.InterNetworkV6)
            {
                throw new NotSupportedException("IPV6 is currently not supported!");
            }

            McpeTransfer transfer = McpeTransfer.CreateObject();

            transfer.port          = (ushort)endpoint.Port;
            transfer.serverAddress = endpoint.Address.ToString();
            SendPacket(transfer);
        }
コード例 #5
0
        public override void HandleMcpeTransfer(McpeTransfer message)
        {
            BaseClient.SendDisconnectionNotification();
            BaseClient.StopClient();

            IPHostEntry hostEntry = Dns.GetHostEntry(message.serverAddress);

            if (hostEntry.AddressList.Length > 0)
            {
                var ip = hostEntry.AddressList[0];
                AlexInstance.ConnectToServer(new IPEndPoint(ip, message.port), BaseClient.PlayerProfile, true);
            }
        }
コード例 #6
0
        public void AddPlayer(SkyPlayer player)
        {
            InstanceInfo bestGameInstance  = null;
            GameInfo     bestAvailableGame = null;

            //SkyUtil.log($"Checking available games from all instances for {GameName} ({_gameInstances.Count} total instances to search)");

            //Check current instance first
            if (_gameInstances.ContainsKey("local") && !SkyCoreAPI.IsRebootQueued)             //Avoid moving players to this server if it's about to reboot
            {
                InstanceInfo instanceInfo = _gameInstances["local"];

                string currentGameId = null;
                if (player.Level is GameLevel level)
                {
                    currentGameId = level.GameId;
                }

                GameInfo nextBestGame = null;
                foreach (GameInfo gameInfo in instanceInfo.AvailableGames)
                {
                    //SkyUtil.log($"Checking {gameInfo.GameId} on {instanceInfo.HostAddress}");
                    if ((bestAvailableGame == null || gameInfo.CurrentPlayers > bestAvailableGame.CurrentPlayers))
                    {
                        //Try to avoid placing the player in the game they just came from.
                        //Use this game as a fallback to avoid moving players off this instance.
                        if (currentGameId != null && currentGameId.Equals(gameInfo.GameId))
                        {
                            bestGameInstance = instanceInfo;
                            nextBestGame     = gameInfo;
                            continue;
                        }

                        //SkyUtil.log("Found best game!");
                        bestGameInstance  = instanceInfo;
                        bestAvailableGame = gameInfo;
                    }
                }

                if (bestAvailableGame == null)
                {
                    bestAvailableGame = nextBestGame;
                }
            }

            if (bestAvailableGame == null)
            {
                foreach (InstanceInfo instanceInfo in _gameInstances.Values)
                {
                    //SkyUtil.log($"Checking instance {instanceInfo.HostAddress} Available Servers: {instanceInfo.AvailableGames.Count}");
                    foreach (GameInfo gameInfo in instanceInfo.AvailableGames)
                    {
                        //SkyUtil.log($"Checking {gameInfo.GameId} on {instanceInfo.HostAddress}");
                        if (bestAvailableGame == null || gameInfo.CurrentPlayers > bestAvailableGame.CurrentPlayers)
                        {
                            //SkyUtil.log("Found best game!");
                            bestGameInstance  = instanceInfo;
                            bestAvailableGame = gameInfo;
                        }
                    }
                }
            }

            if (bestAvailableGame == null)
            {
                player.Freeze(false);                 //Unfreeze

                TitleUtil.SendCenteredSubtitle(player, $"§c§lGAME {(GetCurrentPlayers() > 0 ? "FULL" : "UNAVAILABLE")}§r\n§7Try joining again soon!", false);
            }
            else
            {
                if (player.Level is GameLevel level)
                {
                    if (player.Level.LevelId.Equals(bestAvailableGame.GameId))
                    {
                        return;                         //Cannot change game into current game.
                    }

                    //Remove player from level to avoid issues
                    level.RemovePlayer(player);
                }

                if (bestGameInstance.HostAddress.Equals("local"))
                {
                    SkyCoreAPI.Instance.GameModes[GameName].InstantQueuePlayer(player, bestAvailableGame);
                }
                else
                {
                    ExternalGameHandler.RedisPool.GetSubscriber().PublishAsync($"{GameName}_join", $"{player.Username}:{GameName}:{bestAvailableGame.GameId}");

                    McpeTransfer transferPacket = new McpeTransfer
                    {
                        serverAddress = bestGameInstance.HostAddress,
                        port          = bestGameInstance.HostPort
                    };

                    player.SendPackage(transferPacket);

                    MiNET.Worlds.Level playerLevel = player.Level;
                    RunnableTask.RunTaskLater(() =>
                    {
                        if (playerLevel.Players.ContainsKey(player.EntityId))
                        {
                            if (playerLevel is GameLevel gameLevel)
                            {
                                gameLevel.RemovePlayer(player);
                            }

                            playerLevel.RemoveEntity(player);

                            playerLevel.Players.TryRemove(player.EntityId, out _);
                        }
                    }, 1000);
                }
            }
        }
コード例 #7
0
 public virtual void HandleMcpeTransfer(McpeTransfer message)
 {
 }
コード例 #8
0
 public abstract void HandleMcpeTransfer(McpeTransfer message);
コード例 #9
0
ファイル: BedrockTraceHandler.cs プロジェクト: kroer/MiNET
 public override void HandleMcpeTransfer(McpeTransfer message)
 {
 }
コード例 #10
0
        private Packet CreatePe(byte messageId, ReadOnlyMemory <byte> buffer)
        {
            Packet packet = null;

            try
            {
                switch (messageId)
                {
                case 0x37:
                    packet = new AdventureSettings();
                    break;

                case 0x55:
                    packet = McpeTransfer.CreateObject();
                    //packet = new AdventureSettings();

                    break;

                case 0x0b:
                    packet = new StartGame();
                    break;

                case 0x34:
                    packet = new CraftingData();
                    break;

                case 0x91:
                    packet = new CreativeContent();
                    break;
                //  case 0x07:
                //      packet = new McpeResourcePackStack();
                //      break;
                // case 0x0c:
                //     packet = new AddPlayer();
                //     break;

                //The following are only here so we can join.
                //  case 0x1F:
                //    packet = new MobEquipment();
                //  break;
                //  case 0x20:
                //       packet = new MobArmorEquipment();

                //       break;
                //case 0x27:
                //     packet = new SetEntityData();
                //     break;
                //  case 0x31:
                //      packet = new InventoryContent();
                //      break;
                //   case 0x32:
                //       packet = new InventorySlot();
                //       break;
                case 0x6f:     //Fixes entity delta
                    packet = new EntityDelta();
                    break;
                    //      case 0x77:
                    //          packet = new AvailableEntityIdentifiers();
                    //          break;
                    //      case 0x7a:
                    //          packet = new BiomeDefinitionList();
                    //          break;
                }

                packet?.Decode(buffer);
            }
            catch (Exception ex)
            {
                //  if (messageId != 0x31)
                {
                    Log.Error(ex, $"Processing error: {ex.ToString()}");
                }
            }

            return(packet);
        }