quantum-space-buddies/QSB/Utility/Extensions.cs

134 lines
3.5 KiB
C#
Raw Normal View History

2022-01-15 05:18:05 +00:00
using Mirror;
using OWML.Common;
2021-01-26 14:07:17 +00:00
using QuantumUNET;
2021-02-06 22:03:10 +00:00
using System;
using System.Collections.Generic;
using System.Linq;
2021-02-09 10:03:13 +00:00
using System.Reflection;
2021-01-26 14:07:17 +00:00
using UnityEngine;
2021-12-26 05:02:21 +00:00
using Object = UnityEngine.Object;
namespace QSB.Utility
{
2021-01-26 14:07:17 +00:00
public static class Extensions
2020-12-02 21:23:01 +00:00
{
#region UNITY
2021-04-20 07:36:07 +00:00
public static Quaternion TransformRotation(this Transform transform, Quaternion localRotation)
=> transform.rotation * localRotation;
2020-12-02 21:23:01 +00:00
public static GameObject InstantiateInactive(this GameObject original)
{
original.SetActive(false);
2021-12-26 05:02:21 +00:00
var copy = Object.Instantiate(original);
2020-12-02 21:23:01 +00:00
original.SetActive(true);
return copy;
}
2020-08-23 07:54:55 +00:00
2020-12-14 21:20:53 +00:00
public static Transform InstantiateInactive(this Transform original) =>
original.gameObject.InstantiateInactive().transform;
2021-01-26 14:07:17 +00:00
#endregion
2022-01-15 05:18:05 +00:00
#region MIRROR
2022-01-15 06:07:32 +00:00
public static uint GetPlayerId(this NetworkConnection conn) =>
conn.identity.netId;
2021-03-09 16:43:41 +00:00
public static uint GetPlayerId(this QNetworkConnection connection)
2021-01-26 14:07:17 +00:00
{
2021-06-11 20:19:08 +00:00
if (connection == null)
{
2021-12-23 11:37:37 +00:00
DebugLog.ToConsole($"Error - Trying to get player id of null QNetworkConnection.\r\n{Environment.StackTrace}", MessageType.Error);
2021-06-11 20:19:08 +00:00
return uint.MaxValue;
}
2021-12-27 23:38:29 +00:00
var playerController = connection.PlayerControllers.FirstOrDefault();
2021-06-11 20:19:08 +00:00
if (playerController == null)
{
2021-06-23 20:46:52 +00:00
DebugLog.ToConsole($"Error - Player Controller of {connection.address} is null.", MessageType.Error);
2021-06-11 20:19:08 +00:00
return uint.MaxValue;
}
2021-12-27 23:38:29 +00:00
return playerController.UnetView.NetId.Value;
2021-01-26 14:07:17 +00:00
}
2021-02-06 22:03:10 +00:00
2022-01-15 06:07:32 +00:00
public static void SpawnWithServerAuthority(this GameObject go) =>
NetworkServer.Spawn(go, NetworkServer.localConnection);
2021-08-19 15:37:29 +00:00
#endregion
#region C#
2021-02-06 22:03:10 +00:00
public static void SafeInvoke(this MulticastDelegate multicast, params object[] args)
{
foreach (var del in multicast.GetInvocationList())
{
try
{
del.DynamicInvoke(args);
}
2021-02-09 10:03:13 +00:00
catch (TargetInvocationException ex)
2021-02-06 22:03:10 +00:00
{
2021-12-27 05:48:07 +00:00
DebugLog.ToConsole($"Error invoking delegate! Message : {ex.InnerException!.Message} Stack Trace : {ex.InnerException.StackTrace}", MessageType.Error);
2021-02-06 22:03:10 +00:00
}
}
}
2021-03-25 23:07:53 +00:00
2021-12-27 21:04:57 +00:00
public static float Map(this float value, float inputFrom, float inputTo, float outputFrom, float outputTo, bool clamp)
{
var mappedValue = ((value - inputFrom) / (inputTo - inputFrom) * (outputTo - outputFrom)) + outputFrom;
return clamp
? Mathf.Clamp(mappedValue, outputTo, outputFrom)
: mappedValue;
}
2021-12-15 07:57:21 +00:00
public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
2021-07-07 08:02:23 +00:00
{
foreach (var item in enumerable)
2021-07-07 08:09:34 +00:00
{
2021-07-07 08:02:23 +00:00
action(item);
2021-07-07 08:09:34 +00:00
}
2021-07-07 08:02:23 +00:00
}
2021-12-15 07:57:21 +00:00
public static int IndexOf<T>(this T[] array, T value) => Array.IndexOf(array, value);
public static bool IsInRange<T>(this IList<T> list, int index) => index >= 0 && index < list.Count;
2021-12-15 04:24:02 +00:00
public static bool TryGet<T>(this IList<T> list, int index, out T element)
{
2021-12-15 09:20:51 +00:00
if (!list.IsInRange(index))
2021-12-15 04:24:02 +00:00
{
element = default;
return false;
}
element = list[index];
return true;
}
2021-07-07 08:12:35 +00:00
public static void RaiseEvent<T>(this T instance, string eventName, params object[] args)
2021-07-07 08:02:23 +00:00
{
2021-12-27 21:50:03 +00:00
const BindingFlags flags = BindingFlags.Instance
| BindingFlags.Static
| BindingFlags.Public
| BindingFlags.NonPublic
| BindingFlags.DeclaredOnly;
2021-11-20 19:49:50 +00:00
if (typeof(T)
2021-12-27 21:50:03 +00:00
.GetField(eventName, flags)?
2021-11-20 19:49:50 +00:00
.GetValue(instance) is not MulticastDelegate multiDelegate)
2021-07-07 08:02:23 +00:00
{
return;
}
multiDelegate.GetInvocationList().ToList().ForEach(dl => dl.DynamicInvoke(args));
}
public static IEnumerable<Type> GetDerivedTypes(this Type type) => type.Assembly.GetTypes()
.Where(x => !x.IsInterface && !x.IsAbstract && type.IsAssignableFrom(x));
#endregion
2020-12-14 21:20:53 +00:00
}
2021-01-26 14:07:17 +00:00
}