// Sets m_closestTarget to reachable unobstructed target closest to center of view void FindInteractableNearCenter() { if (m_activeInteractables != null) { for (int i = 0; i < m_activeInteractables.Length; i++) { InteractableTarget[] targets = m_activeInteractables[i].GetTargets(); for (int j = 0; j < targets.Length; j++) { // Target in front of camera? if (m_mainCam.WorldToViewportPoint(targets[j].transform.position).z > 0) { // Target within range? if (Vector3.Distance(m_player.transform.position, targets[j].transform.position) < m_range) { // Target obstructed? if (!Physics.Linecast(m_mainCam.transform.position, targets[j].transform.position, m_obstacleLayer)) { Debug.DrawLine(m_mainCam.transform.position, targets[j].transform.position, Color.red); Debug.Log(targets[j].ToString()); if (m_closestIndex == i) { m_interactableRend[i].materials[0].color = Color.red; } else { // Find the Interactables closest to camera center float distToMid = Vector2.Distance(m_mainCam.WorldToScreenPoint(targets[j].transform.position), m_mainCamCenter); m_closestDistToMid = Vector2.Distance(m_mainCam.WorldToScreenPoint(m_closestTarget.transform.position), m_mainCamCenter); if (distToMid < m_closestDistToMid) { m_closestIndex = i; m_closestTargetIndex = j; m_closestTarget = targets[j]; m_interactableRend[m_closestIndex].materials[0].color = Color.red; } else { m_interactableRend[i].materials[0].color = Color.red; } } } else { m_interactableRend[i].materials[0].color = Color.blue; } } else { m_interactableRend[i].materials[0].color = Color.yellow; } } else { m_interactableRend[i].materials[0].color = Color.white; } } } } }
// Use following functions when switching scenes void FindActiveInteractables() { m_activeInteractables = GameObject.FindObjectsOfType <Interactable>(); if (m_activeInteractables.Length > 0) { for (int i = 0; i < m_activeInteractables.Length; i++) { m_interactableRend.Add(m_activeInteractables[i].gameObject.GetComponentInParent <MeshRenderer>()); } InteractableTarget[] firstTargets = m_activeInteractables[0].GetTargets(); m_closestTarget = firstTargets[0]; } }
private async Task <bool> CombatInteract() { if (HasInteractObjects && InteractableTarget != null) { if (Core.Player.Distance(InteractableTarget.Location) > 5) { return(await CommonTasks.MoveAndStop(new MoveToParameters(InteractableTarget.Location), 3)); } if (Core.Player.Distance(InteractableTarget.Location) < 5) { InteractableTarget.Interact(); await Coroutine.Wait(10000, () => !Core.Player.IsCasting); } await Coroutine.Yield(); } return(false); }
protected override Composite CreateBehavior() { return(new PrioritySelector( CommonBehaviors.HandleLoading, new Decorator(ret => QuestLogManager.InCutscene, new ActionAlwaysSucceed() ), new Decorator(r => Request.IsOpen, new Action(r => { var items = InventoryManager.FilledInventoryAndArmory.ToArray(); for (int i = 0; i < ItemIds.Length; i++) { BagSlot item; item = items.FirstOrDefault(z => z.RawItemId == ItemIds[i] && !usedSlots.Contains(z)); if (item == null) { LogError($"We don't have any items with an id of {ItemIds[i]}."); } else { item.Handover(); usedSlots.Add(item); } } usedSlots.Clear(); Request.HandOver(); }) ), new Decorator(r => Core.Player.HasTarget && UseItem && !doneUseItem, new Action(r => { var targetNpc = GameObjectManager.GetObjectByNPCId(InteractNpcId); foreach (BagSlot slot in InventoryManager.FilledSlots) { if (slot.RawItemId == ItemIds.FirstOrDefault()) { Log($"Using {slot.EnglishName} on {targetNpc.EnglishName}."); slot.UseItem(targetNpc); } } if (Core.Player.IsCasting) { doneUseItem = true; } if (SelectYesno.IsOpen) { doneUseItem = true; } }) ), new Decorator(ret => HasInteractObjects && DutyManager.InInstance && !Core.Player.InCombat && InteractableTarget != null, new PrioritySelector( new Decorator(ret => Core.Player.Location.Distance(InteractableTarget.Location) <= 5, new Action(r => { InteractableTarget.Interact(); }) ), new Decorator(ret => Core.Player.Location.Distance(InteractableTarget.Location) > 5, CommonBehaviors.MoveAndStop(ret => InteractableTarget.Location, 3) ), new ActionAlwaysSucceed() ) ), new Decorator(ret => HasCheckpoints && DutyManager.InInstance, new PrioritySelector( new Decorator(ret => Core.Player.Location.Distance(CurrentCheckpoint) < 5, new Action(r => { Checkpoints.Remove(Checkpoints.First()); }) ), new Decorator(ret => Core.Player.Location.Distance(CurrentCheckpoint) > 5, CommonBehaviors.MoveAndStop(ret => CurrentCheckpoint, 3) ) ) ), base.CreateBehavior() )); }