Example #1
0
        // Token: 0x06004D93 RID: 19859 RVA: 0x001A06F0 File Offset: 0x0019EAF0
        private void SetupTriggers()
        {
            VRC_Trigger vrc_Trigger = base.GetComponent <VRC_Trigger>();

            if (vrc_Trigger == null)
            {
                vrc_Trigger = base.gameObject.AddComponent <VRC_Trigger>();
            }
            VRC_Trigger.TriggerEvent triggerEvent = new VRC_Trigger.TriggerEvent();
            triggerEvent.TriggerType   = VRC_Trigger.TriggerType.OnPickup;
            triggerEvent.BroadcastType = VRC_EventHandler.VrcBroadcastType.AlwaysUnbuffered;
            VRC_EventHandler.VrcEvent vrcEvent = new VRC_EventHandler.VrcEvent();
            vrcEvent.EventType           = VRC_EventHandler.VrcEventType.SendRPC;
            vrcEvent.ParameterObjects    = new GameObject[1];
            vrcEvent.ParameterObjects[0] = base.gameObject;
            vrcEvent.ParameterString     = "OnPickedUp";
            vrcEvent.ParameterInt        = 0;
            vrcEvent.ParameterBytes      = VRC_Serialization.ParameterEncoder(new object[0]);
            triggerEvent.Events.Add(vrcEvent);
            vrc_Trigger.Triggers.Add(triggerEvent);
            VRC_Trigger.TriggerEvent triggerEvent2 = new VRC_Trigger.TriggerEvent();
            triggerEvent2.TriggerType   = VRC_Trigger.TriggerType.OnDrop;
            triggerEvent2.BroadcastType = VRC_EventHandler.VrcBroadcastType.AlwaysUnbuffered;
            VRC_EventHandler.VrcEvent vrcEvent2 = new VRC_EventHandler.VrcEvent();
            vrcEvent2.EventType           = VRC_EventHandler.VrcEventType.SendRPC;
            vrcEvent2.ParameterObjects    = new GameObject[1];
            vrcEvent2.ParameterObjects[0] = base.gameObject;
            vrcEvent2.ParameterString     = "OnDropped";
            vrcEvent2.ParameterInt        = 0;
            vrcEvent2.ParameterBytes      = VRC_Serialization.ParameterEncoder(new object[0]);
            triggerEvent2.Events.Add(vrcEvent2);
            vrc_Trigger.Triggers.Add(triggerEvent2);
        }
Example #2
0
    public static void AddTransferEvent(GameObject srcState, KeyCode code, GameObject endState)
    {
        if (srcState == endState)
        {
            return;
        }

        // Using 'Always' because it was annoying when trying to break with multiple people.
        VRC_Trigger.TriggerEvent triggerEvent = new VRC_Trigger.TriggerEvent();
        triggerEvent.TriggerType   = VRC_Trigger.TriggerType.OnKeyDown;
        triggerEvent.BroadcastType = VRC_EventHandler.VrcBroadcastType.Local;
        triggerEvent.Key           = code;

        // Turn on the next state
        VRC_EventHandler.VrcEvent action = new VRC_EventHandler.VrcEvent();
        action.EventType        = VRC_EventHandler.VrcEventType.SetGameObjectActive;
        action.ParameterBoolOp  = VRC_EventHandler.VrcBooleanOp.True;
        action.ParameterObjects = new GameObject[] { endState };
        triggerEvent.Events.Add(action);

        // Turn off this state
        action                  = new VRC_EventHandler.VrcEvent();
        action.EventType        = VRC_EventHandler.VrcEventType.SetGameObjectActive;
        action.ParameterBoolOp  = VRC_EventHandler.VrcBooleanOp.False;
        action.ParameterObjects = new GameObject[] { srcState };
        triggerEvent.Events.Add(action);

        // Add it to the source.
        VRC_Trigger trigger = srcState.AddComponent <VRC_Trigger>();

        trigger.Triggers.Add(triggerEvent);
    }
Example #3
0
 private void CheckForPlayerLayerOverSync(VRC_Trigger.TriggerEvent triggerEvent)
 {
     if ((triggerEvent.Layers & PLAYER_LAYER) != 0 && triggerEvent.BroadcastType.IsEveryoneBroadcastType())
     {
         this.LogWarning("Player layer Enter/Exit trigger Oversync! " + triggerEvent.GetTriggerEventAsString());
     }
 }
Example #4
0
    // Token: 0x06005AB4 RID: 23220 RVA: 0x001F9958 File Offset: 0x001F7D58
    protected override void OnNetworkReady()
    {
        base.OnNetworkReady();
        if (!VRC_EventHandler.HasEventTrigger(base.gameObject))
        {
            VRC_Trigger orAddComponent = base.gameObject.GetOrAddComponent <VRC_Trigger>();
            List <VRC_Trigger.TriggerEvent> triggers     = orAddComponent.Triggers;
            VRC_Trigger.TriggerEvent        triggerEvent = new VRC_Trigger.TriggerEvent();
            triggerEvent.BroadcastType = VRC_EventHandler.VrcBroadcastType.Local;
            triggerEvent.TriggerType   = VRC_Trigger.TriggerType.OnInteract;
            triggerEvent.Events        = (from evt in this.baseStation.ProvideEvents()
                                          where evt.Name == "UseStation"
                                          select evt).ToList <VRC_EventHandler.VrcEvent>();
            triggers.Add(triggerEvent);
        }
        else
        {
            VRC_Trigger component = base.GetComponent <VRC_Trigger>();
            if (component != null)
            {
                foreach (VRC_Trigger.TriggerEvent triggerEvent2 in from t in component.Triggers
                         where t.Events.Any((VRC_EventHandler.VrcEvent e) => e.ParameterString == "UseStation" || e.ParameterString == "ExitStation")
                         select t)
                {
                    triggerEvent2.BroadcastType = VRC_EventHandler.VrcBroadcastType.Local;
                }
            }
            VRC_UseEvents component2 = base.GetComponent <VRC_UseEvents>();
            if (component2 != null)
            {
                component2.BroadcastType = VRC_EventHandler.VrcBroadcastType.Local;
                component2.EventName     = "UseStation";
            }
        }
        Collider component3 = base.gameObject.GetComponent <Collider>();

        if (component3 == null)
        {
            BoxCollider boxCollider = base.gameObject.AddComponent <BoxCollider>();
            boxCollider.isTrigger = true;
        }
        VRC_EventHandler component4 = base.GetComponent <VRC_EventHandler>();

        if (component4 != null)
        {
            VRC_Station component5 = base.GetComponent <VRC_Station>();
            using (IEnumerator <VRC_EventHandler.VrcEvent> enumerator2 = component5.ProvideEvents().GetEnumerator())
            {
                while (enumerator2.MoveNext())
                {
                    VRC_EventHandler.VrcEvent evt = enumerator2.Current;
                    VRC_StationInternal       t   = this;
                    if (!component4.Events.Any((VRC_EventHandler.VrcEvent item) => item.Name == evt.Name && item.ParameterObjects != null && item.ParameterObjects.Contains(t.gameObject)))
                    {
                        component4.Events.Add(evt);
                    }
                }
            }
        }
    }
Example #5
0
        private static IEnumerator ExecuteTriggerDelay(VRC_Trigger.TriggerEvent trigger)
        {
            bool isGlobalBroadcast = isTriggerGlobalBroadcast_;

            yield return(new WaitForSeconds(trigger.AfterSeconds));

            ExecuteTriggerNow(trigger, isGlobalBroadcast);
        }
Example #6
0
        public static VRC_Trigger GetTriggerForEvent(VRC_Trigger.TriggerEvent trigEvent)
        {
            if (instance_ == null)
            {
                return(null);
            }

            return(instance_.triggerEventToTrigger_[trigEvent]);
        }
        public void ExecuteTrigger(VRC_Trigger.TriggerEvent trigger)
        {
            if (!gameObject.activeInHierarchy || !Trigger.enabled)
            {
                return;
            }

            CyanEmuTriggerExecutor.ExecuteTrigger(trigger);
        }
Example #8
0
 /// <summary>
 /// Trigger event generation
 /// </summary>
 /// <param name="RPCName"></param>
 /// <param name="BroadCastType"></param>
 /// <returns></returns>
 public VRC_Trigger.TriggerEvent Triggerevent(string RPCName, VRC_EventHandler.VrcBroadcastType BroadCastType)
 {
     VRC_Trigger.TriggerEvent EventTrigger = new VRC_Trigger.TriggerEvent
     {
         TriggerType        = VRC_Trigger.TriggerType.Custom,
         BroadcastType      = BroadCastType,
         Name               = RPCName,
         TriggerIndividuals = true
     };
     EventTrigger.Events.Add(VrcEvent(RPCName));
     return(EventTrigger);
 }
Example #9
0
 /// <summary>
 /// Collider Trigger Event
 /// </summary>
 /// <param name="trigger"></param>
 /// <param name="state"></param>
 /// <returns></returns>
 public VRC_Trigger.TriggerEvent ColliderTriggerEvent(VRC_Trigger.TriggerType trigger, bool state)
 {
     VRC_Trigger.TriggerEvent EventTrigger = new VRC_Trigger.TriggerEvent
     {
         TriggerType        = trigger,
         BroadcastType      = VRC_EventHandler.VrcBroadcastType.Local,
         Name               = "GameObject State",
         TriggerIndividuals = true
     };
     EventTrigger.Events.Add(ColliderVrcEvent(state));
     return(EventTrigger);
 }
Example #10
0
        public static int GetTriggerEventIndex(this VRC_Trigger trigger, VRC_Trigger.TriggerEvent trigEvent)
        {
            for (int curEvent = 0; curEvent < trigger.Triggers.Count; ++curEvent)
            {
                if (trigEvent == trigger.Triggers[curEvent])
                {
                    return(curEvent);
                }
            }

            return(-1);
        }
Example #11
0
        public void ExecuteTrigger(VRC_Trigger.TriggerEvent trigger)
        {
            if (
                (!gameObject.activeInHierarchy || !Trigger.enabled) &&
                trigger.TriggerType != VRC.SDKBase.VRC_Trigger.TriggerType.OnDisable
                )
            {
                return;
            }

            CyanEmuTriggerExecutor.ExecuteTrigger(trigger);
        }
Example #12
0
        public static void ExecuteEvent(VRC_EventHandler.EventInfo eventInfo, VRC_Trigger.TriggerEvent originalTrigger)
        {
            // Only save when we don't have an instigator.
            // Todo, check for this properly.
            if (eventInfo.broadcast.IsBufferedBroadcastType() && eventInfo.instagator != null)
            {
                instance_.Log("Adding event to the buffer queue");
                instance_.bufferManager_.SaveBufferedEvent(eventInfo);
            }

            if (eventInfo.evt.ParameterObjects.Length > 0)
            {
                foreach (GameObject obj in eventInfo.evt.ParameterObjects)
                {
                    if (obj == null)
                    {
                        instance_.LogError("Object is null! It was probably deleted and but a trigger is still trying to modify it!");
                        continue;
                    }

                    try
                    {
                        ExecuteEventForObject(eventInfo.evt, obj, eventInfo, originalTrigger);
                    }
                    catch (Exception e)
                    {
                        instance_.LogError(e.ToString());
                    }


                    if (eventInfo.evt.EventType == VRC_EventHandler.VrcEventType.SpawnObject && eventInfo.evt.ParameterObjects.Length > 1)
                    {
                        instance_.LogWarning("Only spawning one object since VRChat limits spawning.");
                        break;
                    }
                }
            }
            else
            {
                instance_.LogWarning("No Object specified for trigger. This is unsupported");
                instance_.LogError("Trigger with no receiver means you probably deleted the object but are still trying to perform actions on it.");
            }
        }
Example #13
0
        public static void ExecuteTrigger(VRC_Trigger.TriggerEvent trigger)
        {
            if (!instance_.networkReady_)
            {
                instance_.deferredTriggers_.Add(trigger);
                instance_.Log("Deferring Trigger: " + trigger.GetTriggerEventAsString());
                return;
            }

            if (trigger.AfterSeconds != 0)
            {
                instance_.Log("Delaying Execution of trigger name: " + trigger.GetTriggerEventAsString());
                instance_.StartCoroutine(ExecuteTriggerDelay(trigger));
            }
            else
            {
                ExecuteTriggerNow(trigger, isTriggerGlobalBroadcast_);
            }
        }
Example #14
0
    public bool AddAvatarPedestalsToTrigger(GameObject MyObjectWithTrigger, List <GameObject> MyAvatarPedestals)
    {
        VRC_Trigger MyTriggerScript;
        List <VRC_Trigger.TriggerEvent> TriggerEvents;

        VRC_Trigger.TriggerEvent         MyTriggerEvent;
        List <VRC_EventHandler.VrcEvent> MyEvents;

        VRC_EventHandler.VrcEvent MyEvent;

        if (MyObjectWithTrigger == null)
        {
            CustomMessage = "Select Objects With Trigger If You Want To Toggle Avatar Pedestals By Pressing Button";
            return(false);
        }

        MyTriggerScript = MyObjectWithTrigger.GetComponent <VRC_Trigger>();

        if (MyTriggerScript == null)
        {
            CustomMessage = "Object Does Not Contain A Trigger";
            return(false);
        }

        MyTriggerScript.interactText = "Avatars";
        TriggerEvents              = MyTriggerScript.Triggers;
        MyTriggerEvent             = new VRC_Trigger.TriggerEvent();
        MyTriggerEvent.TriggerType = VRC_Trigger.TriggerType.OnInteract;

        if (bLocalActivateByTrigger)
        {
            MyTriggerEvent.BroadcastType = VRC_EventHandler.VrcBroadcastType.Local;
        }

        MyEvents                 = MyTriggerEvent.Events;
        MyEvent                  = new VRC_EventHandler.VrcEvent();
        MyEvent.EventType        = VRC_EventHandler.VrcEventType.SetGameObjectActive;
        MyEvent.ParameterObjects = MyAvatarPedestals.ToArray();
        MyEvent.ParameterBoolOp  = VRC_EventHandler.VrcBooleanOp.Toggle;
        MyEvents.Add(MyEvent);
        TriggerEvents.Add(MyTriggerEvent);
        return(true);
    }
Example #15
0
        public static string GetTriggerEventAsString(this VRC_Trigger.TriggerEvent trigEvent)
        {
            string path       = "null";
            int    eventIndex = -1;

            VRC_Trigger trig = CyanEmuTriggerExecutor.GetTriggerForEvent(trigEvent);

            if (trig != null)
            {
                eventIndex = trig.GetTriggerEventIndex(trigEvent);
                path       = CyanEmuUtils.PathForObject(trig.gameObject);
            }

            return(string.Format(
                       "Trigger Event[{0}] \"{1}\" type: {2}, broadcast: {3}, delay: {4}, path: {5}",
                       eventIndex,
                       trigEvent.Name,
                       trigEvent.TriggerType,
                       trigEvent.BroadcastType,
                       trigEvent.AfterSeconds,
                       path
                       ));
        }
    GameObject initRemoteButton(string name, GameObject remote)
    {
        GameObject button = new GameObject(name);

        button.transform.parent        = remote.transform;
        button.transform.localPosition = new Vector3(0, 0, 0);
        button.transform.localRotation = new Quaternion(0, 0, 0, 0);
        button.transform.localScale    = new Vector3(1, 1, 1);
        BoxCollider collider = button.AddComponent <BoxCollider> ();

        collider.isTrigger = true;
        collider.size      = new Vector3(0.01f, 0.05f, 0.02f);

        button.AddComponent <VRC_EventHandler> ();
        VRC_Trigger trigger = button.AddComponent <VRC_Trigger> ();

        VRC_Trigger.TriggerEvent onInteract = new VRC_Trigger.TriggerEvent();
        onInteract.TriggerType   = VRC_Trigger.TriggerType.OnInteract;
        onInteract.BroadcastType = VRC_EventHandler.VrcBroadcastType.AlwaysBufferOne;

        trigger.Triggers.Add(onInteract);

        return(button);
    }
Example #17
0
        private static void ExecuteEventForObject(VRC_EventHandler.VrcEvent triggerEvent, GameObject obj, VRC_EventHandler.EventInfo eventInfo, VRC_Trigger.TriggerEvent originalTrigger)
        {
            instance_.Log("Executing Trigger Event: " + triggerEvent.GetEventAsString(obj) + "\n_On Trigger: " + originalTrigger?.GetTriggerEventAsString());

            bool isBufferedExecution = eventInfo.broadcast.IsBufferedBroadcastType() && eventInfo.instagator == null;

            if (eventInfo.broadcast.IsOwnerBroadcastType())
            {
                if (!Networking.IsOwner(obj) || isBufferedExecution)
                {
                    instance_.LogWarning("Not executing as user is not the owner");
                    return;
                }
            }

            if (!isBufferedExecution && eventInfo.broadcast.IsMasterBroadcastType())
            {
                if (!Networking.IsMaster || isBufferedExecution)
                {
                    instance_.LogWarning("Not executing as user is not the master");
                    return;
                }
            }

            if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.ActivateCustomTrigger)
            {
                // Only activates first one
                VRC_Trigger trigger = obj.GetComponent <VRC_Trigger>();
                if (obj.activeInHierarchy && trigger.enabled)
                {
                    trigger.ExecuteCustomTrigger(triggerEvent.ParameterString);
                }
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.AnimationBool)
            {
                Animator animator = obj.GetComponent <Animator>();
                bool     value    = animator.GetBool(triggerEvent.ParameterString);
                bool     newValue = VRC_EventHandler.BooleanOp(triggerEvent.ParameterBoolOp, value);
                animator.SetBool(triggerEvent.ParameterString, newValue);
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.AnimationInt)
            {
                Animator animator = obj.GetComponent <Animator>();
                animator.SetInteger(triggerEvent.ParameterString, triggerEvent.ParameterInt);
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.AnimationFloat)
            {
                Animator animator = obj.GetComponent <Animator>();
                animator.SetFloat(triggerEvent.ParameterString, triggerEvent.ParameterFloat);
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.AnimationIntAdd)
            {
                Animator animator = obj.GetComponent <Animator>();
                int      value    = animator.GetInteger(triggerEvent.ParameterString);
                animator.SetInteger(triggerEvent.ParameterString, value + triggerEvent.ParameterInt);
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.AnimationIntDivide)
            {
                Animator animator = obj.GetComponent <Animator>();
                int      value    = animator.GetInteger(triggerEvent.ParameterString);
                animator.SetInteger(triggerEvent.ParameterString, value / triggerEvent.ParameterInt);
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.AnimationIntMultiply)
            {
                Animator animator = obj.GetComponent <Animator>();
                int      value    = animator.GetInteger(triggerEvent.ParameterString);
                animator.SetInteger(triggerEvent.ParameterString, value * triggerEvent.ParameterInt);
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.AnimationIntSubtract)
            {
                Animator animator = obj.GetComponent <Animator>();
                int      value    = animator.GetInteger(triggerEvent.ParameterString);
                animator.SetInteger(triggerEvent.ParameterString, value - triggerEvent.ParameterInt);
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.AnimationTrigger)
            {
                obj.GetComponent <Animator>().SetTrigger(triggerEvent.ParameterString);
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.PlayAnimation)
            {
                obj.GetComponent <Animation>().Play(triggerEvent.ParameterString);
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.AudioTrigger)
            {
                AudioSource[] audioSources = obj.GetComponents <AudioSource>();
                foreach (var source in audioSources)
                {
                    if (source.clip.name == triggerEvent.ParameterString)
                    {
                        source.Play();
                    }
                }
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.DestroyObject)
            {
                Destroy(obj);
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.SendRPC)
            {
                object[] parameters     = VRC_Serialization.ParameterDecoder(triggerEvent.ParameterBytes);
                Type[]   parameterTypes = new Type[parameters.Length];
                for (int paramIndex = 0; paramIndex < parameters.Length; ++paramIndex)
                {
                    parameterTypes[paramIndex] = parameters[paramIndex].GetType();
                }

                foreach (MonoBehaviour mono in obj.GetComponents <MonoBehaviour>())
                {
                    MethodInfo methodInfo = mono.GetType().GetMethod(triggerEvent.ParameterString, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, Type.DefaultBinder, parameterTypes, null);

                    if (methodInfo != null)
                    {
                        methodInfo.Invoke(mono, parameters);
                    }
                }
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.SetComponentActive)
            {
                Type type = instance_.GetTypeForComponent(triggerEvent.ParameterString);
                if (type != null)
                {
                    PropertyInfo property = type.GetProperty("enabled");
                    if (property != null)
                    {
                        foreach (Component component in obj.GetComponents(type))
                        {
                            bool value    = (bool)property.GetValue(component, null);
                            bool newValue = VRC_EventHandler.BooleanOp(triggerEvent.ParameterBoolOp, value);
                            property.SetValue(component, newValue, null);
                        }
                    }
                }
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.SetGameObjectActive)
            {
                bool newValue = VRC_EventHandler.BooleanOp(triggerEvent.ParameterBoolOp, obj.activeSelf);
                obj.SetActive(newValue);

                CyanEmuTriggerHelper triggerHelper = obj.GetComponent <CyanEmuTriggerHelper>();
                if (triggerHelper != null && isTriggerGlobalBroadcast_)
                {
                    if (newValue && triggerHelper.HasGlobalOnDisable)
                    {
                        instance_.LogWarning("Posisble OnEnable or OnTimer oversync!");
                    }
                    else if (!newValue && triggerHelper.HasGlobalOnDisable)
                    {
                        instance_.LogWarning("Posisble OnDisable oversync!");
                    }
                }
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.SetLayer)
            {
                obj.layer = triggerEvent.ParameterInt;
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.SetMaterial)
            {
                Material mat = VRC_SceneDescriptor.GetMaterial(triggerEvent.ParameterString);
                obj.GetComponent <Renderer>().material = mat;
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.SetParticlePlaying)
            {
                ParticleSystem system   = obj.GetComponent <ParticleSystem>();
                bool           newValue = VRC_EventHandler.BooleanOp(triggerEvent.ParameterBoolOp, system.isPlaying);
                if (newValue)
                {
                    system.Play();
                }
                else
                {
                    system.Stop();
                }
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.SetUIText)
            {
                obj.GetComponent <UnityEngine.UI.Text>().text = triggerEvent.ParameterString;
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.SpawnObject)
            {
                GameObject prefab = VRC_SceneDescriptor.GetPrefab(triggerEvent.ParameterString);
                CyanEmuMain.SpawnObject(prefab, obj.transform.position, obj.transform.rotation);
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.TeleportPlayer)
            {
                if (isBufferedExecution)
                {
                    instance_.LogWarning("Teleport player actions should not be buffered. Ignoring");
                }
                else
                {
                    if (CyanEmuPlayerController.instance != null)
                    {
                        CyanEmuPlayerController.instance.Teleport(triggerEvent.ParameterObjects[0].transform, triggerEvent.ParameterBoolOp == VRC_EventHandler.VrcBooleanOp.True);
                    }
                    else
                    {
                        instance_.LogWarning("No player container to teleport!");
                    }

                    if (eventInfo.broadcast != VRC_EventHandler.VrcBroadcastType.Local)
                    {
                        instance_.LogWarning("TeleportPlayer action should be set to local!");
                    }
                }
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.AddForce)
            {
                HandleTriggerPhysicsEvent(triggerEvent, obj);
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.AddVelocity)
            {
                HandleTriggerPhysicsEvent(triggerEvent, obj);
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.SetVelocity)
            {
                HandleTriggerPhysicsEvent(triggerEvent, obj);
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.AddAngularVelocity)
            {
                HandleTriggerPhysicsEvent(triggerEvent, obj);
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.SetAngularVelocity)
            {
                HandleTriggerPhysicsEvent(triggerEvent, obj);
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.AddDamage)
            {
                HandleTriggerDamageEvent(triggerEvent, obj);

                if (isBufferedExecution)
                {
                    instance_.LogWarning("AddDamage action should not be buffered!");
                }
                else if (eventInfo.broadcast != VRC_EventHandler.VrcBroadcastType.Local)
                {
                    instance_.LogWarning("AddDamage action should be set to local!");
                }
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.AddHealth)
            {
                HandleTriggerDamageEvent(triggerEvent, obj);

                if (isBufferedExecution)
                {
                    instance_.LogWarning("AddHealth action should not be buffered!");
                }
                else if (eventInfo.broadcast != VRC_EventHandler.VrcBroadcastType.Local)
                {
                    instance_.LogWarning("AddHealth action should be set to local!");
                }
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.SetWebPanelURI)
            {
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.SetWebPanelVolume)
            {
            }
            else if (triggerEvent.EventType == VRC_EventHandler.VrcEventType.MeshVisibility)
            {
            }
        }
Example #18
0
        public static void ExecuteTriggerNow(VRC_Trigger.TriggerEvent trigger, bool prevGlobal)
        {
            if (executionDepth_ > MAX_EXECUTION_DEPTH_)
            {
                instance_.LogError("Reached maximum execution depth of " + MAX_EXECUTION_DEPTH_ + "! Failed to execute trigger!");
                return;
            }
            ++executionDepth_;

            instance_.Log("Executing Trigger: " + trigger.GetTriggerEventAsString());


            bool globalBroadcast = trigger.BroadcastType != VRC_EventHandler.VrcBroadcastType.Local;
            bool setGlobal       = false;

            if ((!prevGlobal && globalBroadcast) || (prevGlobal && !isTriggerGlobalBroadcast_))
            {
                isTriggerGlobalBroadcast_ = true;
                setGlobal = true;
            }

            if (prevGlobal && trigger.BroadcastType.IsEveryoneBroadcastType())
            {
                // Custom trigger oversync
                instance_.LogWarning("Potential OverSync! " + trigger.GetTriggerEventAsString());
            }

            // Random - No error checking. Assumes sum of all values is >= 1.
            if (trigger.Probabilities.Length != 0)
            {
                float value = UnityEngine.Random.value;
                int   ind   = 0;
                float sum   = 0;
                while (sum < value)
                {
                    sum += trigger.Probabilities[ind++];
                    if (sum >= value)
                    {
                        VRC_EventHandler.VrcEvent triggerEvent = trigger.Events[ind - 1];

                        VRC_EventHandler.EventInfo eventInfo = new VRC_EventHandler.EventInfo()
                        {
                            broadcast  = trigger.BroadcastType,
                            evt        = triggerEvent,
                            instagator = instance_.gameObject // todo? set player?
                        };
                        ExecuteEvent(eventInfo, trigger);
                        break;
                    }
                }
            }
            else
            {
                foreach (VRC_EventHandler.VrcEvent triggerEvent in trigger.Events)
                {
                    VRC_EventHandler.EventInfo eventInfo = new VRC_EventHandler.EventInfo()
                    {
                        broadcast  = trigger.BroadcastType,
                        evt        = triggerEvent,
                        instagator = instance_.gameObject // todo? set player?
                    };
                    ExecuteEvent(eventInfo, trigger);
                }
            }

            if (setGlobal)
            {
                isTriggerGlobalBroadcast_ = false;
            }

            --executionDepth_;
        }
Example #19
0
    public void setNewCode(string newCode)
    {
        int[] codeArray;
        try {
            codeArray = newCode.Select(t => int.Parse(t.ToString())).ToArray();
        } catch {
            throw new Exception("invalid character in code.");
        }
        pinButtons = new GameObject[codeArray.Length];

        firstButton = true;
        GameObject nextButton = null;
        GameObject tempButton = null;

        for (int i = 0; i < buttons.Length; i++)
        {
            var dummy = createNewButton(i, false);
            dummyButtons[i] = dummy;
        }

        for (int i = 0; i < codeArray.Length; i++)
        {
            if (i == 0)
            {
                dummyButtons[codeArray[i]].SetActive(false);
                tempButton = createNewButton(codeArray[i], true);
                nextButton = createNewButton(codeArray[i + 1], true);
            }
            else if (i + 1 < codeArray.Length)
            {
                tempButton = nextButton;
                nextButton = createNewButton(codeArray[i + 1], true);
            }
            else
            {
                tempButton = nextButton;
                nextButton = null;
            }

            var trigEvent = new VRC_Trigger.TriggerEvent {
                BroadcastType = VRC_EventHandler.VrcBroadcastType.Local,
                TriggerType   = VRC_Trigger.TriggerType.OnInteract
            };

            var trigRef = tempButton.AddComponent <VRC_Trigger>();
            trigRef.Triggers.Add(trigEvent);

            var vrcEvent = new VRC_EventHandler.VrcEvent {
                EventType        = VRC_EventHandler.VrcEventType.SetGameObjectActive,
                ParameterBoolOp  = VRC_EventHandler.VrcBooleanOp.True,
                ParameterObjects = new GameObject[1],
            };

            tempButton.SetActive(firstButton);
            firstButton = false;
            vrcEvent.ParameterObjects[0] = nextButton != null ? nextButton : mainMenu;

            if (i + 1 < codeArray.Length && codeArray[i] != codeArray[i + 1])
            {
                Array.Resize(ref vrcEvent.ParameterObjects, 2);
                vrcEvent.ParameterObjects[1] = dummyButtons[codeArray[i]];
            }

            var vrcEvent2 = new VRC_EventHandler.VrcEvent {
                EventType        = VRC_EventHandler.VrcEventType.SetGameObjectActive,
                ParameterBoolOp  = VRC_EventHandler.VrcBooleanOp.False,
                ParameterObjects = new GameObject[1]
            };

            vrcEvent2.ParameterObjects[0] = nextButton != null ? tempButton : pinMenu;

            if (i + 1 < codeArray.Length && codeArray[i] != codeArray[i + 1])
            {
                Array.Resize(ref vrcEvent2.ParameterObjects, 2);
                vrcEvent2.ParameterObjects[1] = dummyButtons[codeArray[i + 1]];
            }

            trigEvent.Events.Add(vrcEvent);
            trigEvent.Events.Add(vrcEvent2);

            pinButtons[i] = tempButton;
        }

        var distinctCodeArray = codeArray.Distinct().ToArray();

        foreach (var button in dummyButtons)
        {
            var trig      = button.AddComponent <VRC_Trigger>();
            var trigEvent = new VRC_Trigger.TriggerEvent {
                BroadcastType = VRC_EventHandler.VrcBroadcastType.Local,
                TriggerType   = VRC_Trigger.TriggerType.OnInteract
            };
            trig.Triggers.Add(trigEvent);

            var vrcEvent = new VRC_EventHandler.VrcEvent {
                EventType        = VRC_EventHandler.VrcEventType.SetGameObjectActive,
                ParameterBoolOp  = VRC_EventHandler.VrcBooleanOp.True,
                ParameterObjects = new GameObject[distinctCodeArray.Length]
            };
            vrcEvent.ParameterObjects[0] = pinButtons[0];
            for (int i = 1; i < vrcEvent.ParameterObjects.Length; i++)
            {
                vrcEvent.ParameterObjects[i] = dummyButtons[distinctCodeArray[i]];
            }

            var vrcEvent2 = new VRC_EventHandler.VrcEvent {
                EventType        = VRC_EventHandler.VrcEventType.SetGameObjectActive,
                ParameterBoolOp  = VRC_EventHandler.VrcBooleanOp.False,
                ParameterObjects = new GameObject[codeArray.Length]
            };
            vrcEvent2.ParameterObjects[0] = dummyButtons[codeArray[0]];
            for (int i = 1; i < vrcEvent2.ParameterObjects.Length; i++)
            {
                vrcEvent2.ParameterObjects[i] = pinButtons[i];
            }

            trigEvent.Events.Add(vrcEvent);
            trigEvent.Events.Add(vrcEvent2);
            ResetEvent = trigEvent;
        }
        pinButtons.Last().GetComponent <VRC_Trigger>().Triggers.Add(ResetEvent);
    }
Example #20
0
    public void setupTriggers(List <TScreen> screens)
    {
        foreach (SOption o in options)
        {
            if (!o.optionObj)
            {
                throw new MissingReferenceException("Could not set up triggers; Game Objects for screen " + id + " have not been generated.");
            }

            VRC_EventHandler evh = o.optionObj.GetComponent <VRC_EventHandler>();
            if (!evh)
            {
                o.optionObj.AddComponent <VRC_EventHandler>();
            }

            // Remove any pre-existing triggers
            VRC_Trigger t = o.optionObj.GetComponent <VRC_Trigger>();
            if (t)
            {
                Object.DestroyImmediate(t);
            }

            // Add an event handler and trigger

            VRC_Trigger trigger = o.optionObj.AddComponent <VRC_Trigger> ();
            trigger.interactText = "Select";
            trigger.proximity    = 1;

            VRC_Trigger.TriggerEvent onInteract = new VRC_Trigger.TriggerEvent();
            onInteract.TriggerType   = VRC_Trigger.TriggerType.OnInteract;
            onInteract.BroadcastType = VRC_EventHandler.VrcBroadcastType.AlwaysBufferOne;

            VRC_EventHandler.VrcEvent enableDestination = new VRC_EventHandler.VrcEvent();
            VRC_EventHandler.VrcEvent disableThisScreen = new VRC_EventHandler.VrcEvent();

            enableDestination.EventType = VRC_EventHandler.VrcEventType.SetGameObjectActive;
            disableThisScreen.EventType = VRC_EventHandler.VrcEventType.SetGameObjectActive;

            enableDestination.ParameterBoolOp = VRC_EventHandler.VrcBooleanOp.True;
            disableThisScreen.ParameterBoolOp = VRC_EventHandler.VrcBooleanOp.False;

            enableDestination.ParameterObjects = new GameObject[1];
            disableThisScreen.ParameterObjects = new GameObject[1];

            enableDestination.ParameterObjects.SetValue(screens [o.destination].gameScreen, 0);
            if (o.screen == null)
            {
                throw new MissingReferenceException("option has no screen");
            }
            if (o.screen.gameScreen == null)
            {
                throw new MissingReferenceException("Screen has no game screen");
            }
            if (disableThisScreen.ParameterObjects == null)
            {
                throw new MissingReferenceException("No paraemter objects found");
            }
            disableThisScreen.ParameterObjects.SetValue(o.screen.gameScreen, 0);

            onInteract.Events.Add(enableDestination);
            onInteract.Events.Add(disableThisScreen);

            trigger.Triggers.Add(onInteract);
        }
    }
Example #21
0
        private void SetTrigger(VRC_Trigger trigger)
        {
            if (trigger == null)
            {
                this.LogError("Trigger is null. Destroying helper.");
                DestroyImmediate(this);
                return;
            }

            Trigger = trigger;

            CyanEmuTriggerExecutor.AddTrigger(Trigger);

            hasObjectSync = GetComponent <VRC_ObjectSync>();

            VRC_CombatSystem combatSystem = FindObjectOfType <VRC_CombatSystem>();

            // Go through and make sure all null targets reference itself.
            for (int trig = 0; trig < Trigger.Triggers.Count; ++trig)
            {
                VRC_Trigger.TriggerEvent trigEvent = Trigger.Triggers[trig];
                for (int trigEventInd = 0; trigEventInd < trigEvent.Events.Count; ++trigEventInd)
                {
                    VRC_EventHandler.VrcEvent vrcEvent = trigEvent.Events[trigEventInd];
                    GameObject obj      = gameObject;
                    bool       isCombat = false;
                    if (
                        (vrcEvent.EventType == VRC_EventHandler.VrcEventType.AddDamage ||
                         vrcEvent.EventType == VRC_EventHandler.VrcEventType.AddHealth) &&
                        combatSystem != null
                        )
                    {
                        obj      = combatSystem.gameObject;
                        isCombat = true;
                    }

                    if (vrcEvent.ParameterObjects == null || vrcEvent.ParameterObjects.Length == 0)
                    {
                        if (vrcEvent.ParameterObject != null)
                        {
                            obj = vrcEvent.ParameterObject;
                        }
                        vrcEvent.ParameterObjects = new GameObject[] { obj };
                        this.LogWarning("VRC_Trigger[" + trig + "][" + trigEventInd + "] has no objects. Setting it to target itself. " + VRC.Tools.GetGameObjectPath(obj));
                    }
                    else
                    {
                        bool found = false;
                        for (int i = 0; i < vrcEvent.ParameterObjects.Length; ++i)
                        {
                            if (vrcEvent.ParameterObjects[i] == null)
                            {
                                vrcEvent.ParameterObjects[i] = obj;
                                found = true;
                            }
                        }

                        if (found && !isCombat)
                        {
                            this.LogWarning("VRC_Trigger[" + trig + "][" + trigEventInd + "] has null targets. Setting targets to itself. " + VRC.Tools.GetGameObjectPath(obj));
                        }
                    }
                }
            }



            for (int i = 0; i < Trigger.Triggers.Count; ++i)
            {
                if (Trigger.Triggers[i].TriggerType == VRC_Trigger.TriggerType.OnEnterTrigger)
                {
                    enterTriggers.Add(Trigger.Triggers[i]);
                    CheckForPlayerLayerOverSync(Trigger.Triggers[i]);
                }
                else if (Trigger.Triggers[i].TriggerType == VRC_Trigger.TriggerType.OnExitTrigger)
                {
                    exitTriggers.Add(Trigger.Triggers[i]);
                    CheckForPlayerLayerOverSync(Trigger.Triggers[i]);
                }
                else if (Trigger.Triggers[i].TriggerType == VRC_Trigger.TriggerType.OnEnterCollider)
                {
                    enterCollider.Add(Trigger.Triggers[i]);
                    CheckForPlayerLayerOverSync(Trigger.Triggers[i]);
                }
                else if (Trigger.Triggers[i].TriggerType == VRC_Trigger.TriggerType.OnExitCollider)
                {
                    exitCollider.Add(Trigger.Triggers[i]);
                    CheckForPlayerLayerOverSync(Trigger.Triggers[i]);
                }
                else if (Trigger.Triggers[i].TriggerType == VRC_Trigger.TriggerType.OnTimer)
                {
                    Trigger.ResetClock(Trigger.Triggers[i]);
                    timerTriggers.Add(Trigger.Triggers[i]);

                    if (Trigger.Triggers[i].BroadcastType.IsAlwaysBufferedBroadcastType())
                    {
                        HasGlobalOnEnable = true;
                    }
                }
                else if (Trigger.Triggers[i].TriggerType == VRC_Trigger.TriggerType.OnInteract)
                {
                    interactTriggers.Add(Trigger.Triggers[i]);
                }
                else if (Trigger.Triggers[i].TriggerType == VRC_Trigger.TriggerType.OnKeyDown || Trigger.Triggers[i].TriggerType == VRC_Trigger.TriggerType.OnKeyUp)
                {
                    onKeyTriggers.Add(Trigger.Triggers[i]);
                }
                else if (Trigger.Triggers[i].TriggerType == VRC_Trigger.TriggerType.OnParticleCollision)
                {
                    particleCollider.Add(Trigger.Triggers[i]);
                }
                else if (Trigger.Triggers[i].TriggerType == VRC_Trigger.TriggerType.OnPlayerJoined)
                {
                    if (Trigger.Triggers[i].BroadcastType.IsAlwaysBufferedBroadcastType())
                    {
                        this.LogWarning("Oversync on player joined! " + Trigger.Triggers[i].GetTriggerEventAsString());
                    }
                }
                else if (Trigger.Triggers[i].TriggerType == VRC_Trigger.TriggerType.OnPlayerLeft)
                {
                    if (Trigger.Triggers[i].BroadcastType.IsAlwaysBufferedBroadcastType())
                    {
                        this.LogWarning("Oversync on player left! " + Trigger.Triggers[i].GetTriggerEventAsString());
                    }
                }
                else if (Trigger.Triggers[i].TriggerType == VRC_Trigger.TriggerType.OnEnable)
                {
                    if (Trigger.Triggers[i].BroadcastType.IsAlwaysBufferedBroadcastType())
                    {
                        HasGlobalOnEnable = true;
                    }
                }
                else if (Trigger.Triggers[i].TriggerType == VRC_Trigger.TriggerType.OnDisable)
                {
                    if (Trigger.Triggers[i].BroadcastType.IsAlwaysBufferedBroadcastType())
                    {
                        HasGlobalOnDisable = true;
                    }
                }
            }

            if (enterTriggers.Count + exitTriggers.Count + enterCollider.Count + exitCollider.Count + timerTriggers.Count + onKeyTriggers.Count + particleCollider.Count == 0)
            {
                enabled = false;
            }

            AddListeners();
        }
        private void CheckForMissingComponents()
        {
            Collider stationCollider = GetComponent <Collider>();

            if (stationCollider == null)
            {
                gameObject.AddComponent <BoxCollider>().isTrigger = true;
            }

#if UDON && UNITY_EDITOR
            UdonBehaviour udon = GetComponent <UdonBehaviour>();
            if (udon == null)
            {
                udon = gameObject.AddComponent <UdonBehaviour>();
                udon.interactText = "Sit";
                AbstractUdonProgramSource program = UnityEditor.AssetDatabase.LoadAssetAtPath <AbstractUdonProgramSource>("Assets/VRChat Examples/Prefabs/VRCChair/StationGraph.asset");
                if (program != null)
                {
                    udon.AssignProgramAndVariables(program.SerializedProgramAsset, new UdonVariableTable());
                }
            }
#endif

#if VRC_SDK_VRCSDK2
            // Auto add a Interact Trigger to use the station
            VRC_Trigger trigger = GetComponent <VRC_Trigger>();
            if (trigger == null)
            {
                trigger              = gameObject.AddComponent <VRCSDK2.VRC_Trigger>();
                trigger.Triggers     = new List <VRC_Trigger.TriggerEvent>();
                trigger.interactText = "Sit";

                VRC_Trigger.TriggerEvent onInteract = new VRC_Trigger.TriggerEvent
                {
                    BroadcastType = VRC_EventHandler.VrcBroadcastType.Local,
                    TriggerType   = VRC_Trigger.TriggerType.OnInteract,
                    Events        = new List <VRC_EventHandler.VrcEvent>()
                };

                VRC_EventHandler.VrcEvent useStationEvent = new VRC_EventHandler.VrcEvent
                {
                    EventType        = VRC_EventHandler.VrcEventType.SendRPC,
                    ParameterString  = "UseStation",
                    ParameterObjects = new[] { gameObject },
                    ParameterInt     = 6,
                };

                onInteract.Events.Add(useStationEvent);
                trigger.Triggers.Add(onInteract);

                // Reinitialize the trigger now that it has the proper events added.
                // Note that this only works as there were no vrc triggers on this object before.
                CyanEmuTriggerHelper helper = GetComponent <CyanEmuTriggerHelper>();
                if (helper != null)
                {
                    DestroyImmediate(helper);
                }
                CyanEmuTriggerHelper.InitializeTrigger(trigger);
            }
#endif
        }