Пример #1
0
 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();
 }
Пример #2
0
        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}' ");
                        }
                    }
                }
            }));
        }
Пример #3
0
        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;
        }