private void HandleMovementRequest(NotifyMovementPacket notifyMovementPacket) { // Find the session var session = GetUserSession(notifyMovementPacket.Sender); // If the session is valid if (session != null) { session.HandleMovement(notifyMovementPacket); } }
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; }
/// <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 }