/// <summary>
        /// Check if <see cref="AchievementEntry"/> can be updated as <see cref="Player"/> with supplied object ids.
        /// </summary>
        private bool CanUpdateAchievement(Player player, AchievementEntry entry, uint objectId, uint objectIdAlt)
        {
            // TODO: should the server also check PrerequisiteId?
            if (entry.PrerequisiteIdServer != 0u && !PrerequisiteManager.Instance.Meets(player, entry.PrerequisiteIdServer))
            {
                return(false);
            }

            if (entry.PrerequisiteId != 0u && !PrerequisiteManager.Instance.Meets(player, entry.PrerequisiteId))
            {
                return(false);
            }

            // TODO: research PrerequisiteIdObjective and PrerequisiteIdObjectiveAlt

            if (entry.ObjectId != 0u && entry.ObjectId != objectId)
            {
                return(false);
            }
            if (entry.ObjectIdAlt != 0u && entry.ObjectIdAlt != objectIdAlt)
            {
                return(false);
            }

            return(true);
        }
Example #2
0
 /// <summary>
 /// Create a new <see cref="AchievementInfo"/> from <see cref="AchievementEntry"/>.
 /// </summary>
 public AchievementInfo(AchievementEntry entry)
 {
     Entry            = entry;
     ChecklistEntries = GameTableManager.Instance.AchievementChecklist.Entries
                        .Where(t => t.AchievementId == entry.Id)
                        .ToList();
 }
Example #3
0
 private static DiscordEmbed CreateAchievementEmbed(
     AchievementEntry baseAchievement, IDiscordUser user)
 {
     return(new EmbedBuilder()
            .SetTitle("🎉 Achievement Unlocked")
            .SetDescription($"{baseAchievement.Icon} **{user.Username}#{user.Discriminator}** has unlocked the achievement **{baseAchievement.ResourceName}**! {baseAchievement.Icon}").ToEmbed());
 }
Example #4
0
            public override void Process(CmdTrigger <RealmServerCmdArgs> trigger)
            {
                uint             achievementEntryId = trigger.Text.NextUInt(0U);
                AchievementEntry achievementEntry   = AchievementMgr.GetAchievementEntry(achievementEntryId);

                if (achievementEntry != null)
                {
                    AchievementCommands.AddAchievementCommand.AddAchievement((Character)trigger.Args.Target,
                                                                             achievementEntryId);
                    trigger.Reply("Achievement \"{0}\" added sucessfully.", (object[])achievementEntry.Names);
                }
                else
                {
                    trigger.Reply("Invalid AchievementId");
                }
            }
Example #5
0
        private void EpicWinKeyPressedMethod(KeyEventArgs e)
        {
            if (e.Key != Key.Enter)
            {
                return;
            }
            var entry = new AchievementEntry
            {
                Nick = (e.Source as AutoCompleteBox)?.Text,
                TypeOfAchievements = AchievementsType.EpicWin
            };

            Achievements.Add(entry);
            EpicWin.Add(entry);
            ((AutoCompleteBox)e.Source).Text = string.Empty;
            CountScale();
        }
Example #6
0
        private void ComboWfKeyPressedMethod([CanBeNull] KeyEventArgs e)
        {
            if (e?.Key != Key.Enter)
            {
                return;
            }
            var entry = new AchievementEntry
            {
                Nick = (e.Source as AutoCompleteBox)?.Text,
                TypeOfAchievements = AchievementsType.ComboFw
            };

            Achievements.Add(entry);
            ComboWf.Add(entry);
            ((AutoCompleteBox)e.Source).Text = string.Empty;
            CountScale();
        }
Example #7
0
        private void EpicWfKeyPressedMethod(KeyEventArgs e)
        {
            if (e.Key != Key.Enter)
            {
                return;
            }
            var nick  = (e.Source as AutoCompleteBox)?.Text;
            var entry = new AchievementEntry
            {
                Nick = nick,
                TypeOfAchievements = AchievementsType.EpicFw,
                WinSeries          = Context.SeasonRatingDbSet.FirstOrDefault(t => t.Nick == nick)?.WinRow ?? 0
            };

            Achievements.Add(entry);
            EpicWf.Add(entry);
            ((AutoCompleteBox)e.Source).Text = string.Empty;
            CountScale();
        }
Example #8
0
        private void TextBlock_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            MainWindow          mainWindow = Helpers.VisualTree.FindAncestor <MainWindow>(sender as DependencyObject);
            MainWindowViewModel vm         = mainWindow?.DataContext as MainWindowViewModel;

            if (vm != null)
            {
                // Switch to achievements
                vm.ActiveTabItemIndex = 5;

                // Select achievement
                TextBlock        txt         = sender as TextBlock;
                AchievementEntry entry       = txt?.DataContext as AchievementEntry;
                IAchievement     achievement = entry?.Achievement;
                if (achievement != null)
                {
                    vm.AchievementsViewModel.Select(achievement.Id);
                }
            }
        }
Example #9
0
        public static async Task SendAchievementAsync(
            AchievementEntry d, IDiscordTextChannel channel, IDiscordUser user)
        {
            using var scope = MikiApp.Instance.Services.CreateScope();
            if (channel is IDiscordGuildChannel)
            {
                var context            = scope.ServiceProvider.GetService <ISettingsService>();
                var achievementSetting = await context.GetAsync <AchievementNotificationSetting>(
                    SettingType.Achievements, (long)channel.Id);

                if (achievementSetting != AchievementNotificationSetting.All)
                {
                    return;
                }
            }

            var worker = scope.ServiceProvider.GetService <IMessageWorker <IDiscordMessage> >();

            await CreateAchievementEmbed(d, user).QueueAsync(worker, channel);
        }
Example #10
0
        public void UpdateSheetFromGameFile(string gameFileRootPath)
        {
            string gameFilePath = gameFileRootPath + Path.DirectorySeparatorChar + "Achievement.bytes";

            //Getting all current entries
            Dictionary <string, AchievementEntry> achievementEntries = new Dictionary <string, AchievementEntry>();

            Console.WriteLine("Getting Achievement Spreadsheet content");
            GoogleSheetConnector gsc = GoogleSheetConnector.GetInstance();
            string talkSpreadsheetId = gsc.SpreadsheetIDs["Achievement"];

            SpreadsheetsResource.ValuesResource.GetRequest request = gsc.Service.Spreadsheets.Values.Get(talkSpreadsheetId, SheetRange);
            ValueRange             response = request.Execute();
            List <IList <object> > values   = (List <IList <object> >)response.Values;
            int rowC = 1;

            if (values != null && values.Count > 0)
            {
                foreach (var row in values)
                {
                    AchievementEntry ae = new AchievementEntry(row);
                    ae.row = rowC;
                    achievementEntries[ae.ID] = ae;
                    rowC++;
                }
            }

            //UpdatingRequests
            var updateRequests = new List <Request>();

            Console.WriteLine("Comparing with games version and calculating updates...");
            //Parse every line in the game file
            System.IO.StreamReader reader = new System.IO.StreamReader(gameFilePath);
            string line;

            while ((line = reader.ReadLine()) != null)
            {
                //Splitting
                string[] data = line.Split('\t');

                //Parsing data
                string ID = data[0];
                string ShortOriginalText = data[1];
                string LongOriginalText  = data[2];
                string D = data[3];

                string StandardizedTerm_Short = StandardizedTermManager.GetInstance().GetTermLocatorText(ShortOriginalText);
                string StandardizedTerm_Long  = StandardizedTermManager.GetInstance().GetTermLocatorText(LongOriginalText);

                if (achievementEntries.ContainsKey(ID))
                {
                    //Compare and update
                    AchievementEntry existingEntry = achievementEntries[ID];
                    bool             needsUpdate   = false;

                    if (!string.IsNullOrEmpty(ShortOriginalText) && existingEntry.ShortOriginalText != ShortOriginalText)
                    {
                        existingEntry.ShortOriginalText = ShortOriginalText;
                        existingEntry.ShortTextChanged  = true;
                        needsUpdate = true;
                    }

                    if (!string.IsNullOrEmpty(LongOriginalText) && existingEntry.LongOriginalText != LongOriginalText)
                    {
                        existingEntry.LongOriginalText = LongOriginalText;
                        existingEntry.LongTextChanged  = true;
                        needsUpdate = true;
                    }

                    if (!string.IsNullOrEmpty(StandardizedTerm_Short) && existingEntry.StandardizedTerm_Short != StandardizedTerm_Short)
                    {
                        existingEntry.StandardizedTerm_Short = StandardizedTerm_Short;
                        needsUpdate = true;
                    }

                    if (!string.IsNullOrEmpty(StandardizedTerm_Long) && existingEntry.StandardizedTerm_Long != StandardizedTerm_Long)
                    {
                        existingEntry.StandardizedTerm_Long = StandardizedTerm_Long;
                        needsUpdate = true;
                    }

                    if (existingEntry.D != D)
                    {
                        existingEntry.D = D;
                        needsUpdate     = true;
                    }

                    if (needsUpdate)
                    {
                        updateRequests.Add(existingEntry.ToGoogleSheetUpdateRequest());
                    }
                }
                else
                {
                    //New one
                    AchievementEntry newEntry = new AchievementEntry();
                    newEntry.ID = ID;
                    newEntry.ShortOriginalText = ShortOriginalText;
                    newEntry.ShortText         = TranslationManager.GetInstance().Translate(StandardizedTerm_Short);
                    newEntry.ShortTextChanged  = true;
                    newEntry.LongOriginalText  = LongOriginalText;
                    newEntry.LongText          = TranslationManager.GetInstance().Translate(StandardizedTerm_Long);
                    newEntry.D = D;
                    newEntry.LongTextChanged        = true;
                    newEntry.MLTranslated           = true;
                    newEntry.StandardizedTerm_Short = StandardizedTerm_Short;
                    newEntry.StandardizedTerm_Long  = StandardizedTerm_Long;

                    updateRequests.Add(newEntry.ToGoogleSheetUpdateRequest());
                }
            }

            Console.WriteLine("Updating spreadsheet...");
            BatchUpdateSpreadsheetRequest batchUpdate = new BatchUpdateSpreadsheetRequest();

            batchUpdate.Requests = new List <Request>();
            int reqHandled = 0;

            //updateRequests.RemoveRange(2, updateRequests.Count - 2);
            foreach (var req in updateRequests)
            {
                batchUpdate.Requests.Add(req);
                reqHandled++;
                if (batchUpdate.Requests.Count >= 500 || reqHandled >= updateRequests.Count)
                {
                    var updateRequest = gsc.Service.Spreadsheets.BatchUpdate(batchUpdate, talkSpreadsheetId);
                    updateRequest.Execute();
                    //Resetting batch update
                    batchUpdate          = new BatchUpdateSpreadsheetRequest();
                    batchUpdate.Requests = new List <Request>();
                }
            }

            Console.WriteLine("Done!");
        }
        /* All functions are self explanitory, here's a general structure:
         * Header
         * - Info
         * - XDBF Entries (Data entries)
         * - Free space entries (old unused data that can be reused)
         * Entries
         *
         * To comment everything out in GPD's would be useless and repetitive
         *
         * Achievements, Settings, and TitlesPlayed have syncs associated with them.
         * This is used when updating information to the servers without having to
         * constantly update every single item, it would be a bad system, uneffecient.
         * Each syncable NameSpace has a Sync Entry and an Index Record (I don't know
         * why they wouldn't just combine them, maybe it's a spacial issue).  Sync Entry
         * contains the last synced entry and the next sync ID to be used when needing to
         * assign a sync ID.  To update a sync, you just get the next SyncID, assign it to
         * the respected SyncPair in the IndexRecord, move it to the bottom, and increase
         * the next sync by one.  The Xbox checks it and will sync all ID's that are
         * between the last sync and the next sync.  One trick is you have to make sure you
         * order the entries in the header properly. */
        internal GPD(string GPDLocale, uint xTitleID)
        {
            xActive = true;
            xIO = new DJsIO(GPDLocale, DJFileMode.Open, true);
            if (!xIO.Accessed)
                return;
            TitleID = xTitleID;
            xIO.IsBigEndian = true;
            xIO.Position = 0;
            if (xIO.ReadUInt32() != 0x58444246)
                throw GPDExcepts.IsntXDBF;
            xIO.Position += 4; // Version
            xEntryMax = xIO.ReadInt32();
            xEntryCurrent = xIO.ReadInt32();
            xFreeMax = xIO.ReadInt32();
            xFreeCurrent = xIO.ReadInt32();
            List<XDBFEntry> xEntries = new List<XDBFEntry>();
            try
            {
                for (int i = 0; i < xEntryCurrent; i++)
                    xEntries.Add(new XDBFEntry(this));
                xIO.Position = (0x18 + (xEntryMax * 0x12));
                for (int i = 0; i < xFreeCurrent - 1; i++)
                {
                    FreeSpaceEntry x = new FreeSpaceEntry(this);
                    xFreeEnts.Add(x);
                }
                PatchFree();
                for (int i = 0; i < xEntries.Count; i++)
                {
                    XDBFEntry x = xEntries[i];
                    switch (x.ID)
                    {
                        case (long)GPDIDs.IndexRecord:
                            {
                                RecordEntry xThisRec = new RecordEntry(x);
                                xIndexRecords.Add(xThisRec);
                                if (xThisRec.NS == NameSpace.Achievement && xAchievements.Count == 0)
                                    xIsInErase = true;
                            }
                            break;
                        case (long)GPDIDs.SyncRecord:
                            {
                                SyncEntry xThisSync = new SyncEntry(x);
                                xSyncs.Add(xThisSync);
                            }
                            break;
                        default:
                            {
                                switch (x.NS)
                                {
                                    case NameSpace.Nothing:
                                        xEntries.RemoveAt(i--);
                                        break;

                                    case NameSpace.Achievement:
                                        {
                                            AchievementEntry xCurrentAchievment = new AchievementEntry(x);
                                            xAchievements.Add(xCurrentAchievment);
                                        }
                                        break;

                                    case NameSpace.Image:
                                        {
                                            if (!ContainsEntry(x))
                                            {
                                                ImageEntry xCurrentImage = new ImageEntry(x);
                                                xImages.Add(xCurrentImage);
                                            }
                                        }
                                        break;

                                    case NameSpace.Setting:
                                        {
                                            if (!ContainsEntry(x))
                                            {
                                                Setting xThisSetting = new Setting(x);
                                                xUserSettings.Add(xThisSetting);
                                            }
                                        }
                                        break;

                                    case NameSpace.Title:
                                        {
                                            if (!ContainsEntry(x))
                                            {
                                                TitlePlayedEntry xTitle = new TitlePlayedEntry(x);
                                                xTitlesPlayed.Add(xTitle);
                                            }
                                        }
                                        break;

                                    case NameSpace.String:
                                        {
                                            if (!ContainsEntry(x))
                                            {
                                                StringEntry x_String = new StringEntry(x);
                                                xStrings.Add(x_String);
                                            }
                                        }
                                        break;

                                    default:
                                        xEntries.RemoveAt(i--);
                                        xEntryCurrent--;
                                        break;
                                }
                            }
                            break;
                    }
                }
                for (int i = 0; i < xUserSettings.Count; i++)
                {
                    if (!xUserSettings[i].LoadDetails())
                    {
                        OtherEntry xUnknown = new OtherEntry(xUserSettings[i]);
                        xUnknownData.Add(xUnknown);
                        xUserSettings.RemoveAt(i--);
                    }
                }
                for (int i = 0; i < xUnknownData.Count; i++)
                {
                    if (!xUnknownData[i].LoadData())
                    {
                        xUnknownData.RemoveAt(i--);
                        xEntryCurrent--;
                    }
                }
                for (int i = 0; i < xImages.Count; i++)
                {
                    if (!xImages[i].LoadImage())
                    {
                        xImages.RemoveAt(i--);
                        xEntryCurrent--;
                    }
                }
                for (int i = 0; i < xStrings.Count; i++)
                {
                    if (!xStrings[i].LoadString())
                    {
                        xStrings.RemoveAt(i--);
                        xEntryCurrent--;
                    }
                }
                for (int i = 0; i < xIndexRecords.Count; i++)
                {
                    if (!xIndexRecords[i].xLoadDetails())
                    {
                        xIndexRecords.RemoveAt(i--);
                        xEntryCurrent--;
                    }
                }
                for (int i = 0; i < xSyncs.Count; i++)
                {
                    if (!xSyncs[i].LoadSyncs())
                    {
                        xSyncs.RemoveAt(i--);
                        xEntryCurrent--;
                    }
                }
                for (int i = 0; i < xFreeEnts.Count; i++)
                {
                    if (xFreeEnts[i].Size == 0)
                    {
                        xFreeEnts.RemoveAt(i--);
                        xEntryCurrent--;
                    }
                }
                xUserSettings.Sort(sortbyid);
                xAchievements.Sort(sortbyid);
            }
            catch (Exception x) { xIO = null; throw x; }
        }
 int SortID(AchievementEntry Ee, AchievementEntry Er)
 {
     return Ee.ID.CompareTo(Er.ID);
 }
 int SortDate(AchievementEntry Ee, AchievementEntry Er)
 {
     return Ee.UnlockTime.CompareTo(Er.UnlockTime);
 }
Example #14
0
 void OnValidate()
 {
     achievementEntry = GetComponentInParent <AchievementEntry>();
 }