| 589 | } |
| 590 | |
| 591 | void NetworkManager::Stop() |
| 592 | { |
| 593 | if (Mode == NetworkManagerMode::Offline && State == NetworkConnectionState::Offline) |
| 594 | return; |
| 595 | PROFILE_CPU(); |
| 596 | PROFILE_MEM(Networking); |
| 597 | |
| 598 | LOG(Info, "Stopping network manager"); |
| 599 | State = NetworkConnectionState::Disconnecting; |
| 600 | if (LocalClient) |
| 601 | LocalClient->State = NetworkConnectionState::Disconnecting; |
| 602 | for (NetworkClient* client : Clients) |
| 603 | client->State = NetworkConnectionState::Disconnecting; |
| 604 | StateChanged(); |
| 605 | |
| 606 | for (int32 i = Clients.Count() - 1; i >= 0; i--) |
| 607 | { |
| 608 | NetworkClient* client = Clients[i]; |
| 609 | ClientDisconnected(client); |
| 610 | client->State = NetworkConnectionState::Disconnected; |
| 611 | Delete(client); |
| 612 | Clients.RemoveAt(i); |
| 613 | } |
| 614 | if (Mode == NetworkManagerMode::Host && LocalClient) |
| 615 | { |
| 616 | ClientDisconnected(LocalClient); |
| 617 | LocalClient->State = NetworkConnectionState::Disconnected; |
| 618 | } |
| 619 | NetworkInternal::NetworkReplicatorClear(); |
| 620 | StopPeer(); |
| 621 | if (LocalClient) |
| 622 | { |
| 623 | Delete(LocalClient); |
| 624 | LocalClient = nullptr; |
| 625 | } |
| 626 | |
| 627 | // Clear local state |
| 628 | NextClientId = 0; |
| 629 | LastUpdateTime = 0; |
| 630 | ActiveConnections.Clear(); |
| 631 | Keys.Clear(); |
| 632 | |
| 633 | State = NetworkConnectionState::Disconnected; |
| 634 | Mode = NetworkManagerMode::Offline; |
| 635 | LastUpdateTime = 0; |
| 636 | |
| 637 | StateChanged(); |
| 638 | } |
| 639 | |
| 640 | void NetworkKeys::SendPending() |
| 641 | { |