public static List <Tuple <string, LevelBlueprint, string> > ListUserLevelsFinished() { var allfiles = FileHelper.Inst.ListData(); var result = new List <Tuple <string, LevelBlueprint, string> >(); foreach (var file in allfiles) { if (!file.StartsWith("UPLOADEDLEVELDATA_")) { continue; } byte[] content = null; try { var dat = new LevelBlueprint(); content = FileHelper.Inst.ReadBinDataOrNull(file); dat.BinaryDeserialize(new BinaryReader(new MemoryStream(content))); var hash = ByteUtils.ByteToHexBitFiddle(MainGame.Inst.Bridge.DoSHA256(content)); result.Add(Tuple.Create(file, dat, hash)); } catch (Exception e) { SAMLog.Error("SCCMU::READFAIL_LULF", "Could not read CustomLevelData", $"Exception: {e}\n\n\nFile: {file}\n\n\nContent:{ByteUtils.ByteToHexBitFiddle(content)}"); } } return(result); }
private void OpenBinLevel() { try { var ofd = new OpenFileDialog(); ofd.Filter = "Userlevel (*.bin)|*"; ofd.Title = "Open Userlevel"; if (ofd.ShowDialog() != true) { return; } var filename = ofd.FileName; var bp = new LevelBlueprint(); using (var ms = new MemoryStream(File.ReadAllBytes(filename))) { using (var br = new BinaryReader(ms)) { bp.BinaryDeserialize(br); } } var bmp = CreateOverviewUnsafe(bp); PreviewImage = ImageHelper.CreateImageSource(bmp).Item1; _currentDisplayLevel = null; return; } catch (Exception e) { MessageBox.Show("OpenXNB:\r\n" + e); } }
private async Task StartDownloadLevel() { try { var binary = await MainGame.Inst.Backend.DownloadUserLevel(MainGame.Inst.Profile, _meta.OnlineID); if (binary == null) { MonoSAMGame.CurrentInst.DispatchBeginInvoke(() => { HUD.ShowToast("SCCMLPD::DF(MULTI)", L10N.T(L10NImpl.STR_SCCM_DOWNLOADFAILED), 40, FlatColors.Flamingo, FlatColors.Foreground, 3f); MonoSAMGame.CurrentInst.DispatchBeginInvoke(OnDownloadFailed); }); return; } using (var ms = new MemoryStream(binary)) { using (var br = new BinaryReader(ms)) { var bp = new LevelBlueprint(); bp.BinaryDeserialize(br); _blueprint = bp; MonoSAMGame.CurrentInst.DispatchBeginInvoke(OnDownloadSuccess); } } } catch (Exception e) { MonoSAMGame.CurrentInst.DispatchBeginInvoke(() => { HUD.ShowToast("SCCMLPD::DF(MULTI)", L10N.T(L10NImpl.STR_SCCM_DOWNLOADFAILED), 40, FlatColors.Flamingo, FlatColors.Foreground, 3f); }); MonoSAMGame.CurrentInst.DispatchBeginInvoke(OnDownloadFailed); SAMLog.Error("SCCMLPD:DownloadException", e); } }
private async Task QueryMetaFromServer(List <Tuple <long, string, SCCMListElementLocalPlayable, string> > userlevelsLocal) { var userlevel_online = await MainGame.Inst.Backend.QueryUserLevel(MainGame.Inst.Profile, QueryUserLevelCategory.AllLevelsOfUserid, MainGame.Inst.Profile.OnlineUserID.ToString(), 0); if (userlevel_online == null) { return; // no internetz } var redownload = new List <Tuple <long, SCCMLevelMeta> >(); foreach (var lvlonline in userlevel_online) { var match = userlevelsLocal.FirstOrDefault(loc => loc.Item1 == lvlonline.OnlineID); if (match != null) { if (lvlonline.Hash.ToUpper() != match.Item2.ToUpper()) { // Hash mismatch - redownload MainGame.Inst.DispatchBeginInvoke(() => { match.Item3.Remove(); SCCMUtils.DeleteUserLevelFinished(match.Item4); }); SAMLog.Info("SCCMTML::QMFS-1", $"Hash-mismatch local user level {lvlonline.OnlineID} - redownload"); redownload.Add(Tuple.Create(lvlonline.OnlineID, lvlonline)); } else { // all ok - update meta MainGame.Inst.DispatchBeginInvoke(() => { match.Item3.SetMeta(lvlonline); }); } } else { // missing - download SAMLog.Info("SCCMTML::QMFS-2", $"Missing local user level {lvlonline.OnlineID} - redownload"); redownload.Add(Tuple.Create(lvlonline.OnlineID, lvlonline)); } } foreach (var dl in redownload) { var levelcontent = await MainGame.Inst.Backend.DownloadUserLevel(MainGame.Inst.Profile, dl.Item1); if (levelcontent == null) { continue; } try { var dat = new LevelBlueprint(); dat.BinaryDeserialize(new BinaryReader(new MemoryStream(levelcontent))); MainGame.Inst.DispatchBeginInvoke(() => { SCCMUtils.UpdateUserLevelsFinished(dl.Item2.OnlineID, levelcontent); var entry = new SCCMListElementLocalPlayable(dat); _presenter.AddEntry(entry); entry.SetMeta(dl.Item2); }); } catch (Exception e) { SAMLog.Error("SCCMTML::COMPILEFAIL_QMFS", "Could not compile dowbnloaded level", $"Exception: {e}\n\n\nLevel: {dl.Item1}\n\n\nContent:{ByteUtils.ByteToHexBitFiddle(levelcontent)}"); } } }
private void CreateScreenshots(object obj) { try { var ofd = new OpenFileDialog(); ofd.Filter = "Userlevels Backup (*.tgz)|*.tgz"; ofd.Title = "Open Userlevels backup"; if (ofd.ShowDialog() != true) { return; } var sfd = new VistaFolderBrowserDialog(); sfd.UseDescriptionForTitle = true; sfd.Description = "Save screenshots to directory"; if (sfd.ShowDialog() != true) { return; } List <Tuple <string, LevelBlueprint> > prints = new List <Tuple <string, LevelBlueprint> >(); using (Stream stream = File.OpenRead(ofd.FileName)) { var reader = ReaderFactory.Open(stream); while (reader.MoveToNextEntry()) { if (!reader.Entry.IsDirectory) { reader.WriteEntryToDirectory(sfd.SelectedPath, new ExtractionOptions() { ExtractFullPath = false, Overwrite = true }); var file = Path.Combine(sfd.SelectedPath, Path.GetFileName(reader.Entry.Key.Replace('/', '\\'))); var bp = new LevelBlueprint(); using (var ms = new MemoryStream(File.ReadAllBytes(file))) { using (var br = new BinaryReader(ms)) { bp.BinaryDeserialize(br); } } prints.Add(Tuple.Create(file, bp)); File.Delete(file); } } } foreach (var lvl in prints) { var bmp = CreateOverviewSafe(Path.GetFileName(lvl.Item1), lvl.Item2); bmp.Save(lvl.Item1 + ".png"); } MessageBox.Show("Success"); } catch (Exception e) { MessageBox.Show("LevelOverview failed:\r\n" + e); } }