Пример #1
0
        private void ResetSpeaker()
        {
            if (speaker == null)
            {
                return;
            }
            speaker.CampaignInteractionType = CampaignMode.InteractionType.None;
            speaker.ActiveConversation      = null;
            speaker.SetCustomInteract(null, null);
#if SERVER
            GameMain.NetworkMember.CreateEntityEvent(speaker, new object[] { NetEntityEvent.Type.AssignCampaignInteraction });
#endif
            var humanAI = speaker.AIController as HumanAIController;
            if (humanAI != null && !speaker.IsDead && !speaker.Removed)
            {
                humanAI.ClearForcedOrder();
                if (prevIdleObjective != null)
                {
                    humanAI.ObjectiveManager.AddObjective(prevIdleObjective);
                }
                if (prevGotoObjective != null)
                {
                    humanAI.ObjectiveManager.AddObjective(prevGotoObjective);
                }
                humanAI.ObjectiveManager.SortObjectives();
            }
        }
Пример #2
0
        private void ResetSpeaker()
        {
            if (speaker == null)
            {
                return;
            }
            speaker.CampaignInteractionType = CampaignMode.InteractionType.None;
            speaker.SetCustomInteract(null, null);
#if SERVER
            GameMain.NetworkMember.CreateEntityEvent(speaker, new object[] { NetEntityEvent.Type.AssignCampaignInteraction });
#endif
            var humanAI = speaker.AIController as HumanAIController;
            if (humanAI != null && !speaker.IsDead && !speaker.Removed)
            {
                if (prevSpeakerOrder != null)
                {
                    humanAI.SetOrder(prevSpeakerOrder.Value.Order, prevSpeakerOrder.Value.OrderOption, orderGiver: null, speak: false);
                }
                else
                {
                    humanAI.SetOrder(null, string.Empty, orderGiver: null, speak: false);
                }
                if (prevIdleObjective != null)
                {
                    humanAI.ObjectiveManager.AddObjective(prevIdleObjective);
                }
                if (prevGotoObjective != null)
                {
                    humanAI.ObjectiveManager.AddObjective(prevGotoObjective);
                }
            }
        }
Пример #3
0
        private void TryStartConversation(Character speaker, Character targetCharacter = null)
        {
            IEnumerable <Entity> targets = Enumerable.Empty <Entity>();

            if (!string.IsNullOrEmpty(TargetTag))
            {
                targets = ParentEvent.GetTargets(TargetTag).Where(e => IsValidTarget(e));
                if (!targets.Any() || IsBlockedByAnotherConversation(targets))
                {
                    return;
                }
            }

            if (speaker?.AIController is HumanAIController humanAI)
            {
                prevIdleObjective = humanAI.ObjectiveManager.GetObjective <AIObjectiveIdle>();
                prevGotoObjective = humanAI.ObjectiveManager.GetObjective <AIObjectiveGoTo>();
                humanAI.SetForcedOrder(
                    Order.PrefabList.Find(o => o.Identifier.Equals("wait", StringComparison.OrdinalIgnoreCase)),
                    option: string.Empty, orderGiver: null);
                if (targets.Any())
                {
                    Entity closestTarget = null;
                    float  closestDist   = float.MaxValue;
                    foreach (Entity entity in targets)
                    {
                        float dist = Vector2.DistanceSquared(entity.WorldPosition, speaker.WorldPosition);
                        if (dist < closestDist)
                        {
                            closestTarget = entity;
                            closestDist   = dist;
                        }
                    }
                    if (closestTarget != null)
                    {
                        humanAI.FaceTarget(closestTarget);
                    }
                }
            }

            if (targetCharacter != null && !string.IsNullOrWhiteSpace(InvokerTag))
            {
                ParentEvent.AddTarget(InvokerTag, targetCharacter);
            }

            ShowDialog(speaker, targetCharacter);

            dialogOpened = true;
            if (speaker != null)
            {
                speaker.CampaignInteractionType = CampaignMode.InteractionType.None;
                speaker.SetCustomInteract(null, null);
#if SERVER
                GameMain.NetworkMember.CreateEntityEvent(speaker, new object[] { NetEntityEvent.Type.AssignCampaignInteraction });
#endif
            }
        }
Пример #4
0
 protected void InitializeWatchman(Character character)
 {
     character.CharacterHealth.UseHealthWindow = false;
     character.CharacterHealth.Unkillable      = true;
     character.CanInventoryBeAccessed          = false;
     character.CanBeDragged = false;
     character.TeamID       = Character.TeamType.FriendlyNPC;
     character.SetCustomInteract(
         WatchmanInteract,
         hudText: TextManager.Get("TalkHint").Replace("[key]", GameMain.Config.KeyBind(InputType.Select).ToString()));
 }
Пример #5
0
        protected void InitializeWatchman(Character character)
        {
            character.CharacterHealth.UseHealthWindow = false;
            character.CharacterHealth.Unkillable      = true;
            character.CanInventoryBeAccessed          = false;
            character.CanBeDragged = false;
            character.TeamID       = Character.TeamType.FriendlyNPC;
            character.SetCustomInteract(
                WatchmanInteract,
#if CLIENT
                hudText: TextManager.GetWithVariable("TalkHint", "[key]", GameMain.Config.KeyBindText(InputType.Select)));
#else
                hudText : TextManager.Get("TalkHint"));
#endif
        }
Пример #6
0
        public override void Update(float deltaTime)
        {
            if (isFinished)
            {
                return;
            }

            isRunning = true;

            var targets1 = ParentEvent.GetTargets(Target1Tag);

            if (!targets1.Any())
            {
                return;
            }

            foreach (Entity e1 in targets1)
            {
                if (DisableInCombat && IsInCombat(e1))
                {
                    continue;
                }
                if (DisableIfTargetIncapacitated && e1 is Character character1 && (character1.IsDead || character1.IsIncapacitated))
                {
                    continue;
                }
                if (!string.IsNullOrEmpty(TargetModuleType))
                {
                    if (IsCloseEnoughToHull(e1, out Hull hull))
                    {
                        Trigger(e1, hull);
                        return;
                    }
                    continue;
                }

                var targets2 = ParentEvent.GetTargets(Target2Tag);

                foreach (Entity e2 in targets2)
                {
                    if (e1 == e2)
                    {
                        continue;
                    }
                    if (DisableInCombat && IsInCombat(e2))
                    {
                        continue;
                    }
                    if (DisableIfTargetIncapacitated && e2 is Character character2 && (character2.IsDead || character2.IsIncapacitated))
                    {
                        continue;
                    }

                    if (WaitForInteraction)
                    {
                        Character player = null;
                        Character npc    = null;
                        Item      item   = null;
                        npcOrItem?.TryGet(out npc);
                        npcOrItem?.TryGet(out item);
                        if (e1 is Character char1)
                        {
                            if (char1.IsBot)
                            {
                                npc ??= char1;
                            }
                            else
                            {
                                player = char1;
                            }
                        }
                        else
                        {
                            item ??= e1 as Item;
                        }
                        if (e2 is Character char2)
                        {
                            if (char2.IsBot)
                            {
                                npc ??= char2;
                            }
                            else
                            {
                                player = char2;
                            }
                        }
                        else
                        {
                            item ??= e2 as Item;
                        }

                        if (player != null)
                        {
                            if (npc != null)
                            {
                                if (npc.CampaignInteractionType != CampaignMode.InteractionType.Examine)
                                {
                                    npcOrItem = npc;
                                    npc.CampaignInteractionType = CampaignMode.InteractionType.Examine;
                                    npc.RequireConsciousnessForCustomInteract = false;
#if CLIENT
                                    npc.SetCustomInteract(
                                        (speaker, player) => { if (e1 == speaker)
                                                               {
                                                                   Trigger(speaker, player);
                                                               }
                                                               else
                                                               {
                                                                   Trigger(player, speaker);
                                                               } },
                                        TextManager.GetWithVariable("CampaignInteraction.Examine", "[key]", GameMain.Config.KeyBindText(InputType.Use)));
#else
                                    npc.SetCustomInteract(
                                        (speaker, player) => { if (e1 == speaker)
                                                               {
                                                                   Trigger(speaker, player);
                                                               }
                                                               else
                                                               {
                                                                   Trigger(player, speaker);
                                                               } },
                                        TextManager.Get("CampaignInteraction.Talk"));
                                    GameMain.NetworkMember.CreateEntityEvent(npc, new object[] { NetEntityEvent.Type.AssignCampaignInteraction });
#endif
                                }

                                return;
                            }
                            else if (item != null)
                            {
                                npcOrItem = item;
                                item.CampaignInteractionType = CampaignMode.InteractionType.Examine;
                                if (player.SelectedConstruction == item ||
                                    player.Inventory != null && player.Inventory.Contains(item) ||
                                    (player.FocusedItem == item && player.IsKeyHit(InputType.Use)))
                                {
                                    Trigger(e1, e2);
                                    return;
                                }
                            }
                        }
                    }
                    else
                    {
                        Vector2 pos1 = e1.WorldPosition;
                        Vector2 pos2 = e2.WorldPosition;
                        distance = Vector2.Distance(pos1, pos2);
                        if (((e1 is MapEntity m1) && Submarine.RectContains(m1.WorldRect, pos2)) ||
                            ((e2 is MapEntity m2) && Submarine.RectContains(m2.WorldRect, pos1)) ||
                            Vector2.DistanceSquared(pos1, pos2) < Radius * Radius)
                        {
                            Trigger(e1, e2);
                            return;
                        }
                    }
                }
            }
        }
Пример #7
0
        public override void Update(float deltaTime)
        {
            lastActiveTime = Timing.TotalTime;
            if (interrupt)
            {
                Interrupted?.Update(deltaTime);
            }
            else if (selectedOption < 0)
            {
                if (dialogOpened)
                {
#if CLIENT
                    if (GUIMessageBox.MessageBoxes.Any(mb => mb.UserData as string == "ConversationAction"))
                    {
                        Character.DisableControls = true;
                    }
                    else
                    {
                        Reset();
                    }
#endif
                    if (ShouldInterrupt())
                    {
                        ResetSpeaker();
                        interrupt = true;
                    }
                    return;
                }

                if (!string.IsNullOrEmpty(SpeakerTag))
                {
                    if (speaker != null && !speaker.Removed && speaker.CampaignInteractionType == CampaignMode.InteractionType.Talk && speaker.ActiveConversation?.ParentEvent != this.ParentEvent)
                    {
                        return;
                    }
                    speaker = ParentEvent.GetTargets(SpeakerTag).FirstOrDefault(e => e is Character) as Character;
                    if (speaker == null || speaker.Removed)
                    {
                        return;
                    }
                    //some conversation already assigned to the speaker, wait for it to be removed
                    if (speaker.CampaignInteractionType == CampaignMode.InteractionType.Talk && speaker.ActiveConversation?.ParentEvent != this.ParentEvent)
                    {
                        return;
                    }
                    else if (!WaitForInteraction)
                    {
                        TryStartConversation(speaker);
                    }
                    else if (speaker.ActiveConversation != this)
                    {
                        speaker.CampaignInteractionType = CampaignMode.InteractionType.Talk;
                        speaker.ActiveConversation      = this;
#if CLIENT
                        speaker.SetCustomInteract(
                            TryStartConversation,
                            TextManager.GetWithVariable("CampaignInteraction.Talk", "[key]", GameMain.Config.KeyBindText(InputType.Use)));
#else
                        speaker.SetCustomInteract(
                            TryStartConversation,
                            TextManager.Get("CampaignInteraction.Talk"));
                        GameMain.NetworkMember.CreateEntityEvent(speaker, new object[] { NetEntityEvent.Type.AssignCampaignInteraction });
#endif
                    }
                    return;
                }
                else
                {
                    TryStartConversation(null);
                }
            }
            else
            {
                if (ShouldInterrupt())
                {
                    ResetSpeaker();
                    interrupt = true;
                }
                else if (Options.Any())
                {
                    Options[selectedOption].Update(deltaTime);
                }
            }
        }