mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
96 lines
3.6 KiB
C#
96 lines
3.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Reflection;
|
|
using System.Text;
|
|
using System.Text.RegularExpressions;
|
|
using UnityEngine;
|
|
|
|
namespace NewHorizons.Utility
|
|
{
|
|
public static class NewHorizonsExtensions
|
|
{
|
|
public static MVector3 ToMVector3(this Vector3 vector3) => new MVector3(vector3.x, vector3.y, vector3.z);
|
|
|
|
public static T GetSetting<T>(this Dictionary<string, object> dict, string settingName) => (T)dict[settingName];
|
|
|
|
public static float GetFalloffExponent(this GravityVolume gv)
|
|
{
|
|
if (gv == null) return 0;
|
|
if (gv._falloffType == GravityVolume.FalloffType.linear) return 1;
|
|
if (gv._falloffType == GravityVolume.FalloffType.inverseSquared) return 2;
|
|
|
|
return 0;
|
|
}
|
|
|
|
public static string ToCamelCase(this string str)
|
|
{
|
|
var strBuilder = new StringBuilder(str);
|
|
strBuilder[0] = strBuilder[0].ToString().ToLower().ToCharArray()[0];
|
|
return strBuilder.ToString();
|
|
}
|
|
|
|
public static string ToTitleCase(this string str)
|
|
{
|
|
var strBuilder = new StringBuilder(str);
|
|
strBuilder[0] = strBuilder[0].ToString().ToUpper().ToCharArray()[0];
|
|
return strBuilder.ToString();
|
|
}
|
|
|
|
public static void CopyPropertiesFrom(this object destination, object source)
|
|
{
|
|
// If any this null throw an exception
|
|
if (source == null || destination == null)
|
|
throw new Exception("Source or/and Destination Objects are null");
|
|
// Getting the Types of the objects
|
|
var typeDest = destination.GetType();
|
|
var typeSrc = source.GetType();
|
|
|
|
// Iterate the Properties of the source instance and
|
|
// populate them from their desination counterparts
|
|
var srcProps = typeSrc.GetProperties();
|
|
foreach (var srcProp in srcProps)
|
|
{
|
|
if (!srcProp.CanRead) continue;
|
|
var targetProperty = typeDest.GetProperty(srcProp.Name);
|
|
if (targetProperty == null) continue;
|
|
if (!targetProperty.CanWrite) continue;
|
|
if (targetProperty.GetSetMethod(true) != null && targetProperty.GetSetMethod(true).IsPrivate) continue;
|
|
if ((targetProperty.GetSetMethod().Attributes & MethodAttributes.Static) != 0) continue;
|
|
if (!targetProperty.PropertyType.IsAssignableFrom(srcProp.PropertyType)) continue;
|
|
|
|
try
|
|
{
|
|
targetProperty.SetValue(destination, srcProp.GetValue(source, null), null);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
Logger.LogWarning($"Couldn't copy property {targetProperty.Name} from {source} to {destination}");
|
|
}
|
|
}
|
|
}
|
|
|
|
public static string SplitCamelCase(this string str) =>
|
|
Regex.Replace(
|
|
Regex.Replace(
|
|
str,
|
|
@"(\P{Ll})(\P{Ll}\p{Ll})",
|
|
"$1 $2"
|
|
),
|
|
@"(\p{Ll})(\P{Ll})",
|
|
"$1 $2"
|
|
);
|
|
|
|
public static GameObject InstantiateInactive(this GameObject original)
|
|
{
|
|
if (!original.activeSelf) return UnityEngine.Object.Instantiate(original);
|
|
|
|
original.SetActive(false);
|
|
var copy = UnityEngine.Object.Instantiate(original);
|
|
original.SetActive(true);
|
|
return copy;
|
|
}
|
|
|
|
public static Quaternion TransformRotation(this Transform transform, Quaternion localRotation) =>
|
|
transform.rotation * localRotation;
|
|
}
|
|
} |