public override void ProcessServerUpdate(StatePacket packet, Cell[,] maze) { if (packet.InputSequenceNumber <= LastSnapshotReceived) { return; } LastSnapshotReceived = packet.InputSequenceNumber; x = packet.X; y = packet.Y; rotation = packet.Rotation; // reconciliation for (int i = PendingInputs.Count - 1; i >= 0; i--) { InputPacket pending = PendingInputs[i]; if (pending.InputSequenceNumber <= packet.InputSequenceNumber) { PendingInputs.RemoveAt(i); } else { ApplyInput(pending, maze); } } }
public override void ProcessServerUpdate(StatePacket packet, Cell[,] maze) { if (INTERPOLATION_ENABLED) { snapshots.Add(new Snapshot() { X = packet.X, Y = packet.Y, Rotation = packet.Rotation, Timestamp = packet.Timestamp }); } else { #pragma warning disable CS0162 // Unreachable code detected this.x = packet.X; this.y = packet.Y; this.rotation = packet.Rotation; #pragma warning restore CS0162 // Unreachable code detected } }
private void OnGameplayNetworkReceived(NetPeer peer, NetDataReader dataReader) { NetMessage instruction = (NetMessage)dataReader.GetInt(); switch (instruction) { case NetMessage.ServerClosed: OnServerClosed(); break; case NetMessage.CharacterUpdate: StatePacket packet = new StatePacket(dataReader); CharacterUpdated?.Invoke(this, new GameplayUpdateEventArgs() { Packet = packet }); break; case NetMessage.GoToScoresScreen: this.SetLobby(); ScreenManager.ReplaceCurrent(new ScoresScreen()); break; case NetMessage.AddDrop: DropAdded?.Invoke(this, new GameplayDropEventArgs() { Id = dataReader.GetInt(), Type = dataReader.GetInt(), X = dataReader.GetInt(), Y = dataReader.GetInt() }); break; case NetMessage.RemoveDrop: DropRemoved?.Invoke(this, new GameplayDropEventArgs() { Id = dataReader.GetInt(), }); break; case NetMessage.AddBuff: BuffAdded?.Invoke(this, new GameplayBuffEventArgs() { BuffType = dataReader.GetInt(), PlayerId = dataReader.GetString(), BuffId = dataReader.GetInt() }); break; case NetMessage.RemoveBuff: BuffRemoved?.Invoke(this, new GameplayBuffEventArgs() { PlayerId = dataReader.GetString(), BuffId = dataReader.GetInt() }); break; case NetMessage.AddPowerUp: PowerUpAdded?.Invoke(this, new GameplayPowerUpEventArgs() { PlayerId = dataReader.GetString(), Type = dataReader.GetInt() }); break; case NetMessage.RemovePowerUp: PowerUpRemoved?.Invoke(this, new GameplayPowerUpEventArgs() { PlayerId = dataReader.GetString(), }); break; case NetMessage.Teleport: CharacterTeleported?.Invoke(this, new GameplayCharacterTeleportedEventArgs() { PlayerId = dataReader.GetString(), X = dataReader.GetInt(), Y = dataReader.GetInt() }); break; case NetMessage.AddTintaSplash: TintaSplashAdded?.Invoke(this, new GameplayTintaSplashEventArgs() { Id = dataReader.GetInt(), X = dataReader.GetInt(), Y = dataReader.GetInt(), Rotation = dataReader.GetFloat(), Duration = dataReader.GetFloat() }); break; case NetMessage.RemoveTintaSplash: TintaSplashRemoved?.Invoke(this, new GameplayTintaSplashEventArgs() { Id = dataReader.GetInt() }); break; } }
public void GameplayUpdate(float dt) { if (world == null) { return; } updateAccumulator += dt; if (updateAccumulator >= TickRate) { updateAccumulator -= TickRate; server.PollEvents(); foreach (ServerPj pj in world.Pjs.Values ?? Enumerable.Empty <Pj>()) { pj.AnimationMachine.Update(TickRate); long lastInput = pj.LastProcessedInput; if (lastInput > pj.LastSentSnapshot) { pj.LastSentSnapshot = lastInput; StatePacket statePacket = new StatePacket(lastInput, pj); server.SendToAll(statePacket.Serialize(), SendOptions.Unreliable); } List <int> buffsToRemove = new List <int>(); foreach (KeyValuePair <int, Buff> kvp in pj.Buffs) { Buff buff = kvp.Value; buff.Update(TickRate); if (buff.ToBeRemoved) { buffsToRemove.Add(kvp.Key); } } foreach (int buffId in buffsToRemove) { RemoveBuff(pj, buffId); } } List <int> dropsToRemove = new List <int>(); foreach (KeyValuePair <int, Drop> kvp in world.Drops) { Drop drop = kvp.Value; foreach (Pj pj in world.Pjs.Values) { if (drop.AabbAabbIntersectionTest(pj)) { drop.Callback(pj, this); dropsToRemove.Add(kvp.Key); } } } foreach (int index in dropsToRemove) { RemoveDrop(index); } List <int> tintaSplashesToRemove = new List <int>(); foreach (KeyValuePair <int, TintaSplash> kvp in world.TintaSplashes) { TintaSplash splash = kvp.Value; splash.Update(TickRate); if (splash.ToBeRemoved) { tintaSplashesToRemove.Add(kvp.Key); } } foreach (int index in tintaSplashesToRemove) { RemoveTintaSplash(index); } } }
public override void ProcessServerUpdate(StatePacket packet, Cell[,] maze) { }