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
     }
 }
Exemple #3
0
        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;
            }
        }
Exemple #4
0
        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);
                }
            }
        }
Exemple #5
0
 public override void ProcessServerUpdate(StatePacket packet, Cell[,] maze)
 {
 }