| 5490 | } |
| 5491 | |
| 5492 | void MpLevelHandler::RollbackLevelState() |
| 5493 | { |
| 5494 | _eventMap->RollbackToCheckpoint(); |
| 5495 | _tileMap->RollbackToCheckpoint(); |
| 5496 | |
| 5497 | // Synchronize tilemap |
| 5498 | { |
| 5499 | // TODO: Use deflate compression here? |
| 5500 | MemoryStream packet(40 * 1024); |
| 5501 | _tileMap->SerializeResumableToStream(packet); |
| 5502 | _networkManager->SendTo([this](const Peer& peer) { |
| 5503 | auto peerDesc = _networkManager->GetPeerDescriptor(peer); |
| 5504 | return (peerDesc && peerDesc->LevelState >= PeerLevelState::LevelSynchronized); |
| 5505 | }, NetworkChannel::Main, (std::uint8_t)ServerPacketType::SyncTileMap, packet); |
| 5506 | } |
| 5507 | |
| 5508 | for (auto& actor : _actors) { |
| 5509 | // Despawn all actors that were created after the last checkpoint |
| 5510 | if (actor->_spawnFrames > _checkpointFrames && !actor->GetState(Actors::ActorState::PreserveOnRollback)) { |
| 5511 | if ((actor->_state & (Actors::ActorState::IsCreatedFromEventMap | Actors::ActorState::IsFromGenerator)) != Actors::ActorState::None) { |
| 5512 | Vector2i originTile = actor->_originTile; |
| 5513 | if ((actor->_state & Actors::ActorState::IsFromGenerator) == Actors::ActorState::IsFromGenerator) { |
| 5514 | _eventMap->ResetGenerator(originTile.X, originTile.Y); |
| 5515 | } |
| 5516 | |
| 5517 | _eventMap->Deactivate(originTile.X, originTile.Y); |
| 5518 | } |
| 5519 | |
| 5520 | actor->_state |= Actors::ActorState::IsDestroyed; |
| 5521 | } |
| 5522 | } |
| 5523 | } |
| 5524 | |
| 5525 | void MpLevelHandler::CalculatePositionInRound(bool forceSend) |
| 5526 | { |
nothing calls this directly
no test coverage detected