Example #1
0
        private void OnCollisionEnter(Collision collision)
        {
            if (collision.transform.tag == "Player")
            {
                return;
            }

            bool flag = collision.collider.attachedRigidbody != null && hookBody != null;

            if (flag)
            {
                GameObject gameObject = OWPhysics.GetOtherCollider(this, collision).gameObject;
                AttachToObject(gameObject, collision.contacts[0].normal);
            }
        }
Example #2
0
        public override void OnReceiveRemote(bool server, MoonStateChangeMessage message)
        {
            if (!QSBCore.HasWokenUp)
            {
                return;
            }
            var moon = Locator.GetQuantumMoon();
            var wasPlayerEntangled   = moon.IsPlayerEntangled();
            var location             = new RelativeLocationData(Locator.GetPlayerTransform().GetComponent <OWRigidbody>(), moon.transform);
            var moonBody             = moon.GetValue <OWRigidbody>("_moonBody");
            var constantFoceDetector = (ConstantForceDetector)moonBody.GetAttachedForceDetector();
            var orbits      = moon.GetValue <QuantumOrbit[]>("_orbits");
            var orbit       = orbits.First(x => x.GetStateIndex() == message.StateIndex);
            var orbitRadius = orbit.GetOrbitRadius();
            var owRigidbody = orbit.GetAttachedOWRigidbody();
            var position    = (message.OnUnitSphere * orbitRadius) + owRigidbody.GetWorldCenterOfMass();

            moonBody.transform.position = position;
            if (!Physics.autoSyncTransforms)
            {
                Physics.SyncTransforms();
            }
            constantFoceDetector.AddConstantVolume(owRigidbody.GetAttachedGravityVolume(), true, true);
            moonBody.SetVelocity(OWPhysics.CalculateOrbitVelocity(owRigidbody, moonBody, message.OrbitAngle) + owRigidbody.GetVelocity());
            moon.SetValue("_stateIndex", message.StateIndex);

            if (moon.IsPlayerInside())
            {
                moon.GetType().GetMethod("SetSurfaceState", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(moon, new object[] { message.StateIndex });
            }
            else
            {
                moon.GetType().GetMethod("SetSurfaceState", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(moon, new object[] { -1 });
                moon.GetValue <AudioSignal>("_quantumSignal").SetSignalActivation(message.StateIndex != 5, 2f);
            }
            moon.GetValue <ReferenceFrameVolume>("_referenceFrameVolume").gameObject.SetActive(message.StateIndex != 5);
            moonBody.SetIsTargetable(message.StateIndex != 5);
            foreach (var obj in moon.GetValue <GameObject[]>("_deactivateAtEye"))
            {
                obj.SetActive(message.StateIndex != 5);
            }
            GlobalMessenger <OWRigidbody> .FireEvent("QuantumMoonChangeState", moonBody);

            if (wasPlayerEntangled)
            {
                Locator.GetPlayerTransform().GetComponent <OWRigidbody>().MoveToRelativeLocation(location, moon.transform);
            }
        }
        public override void OnReceiveRemote()
        {
            var moon = Locator.GetQuantumMoon();
            var wasPlayerEntangled    = moon.IsPlayerEntangled();
            var location              = new RelativeLocationData(Locator.GetPlayerTransform().GetComponent <OWRigidbody>(), moon.transform);
            var moonBody              = moon._moonBody;
            var constantForceDetector = (ConstantForceDetector)moonBody.GetAttachedForceDetector();
            var orbits      = moon._orbits;
            var orbit       = orbits.First(x => x.GetStateIndex() == StateIndex);
            var orbitRadius = orbit.GetOrbitRadius();
            var owRigidbody = orbit.GetAttachedOWRigidbody();
            var position    = OnUnitSphere * orbitRadius + owRigidbody.GetWorldCenterOfMass();

            moonBody.transform.position = position;
            if (!Physics.autoSyncTransforms)
            {
                Physics.SyncTransforms();
            }

            constantForceDetector.AddConstantVolume(owRigidbody.GetAttachedGravityVolume(), true, true);
            moonBody.SetVelocity(OWPhysics.CalculateOrbitVelocity(owRigidbody, moonBody, OrbitAngle) + owRigidbody.GetVelocity());
            moon._stateIndex = StateIndex;

            if (moon.IsPlayerInside())
            {
                moon.SetSurfaceState(StateIndex);
            }
            else
            {
                moon.SetSurfaceState(-1);
                moon._quantumSignal.SetSignalActivation(StateIndex != 5);
            }

            moon._referenceFrameVolume.gameObject.SetActive(StateIndex != 5);
            moonBody.SetIsTargetable(StateIndex != 5);
            foreach (var obj in moon._deactivateAtEye)
            {
                obj.SetActive(StateIndex != 5);
            }

            GlobalMessenger <OWRigidbody> .FireEvent("QuantumMoonChangeState", moonBody);

            if (wasPlayerEntangled)
            {
                Locator.GetPlayerTransform().GetComponent <OWRigidbody>().MoveToRelativeLocation(location, moon.transform);
            }
        }
        private static void MoveMoon(QuantumMoon __instance, Vector3 targetPosition, OWRigidbody bodyToOrbit, int stateIndex, Vector3 onUnitSphere, ref bool foundNewPosition)
        {
            __instance._moonBody.transform.position = targetPosition;
            if (!Physics.autoSyncTransforms)
            {
                Physics.SyncTransforms();
            }

            __instance._visibilityTracker.transform.localPosition = Vector3.zero;
            __instance._constantForceDetector.AddConstantVolume(bodyToOrbit.GetAttachedGravityVolume(), true, true);
            var bodyVelocity = bodyToOrbit.GetVelocity();

            if (__instance._useInitialMotion)
            {
                var component = bodyToOrbit.GetComponent <InitialMotion>();
                bodyVelocity = (component != null)
                                        ? component.GetInitVelocity()
                                        : Vector3.zero;
                __instance._useInitialMotion = false;
            }

            var orbitAngle = Random.Range(0, 360);

            __instance._moonBody.SetVelocity(OWPhysics.CalculateOrbitVelocity(bodyToOrbit, __instance._moonBody, orbitAngle) + bodyVelocity);
            __instance._useInitialMotion = false;
            __instance._lastStateIndex   = __instance._stateIndex;
            __instance._stateIndex       = stateIndex;
            __instance._collapseToIndex  = -1;
            foundNewPosition             = true;

            for (var k = 0; k < __instance._stateSkipCounts.Length; k++)
            {
                __instance._stateSkipCounts[k] = (k == __instance._stateIndex)
                                        ? 0
                                        : (__instance._stateSkipCounts[k] + 1);
            }

            new MoonStateChangeMessage(stateIndex, onUnitSphere, orbitAngle).Send();
        }
Example #5
0
        public static bool Moon_ChangeQuantumState(
            QuantumMoon __instance,
            ref bool __result,
            bool skipInstantVisibilityCheck,
            bool ____isPlayerInside,
            bool ____hasSunCollapsed,
            float ____playerWarpTime,
            ref int ____stateIndex,
            ref int ____collapseToIndex,
            QuantumOrbit[] ____orbits,
            float ____sphereCheckRadius,
            VisibilityTracker ____visibilityTracker,
            OWRigidbody ____moonBody,
            ConstantForceDetector ____constantForceDetector,
            ref bool ____useInitialMotion,
            ref int ____lastStateIndex,
            ref int[] ____stateSkipCounts,
            AudioSignal ____quantumSignal,
            ReferenceFrameVolume ____referenceFrameVolume,
            GameObject[] ____deactivateAtEye
            )
        {
            if (QuantumManager.IsVisibleUsingCameraFrustum((ShapeVisibilityTracker)____visibilityTracker, skipInstantVisibilityCheck) && !QuantumManager.Instance.Shrine.IsPlayerInDarkness())
            {
                if (!skipInstantVisibilityCheck)
                {
                    var method = new StackTrace().GetFrame(3).GetMethod();
                    DebugLog.ToConsole($"Warning - Tried to change moon state while still observed. Called by {method.DeclaringType}.{method.Name}", MessageType.Warning);
                }
                __result = false;
                return(false);
            }
            var flag = false;

            if (____isPlayerInside && ____hasSunCollapsed)
            {
                __result = false;
                return(false);
            }
            if (Time.time - ____playerWarpTime < 1f)
            {
                __result = false;
                return(false);
            }
            if (____stateIndex == 5 && ____isPlayerInside && !__instance.IsPlayerEntangled())
            {
                __result = false;
                return(false);
            }
            for (var i = 0; i < 10; i++)
            {
                var stateIndex = (____collapseToIndex == -1) ? (int)__instance.GetType().GetMethod("GetRandomStateIndex", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, null) : ____collapseToIndex;
                var orbitIndex = -1;
                for (var j = 0; j < ____orbits.Length; j++)
                {
                    if (____orbits[j].GetStateIndex() == stateIndex)
                    {
                        orbitIndex = j;
                        break;
                    }
                }
                if (orbitIndex == -1)
                {
                    DebugLog.ToConsole($"Error - QM failed to find orbit for state {stateIndex}", MessageType.Error);
                }
                var orbitRadius  = (orbitIndex == -1) ? 10000f : ____orbits[orbitIndex].GetOrbitRadius();
                var owRigidbody  = (orbitIndex == -1) ? Locator.GetAstroObject(AstroObject.Name.Sun).GetOWRigidbody() : ____orbits[orbitIndex].GetAttachedOWRigidbody();
                var onUnitSphere = UnityEngine.Random.onUnitSphere;
                if (stateIndex == 5)
                {
                    onUnitSphere.y = 0f;
                    onUnitSphere.Normalize();
                }
                var position = (onUnitSphere * orbitRadius) + owRigidbody.GetWorldCenterOfMass();
                if (!Physics.CheckSphere(position, ____sphereCheckRadius, OWLayerMask.physicalMask) || ____collapseToIndex != -1)
                {
                    ____visibilityTracker.transform.position = position;
                    if (!Physics.autoSyncTransforms)
                    {
                        Physics.SyncTransforms();
                    }
                    if (__instance.IsPlayerEntangled() || !QuantumManager.IsVisibleUsingCameraFrustum((ShapeVisibilityTracker)____visibilityTracker, skipInstantVisibilityCheck))
                    {
                        ____moonBody.transform.position = position;
                        if (!Physics.autoSyncTransforms)
                        {
                            Physics.SyncTransforms();
                        }
                        ____visibilityTracker.transform.localPosition = Vector3.zero;
                        ____constantForceDetector.AddConstantVolume(owRigidbody.GetAttachedGravityVolume(), true, true);
                        var velocity = owRigidbody.GetVelocity();
                        if (____useInitialMotion)
                        {
                            var initialMotion = owRigidbody.GetComponent <InitialMotion>();
                            velocity             = (initialMotion == null) ? Vector3.zero : initialMotion.GetInitVelocity();
                            ____useInitialMotion = false;
                        }
                        var orbitAngle = UnityEngine.Random.Range(0, 360);
                        ____moonBody.SetVelocity(OWPhysics.CalculateOrbitVelocity(owRigidbody, ____moonBody, orbitAngle) + velocity);
                        ____lastStateIndex  = ____stateIndex;
                        ____stateIndex      = stateIndex;
                        ____collapseToIndex = -1;
                        flag = true;
                        for (var k = 0; k < ____stateSkipCounts.Length; k++)
                        {
                            ____stateSkipCounts[k] = (k != ____stateIndex) ? (____stateSkipCounts[k] + 1) : 0;
                        }
                        QSBEventManager.FireEvent(EventNames.QSBMoonStateChange, stateIndex, onUnitSphere, orbitAngle);
                        break;
                    }
                    ____visibilityTracker.transform.localPosition = Vector3.zero;
                }
                else
                {
                    DebugLog.ToConsole("Warning - Quantum moon orbit position occupied! Aborting collapse.", MessageType.Warning);
                }
            }
            if (flag)
            {
                if (____isPlayerInside)
                {
                    __instance.GetType().GetMethod("SetSurfaceState", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { ____stateIndex });
                }
                else
                {
                    __instance.GetType().GetMethod("SetSurfaceState", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { -1 });
                    ____quantumSignal.SetSignalActivation(____stateIndex != 5, 2f);
                }
                ____referenceFrameVolume.gameObject.SetActive(____stateIndex != 5);
                ____moonBody.SetIsTargetable(____stateIndex != 5);
                for (var l = 0; l < ____deactivateAtEye.Length; l++)
                {
                    ____deactivateAtEye[l].SetActive(____stateIndex != 5);
                }
                GlobalMessenger <OWRigidbody> .FireEvent("QuantumMoonChangeState", ____moonBody);

                __result = true;
                return(false);
            }
            __result = false;
            return(false);
        }