private void CompleteAchievement(SaintCoinach.Xiv.Achievement entry) { Debug.Assert(entry != null); completedAchievements.Add(new Achievement((uint)entry.Key)); latestAchievements.Enqueue((ushort)entry.Key); // TODO: handle rewards properly if (entry.Item != null) { owner.Inventory.NewItem((uint)entry.Item.Key); } if (entry.Title != null) { } if (owner.InWorld) { owner.Session.Send(new ServerActorAction2 { Action = ActorAction.AchievementComplete, Parameter1 = (uint)entry.Key }); owner.SendMessageToVisible(new ServerActorAction2 { Action = ActorAction.AchievementCompleteChat, Parameter1 = (uint)entry.Key }); } }
private bool CanUpdateCriteria(SaintCoinach.Xiv.Achievement entry, params int[] parameters) { Debug.Assert(entry != null); switch ((CriteriaType)entry.Type) { case CriteriaType.Achievement: if (parameters.Length < 1) { return(false); } return(entry.Data.Contains(parameters[0])); case CriteriaType.Level: { if (parameters.Length < 1) { return(false); } if (entry.GetCriteriaParameter(CriteriaParameter.JobClassId) != parameters[0]) { return(false); } return(entry.GetCriteriaParameter(CriteriaParameter.ClassLevel) < owner.Character.GetClassInfo((uint)parameters[0]).Level); } /* TODO: handle these types when related systems are implemented * case CriteriaType.MateriaMelding: * case CriteriaType.HuntingLog: * case CriteriaType.Exploration: * case CriteriaType.QuestCompleteAny: * case CriteriaType.ChocoboRank: * case CriteriaType.PvPRank: * case CriteriaType.PvPMatch: * case CriteriaType.PvPMatchWin: * case CriteriaType.ReputationRank: * case CriteriaType.FrontlineCampaign: * case CriteriaType.FrontlineCampaignWin: * case CriteriaType.FrontlineCampaignWinAny: * case CriteriaType.AetherCurrent: * case CriteriaType.Minion: * case CriteriaType.VerminionChallenge: * case CriteriaType.AnimaWeapon:*/ default: { #if DEBUG Console.WriteLine($"Unhandled AchievementCriteriaType: {entry.Type} in CanUpdateCriteria!"); #endif return(false); } } }
/// <summary> /// Get amount of criteria required to complete Achievement. /// </summary> private static int GetAchievementCriteriaCounterMax(SaintCoinach.Xiv.Achievement entry) { switch ((CriteriaType)entry.Type) { case CriteriaType.Achievement: case CriteriaType.QuestCompleteAny: return(entry.Data.Count(p => p != 0)); case CriteriaType.MateriaMelding: case CriteriaType.ChocoboRank: case CriteriaType.PvPMatch: case CriteriaType.PvPMatchWin: case CriteriaType.FrontlineCampaign: case CriteriaType.FrontlineCampaignWinAny: case CriteriaType.VerminionChallenge: return(entry.Data[0]); case CriteriaType.Counter: case CriteriaType.Level: case CriteriaType.PvPRank: case CriteriaType.ReputationRank: case CriteriaType.FrontlineCampaignWin: case CriteriaType.Minion: return(entry.Data[1]); case CriteriaType.HuntingLog: case CriteriaType.Exploration: case CriteriaType.AetherCurrent: case CriteriaType.AnimaWeapon: return(1); default: { #if DEBUG Console.WriteLine($"Unhandled CriteriaType: {entry.Type}, unable to return valid max criteria counter!"); #endif return(int.MaxValue); } } }
/// <summary> /// Get current amount of criteria progress for Achievement. /// </summary> private uint GetAchievementCriteriaCounter(SaintCoinach.Xiv.Achievement entry) { switch ((CriteriaType)entry.Type) { case CriteriaType.Counter: CriteriaCounterType type = (CriteriaCounterType)entry.GetCriteriaParameter(CriteriaParameter.CriteriaCounterTypeId); return(counterCriteria.ContainsKey(type) ? counterCriteria[type].Value : 0u); case CriteriaType.Level: return(owner.Character.GetClassInfo((uint)entry.GetCriteriaParameter(CriteriaParameter.JobClassId)).Level); /* TODO: handle these types when related systems are implemented * case CriteriaType.Achievement: * case CriteriaType.MateriaMelding: * case CriteriaType.HuntingLog: * case CriteriaType.Exploration: * case CriteriaType.QuestCompleteAny: * case CriteriaType.ChocoboRank: * case CriteriaType.PvPRank: * case CriteriaType.PvPMatch: * case CriteriaType.PvPMatchWin: * case CriteriaType.ReputationRank: * case CriteriaType.FrontlineCampaign: * case CriteriaType.FrontlineCampaignWin: * case CriteriaType.FrontlineCampaignWinAny: * case CriteriaType.AetherCurrent: * case CriteriaType.Minion: * case CriteriaType.VerminionChallenge: * case CriteriaType.AnimaWeapon:*/ default: { #if DEBUG Console.WriteLine($"Unhandled CriteriaType: {entry.Type}, unable to return valid criteria counter!"); #endif return(0); } } }
public static int GetCriteriaParameter(this SaintCoinach.Xiv.Achievement entry, CriteriaParameter parameter) { return(entry.Data[(int)parameter]); }