Beispiel #1
0
        public static AntennaTarget LoadFromConfig(ConfigNode node, RealAntenna ra)
        {
            var go = AntennaTargetManager.AcquireTarget(ra);

            foreach (var del in go.GetComponents <AntennaTarget>())
            {
                Destroy(del);
            }
            AntennaTarget t = null;
            string        n = string.Empty;

            if (node.TryGetValue("name", ref n))
            {
                if (n.Equals(TargetMode.BodyLatLonAlt.ToString()))
                {
                    t = go.AddComponent <AntennaTargetLatLonAlt>();
                }
                else if (n.Equals(TargetMode.Vessel.ToString()))
                {
                    t = go.AddComponent <AntennaTargetVessel>();
                }
                else if (n.Equals(TargetMode.AzEl.ToString()))
                {
                    t = go.AddComponent <AntennaTargetAzEl>();
                }
                else if (n.Equals(TargetMode.OrbitRelative.ToString()))
                {
                    t = go.AddComponent <AntennaTargetOrbitRelative>();
                }
                t?.Load(node);
            }
            return(t);
        }
        void GUIDisplay(int windowID)
        {
            Vessel parentVessel = (antenna?.ParentNode as RACommNode)?.ParentVessel;

            GUILayout.BeginVertical(HighLogic.Skin.box);
            GUILayout.Label($"Vessel: {parentVessel?.name ?? "None"}");
            GUILayout.Label($"Antenna: {antenna.Name}");
            GUILayout.Label($"Band: {antenna.RFBand.name}       Power: {antenna.TxPower}dBm");
            GUILayout.Label($"Target: {antenna.Target}");
            GUILayout.EndVertical();
            GUILayout.Space(7);

            GUILayout.BeginVertical(HighLogic.Skin.box);
            GUILayout.BeginHorizontal();
            if (GUILayout.Button($"Target Mode: {targetMode.displayName}"))
            {
                targetMode = GetNextTargetMode();
            }
            showTargetModeInfo = GUILayout.Toggle(showTargetModeInfo, "ⓘ", HighLogic.Skin.button, GUILayout.ExpandWidth(false), GUILayout.Height(20));
            GUILayout.EndHorizontal();
            if (showTargetModeInfo)
            {
                GUILayout.Label(targetMode.hint, GUILayout.ExpandWidth(true));
                if (GameDatabase.Instance.GetTexture(targetMode.texture, false) is Texture2D tex)
                {
                    GUILayout.Box(tex, GUILayout.Height(200), GUILayout.Width(200));
                }
            }
            GUILayout.EndVertical();
            GUILayout.Space(7);

            GUILayout.BeginVertical(HighLogic.Skin.box);
            var sortIcon = GetSortIcon(sortMode);

            if (targetMode.mode == TargetMode.Vessel)
            {
                GUILayout.BeginHorizontal();
                foreach (var vType in TextureTools.vesselTypes)
                {
                    if (TextureTools.filterTextures.TryGetValue(vType, out Texture2D tex))
                    {
                        TextureTools.filterStates[vType] = GUILayout.Toggle(TextureTools.filterStates[vType], tex, HighLogic.Skin.button, GUILayout.Height(iconSize.y), GUILayout.Width(iconSize.x));
                    }
                }
                GUILayout.EndHorizontal();

                GUILayout.BeginHorizontal();
                GUILayout.Label(targetMode.text, GUILayout.ExpandWidth(true));
                HandleSortMode(sortIcon, parentVessel);
                GUILayout.EndHorizontal();

                scrollVesselPos = GUILayout.BeginScrollView(scrollVesselPos, GUILayout.Height(200), GUILayout.ExpandWidth(true));
                foreach (Vessel v in vessels)
                {
                    if (TextureTools.filterStates.TryGetValue(v.vesselType, out bool show) &&
                        show && GUILayout.Button(v.name))
                    {
                        var x = new ConfigNode(AntennaTarget.nodeName);
                        x.AddValue("name", $"{TargetMode.Vessel}");
                        x.AddValue("vesselId", v.id);
                        antenna.Target = AntennaTarget.LoadFromConfig(x, antenna);
                    }
                }
                GUILayout.EndScrollView();
            }
            if (targetMode.mode == TargetMode.BodyCenter)
            {
                GUILayout.BeginHorizontal();
                GUILayout.Label(targetMode.text, GUILayout.ExpandWidth(true));
                HandleSortMode(sortIcon);
                GUILayout.EndHorizontal();
                scrollBodyPos = GUILayout.BeginScrollView(scrollBodyPos, GUILayout.Height(200), GUILayout.ExpandWidth(true));
                foreach (CelestialBody body in FlightGlobals.Bodies)
                {
                    if (GUILayout.Button(body.name))
                    {
                        var x = new ConfigNode(AntennaTarget.nodeName);
                        x.AddValue("name", $"{AntennaTarget.TargetMode.BodyLatLonAlt}");
                        x.AddValue("bodyName", body.name);
                        x.AddValue("latLonAlt", new Vector3(0, 0, (float)-body.Radius));
                        antenna.Target = AntennaTarget.LoadFromConfig(x, antenna);
                    }
                }
                GUILayout.EndScrollView();
            }
            if (targetMode.mode == TargetMode.BodyLatLonAlt)
            {
                GUILayout.BeginVertical();
                GUILayout.BeginHorizontal();
                GUILayout.Label("Lat");
                sLat = GUILayout.TextField(sLat, 4);
                GUILayout.Label("Lon");
                sLon = GUILayout.TextField(sLon, 4);
                GUILayout.Label("Alt");
                sAlt = GUILayout.TextField(sAlt, 15);
                GUILayout.EndHorizontal();
                GUILayout.BeginHorizontal();
                GUILayout.Label(targetMode.text, GUILayout.ExpandWidth(true));
                HandleSortMode(sortIcon);
                GUILayout.EndHorizontal();
                scrollBodyPos = GUILayout.BeginScrollView(scrollBodyPos, GUILayout.Height(200), GUILayout.ExpandWidth(true));
                foreach (CelestialBody body in FlightGlobals.Bodies)
                {
                    if (GUILayout.Button(body.name))
                    {
                        var x = new ConfigNode(AntennaTarget.nodeName);
                        if (float.TryParse(sLat, out float flat) &&
                            float.TryParse(sLon, out float flon) &&
                            float.TryParse(sAlt, out float falt))
                        {
                            x.AddValue("name", $"{AntennaTarget.TargetMode.BodyLatLonAlt}");
                            x.AddValue("bodyName", body.name);
                            x.AddValue("latLonAlt", new Vector3(flat, flon, falt));
                            antenna.Target = AntennaTarget.LoadFromConfig(x, antenna);
                        }
                    }
                }
                GUILayout.EndScrollView();
                GUILayout.EndVertical();
            }
            if (targetMode.mode == TargetMode.AzEl)
            {
                GUILayout.BeginHorizontal();
                GUILayout.Label("Azimuth");
                sAzimuth = GUILayout.TextField(sAzimuth, 4);
                GUILayout.Label("Elevation");
                sElevation = GUILayout.TextField(sElevation, 4);
                GUILayout.EndHorizontal();
                if (GUILayout.Button("Apply"))
                {
                    var x = new ConfigNode(AntennaTarget.nodeName);
                    if (float.TryParse(sAzimuth, out float azimuth) &&
                        float.TryParse(sElevation, out float elevation))
                    {
                        azimuth   = Mathf.Clamp(azimuth, 0, 360);
                        elevation = Mathf.Clamp(elevation, -90, 90);
                        x.AddValue("name", $"{AntennaTarget.TargetMode.AzEl}");
                        x.AddValue("vesselId", parentVessel?.id);
                        x.AddValue("azimuth", azimuth);
                        x.AddValue("elevation", elevation);
                        antenna.Target = AntennaTarget.LoadFromConfig(x, antenna);
                    }
                }
            }
            if (targetMode.mode == TargetMode.OrbitRelative)
            {
                GUILayout.BeginHorizontal();
                GUILayout.Label("Deflection");
                sForward = GUILayout.TextField($"{deflection}", 5);
                GUILayout.Label("Elevation");
                sElevation = GUILayout.TextField(sElevation, 4);
                GUILayout.EndHorizontal();
                float.TryParse(sForward, out deflection);
                deflection = GUILayout.HorizontalSlider(deflection, -180, 180);
                if (GUILayout.Button("Apply"))
                {
                    var x = new ConfigNode(AntennaTarget.nodeName);
                    if (float.TryParse(sElevation, out float elevation))
                    {
                        deflection = Mathf.Clamp(deflection, -360, 360);
                        elevation  = Mathf.Clamp(elevation, -90, 90);
                        x.AddValue("name", $"{AntennaTarget.TargetMode.OrbitRelative}");
                        x.AddValue("vesselId", parentVessel?.id);
                        x.AddValue("forward", deflection);
                        x.AddValue("elevation", elevation);
                        antenna.Target = AntennaTarget.LoadFromConfig(x, antenna);
                    }
                }
            }
            GUILayout.EndVertical();
            GUILayout.Space(15);
            if (GUILayout.Button("Close"))
            {
                Destroy(this);
            }
            GUI.DragWindow();
        }