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(); } }
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); } } }
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 } }
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())); }
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 }
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; } } } } }
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); } } }