Exemplo n.º 1
0
 // 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;
                 }
             }
         }
     }
 }
Exemplo n.º 2
0
 // 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];
     }
 }
Exemplo n.º 3
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);
        }
Exemplo n.º 4
0
        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()
                       ));
        }