public override void OnGUI(Rect position, SerializedProperty prop, GUIContent label) { var hiddenValue = prop.FindPropertyRelative("hiddenValue"); var hiddenValueX = hiddenValue.FindPropertyRelative("x"); var hiddenValueY = hiddenValue.FindPropertyRelative("y"); SetBoldIfValueOverridePrefab(prop, hiddenValue); var cryptoKey = prop.FindPropertyRelative("currentCryptoKey"); var inited = prop.FindPropertyRelative("inited"); var fakeValue = prop.FindPropertyRelative("fakeValue"); var fakeValueActive = prop.FindPropertyRelative("fakeValueActive"); var currentCryptoKey = cryptoKey.intValue; var val = Vector2.zero; if (!inited.boolValue) { if (currentCryptoKey == 0) { currentCryptoKey = cryptoKey.intValue = ObscuredVector2.cryptoKeyEditor; } var ev = ObscuredVector2.Encrypt(Vector2.zero, currentCryptoKey); hiddenValueX.intValue = ev.x; hiddenValueY.intValue = ev.y; inited.boolValue = true; fakeValue.vector2Value = Vector2.zero; } else { var ev = new ObscuredVector2.RawEncryptedVector2 { x = hiddenValueX.intValue, y = hiddenValueY.intValue }; val = ObscuredVector2.Decrypt(ev, currentCryptoKey); } EditorGUI.BeginChangeCheck(); val = EditorGUI.Vector2Field(position, label, val); if (EditorGUI.EndChangeCheck()) { var ev = ObscuredVector2.Encrypt(val, currentCryptoKey); hiddenValueX.intValue = ev.x; hiddenValueY.intValue = ev.y; fakeValue.vector2Value = val; fakeValueActive.boolValue = true; } ResetBoldFont(); }
public static void MigrateObscuredTypesOnPrefabs() { if (!EditorUtility.DisplayDialog("ACTk Obscured types migration", "Are you sure you wish to scan all prefabs in your project and automatically migrate values to the new format?", "Yes", "No")) { Debug.Log(ActEditorGlobalStuff.LOG_PREFIX + "Obscured types migration was cancelled by user."); return; } AssetDatabase.SaveAssets(); string[] assets = AssetDatabase.FindAssets("t:ScriptableObject t:Prefab"); //string[] prefabs = AssetDatabase.FindAssets("TestPrefab"); int touchedCount = 0; int count = assets.Length; for (int i = 0; i < count; i++) { if (EditorUtility.DisplayCancelableProgressBar("Looking through objects", "Object " + (i + 1) + " from " + count, i / (float)count)) { Debug.Log(ActEditorGlobalStuff.LOG_PREFIX + "Obscured types migration was cancelled by user."); break; } string guid = assets[i]; string path = AssetDatabase.GUIDToAssetPath(guid); Object[] objects = AssetDatabase.LoadAllAssetsAtPath(path); foreach (Object unityObject in objects) { if (unityObject == null) { continue; } if (unityObject.name == "Deprecated EditorExtensionImpl") { continue; } bool modified = false; var so = new SerializedObject(unityObject); SerializedProperty sp = so.GetIterator(); if (sp == null) { continue; } while (sp.NextVisible(true)) { if (sp.propertyType != SerializedPropertyType.Generic) { continue; } string type = sp.type; switch (type) { case "ObscuredBool": { SerializedProperty hiddenValue = sp.FindPropertyRelative("hiddenValue"); SerializedProperty cryptoKey = sp.FindPropertyRelative("currentCryptoKey"); SerializedProperty fakeValue = sp.FindPropertyRelative("fakeValue"); SerializedProperty fakeValueChanged = sp.FindPropertyRelative("fakeValueChanged"); SerializedProperty fakeValueActive = sp.FindPropertyRelative("fakeValueActive"); SerializedProperty inited = sp.FindPropertyRelative("inited"); if (inited != null && inited.boolValue) { int currentCryptoKey = cryptoKey.intValue; bool real = ObscuredBool.Decrypt(hiddenValue.intValue, (byte)currentCryptoKey); bool fake = fakeValue.boolValue; if (real != fake) { Debug.Log(ActEditorGlobalStuff.LOG_PREFIX + "Fixed property " + sp.displayName + ":" + type + " at the object " + unityObject.name + "\n" + path); fakeValue.boolValue = real; if (fakeValueChanged != null) { fakeValueChanged.boolValue = true; } if (fakeValueActive != null) { fakeValueActive.boolValue = true; } modified = true; } } } break; case "ObscuredDouble": { SerializedProperty hiddenValue = sp.FindPropertyRelative("hiddenValue"); if (hiddenValue == null) { continue; } SerializedProperty hiddenValue1 = hiddenValue.FindPropertyRelative("b1"); SerializedProperty hiddenValue2 = hiddenValue.FindPropertyRelative("b2"); SerializedProperty hiddenValue3 = hiddenValue.FindPropertyRelative("b3"); SerializedProperty hiddenValue4 = hiddenValue.FindPropertyRelative("b4"); SerializedProperty hiddenValue5 = hiddenValue.FindPropertyRelative("b5"); SerializedProperty hiddenValue6 = hiddenValue.FindPropertyRelative("b6"); SerializedProperty hiddenValue7 = hiddenValue.FindPropertyRelative("b7"); SerializedProperty hiddenValue8 = hiddenValue.FindPropertyRelative("b8"); SerializedProperty hiddenValueOld = sp.FindPropertyRelative("hiddenValueOld"); if (hiddenValueOld != null && hiddenValueOld.isArray && hiddenValueOld.arraySize == 8) { hiddenValue1.intValue = hiddenValueOld.GetArrayElementAtIndex(0).intValue; hiddenValue2.intValue = hiddenValueOld.GetArrayElementAtIndex(1).intValue; hiddenValue3.intValue = hiddenValueOld.GetArrayElementAtIndex(2).intValue; hiddenValue4.intValue = hiddenValueOld.GetArrayElementAtIndex(3).intValue; hiddenValue5.intValue = hiddenValueOld.GetArrayElementAtIndex(4).intValue; hiddenValue6.intValue = hiddenValueOld.GetArrayElementAtIndex(5).intValue; hiddenValue7.intValue = hiddenValueOld.GetArrayElementAtIndex(6).intValue; hiddenValue8.intValue = hiddenValueOld.GetArrayElementAtIndex(7).intValue; hiddenValueOld.arraySize = 0; Debug.Log(ActEditorGlobalStuff.LOG_PREFIX + "Migrated property " + sp.displayName + ":" + type + " at the object " + unityObject.name + "\n" + path); modified = true; } #if UNITY_5_0_PLUS SerializedProperty cryptoKey = sp.FindPropertyRelative("currentCryptoKey"); SerializedProperty fakeValue = sp.FindPropertyRelative("fakeValue"); SerializedProperty fakeValueActive = sp.FindPropertyRelative("fakeValueActive"); SerializedProperty inited = sp.FindPropertyRelative("inited"); if (inited != null && inited.boolValue) { var union = new LongBytesUnion(); union.b8.b1 = (byte)hiddenValue1.intValue; union.b8.b2 = (byte)hiddenValue2.intValue; union.b8.b3 = (byte)hiddenValue3.intValue; union.b8.b4 = (byte)hiddenValue4.intValue; union.b8.b5 = (byte)hiddenValue5.intValue; union.b8.b6 = (byte)hiddenValue6.intValue; union.b8.b7 = (byte)hiddenValue7.intValue; union.b8.b8 = (byte)hiddenValue8.intValue; long currentCryptoKey = cryptoKey.longValue; double real = ObscuredDouble.Decrypt(union.l, currentCryptoKey); double fake = fakeValue.doubleValue; if (Math.Abs(real - fake) > 0.0000001d) { Debug.Log(ActEditorGlobalStuff.LOG_PREFIX + "Fixed property " + sp.displayName + ":" + type + " at the object " + unityObject.name + "\n" + path); fakeValue.doubleValue = real; fakeValueActive.boolValue = true; modified = true; } } #endif } break; case "ObscuredFloat": { SerializedProperty hiddenValue = sp.FindPropertyRelative("hiddenValue"); if (hiddenValue == null) { continue; } SerializedProperty hiddenValue1 = hiddenValue.FindPropertyRelative("b1"); SerializedProperty hiddenValue2 = hiddenValue.FindPropertyRelative("b2"); SerializedProperty hiddenValue3 = hiddenValue.FindPropertyRelative("b3"); SerializedProperty hiddenValue4 = hiddenValue.FindPropertyRelative("b4"); SerializedProperty hiddenValueOld = sp.FindPropertyRelative("hiddenValueOld"); if (hiddenValueOld != null && hiddenValueOld.isArray && hiddenValueOld.arraySize == 4) { hiddenValue1.intValue = hiddenValueOld.GetArrayElementAtIndex(0).intValue; hiddenValue2.intValue = hiddenValueOld.GetArrayElementAtIndex(1).intValue; hiddenValue3.intValue = hiddenValueOld.GetArrayElementAtIndex(2).intValue; hiddenValue4.intValue = hiddenValueOld.GetArrayElementAtIndex(3).intValue; hiddenValueOld.arraySize = 0; Debug.Log(ActEditorGlobalStuff.LOG_PREFIX + "Migrated property " + sp.displayName + ":" + type + " at the object " + unityObject.name + "\n" + path); modified = true; } SerializedProperty cryptoKey = sp.FindPropertyRelative("currentCryptoKey"); SerializedProperty fakeValue = sp.FindPropertyRelative("fakeValue"); SerializedProperty fakeValueActive = sp.FindPropertyRelative("fakeValueActive"); SerializedProperty inited = sp.FindPropertyRelative("inited"); if (inited != null && inited.boolValue) { var union = new IntBytesUnion(); union.b4.b1 = (byte)hiddenValue1.intValue; union.b4.b2 = (byte)hiddenValue2.intValue; union.b4.b3 = (byte)hiddenValue3.intValue; union.b4.b4 = (byte)hiddenValue4.intValue; int currentCryptoKey = cryptoKey.intValue; float real = ObscuredFloat.Decrypt(union.i, currentCryptoKey); float fake = fakeValue.floatValue; if (Math.Abs(real - fake) > 0.0000001f) { Debug.Log(ActEditorGlobalStuff.LOG_PREFIX + "Fixed property " + sp.displayName + ":" + type + " at the object " + unityObject.name + "\n" + path); fakeValue.floatValue = real; fakeValueActive.boolValue = true; modified = true; } } } break; case "ObscuredInt": { SerializedProperty hiddenValue = sp.FindPropertyRelative("hiddenValue"); SerializedProperty cryptoKey = sp.FindPropertyRelative("currentCryptoKey"); SerializedProperty fakeValue = sp.FindPropertyRelative("fakeValue"); SerializedProperty fakeValueActive = sp.FindPropertyRelative("fakeValueActive"); SerializedProperty inited = sp.FindPropertyRelative("inited"); if (inited != null && inited.boolValue) { int currentCryptoKey = cryptoKey.intValue; int real = ObscuredInt.Decrypt(hiddenValue.intValue, currentCryptoKey); int fake = fakeValue.intValue; if (real != fake) { Debug.Log(ActEditorGlobalStuff.LOG_PREFIX + "Fixed property " + sp.displayName + ":" + type + " at the object " + unityObject.name + "\n" + path); fakeValue.intValue = real; fakeValueActive.boolValue = true; modified = true; } } } break; #if UNITY_5_0_PLUS case "ObscuredLong": { SerializedProperty hiddenValue = sp.FindPropertyRelative("hiddenValue"); SerializedProperty cryptoKey = sp.FindPropertyRelative("currentCryptoKey"); SerializedProperty fakeValue = sp.FindPropertyRelative("fakeValue"); SerializedProperty fakeValueActive = sp.FindPropertyRelative("fakeValueActive"); SerializedProperty inited = sp.FindPropertyRelative("inited"); if (inited != null && inited.boolValue) { long currentCryptoKey = cryptoKey.longValue; long real = ObscuredLong.Decrypt(hiddenValue.longValue, currentCryptoKey); long fake = fakeValue.longValue; if (real != fake) { Debug.Log(ActEditorGlobalStuff.LOG_PREFIX + "Fixed property " + sp.displayName + ":" + type + " at the object " + unityObject.name + "\n" + path); fakeValue.longValue = real; fakeValueActive.boolValue = true; modified = true; } } } break; case "ObscuredShort": { SerializedProperty hiddenValue = sp.FindPropertyRelative("hiddenValue"); SerializedProperty cryptoKey = sp.FindPropertyRelative("currentCryptoKey"); SerializedProperty fakeValue = sp.FindPropertyRelative("fakeValue"); SerializedProperty fakeValueActive = sp.FindPropertyRelative("fakeValueActive"); SerializedProperty inited = sp.FindPropertyRelative("inited"); if (inited != null && inited.boolValue) { short currentCryptoKey = (short)cryptoKey.intValue; short real = ObscuredShort.EncryptDecrypt((short)hiddenValue.intValue, currentCryptoKey); short fake = (short)fakeValue.intValue; if (real != fake) { Debug.Log(ActEditorGlobalStuff.LOG_PREFIX + "Fixed property " + sp.displayName + ":" + type + " at the object " + unityObject.name + "\n" + path); fakeValue.intValue = real; fakeValueActive.boolValue = true; modified = true; } } } break; #endif case "ObscuredString": { SerializedProperty hiddenValue = sp.FindPropertyRelative("hiddenValue"); SerializedProperty cryptoKey = sp.FindPropertyRelative("currentCryptoKey"); SerializedProperty fakeValue = sp.FindPropertyRelative("fakeValue"); SerializedProperty fakeValueActive = sp.FindPropertyRelative("fakeValueActive"); SerializedProperty inited = sp.FindPropertyRelative("inited"); if (inited != null && inited.boolValue) { string currentCryptoKey = cryptoKey.stringValue; byte[] bytes = new byte[hiddenValue.arraySize]; for (int j = 0; j < hiddenValue.arraySize; j++) { bytes[j] = (byte)hiddenValue.GetArrayElementAtIndex(j).intValue; } string real = ObscuredString.EncryptDecrypt(GetString(bytes), currentCryptoKey); string fake = fakeValue.stringValue; if (real != fake) { Debug.Log(ActEditorGlobalStuff.LOG_PREFIX + "Fixed property " + sp.displayName + ":" + type + " at the object " + unityObject.name + "\n" + path); fakeValue.stringValue = real; fakeValueActive.boolValue = true; modified = true; } } } break; #if UNITY_5_0_PLUS case "ObscuredUInt": { SerializedProperty hiddenValue = sp.FindPropertyRelative("hiddenValue"); SerializedProperty cryptoKey = sp.FindPropertyRelative("currentCryptoKey"); SerializedProperty fakeValue = sp.FindPropertyRelative("fakeValue"); SerializedProperty fakeValueActive = sp.FindPropertyRelative("fakeValueActive"); SerializedProperty inited = sp.FindPropertyRelative("inited"); if (inited != null && inited.boolValue) { uint currentCryptoKey = (uint)cryptoKey.intValue; uint real = ObscuredUInt.Decrypt((uint)hiddenValue.intValue, currentCryptoKey); uint fake = (uint)fakeValue.intValue; if (real != fake) { Debug.Log(ActEditorGlobalStuff.LOG_PREFIX + "Fixed property " + sp.displayName + ":" + type + " at the object " + unityObject.name + "\n" + path); fakeValue.intValue = (int)real; fakeValueActive.boolValue = true; modified = true; } } } break; case "ObscuredULong": { SerializedProperty hiddenValue = sp.FindPropertyRelative("hiddenValue"); SerializedProperty cryptoKey = sp.FindPropertyRelative("currentCryptoKey"); SerializedProperty fakeValue = sp.FindPropertyRelative("fakeValue"); SerializedProperty fakeValueActive = sp.FindPropertyRelative("fakeValueActive"); SerializedProperty inited = sp.FindPropertyRelative("inited"); if (inited != null && inited.boolValue) { ulong currentCryptoKey = (ulong)cryptoKey.longValue; ulong real = ObscuredULong.Decrypt((ulong)hiddenValue.longValue, currentCryptoKey); ulong fake = (ulong)fakeValue.longValue; if (real != fake) { Debug.Log(ActEditorGlobalStuff.LOG_PREFIX + "Fixed property " + sp.displayName + ":" + type + " at the object " + unityObject.name + "\n" + path); fakeValue.longValue = (long)real; fakeValueActive.boolValue = true; modified = true; } } } break; #endif case "ObscuredVector2": { SerializedProperty hiddenValue = sp.FindPropertyRelative("hiddenValue"); if (hiddenValue == null) { continue; } SerializedProperty hiddenValueX = hiddenValue.FindPropertyRelative("x"); SerializedProperty hiddenValueY = hiddenValue.FindPropertyRelative("y"); SerializedProperty cryptoKey = sp.FindPropertyRelative("currentCryptoKey"); SerializedProperty fakeValue = sp.FindPropertyRelative("fakeValue"); SerializedProperty fakeValueActive = sp.FindPropertyRelative("fakeValueActive"); SerializedProperty inited = sp.FindPropertyRelative("inited"); if (inited != null && inited.boolValue) { ObscuredVector2.RawEncryptedVector2 ev = new ObscuredVector2.RawEncryptedVector2(); ev.x = hiddenValueX.intValue; ev.y = hiddenValueY.intValue; int currentCryptoKey = cryptoKey.intValue; Vector2 real = ObscuredVector2.Decrypt(ev, currentCryptoKey); Vector2 fake = fakeValue.vector2Value; if (real != fake) { Debug.Log(ActEditorGlobalStuff.LOG_PREFIX + "Fixed property " + sp.displayName + ":" + type + " at the object " + unityObject.name + "\n" + path); fakeValue.vector2Value = real; fakeValueActive.boolValue = true; modified = true; } } } break; case "ObscuredVector3": { SerializedProperty hiddenValue = sp.FindPropertyRelative("hiddenValue"); if (hiddenValue == null) { continue; } SerializedProperty hiddenValueX = hiddenValue.FindPropertyRelative("x"); SerializedProperty hiddenValueY = hiddenValue.FindPropertyRelative("y"); SerializedProperty hiddenValueZ = hiddenValue.FindPropertyRelative("z"); SerializedProperty cryptoKey = sp.FindPropertyRelative("currentCryptoKey"); SerializedProperty fakeValue = sp.FindPropertyRelative("fakeValue"); SerializedProperty fakeValueActive = sp.FindPropertyRelative("fakeValueActive"); SerializedProperty inited = sp.FindPropertyRelative("inited"); if (inited != null && inited.boolValue) { var ev = new ObscuredVector3.RawEncryptedVector3(); ev.x = hiddenValueX.intValue; ev.y = hiddenValueY.intValue; ev.z = hiddenValueZ.intValue; int currentCryptoKey = cryptoKey.intValue; Vector3 real = ObscuredVector3.Decrypt(ev, currentCryptoKey); Vector3 fake = fakeValue.vector3Value; if (real != fake) { Debug.Log(ActEditorGlobalStuff.LOG_PREFIX + "Fixed property " + sp.displayName + ":" + type + " at the object " + unityObject.name + "\n" + path); fakeValue.vector3Value = real; fakeValueActive.boolValue = true; modified = true; } } } break; } } if (modified) { touchedCount++; so.ApplyModifiedProperties(); EditorUtility.SetDirty(unityObject); } } } AssetDatabase.SaveAssets(); EditorUtility.ClearProgressBar(); if (touchedCount > 0) { Debug.Log(ActEditorGlobalStuff.LOG_PREFIX + "Migrated obscured types on " + touchedCount + " objects."); } else { Debug.Log(ActEditorGlobalStuff.LOG_PREFIX + "No objects were found for obscured types migration."); } }
/// <summary> /// this method applies a preset onto the passed component, /// returning true on success /// </summary> public static bool Apply(vp_Component component, vp_ComponentPreset preset) { if (preset == null) { Error("Tried to apply a preset that was null in '" + vp_Utility.GetErrorLocation() + "'"); return(false); } if (preset.m_ComponentType == null) { Error("Preset ComponentType was null in '" + vp_Utility.GetErrorLocation() + "'"); return(false); } if (component == null) { UnityEngine.Debug.LogWarning("Warning: Component was null when attempting to apply preset in '" + vp_Utility.GetErrorLocation() + "'"); return(false); } if (component.Type != preset.m_ComponentType) { string type = "a '" + preset.m_ComponentType + "' preset"; if (preset.m_ComponentType == null) { type = "an unknown preset type"; } Error("Applied " + type + " to a '" + component.Type.ToString() + "' component in '" + vp_Utility.GetErrorLocation() + "'"); return(false); } // component and preset both seem ok, so set the preset fields // onto the component for (int p = 0; p < preset.m_Fields.Count; p++) { FieldInfo destField = FieldInfo.GetFieldFromHandle(preset.m_Fields[p].FieldHandle); #if ANTICHEAT if ((destField.FieldType == typeof(ObscuredFloat)) && (preset.m_Fields[p].Args.GetType() == typeof(float))) { ObscuredFloat o = (float)preset.m_Fields[p].Args; destField.SetValue(component, o); } else if ((destField.FieldType == typeof(ObscuredVector3)) && (preset.m_Fields[p].Args.GetType() == typeof(Vector3))) { ObscuredVector3 o = (Vector3)preset.m_Fields[p].Args; destField.SetValue(component, o); } else if ((destField.FieldType == typeof(ObscuredVector2)) && (preset.m_Fields[p].Args.GetType() == typeof(Vector2))) { ObscuredVector2 o = (Vector2)preset.m_Fields[p].Args; destField.SetValue(component, o); } else if ((destField.FieldType == typeof(ObscuredInt)) && (preset.m_Fields[p].Args.GetType() == typeof(int))) { ObscuredInt o = (int)preset.m_Fields[p].Args; destField.SetValue(component, o); } else if ((destField.FieldType == typeof(ObscuredBool)) && (preset.m_Fields[p].Args.GetType() == typeof(bool))) { ObscuredBool o = (bool)preset.m_Fields[p].Args; destField.SetValue(component, o); } else if ((destField.FieldType == typeof(ObscuredString)) && (preset.m_Fields[p].Args.GetType() == typeof(string))) { ObscuredString o = (string)preset.m_Fields[p].Args; destField.SetValue(component, o); } else #endif destField.SetValue(component, preset.m_Fields[p].Args); } return(true); }
/// <summary> /// saves every supported field of 'preset' to text at 'fullPath' /// </summary> public static string Save(vp_ComponentPreset savePreset, string fullPath, bool isDifference = false) { m_FullPath = fullPath; // if the targeted file already exists, we take a look // at it to see if it has the same type as 'component' // attempt to load target preset into memory, ignoring // load errors in the process bool logErrorState = LogErrors; LogErrors = false; vp_ComponentPreset preset = new vp_ComponentPreset(); preset.LoadTextStream(m_FullPath); LogErrors = logErrorState; // if we got hold of a preset and a component type from // the file, confirm overwrite if (preset != null) { if (preset.m_ComponentType != null) { // warn user if the type is not same as the passed 'component' if (preset.ComponentType != savePreset.ComponentType) { return("'" + ExtractFilenameFromPath(m_FullPath) + "' has the WRONG component type: " + preset.ComponentType.ToString() + ".\n\nDo you want to replace it with a " + savePreset.ComponentType.ToString() + "?"); } // confirm that the user does in fact want to overwrite this file if (System.IO.File.Exists(m_FullPath)) { if (isDifference) { return("This will update '" + ExtractFilenameFromPath(m_FullPath) + "' with only the values modified since pressing Play or setting a state.\n\nContinue?"); } else { return("'" + ExtractFilenameFromPath(m_FullPath) + "' already exists.\n\nDo you want to replace it?"); } } } // if we end up here there was a file but it didn't make sense, so confirm overwrite if (System.IO.File.Exists(m_FullPath)) { return("'" + ExtractFilenameFromPath(m_FullPath) + "' has an UNKNOWN component type.\n\nDo you want to replace it?"); } } // go ahead and save 'component' to the text file ClearTextFile(); Append("///////////////////////////////////////////////////////////"); Append("// Component Preset Script"); Append("///////////////////////////////////////////////////////////\n"); // append component type Append("ComponentType " + savePreset.ComponentType.Name); // scan component for all its fields. NOTE: any types // to be supported must be included here. string prefix; string value; foreach (Field f in savePreset.m_Fields) { prefix = ""; value = ""; FieldInfo fi = FieldInfo.GetFieldFromHandle(f.FieldHandle); if (fi.FieldType == typeof(float)) { value = String.Format("{0:0.#######}", ((float)f.Args)); } else if (fi.FieldType == typeof(Vector4)) { Vector4 val = ((Vector4)f.Args); value = String.Format("{0:0.#######}", val.x) + " " + String.Format("{0:0.#######}", val.y) + " " + String.Format("{0:0.#######}", val.z) + " " + String.Format("{0:0.#######}", val.w); } else if (fi.FieldType == typeof(Vector3)) { Vector3 val = ((Vector3)f.Args); value = String.Format("{0:0.#######}", val.x) + " " + String.Format("{0:0.#######}", val.y) + " " + String.Format("{0:0.#######}", val.z); } else if (fi.FieldType == typeof(Vector2)) { Vector2 val = ((Vector2)f.Args); value = String.Format("{0:0.#######}", val.x) + " " + String.Format("{0:0.#######}", val.y); } else if (fi.FieldType == typeof(int)) { value = ((int)f.Args).ToString(); } else if (fi.FieldType == typeof(bool)) { value = ((bool)f.Args).ToString(); } else if (fi.FieldType == typeof(string)) { value = ((string)f.Args); } #if ANTICHEAT else if (fi.FieldType == typeof(ObscuredFloat)) { ObscuredFloat val = ((float)f.Args); value = String.Format("{0:0.#######}", val); } else if (fi.FieldType == typeof(ObscuredVector3)) { ObscuredVector3 val = ((ObscuredVector3)f.Args); value = String.Format("{0:0.#######}", val.x) + " " + String.Format("{0:0.#######}", val.y) + " " + String.Format("{0:0.#######}", val.z); } else if (fi.FieldType == typeof(ObscuredVector2)) { ObscuredVector2 val = ((ObscuredVector2)f.Args); value = String.Format("{0:0.#######}", val.x) + " " + String.Format("{0:0.#######}", val.y); } else if (fi.FieldType == typeof(ObscuredInt)) { ObscuredInt val = ((ObscuredInt)f.Args); value = val.ToString(); } else if (fi.FieldType == typeof(ObscuredBool)) { ObscuredBool val = ((ObscuredBool)f.Args); value = val.ToString(); } else if (fi.FieldType == typeof(ObscuredString)) { ObscuredString val = ((ObscuredString)f.Args); value = val.ToString(); } #endif else { prefix = "//"; value = "<NOTE: Type '" + fi.FieldType.Name.ToString() + "' can't be saved to preset.>"; } // print field name and value to the text file if (!string.IsNullOrEmpty(value) && fi.Name != "Persist") { Append(prefix + fi.Name + " " + value); } } return(null); }