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.");
            }
        }