示例#1
0
        public override void DespawnFromPlayers(Player[] players)
        {
            {
                var fake = new Player(null, null)
                {
                    ClientUuid = ClientUuid,
                    EntityId   = EntityId,
                    NameTag    = NameTag,
                    Skin       = Skin
                };

                McpePlayerList playerList = McpePlayerList.CreateObject();
                playerList.records = new PlayerRemoveRecords {
                    fake
                };
                Level.RelayBroadcast(players, Level.CreateMcpeBatch(playerList.Encode()));
                playerList.records = null;
                playerList.PutPool();
            }

            McpeRemoveEntity mcpeRemovePlayer = McpeRemoveEntity.CreateObject();

            mcpeRemovePlayer.entityIdSelf = EntityId;
            Level.RelayBroadcast(players, mcpeRemovePlayer);
        }
示例#2
0
 public override void HandleMcpePlayerList(McpePlayerList message)
 {
     foreach (var playerRecord in message.records)
     {
         Log.Warn($"{playerRecord.GetType()} Player: {playerRecord.DisplayName}, {playerRecord.EntityId}, {playerRecord.ClientUuid}");
     }
 }
示例#3
0
        public void SpawnToAll(Player newPlayer)
        {
            lock (_playerWriteLock)
            {
                // The player list keeps us from moving this completely to player.
                // It's simply to slow and bad.

                Player[]      players        = GetSpawnedPlayers();
                List <Player> spawnedPlayers = players.ToList();

                Player[] sendList = spawnedPlayers.ToArray();

                McpePlayerList playerListMessage = McpePlayerList.CreateObject();
                playerListMessage.records = new PlayerAddRecords(spawnedPlayers);
                newPlayer.SendPackage(CreateMcpeBatch(playerListMessage.Encode()));
                playerListMessage.records = null;
                playerListMessage.PutPool();

                McpePlayerList playerList = McpePlayerList.CreateObject();
                playerList.records = new PlayerAddRecords {
                    newPlayer
                };
                RelayBroadcast(newPlayer, sendList, CreateMcpeBatch(playerList.Encode()));
                playerList.records = null;
                playerList.PutPool();

                newPlayer.SpawnToPlayers(players);

                foreach (Player spawnedPlayer in players)
                {
                    spawnedPlayer.SpawnToPlayers(new[] { newPlayer });
                }
            }
        }
示例#4
0
        public void DespawnFromAll(Player player)
        {
            lock (_playerWriteLock)
            {
                var spawnedPlayers = GetSpawnedPlayers();

                foreach (Player spawnedPlayer in spawnedPlayers)
                {
                    spawnedPlayer.DespawnFromPlayers(new[] { player });
                }

                player.DespawnFromPlayers(spawnedPlayers);

                McpePlayerList playerListMessage = McpePlayerList.CreateObject();
                playerListMessage.records = new PlayerRemoveRecords(spawnedPlayers);
                player.SendPackage(CreateMcpeBatch(playerListMessage.Encode()));
                playerListMessage.records = null;
                playerListMessage.PutPool();

                McpePlayerList playerList = McpePlayerList.CreateObject();
                playerList.records = new PlayerRemoveRecords {
                    player
                };
                RelayBroadcast(player, CreateMcpeBatch(playerList.Encode()));
                playerList.records = null;
                playerList.PutPool();
            }
        }
示例#5
0
        protected virtual void SpawnToAll()
        {
            {
                Player fake = new Player(null, null, 0)
                {
                    ClientUuid = Uuid,
                    EntityId   = EntityId,
                    NameTag    = NameTag ?? Name,
                    Skin       = Skin
                };

                McpePlayerList playerList = McpePlayerList.CreateObject();
                playerList.records = new PlayerAddRecords {
                    fake
                };
                Level.RelayBroadcast(playerList);
            }

            McpeAddPlayer message = McpeAddPlayer.CreateObject();

            message.uuid     = Uuid;
            message.username = NameTag ?? Name;
            message.entityId = EntityId;
            message.x        = KnownPosition.X;
            message.y        = KnownPosition.Y;
            message.z        = KnownPosition.Z;
            message.yaw      = KnownPosition.Yaw;
            message.headYaw  = KnownPosition.HeadYaw;
            message.pitch    = KnownPosition.Pitch;
            message.metadata = GetMetadata();

            Level.RelayBroadcast(message);

            SendEquipment();

            SendArmor();

            {
                Player fake = new Player(null, null, 0)
                {
                    ClientUuid = Uuid,
                    EntityId   = EntityId,
                    NameTag    = NameTag ?? Name,
                    Skin       = Skin
                };

                McpePlayerList playerList = McpePlayerList.CreateObject();
                playerList.records = new PlayerRemoveRecords {
                    fake
                };
                Level.RelayBroadcast(playerList);
            }
        }
示例#6
0
文件: PlayerMob.cs 项目: vvzar/MiNET
        public override void SpawnToPlayer(Player player)
        {
            {
                Player fake = new Player(null, null, 0)
                {
                    ClientUuid = Uuid,
                    EntityId   = EntityId,
                    NameTag    = NameTag ?? Name,
                    Skin       = Skin
                };

                McpePlayerList playerList = McpePlayerList.CreateObject();
                playerList.records = new PlayerAddRecords {
                    fake
                };
                player.SendPackage(playerList);
                //player.SendDirectPackage(playerList);
            }

            {
                McpeAddPlayer message = McpeAddPlayer.CreateObject();
                message.uuid     = Uuid;
                message.username = NameTag ?? Name;
                message.entityId = EntityId;
                message.x        = KnownPosition.X;
                message.y        = KnownPosition.Y;
                message.z        = KnownPosition.Z;
                message.yaw      = KnownPosition.Yaw;
                message.headYaw  = KnownPosition.HeadYaw;
                message.pitch    = KnownPosition.Pitch;
                message.metadata = GetMetadata();
                player.SendPackage(message);
            }
            {
                McpePlayerEquipment message = McpePlayerEquipment.CreateObject();
                message.entityId = EntityId;
                message.item     = ItemInHand;
                message.slot     = 0;
                player.SendPackage(message);
            }
            {
                McpePlayerArmorEquipment armorEquipment = McpePlayerArmorEquipment.CreateObject();
                armorEquipment.entityId   = EntityId;
                armorEquipment.helmet     = new MetadataSlot(new ItemStack());
                armorEquipment.chestplate = new MetadataSlot(new ItemStack());
                armorEquipment.leggings   = new MetadataSlot(new ItemStack());
                armorEquipment.boots      = new MetadataSlot(new ItemStack());
                player.SendPackage(armorEquipment);
            }
        }
示例#7
0
        public override void HandleMcpePlayerList(McpePlayerList message)
        {
            if (message.records is PlayerAddRecords addRecords)
            {
                foreach (var r in addRecords)
                {
                    var u = new API.Utils.UUID(r.ClientUuid.GetBytes());
                    if (_players.ContainsKey(u))
                    {
                        continue;
                    }

                    Texture2D skinTexture;
                    if (r.Skin.TryGetBitmap(out Bitmap skinBitmap))
                    {
                        skinTexture =
                            TextureUtils.BitmapToTexture2D(BaseClient.WorldProvider.Alex.GraphicsDevice, skinBitmap);
                    }
                    else
                    {
                        BaseClient.WorldProvider.Alex.Resources.ResourcePack.TryGetBitmap("entity/alex", out Bitmap rawTexture);
                        skinTexture = TextureUtils.BitmapToTexture2D(BaseClient.WorldProvider.Alex.GraphicsDevice, rawTexture);
                    }

                    BaseClient.WorldReceiver?.AddPlayerListItem(new PlayerListItem(u, r.DisplayName, Gamemode.Survival, 0));
                    PlayerMob m = new PlayerMob(r.DisplayName, BaseClient.WorldReceiver as World, BaseClient, skinTexture, true);

                    if (!_players.TryAdd(u, m))
                    {
                        Log.Warn($"Duplicate player record! {r.ClientUuid}");
                    }
                }
            }
            else if (message.records is PlayerRemoveRecords removeRecords)
            {
                foreach (var r in removeRecords)
                {
                    var u = new UUID(r.ClientUuid.GetBytes());
                    if (_players.TryRemove(u, out var player))
                    {
                        BaseClient.WorldReceiver?.RemovePlayerListItem(u);
                        if (BaseClient.WorldReceiver is World w)
                        {
                            w.DespawnEntity(player.EntityId);
                        }
                    }
                }
            }
        }
示例#8
0
文件: Level.cs 项目: Eros/MiNET
        public void DespawnFromAll(Player player)
        {
            lock (_playerWriteLock)
            {
                List <Player> spawnedPlayers = GetSpawnedPlayers().ToList();

                McpePlayerList playerListMessage = McpePlayerList.CreateObject();
                playerListMessage.records = new PlayerRemoveRecords(spawnedPlayers);
                var bytes = playerListMessage.Encode();
                playerListMessage.records = null;

                MemoryStream memStream = new MemoryStream();
                memStream.Write(BitConverter.GetBytes(Endian.SwapInt32(bytes.Length)), 0, 4);
                memStream.Write(bytes, 0, bytes.Length);

                McpeBatch batch  = McpeBatch.CreateObject();
                byte[]    buffer = Player.CompressBytes(memStream.ToArray(), CompressionLevel.Optimal);
                batch.payloadSize = buffer.Length;
                batch.payload     = buffer;
                batch.Encode();
                player.SendPackage(batch);

                foreach (Player spawnedPlayer in spawnedPlayers)
                {
                    SendRemoveForPlayer(player, spawnedPlayer, false);
                }

                McpePlayerList playerList = McpePlayerList.CreateObject();
                playerList.records = new PlayerRemoveRecords {
                    player
                };
                playerList.Encode();
                playerList.records = null;
                RelayBroadcast(player, playerList);

                McpeRemovePlayer removePlayerMessage = McpeRemovePlayer.CreateObject();
                removePlayerMessage.clientUuid = player.ClientUuid;
                removePlayerMessage.entityId   = player.EntityId;
                RelayBroadcast(player, removePlayerMessage);
            }
        }
示例#9
0
        public void RemoveFromPlayerList()
        {
            var fake = new Player(null, null)
            {
                ClientUuid = ClientUuid,
                EntityId   = EntityId,
                NameTag    = NameTag,
                Skin       = Skin
            };

            var players = Level.GetSpawnedPlayers();

            var playerList = McpePlayerList.CreateObject();

            playerList.records = new PlayerRemoveRecords {
                fake
            };
            Level.RelayBroadcast(players, Level.CreateMcpeBatch(playerList.Encode()));
            playerList.records = null;
            playerList.PutPool();
        }
示例#10
0
        public override void DespawnFromPlayers(Player[] players)
        {
            {
                Player fake = new Player(null, null)
                {
                    ClientUuid = Uuid,
                    EntityId   = EntityId,
                    NameTag    = NameTag,
                    Skin       = Skin
                };

                McpePlayerList playerList = McpePlayerList.CreateObject();
                playerList.records = new PlayerRemoveRecords {
                    fake
                };
                Level.RelayBroadcast(players, playerList);
            }

            McpeRemoveEntity mcpeRemovePlayer = McpeRemoveEntity.CreateObject();

            mcpeRemovePlayer.entityId = EntityId;
            Level.RelayBroadcast(players, mcpeRemovePlayer);
        }
示例#11
0
        public override void DespawnFromPlayer(Player player)
        {
            {
                Player fake = new Player(null, null, 0)
                {
                    ClientUuid = Uuid,
                    EntityId   = EntityId,
                    NameTag    = NameTag ?? Name,
                    Skin       = Skin
                };

                McpePlayerList playerList = McpePlayerList.CreateObject();
                playerList.records = new PlayerRemoveRecords {
                    fake
                };
                player.SendPackage(playerList);
            }

            McpeRemovePlayer mcpeRemovePlayer = McpeRemovePlayer.CreateObject();

            mcpeRemovePlayer.entityId   = EntityId;
            mcpeRemovePlayer.clientUuid = Uuid;
            player.SendPackage(mcpeRemovePlayer);
        }
示例#12
0
        public override void SpawnToPlayers(Player[] players)
        {
            {
                Player fake = new Player(null, null)
                {
                    ClientUuid = Uuid,
                    EntityId   = EntityId,
                    NameTag    = NameTag,
                    Skin       = Skin
                };

                McpePlayerList playerList = McpePlayerList.CreateObject();
                playerList.records = new PlayerAddRecords {
                    fake
                };
                Level.RelayBroadcast(players, Level.CreateMcpeBatch(playerList.Encode()));
                playerList.records = null;
                playerList.PutPool();
            }

            {
                McpeAddPlayer message = McpeAddPlayer.CreateObject();
                message.uuid            = Uuid;
                message.username        = NameTag;
                message.entityIdSelf    = EntityId;
                message.runtimeEntityId = EntityId;
                message.x        = KnownPosition.X;
                message.y        = KnownPosition.Y;
                message.z        = KnownPosition.Z;
                message.yaw      = KnownPosition.Yaw;
                message.headYaw  = KnownPosition.HeadYaw;
                message.pitch    = KnownPosition.Pitch;
                message.metadata = GetMetadata();
                Level.RelayBroadcast(players, message);
            }
            {
                McpeMobEquipment message = McpeMobEquipment.CreateObject();
                message.runtimeEntityId = EntityId;
                message.item            = ItemInHand;
                message.slot            = 0;
                Level.RelayBroadcast(players, message);
            }
            {
                McpeMobArmorEquipment armorEquipment = McpeMobArmorEquipment.CreateObject();
                armorEquipment.runtimeEntityId = EntityId;
                armorEquipment.helmet          = ItemFactory.GetItem(Helmet);
                armorEquipment.chestplate      = ItemFactory.GetItem(Chest);
                armorEquipment.leggings        = ItemFactory.GetItem(Leggings);
                armorEquipment.boots           = ItemFactory.GetItem(Boots);
                Level.RelayBroadcast(players, armorEquipment);
            }

            //{
            //	Player fake = new Player(null, null)
            //	{
            //		ClientUuid = Uuid,
            //		EntityId = EntityId,
            //		NameTag = NameTag,
            //		Skin = Skin
            //	};

            //	McpePlayerList playerList = McpePlayerList.CreateObject();
            //	playerList.records = new PlayerRemoveRecords {fake};
            //	Level.RelayBroadcast(players, Level.CreateMcpeBatch(playerList.Encode()));
            //	playerList.records = null;
            //	playerList.PutPool();
            //}

            {
                McpeSetEntityData setEntityData = McpeSetEntityData.CreateObject();
                setEntityData.runtimeEntityId = EntityId;
                setEntityData.metadata        = GetMetadata();
                Level?.RelayBroadcast(players, setEntityData);
            }
        }
示例#13
0
文件: Level.cs 项目: Eros/MiNET
        public void SpawnToAll(Player newPlayer)
        {
            lock (_playerWriteLock)
            {
                List <Player> spawnedPlayers = GetSpawnedPlayers().ToList();
                spawnedPlayers.Add(newPlayer);

                Player[] sendList = spawnedPlayers.ToArray();

                McpePlayerList playerListMessage = McpePlayerList.CreateObject();
                playerListMessage.records = new PlayerAddRecords(spawnedPlayers);
                var bytes = playerListMessage.Encode();
                playerListMessage.records = null;

                MemoryStream memStream = new MemoryStream();
                memStream.Write(BitConverter.GetBytes(Endian.SwapInt32(bytes.Length)), 0, 4);
                memStream.Write(bytes, 0, bytes.Length);

                McpeBatch batch  = McpeBatch.CreateObject();
                byte[]    buffer = Player.CompressBytes(memStream.ToArray(), CompressionLevel.Optimal);
                batch.payloadSize = buffer.Length;
                batch.payload     = buffer;
                batch.Encode();

                newPlayer.SendPackage(batch);

                McpePlayerList playerList = McpePlayerList.CreateObject();
                playerList.records = new PlayerAddRecords {
                    newPlayer
                };
                playerList.Encode();
                playerList.records = null;
                RelayBroadcast(newPlayer, sendList, playerList);

                McpeAddPlayer mcpeAddPlayer = McpeAddPlayer.CreateObject();
                mcpeAddPlayer.uuid     = newPlayer.ClientUuid;
                mcpeAddPlayer.username = newPlayer.Username;
                mcpeAddPlayer.entityId = newPlayer.EntityId;
                mcpeAddPlayer.x        = newPlayer.KnownPosition.X;
                mcpeAddPlayer.y        = newPlayer.KnownPosition.Y;
                mcpeAddPlayer.z        = newPlayer.KnownPosition.Z;
                mcpeAddPlayer.yaw      = newPlayer.KnownPosition.Yaw;
                mcpeAddPlayer.headYaw  = newPlayer.KnownPosition.HeadYaw;
                mcpeAddPlayer.pitch    = newPlayer.KnownPosition.Pitch;
                mcpeAddPlayer.metadata = newPlayer.GetMetadata();
                RelayBroadcast(newPlayer, sendList, mcpeAddPlayer);

                McpePlayerEquipment mcpePlayerEquipment = McpePlayerEquipment.CreateObject();
                mcpePlayerEquipment.entityId = newPlayer.EntityId;
                mcpePlayerEquipment.item     = new MetadataSlot(newPlayer.Inventory.GetItemInHand());
                mcpePlayerEquipment.slot     = 0;
                RelayBroadcast(newPlayer, sendList, mcpePlayerEquipment);

                McpePlayerArmorEquipment mcpePlayerArmorEquipment = McpePlayerArmorEquipment.CreateObject();
                mcpePlayerArmorEquipment.entityId   = newPlayer.EntityId;
                mcpePlayerArmorEquipment.helmet     = new MetadataSlot(new ItemStack(newPlayer.Inventory.Helmet, 0));
                mcpePlayerArmorEquipment.chestplate = new MetadataSlot(new ItemStack(newPlayer.Inventory.Chest, 0));
                mcpePlayerArmorEquipment.leggings   = new MetadataSlot(new ItemStack(newPlayer.Inventory.Leggings, 0));
                mcpePlayerArmorEquipment.boots      = new MetadataSlot(new ItemStack(newPlayer.Inventory.Boots, 0));
                RelayBroadcast(newPlayer, sendList, mcpePlayerArmorEquipment);

                foreach (Player spawnedPlayer in spawnedPlayers)
                {
                    SendAddForPlayer(newPlayer, spawnedPlayer, false);
                }
            }
        }
示例#14
0
        public override void SpawnToPlayers(Player[] players)
        {
            {
                var fake = new Player(null, null)
                {
                    ClientUuid  = ClientUuid,
                    EntityId    = EntityId,
                    NameTag     = NameTag,
                    DisplayName = NameTag,
                    Username    = NameTag,
                    Skin        = Skin,
                    PlayerInfo  = new PlayerInfo
                    {
                        DeviceOS       = 7,
                        PlatformChatId = NameTag,
                    }
                };

                var playerList = McpePlayerList.CreateObject();
                playerList.records = new PlayerAddRecords {
                    fake
                };
                Level.RelayBroadcast(players, Level.CreateMcpeBatch(playerList.Encode()));
                playerList.records = null;
                playerList.PutPool();
            }

            {
                var message = McpeAddPlayer.CreateObject();
                message.uuid            = ClientUuid;
                message.username        = NameTag;
                message.entityIdSelf    = EntityId;
                message.runtimeEntityId = EntityId;
                message.x        = KnownPosition.X;
                message.y        = KnownPosition.Y;
                message.z        = KnownPosition.Z;
                message.yaw      = KnownPosition.Yaw;
                message.headYaw  = KnownPosition.HeadYaw;
                message.pitch    = KnownPosition.Pitch;
                message.metadata = GetMetadata();
                message.userId   = -1;
                Level.RelayBroadcast(players, message);
            }

            {
                var message = McpeMobEquipment.CreateObject();
                message.runtimeEntityId = EntityId;
                message.item            = ItemInHand;
                message.slot            = 0;
                Level.RelayBroadcast(players, message);
            }
            {
                var armorEquipment = McpeMobArmorEquipment.CreateObject();
                armorEquipment.runtimeEntityId = EntityId;
                armorEquipment.helmet          = Helmet;
                armorEquipment.chestplate      = Chest;
                armorEquipment.leggings        = Leggings;
                armorEquipment.boots           = Boots;
                Level.RelayBroadcast(players, armorEquipment);
            }

            {
                var fake = new Player(null, null)
                {
                    ClientUuid = ClientUuid,
                    EntityId   = EntityId,
                    NameTag    = NameTag,
                    Skin       = Skin
                };

                var playerList = McpePlayerList.CreateObject();
                playerList.records = new PlayerRemoveRecords {
                    fake
                };
                Level.RelayBroadcast(players, Level.CreateMcpeBatch(playerList.Encode()));
                playerList.records = null;
                playerList.PutPool();
            }

            {
                var setEntityData = McpeSetEntityData.CreateObject();
                setEntityData.runtimeEntityId = EntityId;
                setEntityData.metadata        = GetMetadata();
                Level?.RelayBroadcast(players, setEntityData);
            }
        }
示例#15
0
 public virtual void HandleMcpePlayerList(McpePlayerList message)
 {
 }
示例#16
0
 public override void HandleMcpePlayerList(McpePlayerList message)
 {
 }
 public abstract void HandleMcpePlayerList(McpePlayerList message);
示例#18
0
        public override void SpawnToPlayers(Player[] players)
        {
            {
                Player fake = new Player(null, null)
                {
                    ClientUuid = Uuid,
                    EntityId   = EntityId,
                    NameTag    = NameTag ?? Name,
                    Skin       = Skin
                };

                McpePlayerList playerList = McpePlayerList.CreateObject();
                playerList.records = new PlayerAddRecords {
                    fake
                };
                Level.RelayBroadcast(players, playerList);
            }

            {
                McpeAddPlayer message = McpeAddPlayer.CreateObject();
                message.uuid     = Uuid;
                message.username = NameTag ?? Name;
                message.entityId = EntityId;
                message.x        = KnownPosition.X;
                message.y        = KnownPosition.Y;
                message.z        = KnownPosition.Z;
                message.yaw      = KnownPosition.Yaw;
                message.headYaw  = KnownPosition.HeadYaw;
                message.pitch    = KnownPosition.Pitch;
                message.metadata = GetMetadata();
                Level.RelayBroadcast(players, message);
            }
            {
                McpePlayerEquipment message = McpePlayerEquipment.CreateObject();
                message.entityId = EntityId;
                message.item     = ItemInHand;
                message.slot     = 0;
                Level.RelayBroadcast(players, message);
            }
            {
                McpePlayerArmorEquipment armorEquipment = McpePlayerArmorEquipment.CreateObject();
                armorEquipment.entityId   = EntityId;
                armorEquipment.helmet     = ItemFactory.GetItem(Helmet);
                armorEquipment.chestplate = ItemFactory.GetItem(Chest);
                armorEquipment.leggings   = ItemFactory.GetItem(Leggings);
                armorEquipment.boots      = ItemFactory.GetItem(Boots);
                Level.RelayBroadcast(players, armorEquipment);
            }

            {
                Player fake = new Player(null, null)
                {
                    ClientUuid = Uuid,
                    EntityId   = EntityId,
                    NameTag    = NameTag ?? Name,
                    Skin       = Skin
                };

                McpePlayerList playerList = McpePlayerList.CreateObject();
                playerList.records = new PlayerRemoveRecords {
                    fake
                };
                Level.RelayBroadcast(players, playerList);
            }

            // Probably not needed
            BroadcastSetEntityData();
        }
示例#19
0
        private void SkinTick(object state)
        {
            if (!Monitor.TryEnter(_skinSynk))
            {
                return;
            }

            try
            {
                foreach (var player in _players.Values)
                {
                    {
                        if (!player.Username.Equals("gurun"))
                        {
                            continue;
                        }

                        if (_image >= 9)
                        {
                            _image = 0;
                        }

                        _image++;

                        Level level = player.Level;
                        //if (level.TickTime%3 != 0) return;
                        //player.SetNameTag(player.Username + " " + level.TickTime + " testing");
                        //player.SetDisplayName(player.Username + " " + level.TickTime + " testing");

                        Skin   skin    = player.Skin;
                        var    texture = skin.Texture;
                        byte[] smiley  = GetTextureFromFile(@"D:\Temp\Smiley\big_smile0" + _image + ".png");
                        if (smiley.Length != 8 * 8 * 4)
                        {
                            return;
                        }
                        int s  = 0;
                        int br = 8;
                        int bc = 8;
                        for (int r = 0; r < 8; r++)
                        {
                            for (int c = 0; c < 8; c++)
                            {
                                int i = ((c + bc) * 4) + ((r + br) * 64 * 4);
                                int j = ((c) * 4) + ((r) * 8 * 4);

                                texture[(i) + 0] = smiley[j + 0];
                                texture[(i) + 1] = smiley[j + 1];
                                texture[(i) + 2] = smiley[j + 2];
                                texture[(i) + 3] = smiley[j + 3];
                            }
                        }

                        {
                            player.SpawnPosition = player.KnownPosition;

                            //level.DespawnFromAll(player);
                            //level.SpawnToAll(player);

                            var players = level.GetSpawnedPlayers();

                            McpePlayerList playerList = McpePlayerList.CreateObject();
                            playerList.records = new PlayerAddRecords {
                                player
                            };
                            level.RelayBroadcast(player, players, CreateMcpeBatch(playerList.Encode()));
                            playerList.records = null;
                            playerList.PutPool();

                            //player.IsInvisible = true;
                            player.HideNameTag = true;
                            //player.BroadcastSetEntityData();

                            player.SpawnToPlayers(players);

                            //Thread.Sleep(100);
                            //player.HideNameTag = false;
                            //player.IsInvisible = false;
                            //player.BroadcastSetEntityData();
                        }
                    }
                }
            }
            finally
            {
                Monitor.Exit(_skinSynk);
            }
        }