public static new Packet FromNetBuffer(NetIncomingMessage incomingMessage) { // Read values back in var velocity = new Vector2(incomingMessage.ReadFloat(), incomingMessage.ReadFloat()); var location = new Vector2(incomingMessage.ReadFloat(), incomingMessage.ReadFloat()); var id = incomingMessage.ReadUInt64(); var packet = new NotifyMovementPacket(velocity, location, id); return packet; }
public void MovementRecieved(NotifyMovementPacket notifyMovementPacket) { var user = MapSimulator.GetCharacter(notifyMovementPacket.Sender); var transform = user.GetComponent<TransformComponent>(); transform.LastLocalPosition = transform.LocalPosition; transform.LocalPosition = notifyMovementPacket.Location; transform.ServerPosition = notifyMovementPacket.Location; transform.Velocity = notifyMovementPacket.Velocity; // Get nearby players that might be interested var characters = MapSimulator.EntityCollection.Filter<CharacterComponent>(); // Alert them one by one foreach (var character in characters.Entities.ToList()) { if(character == user) continue; SyncToNearby(character.GetComponent<CharacterComponent>().Connection, transform, user.ID); } }
private void SyncToNearby(NetConnection sendTo, TransformComponent transformComponent, ulong userID) { var packet = new NotifyMovementPacket(transformComponent.Velocity, transformComponent.LocalPosition, userID); ClientNetworkManager.Instance.SendPacket(packet, sendTo); }
private void HandleMovement(NotifyMovementPacket notifyMovementPacket) { var simulator = GetSimulator(notifyMovementPacket.Sender); simulator.ServerServiceContainer.GetService<MovementService>().MovementRecieved(notifyMovementPacket); }
private void ProcessLocalPlayer(Entity entity, GameTime gameTime) { // Local players can be moved automatically, then report their status if needed var playerTransform = entity.GetComponent<TransformComponent>(); var playerSkin = entity.GetComponent<SkinComponent>(); var playerDescriptor = entity.GetComponent<SpriteComponent>().SpriteDescriptor; // Move the camera ServiceManager.Camera.Move(-lastTransformVector); // Apply the multiplier to the velocity and move the position Vector2 nextPosition = playerTransform.LocalPosition; // Clamp the x and y so the player won't keep walking offscreen //float nextX = MathHelper.Clamp(nextPosition.X + playerDescriptor.BoundingBox.X, 0, ServiceManager.Map.WorldSizePixels.X / 2 - playerDescriptor.BoundingBox.Width); //float nextY = MathHelper.Clamp(nextPosition.Y + playerDescriptor.BoundingBox.Y, 0, ServiceManager.Map.WorldSizePixels.Y / 2 - playerDescriptor.BoundingBox.Height); //playerTransform.LocalPosition = new Vector2(nextX - playerDescriptor.BoundingBox.X, nextY - playerDescriptor.BoundingBox.Y); playerTransform.LastLocalPosition = playerTransform.LocalPosition; playerTransform.LocalPosition += playerTransform.Velocity; if (playerTransform.Velocity.X != playerTransform.Velocity.Y) { if (playerTransform.Velocity.X < 0) playerTransform.DirectionalCache = DirectionalCache.Left; if (playerTransform.Velocity.X > 0) playerTransform.DirectionalCache = DirectionalCache.Right; if (playerTransform.Velocity.Y > 0) playerTransform.DirectionalCache = DirectionalCache.Down; if (playerTransform.Velocity.Y < 0) playerTransform.DirectionalCache = DirectionalCache.Up; } var directionalChange = (playerTransform.Velocity != playerTransform.LastVelocity && playerTransform.Velocity != Vector2.Zero); if ((_lastReaction > MovementRate && playerTransform.Velocity != Vector2.Zero) || directionalChange) { // Alert the server out this change in events if needed var packet = new NotifyMovementPacket(playerTransform.Velocity, playerTransform.LocalPosition, _idToMonitor); NetworkManager.Instance.SendPacket(packet); // Reset reaction timer _lastReaction = 0f; } // Increment reaction timer _lastReaction += (float)gameTime.ElapsedGameTime.TotalSeconds; }
private void MovementRecieved(NotifyMovementPacket obj) { Entity player = null; foreach (var entity in ServiceManager.EntityCollection.Entities) { if (entity.ID == obj.EntityID) { player = entity; } } if (player != null) { var transformComponent = player.GetComponent<TransformComponent>(); transformComponent.Velocity = obj.Velocity; if (transformComponent.Velocity.X != transformComponent.Velocity.Y) { if (obj.Velocity.X < 0) transformComponent.DirectionalCache = DirectionalCache.Left; if (obj.Velocity.X > 0) transformComponent.DirectionalCache = DirectionalCache.Right; if (obj.Velocity.Y > 0) transformComponent.DirectionalCache = DirectionalCache.Down; if (obj.Velocity.Y < 0) transformComponent.DirectionalCache = DirectionalCache.Up; } } // Retreieve an interpolator var interpolator = _entityInterpolators[obj.EntityID]; interpolator.ResetProgress(obj.Location); }