public override Vector3Int GetJobLocation()
        {
            var currentPos = usedNPC.Position;

            if (_playerState.CallToArmsEnabled && _weapon != null)
            {
                _target = MonsterTracker.Find(currentPos, _weapon.range, _weapon.shootDamage);

                if (_target != null)
                {
                    return(currentPos);
                }

                _target = MonsterTracker.Find(currentPos, CALL_RAD, _weapon.shootDamage);

                if (_target != null)
                {
                    var ranged = _weapon.range - 5;

                    if (ranged < 0)
                    {
                        ranged = 1;
                    }

                    position = new Vector3Int(_target.Position).Add(ranged, 0, ranged);
                    position = AIManager.ClosestPosition(position, currentPos);

                    if (!AIManager.CanStandAt(position))
                    {
                        _tmpVals.Set(COOLDOWN_KEY, _weapon.cooldownMissingItem);
                        _waitingFor++;
                    }
                    else
                    {
                        return(position);
                    }
                }
                else
                {
                    _tmpVals.Set(COOLDOWN_KEY, _weapon.cooldownMissingItem);
                    _waitingFor++;
                }
            }

            if (_waitingFor > 10)
            {
                var banner = BannerTracker.GetClosest(usedNPC.Colony.Owner, currentPos);

                if (banner != null)
                {
                    return(banner.KeyLocation);
                }
            }

            return(currentPos);
        }
Exemple #2
0
        public static Vector3Int GetClosestPositionWithinY(this Vector3Int goalPosition, Vector3Int currentPosition,
                                                           int minMaxY)
        {
            var pos = AIManager.ClosestPosition(goalPosition, currentPosition);

            if (pos == Vector3Int.invalidPos)
            {
                var y    = -1;
                var negY = minMaxY * -1;

                while (pos == Vector3Int.invalidPos)
                {
                    pos = AIManager.ClosestPosition(goalPosition.Add(0, y, 0), currentPosition);

                    if (y > 0)
                    {
                        y++;

                        if (y > minMaxY)
                        {
                            break;
                        }
                    }
                    else
                    {
                        y--;

                        if (y < negY)
                        {
                            y = 1;
                        }
                    }
                }
            }

            return(pos);
        }