Beispiel #1
0
 internal void Broadcast(RSTriggerId inTriggerId, RSValue inArgument, bool inbForce)
 {
     foreach (var entity in Entities.EntitiesForTrigger(inTriggerId))
     {
         TriggerRS(entity, inTriggerId, inArgument, inbForce);
     }
 }
        static private void ValidateValue(RSValue inValue, RSTypeInfo inExpectedType, RSValidationFlags inFlags, RSValidationState ioState, RSValidationContext inContext)
        {
            Type systemType = inExpectedType.SystemType;

            if (systemType.IsEnum)
            {
                try
                {
                    Enum currentValue = inValue.AsEnum();
                }
                catch (Exception e)
                {
                    Debug.LogException(e);
                    ioState.Error("Enum {0} cannot be represented as type {1}", inValue, inExpectedType);
                }
                return;
            }

            if (inExpectedType == RSBuiltInTypes.Entity)
            {
                EntityScopeData scope = inValue.AsEntity;
                ValidateEntityScope(scope, inFlags.ForEntityValue(), ioState, inContext);
            }
            else if (inExpectedType == RSBuiltInTypes.GroupId)
            {
                RSGroupId group = inValue.AsGroupId;
                ValidateGroupId(group, inFlags, ioState, inContext);
            }
            else if (inExpectedType == RSBuiltInTypes.TriggerId)
            {
                RSTriggerId triggerId = inValue.AsTriggerId;
                ValidateTriggerId(triggerId, inFlags, ioState, inContext);
            }
        }
Beispiel #3
0
        /// <summary>
        /// A trigger selector for a specific entity.
        /// </summary>
        static public RSTriggerId TriggerSelector(GUIContent inLabel, RSTriggerId inCurrentId, RSLibrary inLibrary)
        {
            RSEditorUtility.s_TriggerElements.Clear();
            inLibrary.GetAllTriggers(RSEditorUtility.s_TriggerElements);

            int trigger = RSGUILayout.RSElementSelector(inLabel, (int)inCurrentId, RSEditorUtility.s_TriggerElements);

            return(new RSTriggerId(trigger));
        }
Beispiel #4
0
        /// <summary>
        /// A trigger selector.
        /// </summary>
        static public RSTriggerId TriggerSelector(Rect inPosition, RSTriggerId inCurrentId, RSLibrary inLibrary)
        {
            RSEditorUtility.s_TriggerElements.Clear();
            inLibrary.GetAllTriggers(RSEditorUtility.s_TriggerElements);

            int trigger = RSGUI.RSElementSelector(inPosition, (int)inCurrentId, RSEditorUtility.s_TriggerElements);

            return(new RSTriggerId(trigger));
        }
Beispiel #5
0
        /// <summary>
        /// A trigger selector.
        /// </summary>
        static public RSTriggerId TriggerSelector(Rect inPosition, RSTriggerId inCurrentId, RSTypeInfo inParameterType, RSLibrary inLibrary)
        {
            RSEditorUtility.s_TriggerElements.Clear();
            inLibrary.GetAllTriggers(RSEditorUtility.s_TriggerElements, inParameterType ?? RSBuiltInTypes.Void);

            int trigger = RSGUI.RSElementSelector(inPosition, (int)inCurrentId, RSEditorUtility.s_TriggerElements);

            return(new RSTriggerId(trigger));
        }
Beispiel #6
0
        static public void Trigger(this IRSRuntimeEntity inEntity, RSTriggerId inTriggerId, object inArgument = null, bool inbForce = false)
        {
            IRSRuntimeEntityMgr mgr = inEntity?.Manager;

            if (mgr != null && mgr.IsReady() && mgr.Context != null)
            {
                mgr.Context.Trigger(inEntity, inTriggerId, inArgument, inbForce);
            }
        }
Beispiel #7
0
        public void Broadcast(RSTriggerId inTriggerId, object inArgument, bool inbForce)
        {
            if (m_Destroyed)
            {
                return;
            }

            Broadcast(inTriggerId, RSInterop.ToRSValue(inArgument), inbForce);
        }
Beispiel #8
0
        public void Trigger(IRSRuntimeEntity inEntity, RSTriggerId inTriggerId, object inArgument, bool inbForce)
        {
            if (m_Destroyed)
            {
                return;
            }

            TriggerRS(inEntity, inTriggerId, RSInterop.ToRSValue(inArgument), inbForce);
        }
Beispiel #9
0
        /// <summary>
        /// A trigger selector for a specific entity.
        /// </summary>
        static public RSTriggerId TriggerSelector(RSTriggerId inCurrentId, IRSEntity inEntity, RSTypeInfo inParameterType, RSLibrary inLibrary)
        {
            RSEditorUtility.s_TriggerElements.Clear();
            inLibrary.GetAllTriggersForEntity(inEntity, RSEditorUtility.s_TriggerElements, inParameterType ?? RSBuiltInTypes.Void);
            inLibrary.GetAllGlobalTriggers(RSEditorUtility.s_TriggerElements, inParameterType ?? RSBuiltInTypes.Void);

            int trigger = RSGUILayout.RSElementSelector((int)inCurrentId, RSEditorUtility.s_TriggerElements);

            return(new RSTriggerId(trigger));
        }
Beispiel #10
0
        private HashSet <T> GetHashSet(RSTriggerId inTriggerId, bool inbCreate = true)
        {
            HashSet <T> set;

            if (!m_Map.TryGetValue((int)inTriggerId, out set) && inbCreate)
            {
                set = new HashSet <T>(EntityEqualityComparer <T> .Instance);
                m_Map.Add((int)inTriggerId, set);
            }
            return(set);
        }
Beispiel #11
0
        public RSTriggerInfo(RSTriggerAttribute inAttribute, FieldInfo inFieldInfo) : base(inAttribute, inFieldInfo)
        {
            TriggerId = new RSTriggerId(IdHash);

            if (inAttribute.ParameterType != null)
            {
                ParameterType = new RSParameterInfo(inAttribute.ParameterName, inAttribute.ParameterDescription, inAttribute.ParameterType, false);
            }

            OwnerType = inAttribute.Global ? null : (inAttribute.OwnerType ?? OwnerType);
        }
Beispiel #12
0
        static private RSTriggerInfo ValidateTriggerId(RSTriggerId inTriggerId, RSValidationFlags inFlags, RSValidationState ioState, RSValidationContext inContext)
        {
            RSTypeInfo restrictTriggerType = inContext.Parameter?.TriggerParameterType;

            if (inTriggerId == RSTriggerId.Null)
            {
                if (restrictTriggerType != null)
                {
                    ioState.Error("Null trigger id provided - require trigger with parameter type {0}", restrictTriggerType);
                }
                else
                {
                    ioState.Warn("Null trigger provided");
                }
                return(null);
            }
            else
            {
                RSTriggerInfo triggerInfo = inContext.Library.GetTrigger(inTriggerId);
                if (triggerInfo == null)
                {
                    ioState.Error("Trigger {0} does not exist", inTriggerId);
                }
                else
                {
                    if (restrictTriggerType != null)
                    {
                        if (restrictTriggerType == RSBuiltInTypes.Void)
                        {
                            if (triggerInfo.ParameterType != null)
                            {
                                ioState.Error("Trigger with no parameter required, but trigger {0} with parameter {1} provided", triggerInfo.Name, triggerInfo.ParameterType.Type);
                            }
                        }
                        else
                        {
                            if (triggerInfo.ParameterType == null)
                            {
                                ioState.Error("Trigger with parameter {0} required, but trigger {1} with no parameter provided", restrictTriggerType, triggerInfo.Name);
                            }
                            else if (!restrictTriggerType.CanConvert(triggerInfo.ParameterType.Type))
                            {
                                ioState.Error("Trigger with parameter {0} required, but trigger {1} with incompatible parameter {2} provided", restrictTriggerType, triggerInfo.Name, triggerInfo.ParameterType.Type);
                            }
                        }
                    }
                }
                return(triggerInfo);
            }
        }
Beispiel #13
0
        internal void TriggerRS(IRSRuntimeEntity inEntity, RSTriggerId inTriggerId, RSValue inArgument, bool inbForce)
        {
            if (!inbForce && inEntity.IsLocked())
            {
                return;
            }

            ExecutionScope scope = CreateScope(inEntity, inArgument, 0);

            using (new SharedRef <ExecutionScope>(scope))
            {
                inEntity?.RuleTable?.EvaluateTrigger(inTriggerId, scope);
            }
        }
Beispiel #14
0
        /// <summary>
        /// Finds the trigger metadata with the given id.
        /// </summary>
        public RSTriggerInfo GetTrigger(RSTriggerId inId)
        {
            if (inId == RSTriggerId.Null)
            {
                return(null);
            }

            RSTriggerInfo meta;

            if (!m_Triggers.TryGetValue((int)inId, out meta))
            {
                Log.Error("[RSMetaDatabase] No trigger type with id {0} registered", inId);
            }
            return(meta);
        }
Beispiel #15
0
        static public bool IsListeningForTrigger(this IRSRuntimeEntity inEntity, RSTriggerId inTriggerId)
        {
            if (inTriggerId == RSTriggerId.Null)
            {
                return(false);
            }

            RSTriggerId[] triggers = (inEntity.RuleTable?.Data?.UniqueTriggers);
            if (triggers != null)
            {
                return(Array.IndexOf(triggers, inTriggerId) >= 0);
            }

            return(false);
        }
Beispiel #16
0
        /// <summary>
        /// Outputs all entities listening for the given trigger to a collection.
        /// </summary>
        public int GetListeners(RSTriggerId inTrigger, ICollection <T> outCollection)
        {
            HashSet <T> set = GetHashSet(inTrigger, false);

            if (set == null)
            {
                return(0);
            }

            foreach (var entity in set)
            {
                outCollection.Add(entity);
            }

            return(set.Count);
        }
Beispiel #17
0
 static private void BroadcastTriggerWithString(IScriptContext inContext, [RSParameter("Trigger", TriggerParameterType = typeof(string))] RSTriggerId inTrigger, [RSParameter("Trigger Parameter")] string inArgument)
 {
     inContext?.Broadcast(inTrigger, inArgument);
 }
Beispiel #18
0
 static private void BroadcastTrigger(IScriptContext inContext, [RSParameter("Trigger", TriggerParameterType = typeof(void))] RSTriggerId inTrigger)
 {
     inContext?.Broadcast(inTrigger);
 }
Beispiel #19
0
 static private void DispatchTriggerWithString(this IRSRuntimeEntity inEntity, IScriptContext inContext, [RSParameter("Trigger", TriggerParameterType = typeof(string))] RSTriggerId inTrigger, [RSParameter("Trigger Parameter")] string inArgument)
 {
     inContext?.Trigger(inEntity, inTrigger, inArgument);
 }
Beispiel #20
0
 static private void DispatchTrigger(this IRSRuntimeEntity inEntity, IScriptContext inContext, [RSParameter("Trigger", TriggerParameterType = typeof(void))] RSTriggerId inTrigger)
 {
     inContext?.Trigger(inEntity, inTrigger);
 }
Beispiel #21
0
        internal void EvaluateTrigger(RSTriggerId inTriggerId, ExecutionScope inScope)
        {
            if (!m_Entity.IsAlive())
            {
                return;
            }

            if (OnTrigger != null)
            {
                object arg = RSInterop.ToObject(inScope.Argument, inScope);
                OnTrigger.Invoke(inTriggerId, arg);
            }

            RSRuleData[] rules = m_Table?.Rules;
            int          ruleCount;

            if (rules == null || (ruleCount = rules.Length) <= 0)
            {
                return;
            }

            using (PooledSet <string> triggeredGroups = PooledSet <string> .Alloc())
            {
                for (int i = 0; i < ruleCount; ++i)
                {
                    RSRuleData rule = rules[i];
                    if (rule.TriggerId != inTriggerId)
                    {
                        continue;
                    }

                    if (m_States[i].HasFlag(RuleState.Disabled))
                    {
                        continue;
                    }

                    if (rule.DontInterrupt && m_Routines[i])
                    {
                        continue;
                    }

                    if (!inScope.EvaluateConditions(rule.Conditions, rule.ConditionSubset))
                    {
                        continue;
                    }

                    if (!string.IsNullOrEmpty(rule.RoutineGroup))
                    {
                        if (!triggeredGroups.Add(rule.RoutineGroup))
                        {
                            continue;
                        }

                        StopRuleGroup(rule.RoutineGroup);
                    }

                    if (rule.OnlyOnce)
                    {
                        m_States[i] |= RuleState.Disabled;
                    }

                    if (rule.Actions != null)
                    {
                        ExecutionScope scope = inScope;
                        scope.m_Environment.CloneScopeIfNecessary(scope, rule.Flags, out scope);

                        m_Routines[i].Replace(m_Entity.ProxyObject, scope.PerformActions(rule.Actions))
                        .ExecuteWhileDisabled().SetPhase(m_Entity.ExecutionPhase)
                        .TryManuallyUpdate(0);
                    }
                }
            }
        }
Beispiel #22
0
 /// <summary>
 /// Registers the given entity as a listener on the given trigger id.
 /// </summary>
 public void Register(T inEntity, RSTriggerId inTrigger)
 {
     GetHashSet(inTrigger).Add(inEntity);
 }
Beispiel #23
0
        static private RSValue DoRSValueField(GUIContent inLabel, RSValue inValue, RSTypeInfo inExpectedType, RSValidationFlags inFlags, RSValidationContext inContext)
        {
            Type systemType = inExpectedType.SystemType;

            if (systemType.IsEnum)
            {
                Enum currentValue;
                try
                {
                    currentValue = inValue.AsEnum();
                }
                catch (Exception e)
                {
                    Debug.LogException(e);
                    currentValue = inExpectedType.DefaultValue.AsEnum();
                }
                Enum nextValue = EnumGUILayout.EnumField(inLabel, currentValue);
                return(RSValue.FromEnum(nextValue));
            }

            if (inExpectedType == RSBuiltInTypes.Int)
            {
                int currentValue = inValue.AsInt;
                int nextValue    = EditorGUILayout.DelayedIntField(inLabel, currentValue);
                return(RSValue.FromInt(nextValue));
            }
            else if (inExpectedType == RSBuiltInTypes.Float)
            {
                float currentValue = inValue.AsFloat;
                float nextValue    = EditorGUILayout.DelayedFloatField(inLabel, currentValue);
                return(RSValue.FromFloat(nextValue));
            }
            else if (inExpectedType == RSBuiltInTypes.Bool)
            {
                bool currentValue = inValue.AsBool;
                bool nextValue    = EditorGUILayout.Toggle(inLabel, currentValue);
                return(RSValue.FromBool(nextValue));
            }
            else if (inExpectedType == RSBuiltInTypes.Color)
            {
                Color currentValue = inValue.AsColor;
                Color nextValue    = EditorGUILayout.ColorField(inLabel, currentValue);
                return(RSValue.FromColor(nextValue));
            }
            else if (inExpectedType == RSBuiltInTypes.String)
            {
                string currentValue = inValue.AsString;
                string nextValue    = EditorGUILayout.TextField(inLabel, currentValue);
                return(RSValue.FromString(nextValue));
            }
            else if (inExpectedType == RSBuiltInTypes.Vector2)
            {
                Vector2 currentValue = inValue.AsVector2;
                Vector2 nextValue    = EditorGUILayout.Vector2Field(inLabel, currentValue);
                return(RSValue.FromVector2(nextValue));
            }
            else if (inExpectedType == RSBuiltInTypes.Vector3)
            {
                Vector3 currentValue = inValue.AsVector3;
                Vector3 nextValue    = EditorGUILayout.Vector3Field(inLabel, currentValue);
                return(RSValue.FromVector3(nextValue));
            }
            else if (inExpectedType == RSBuiltInTypes.Vector4)
            {
                Vector4 currentValue = inValue.AsVector4;
                Vector4 nextValue    = EditorGUILayout.Vector4Field(inLabel, currentValue);
                return(RSValue.FromVector4(nextValue));
            }
            else if (inExpectedType == RSBuiltInTypes.Entity)
            {
                EntityScopeData currentValue = inValue.AsEntity;
                EntityScopeData nextValue    = EntityScopeField(inLabel, currentValue, inFlags.ForEntityValue(), inContext);
                return(RSValue.FromEntity(nextValue));
            }
            else if (inExpectedType == RSBuiltInTypes.GroupId)
            {
                RSGroupId currentValue = inValue.AsGroupId;
                RSGroupId nextValue    = LibraryGUILayout.GroupSelector(inLabel, currentValue, inContext.Library);
                return(RSValue.FromGroupId(nextValue));
            }
            else if (inExpectedType == RSBuiltInTypes.TriggerId)
            {
                RSTriggerId currentValue        = inValue.AsTriggerId;
                RSTypeInfo  restrictTriggerType = inContext.Parameter?.TriggerParameterType;
                RSTriggerId nextValue;
                if (restrictTriggerType != null)
                {
                    nextValue = LibraryGUILayout.TriggerSelector(inLabel, currentValue, restrictTriggerType, inContext.Library);
                }
                else
                {
                    nextValue = LibraryGUILayout.TriggerSelector(inLabel, currentValue, inContext.Library);
                }
                return(RSValue.FromTriggerId(nextValue));
            }
            else
            {
                EditorGUILayout.HelpBox(string.Format("Unable to display editor for type {0}", inExpectedType), MessageType.Error);
            }

            return(inValue);
        }
Beispiel #24
0
 /// <summary>
 /// Deregisters the given entity as a listener on the given trigger id.
 /// </summary>
 public void Deregister(T inEntity, RSTriggerId inTrigger)
 {
     GetHashSet(inTrigger, false)?.Remove(inEntity);
 }
Beispiel #25
0
        /// <summary>
        /// A trigger selector for a specific entity.
        /// </summary>
        static public RSTriggerId TriggerSelector(Rect inPosition, GUIContent inLabel, RSTriggerId inCurrentId, IRSEntity inEntity, RSLibrary inLibrary)
        {
            RSEditorUtility.s_TriggerElements.Clear();
            inLibrary.GetAllTriggersForEntity(inEntity, RSEditorUtility.s_TriggerElements);
            inLibrary.GetAllGlobalTriggers(RSEditorUtility.s_TriggerElements);

            int trigger = RSGUI.RSElementSelector(inPosition, inLabel, (int)inCurrentId, RSEditorUtility.s_TriggerElements);

            return(new RSTriggerId(trigger));
        }
Beispiel #26
0
 void IScriptContext.Trigger(IRSRuntimeEntity inEntity, RSTriggerId inTriggerId, object inArgument, bool inbForce)
 {
     m_Environment.Trigger(inEntity, inTriggerId, RSInterop.ToRSValue(inArgument), inbForce);
 }
Beispiel #27
0
 void IScriptContext.Broadcast(RSTriggerId inTriggerId, object inArgument, bool inbForce)
 {
     m_Environment.Broadcast(inTriggerId, RSInterop.ToRSValue(inArgument), inbForce);
 }