private string CreateMessage <T>(string commandName, T instanceToSend) { var content = SerializationAdapter.SerializeObject ( new NetworkCommand() { CommandName = commandName, CommandArgument = typeof(T).FullName, Data = SerializationAdapter.SerializeObject(instanceToSend) } ); return(content); }
private GameStateData ToGameState(IGameSectorLayerService gameSector, string loginToken) { var player = gameSector .DataLayer .Players .FirstOrDefault(somePlayer => somePlayer.LoginToken == loginToken); //var playerRectangle = new Rectangle(player.CurrentImage.Position.ToVector2().ToPoint(), new Point((int)MathF.Round(player.Stats.Aura * (int)MathF.Round(player.CurrentImage.Width * player.CurrentImage.Scale.X)))); var playerRectangleWithAura = ImageToRectangleTransformationService.Transform(player.CurrentImage, (int)MathF.Round(player.CurrentImage.Width * player.CurrentImage.Scale.X * player.Stats.Aura)); var playerRectangle = ImageToRectangleTransformationService.Transform(player.CurrentImage); var playerCanUseDialog = gameSector .DataLayer .Layers .Where(l => l.DataAsEnumerable <IdentifiableCircularLocation>().Any( location => { var radiusAsVector2 = location.Radius.ToVector2(); var locationRectangle = ImageToRectangleTransformationService.Transform(location.Position, 1f.ToVector2(), (int)MathF.Round(radiusAsVector2.X), (int)MathF.Round(radiusAsVector2.Y)); return(locationRectangle.Intersects(playerRectangle)); })) .Any(); var playerNearEnemies = gameSector .DataLayer .Enemies .Where(enemy => ImageToRectangleTransformationService.Transform(enemy.CurrentImage) .Intersects(playerRectangleWithAura)) .Any(); var bankAccountSum = gameSector .DataLayer .GetLayersByType <IntBank>() .SelectMany(l => l.DataAsEnumerable <IntBank>()) .Where(b => b.OwnerName == player.LoginToken) .Sum(b => b.Amount); var unserializedPlayerMetadata = new PlayerMetadataBag() { MoneyCount = bankAccountSum, Stats = player.Stats, GameSectorTag = gameSector.Tag, ChosenStat = player.ChosenStat, Items = gameSector.DataLayer.Items.Where(item => item.OwnerName == player.DisplayName).ToList(), CurrentDialog = gameSector.PlayerDialogService.GetDialogNodeByLoginToken(player.LoginToken), ServerEventName = playerNearEnemies ? "Enemies" : playerCanUseDialog ? "Dialog" : string.Empty }; var cache = new GameStateData { Commands = new List <string>(), LoginToken = player.LoginToken }; //pass camera data cache.Screen = gameSector.IODataLayer.GetGameStateByLoginToken(loginToken)?.Screen; cache.Camera = new CameraData { Position = player.CurrentImage.Position, Rotation = player.CurrentImage.Rotation }; //convert entities to images ( this is poor data, means only data needed ) cache.Images?.Clear(); cache.Images = new List <ImageData>(); cache.Images.AddRange(gameSector .DataLayer .Players .Where(e => Vector2.Distance( e.CurrentImage.Position.ToVector2(), player.CurrentImage.Position.ToVector2()) <= DrawingDistance) .Select(playerInfo => playerInfo.CurrentImage) .ToList()); cache.Images.AddRange(gameSector .DataLayer .Enemies .Where(e => Vector2.Distance( e.CurrentImage.Position.ToVector2(), player.CurrentImage.Position.ToVector2()) <= DrawingDistance) .Select(enemy => enemy.CurrentImage).ToList()); cache.Images.AddRange(gameSector .DataLayer .Projectiles .Where(e => Vector2.Distance( e.CurrentImage.Position.ToVector2(), player.CurrentImage.Position.ToVector2()) <= DrawingDistance) .Select(projectile => projectile.CurrentImage).ToList()); cache.Images.AddRange(gameSector .DataLayer .Items .Where(e => Vector2.Distance( e.CurrentImage.Position.ToVector2(), player.CurrentImage.Position.ToVector2()) <= DrawingDistance && !e.InInventory) .Select(item => item.CurrentImage).ToList()); cache.Images.AddRange(gameSector .DataLayer .GeneralCharacter .Where(e => Vector2.Distance( e.CurrentImage.Position.ToVector2(), player.CurrentImage.Position.ToVector2()) <= DrawingDistance) .Select(prop => prop.CurrentImage).ToList()); cache.Images.AddRange(gameSector .DataLayer .ImageData .Where(e => Vector2.Distance( e.Position.ToVector2(), player.CurrentImage.Position.ToVector2()) <= DrawingDistance + 1024 || e.SelectedFrame.Contains("fog")) .ToList()); //get selected item of player (just in case) / for now... var previousSelectedItem = gameSector .DataLayer .PlayerItems .FirstOrDefault(pItem => pItem.OwnerName == player.DisplayName && pItem.Selected); unserializedPlayerMetadata.TimeStamp = DateTime.Now; //Position of the meta data is here now.. but it should be changed later on cache.Metadata = new IdentifiableNetworkCommand() { Id = player.CurrentImage.Id, CommandName = gameSector.Tag, CommandArgument = unserializedPlayerMetadata.GetType().FullName, Data = SerializationAdapter.SerializeObject(unserializedPlayerMetadata) }; return(cache); }