Ejemplo n.º 1
0
        public Server()
        {
            ENet.Library.Initialize();
            ClientsManager clients = new ClientsManager();

            DatabaseManager.OnDatabaseTick += () =>
            {
                List <CharacterInfo> characters = CharactersManager.Instance.characters.Values.ToList();

                if (characters.Count != 0)
                {
                    List <Character> charactersForUpdate = new List <Character>();

                    foreach (var player in characters)
                    {
                        if (player.Client != null)
                        {
                            charactersForUpdate.Add(player.Character);
                        }
                    }

                    if (charactersForUpdate.Count != 0)
                    {
                        CharacterDB.SaveCharacters(charactersForUpdate);

                        //ServerLogger.Log(null, "Updated database | Query time: " + (Server.Time - startTime).ToString(), LoggingLevel.PROD);
                    }
                }
            };

            using (Host server = new Host())
            {
                Console.WriteLine("Game Server started...");
                Address address = new Address();
                address.SetIP("127.0.0.1");
                address.Port = 2601;
                server.Create(address, 100);

                Event netEvent;

                while (!Console.KeyAvailable)
                {
                    bool polled = false;

                    while (!polled)
                    {
                        if (server.CheckEvents(out netEvent) <= 0)
                        {
                            if (server.Service(15, out netEvent) <= 0)
                            {
                                break;
                            }

                            polled = true;
                        }

                        switch (netEvent.Type)
                        {
                        case EventType.None:
                            break;

                        case EventType.Connect:
                            Console.WriteLine("Client connected - ID: " + netEvent.Peer.ID + ", IP: " + netEvent.Peer.IP);

                            CharacterInfo info = CharactersManager.Instance.AddCharacter(new CharacterInfo()
                            {
                                Character = new Hero()
                                {
                                    Position = new System.Numerics.Vector3(1786, 3, 1769)
                                },
                                ZoneId = 0
                            });

                            GameClient c = new GameClient()
                            {
                                Peer          = netEvent.Peer,
                                CharacterInfo = info
                            };

                            c.CharacterInfo.Client = c;
                            ClientsManager.Instance.clients.Add(netEvent.Peer.ID, c);
                            break;

                        case EventType.Disconnect:
                            Console.WriteLine("Client disconnected - ID: " + netEvent.Peer.ID + ", IP: " + netEvent.Peer.IP);


                            GameClient clientToRemove = (GameClient)ClientsManager.Instance.clients[netEvent.Peer.ID];
                            CharacterDB.SaveCharacters(new List <Character>()
                            {
                                clientToRemove.CharacterInfo.Character
                            });
                            ClientsManager.Instance.clients.Remove(netEvent.Peer.ID);
                            CharactersManager.Instance.RemoveCharacter(clientToRemove.CharacterInfo);
                            break;

                        case EventType.Timeout:
                            Console.WriteLine("Client timeout - ID: " + netEvent.Peer.ID + ", IP: " + netEvent.Peer.IP);
                            break;

                        case EventType.Receive:
                            //Console.WriteLine("Packet received from - ID: " + netEvent.Peer.ID + ", IP: " + netEvent.Peer.IP + ", Channel ID: " + netEvent.ChannelID + ", Data length: " + netEvent.Packet.Length);
                            byte[] buffer = new byte[1024];
                            netEvent.Packet.CopyTo(buffer);

                            GamePacketsManager.ReadBytes(ClientsManager.Instance.clients[netEvent.Peer.ID], buffer, netEvent.Packet.Length);

                            netEvent.Packet.Dispose();
                            break;
                        }
                    }
                }

                server.Flush();
            }
        }