コード例 #1
0
        /**
         * If the component requires other custom components then do it here.
         * Read the comment on Components.MantaSeializationFixer if you wish to understand why this horrible system exists.
         */
        public static void SetUpManta(GameObject submarine)
        {
            MantaSubmarine     mantaSubmarine     = submarine.GetComponent <MantaSubmarine>();
            Transform          applyForceLocation = submarine.FindChild("PointsOfInterest").FindChild("ForceAppliedLocation").transform;
            MovementController movementController = submarine.GetOrAddComponent <MovementController>();

            movementController.ApplyForceLocation = applyForceLocation;

            GameObject doorLeft = submarine.FindChild("PointsOfInterest").FindChild("PlayerEntranceLeftFlap");

            doorLeft.GetComponentInChildren <HingeJoint>().connectedBody = submarine.GetComponent <Rigidbody>();
            HingeJointDoor hingeDoorLeft = doorLeft.GetOrAddComponent <HingeJointDoor>();

            hingeDoorLeft.OverwriteTargetVelocity = true;
            hingeDoorLeft.TargetVelocity          = 150f;
            hingeDoorLeft.TriggerToEverything     = false;
            hingeDoorLeft.TriggerToPlayer         = true;
            hingeDoorLeft.TriggerToVehicles       = false;
            hingeDoorLeft.OpenSound  = CyclopsDefaultAssets.PLAYER_HATCH_OPEN;
            hingeDoorLeft.CloseSound = CyclopsDefaultAssets.PLAYER_HATCH_CLOSE;

            GameObject doorRight = submarine.FindChild("PointsOfInterest").FindChild("PlayerEntranceRightFlap");

            doorRight.GetComponentInChildren <HingeJoint>().connectedBody = submarine.GetComponent <Rigidbody>();
            HingeJointDoor hingeDoorRight = doorRight.GetOrAddComponent <HingeJointDoor>();

            hingeDoorRight.OverwriteTargetVelocity = true;
            hingeDoorRight.TargetVelocity          = 150f;
            hingeDoorRight.TriggerToEverything     = false;
            hingeDoorRight.TriggerToPlayer         = true;
            hingeDoorRight.TriggerToVehicles       = false;
            hingeDoorRight.OpenSound  = CyclopsDefaultAssets.PLAYER_HATCH_OPEN;
            hingeDoorRight.CloseSound = CyclopsDefaultAssets.PLAYER_HATCH_CLOSE;

            GameObject vehicleDoorLeft = submarine.FindChild("PointsOfInterest").FindChild("VehicleEntranceLeftFlap");

            vehicleDoorLeft.GetComponentInChildren <HingeJoint>().connectedBody = submarine.GetComponent <Rigidbody>();
            HingeJointDoor hingeVehicleDoorLeft = vehicleDoorLeft.GetOrAddComponent <HingeJointDoor>();

            hingeVehicleDoorLeft.OverwriteTargetVelocity = true;
            hingeVehicleDoorLeft.TargetVelocity          = 150f;
            hingeVehicleDoorLeft.TriggerToEverything     = false;
            hingeVehicleDoorLeft.TriggerToPlayer         = false;
            hingeVehicleDoorLeft.TriggerToVehicles       = true;
            hingeVehicleDoorLeft.OpenSound  = CyclopsDefaultAssets.DOCKING_DOORS_OPEN;
            hingeVehicleDoorLeft.CloseSound = CyclopsDefaultAssets.DOCKING_DOORS_CLOSE;

            GameObject vehicleDoorRight = submarine.FindChild("PointsOfInterest").FindChild("VehicleEntranceRightFlap");

            vehicleDoorRight.GetComponentInChildren <HingeJoint>().connectedBody = submarine.GetComponent <Rigidbody>();
            HingeJointDoor hingeVehicleDoorRight = vehicleDoorRight.GetOrAddComponent <HingeJointDoor>();

            hingeVehicleDoorRight.OverwriteTargetVelocity = true;
            hingeVehicleDoorRight.TargetVelocity          = 150f;
            hingeVehicleDoorRight.TriggerToEverything     = false;
            hingeVehicleDoorRight.TriggerToPlayer         = false;
            hingeVehicleDoorRight.TriggerToVehicles       = true;
            hingeVehicleDoorRight.OpenSound  = CyclopsDefaultAssets.DOCKING_DOORS_OPEN;
            hingeVehicleDoorRight.CloseSound = CyclopsDefaultAssets.DOCKING_DOORS_CLOSE;

            GameObject    entrancePosition      = submarine.FindChild("PointsOfInterest").FindChild("EntranceTeleportSpot");
            GameObject    entranceHatch         = submarine.FindChild("PointsOfInterest").FindChild("PlayerEntrance").FindChild("Base");
            EntranceHatch entranceHatchTeleport = entranceHatch.GetOrAddComponent <EntranceHatch>();

            entranceHatchTeleport.HoverText         = "Board Manta";
            entranceHatchTeleport.HoverHandReticle  = HandReticle.IconType.Hand;
            entranceHatchTeleport.TeleportTarget    = entrancePosition;
            entranceHatchTeleport.Submarine         = mantaSubmarine;
            entranceHatchTeleport.EnteringSubmarine = true;

            GameObject    leavePosition      = submarine.FindChild("PointsOfInterest").FindChild("LeaveTeleportSpot");
            GameObject    leaveHatch         = submarine.FindChild("PointsOfInterest").FindChild("PlayerEntrance").FindChild("Top");
            EntranceHatch leaveHatchTeleport = leaveHatch.GetOrAddComponent <EntranceHatch>();

            leaveHatchTeleport.HoverText         = "Disembark Manta";
            leaveHatchTeleport.HoverHandReticle  = HandReticle.IconType.Hand;
            leaveHatchTeleport.TeleportTarget    = leavePosition;
            leaveHatchTeleport.Submarine         = mantaSubmarine;
            leaveHatchTeleport.EnteringSubmarine = false;

            GameObject      steeringConsolePOI             = submarine.FindChild("PointsOfInterest").FindChild("SteeringConsole");
            GameObject      steeringConsoleLeftHandTarget  = submarine.FindChild("PointsOfInterest").FindChild("SteeringConsole").FindChild("LeftIKTarget");
            GameObject      steeringConsoleRightHandTarget = submarine.FindChild("PointsOfInterest").FindChild("SteeringConsole").FindChild("RightIKTarget");
            GameObject      playerParentWhilePiloting      = submarine.FindChild("PointsOfInterest").FindChild("SteeringConsole").FindChild("PlayerLockedWhileSteeringPosition");
            SteeringConsole steeringConsole = steeringConsolePOI.GetOrAddComponent <SteeringConsole>();

            steeringConsole.MovementController    = submarine.GetComponent <MovementController>();
            steeringConsole.ParentWhilePilotingGO = playerParentWhilePiloting;
            steeringConsole.LeftHandIKTarget      = steeringConsoleLeftHandTarget;
            steeringConsole.RightHandIKTarget     = steeringConsoleRightHandTarget;
            steeringConsole.Submarine             = mantaSubmarine;

            CyclopsCollisionSounds collisionSounds = submarine.GetOrAddComponent <CyclopsCollisionSounds>();

            MovementData normalSpeedMovementData = new MovementData
            {
                ForwardAccelerationSpeed   = 5f,
                BackwardsAccelerationSpeed = 3f,
                AscendDescendSpeed         = 3f,
                RotationSpeed = 0.3f,
                StrafeSpeed   = 2f
            };

            EngineManager engineManager = submarine.GetOrAddComponent <EngineManager>();

            engineManager.SetMovementDataForEngineState(EngineState.SLOW, normalSpeedMovementData);
            engineManager.SetMovementDataForEngineState(EngineState.NORMAL, normalSpeedMovementData);
            engineManager.SetMovementDataForEngineState(EngineState.FAST, normalSpeedMovementData);
            engineManager.SetMovementDataForEngineState(EngineState.SPECIAL, normalSpeedMovementData);

            CyclopsStartupPowerDownSequence   cyclopsStartupPowerDownSequence   = submarine.GetOrAddComponent <CyclopsStartupPowerDownSequence>();
            CyclopsEngineStateChangedCallouts cyclopsEngineStateChangedCallouts = submarine.GetOrAddComponent <CyclopsEngineStateChangedCallouts>();

            movementController.EngineManager = engineManager;
            CyclopsWelcomeCallout cyclopsWelcomeCallout = submarine.GetOrAddComponent <CyclopsWelcomeCallout>();
            CyclopsEngineSound    cyclopsEngineSound    = submarine.GetOrAddComponent <CyclopsEngineSound>();

            cyclopsEngineSound.RampUpSpeed   = 0.2f;
            cyclopsEngineSound.RampDownSpeed = 0.2f;
            movementController.EngineSound   = cyclopsEngineSound;

            OxygenReplenishment oxygenReplenishment = submarine.GetOrAddComponent <OxygenReplenishment>();

            oxygenReplenishment.OxygenPerSecond  = 15f;
            oxygenReplenishment.OxygenEnergyCost = 0.1f;

            LiveMixin liveMixin = submarine.GetOrAddComponent <LiveMixin>();

            liveMixin.data           = CyclopsLiveMixinData.Get(); // TO:DO Create a proper health system for the manta.
            liveMixin.data.knifeable = true;                       // TO:DO remove just here for testing purposes.
            liveMixin.data.maxHealth = 500;

            GameObject externalLights = submarine.FindChild("Lights").FindChild("Exterior");
            GameObject internalLights = submarine.FindChild("Lights").FindChild("Interior");

            LightsManager lightsManager      = submarine.GetOrAddComponent <LightsManager>();
            List <Light>  internalLightsList = new List <Light>();
            List <Light>  externalLightsList = new List <Light>();

            foreach (Light light in externalLights.GetComponentsInChildren <Light>())
            {
                externalLightsList.Add(light);
            }
            foreach (Light light in internalLights.GetComponentsInChildren <Light>())
            {
                internalLightsList.Add(light);
            }
            lightsManager.ExternalLights              = externalLightsList;
            lightsManager.InternalLights              = internalLightsList;
            lightsManager.ExternalLightsOnIntensity   = 1.5f;
            lightsManager.ExternalLightsOffIntensity  = 0f;
            lightsManager.InternalLightsOnIntensity   = 1.5f;
            lightsManager.InternalLightsOffIntensity  = 0f;
            lightsManager.EnableInternalLightsOnStart = true;
            lightsManager.EnableExternalLightsOnStart = true;

            CyclopsUnderAttackEmergencyLighting emergencyLighting = submarine.GetOrAddComponent <CyclopsUnderAttackEmergencyLighting>();

            emergencyLighting.LightsAffected = internalLightsList;

            submarine.GetOrAddComponent <CyclopsUnderAttackCallout>();

            ExternalDamageManager externalDamageManager = submarine.GetOrAddComponent <ExternalDamageManager>();

            externalDamageManager.DamagePoints       = submarine.FindChild("PointsOfInterest").FindChild("DamagePoints").transform;
            externalDamageManager.SubmarineLiveMixin = liveMixin;
            externalDamageManager.LiveMixinDataForExternalDamagePoints = CyclopsExternalDamagePointLiveMixinData.Get();
            externalDamageManager.DamagePointParticleEffects           = new List <GameObject>()
            {
                CyclopsDefaultAssets.EXTERNAL_DAMAGE_POINT_PARTICLES,
            };
            externalDamageManager.DamagePointGameObjects = new List <GameObject>()
            {
                CyclopsDefaultAssets.EXTERNAL_DAMAGE_POINT,
            };

            InternalFireManager internalFireManager = submarine.GetOrAddComponent <InternalFireManager>();

            internalFireManager.SubmarineLiveMixin = liveMixin;
            internalFireManager.FirePoints         = submarine.FindChild("PointsOfInterest").FindChild("FirePoints").transform;
            internalFireManager.FirePrefabs        = new List <GameObject>()
            {
                CyclopsDefaultAssets.CYCLOPS_FIRE,
            };
            internalFireManager.DamageDonePerFirePerSecond = 5f;
            internalFireManager.Submarine = mantaSubmarine;
            internalFireManager.ChancePerDamageTakenToSpawnFire = 5;

            AutoRegenConditional autoRegen = submarine.GetOrAddComponent <AutoRegenConditional>();

            autoRegen.InternalFireManager   = internalFireManager;
            autoRegen.ExternalDamageManager = externalDamageManager;
            autoRegen.LiveMixin             = liveMixin;
            autoRegen.RegenPerSecond        = 2f;

            InternalLeakManager internalLeakManage = submarine.GetOrAddComponent <InternalLeakManager>();

            internalLeakManage.LeakPrefabs = new List <GameObject>()
            {
                CyclopsDefaultAssets.WATER_LEAK
            };

            DeathManager deathManager = submarine.GetOrAddComponent <DeathManager>();

            deathManager.DeathPreparationTime = 22f;

            BasicDeath basicDeath = submarine.GetOrAddComponent <BasicDeath>();

            basicDeath.TimeTillDeletionOfSub = 60f;
            basicDeath.FallSpeed             = 2f;

            CyclopsDeathExplosion cyclopsDeathExplosion = submarine.GetOrAddComponent <CyclopsDeathExplosion>();

            cyclopsDeathExplosion.TimeToExplosionAfterDeath = 18f;
            cyclopsDeathExplosion.FMODAsset = CyclopsDefaultAssets.CYCLOPS_EXPLOSION_FMOD;

            CyclopsAbandonShip cyclopsAbandonShip = submarine.GetOrAddComponent <CyclopsAbandonShip>();

            cyclopsAbandonShip.TimeToCalloutAfterDeath = 0f;
            cyclopsAbandonShip.FMODAsset = CyclopsDefaultAssets.AI_ABANDON;

            DestabiliseOnSubDeath      destabiliseOnSubDeath      = submarine.GetOrAddComponent <DestabiliseOnSubDeath>();
            KillPlayerInsideOnSubDeath killPlayerInsideOnSubDeath = submarine.GetOrAddComponent <KillPlayerInsideOnSubDeath>();

            // Temp screens
            GameObject helmMantaOSScreen            = submarine.FindChild("PointsOfInterest").FindChild("UpgradesAndBatteries").FindChild("HelmScreen").FindChild("Canvas");
            GameObject rearMantaOSScreen            = submarine.FindChild("PointsOfInterest").FindChild("UpgradesAndBatteries").FindChild("UpgradeScreen").FindChild("Canvas");
            GameObject steeringConsoleMantaOSScreen = submarine.FindChild("PointsOfInterest").FindChild("SteeringConsole").FindChild("Canvas");

            Object.Instantiate(MantaAssetLoader.MANTA_OS_MAIN_LAYOUT_PAGE).transform.SetParent(helmMantaOSScreen.transform, false);
            Object.Instantiate(MantaAssetLoader.MANTAOS_OFFLINE_PAGE).transform.SetParent(rearMantaOSScreen.transform, false);
            Object.Instantiate(MantaAssetLoader.MANTAOS_OFFLINE_PAGE).transform.SetParent(steeringConsoleMantaOSScreen.transform, false);

            SMLHelper.V2.Handlers.TechTypeHandler.TryGetModdedTechType(UNIQUE_ID, out TechType mantaTechType);
            PingType     mantaPingType = CustomBeaconManager.RegisterNewPingType(mantaTechType, NAME, MantaAssetLoader.MANTA_PING_ICON);
            PingInstance pingInstance  = CustomBeaconManager.AddNewBeacon(submarine, mantaPingType, "HMS Unknown Manta");
        }
コード例 #2
0
        private void DrawMantaDebugMenu()
        {
            if (GUILayout.Button("Spawn manta"))
            {
                GameObject gameObject2 = MantaMod.CreateManta();
                manta = gameObject2.GetComponent <MantaSubmarine>();
                mantaMovementController        = gameObject2.GetComponent <MovementController>();
                gameObject2.transform.position = Camera.main.transform.position + Camera.main.transform.forward * 22f;
                gameObject2.transform.LookAt(Player.main.transform);
            }

            if (GUILayout.Button("Connect to manta on cursor"))
            {
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                if (Physics.Raycast(ray, out RaycastHit hit))
                {
                    if (hit.rigidbody.gameObject.name.ToLower().Contains("manta"))
                    {
                        manta = hit.rigidbody.gameObject.GetComponent <MantaSubmarine>();
                        mantaMovementController = hit.rigidbody.gameObject.GetComponent <MovementController>();
                    }
                }
            }

            if (GUILayout.Button("Manta Count"))
            {
                MantaSubmarine[] submarines = FindObjectsOfType <MantaSubmarine>();
                Log.Print("Found " + submarines.Length + " Mantas");
            }

            if (GUILayout.Button("Delete All Mantas"))
            {
                MantaSubmarine[] submarines = FindObjectsOfType <MantaSubmarine>();
                Log.Print("Found " + submarines.Length + " Mantas to delete");
                foreach (MantaSubmarine s in submarines)
                {
                    Destroy(s.gameObject);
                }
            }

            if (GUILayout.Button("Manta render materials on raycast"))
            {
                Ray ray4 = Camera.main.ScreenPointToRay(Input.mousePosition);
                if (Physics.Raycast(ray4, out RaycastHit raycastHit4))
                {
                    if (raycastHit4.rigidbody.gameObject.name.ToLower().Contains("manta"))
                    {
                        Transform gggg1 = raycastHit4.rigidbody.gameObject.transform.Find("Model").transform.Find("Exterior");
                        Log.Print("Materials count: " + gggg1.GetComponent <MeshRenderer>().materials.Length);
                        foreach (Material mat in gggg1.GetComponent <MeshRenderer>().materials)
                        {
                            if (mat.name.ToLower().Contains("glass"))
                            {
                                mat.PrintAllMarmosetUBERShaderProperties();
                            }
                        }
                    }
                }
            }

            if (manta == null)
            {
                GUILayout.Box("No Manta Connected");
                return;
            }

            GUILayout.Box("Current Health: " + manta.GetComponent <LiveMixin>()?.health);
            GUILayout.Box("Max Health: " + manta.GetComponent <LiveMixin>()?.maxHealth);
            GUILayout.Box("Health Per Damage Point: " + manta.GetComponent <ExternalDamageManager>().GetHealthPerDamagePoint());
            GUILayout.Box("Unused Damage Point: " + manta.GetComponent <ExternalDamageManager>().GetUnusedDamagePointsCount());
            GUILayout.Box("Used Damage Point: " + manta.GetComponent <ExternalDamageManager>().GetUsedDamagePointsCount());
            GUILayout.Box("Amount of Damage Points that *should* be showing: " + manta.GetComponent <ExternalDamageManager>().GetNumberOfDamagePointsThatShouldBeShowing());

            if (GUILayout.Button("Toggle Emergency Lighting"))
            {
                if (manta.GetComponent <EmergencyLighting>().IsRunning)
                {
                    manta.GetComponent <EmergencyLighting>().DisableEmergencyLighting();
                }
                else
                {
                    manta.GetComponent <EmergencyLighting>().EnableEmergencyLighting();
                }
            }
        }
コード例 #3
0
        /**
         * If the component requires other custom components then do it here.
         * Read the comment on Components.MantaSeializationFixer if you wish to understand why this horrible system exists.
         */
        public static void SetUpManta(GameObject submarine)
        {
            MantaSubmarine     mantaSubmarine     = submarine.GetComponent <MantaSubmarine>();
            Transform          applyForceLocation = submarine.FindChild("PointsOfInterest").FindChild("ForceAppliedLocation").transform;
            MovementController movementController = submarine.GetOrAddComponent <MovementController>();

            movementController.ApplyForceLocation = applyForceLocation;

            GameObject doorLeft = submarine.FindChild("PointsOfInterest").FindChild("PlayerEntranceLeftFlap");

            doorLeft.GetComponentInChildren <HingeJoint>().connectedBody = submarine.GetComponent <Rigidbody>();
            HingeJointDoor hingeDoorLeft = doorLeft.GetOrAddComponent <HingeJointDoor>();

            hingeDoorLeft.OverwriteTargetVelocity = true;
            hingeDoorLeft.TargetVelocity          = 150f;
            hingeDoorLeft.TriggerToEverything     = false;
            hingeDoorLeft.TriggerToPlayer         = true;
            hingeDoorLeft.TriggerToVehicles       = false;
            hingeDoorLeft.OpenSound  = CyclopsDefaultAssets.PLAYER_HATCH_OPEN;
            hingeDoorLeft.CloseSound = CyclopsDefaultAssets.PLAYER_HATCH_CLOSE;

            GameObject doorRight = submarine.FindChild("PointsOfInterest").FindChild("PlayerEntranceRightFlap");

            doorRight.GetComponentInChildren <HingeJoint>().connectedBody = submarine.GetComponent <Rigidbody>();
            HingeJointDoor hingeDoorRight = doorRight.GetOrAddComponent <HingeJointDoor>();

            hingeDoorRight.OverwriteTargetVelocity = true;
            hingeDoorRight.TargetVelocity          = 150f;
            hingeDoorRight.TriggerToEverything     = false;
            hingeDoorRight.TriggerToPlayer         = true;
            hingeDoorRight.TriggerToVehicles       = false;
            hingeDoorRight.OpenSound  = CyclopsDefaultAssets.PLAYER_HATCH_OPEN;
            hingeDoorRight.CloseSound = CyclopsDefaultAssets.PLAYER_HATCH_CLOSE;

            GameObject vehicleDoorLeft = submarine.FindChild("PointsOfInterest").FindChild("VehicleEntranceLeftFlap");

            vehicleDoorLeft.GetComponentInChildren <HingeJoint>().connectedBody = submarine.GetComponent <Rigidbody>();
            HingeJointDoor hingeVehicleDoorLeft = vehicleDoorLeft.GetOrAddComponent <HingeJointDoor>();

            hingeVehicleDoorLeft.OverwriteTargetVelocity = true;
            hingeVehicleDoorLeft.TargetVelocity          = 150f;
            hingeVehicleDoorLeft.TriggerToEverything     = false;
            hingeVehicleDoorLeft.TriggerToPlayer         = false;
            hingeVehicleDoorLeft.TriggerToVehicles       = true;
            hingeVehicleDoorLeft.OpenSound  = CyclopsDefaultAssets.DOCKING_DOORS_OPEN;
            hingeVehicleDoorLeft.CloseSound = CyclopsDefaultAssets.DOCKING_DOORS_CLOSE;

            GameObject vehicleDoorRight = submarine.FindChild("PointsOfInterest").FindChild("VehicleEntranceRightFlap");

            vehicleDoorRight.GetComponentInChildren <HingeJoint>().connectedBody = submarine.GetComponent <Rigidbody>();
            HingeJointDoor hingeVehicleDoorRight = vehicleDoorRight.GetOrAddComponent <HingeJointDoor>();

            hingeVehicleDoorRight.OverwriteTargetVelocity = true;
            hingeVehicleDoorRight.TargetVelocity          = 150f;
            hingeVehicleDoorRight.TriggerToEverything     = false;
            hingeVehicleDoorRight.TriggerToPlayer         = false;
            hingeVehicleDoorRight.TriggerToVehicles       = true;
            hingeVehicleDoorRight.OpenSound  = CyclopsDefaultAssets.DOCKING_DOORS_OPEN;
            hingeVehicleDoorRight.CloseSound = CyclopsDefaultAssets.DOCKING_DOORS_CLOSE;

            GameObject    entrancePosition      = submarine.FindChild("PointsOfInterest").FindChild("EntranceTeleportSpot");
            GameObject    entranceHatch         = submarine.FindChild("PointsOfInterest").FindChild("PlayerEntrance").FindChild("Base");
            EntranceHatch entranceHatchTeleport = entranceHatch.GetOrAddComponent <EntranceHatch>();

            entranceHatchTeleport.HoverText         = "Board Manta";
            entranceHatchTeleport.HoverHandReticle  = HandReticle.IconType.Hand;
            entranceHatchTeleport.TeleportTarget    = entrancePosition;
            entranceHatchTeleport.Submarine         = mantaSubmarine;
            entranceHatchTeleport.EnteringSubmarine = true;

            GameObject    leavePosition      = submarine.FindChild("PointsOfInterest").FindChild("LeaveTeleportSpot");
            GameObject    leaveHatch         = submarine.FindChild("PointsOfInterest").FindChild("PlayerEntrance").FindChild("Top");
            EntranceHatch leaveHatchTeleport = leaveHatch.GetOrAddComponent <EntranceHatch>();

            leaveHatchTeleport.HoverText         = "Disembark Manta";
            leaveHatchTeleport.HoverHandReticle  = HandReticle.IconType.Hand;
            leaveHatchTeleport.TeleportTarget    = leavePosition;
            leaveHatchTeleport.Submarine         = mantaSubmarine;
            leaveHatchTeleport.EnteringSubmarine = false;

            GameObject      steeringConsolePOI             = submarine.FindChild("PointsOfInterest").FindChild("SteeringConsole");
            GameObject      steeringConsoleLeftHandTarget  = submarine.FindChild("PointsOfInterest").FindChild("SteeringConsole").FindChild("LeftIKTarget");
            GameObject      steeringConsoleRightHandTarget = submarine.FindChild("PointsOfInterest").FindChild("SteeringConsole").FindChild("RightIKTarget");
            GameObject      playerParentWhilePiloting      = submarine.FindChild("PointsOfInterest").FindChild("SteeringConsole").FindChild("PlayerLockedWhileSteeringPosition");
            SteeringConsole steeringConsole = steeringConsolePOI.GetOrAddComponent <SteeringConsole>();

            steeringConsole.MovementController    = submarine.GetComponent <MovementController>();
            steeringConsole.ParentWhilePilotingGO = playerParentWhilePiloting;
            steeringConsole.LeftHandIKTarget      = steeringConsoleLeftHandTarget;
            steeringConsole.RightHandIKTarget     = steeringConsoleRightHandTarget;
            steeringConsole.Submarine             = mantaSubmarine;

            CyclopsCollisionSounds collisionSounds = submarine.GetOrAddComponent <CyclopsCollisionSounds>();

            MovementData normalSpeedMovementData = new MovementData
            {
                ForwardAccelerationSpeed   = 5f,
                BackwardsAccelerationSpeed = 3f,
                AscendDescendSpeed         = 3f,
                RotationSpeed = 0.3f,
                StrafeSpeed   = 2f
            };

            EngineManager engineManager = submarine.GetOrAddComponent <EngineManager>();

            engineManager.SetMovementDataForEngineState(EngineState.SLOW, normalSpeedMovementData);
            engineManager.SetMovementDataForEngineState(EngineState.NORMAL, normalSpeedMovementData);
            engineManager.SetMovementDataForEngineState(EngineState.FAST, normalSpeedMovementData);
            engineManager.SetMovementDataForEngineState(EngineState.SPECIAL, normalSpeedMovementData);

            CyclopsStartupPowerDownSequence   cyclopsStartupPowerDownSequence   = submarine.GetOrAddComponent <CyclopsStartupPowerDownSequence>();
            CyclopsEngineStateChangedCallouts cyclopsEngineStateChangedCallouts = submarine.GetOrAddComponent <CyclopsEngineStateChangedCallouts>();

            movementController.EngineManager = engineManager;
            CyclopsWelcomeCallout cyclopsWelcomeCallout = submarine.GetOrAddComponent <CyclopsWelcomeCallout>();
            CyclopsEngineSound    cyclopsEngineSound    = submarine.GetOrAddComponent <CyclopsEngineSound>();

            cyclopsEngineSound.RampUpSpeed   = 0.2f;
            cyclopsEngineSound.RampDownSpeed = 0.2f;
            movementController.EngineSound   = cyclopsEngineSound;

            OxygenReplenishment oxygenReplenishment = submarine.GetOrAddComponent <OxygenReplenishment>();

            oxygenReplenishment.OxygenPerSecond  = 15f;
            oxygenReplenishment.OxygenEnergyCost = 0.1f;

            LiveMixin liveMixin = submarine.GetOrAddComponent <LiveMixin>();

            liveMixin.data           = CyclopsLiveMixinData.Get(); // TO:DO Create a proper health system for the manta.
            liveMixin.data.knifeable = true;                       // TO:DO remove just here for testing purposes.
            liveMixin.data.maxHealth = 500;

            GameObject externalLights = submarine.FindChild("Lights").FindChild("Exterior");
            GameObject internalLights = submarine.FindChild("Lights").FindChild("Interior");

            LightsManager lightsManager      = submarine.GetOrAddComponent <LightsManager>();
            List <Light>  internalLightsList = new List <Light>();
            List <Light>  externalLightsList = new List <Light>();

            foreach (Light light in externalLights.GetComponentsInChildren <Light>())
            {
                externalLightsList.Add(light);
            }
            foreach (Light light in internalLights.GetComponentsInChildren <Light>())
            {
                internalLightsList.Add(light);
            }
            lightsManager.ExternalLights              = externalLightsList;
            lightsManager.InternalLights              = internalLightsList;
            lightsManager.ExternalLightsOnIntensity   = 1.5f;
            lightsManager.ExternalLightsOffIntensity  = 0f;
            lightsManager.InternalLightsOnIntensity   = 1.5f;
            lightsManager.InternalLightsOffIntensity  = 0f;
            lightsManager.EnableInternalLightsOnStart = true;
            lightsManager.EnableExternalLightsOnStart = true;

            CyclopsUnderAttackEmergencyLighting emergencyLighting = submarine.GetOrAddComponent <CyclopsUnderAttackEmergencyLighting>();

            emergencyLighting.LightsAffected = internalLightsList;

            submarine.GetOrAddComponent <CyclopsUnderAttackCallout>();

            ExternalDamageManager externalDamageManager = submarine.GetOrAddComponent <ExternalDamageManager>();

            externalDamageManager.DamagePoints       = submarine.FindChild("PointsOfInterest").FindChild("DamagePoints").transform;
            externalDamageManager.SubmarineLiveMixin = liveMixin;
            externalDamageManager.LiveMixinDataForExternalDamagePoints = CyclopsExternalDamagePointLiveMixinData.Get();
            externalDamageManager.DamagePointParticleEffects           = new List <GameObject>()
            {
                CyclopsDefaultAssets.EXTERNAL_DAMAGE_POINT_PARTICLES,
            };
            externalDamageManager.DamagePointGameObjects = new List <GameObject>()
            {
                CyclopsDefaultAssets.EXTERNAL_DAMAGE_POINT,
            };

            InternalFireManager internalFireManager = submarine.GetOrAddComponent <InternalFireManager>();

            internalFireManager.SubmarineLiveMixin = liveMixin;
            internalFireManager.FirePoints         = submarine.FindChild("PointsOfInterest").FindChild("FirePoints").transform;
            internalFireManager.FirePrefabs        = new List <GameObject>()
            {
                CyclopsDefaultAssets.CYCLOPS_FIRE,
            };
            internalFireManager.DamageDonePerFirePerSecond = 5f;
            internalFireManager.Submarine = mantaSubmarine;
            internalFireManager.ChancePerDamageTakenToSpawnFire = 5;

            AutoRegenConditional autoRegen = submarine.GetOrAddComponent <AutoRegenConditional>();

            autoRegen.InternalFireManager   = internalFireManager;
            autoRegen.ExternalDamageManager = externalDamageManager;
            autoRegen.LiveMixin             = liveMixin;
            autoRegen.RegenPerSecond        = 2f;
        }