private void PopulatePlayers(IWorldParser parser, WorldInfoModel worldInfo) { worldInfo.Players = parser.Players.Select(p => new PlayerInfoModel { Health = p.Health, X = p.X, Y = p.Y, Z = p.Z, UUID = p.UUID, Inventory = p.Inventory.Select(i => new InventoryItemModel { Name = i.Id, Count = i.Count }) }).ToList(); }
public Task GenerateForAllWorlds() { return(Task.Run(() => { using (var scope = _serviceFactory.CreateScope()) { var context = scope.ServiceProvider.GetService <DatabaseContext>(); var worlds = context.Servers.Include(s => s.World) .Where(s => s.World != null) .Select(s => s.World) .ToList(); foreach (var world in worlds) { try { _logger.LogInformation($"Parsing info for world. ID: {world.ID} Path: '{world.Path}'"); var worldPath = _environment.BuildPath(_pathOptions.WorldDirectory, world.Path); var parser = _worldParserFactory.Create(worldPath); var worldInfo = new WorldInfoModel(); PopulatePlayers(parser, worldInfo); PopulateBlockEntities(parser, worldInfo); worldInfo.SpawnX = parser.Level?.SpawnX ?? 0; worldInfo.SpawnY = parser.Level?.SpawnY ?? 0; worldInfo.SpawnZ = parser.Level?.SpawnZ ?? 0; var worldInfoFilePath = _environment.BuildPath(_pathOptions.WorldDirectory, "info", world.Path, "worldinfo.json"); File.WriteAllText(worldInfoFilePath, JsonConvert.SerializeObject(worldInfo)); _logger.LogInformation($"Finished parsing info for world. ID: {world.ID} Path: '{world.Path}'"); } catch (Exception e) { _logger.LogError(new EventId(), e, $"An error ocurred when parsing info for world. ID: {world.ID} Path: '{world.Path}' "); } } } })); }
private void PopulateBlockEntities(IWorldParser parser, WorldInfoModel worldInfo) { var chests = new List <ChestInfoModel>(); var signs = new List <SignInfoModel>(); foreach (var region in parser.GetRegions(TARGET_REGION)) { foreach (var column in region.Columns) { foreach (var chunk in column.Chunks) { foreach (var block in chunk.Blocks) { if (block is Chest) { var chest = block as Chest; chests.Add(new ChestInfoModel { X = chest.WorldX, Y = chest.WorldY, Z = chest.WorldZ, Items = chest.Items.Select(i => new InventoryItemModel { Name = i.Id, Count = i.Count }).ToList() }); } else if (block is Sign) { var sign = block as Sign; string textRendered = string.Join("\n", sign.TextLines.Select(s => { if (s.Contains('{') && s.Contains('}') && s.Contains("\"text\":")) { var obj = JObject.Parse(s); return(obj.GetValue("text").ToString()); } else { return(s); } })); signs.Add(new SignInfoModel { X = sign.WorldX, Y = sign.WorldY, Z = sign.WorldZ, Text = textRendered }); } } } } } worldInfo.Chests = chests; worldInfo.Signs = signs; }