using NewHorizons.Builder.General; using OWML.Utils; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEngine; using Logger = NewHorizons.Utility.Logger; namespace NewHorizons.Builder.Props { public static class RaftBuilder { public static void Make(GameObject body, Vector3 position, Sector sector, OWRigidbody OWRB, AstroObject ao) { var originalRaft = GameObject.Find("RingWorld_Body/Sector_RingInterior/Interactibles_RingInterior/Rafts/Raft_Body"); GameObject raftObject = new GameObject($"{body.name}Raft"); raftObject.SetActive(false); GameObject lightSensors = GameObject.Instantiate(GameObject.Find("RingWorld_Body/Sector_RingInterior/Sector_Zone2/Structures_Zone2/RaftHouse_Eye_Zone2/Interactables_RaftHouse_Eye_Zone2/Prefab_IP_RaftDock/RaftSocket/Raft_Body (7)/LightSensorRoot"), raftObject.transform); GameObject geometry = GameObject.Instantiate(GameObject.Find("RingWorld_Body/Sector_RingInterior/Sector_Zone2/Structures_Zone2/RaftHouse_Eye_Zone2/Interactables_RaftHouse_Eye_Zone2/Prefab_IP_RaftDock/RaftSocket/Raft_Body (7)/Structure_IP_Raft"), raftObject.transform); GameObject collidersObject = GameObject.Instantiate(GameObject.Find("RingWorld_Body/Sector_RingInterior/Sector_Zone2/Structures_Zone2/RaftHouse_Eye_Zone2/Interactables_RaftHouse_Eye_Zone2/Prefab_IP_RaftDock/RaftSocket/Raft_Body (7)/Colliders/"), raftObject.transform); raftObject.transform.parent = sector.transform; raftObject.transform.localPosition = position; raftObject.transform.rotation = Quaternion.FromToRotation(raftObject.transform.TransformDirection(Vector3.up), position.normalized); foreach (var l in lightSensors.GetComponentsInChildren()) { if (l._sector != null) l._sector.OnSectorOccupantsUpdated -= l.OnSectorOccupantsUpdated; l._sector = sector; l._sector.OnSectorOccupantsUpdated += l.OnSectorOccupantsUpdated; l._lightSourceMask = LightSourceType.FLASHLIGHT; l.SetDetectorActive(true); l.gameObject.SetActive(true); } var rigidBody = raftObject.AddComponent(); rigidBody.isKinematic = true; rigidBody.interpolation = originalRaft.GetComponent().interpolation; rigidBody.collisionDetectionMode = originalRaft.GetComponent().collisionDetectionMode; rigidBody.mass = originalRaft.GetComponent().mass; rigidBody.drag = originalRaft.GetComponent().drag; rigidBody.angularDrag = originalRaft.GetComponent().angularDrag; var kinematicRigidBody = raftObject.AddComponent(); kinematicRigidBody.centerOfMass = Vector3.zero; var owRigidBody = raftObject.AddComponent(); owRigidBody._kinematicSimulation = true; owRigidBody._rigidbody = rigidBody; owRigidBody._kinematicRigidbody = kinematicRigidBody; kinematicRigidBody._rigidbody = rigidBody; kinematicRigidBody._owRigidbody = owRigidBody; //var motion = raftObject.AddComponent(); //motion.SetBodyToMatch(OWRB); foreach (var c in collidersObject.GetComponentsInChildren()) { c.ClearParentBody(); c._parentBody = owRigidBody; c.ListenForParentBodySuspension(); } var meshColliders = collidersObject.GetComponentsInChildren(); foreach (var c in meshColliders) { var child = c.gameObject; var newCollider = child.AddComponent(); newCollider.sharedMesh = c.sharedMesh; newCollider.material = c.material; newCollider.sharedMaterial = c.sharedMaterial; GameObject.Destroy(c); } foreach (var child in raftObject.GetComponentsInChildren()) { StreamingManager.LoadStreamingAssets(child.assetBundle); } //var detectorGO = DetectorBuilder.Make(raftObject, owRigidBody, ao, null, false, false); //var fluidDetector = detectorGO.AddComponent(); //Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => fluidDetector._activeVolumes = new EffectVolume[] { body.GetComponentInChildren() }.ToList()); var targetBodyAlignment = raftObject.AddComponent(); targetBodyAlignment._owRigidbody = owRigidBody; targetBodyAlignment.SetTargetBody(OWRB); targetBodyAlignment.SetUsePhysicsToRotate(true); var controller = raftObject.AddComponent(); controller.SetSector(sector); raftObject.SetActive(true); } } }