Beispiel #1
0
        private void HandleMovementRequest(NotifyMovementPacket notifyMovementPacket)
        {
            // Find the session
            var session = GetUserSession(notifyMovementPacket.Sender);

            // If the session is valid
            if (session != null)
            {
                session.HandleMovement(notifyMovementPacket);
            }
        }
Beispiel #2
0
        private void ProcessLocalPlayer(Entity entity, GameTime gameTime)
        {
            // Local players can be moved automatically, then report their status if needed
            var playerTransform        = (TransformComponent)entity.GetComponent(typeof(TransformComponent));
            var playerMovementModifier = (MovementModifierComponent)entity.GetComponent(typeof(MovementModifierComponent));

            // Get the skin information so we can calculate bounding box collisions
            var playerSkin       = (SkinComponent)entity.GetComponent(typeof(SkinComponent));
            var playerDescriptor = SpriteDescriptorLookup[playerSkin.SpriteDescriptorName];

            // Move the camera
            ServiceManager.Camera.Move(-lastTransformVector);

            // Determine the movement bonus multiplier
            float movementBonus = 1.0f;

            if (playerMovementModifier != null)
            {
                movementBonus += (float)playerMovementModifier.Amount;
            }

            // Apply the multiplier to the velocity and move the position
            Vector2 nextPosition = playerTransform.LocalPosition;

            nextPosition += playerTransform.Velocity * movementBonus;

            // 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);

            // TODO: This is shitty. Needs to be redone.
            if (playerTransform.Velocity.LengthSquared() != 0)
            {
                // Check Entity Collision
                if (ServiceManager.Entities != null && ServiceManager.Entities.Count() > 0)
                {
                    foreach (Entity e in ServiceManager.Entities)
                    {
                        // TODO: Bugfix! Currently 2 arrow keys are needed to get off of bombs. Fix it bitches.
                        if (e != entity && e.HasComponent(typeof(ExplosiveComponent)))
                        {
                            TransformComponent bombTransform  = (TransformComponent)e.GetComponent(typeof(TransformComponent));
                            SkinComponent      bombSkin       = (SkinComponent)e.GetComponent(typeof(SkinComponent));
                            SpriteDescriptor   bombDescriptor = SpriteDescriptorLookup[bombSkin.SpriteDescriptorName];

                            Vector2 playerOrigin = playerTransform.LocalPosition + new Vector2(playerDescriptor.BoundingBox.X, playerDescriptor.BoundingBox.Y) + new Vector2(playerDescriptor.BoundingBox.Width, playerDescriptor.BoundingBox.Height) / 2;
                            Vector2 bombOrigin   = bombTransform.LocalPosition + new Vector2(bombDescriptor.BoundingBox.X, bombDescriptor.BoundingBox.Y) + new Vector2(bombDescriptor.BoundingBox.Width, bombDescriptor.BoundingBox.Height) / 2;

                            Vector2 relativePosition = playerOrigin - bombOrigin;
                            if (Math.Abs(relativePosition.X) >= (bombDescriptor.BoundingBox.Width / 2) || Math.Abs(relativePosition.Y) >= (bombDescriptor.BoundingBox.Height / 2))
                            {
                                if ((Math.Sign(playerTransform.Velocity.X) != 0 && Math.Sign(relativePosition.X) != Math.Sign(playerTransform.Velocity.X)) || (Math.Sign(playerTransform.Velocity.Y) != 0 && Math.Sign(relativePosition.Y) != Math.Sign(playerTransform.Velocity.Y)))
                                {
                                    Rectangle bombRect = new Rectangle(
                                        (int)bombTransform.LocalPosition.X + bombDescriptor.BoundingBox.X,
                                        (int)bombTransform.LocalPosition.Y + bombDescriptor.BoundingBox.Y,
                                        (int)bombDescriptor.BoundingBox.Width,
                                        (int)bombDescriptor.BoundingBox.Height);

                                    Rectangle xBBox = new Rectangle((int)nextX,
                                                                    (int)playerTransform.LocalPosition.Y + playerDescriptor.BoundingBox.Y,
                                                                    (int)playerDescriptor.BoundingBox.Width,
                                                                    (int)playerDescriptor.BoundingBox.Height);

                                    if (bombRect.Intersects(xBBox))
                                    {
                                        nextX = playerTransform.LocalPosition.X + playerDescriptor.BoundingBox.X;
                                    }

                                    Rectangle yBBox = new Rectangle((int)nextX, (int)nextY,
                                                                    (int)playerDescriptor.BoundingBox.Width,
                                                                    (int)playerDescriptor.BoundingBox.Height);

                                    if (bombRect.Intersects(yBBox))
                                    {
                                        nextY = playerTransform.LocalPosition.Y + playerDescriptor.BoundingBox.Y;
                                    }
                                }
                            }
                        }
                    }
                }

                // Check Tile Collision
                if (ServiceManager.Map != null)
                {
                    foreach (TmxLayer layer in ServiceManager.Map.Layers)
                    {
                        foreach (TmxLayerTile tile in layer.Tiles)
                        {
                            var          set = (TmxTileset)ServiceManager.Map.Tilesets[0];
                            PropertyDict dict;

                            set.Tiles.TryGetValue((int)tile.GID, out dict);


                            // TODO: Sucks. Temporary, incomplete code. Needs to get fixed.
                            if (MapUtility.IsSolid(ServiceManager.Map.TmxMap, tile.X, tile.Y))
                            {
                                Rectangle tileRect = new Rectangle(tile.X * 32, tile.Y * 32, 32, 32);

                                Rectangle xBBox = new Rectangle((int)nextX,
                                                                (int)playerTransform.LocalPosition.Y + playerDescriptor.BoundingBox.Y,
                                                                (int)playerDescriptor.BoundingBox.Width,
                                                                (int)playerDescriptor.BoundingBox.Height);

                                if (tileRect.Intersects(xBBox))
                                {
                                    nextX = playerTransform.LocalPosition.X + playerDescriptor.BoundingBox.X;
                                }

                                Rectangle yBBox = new Rectangle((int)nextX, (int)nextY,
                                                                (int)playerDescriptor.BoundingBox.Width,
                                                                (int)playerDescriptor.BoundingBox.Height);

                                if (tileRect.Intersects(yBBox))
                                {
                                    nextY = playerTransform.LocalPosition.Y + playerDescriptor.BoundingBox.Y;
                                }
                            }
                        }
                    }
                }
            }

            playerTransform.LocalPosition = new Vector2(nextX - playerDescriptor.BoundingBox.X, nextY - playerDescriptor.BoundingBox.Y);

            float transformX = playerTransform.LocalPosition.X;
            float transformY = playerTransform.LocalPosition.Y;

            float offsetX = playerDescriptor.BoundingBox.Left + playerDescriptor.BoundingBox.Width / 2;
            float offsetY = playerDescriptor.BoundingBox.Bottom;

            transformX = Math.Max(transformX - 319 + offsetX, 0);
            transformX = Math.Min(transformX, ServiceManager.Map.WorldSizePixels.X / 2 - 638);
            transformY = Math.Max(transformY - 283 + offsetY, 0);
            transformY = Math.Min(transformY, ServiceManager.Map.WorldSizePixels.Y / 2 - 566);

            // Move the camera back
            lastTransformVector = new Vector2(transformX, transformY);
            ServiceManager.Camera.Move(lastTransformVector);

            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);

            directionalChange = false;

            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);
                NetworkManager.Instance.SendPacket(packet);

                // Reset reaction timer
                _lastReaction = 0f;
            }

            // Increment reaction timer
            _lastReaction += (float)gameTime.ElapsedGameTime.TotalSeconds;
        }
Beispiel #3
0
        /// <summary>
        /// Handles movement for a particular instance
        /// </summary>
        public void HandleMovement(NotifyMovementPacket notifyMovementPacket)
        {
            var sender = RetrieveSender(notifyMovementPacket);

            if (sender == null)
            {
                return;
            }

            var transformComponent = (TransformComponent)sender.GetComponent(typeof(TransformComponent));


            transformComponent.LastLocalPosition = transformComponent.LocalPosition;
            transformComponent.LocalPosition     = notifyMovementPacket.Location;
            transformComponent.ServerPosition    = notifyMovementPacket.Location;

            foreach (var player in _simulationState.Entities)
            {
                // Grab the connection
                var playerComponent = (PlayerComponent)player.GetComponent(typeof(PlayerComponent));

                if (playerComponent == null)
                {
                    continue;
                }


                var connection = playerComponent.Connection;

                if (connection != notifyMovementPacket.Sender)
                {
                    var broadcastPacket = new MovementRecievedPacket(notifyMovementPacket.Velocity,
                                                                     notifyMovementPacket.Location, sender.ID);

                    if (connection != null)
                    {
                        ClientNetworkManager.Instance.SendPacket(broadcastPacket, connection);
                    }
                }


                foreach (var powerup in _simulationState.Entities)
                {
                    if (powerup.HasComponent(typeof(PowerUpCollectionComponent)))
                    {
                        var transformPoweurp = (TransformComponent)powerup.GetComponent(typeof(TransformComponent));

                        Rectangle playerBox  = new Rectangle((int)(transformComponent.LocalPosition.X + 13), (int)(transformComponent.LocalPosition.Y + 45), 24, 20);
                        Rectangle powerupBox = new Rectangle((int)transformPoweurp.LocalPosition.X, (int)transformPoweurp.LocalPosition.Y, 32, 32);


                        if (playerBox.Intersects(powerupBox))
                        {
                            // Kill thy entity
                            _serviceContainer.RemoveEntity(powerup);

                            // Increase bombs
                            var power      = (PowerUpCollectionComponent)powerup.GetComponent(typeof(PowerUpCollectionComponent));
                            var powerType  = power.PowerUps[0];
                            var powerValue = power.PowerUps[0].Strength;

                            var playerPower = (PowerUpComponent)player.GetComponent(powerType.GetType());
                            playerPower.Strength += powerValue;

                            // Notify the player of their new powerup
                            var packet = new PowerupRecievedPacket(powerType, player.ID);
                            ClientNetworkManager.Instance.SendPacket(packet, notifyMovementPacket.Sender);
                        }
                    }
                }
            }



            // Now that you've moved, should check to see if any poweurps need to be awarded
        }