Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
        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)}");
                }
            }
        }
Ejemplo n.º 5
0
        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);
            }
        }