예제 #1
0
        public void NetLoop()
        {
            var enetEvent = new Event();

            _lastMapDurationWatch = new Stopwatch();
            _lastMapDurationWatch.Start();
            using (PreciseTimer.SetResolution(1))
            {
                while (!Program.IsSetToExit)
                {
                    while (_server.Service(0, out enetEvent) > 0)
                    {
                        switch (enetEvent.Type)
                        {
                        case EventType.Connect:
                            // Set some defaults
                            enetEvent.Peer.Mtu = PEER_MTU;
                            enetEvent.Data     = 0;
                            break;

                        case EventType.Receive:
                            PacketHandlerManager.handlePacket(enetEvent.Peer, enetEvent.Packet, (Channel)enetEvent.ChannelID);
                            // Clean up the packet now that we're done using it.
                            enetEvent.Packet.Dispose();
                            break;

                        case EventType.Disconnect:
                            HandleDisconnect(enetEvent.Peer);
                            break;
                        }
                    }

                    if (IsPaused)
                    {
                        _lastMapDurationWatch.Stop();
                        _pauseTimer.Enabled = true;
                        if (PauseTimeLeft <= 0 && !_autoResumeCheck)
                        {
                            PacketHandlerManager.GetHandler(PacketCmd.PKT_UnpauseGame, Channel.CHL_C2S)
                            .HandlePacket(null, new byte[0]);
                            _autoResumeCheck = true;
                        }
                        continue;
                    }

                    if (_lastMapDurationWatch.Elapsed.TotalMilliseconds + 1.0 > REFRESH_RATE)
                    {
                        var sinceLastMapTime = _lastMapDurationWatch.Elapsed.TotalMilliseconds;
                        _lastMapDurationWatch.Restart();
                        if (IsRunning)
                        {
                            Map.Update((float)sinceLastMapTime);
                            _gameScriptTimers.ForEach(gsTimer => gsTimer.Update((float)sinceLastMapTime));
                            _gameScriptTimers.RemoveAll(gsTimer => gsTimer.IsDead());
                        }
                    }
                    Thread.Sleep(1);
                }
            }
        }
예제 #2
0
        public void NetLoop()
        {
            var enetEvent = new Event();

            var lastMapDurationWatch = new Stopwatch();

            lastMapDurationWatch.Start();
            using (PreciseTimer.SetResolution(1))
            {
                while (!Program.IsSetToExit)
                {
                    while (_server.Service(0, out enetEvent) > 0)
                    {
                        switch (enetEvent.Type)
                        {
                        case EventType.Connect:
                            // Set some defaults
                            enetEvent.Peer.Mtu = PEER_MTU;
                            enetEvent.Data     = 0;
                            break;

                        case EventType.Receive:
                            if (!PacketHandlerManager.handlePacket(enetEvent.Peer, enetEvent.Packet, (Channel)enetEvent.ChannelID))
                            {
                                //enet_peer_disconnect(event.peer, 0);
                            }
                            // Clean up the packet now that we're done using it.
                            enetEvent.Packet.Dispose();
                            break;

                        case EventType.Disconnect:
                            HandleDisconnect(enetEvent.Peer);
                            break;
                        }
                    }

                    if (lastMapDurationWatch.Elapsed.TotalMilliseconds + 1.0 > REFRESH_RATE)
                    {
                        double sinceLastMapTime = lastMapDurationWatch.Elapsed.TotalMilliseconds;
                        lastMapDurationWatch.Restart();
                        if (IsRunning)
                        {
                            Map.Update((float)sinceLastMapTime);
                        }
                    }
                    Thread.Sleep(1);
                }
            }
        }