private void writeConfig(Config config)
        {
            ConfigNode root = new ConfigNode ();
            ConfigNode top = new ConfigNode (WASD_NODENAME);
            root.SetNode (WASD_NODENAME, top, true);
            top.SetValue ("defaultCamera", config.defaultCamera.ToString (), true);
            top.SetValue ("mouseWheelActive", config.mouseWheelActive.ToString (), true);
            top.SetValue ("enableExperimentalEditorExtensionsCompatibility", config.enableExperimentalEditorExtensionsCompatibility.ToString (), true);
            top.SetValue ("enforceBounds", config.enforceBounds.ToString (), true);
            top.SetValue ("sensitivity", config.sensitivity.ToString (), true);
            top.SetValue ("acceleration", config.acceleration.ToString (), true);
            top.SetValue ("mouseWheelAcceleration", config.mouseWheelAcceleration.ToString (), true);
            top.SetValue ("friction", config.friction.ToString (), true);
            top.SetValue ("runMultiplier", config.runMultiplier.ToString (), true);
            top.SetValue ("sneakMultiplier", config.sneakMultiplier.ToString (), true);

            ConfigNode keysNode = new ConfigNode ("KEYS");
            top.SetNode ("KEYS", keysNode, true);

            keysNode.SetValue ("forward", config.keyForward.ToString (), true);
            keysNode.SetValue ("back", config.keyBack.ToString (), true);
            keysNode.SetValue ("right", config.keyRight.ToString (), true);
            keysNode.SetValue ("left", config.keyLeft.ToString (), true);
            keysNode.SetValue ("up", config.keyUp.ToString (), true);
            keysNode.SetValue ("down", config.keyDown.ToString (), true);
            keysNode.SetValue ("switchMode", config.keySwitchMode.ToString (), true);
            keysNode.SetValue ("run", config.keyRun.ToString (), true);
            keysNode.SetValue ("sneak", config.keySneak.ToString (), true);

            ConfigNode editorsNode = new ConfigNode ("EDITORS");
            top.SetNode ("EDITORS", editorsNode, true);
            ConfigNode vabNode = new ConfigNode ("VAB");
            editorsNode.SetNode ("VAB", vabNode, true);
            string s;

            s = config.vab.initialPosition.ToString ();
            s = s.TrimStart ('(');
            s = s.TrimEnd (')');
            vabNode.SetValue ("initialPosition", s, true);
            vabNode.SetValue ("initialPitch", config.vab.initialPitch.ToString (), true);
            vabNode.SetValue ("initialYaw", config.vab.initialYaw.ToString (), true);
            ConfigNode vabBoundsNode = new ConfigNode ("BOUNDS");
            vabNode.SetNode ("BOUNDS", vabBoundsNode, true);
            s = config.vab.bounds.min.ToString ();
            s = s.TrimStart ('(');
            s = s.TrimEnd (')');
            vabBoundsNode.SetValue ("min", s, true);
            s = config.vab.bounds.max.ToString ();
            s = s.TrimStart ('(');
            s = s.TrimEnd (')');
            vabBoundsNode.SetValue ("max", s, true);

            // need to do bounds

            ConfigNode sphNode = new ConfigNode ("SPH");
            editorsNode.SetNode ("SPH", sphNode, true);
            s = config.sph.initialPosition.ToString ();
            s = s.TrimStart ('(');
            s = s.TrimEnd (')');
            sphNode.SetValue ("initialPosition", s, true);
            sphNode.SetValue ("initialPitch", config.sph.initialPitch.ToString (), true);
            sphNode.SetValue ("initialYaw", config.sph.initialYaw.ToString (), true);
            // need to do bounds
            ConfigNode sphBoundsNode = new ConfigNode ("BOUNDS");
            sphNode.SetNode ("BOUNDS", sphBoundsNode, true);
            s = config.sph.bounds.min.ToString ();
            s = s.TrimStart ('(');
            s = s.TrimEnd (')');

            sphBoundsNode.SetValue ("min", s, true);
            s = config.sph.bounds.max.ToString ();
            s = s.TrimStart ('(');
            s = s.TrimEnd (')');
            sphBoundsNode.SetValue ("max", s, true);

            root.Save (WASD_CFG_FILE);

            WasdEditorCameraBehaviour.setConfig (root);
        }
        private void Window(int id)
        {
            if (cfgWinData == false) {
                cfgWinData = true;

                if (!defaultsLoaded)
                    newconfig = WasdEditorCameraBehaviour.config;
                defaultsLoaded = false;

                strkeyForward = newconfig.keyForward.ToString ();
                strkeyBack = newconfig.keyBack.ToString ();
                strkeyRight = newconfig.keyRight.ToString ();
                strkeyLeft = newconfig.keyLeft.ToString ();
                strkeyUp = newconfig.keyUp.ToString ();
                strkeyDown = newconfig.keyDown.ToString ();
                strkeyRun = newconfig.keyRun.ToString ();
                strkeySneak = newconfig.keySneak.ToString ();
                strkeySwitchMode = newconfig.keySwitchMode.ToString ();

                cbkeyForward.SetSelectedItemIndex (strkeyForward, comboBoxList);
                cbkeyBack.SetSelectedItemIndex (strkeyBack, comboBoxList);
                cbkeyRight.SetSelectedItemIndex (strkeyRight, comboBoxList);
                cbkeyLeft.SetSelectedItemIndex (strkeyLeft, comboBoxList);
                cbkeyUp.SetSelectedItemIndex (strkeyUp, comboBoxList);
                cbkeyDown.SetSelectedItemIndex (strkeyDown, comboBoxList);
                cbkeyRun.SetSelectedItemIndex (strkeyRun, comboBoxList);
                cbkeySneak.SetSelectedItemIndex (strkeySneak, comboBoxList);
                cbkeySwitchMode.SetSelectedItemIndex (strkeySwitchMode, comboBoxList);

                strsensitivity = newconfig.sensitivity.ToString ();
                stracceleration = newconfig.acceleration.ToString ();
                strmouseWheelAcceleration = newconfig.mouseWheelAcceleration.ToString ();
                strfriction = newconfig.friction.ToString ();
                strrunMultiplier = newconfig.runMultiplier.ToString ();
                strsneakMultiplier = newconfig.sneakMultiplier.ToString ();

                strVabInitPosX = newconfig.vab.initialPosition.x.ToString ();
                strVabInitPosY = newconfig.vab.initialPosition.y.ToString ();
                strVabInitPosZ = newconfig.vab.initialPosition.z.ToString ();
                strVabInitPitch = newconfig.vab.initialPitch.ToString ();
                strVabInitYaw = newconfig.vab.initialYaw.ToString ();
                strVabBoundsMinX = newconfig.vab.bounds.min.x.ToString ();
                strVabBoundsMinY = newconfig.vab.bounds.min.y.ToString ();
                strVabBoundsMinZ = newconfig.vab.bounds.min.z.ToString ();
                strVabBoundsMaxX = newconfig.vab.bounds.max.x.ToString ();
                strVabBoundsMaxY = newconfig.vab.bounds.max.y.ToString ();
                strVabBoundsMaxZ = newconfig.vab.bounds.max.z.ToString ();

                strSphInitPosX = newconfig.sph.initialPosition.x.ToString ();
                strSphInitPosY = newconfig.sph.initialPosition.y.ToString ();
                strSphInitPosZ = newconfig.sph.initialPosition.z.ToString ();
                strSphInitPitch = newconfig.sph.initialPitch.ToString ();
                strSphInitYaw = newconfig.sph.initialYaw.ToString ();
                strSphBoundsMinX = newconfig.sph.bounds.min.x.ToString ();
                strSphBoundsMinY = newconfig.sph.bounds.min.y.ToString ();
                strSphBoundsMinZ = newconfig.sph.bounds.min.z.ToString ();
                strSphBoundsMaxX = newconfig.sph.bounds.max.x.ToString ();
                strSphBoundsMaxY = newconfig.sph.bounds.max.y.ToString ();
                strSphBoundsMaxZ = newconfig.sph.bounds.max.z.ToString ();

            }
            SetVisible (true);
            GUI.enabled = true;

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.EndHorizontal ();

            GUILayout.BeginArea (new Rect (10, 50, 375, 500));

            GUILayout.BeginVertical ();
            DrawTitle ("Keys");

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Key forward: ");
            #if true
            //			GUILayout.BeginArea (new Rect (10, 20, 300, 500));
            //			strkeyForward = comboBoxList[cbkeyForward.List (new Rect (125, 5, 150, 20), strkeyForward, comboBoxList, listStyle)].text;
            //			GUILayout.EndArea ();
            #endif
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Key back: ");
            #if true
            //			GUILayout.BeginArea (new Rect (10, 45, 300, 500));
            //			strkeyBack = comboBoxList[cbkeyBack.List (new Rect (125, 5, 150, 20), strkeyBack, comboBoxList, listStyle)].text;
            //			GUILayout.EndArea ();
            #endif
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Key right: ");
            #if true
            //			GUILayout.BeginArea (new Rect (10, 70, 300, 500));
            //			strkeyRight = comboBoxList[cbkeyRight.List (new Rect (125, 5, 150, 20), strkeyRight, comboBoxList, listStyle)].text;
            //			GUILayout.EndArea ();
            #endif
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Key left: ");
            #if true
            //			GUILayout.BeginArea (new Rect (10, 95, 300, 500));
            //			strkeyLeft = comboBoxList[cbkeyLeft.List (new Rect (125, 5, 150, 20), strkeyLeft, comboBoxList, listStyle)].text;
            //			GUILayout.EndArea ();
            #endif
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Key up: ");
            #if true
            //			GUILayout.BeginArea (new Rect (10, 120, 300, 500));
            //			strkeyUp = comboBoxList[cbkeyUp.List (new Rect (125, 5, 150, 20), strkeyUp, comboBoxList, listStyle)].text;
            //			GUILayout.EndArea ();
            #endif
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Key down: ");
            #if true
            //			GUILayout.BeginArea (new Rect (10, 145, 300, 500));
            //			strkeyDown = comboBoxList[cbkeyDown.List (new Rect (125, 5, 150, 20), strkeyDown, comboBoxList, listStyle)].text;
            //			GUILayout.EndArea ();
            #endif
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Key run: ");
            #if true
            //			GUILayout.BeginArea (new Rect (10, 170, 300, 500));
            //			strkeyRun = comboBoxList[cbkeyRun.List (new Rect (125, 5, 150, 20), strkeyRun, comboBoxList, listStyle)].text;
            //			GUILayout.EndArea ();
            #endif
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Key sneak: ");
            #if true
            //			GUILayout.BeginArea (new Rect (10, 195, 300, 500));
            //			strkeySneak = comboBoxList[cbkeySneak.List (new Rect (125, 5, 150, 20), strkeySneak, comboBoxList, listStyle)].text;
            //			GUILayout.EndArea ();
            #endif
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Key switch mode: ");
            #if true
            //			GUILayout.BeginArea (new Rect (10, 220, 300, 500));
            //			strkeySwitchMode = comboBoxList[cbkeySwitchMode.List (new Rect (125, 5, 150, 20), strkeySwitchMode, comboBoxList, listStyle)].text;
            //			GUILayout.EndArea ();
            #endif
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("");
            GUILayout.EndHorizontal ();

            DrawTitle ("VAB", true);

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Initial Position: ");
            GUILayout.FlexibleSpace ();
            strVabInitPosX = GUILayout.TextField (strVabInitPosX, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            strVabInitPosY = GUILayout.TextField (strVabInitPosY, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            strVabInitPosZ = GUILayout.TextField (strVabInitPosZ, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Initial Pitch: ");
            GUILayout.FlexibleSpace ();
            strVabInitPitch = GUILayout.TextField (strVabInitPitch, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Initial Yaw: ");
            GUILayout.FlexibleSpace ();
            strVabInitYaw = GUILayout.TextField (strVabInitYaw, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Bounds min: ");
            GUILayout.FlexibleSpace ();
            // x, y, z
            strVabBoundsMinX = GUILayout.TextField (strVabBoundsMinX, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            strVabBoundsMinY = GUILayout.TextField (strVabBoundsMinY, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            strVabBoundsMinZ = GUILayout.TextField (strVabBoundsMinZ, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Bounds max: ");
            GUILayout.FlexibleSpace ();
            // x, y, z
            strVabBoundsMaxX = GUILayout.TextField (strVabBoundsMaxX, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            strVabBoundsMaxY = GUILayout.TextField (strVabBoundsMaxY, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            strVabBoundsMaxZ = GUILayout.TextField (strVabBoundsMaxZ, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("");
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            if (GUILayout.Button ("Defaults", GUILayout.Width (125.0f))) {
                bool b = SetDefaults ();
                return;
            }
            GUILayout.EndHorizontal ();

            ///////////////////////////////////////////////
            /// These have to be here so that when they are clicked on, they will overwrite the other controls in the column
            ///

            #if true
            strkeyForward = comboBoxList [cbkeyForward.List (new Rect (135,25,150, 20), strkeyForward, comboBoxList, listStyle)].text;
            strkeyBack = comboBoxList [cbkeyBack.List (new Rect (135, 50, 150, 20), strkeyBack, comboBoxList, listStyle)].text;
            strkeyRight = comboBoxList [cbkeyRight.List (new Rect (135, 75, 150, 20), strkeyRight, comboBoxList, listStyle)].text;
            strkeyLeft = comboBoxList [cbkeyLeft.List (new Rect (135, 100, 150, 20), strkeyLeft, comboBoxList, listStyle)].text;
            strkeyUp = comboBoxList [cbkeyUp.List (new Rect (135, 125, 150, 20), strkeyUp, comboBoxList, listStyle)].text;
            strkeyDown = comboBoxList [cbkeyDown.List (new Rect (135, 150, 150, 20), strkeyDown, comboBoxList, listStyle)].text;
            strkeyRun = comboBoxList [cbkeyRun.List (new Rect (135, 175, 150, 20), strkeyRun, comboBoxList, listStyle)].text;
            strkeySneak = comboBoxList [cbkeySneak.List (new Rect (135, 200, 150, 20), strkeySneak, comboBoxList, listStyle)].text;
            strkeySwitchMode = comboBoxList [cbkeySwitchMode.List (new Rect (135, 225, 150, 20), strkeySwitchMode, comboBoxList, listStyle)].text;
            #endif
            GUILayout.EndVertical ();
            GUILayout.EndArea ();

            GUILayout.BeginArea (new Rect (400, 50, 300, 500));
            GUILayout.BeginVertical ();
            DrawTitle ("Misc");

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Exp Editor Ext. Compatibility: ");
            GUILayout.FlexibleSpace ();
            newconfig.enableExperimentalEditorExtensionsCompatibility =
                GUILayout.Toggle (newconfig.enableExperimentalEditorExtensionsCompatibility, "");
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Default Camera: ");
            GUILayout.FlexibleSpace ();
            newconfig.defaultCamera =
                GUILayout.Toggle (newconfig.defaultCamera, "");
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Mouse wheel active: ");
            GUILayout.FlexibleSpace ();
            newconfig.mouseWheelActive =
                GUILayout.Toggle (newconfig.mouseWheelActive, "");
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Enforce bounds: ");
            GUILayout.FlexibleSpace ();
            newconfig.enforceBounds =
                GUILayout.Toggle (newconfig.enforceBounds, "");
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Sensitivity: ");
            GUILayout.FlexibleSpace ();
            strsensitivity = GUILayout.TextField (strsensitivity, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Acceleration: ");
            GUILayout.FlexibleSpace ();
            stracceleration = GUILayout.TextField (stracceleration, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Mouse wheel acceleration: ");
            GUILayout.FlexibleSpace ();
            strmouseWheelAcceleration = GUILayout.TextField (strmouseWheelAcceleration, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Friction: ");
            GUILayout.FlexibleSpace ();
            strfriction = GUILayout.TextField (strfriction, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Run multiplier: ");
            GUILayout.FlexibleSpace ();
            strrunMultiplier = GUILayout.TextField (strrunMultiplier, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Sneak multiplier: ");
            GUILayout.FlexibleSpace ();
            strsneakMultiplier = GUILayout.TextField (strsneakMultiplier, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            GUILayout.EndHorizontal ();

            //GUILayout.BeginHorizontal (GUILayout.Height(20));
            //GUILayout.Label ("");
            //GUILayout.EndHorizontal ();

            DrawTitle ("SPH", true);

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Initial Position: ");
            GUILayout.FlexibleSpace ();
            strSphInitPosX = GUILayout.TextField (strSphInitPosX, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            strSphInitPosY = GUILayout.TextField (strSphInitPosY, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            strSphInitPosZ = GUILayout.TextField (strSphInitPosZ, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Initial Pitch: ");
            GUILayout.FlexibleSpace ();
            strSphInitPitch = GUILayout.TextField (strSphInitPitch, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Initial Yaw: ");
            GUILayout.FlexibleSpace ();
            strSphInitYaw = GUILayout.TextField (strSphInitYaw, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Bounds min: ");
            GUILayout.FlexibleSpace ();
            // x, y, z
            strSphBoundsMinX = GUILayout.TextField (strSphBoundsMinX, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            strSphBoundsMinY = GUILayout.TextField (strSphBoundsMinY, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            strSphBoundsMinZ = GUILayout.TextField (strSphBoundsMinZ, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("Bounds max: ");
            GUILayout.FlexibleSpace ();
            // x, y, z
            strSphBoundsMaxX = GUILayout.TextField (strSphBoundsMaxX, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            strSphBoundsMaxY = GUILayout.TextField (strSphBoundsMaxY, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            strSphBoundsMaxZ = GUILayout.TextField (strSphBoundsMaxZ, GUILayout.MinWidth (60.0F), GUILayout.MaxWidth (60.0F));
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));
            GUILayout.Label ("");
            GUILayout.EndHorizontal ();

            GUILayout.BeginHorizontal (GUILayout.Height(20));

            if (GUILayout.Button ("Save", GUILayout.Width (125.0f))) {
                writeConfig (newconfig);
                //WasdEditorCameraBehaviour.config.setConfig (newconfig);
                GUIToggle ();
            }

            if (GUILayout.Button ("Cancel", GUILayout.Width (125.0f))) {
                GUIToggle ();
            }
            GUILayout.EndHorizontal ();
            GUILayout.EndVertical ();
            GUILayout.EndArea ();

            try {
                newconfig.keyForward = (KeyCode)Enum.Parse (typeof(KeyCode), strkeyForward);
            } catch (Exception) {
            }
            try {
                newconfig.keyBack = (KeyCode)Enum.Parse (typeof(KeyCode), strkeyBack);
            } catch (Exception) {
            }
            try {
                newconfig.keyRight = (KeyCode)Enum.Parse (typeof(KeyCode), strkeyRight);
            } catch (Exception) {
            }
            try {
                newconfig.keyLeft = (KeyCode)Enum.Parse (typeof(KeyCode), strkeyLeft);
            } catch (Exception) {
            }
            try {
                newconfig.keyUp = (KeyCode)Enum.Parse (typeof(KeyCode), strkeyUp);
            } catch (Exception) {
            }
            try {
                newconfig.keyDown = (KeyCode)Enum.Parse (typeof(KeyCode), strkeyDown);
            } catch (Exception) {
            }
            try {
                newconfig.keyRun = (KeyCode)Enum.Parse (typeof(KeyCode), strkeyRun);
            } catch (Exception) {
            }
            try {
                newconfig.keySneak = (KeyCode)Enum.Parse (typeof(KeyCode), strkeySneak);
            } catch (Exception) {
            }
            try {
                newconfig.keySwitchMode = (KeyCode)Enum.Parse (typeof(KeyCode), strkeySwitchMode);
            } catch (Exception) {
            }

            try {
                newconfig.sensitivity = Convert.ToSingle (strsensitivity);
            } catch (Exception) {
            }

            try {
                newconfig.acceleration = Convert.ToSingle (stracceleration);
            } catch (Exception) {
            }
            try {
                newconfig.mouseWheelAcceleration = Convert.ToSingle (strmouseWheelAcceleration);
            } catch (Exception) {
            }

            try {
                newconfig.friction = Convert.ToSingle (strfriction);
            } catch (Exception) {
            }

            try {
                newconfig.runMultiplier = Convert.ToSingle (strrunMultiplier);
            } catch (Exception) {
            }

            try {
                newconfig.sneakMultiplier = Convert.ToSingle (strsneakMultiplier);
            } catch (Exception) {
            }

            try {
                newconfig.vab.initialPosition.x = Convert.ToSingle (strVabInitPosX);
            } catch (Exception) {
            }
            try {
                newconfig.vab.initialPosition.y = Convert.ToSingle (strVabInitPosY);
            } catch (Exception) {
            }
            try {
                newconfig.vab.initialPosition.z = Convert.ToSingle (strVabInitPosZ);
            } catch (Exception) {
            }

            try {
                newconfig.vab.initialPitch = Convert.ToSingle (strVabInitPitch);
            } catch (Exception) {
            }
            try {
                newconfig.vab.initialYaw = Convert.ToSingle (strVabInitYaw);
            } catch (Exception) {
            }

            float x, y, z;
            try {
                x = Convert.ToSingle (strVabBoundsMinX);
                y = Convert.ToSingle (strVabBoundsMinY);
                z = Convert.ToSingle (strVabBoundsMinZ);
                newconfig.vab.bounds.min = new Vector3 (x, y, z);
            } catch (Exception) {
            }
            try {
                x = Convert.ToSingle (strVabBoundsMaxX);
                y = Convert.ToSingle (strVabBoundsMaxY);
                z = Convert.ToSingle (strVabBoundsMaxZ);
                newconfig.vab.bounds.max = new Vector3 (x, y, z);
            } catch (Exception) {
            }

            try {
                newconfig.sph.initialPosition.x = Convert.ToSingle (strSphInitPosX);
            } catch (Exception) {
            }
            try {
                newconfig.sph.initialPosition.y = Convert.ToSingle (strSphInitPosY);
            } catch (Exception) {
            }
            try {
                newconfig.sph.initialPosition.z = Convert.ToSingle (strSphInitPosZ);
            } catch (Exception) {
            }

            try {
                newconfig.sph.initialPitch = Convert.ToSingle (strSphInitPitch);
            } catch (Exception) {
            }
            try {
                newconfig.sph.initialYaw = Convert.ToSingle (strSphInitYaw);
            } catch (Exception) {
            }

            try {
                x = Convert.ToSingle (strSphBoundsMinX);
                y = Convert.ToSingle (strSphBoundsMinY);
                z = Convert.ToSingle (strSphBoundsMinZ);
                newconfig.sph.bounds.min = new Vector3 (x, y, z);
            } catch (Exception) {
            }
            try {
                x = Convert.ToSingle (strSphBoundsMaxX);
                y = Convert.ToSingle (strSphBoundsMaxY);
                z = Convert.ToSingle (strSphBoundsMaxZ);
                newconfig.sph.bounds.max = new Vector3 (x, y, z);
            } catch (Exception) {
            }

            GUI.DragWindow ();
        }
        private Config readConfig()
        {
            log.Debug ("Loading config...");
            var root = GameDatabase.Instance.GetConfigs ("WASDEDITORCAMERA").First ().config;
            return gui.parseConfigNode (root);
            #if false
            Config config = new Config ();

            config.enableExperimentalEditorExtensionsCompatibility = Boolean.Parse (root.GetValue ("enableExperimentalEditorExtensionsCompatibility"));
            config.defaultCamera = Boolean.Parse (root.GetValue ("defaultCamera"));
            config.mouseWheelActive = Boolean.Parse (root.GetValue ("mouseWheelActive"));
            config.enforceBounds = Boolean.Parse (root.GetValue ("enforceBounds"));

            config.sensitivity = Single.Parse (root.GetValue ("sensitivity"));
            config.acceleration = Single.Parse (root.GetValue ("acceleration"));
            config.mouseWheelAcceleration = Single.Parse (root.GetValue ("mouseWheelAcceleration"));
            config.friction = Single.Parse (root.GetValue ("friction"));
            config.runMultiplier = Single.Parse (root.GetValue ("runMultiplier"));
            config.sneakMultiplier = Single.Parse (root.GetValue ("sneakMultiplier"));

            var keys = root.GetNode ("KEYS");
            config.keyForward = (KeyCode)ConfigNode.ParseEnum (typeof(KeyCode), keys.GetValue ("forward"));
            config.keyBack = (KeyCode)ConfigNode.ParseEnum (typeof(KeyCode), keys.GetValue ("back"));
            config.keyRight = (KeyCode)ConfigNode.ParseEnum (typeof(KeyCode), keys.GetValue ("right"));
            config.keyLeft = (KeyCode)ConfigNode.ParseEnum (typeof(KeyCode), keys.GetValue ("left"));
            config.keyUp = (KeyCode)ConfigNode.ParseEnum (typeof(KeyCode), keys.GetValue ("up"));
            config.keyDown = (KeyCode)ConfigNode.ParseEnum (typeof(KeyCode), keys.GetValue ("down"));
            config.keyRun = (KeyCode)ConfigNode.ParseEnum (typeof(KeyCode), keys.GetValue ("run"));
            config.keySneak = (KeyCode)ConfigNode.ParseEnum (typeof(KeyCode), keys.GetValue ("sneak"));
            config.keySwitchMode = (KeyCode)ConfigNode.ParseEnum (typeof(KeyCode), keys.GetValue ("switchMode"));

            var editors = root.GetNode ("EDITORS");
            config.vab = ParseEditorConfig (editors.GetNode ("VAB"));
            config.sph = ParseEditorConfig (editors.GetNode ("SPH"));

            log.Debug ("Config loaded.");
            return config;
            #endif
        }
        public void setConfig(Config cfg)
        {
            keyForward = cfg.keyForward;
            keyBack = cfg.keyBack;
            keyRight = cfg.keyRight;
            keyLeft = cfg.keyLeft;
            keyUp = cfg.keyUp;
            keyDown = cfg.keyDown;
            keyRun = cfg.keyRun;
            keySneak = cfg.keySneak;
            keySwitchMode = cfg.keySwitchMode;

            enableExperimentalEditorExtensionsCompatibility = cfg.enableExperimentalEditorExtensionsCompatibility;
            defaultCamera = cfg.defaultCamera;
            enforceBounds = cfg.enforceBounds;
            mouseWheelActive = cfg.mouseWheelActive;

            sensitivity = cfg.sensitivity;
            acceleration = cfg.acceleration;
            friction = cfg.friction;
            runMultiplier = cfg.runMultiplier;
            sneakMultiplier = cfg.sneakMultiplier;
            mouseWheelAcceleration = cfg.mouseWheelAcceleration;

            vab = cfg.vab;
            sph = cfg.sph;
        }
        public void Start()
        {
            log = new Log (this.GetType ().Name);
            log.Debug ("Start");

            if (gui == null) {
                gui = this.gameObject.AddComponent<MainMenuGui> ();
                gui.UpdateToolbarStock ();
                gui.SetVisible (false);

            }

            config = readConfig ();

            KspIssue3838Fix.ApplyFix (config.enableExperimentalEditorExtensionsCompatibility);

            editorFSM = (KerbalFSM)Refl.GetValue (EditorLogic.fetch, "\u0001");

            cursorLocker = Application.platform == RuntimePlatform.WindowsPlayer ? new WinCursorLocker () : (CursorLocker)new UnityLocker ();

            movementBounds = new Bounds ();
            if (EditorDriver.editorFacility == EditorFacility.VAB) {
                movementBounds = config.vab.bounds;
            } else if (EditorDriver.editorFacility == EditorFacility.SPH) {
                movementBounds = config.sph.bounds;
            }
            if (!config.enforceBounds) {
                movementBounds = new Bounds (Vector3.zero, Vector3.one * float.MaxValue);
            }

            var restartListener = new EventVoid.OnEvent (this.OnEditorRestart);
            GameEvents.onEditorRestart.Add (restartListener);
            OnCleanup += () => GameEvents.onEditorRestart.Remove (restartListener);

            var partEventListener = new EventData<ConstructionEventType, Part>.OnEvent (this.OnPartEvent);
            GameEvents.onEditorPartEvent.Add (partEventListener);
            OnCleanup += () => GameEvents.onEditorPartEvent.Remove (partEventListener);

            if (config.defaultCamera) {
                SwitchMode (false);
                ResetCamera ();
            }
        }