private static void HandleAddExplorationQuests(GameSession session, PacketReader packet) { List <QuestStatus> list = new List <QuestStatus>(); int listSize = packet.ReadInt(); for (int i = 0; i < listSize; i++) { int questId = packet.ReadInt(); if (session.Player.QuestList.Exists(x => x.Basic.Id == questId && x.Started)) { continue; } QuestMetadata metadata = QuestMetadataStorage.GetMetadata(questId); QuestStatus questStatus = new QuestStatus(session.Player, metadata) { Started = true, StartTimestamp = DateTimeOffset.Now.ToUnixTimeSeconds() }; list.Add(questStatus); session.Send(QuestPacket.AcceptQuest(questStatus.Basic.Id)); } session.Player.QuestList.AddRange(list); }
private static void HandleAddExplorationQuests(GameSession session, PacketReader packet) { List <QuestStatus> list = new List <QuestStatus>(); int listSize = packet.ReadInt(); for (int i = 0; i < listSize; i++) { int questId = packet.ReadInt(); if (session.Player.QuestList.Exists(x => x.Basic.QuestID == questId)) { continue; } QuestMetadata metadata = QuestMetadataStorage.GetMetadata(questId); QuestStatus questStatus = new QuestStatus() { Basic = metadata.Basic, Started = true, StartTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(), Condition = metadata.Condition, Reward = metadata.Reward, RewardItems = metadata.RewardItem }; list.Add(questStatus); } session.Player.QuestList.AddRange(list); session.Send(QuestPacket.SendQuests(list)); }
private void LoadQuest(string fullPath) { var file = new File(); var err = file.OpenCompressed(fullPath, (int)File.ModeFlags.Read, (int)File.CompressionMode.Gzip); if (err != Error.Ok) { Logger.Error("Could not load quest " + fullPath + " error code " + err); file.Close(); return; } var json = file.GetAsText(); file.Close(); var saveModel = JsonConvert.DeserializeObject <QuestSaveModel>(json); if (saveModel != null) { if (QuestIdToMetadata.ContainsKey(saveModel.Start.Id)) { Logger.Error("Quests already has file " + fullPath); } var metadata = new QuestMetadata(saveModel.Start.Id, fullPath, fullPath, null, saveModel); QuestIdToMetadata[saveModel.Start.Id] = metadata; } else { Logger.Error("Could not deserialize quest " + fullPath); } }
public override void Execute(GameCommandTrigger trigger) { int questId = trigger.Get <int>("id"); if (questId == 0) { trigger.Session.SendNotice("Type an quest id."); return; } QuestMetadata quest = QuestMetadataStorage.GetMetadata(questId); if (quest == null) { trigger.Session.Send(NoticePacket.Notice($"Quest not found with id: {questId.ToString().Color(Color.Aquamarine)}.", NoticeType.Chat)); return; } if (trigger.Session.Player.QuestData.ContainsKey(questId)) { trigger.Session.Send(NoticePacket.Notice($"You already have quest: {questId.ToString().Color(Color.Aquamarine)}.", NoticeType.Chat)); return; } trigger.Session.Player.QuestData.Add(questId, new(trigger.Session.Player, quest, QuestState.Started, TimeInfo.Now())); trigger.Session.Send(QuestPacket.AcceptQuest(questId)); }
private void SetMetadataValues(QuestMetadata metadata) { Basic = metadata.Basic; StartNpcId = metadata.StartNpc; CompleteNpcId = metadata.CompleteNpc; Reward = metadata.Reward; RewardItems = metadata.RewardItem; }
public QuestStatus(QuestMetadata metadata) { Basic = metadata.Basic; StartNpcId = metadata.StartNpc; CompleteNpcId = metadata.CompleteNpc; Condition = metadata.Condition; Reward = metadata.Reward; RewardItems = metadata.RewardItem; }
public void SetMetadataValues(int id) { QuestMetadata metadata = QuestMetadataStorage.GetMetadata(id); Basic = metadata.Basic; StartNpcId = metadata.StartNpc; CompleteNpcId = metadata.CompleteNpc; Reward = metadata.Reward; RewardItems = metadata.RewardItem; }
private void SetMetadataValues() { QuestMetadata metadata = QuestMetadataStorage.GetMetadata(Id); Basic = metadata.Basic; StartNpcId = metadata.StartNpc; CompleteNpcId = metadata.CompleteNpc; Reward = metadata.Reward; RewardItems = metadata.RewardItem; }
private static void HandleResumeDungeon(GameSession session, PacketReader packet) { int questId = packet.ReadInt(); if (!session.Player.QuestData.TryGetValue(questId, out QuestStatus questStatus) || questStatus.State is QuestState.Completed) { return; } QuestMetadata questMetadata = QuestMetadataStorage.GetMetadata(questId); session.Player.Warp(questMetadata.ProgressMap.First()); }
private static void HandleDispatchMode(GameSession session, PacketReader packet) { int questId = packet.ReadInt(); short mode = packet.ReadShort(); if (!session.Player.QuestData.TryGetValue(questId, out QuestStatus questStatus) || questStatus.State is QuestState.Completed) { return; } QuestMetadata questMetadata = QuestMetadataStorage.GetMetadata(questId); session.Player.Warp(questMetadata.Dispatch.FieldId); }
public QuestStatus(Player player, QuestMetadata metadata) { Player = player; Id = metadata.Basic.Id; Basic = metadata.Basic; StartNpcId = metadata.StartNpc; CompleteNpcId = metadata.CompleteNpc; Condition = new List <Condition>(); foreach (QuestCondition condition in metadata.Condition) { Condition.Add(new Condition(condition.Type, condition.Codes, condition.Goal, 0, condition.Target)); } Reward = metadata.Reward; RewardItems = metadata.RewardItem; Uid = DatabaseManager.AddQuest(this); }
public static List <QuestMetadata> GetAvailableQuests(int level) { List <QuestMetadata> list = new List <QuestMetadata>(); foreach (KeyValuePair <int, QuestMetadata> item in map) { QuestMetadata questMetadata = item.Value; if (level >= questMetadata.Require.Level && questMetadata.Require.RequiredQuests.Count == 0 && (questMetadata.Basic.QuestType == QuestType.Epic || questMetadata.Basic.QuestType == QuestType.World)) { list.Add(questMetadata); } } return(list); }
public QuestStatus(long characterId, QuestMetadata metadata, QuestState state = QuestState.None, long startTimestamp = 0, bool accepted = false) { SetMetadataValues(metadata); CharacterId = characterId; Id = metadata.Basic.Id; Condition = new(); foreach (QuestCondition condition in metadata.Condition) { Condition.Add(new(condition.Type, condition.Code, condition.Goal, 0, condition.Target)); } State = state; StartTimestamp = startTimestamp; Accepted = accepted; AmountCompleted = 0; Uid = DatabaseManager.Quests.Insert(this); }
public QuestStatus(Player player, QuestMetadata metadata, bool started = false, long startTimestamp = 0) { CharacterId = player.CharacterId; Id = metadata.Basic.Id; Basic = metadata.Basic; StartNpcId = metadata.StartNpc; CompleteNpcId = metadata.CompleteNpc; Condition = new List <Condition>(); foreach (QuestCondition condition in metadata.Condition) { Condition.Add(new Condition(condition.Type, condition.Codes, condition.Goal, 0, condition.Target)); } Reward = metadata.Reward; RewardItems = metadata.RewardItem; Started = started; StartTimestamp = startTimestamp; Tracked = true; Uid = DatabaseManager.Quests.Insert(this); }
private static void HandleAddExplorationQuests(GameSession session, PacketReader packet) { List <QuestStatus> list = new List <QuestStatus>(); int listSize = packet.ReadInt(); for (int i = 0; i < listSize; i++) { int questId = packet.ReadInt(); if (session.Player.QuestList.Exists(x => x.Basic.Id == questId)) { continue; } QuestMetadata metadata = QuestMetadataStorage.GetMetadata(questId); list.Add(new QuestStatus(metadata)); } session.Player.QuestList.AddRange(list); session.Send(QuestPacket.SendQuests(list)); }
private static void HandleAddExplorationQuests(GameSession session, PacketReader packet) { int listSize = packet.ReadInt(); for (int i = 0; i < listSize; i++) { int questId = packet.ReadInt(); session.Player.QuestData.TryGetValue(questId, out QuestStatus questStatus); session.Send(QuestPacket.AcceptQuest(questId)); if (questStatus is null) { QuestMetadata metadata = QuestMetadataStorage.GetMetadata(questId); session.Player.QuestData.Add(questId, new(session.Player, metadata, QuestState.Started, TimeInfo.Now())); continue; } questStatus.State = QuestState.Started; DatabaseManager.Quests.Update(questStatus); } }
public override void Execute(GameCommandTrigger trigger) { int questId = trigger.Get <int>("id"); bool forceStart = trigger.Get <bool>("force"); if (questId == 0) { trigger.Session.SendNotice("Type an quest id."); return; } QuestMetadata quest = QuestMetadataStorage.GetMetadata(questId); if (quest == null) { trigger.Session.Send(NoticePacket.Notice($"Quest not found with id: {questId.ToString().Color(Color.Aquamarine)}.", NoticeType.Chat)); return; } Player player = trigger.Session.Player; if (player.QuestData.TryGetValue(questId, out QuestStatus questStatus) && !forceStart) { trigger.Session.Send(NoticePacket.Notice( $"You already have quest: {questId.ToString().Color(Color.Aquamarine)}. \r\tUse '/startquest {questId} true' to start it again.", NoticeType.Chat)); return; } if (questStatus is not null) { player.QuestData.Remove(questId, out _); DatabaseManager.Quests.Delete(questStatus.Uid); } questStatus = new(player.CharacterId, questId, QuestState.Started, TimeInfo.Now(), accepted : true); player.QuestData.Add(questId, questStatus); trigger.Session.Send(QuestPacket.AcceptQuest(questStatus)); }
public override void Execute(GameCommandTrigger trigger) { int questId = trigger.Get <int>("id"); if (questId == 0) { trigger.Session.SendNotice("Type an quest id."); return; } QuestMetadata quest = QuestMetadataStorage.GetMetadata(questId); if (quest == null) { trigger.Session.Send(NoticePacket.Notice($"Quest not found with id: {questId.ToString().Color(Color.Aquamarine)}.", NoticeType.Chat)); return; } if (trigger.Session.Player.QuestList.Any(x => x.Basic.Id == questId)) { trigger.Session.Send(NoticePacket.Notice($"You already have quest: {questId.ToString().Color(Color.Aquamarine)}.", NoticeType.Chat)); return; } trigger.Session.Player.QuestList.Add(new QuestStatus(trigger.Session.Player, quest, true, DateTimeOffset.Now.ToUnixTimeSeconds())); trigger.Session.Send(QuestPacket.AcceptQuest(questId)); }
public static List <QuestMetadata> Parse(MemoryMappedFile m2dFile, IEnumerable <PackFileEntry> entries) { List <QuestMetadata> quests = new List <QuestMetadata>(); foreach (PackFileEntry entry in entries) { if (!entry.Name.StartsWith("quest/")) { continue; } QuestMetadata metadata = new QuestMetadata(); using XmlReader reader = m2dFile.GetReader(entry.FileHeader); while (reader.Read()) { if (reader.NodeType != XmlNodeType.Element) { continue; } if (reader.Name == "environment" && (reader["locale"] != "NA" && reader["locale"] != "")) // only reading quests for NA or all environments { reader.Skip(); } else if (reader.Name == "environment") { metadata.Feature = reader["feature"]; metadata.Locale = reader["locale"]; } else if (reader.Name == "basic") { metadata.Basic.ChapterID = string.IsNullOrEmpty(reader["chapterID"]) ? 0 : int.Parse(reader["chapterID"]); metadata.Basic.QuestID = string.IsNullOrEmpty(reader["questID"]) ? 0 : int.Parse(reader["questID"]); metadata.Basic.QuestType = string.IsNullOrEmpty(reader["questType"]) ? 0 : byte.Parse(reader["questType"]); metadata.Basic.Account = string.IsNullOrEmpty(reader["account"]) ? 0 : byte.Parse(reader["account"]); metadata.Basic.StandardLevel = string.IsNullOrEmpty(reader["standardLevel"]) ? 0 : int.Parse(reader["standardLevel"]); metadata.Basic.AutoStart = string.IsNullOrEmpty(reader["autoStart"]) ? 0 : byte.Parse(reader["autoStart"]); metadata.Basic.DisableGiveup = string.IsNullOrEmpty(reader["disableGiveup"]) ? 0 : byte.Parse(reader["disableGiveup"]); metadata.Basic.ExceptChapterClear = string.IsNullOrEmpty(reader["exceptChapterClear"]) ? 0 : int.Parse(reader["exceptChapterClear"]); metadata.Basic.Repeatable = string.IsNullOrEmpty(reader["repeatable"]) ? 0 : byte.Parse(reader["repeatable"]); metadata.Basic.UsePeriod = reader["usePeriod"]; metadata.Basic.EventTag = reader["eventTag"]; metadata.Basic.Locking = string.IsNullOrEmpty(reader["locking"]) ? 0 : byte.Parse(reader["locking"]); metadata.Basic.TabIndex = string.IsNullOrEmpty(reader["tabIndex"]) ? 0 : int.Parse(reader["tabIndex"]); metadata.Basic.ForceRegistGuide = string.IsNullOrEmpty(reader["forceRegistGuide"]) ? 0 : byte.Parse(reader["forceRegistGuide"]); metadata.Basic.UseNavigation = reader["useNavi"] == "FALSE" ? false : true; } else if (reader.Name == "notify") { metadata.Notify.CompleteUiEffect = reader["completeUiEffect"]; metadata.Notify.AcceptSoundKey = reader["acceptSoundKey"]; metadata.Notify.CompleteSoundKey = reader["completeSoundKey"]; } else if (reader.Name == "require") { metadata.Require.Level = string.IsNullOrEmpty(reader["level"]) ? 0 : short.Parse(reader["level"]); metadata.Require.MaxLevel = string.IsNullOrEmpty(reader["maxLevel"]) ? 0 : short.Parse(reader["maxLevel"]); if (!string.IsNullOrEmpty(reader["job"])) { List <string> temp = new List <string>(reader["job"].Split(",")); foreach (string item in temp) { metadata.Require.Job.Add(short.Parse(item)); } } if (!string.IsNullOrEmpty(reader["quest"])) { List <string> temp = new List <string>(reader["quest"].Split(",")); foreach (string item in temp) { metadata.Require.RequiredQuests.Add(int.Parse(item)); } } if (!string.IsNullOrEmpty(reader["selectableQuest"])) { List <string> temp = new List <string>(reader["selectableQuest"].Split(",")); foreach (string item in temp) { metadata.Require.SelectableQuest.Add(int.Parse(item)); } } if (!string.IsNullOrEmpty(reader["unrequire"])) { List <string> temp = new List <string>(reader["unrequire"].Split(",")); foreach (string item in temp) { metadata.Require.Unrequire.Add(int.Parse(item)); } } metadata.Require.Field = string.IsNullOrEmpty(reader["field"]) ? 0 : int.Parse(reader["field"]); metadata.Require.Achievement = string.IsNullOrEmpty(reader["achievement"]) ? 0 : int.Parse(reader["achievement"]); if (!string.IsNullOrEmpty(reader["unreqAchievement"])) { List <string> temp = new List <string>(reader["unreqAchievement"].Split(",")); foreach (string item in temp) { metadata.Require.UnreqAchievement.Add(int.Parse(item)); } } metadata.Require.GroupID = string.IsNullOrEmpty(reader["groupID"]) ? 0 : int.Parse(reader["groupID"]); metadata.Require.DayOfWeek = reader["dayOfWeek"]; metadata.Require.GearScore = string.IsNullOrEmpty(reader["gearScore"]) ? 0 : int.Parse(reader["gearScore"]); } else if (reader.Name == "start") { metadata.StartNpc = int.Parse(reader["npc"]); } else if (reader.Name == "complete") { metadata.CompleteNpc = int.Parse(reader["npc"]); } else if (reader.Name == "completeReward") { metadata.Reward.Exp = string.IsNullOrEmpty(reader["exp"]) ? 0 : int.Parse(reader["exp"]); metadata.Reward.RelativeExp = reader["relativeExp"]; metadata.Reward.Money = string.IsNullOrEmpty(reader["money"]) ? 0 : int.Parse(reader["money"]); metadata.Reward.Karma = string.IsNullOrEmpty(reader["karma"]) ? 0 : int.Parse(reader["karma"]); metadata.Reward.Lu = string.IsNullOrEmpty(reader["lu"]) ? 0 : int.Parse(reader["lu"]); } else if (reader.Name == "essentialJobItem" || reader.Name == "globalEssentialItem" || reader.Name == "globalEssentialJobItem") { int itemid = string.IsNullOrEmpty(reader["code"]) ? 0 : int.Parse(reader["code"]); byte rank = string.IsNullOrEmpty(reader["rank"]) ? 0 : byte.Parse(reader["rank"]); int count = string.IsNullOrEmpty(reader["count"]) ? 0 : int.Parse(reader["count"]); QuestRewardItem item = new QuestRewardItem(itemid, rank, count); metadata.RewardItem.Add(item); } else if (reader.Name == "progressMap") { if (!string.IsNullOrEmpty(reader["progressMap"])) { List <string> temp = new List <string>(reader["progressMap"].Split(",")); foreach (string item in temp) { metadata.ProgressMap.Add(int.Parse(item)); } } } else if (reader.Name == "guide") { metadata.Guide.Type = reader["guideType"]; metadata.Guide.Icon = reader["guideIcon"]; metadata.Guide.MinLevel = string.IsNullOrEmpty(reader["guideMinLevel"]) ? 0 : byte.Parse(reader["guideMinLevel"]); metadata.Guide.MaxLevel = string.IsNullOrEmpty(reader["guideMaxLevel"]) ? 0 : byte.Parse(reader["guideMaxLevel"]); metadata.Guide.Group = reader["guideGroup"]; } else if (reader.Name == "gotoNpc") { metadata.Npc.Enable = string.IsNullOrEmpty(reader["enable"]) ? 0 : byte.Parse(reader["enable"]); metadata.Npc.GoToField = string.IsNullOrEmpty(reader["gotoField"]) ? 0 : int.Parse(reader["gotoField"]); metadata.Npc.GoToPortal = string.IsNullOrEmpty(reader["gotoPortal"]) ? 0 : int.Parse(reader["gotoPortal"]); } else if (reader.Name == "gotoDungeon") { metadata.Dungeon.State = string.IsNullOrEmpty(reader["state"]) ? 0 : byte.Parse(reader["state"]); metadata.Dungeon.GoToDungeon = string.IsNullOrEmpty(reader["gotoDungeon"]) ? 0 : int.Parse(reader["gotoDungeon"]); metadata.Dungeon.GoToInstanceID = string.IsNullOrEmpty(reader["gotoInstanceID"]) ? 0 : int.Parse(reader["gotoInstanceID"]); } else if (reader.Name == "remoteAccept") { metadata.RemoteAccept.UseRemote = reader["useRemote"]; metadata.RemoteAccept.RequireField = string.IsNullOrEmpty(reader["requireField"]) ? 0 : int.Parse(reader["requireField"]); } else if (reader.Name == "remoteComplete") { metadata.RemoteComplete.UseRemote = reader["useRemote"]; metadata.RemoteComplete.RequireField = string.IsNullOrEmpty(reader["requireField"]) ? 0 : int.Parse(reader["requireField"]); metadata.RemoteComplete.RequireDungeonClear = string.IsNullOrEmpty(reader["requireDungeonClear"]) ? 0 : int.Parse(reader["requireDungeonClear"]); } else if (reader.Name == "summonPortal") { metadata.SummonPortal.FieldID = string.IsNullOrEmpty(reader["fieldID"]) ? 0 : int.Parse(reader["fieldID"]); metadata.SummonPortal.PortalID = string.IsNullOrEmpty(reader["portalID"]) ? 0 : int.Parse(reader["portalID"]); } else if (reader.Name == "eventMission") { metadata.Event = reader["event"]; } else if (reader.Name == "condition") { string Type = reader["type"]; string Code = reader["code"]; int Value = string.IsNullOrEmpty(reader["value"]) ? 0 : int.Parse(reader["value"]); List <string> temp = null; if (!string.IsNullOrEmpty(reader["target"])) { temp = new List <string>(reader["target"].Split(",")); } metadata.Condition.Add(new QuestCondition(Type, Code, Value, temp)); } else if (reader.Name == "navi") { string NaviType = reader["type"]; string NaviCode = reader["code"]; int NaviMap = string.IsNullOrEmpty(reader["map"]) ? 0 : int.Parse(reader["map"]); metadata.Navigation.Add(new QuestNavigation(NaviType, NaviCode, NaviMap)); } } quests.Add(metadata); } return(quests); }