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() } }
//[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); } }
public void ServerTransferTest(Player player) { McpeTransfer transfer = McpeTransfer.CreateObject(); transfer.serverAddress = "test.pmmp.io"; transfer.port = 19132; player.SendPacket(transfer); }
/// <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); }
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); } }
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); } } }
public virtual void HandleMcpeTransfer(McpeTransfer message) { }
public abstract void HandleMcpeTransfer(McpeTransfer message);
public override void HandleMcpeTransfer(McpeTransfer message) { }
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); }