public Session()
        {
            UiInput            = new UiInput(this);
            HudUi              = new Hud(this);
            TargetUi           = new TargetUi(this);
            DsUtil             = new DSUtils(this);
            DsUtil2            = new DSUtils(this);
            StallReporter      = new StallReporter();
            InnerStallReporter = new StallReporter();
            Av                     = new RunAv(this);
            Api                    = new ApiBackend(this);
            ApiServer              = new ApiServer(this);
            Projectiles            = new Projectiles.Projectiles(this);
            AcqManager             = new AcquireManager(this);
            TerminalMon            = new TerminalMonitor(this);
            _cachedEwarPacket.Data = new List <EwarValues>(32);

            ProblemRep            = new ProblemReport(this);
            VisDirToleranceCosine = Math.Cos(MathHelper.ToRadians(VisDirToleranceAngle));
            AimDirToleranceCosine = Math.Cos(MathHelper.ToRadians(AimDirToleranceAngle));

            VoxelCaches[ulong.MaxValue] = new VoxelCache();

            HeatEmissives = CreateHeatEmissive();
            LoadVanillaData();

            for (int i = 0; i < AuthorSettings.Length; i++)
            {
                AuthorSettings[i] = -1;
            }
        }
    // Start is called before the first frame update
    void Start()
    {
        jobList     = new List <Job>();
        etaClock    = GameObject.Find("ETA Clock").GetComponentInChildren <TerminalMonitor>();
        ship        = GameObject.Find("Ship").GetComponent <Ship>();
        blackScreen = GameObject.Find("Black Screen").GetComponent <BlackScreen>();
        navTerm     = GameObject.Find("NAVCOM_Terminal").GetComponent <Terminal>();
        powerTerm   = GameObject.Find("Power_Terminal").GetComponent <Terminal>();
        engineTerm  = GameObject.Find("Engine_Terminal").GetComponent <Terminal>();
        coolingTerm = GameObject.Find("Cooling_Terminal").GetComponent <Terminal>();


        // boombot = GameObject.Find("BoomBot");
        //boombot.SetActive(false);

        jobID               = new List <int>();
        jobNames            = new List <string>();
        destinations        = new List <string>();
        cargoNames          = new List <string>();
        cargoTypes          = new List <string>();
        cargoValues         = new List <float>();
        targetDeliveryTimes = new List <float>();
        jobTiers            = new List <int>();
        alreadyListed       = new List <bool>();

        GenerateJobPool();
        GenerateAvailableJobs();
    }
    // Update is called once per frame
    void Update()
    {
        UpdateInternalShipTemp();

        //Sets text output and sends it to the ship's main monitor.
        textOutput  = "Barrow Freight Interplanetary";
        textOutput += "\nShip Power usage: " + currentShipPowerConsumption + "/" + currentShipPowerCapacity + "Gw";
        textOutput += "\nCurrent  Ship Speed " + previousFrameShipSpeed + "LSPS";
        textOutput += "\nCurrent Ship Temp: " + currentShipTemp.ToString("F1") + "C";
        textOutput += "\nCurrent  Ship Cooling Rate: " + currentShipCoolingRate + "";
        textOutput += "\nShip Com Range: " + maxShipComRange + "KM";
        textOutput += "\nHeat Generation: " + totalShipHeatGeneration;
        textOutput += "\nCurrency: " + currency;

        TerminalMonitor monitor = GameObject.Find("Mission Monitor").GetComponentInChildren <TerminalMonitor>();

        monitor.WriteToMonitor(textOutput);



        //Reset current power usage, so that it does not continue to increase every frame.
        currentShipPowerConsumption = 0;
        currentShipPowerCapacity    = baseShipPowerCapacity;
        previousFrameShipSpeed      = currentShipSpeed;
        currentShipSpeed            = 10;
        currentShipCoolingRate      = baseShipCoolingRate;
        maxShipComRange             = 0;
        consumedShipCargoCapacity   = 0;
        //currentShipTemp = baseShipTemp;
        totalShipHeatGeneration = 0;
    }
    // Start is called before the first frame update
    void Start()
    {
        Transform firePSTransform = this.transform.Find("Fire Particle System");

        if (firePSTransform)
        {
            fire = this.transform.Find("Fire Particle System").gameObject;
            ps   = fire.GetComponent <ParticleSystem>();
        }

        currentFailureRate = baseFailureRate;

        jobsManager   = GameObject.Find("Game Managers").GetComponent <Jobs>();
        terminalStore = GameObject.Find("Game Managers").GetComponent <TerminalStore>();
        monitor       = GetComponentInChildren <TerminalMonitor>();

        Renderer rend = GetComponent <Renderer>();

        if (rend == null)
        {
            return;
        }

        switch (terminalType)
        {
        case TerminalTypes.PowerGenerator:
            rend.material.color = Color.yellow;
            label                  = "Power Generator";
            powerCapacity          = 1000;
            heatGeneration         = 500;
            positiveAttributeLabel = "Power Generated:\n";
            positiveAttribute      = powerCapacity;
            positiveAttributeUnit  = "Gw";
            break;

        case TerminalTypes.CoolingUnit:
            rend.material.color = Color.blue;
            label                  = "Cooling Unit";
            powerConsumption       = 100;
            coolingRate            = 300;
            positiveAttributeLabel = "Heat Dissipated:\n";
            positiveAttribute      = coolingRate;
            positiveAttributeUnit  = "BTUs";
            break;

        case TerminalTypes.EngineControl:
            rend.material.color = Color.red;
            label                  = "Engine Control";
            powerConsumption       = 200;
            heatGeneration         = 500;
            engineSpeed            = 1;
            positiveAttributeLabel = "Engine Speed:\n";
            positiveAttribute      = engineSpeed;
            positiveAttributeUnit  = "LSPS";
            break;

        case TerminalTypes.NAVCOMComputer:
            label = "NAV/COM Computer";
            //rend.material.color = Color.green;
            powerConsumption       = 50;
            heatGeneration         = 50;
            comRangeBoost          = 100;
            positiveAttributeLabel = "Com Range:\n";
            positiveAttribute      = comRangeBoost;
            positiveAttributeUnit  = "KM";
            break;

        default:
            break;
        }
    }
    // Update is called once per frame
    void Update()
    {
        handPosition = new Vector3(Camera.main.transform.localPosition.x, Camera.main.transform.localPosition.y - 1f, Camera.main.transform.localPosition.z + 1f);

        if (Input.GetMouseButtonDown(1))
        {
            viewLocked = false;
            GetComponent <FirstPersonController>().enabled = true;
            terminalBeepsScript.resetTerminalStartupAndRunningSound();
            terminalBeepsScript.terminalOffSound.Play();
        }

        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit rhInfo;

            //If an object is clicked...
            if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out rhInfo, interactionRange, ignorePlayerMask))
            {
                //Debug.Log("clicked on " + rhInfo.collider.name + " with tag" + rhInfo.collider.gameObject.tag);
                //Debug.Log("holding? "+ isHoldingObject + " " );

                //..and if that object is a Terminal Monitor
                if (rhInfo.collider.gameObject.tag == "TerminalMonitor")
                {
                    //Debug.Log("rhInfo.collider.gameObject.tag == TerminalMonitor");
                    //Debug.Log("Monitor Clicked");
                    viewLocked     = true;
                    targetMonitor  = rhInfo.collider.gameObject.GetComponent <TerminalMonitor>();
                    targetTerminal = targetMonitor.GetComponentInParent <Terminal>();

                    initialPlayerPosition  = transform.position;
                    lockedCameraPosition   = targetTerminal.transform.TransformPoint(Vector3.left * 1.25f);
                    lockedCameraPosition.y = initialPlayerPosition.y;

                    terminalBeepsManager.transform.position = targetTerminal.transform.position;
                    terminalBeepsScript.playInitialBeep();
                    terminalBeepsScript.playDelayedBeeps();
                    terminalBeepsScript.playTerminalStartupAndRunningSound();

                    if (targetTerminal.terminalType == Terminal.TerminalTypes.JobSelection)
                    {
                        jobsManager.GenerateAvailableJobs();
                    }

                    if (targetTerminal.terminalType == Terminal.TerminalTypes.TerminalStore)
                    {
                        terminalStore.GenerateAvailableTerminals();
                    }
                    //..and if that object is a terminal bay and the player holds an object
                }
                else if (rhInfo.collider.gameObject.tag == "TerminalBay")
                {
                    if (isHoldingObject)
                    {
                        placeObject(rhInfo.collider.gameObject);
                    }
                    else
                    {
                        //...and if that terminal bay already has an object installed.
                        targetBay = rhInfo.collider.gameObject.GetComponent <TerminalBay>();
                        if (targetBay.IsModuleInstalled())
                        {
                            //GameObject installedObject = targetBay.GetInstalledObject();
                            //portableObject po = installedObject.GetComponent<portableObject>();
                            //po.DeactivateObject();
                        }
                    }
                }
                else if (rhInfo.collider.gameObject.tag == "TerminalPlacementCollider")
                {
                    Debug.Log("placement Collider clicked");
                    targetTerminal = rhInfo.collider.gameObject.GetComponentInParent <Terminal>();

                    portableObject po = heldObject.GetComponent <portableObject>();
                    po.PlaceTerminal(targetTerminal.transform.position);

                    //...and if the object is not interactable and the player holds an object.
                }
                else if (isHoldingObject)     //end of if isHoldingObject and target is TerminalBay.
                {
                    dropObject();
                    //...and if the object is a movable object
                }
                else if (rhInfo.collider.gameObject.tag == "MovableObject")     // wasn't yet isHoldingObject
                {
                    portableObject po = rhInfo.collider.gameObject.GetComponent <portableObject>();
                    if (!po.IsObjectInstalled())
                    {
                        pickUpObject(rhInfo.collider.gameObject);
                    }
                    else
                    {
                        po.ActivateObject();
                    }
                }
            } //end of if a raycast hits something
        }     // end of if mouse button 0 is pressed

        if (Input.GetKeyDown(KeyCode.E))
        {
            if (isHoldingObject)
            {
                portableObject po = heldObject.GetComponent <portableObject>();
                if (po.IsFireExtinguisher())
                {
                    po.ToggleIsSpraying();

                    source = po.GetComponent <AudioSource>();
                    source.Play();

                    RaycastHit rhInfo;

                    //If an object is clicked...
                    if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out rhInfo, fireExtinguisherRange, ignorePlayerMask))
                    {
                        //..and if that object is a Fire Collider
                        if (rhInfo.collider.gameObject.tag == "FireCollider")
                        {
                            Debug.Log("FC clicked");
                            targetTerminal = rhInfo.collider.gameObject.transform.parent.gameObject.GetComponent <Terminal>();
                            if (targetTerminal.isBurning)
                            {
                                targetTerminal.ToggleIsBurning();
                            }
                        }
                        //    if (targetTerminal.isBurning)
                        //{
                        //    targetTerminal.ToggleIsBurning();
                        //}
                    }
                }
            }
        }

        if (Input.GetKeyUp(KeyCode.E))
        {
            if (isHoldingObject)
            {
                portableObject po = heldObject.GetComponent <portableObject>();
                if (po.IsFireExtinguisher())
                {
                    po.ToggleIsSpraying();
                }
            }
        }

        if (isHoldingObject)
        {
            MoveObjectToHands();
        }

        if (viewLocked)
        {
            GetComponent <FirstPersonController>().enabled = false;
            mainCamera.transform.LookAt(targetMonitor.transform);
            transform.position = lockedCameraPosition;
        }
    } // end of Update()