Пример #1
0
 public bool CanSeeOrHear(Entity source, Entity target, out bool canHear)
 {
     var sourcePos = source.GetPosition();
     var dir = target.GetPosition() - sourcePos;
     var ray = new Ray(sourcePos, dir.normalized);
     var rayLimit = Physics.RaycastNonAlloc(ray, _rayHits, dir.magnitude, UnitCheckMask);
     _rayHits.SortByDistanceAsc(rayLimit);
     canHear = true;
     for (int i = 0; i < rayLimit; i++) {
         if (_rayHits[i].transform.CompareTag(StringConst.TagEnvironment)) {
             canHear = false;
             continue;
         }
         var entity = MonoBehaviourToEntity.GetEntity(_rayHits[i].collider);
         if (entity == null) {
             continue;
         }
         if (entity == source) {
             continue;
         }
         if (entity == target) {
             return true;
         }
     }
     return true;
 }
Пример #2
0
 public Entity GetTarget(Entity source, Vector3 dir, float range, TargetType targeting)
 {
     //if (GameOptions.ArenaCombat) {
     //    return FindArenaActorInRange(source, range, targeting);
     //}
     var sourcePos = source.GetPosition();
     var ray = new Ray(sourcePos, dir);
     var rayLimit = Physics.RaycastNonAlloc(ray, _rayHits, range, UnitCheckMask);
     _rayHits.SortByDistanceAsc(rayLimit);
     for (int i = 0; i < rayLimit; i++) {
         if (_rayHits[i].transform.CompareTag(StringConst.TagEnvironment)) {
             return null;
         }
         var entity = MonoBehaviourToEntity.GetEntity(_rayHits[i].collider);
         if (entity == null) {
             continue;
         }
         if (entity == source) {
             continue;
         }
         var target = EntityController.GetEntity(entity);
         if (targeting == TargetType.Enemy && !World.Get<FactionSystem>().AreEnemies(source, target)) {
             continue;
         }
         if (targeting == TargetType.Friendly && !World.Get<FactionSystem>().AreFriends(source, target)) {
             continue;
         }
         return target;
     }
     return null;
 }
Пример #3
0
 //private Entity FindArenaActorInRange(Entity source, float range, TargetType targeting) {
 //    List<Entity> actorList = new List<Entity>();
 //    switch (targeting) {
 //        case TargetType.Self:
 //            return source;
 //        case TargetType.Friendly:
 //            World.Get<FactionSystem>().FillFactionFriendsList(actorList, source.Get<FactionComponent>().Faction);
 //            break;
 //        default:
 //            World.Get<FactionSystem>().FillFactionEnemiesList(actorList, source.Get<FactionComponent>().Faction);
 //            break;
 //    }
 //    actorList.Shuffle();
 //    var ranksCanBust = (int) range;
 //    for (int i = 0; i < actorList.Count; i++) {
 //        if (actorList[i].PositionRank <= ranksCanBust) {
 //            return actorList[i];
 //        }
 //    }
 //    return null;
 //}
 private bool CanSeeTarget(int rayLimit, Entity source, Entity target)
 {
     _rayHits.SortByDistanceAsc(rayLimit);
     for (int i = 0; i < rayLimit; i++) {
         if (_rayHits[i].transform.CompareTag(StringConst.TagEnvironment)) {
             return false;
         }
         var colliderEntity = MonoBehaviourToEntity.GetEntity(_rayHits[i].collider);
         if (colliderEntity == null || colliderEntity == source) {
             continue;
         }
         if (colliderEntity == target) {
             return true;
         }
         if (World.Get<FactionSystem>().AreEnemies(colliderEntity, source)) {
             return false;
         }
     }
     return true;
 }
Пример #4
0
        void Update()
        {
            if (!Game.GameActive)
            {
                return;
            }
            //if (_debug) {
            //    DebugText.UpdatePermText("World Control", "Game Not Active");
            //}
            //if (GenericDraggableController.Dragging) {
            //    if (_debug) {
            //        DebugText.UpdatePermText("World Control", "Dragging");
            //    }
            //    return;
            //}
            _foundControl = false;
            //_eventData.position = Input.mousePosition;
            //EventSystem.current.RaycastAll(_eventData, _result);
            if (PlayerInput.IsCursorOverUI)
            {
                SetCurrentNull();
                //if (_debug) {
                //    var go = PlayerInput.CurrentInput != null ? PlayerInput.CurrentInput.GameObjectUnderPointer() : null;
                //    DebugText.UpdatePermText("World Control", string.Format("Over UI: {0}", go != null ? go.name :
                //        EventSystem.current.currentSelectedGameObject != null ? EventSystem.current.currentSelectedGameObject.name : " null ?"));
                //}
                return;
            }
            _mouseRay = Cam.ScreenPointToRay(Input.mousePosition);
            Entity currentActor = null;
            var    cnt          = Physics.RaycastNonAlloc(_mouseRay, _hits, _currentEnemyRayDistance, _worldControlsMask);

            _hits.SortByDistanceAsc(cnt);
            for (int i = 0; i < cnt; i++)
            {
                var hit = _hits[i];
                if (!_foundControl)
                {
                    if (hit.transform.gameObject == _currentGameObject)
                    {
                        _foundControl = true;
                        continue;
                    }
                    if (hit.distance <= _currentRayDistance)
                    {
                        hit.transform.GetComponentsInChildren(_tempControls);
                        for (int j = 0; j < _tempControls.Count; j++)
                        {
                            if (_tempControls[j] == null)
                            {
                                continue;
                            }
                            if (_tempControls[j].WorldControlActive)
                            {
                                SetNewCurrent(_tempControls[j], hit.transform.gameObject);
                                _foundControl = true;
                                break;
                            }
                        }
                    }
                }
                if (currentActor == null)
                {
                    currentActor = MonoBehaviourToEntity.GetEntity(hit.collider);
                }
                if (LayerMasks.Environment.ContainsLayer(hit.transform.gameObject.layer))
                {
                    if (_debug)
                    {
                        DebugText.UpdatePermText("World Control", "Environment " + cnt);
                    }
                    break;
                }
            }

            if (currentActor != null)
            {
                if (_debug)
                {
                    DebugText.UpdatePermText("World Control", currentActor.Id.ToString());
                }
            }
            //RaycastHit hit;
            //if (Physics.Raycast(_mouseRay, out hit, _enemyDistance, _worldControlsMask)) {
            //    if (hit.transform.gameObject == _currentGameObject) {
            //        _foundControl = true;
            //    }
            //    else {
            //        if (hit.distance <= _rayDistance) {
            //            var newCurrent = hit.transform.GetComponent<IWorldControl>();
            //            if (newCurrent != null) {
            //                SetNewCurrent(newCurrent, hit.transform.gameObject);
            //                _foundControl = true;
            //            }
            //        }
            //        else {
            //            if (currentActor == null) {
            //                Actor.Actors.TryGetValue(hit.collider, out currentActor);
            //            }
            //        }
            //    }
            //}
            UICenterTarget.SetTargetActor(currentActor.GetNode <VisibleNode>());
            if (!_foundControl || currentActor != null)
            {
                SetCurrentNull();
            }
            if (_debug)
            {
                DebugText.UpdatePermText("World Control", string.Format("Current: {0}", _currentGameObject != null ? _currentGameObject.name : "None"));
            }
            //if (_current == null && AlternativeUse == null) {
            //    var wasActive = GenericDraggableController.HasTarget;
            //    if (GenericDraggableController.main.CanDrag()) {
            //        UICenterTarget.SetText("Drag");
            //    }
            //    else if (wasActive){
            //        UICenterTarget.Clear();
            //    }
            //}
            //else {
            //    GenericDraggableController.ClearTarget();
            //}
        }