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); } }
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(); }
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); }