private static void HandleContinue(GameSession session, PacketReader packet) { NpcTalk npcTalk = session.Player.NpcTalk; if (npcTalk.Npc.IsBeauty()) { HandleBeauty(session); return; } int index = packet.ReadInt(); // selection index // index is quest if (index <= npcTalk.Quests.Count - 1 && npcTalk.ScriptId == 0) { npcTalk.QuestId = npcTalk.Quests[index].Basic.Id; npcTalk.IsQuest = true; } ScriptMetadata scriptMetadata = npcTalk.IsQuest ? ScriptMetadataStorage.GetQuestScriptMetadata(npcTalk.QuestId) : ScriptMetadataStorage.GetNpcScriptMetadata(npcTalk.Npc.Id); ResponseType responseType = npcTalk.IsQuest ? ResponseType.Quest : ResponseType.Dialog; if (npcTalk.ScriptId != 0) { Option option = scriptMetadata.Options.First(x => x.Id == npcTalk.ScriptId); if (option.AmountContent <= npcTalk.ContentIndex && option.Goto.Count == 0) { session.Send(NpcTalkPacket.Close()); return; } } // Find next script id int nextScript = GetNextScript(scriptMetadata, npcTalk, index); Option option2 = scriptMetadata.Options.FirstOrDefault(x => x.Id == npcTalk.ScriptId); if (option2?.AmountContent > 1 && option2?.AmountContent > npcTalk.ContentIndex) { nextScript = npcTalk.ScriptId; } if (npcTalk.ScriptId != nextScript) { npcTalk.ContentIndex = 1; } else { npcTalk.ContentIndex++; } Option option1 = scriptMetadata.Options.First(x => x.Id == nextScript); bool hasNextScript = option1.Goto.Count != 0; if (option1.AmountContent > npcTalk.ContentIndex) { hasNextScript = true; } npcTalk.ScriptId = nextScript; DialogType dialogType = GetDialogType(scriptMetadata, npcTalk, hasNextScript); session.Send(NpcTalkPacket.ContinueChat(nextScript, responseType, dialogType, npcTalk.ContentIndex - 1, npcTalk.QuestId)); }
private static void HandleContinue(GameSession session, int index) { NpcTalk npcTalk = session.Player.NpcTalk; if (npcTalk.Npc.IsBeauty()) { HandleBeauty(session); return; } ScriptLoader scriptLoader = new ScriptLoader($"Npcs/{npcTalk.Npc.Id}", session); // index is quest if (index <= npcTalk.Quests.Count - 1 && npcTalk.ScriptId == 0) { npcTalk.QuestId = npcTalk.Quests[index].Basic.Id; npcTalk.IsQuest = true; } ScriptMetadata scriptMetadata = npcTalk.IsQuest ? ScriptMetadataStorage.GetQuestScriptMetadata(npcTalk.QuestId) : ScriptMetadataStorage.GetNpcScriptMetadata(npcTalk.Npc.Id); ResponseType responseType = npcTalk.IsQuest ? ResponseType.Quest : ResponseType.Dialog; if (npcTalk.ScriptId != 0) { Option option = scriptMetadata.Options.First(x => x.Id == npcTalk.ScriptId); // Find if player has quest condition for type "talk_in" and option id QuestHelper.UpdateQuest(session, npcTalk.Npc.Id.ToString(), "talk_in", option.Id.ToString()); // If npc has no more options, close dialog if (option.Contents.Count <= npcTalk.ContentIndex + 1 && option.Contents[npcTalk.ContentIndex].Goto.Count == 0) { session.Send(NpcTalkPacket.Close()); return; } } int nextScriptId = GetNextScript(scriptMetadata, npcTalk, index, scriptLoader); // If last script is different from next, reset content index, else increment content index if (npcTalk.ScriptId != nextScriptId) { npcTalk.ContentIndex = 0; } else { npcTalk.ContentIndex++; } Option nextScript = scriptMetadata.Options.First(x => x.Id == nextScriptId); bool hasNextScript = nextScript.Contents[npcTalk.ContentIndex].Goto.Count != 0; if (nextScript.Contents.Count > npcTalk.ContentIndex + 1) { hasNextScript = true; } npcTalk.ScriptId = nextScriptId; DialogType dialogType = GetDialogType(scriptMetadata, npcTalk, hasNextScript); session.Send(NpcTalkPacket.ContinueChat(nextScriptId, responseType, dialogType, npcTalk.ContentIndex, npcTalk.QuestId)); // It appears if content has buttonset roulette, it's send again on every continue chat, unsure why since it doesn't break anything }