Exemple #1
0
        protected override void Dispose(bool disposing)
        {
            if (!IsDisposed)
            {
                if (disposing)
                {
                    for (var i = PlayersJoining.Count - 1; i >= 0; i--)
                    {
                        PlayersJoining[i].Dispose();
                    }
                    PlayersJoining.Clear();

                    for (var i = Clients.Count - 1; i >= 0; i--)
                    {
                        Clients[i].SendKick("Closing server!");
                        Clients[i].Dispose();
                    }
                    Clients.Clear();

                    for (var i = PlayersToAdd.Count - 1; i >= 0; i--)
                    {
                        PlayersToAdd[i].SendKick("Closing server!");
                        PlayersToAdd[i].Dispose();
                    }
                    PlayersToAdd.Clear();

                    // Do not dispose PlayersToRemove!
                    PlayersToRemove.Clear();
                }


                IsDisposed = true;
            }
            base.Dispose(disposing);
        }
Exemple #2
0
        protected override void OnClientLeave(object sender, EventArgs eventArgs)
        {
            var client = sender as SCONClient;

            PlayersToRemove.Add(client);

            base.OnClientLeave(sender, eventArgs);
        }
Exemple #3
0
        protected override void OnClientLeave(object sender, EventArgs eventArgs)
        {
            if (!(sender is PokeDPlayer client))
            {
                return;
            }

            SendPacketToAll(new ChatGlobalMessagePacket {
                Message = $"Player {client.Name} disconnected!"
            });
            PlayersToRemove.Add(client);

            base.OnClientLeave(sender, eventArgs);
        }
Exemple #4
0
        public override void Update()
        {
            if (Listener?.Pending() == true)
            {
                PlayersJoining.Add(new SCONClient(Listener.AcceptSocket(), this));
            }

            #region Player Filtration

            for (var i = 0; i < PlayersToAdd.Count; i++)
            {
                var playerToAdd = PlayersToAdd[i];

                Clients.Add(playerToAdd);
                PlayersToAdd.Remove(playerToAdd);
            }

            for (var i = 0; i < PlayersToRemove.Count; i++)
            {
                var playerToRemove = PlayersToRemove[i];

                Clients.Remove(playerToRemove);
                PlayersJoining.Remove(playerToRemove);
                PlayersToRemove.Remove(playerToRemove);

                playerToRemove.Dispose();
            }

            #endregion Player Filtration

            #region Player Updating

            // Update actual players
            for (var i = Clients.Count - 1; i >= 0; i--)
            {
                Clients[i]?.Update();
            }

            // Update joining players
            for (var i = PlayersJoining.Count - 1; i >= 0; i--)
            {
                PlayersJoining[i]?.Update();
            }

            #endregion Player Updating
        }
Exemple #5
0
        public override void Update()
        {
            if (Listener?.Pending() == true)
            {
                PlayersJoining.Add(new PokeDPlayer(Listener.AcceptSocket(), this));
            }

            #region Player Filtration

            for (var i = 0; i < PlayersToAdd.Count; i++)
            {
                var playerToAdd = PlayersToAdd[i];

                Clients.Add(playerToAdd);
                PlayersToAdd.Remove(playerToAdd);

                if (playerToAdd.ID != 0)
                {
                    /*
                     * var mapData = Maps.GetFileAsync("0.0.tmx").Result.ReadAllTextAsync().Result;
                     * //var mapData = Maps.GetFileAsync(playerToAdd.LevelFile).Result.ReadAllTextAsync().Result;
                     *
                     #region Hash
                     *
                     * Map map;
                     * using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(mapData)))
                     *  map = Map.Load(stream);
                     *
                     * var tileSetHashesh = map.TileSets.Select(tileSet => new FileHash()
                     *          {
                     *              Name = tileSet.Source.Replace(".tsx", ""),
                     *              Hash = TileSets.GetFileAsync(tileSet.Source).Result.MD5Hash()
                     *          });
                     *
                     * var imageHashesh = map.TileSets.Select(tileSet =>
                     *          new FileHash()
                     *          {
                     *              Name = tileSet.Source.Replace(".tsx", ""),
                     *              Hash = TileSets.GetFileAsync(tileSet.Source.Replace(".tsx", ".png")).Result.MD5Hash()
                     *          });
                     #endregion Hash
                     *
                     *
                     * playerToAdd.SendPacket(new MapPacket()
                     * {
                     *  MapData = mapData,
                     *  TileSetHashes = tileSetHashesh.ToArray(),
                     *  ImageHashes = imageHashesh.ToArray()
                     * });
                     */
                }
            }

            for (var i = 0; i < PlayersToRemove.Count; i++)
            {
                var playerToRemove = PlayersToRemove[i];

                Clients.Remove(playerToRemove);
                PlayersJoining.Remove(playerToRemove);
                PlayersToRemove.Remove(playerToRemove);

                playerToRemove.Dispose();
            }

            #endregion Player Filtration


            #region Player Updating

            // Update actual players
            for (var i = Clients.Count - 1; i >= 0; i--)
            {
                Clients[i]?.Update();
            }

            // Update joining players
            for (var i = PlayersJoining.Count - 1; i >= 0; i--)
            {
                PlayersJoining[i]?.Update();
            }

            #endregion Player Updating


            if (UpdateWatch.ElapsedMilliseconds > 5000)
            {
                for (var i = Clients.Count - 1; i >= 0; i--)
                {
                    Clients[i]?.SendPacket(new PingPacket());
                }

                UpdateWatch.Reset();
                UpdateWatch.Start();
            }
        }