Esempio n. 1
0
 private bool ValidateOsz(string path)
 {
     using (var fs = File.OpenRead(path))
         using (var zs = new osu.Game.IO.Archives.ZipArchiveReader(fs))
         {
             return(true);
         }
 }
Esempio n. 2
0
        /// <summary>
        /// 내려받은 맵셋 파일을 통해 자세한 정보를 가져옴
        /// </summary>
        /// <param name="path">맵셋 파일 경로</param>
        /// <returns>Set</returns>
        public static Set GetSetFromLocal(int id, string path)
        {
            var set = new Set {
                SetId = id
            };

            using (var fs = File.OpenRead(path))
                using (var osz = new osu.Game.IO.Archives.ZipArchiveReader(fs))
                {
                    if (!osz.Filenames.Any(f => f.EndsWith(@".osu")))
                    {
                        throw new InvalidOperationException("No beatmap files found in the map folder.");
                    }

                    // https://github.com/ppy/osu/blob/v2018.201.0/osu.Game/Beatmaps/BeatmapManager.cs#L584
                    foreach (var entry in osz.Filenames.Where(i => i.EndsWith(@".osu")))
                    {
                        using (var raw = osz.GetStream(entry))
                            using (var ms = new MemoryStream()) //we need a memory stream so we can seek and shit
                                using (var sr = new StreamReader(ms))
                                {
                                    raw.CopyTo(ms);
                                    ms.Position = 0;

                                    var beatmap = osu.Game.Beatmaps.Formats.Decoder.GetDecoder <osu.Game.Beatmaps.Beatmap>(sr).Decode(sr);

                                    beatmap.BeatmapInfo.Hash    = ms.ComputeSHA2Hash();
                                    beatmap.BeatmapInfo.MD5Hash = ms.ComputeMD5Hash();

                                    //RulesetInfo ruleset = RulesetStore.GetRuleset(beatmap.BeatmapInfo.RulesetID);

                                    // TODO: this should be done in a better place once we actually need to dynamically update it.
                                    //beatmap.BeatmapInfo.StarDifficulty = Math.Max(0, ruleset?.CreateInstance()?.CreateDifficultyCalculator(beatmap).Calculate() ?? 0);

                                    // https://github.com/ppy/osu/blob/v2018.201.0/osu.Game/Screens/Select/BeatmapInfoWedge.cs#L220
                                    var lastObject = beatmap.HitObjects.LastOrDefault();
                                    var endTime    = (lastObject as IHasEndTime)?.EndTime ?? lastObject?.StartTime ?? 0;
                                    var startTime  = beatmap.HitObjects.FirstOrDefault()?.StartTime ?? 0;
                                    beatmap.BeatmapInfo.OnlineInfo = new BeatmapOnlineInfo
                                    {
                                        Length = (endTime - startTime) / 1000.0
                                    };

                                    set.Beatmaps.Add(new Beatmap(beatmap));
                                }
                    }
                }
            return(set);
        }