コード例 #1
0
        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;
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
 private void SyncToNearby(NetConnection sendTo, TransformComponent transformComponent, ulong userID)
 {
     var packet = new NotifyMovementPacket(transformComponent.Velocity, transformComponent.LocalPosition, userID);
     ClientNetworkManager.Instance.SendPacket(packet, sendTo);
 }
コード例 #4
0
 private void HandleMovement(NotifyMovementPacket notifyMovementPacket)
 {
     var simulator = GetSimulator(notifyMovementPacket.Sender);
     simulator.ServerServiceContainer.GetService<MovementService>().MovementRecieved(notifyMovementPacket);
 }
コード例 #5
0
        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;
        }
コード例 #6
0
        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);
        }