private void NetworkGameStateUpdate() { var header = new SGameStateHeader(World.physicsFrameIter); states.Clear(); //List<S_GameStateSlice> states = new List<S_GameStateSlice>(); // TODO: big optimization candidate foreach (var ent in World.GetEntities()) { if (ent is IPhysical phys) { var newState = new SGameStateSlice { EntityID = phys.EntityID, NextX = phys.NextPosition.X, NextY = phys.NextPosition.Y, VelocityX = phys.Velocity.X, VelocityY = phys.Velocity.Y }; // TODO: come up with better flag handler than this. if (ent is Player plr) { newState.Flag0 = (byte)plr.Facing; newState.Flag1 = (byte)plr.Looking; } states.Add(newState); } } SendToAll(header, states.ToArray()); }
private void OnGameStateUpdate(SGameStateHeader header, List <SGameStateSlice> slices) { int physicsFrame = World.physicsFrameIter; World.physicsFrameIter = header.PhysicsStep; // grab each entity in the world // and make a dataslice for their physical state // send the batch off to clients to process foreach (SGameStateSlice slice in slices) { if (World.HasEntity(slice.EntityID)) { IPhysical ent = World.GetEntity(slice.EntityID) as IPhysical; // if state implements Position, make sure to add here ent.NextPosition = new Vector2(slice.NextX, slice.NextY); ent.Velocity = new Vector2(slice.VelocityX, slice.VelocityY); for (int i = header.PhysicsStep; i < physicsFrame; i++) { if (ent is Player player) { player.Facing = (Facing)slice.Flag0; player.Looking = (Looking)slice.Flag1; if (player.EntityID == ourPID) { var input = InputHistory.Get(i); player.MovingLeft = input.Left; player.MovingRight = input.Right; player.Jumping = input.Jump; player.LookingDown = input.Down; player.LookingUp = input.Up; } } World.ProcessEntityPhysics(ent, PhysicsProperties.PHYSICS_TIMESTEP); } } } }