protected override async Task Handle(GameStageUser stageUser, IFieldObjUser user, IPacketReader packet) { var npc = user.Field.GetPool(FieldObjType.NPC).GetObject <IFieldObjNPC>(packet.ReadInt()); if (npc == null) { return; } if (!user.Watching.Any(w => w == npc.FieldSplit)) { return; } var scriptName = npc.Info.Script; if (string.IsNullOrWhiteSpace(scriptName)) { return; } try { var script = await stageUser.Stage.ScriptEngine.CreateFromFile(scriptName); var context = new ConversationContext(user); var conversation = new ScriptedConversation( context, new BasicSpeaker(context, templateID: npc.Info.ID), new BasicSpeaker(context, flags: ConversationSpeakerFlags.NPCReplacedByUser), script ); await user.Converse(conversation); } catch (FileNotFoundException) { await user.Message($"The '{scriptName}' script does not exist."); } }