/// <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); }
/// <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(); }
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()); }
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"); } }
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(); }
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(); }
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(); }
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); } } }
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); }
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); }
void OnValidate() { achievementEntry = GetComponentInParent <AchievementEntry>(); }