public InteractorRuleObject(InteractorRuleObject _rule, bool _default) : base(_rule)
        {
            Copy(_rule);

            Enabled = true;
            Foldout = true;
            Selectors.UseDefaultPriority = _default;
        }
        public void Copy(InteractorRuleObject _object)
        {
            if (_object == null)
            {
                return;
            }

            base.Copy(_object);

            OverrideTargetMovePosition = _object.OverrideTargetMovePosition;
            OverrideInfluences         = _object.OverrideInfluences;
        }
        /// <summary>
        /// Returns the nearest rule by distance.
        /// </summary>
        /// <returns>The rule by distance.</returns>
        /// <param name="_distance">_distance.</param>
        public InteractorRuleObject GetRuleByDistance(float _distance)
        {
            InteractorRuleObject _selected = null;

            foreach (InteractorRuleObject _rule in m_Rules)
            {
                if (_distance <= _rule.Selectors.SelectionRange && _rule.Enabled)
                {
                    _selected = _rule;
                }
            }

            return(_selected);
        }
        public InteractorRuleObject GetBestInteractorRule(Vector3 _position)
        {
            InteractorRuleObject _new_rule = null;

            // if the active rule have advanced settings
            if (m_ActiveRule != null && m_ActiveRule.OverrideTargetMovePosition)
            {
                if (m_ActiveRule.BlockRuleUpdateUntilMovePositionReached)
                {
                    // if the target move position was reached, the creture needs a new rule
                    if (Target.TargetMovePositionReached(_position))
                    {
                        // if the active rule have a zero range, we select the next higher rule
                        if (m_ActiveRule.Selectors.SelectionRange == 0)
                        {
                            _new_rule = GetRuleByIndexOffset(1);
                        }

                        // if the active rule have a zero range, we select the next higher rule
                        else
                        {
                            _new_rule = GetRuleByDistance(Target.TargetDistanceTo(_position));
                        }
                    }
                }
                else
                {
                    _new_rule = GetRuleByDistance(Target.TargetDistanceTo(_position));
                }
            }

            // handle default - get rule by distance
            else
            {
                _new_rule = GetRuleByDistance(Target.TargetDistanceTo(_position));
            }

            if (m_ActiveRule != _new_rule)
            {
                m_PreviousRule = m_ActiveRule;
                m_ActiveRule   = _new_rule;
            }

            return(m_ActiveRule);
        }
        public TargetObject PrepareTarget()
        {
            if (!TargetReady())
            {
                return(null);
            }

            InteractorRuleObject _rule = m_Interactor.GetBestInteractorRule(m_Owner.transform.position);

            if (_rule == null)
            {
                m_Interactor.Target.BehaviourModeKey = m_Interactor.BehaviourModeKey;
                m_Interactor.Target.Selectors.Copy(m_Interactor.Selectors);                   // incl. default priority
            }
            else
            {
                m_Interactor.Target.BehaviourModeKey = _rule.BehaviourModeKey;
                m_Interactor.Target.Selectors.Copy(_rule.Selectors);
                m_Interactor.Target.Selectors.Priority = (_rule.UseDefaultSelectionPriority?m_Interactor.Selectors.Priority:_rule.Selectors.Priority);
            }

            if (_rule == null || _rule.OverrideTargetMovePosition == false)
            {
                m_Interactor.Target.UpdateOffset(m_Interactor.DefaultOffset);
                m_Interactor.Target.TargetStopDistance                   = m_Interactor.DefaultStopDistance;
                m_Interactor.Target.TargetRandomRange                    = m_Interactor.DefaultRandomRange;
                m_Interactor.Target.TargetSmoothingMultiplier            = m_Interactor.DefaultSmoothingMultiplier;
                m_Interactor.Target.UseUpdateOffsetOnActivateTarget      = m_Interactor.UpdateOffsetOnActivateTarget;
                m_Interactor.Target.UseUpdateOffsetOnMovePositionReached = m_Interactor.UpdateOffsetOnMovePositionReached;
            }
            else
            {
                m_Interactor.Target.UpdateOffset(_rule.Offset);
                m_Interactor.Target.TargetStopDistance                   = _rule.StopDistance;
                m_Interactor.Target.TargetRandomRange                    = _rule.RandomRange;
                m_Interactor.Target.TargetSmoothingMultiplier            = _rule.SmoothingMultiplier;
                m_Interactor.Target.UseUpdateOffsetOnActivateTarget      = _rule.UpdateOffsetOnActivateTarget;
                m_Interactor.Target.UseUpdateOffsetOnMovePositionReached = _rule.UpdateOffsetOnMovePositionReached;
            }

            return(m_Interactor.Target);
        }
        public InteractorRuleObject CreateAutoRule(string _key, float _range, int _priority)
        {
            InteractorRuleObject _rule = new InteractorRuleObject();

            _rule.Enabled    = true;
            _rule.AccessType = AccessType;
            //_rule.UseChildObjects = UseChildObjects;
            _rule.UseTargetAttributes = UseTargetAttributes;
            _rule.OverrideTargetGameObject(TargetGameObject);
            _rule.Selectors.UseDefaultPriority = false;
            _rule.Selectors.Priority           = _priority;
            _rule.Selectors.UseSelectionRange  = true;
            _rule.Selectors.SelectionRange     = _range;
            _rule.Selectors.UseSelectionAngle  = false;
            _rule.Selectors.SelectionAngle     = 0;

            _rule.Behaviour.UseAdvancedBehaviour  = false;
            _rule.Behaviour.UseSelectiveBehaviour = false;
            _rule.Behaviour.BehaviourModeKey      = "SENSE";
            _rule.Behaviour.BehaviourModeKey      = _key;

            return(_rule);
        }
 public InteractorRuleObject(InteractorRuleObject _rule) : base(_rule as TargetObject)
 {
     Copy(_rule);
 }