mirror of
https://github.com/NotAKidoS/NAK_CVR_Mods.git
synced 2026-06-20 21:48:02 +00:00
[NAK_CVR_Mods] Unfucked for 2026r182
This commit is contained in:
parent
c13dc8375a
commit
281403d68b
209 changed files with 3936 additions and 1122 deletions
12
.Experimental/BullshitWatcher/BullshitWatcher.csproj
Normal file
12
.Experimental/BullshitWatcher/BullshitWatcher.csproj
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<RootNamespace>ASTExtension</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="BTKUILib">
|
||||
<HintPath>..\.ManagedLibs\BTKUILib.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
457
.Experimental/BullshitWatcher/Main.cs
Normal file
457
.Experimental/BullshitWatcher/Main.cs
Normal file
|
|
@ -0,0 +1,457 @@
|
|||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using ABI_RC.Core.Player;
|
||||
using HarmonyLib;
|
||||
using MelonLoader;
|
||||
using UnityEngine;
|
||||
using Object = UnityEngine.Object;
|
||||
|
||||
namespace NAK.BullshitWatcher;
|
||||
|
||||
public class BullshitWatcherMod : MelonMod
|
||||
{
|
||||
private const float MaxAllowedValueTop = 3.402823E+7f;
|
||||
private const float MaxAllowedValueBottom = -3.402823E+7f;
|
||||
private const float MinAvatarHeight = 0.005f;
|
||||
|
||||
public override void OnInitializeMelon()
|
||||
{
|
||||
PatchSetterVector3(typeof(Transform), nameof(Transform.position));
|
||||
PatchSetterVector3(typeof(Transform), nameof(Transform.localPosition));
|
||||
PatchSetterVector3(typeof(Transform), nameof(Transform.localScale));
|
||||
PatchSetterVector3(typeof(Transform), nameof(Transform.right));
|
||||
PatchSetterVector3(typeof(Transform), nameof(Transform.up));
|
||||
PatchSetterVector3(typeof(Transform), nameof(Transform.forward));
|
||||
PatchSetterQuaternion(typeof(Transform), nameof(Transform.rotation));
|
||||
PatchSetterQuaternion(typeof(Transform), nameof(Transform.localRotation));
|
||||
|
||||
PatchMethod(typeof(Transform), nameof(Transform.SetPositionAndRotation),
|
||||
nameof(OnTransformSetPositionAndRotation),
|
||||
typeof(Vector3), typeof(Quaternion));
|
||||
|
||||
PatchMethod(typeof(Transform), nameof(Transform.SetLocalPositionAndRotation),
|
||||
nameof(OnTransformSetLocalPositionAndRotation),
|
||||
typeof(Vector3), typeof(Quaternion));
|
||||
|
||||
PatchMethod(typeof(Transform), nameof(Transform.Translate),
|
||||
nameof(OnTransformTranslateVector3Space),
|
||||
typeof(Vector3), typeof(Space));
|
||||
|
||||
PatchMethod(typeof(Transform), nameof(Transform.Translate),
|
||||
nameof(OnTransformTranslateVector3),
|
||||
typeof(Vector3));
|
||||
|
||||
PatchMethod(typeof(Transform), nameof(Transform.Translate),
|
||||
nameof(OnTransformTranslateVector3Transform),
|
||||
typeof(Vector3), typeof(Transform));
|
||||
|
||||
PatchMethod(typeof(Transform), nameof(Transform.Rotate),
|
||||
nameof(OnTransformRotateVector3Space),
|
||||
typeof(Vector3), typeof(Space));
|
||||
|
||||
PatchMethod(typeof(Transform), nameof(Transform.Rotate),
|
||||
nameof(OnTransformRotateVector3),
|
||||
typeof(Vector3));
|
||||
|
||||
PatchMethod(typeof(Transform), nameof(Transform.Rotate),
|
||||
nameof(OnTransformRotateAxisAngleSpace),
|
||||
typeof(Vector3), typeof(float), typeof(Space));
|
||||
|
||||
PatchMethod(typeof(Transform), nameof(Transform.RotateAround),
|
||||
nameof(OnTransformRotateAround),
|
||||
typeof(Vector3), typeof(Vector3), typeof(float));
|
||||
|
||||
PatchMethod(typeof(Transform), nameof(Transform.LookAt),
|
||||
nameof(OnTransformLookAt),
|
||||
typeof(Vector3), typeof(Vector3));
|
||||
|
||||
PatchSetterVector3(typeof(Rigidbody), nameof(Rigidbody.position));
|
||||
PatchSetterVector3(typeof(Rigidbody), nameof(Rigidbody.velocity));
|
||||
PatchSetterVector3(typeof(Rigidbody), nameof(Rigidbody.angularVelocity));
|
||||
PatchSetterVector3(typeof(Rigidbody), nameof(Rigidbody.centerOfMass));
|
||||
PatchSetterQuaternion(typeof(Rigidbody), nameof(Rigidbody.rotation));
|
||||
|
||||
PatchMethod(typeof(Rigidbody), nameof(Rigidbody.MovePosition),
|
||||
nameof(OnRigidbodyMovePosition),
|
||||
typeof(Vector3));
|
||||
|
||||
PatchMethod(typeof(Rigidbody), nameof(Rigidbody.MoveRotation),
|
||||
nameof(OnRigidbodyMoveRotation),
|
||||
typeof(Quaternion));
|
||||
|
||||
PatchMethod(typeof(Rigidbody), nameof(Rigidbody.AddForce),
|
||||
nameof(OnRigidbodyAddForce),
|
||||
typeof(Vector3), typeof(ForceMode));
|
||||
|
||||
PatchMethod(typeof(Rigidbody), nameof(Rigidbody.AddRelativeForce),
|
||||
nameof(OnRigidbodyAddRelativeForce),
|
||||
typeof(Vector3), typeof(ForceMode));
|
||||
|
||||
PatchMethod(typeof(Rigidbody), nameof(Rigidbody.AddTorque),
|
||||
nameof(OnRigidbodyAddTorque),
|
||||
typeof(Vector3), typeof(ForceMode));
|
||||
|
||||
PatchMethod(typeof(Rigidbody), nameof(Rigidbody.AddRelativeTorque),
|
||||
nameof(OnRigidbodyAddRelativeTorque),
|
||||
typeof(Vector3), typeof(ForceMode));
|
||||
|
||||
PatchMethod(typeof(Rigidbody), nameof(Rigidbody.AddForceAtPosition),
|
||||
nameof(OnRigidbodyAddForceAtPosition),
|
||||
typeof(Vector3), typeof(Vector3), typeof(ForceMode));
|
||||
|
||||
PatchMethod(typeof(Object), nameof(Object.Instantiate),
|
||||
nameof(OnInstantiatePositionRotation),
|
||||
typeof(Object), typeof(Vector3), typeof(Quaternion));
|
||||
|
||||
PatchMethod(typeof(Object), nameof(Object.Instantiate),
|
||||
nameof(OnInstantiatePositionRotationParent),
|
||||
typeof(Object), typeof(Vector3), typeof(Quaternion), typeof(Transform));
|
||||
|
||||
PatchSetterAvatarHeight(typeof(PlayerSetup), nameof(PlayerSetup.AvatarHeight));
|
||||
}
|
||||
|
||||
private void PatchSetterVector3(Type type, string propertyName)
|
||||
=> HarmonyInstance.Patch(
|
||||
AccessTools.Property(type, propertyName).SetMethod,
|
||||
new HarmonyMethod(GetPrefix(nameof(OnSetVector3))));
|
||||
|
||||
private void PatchSetterQuaternion(Type type, string propertyName)
|
||||
=> HarmonyInstance.Patch(
|
||||
AccessTools.Property(type, propertyName).SetMethod,
|
||||
new HarmonyMethod(GetPrefix(nameof(OnSetQuaternion))));
|
||||
|
||||
private void PatchSetterAvatarHeight(Type type, string propertyName)
|
||||
=> HarmonyInstance.Patch(
|
||||
AccessTools.Property(type, propertyName).SetMethod,
|
||||
new HarmonyMethod(GetPrefix(nameof(OnSetAvatarHeight))));
|
||||
|
||||
private void PatchMethod(Type type, string methodName, string prefixName, params Type[] parameterTypes)
|
||||
=> HarmonyInstance.Patch(
|
||||
AccessTools.Method(type, methodName, parameterTypes),
|
||||
new HarmonyMethod(GetPrefix(prefixName)));
|
||||
|
||||
private static MethodInfo GetPrefix(string name)
|
||||
=> typeof(BullshitWatcherMod).GetMethod(name, BindingFlags.NonPublic | BindingFlags.Static);
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static unsafe bool IsBullshit(float value)
|
||||
=> (((*(int*)&value) & int.MaxValue) >= 0x7F800000)
|
||||
|| value <= MaxAllowedValueBottom
|
||||
|| value >= MaxAllowedValueTop;
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static bool IsBullshit(Vector3 value)
|
||||
=> IsBullshit(value.x) || IsBullshit(value.y) || IsBullshit(value.z);
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static bool IsBullshit(Quaternion value)
|
||||
=> IsBullshit(value.x) || IsBullshit(value.y) || IsBullshit(value.z) || IsBullshit(value.w);
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static bool IsBullshit(Vector3 a, Vector3 b)
|
||||
=> IsBullshit(a.x) || IsBullshit(a.y) || IsBullshit(a.z)
|
||||
|| IsBullshit(b.x) || IsBullshit(b.y) || IsBullshit(b.z);
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static bool IsBullshit(Vector3 vector, Quaternion quaternion)
|
||||
=> IsBullshit(vector.x) || IsBullshit(vector.y) || IsBullshit(vector.z)
|
||||
|| IsBullshit(quaternion.x) || IsBullshit(quaternion.y) || IsBullshit(quaternion.z) || IsBullshit(quaternion.w);
|
||||
|
||||
// --- Sanitizers --------------------------------------------------------
|
||||
// NaN -> 0 (NaN can't be clamped meaningfully).
|
||||
// +/-Infinity and out-of-range finite values -> clamped to the allowed bound.
|
||||
// A bullshit Quaternion -> identity, because zeroing it produces a degenerate
|
||||
// (0,0,0,0) rotation that just turns back into NaN the moment Unity normalizes it.
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static float Sanitize(float value)
|
||||
{
|
||||
if (float.IsNaN(value))
|
||||
return 0f;
|
||||
if (value >= MaxAllowedValueTop) // also catches +Infinity
|
||||
return MaxAllowedValueTop;
|
||||
if (value <= MaxAllowedValueBottom) // also catches -Infinity
|
||||
return MaxAllowedValueBottom;
|
||||
return value;
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static Vector3 Sanitize(Vector3 value)
|
||||
=> new Vector3(Sanitize(value.x), Sanitize(value.y), Sanitize(value.z));
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static Quaternion Sanitize(Quaternion value)
|
||||
=> IsBullshit(value) ? Quaternion.identity : value;
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
[MethodImpl(MethodImplOptions.NoInlining)]
|
||||
private static void LogBullshitValue(Component instance, MethodBase method, object value)
|
||||
{
|
||||
string member = method.Name.Replace("set_", "");
|
||||
MelonLogger.Error($"Bullshit {instance.GetType().Name}.{member} = {value} on '{GetPath(instance.transform)}' (sanitized)");
|
||||
MelonLogger.Error(Environment.StackTrace);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.NoInlining)]
|
||||
private static void LogBullshitArgs1(Component instance, MethodBase method, object arg0)
|
||||
{
|
||||
MelonLogger.Error($"Bullshit args in {instance.GetType().Name}.{method.Name}() on '{GetPath(instance.transform)}' (sanitized)");
|
||||
MelonLogger.Error($" arg0: {arg0}");
|
||||
MelonLogger.Error(Environment.StackTrace);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.NoInlining)]
|
||||
private static void LogBullshitArgs2(Component instance, MethodBase method, object arg0, object arg1)
|
||||
{
|
||||
MelonLogger.Error($"Bullshit args in {instance.GetType().Name}.{method.Name}() on '{GetPath(instance.transform)}' (sanitized)");
|
||||
MelonLogger.Error($" arg0: {arg0}");
|
||||
MelonLogger.Error($" arg1: {arg1}");
|
||||
MelonLogger.Error(Environment.StackTrace);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.NoInlining)]
|
||||
private static void LogBullshitArgs3(Component instance, MethodBase method, object arg0, object arg1, object arg2)
|
||||
{
|
||||
MelonLogger.Error($"Bullshit args in {instance.GetType().Name}.{method.Name}() on '{GetPath(instance.transform)}' (sanitized)");
|
||||
MelonLogger.Error($" arg0: {arg0}");
|
||||
MelonLogger.Error($" arg1: {arg1}");
|
||||
MelonLogger.Error($" arg2: {arg2}");
|
||||
MelonLogger.Error(Environment.StackTrace);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.NoInlining)]
|
||||
private static void LogBullshitInstantiate(MethodBase method, Object original, Vector3 position, Quaternion rotation, Transform parent)
|
||||
{
|
||||
string originalName = original != null ? original.name : "null";
|
||||
string parentPath = parent != null ? GetPath(parent) : "<none>";
|
||||
|
||||
MelonLogger.Error($"Bullshit args in Object.{method.Name}() original='{originalName}' parent='{parentPath}' (sanitized)");
|
||||
MelonLogger.Error($" position: {position}");
|
||||
MelonLogger.Error($" rotation: {rotation}");
|
||||
MelonLogger.Error(Environment.StackTrace);
|
||||
}
|
||||
|
||||
private static void OnSetVector3(ref Vector3 value, Component __instance, MethodBase __originalMethod)
|
||||
{
|
||||
if (!IsBullshit(value))
|
||||
return;
|
||||
|
||||
LogBullshitValue(__instance, __originalMethod, value);
|
||||
value = Sanitize(value);
|
||||
}
|
||||
|
||||
private static void OnSetQuaternion(ref Quaternion value, Component __instance, MethodBase __originalMethod)
|
||||
{
|
||||
if (!IsBullshit(value))
|
||||
return;
|
||||
|
||||
LogBullshitValue(__instance, __originalMethod, value);
|
||||
value = Sanitize(value);
|
||||
}
|
||||
|
||||
private static void OnSetAvatarHeight(ref float value, Component __instance, MethodBase __originalMethod)
|
||||
{
|
||||
float clamped;
|
||||
if (float.IsNaN(value) || value < MinAvatarHeight) // also catches 0, negatives, -Infinity
|
||||
clamped = MinAvatarHeight;
|
||||
else if (value > MaxAllowedValueTop) // also catches +Infinity
|
||||
clamped = MaxAllowedValueTop;
|
||||
else
|
||||
return; // height is fine, leave it alone
|
||||
|
||||
LogBullshitValue(__instance, __originalMethod, value);
|
||||
value = clamped;
|
||||
}
|
||||
|
||||
private static void OnTransformSetPositionAndRotation(ref Vector3 position, ref Quaternion rotation, Component __instance, MethodBase __originalMethod)
|
||||
{
|
||||
if (!IsBullshit(position, rotation))
|
||||
return;
|
||||
|
||||
LogBullshitArgs2(__instance, __originalMethod, position, rotation);
|
||||
position = Sanitize(position);
|
||||
rotation = Sanitize(rotation);
|
||||
}
|
||||
|
||||
private static void OnTransformSetLocalPositionAndRotation(ref Vector3 localPosition, ref Quaternion localRotation, Component __instance, MethodBase __originalMethod)
|
||||
{
|
||||
if (!IsBullshit(localPosition, localRotation))
|
||||
return;
|
||||
|
||||
LogBullshitArgs2(__instance, __originalMethod, localPosition, localRotation);
|
||||
localPosition = Sanitize(localPosition);
|
||||
localRotation = Sanitize(localRotation);
|
||||
}
|
||||
|
||||
private static void OnTransformTranslateVector3Space(ref Vector3 translation, Space relativeTo, Component __instance, MethodBase __originalMethod)
|
||||
{
|
||||
if (!IsBullshit(translation))
|
||||
return;
|
||||
|
||||
LogBullshitArgs2(__instance, __originalMethod, translation, relativeTo);
|
||||
translation = Sanitize(translation);
|
||||
}
|
||||
|
||||
private static void OnTransformTranslateVector3(ref Vector3 translation, Component __instance, MethodBase __originalMethod)
|
||||
{
|
||||
if (!IsBullshit(translation))
|
||||
return;
|
||||
|
||||
LogBullshitArgs1(__instance, __originalMethod, translation);
|
||||
translation = Sanitize(translation);
|
||||
}
|
||||
|
||||
private static void OnTransformTranslateVector3Transform(ref Vector3 translation, Transform relativeTo, Component __instance, MethodBase __originalMethod)
|
||||
{
|
||||
if (!IsBullshit(translation))
|
||||
return;
|
||||
|
||||
LogBullshitArgs2(__instance, __originalMethod, translation, relativeTo);
|
||||
translation = Sanitize(translation);
|
||||
}
|
||||
|
||||
private static void OnTransformRotateVector3Space(ref Vector3 eulers, Space relativeTo, Component __instance, MethodBase __originalMethod)
|
||||
{
|
||||
if (!IsBullshit(eulers))
|
||||
return;
|
||||
|
||||
LogBullshitArgs2(__instance, __originalMethod, eulers, relativeTo);
|
||||
eulers = Sanitize(eulers);
|
||||
}
|
||||
|
||||
private static void OnTransformRotateVector3(ref Vector3 eulers, Component __instance, MethodBase __originalMethod)
|
||||
{
|
||||
if (!IsBullshit(eulers))
|
||||
return;
|
||||
|
||||
LogBullshitArgs1(__instance, __originalMethod, eulers);
|
||||
eulers = Sanitize(eulers);
|
||||
}
|
||||
|
||||
private static void OnTransformRotateAxisAngleSpace(ref Vector3 axis, ref float angle, Space relativeTo, Component __instance, MethodBase __originalMethod)
|
||||
{
|
||||
if (!(IsBullshit(axis) || IsBullshit(angle)))
|
||||
return;
|
||||
|
||||
LogBullshitArgs3(__instance, __originalMethod, axis, angle, relativeTo);
|
||||
axis = Sanitize(axis);
|
||||
angle = Sanitize(angle);
|
||||
}
|
||||
|
||||
private static void OnTransformRotateAround(ref Vector3 point, ref Vector3 axis, ref float angle, Component __instance, MethodBase __originalMethod)
|
||||
{
|
||||
if (!(IsBullshit(point, axis) || IsBullshit(angle)))
|
||||
return;
|
||||
|
||||
LogBullshitArgs3(__instance, __originalMethod, point, axis, angle);
|
||||
point = Sanitize(point);
|
||||
axis = Sanitize(axis);
|
||||
angle = Sanitize(angle);
|
||||
}
|
||||
|
||||
private static void OnTransformLookAt(ref Vector3 worldPosition, ref Vector3 worldUp, Component __instance, MethodBase __originalMethod)
|
||||
{
|
||||
if (!IsBullshit(worldPosition, worldUp))
|
||||
return;
|
||||
|
||||
LogBullshitArgs2(__instance, __originalMethod, worldPosition, worldUp);
|
||||
worldPosition = Sanitize(worldPosition);
|
||||
// worldUp must stay a usable direction; a zeroed up vector makes LookAt produce garbage.
|
||||
worldUp = Sanitize(worldUp);
|
||||
if (worldUp == Vector3.zero)
|
||||
worldUp = Vector3.up;
|
||||
}
|
||||
|
||||
private static void OnRigidbodyMovePosition(ref Vector3 position, Component __instance, MethodBase __originalMethod)
|
||||
{
|
||||
if (!IsBullshit(position))
|
||||
return;
|
||||
|
||||
LogBullshitArgs1(__instance, __originalMethod, position);
|
||||
position = Sanitize(position);
|
||||
}
|
||||
|
||||
private static void OnRigidbodyMoveRotation(ref Quaternion rot, Component __instance, MethodBase __originalMethod)
|
||||
{
|
||||
if (!IsBullshit(rot))
|
||||
return;
|
||||
|
||||
LogBullshitArgs1(__instance, __originalMethod, rot);
|
||||
rot = Sanitize(rot);
|
||||
}
|
||||
|
||||
private static void OnRigidbodyAddForce(ref Vector3 force, ForceMode mode, Component __instance, MethodBase __originalMethod)
|
||||
{
|
||||
if (!IsBullshit(force))
|
||||
return;
|
||||
|
||||
LogBullshitArgs2(__instance, __originalMethod, force, mode);
|
||||
force = Sanitize(force);
|
||||
}
|
||||
|
||||
private static void OnRigidbodyAddRelativeForce(ref Vector3 force, ForceMode mode, Component __instance, MethodBase __originalMethod)
|
||||
{
|
||||
if (!IsBullshit(force))
|
||||
return;
|
||||
|
||||
LogBullshitArgs2(__instance, __originalMethod, force, mode);
|
||||
force = Sanitize(force);
|
||||
}
|
||||
|
||||
private static void OnRigidbodyAddTorque(ref Vector3 torque, ForceMode mode, Component __instance, MethodBase __originalMethod)
|
||||
{
|
||||
if (!IsBullshit(torque))
|
||||
return;
|
||||
|
||||
LogBullshitArgs2(__instance, __originalMethod, torque, mode);
|
||||
torque = Sanitize(torque);
|
||||
}
|
||||
|
||||
private static void OnRigidbodyAddRelativeTorque(ref Vector3 torque, ForceMode mode, Component __instance, MethodBase __originalMethod)
|
||||
{
|
||||
if (!IsBullshit(torque))
|
||||
return;
|
||||
|
||||
LogBullshitArgs2(__instance, __originalMethod, torque, mode);
|
||||
torque = Sanitize(torque);
|
||||
}
|
||||
|
||||
private static void OnRigidbodyAddForceAtPosition(ref Vector3 force, ref Vector3 position, ForceMode mode, Component __instance, MethodBase __originalMethod)
|
||||
{
|
||||
if (!IsBullshit(force, position))
|
||||
return;
|
||||
|
||||
LogBullshitArgs3(__instance, __originalMethod, force, position, mode);
|
||||
force = Sanitize(force);
|
||||
position = Sanitize(position);
|
||||
}
|
||||
|
||||
private static void OnInstantiatePositionRotation(Object original, ref Vector3 position, ref Quaternion rotation, MethodBase __originalMethod)
|
||||
{
|
||||
if (!IsBullshit(position, rotation))
|
||||
return;
|
||||
|
||||
LogBullshitInstantiate(__originalMethod, original, position, rotation, null);
|
||||
position = Sanitize(position);
|
||||
rotation = Sanitize(rotation);
|
||||
}
|
||||
|
||||
private static void OnInstantiatePositionRotationParent(Object original, ref Vector3 position, ref Quaternion rotation, Transform parent, MethodBase __originalMethod)
|
||||
{
|
||||
if (!IsBullshit(position, rotation))
|
||||
return;
|
||||
|
||||
LogBullshitInstantiate(__originalMethod, original, position, rotation, parent);
|
||||
position = Sanitize(position);
|
||||
rotation = Sanitize(rotation);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.NoInlining)]
|
||||
private static string GetPath(Transform current)
|
||||
{
|
||||
string path = current.name;
|
||||
for (Transform parent = current.parent; parent != null; parent = parent.parent)
|
||||
path = parent.name + "/" + path;
|
||||
return path;
|
||||
}
|
||||
}
|
||||
32
.Experimental/BullshitWatcher/Properties/AssemblyInfo.cs
Normal file
32
.Experimental/BullshitWatcher/Properties/AssemblyInfo.cs
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
using MelonLoader;
|
||||
using NAK.BullshitWatcher.Properties;
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: AssemblyVersion(AssemblyInfoParams.Version)]
|
||||
[assembly: AssemblyFileVersion(AssemblyInfoParams.Version)]
|
||||
[assembly: AssemblyInformationalVersion(AssemblyInfoParams.Version)]
|
||||
[assembly: AssemblyTitle(nameof(NAK.BullshitWatcher))]
|
||||
[assembly: AssemblyCompany(AssemblyInfoParams.Author)]
|
||||
[assembly: AssemblyProduct(nameof(NAK.BullshitWatcher))]
|
||||
|
||||
[assembly: MelonInfo(
|
||||
typeof(NAK.BullshitWatcher.BullshitWatcherMod),
|
||||
nameof(NAK.BullshitWatcher),
|
||||
AssemblyInfoParams.Version,
|
||||
AssemblyInfoParams.Author,
|
||||
downloadLink: "https://github.com/NotAKidoS/NAK_CVR_Mods/tree/main/BullshitWatcher"
|
||||
)]
|
||||
|
||||
[assembly: MelonGame("ChilloutVR", "ChilloutVR")]
|
||||
[assembly: MelonPlatform(MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)]
|
||||
[assembly: MelonPlatformDomain(MelonPlatformDomainAttribute.CompatibleDomains.MONO)]
|
||||
[assembly: MelonColor(255, 246, 25, 99)] // red-pink
|
||||
[assembly: MelonAuthorColor(255, 158, 21, 32)] // red
|
||||
[assembly: HarmonyDontPatchAll]
|
||||
|
||||
namespace NAK.BullshitWatcher.Properties;
|
||||
internal static class AssemblyInfoParams
|
||||
{
|
||||
public const string Version = "1.0.0";
|
||||
public const string Author = "NotAKidoS";
|
||||
}
|
||||
54
.Experimental/BullshitWatcher/README.md
Normal file
54
.Experimental/BullshitWatcher/README.md
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
# ASTExtension
|
||||
|
||||
Extension mod for [Avatar Scale Tool](https://github.com/NotAKidoS/AvatarScaleTool):
|
||||
- VR Gesture to scale
|
||||
- Persistent height
|
||||
- Copy height from others
|
||||
|
||||
Best used with Avatar Scale Tool, but will attempt to work with found scaling setups.
|
||||
Requires already having Avatar Scaling on the avatar. This is **not** Universal Scaling.
|
||||
|
||||
## Supported Setups
|
||||
|
||||
ASTExtension will attempt to work with the following setups:
|
||||
|
||||
**Parameter Names:**
|
||||
- AvatarScale
|
||||
- Scale
|
||||
- Scaler
|
||||
- Scale/Scale
|
||||
- Height
|
||||
- LoliModifier
|
||||
- AvatarSize
|
||||
- Size
|
||||
- SizeScale
|
||||
- Scaling
|
||||
|
||||
These parameter names are not case sensitive and have been gathered from polling the community for common parameter names.
|
||||
|
||||
Assuming the parameter is a float, ASTExtension will attempt to use it as the height parameter. Will automatically calibrate to the height range of the found parameter, assuming the scaling animation is in a blend tree / state using motion time & is linear. The scaling animation state **must be active** at time of avatar load.
|
||||
|
||||
The max value ASTExtension will drive the parameter to is 100. As the mod is having to guess the max height, it may not be accurate if the max height is not capped at a multiple of 10.
|
||||
|
||||
Examples:
|
||||
- `AvatarScale` - 0 to 1 (slider)
|
||||
- This is the default setup for Avatar Scale Tool and will work perfectly.
|
||||
- `Scale` - 0 to 100 (input single)
|
||||
- This will also work perfectly as the max height is a multiple of 10.
|
||||
- `Height` - 0 to 2 (input single)
|
||||
- This will not work properly. The max value to drive the parameter to is not a multiple of 10, and as such ASTExtension will believe the parameter range is 0 to 1.
|
||||
- `BurntToast` - 0 to 10 (input single)
|
||||
- This will not work properly. The parameter name is not recognized by ASTExtension.
|
||||
|
||||
If your setup is theoretically supported but not working, it is likely the scaling animation is not linear or has loop enabled if using Motion Time, making the first and last frame identical height. In this case, you will need to fix your animation clip curves / blend tree to be linear &|| not loop, or use Avatar Scale Tool to generate a new scaling animation.
|
||||
|
||||
---
|
||||
|
||||
Here is the block of text where I tell you this mod is not affiliated with or endorsed by ABI.
|
||||
https://documentation.abinteractive.net/official/legal/tos/#7-modding-our-games
|
||||
|
||||
> This mod is an independent creation not affiliated with, supported by, or approved by Alpha Blend Interactive.
|
||||
|
||||
> Use of this mod is done so at the user's own risk and the creator cannot be held responsible for any issues arising from its use.
|
||||
|
||||
> To the best of my knowledge, I have adhered to the Modding Guidelines established by Alpha Blend Interactive.
|
||||
24
.Experimental/BullshitWatcher/format.json
Normal file
24
.Experimental/BullshitWatcher/format.json
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"_id": 223,
|
||||
"name": "ASTExtension",
|
||||
"modversion": "1.0.5",
|
||||
"gameversion": "2025r181",
|
||||
"loaderversion": "0.7.2",
|
||||
"modtype": "Mod",
|
||||
"author": "NotAKidoS",
|
||||
"description": "Extension mod for [Avatar Scale Tool](https://github.com/NotAKidoS/AvatarScaleTool):\n- VR Gesture to scale\n- Persistent height\n- Copy height from others\n\nBest used with Avatar Scale Tool, but will attempt to work with found scaling setups.\nRequires already having Avatar Scaling on the avatar. This is **not** Universal Scaling.",
|
||||
"searchtags": [
|
||||
"tool",
|
||||
"scaling",
|
||||
"height",
|
||||
"extension",
|
||||
"avatar"
|
||||
],
|
||||
"requirements": [
|
||||
"BTKUILib"
|
||||
],
|
||||
"downloadlink": "https://github.com/NotAKidoS/NAK_CVR_Mods/releases/download/r48/ASTExtension.dll",
|
||||
"sourcelink": "https://github.com/NotAKidoS/NAK_CVR_Mods/tree/main/ASTExtension/",
|
||||
"changelog": "- Rebuilt for CVR 2025r181",
|
||||
"embedcolor": "#f61963"
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<RootNamespace>ASTExtension</RootNamespace>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
110
.Experimental/FeedbackDotChilloutVRDotNet/Main.cs
Normal file
110
.Experimental/FeedbackDotChilloutVRDotNet/Main.cs
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
using ABI_RC.Core.Player;
|
||||
using ABI_RC.Systems.ChatBox;
|
||||
using ABI_RC.Systems.UI.UILib;
|
||||
using ABI_RC.Systems.UI.UILib.UIObjects;
|
||||
using ABI_RC.Systems.UI.UILib.UIObjects.Components;
|
||||
using MelonLoader;
|
||||
|
||||
namespace NAK.FeedbackDotChilloutVRDotNet;
|
||||
|
||||
public class FeedbackDotChilloutVRDotNetMod : MelonMod
|
||||
{
|
||||
private static MelonPreferences_Category _prefs;
|
||||
private static MelonPreferences_Entry<bool> _autoReact;
|
||||
|
||||
public override void OnInitializeMelon()
|
||||
{
|
||||
// Emails:
|
||||
// Moderation Reports moderation@chilloutvr.net
|
||||
// Legal legal@chilloutvr.net
|
||||
// Team (general feedback, bug reports) team@chilloutvr.net
|
||||
|
||||
// Websites:
|
||||
// Feedback (Issue Tracker) feedback.chilloutvr.net
|
||||
// Docs docs.chilloutvr.net
|
||||
// Hub hub.chilloutvr.net
|
||||
// Discord discord.gg/chilloutvr
|
||||
|
||||
// Quick Messages:
|
||||
// I am not moderation. You will need to reach out to moderation@chilloutvr.net.
|
||||
|
||||
// Auto React (goofy, behind toggle):
|
||||
// issue, bug -> feedback site
|
||||
// nak fix, @NotAKid fix, @NotAKidoS fix, pls fix, go fix -> no
|
||||
|
||||
_prefs = MelonPreferences.CreateCategory(nameof(FeedbackDotChilloutVRDotNetMod));
|
||||
_autoReact = _prefs.CreateEntry("AutoReact", false, "Auto React",
|
||||
"Automatically reply to messages containing certain keywords (goofy).");
|
||||
|
||||
SetupMenu();
|
||||
SetupAutoReact();
|
||||
}
|
||||
|
||||
private static void SetupMenu()
|
||||
{
|
||||
Category category = QuickMenuAPI.MiscTabPage.AddCategory("Quick ChatBox Messages", true, true);
|
||||
category.ChildIndex = 0;
|
||||
|
||||
// Websites
|
||||
AddMessageButton(category, "Feedback", "feedback.chilloutvr.net");
|
||||
AddMessageButton(category, "Docs", "docs.chilloutvr.net");
|
||||
AddMessageButton(category, "Hub", "hub.chilloutvr.net");
|
||||
AddMessageButton(category, "Discord", "discord.gg/chilloutvr");
|
||||
|
||||
// Emails
|
||||
AddMessageButton(category, "Moderation", "moderation@chilloutvr.net");
|
||||
AddMessageButton(category, "Legal", "legal@chilloutvr.net");
|
||||
AddMessageButton(category, "Team", "team@chilloutvr.net");
|
||||
|
||||
// Canned responses
|
||||
AddMessageButton(category, "Not Moderation",
|
||||
"I am not moderation. You will need to reach out to moderation@chilloutvr.net.");
|
||||
|
||||
// Toggle for the goofy auto-react interceptor
|
||||
ToggleButton autoReactToggle = category.AddToggle("Auto React",
|
||||
"Automatically reply to messages with certain keywords (goofy).",
|
||||
_autoReact.Value);
|
||||
autoReactToggle.OnValueUpdated += b => _autoReact.Value = b;
|
||||
}
|
||||
|
||||
private static Button AddMessageButton(Category category, string name, string message)
|
||||
{
|
||||
Button button = category.AddButton(name, string.Empty, message, ButtonStyle.TextOnly);
|
||||
button.OnPress += () => ChatBoxAPI.SendMessage(message, true, true, false);
|
||||
return button;
|
||||
}
|
||||
|
||||
private static readonly ChatBoxAPI.InterceptorResult _emptyCauseCantReturnNull = new(false, false);
|
||||
|
||||
private static void SetupAutoReact()
|
||||
{
|
||||
ChatBoxAPI.AddReceivingInterceptor(message =>
|
||||
{
|
||||
if (_autoReact.Value)
|
||||
{
|
||||
string text = message.Message;
|
||||
string username = CVRPlayerManager.Instance.TryGetPlayerName(message.SenderGuid);
|
||||
|
||||
// Order matters: catch the "fix" demands before the generic feedback keywords.
|
||||
if (ContainsAny(text, "nak fix", "@NotAKid fix", "@NotAKidoS fix", "pls fix", "go fix"))
|
||||
ChatBoxAPI.SendMessage($"@{username} no", true, true, false);
|
||||
else if (ContainsAny(text, "issue", "bug", "feedback"))
|
||||
ChatBoxAPI.SendMessage($"@{username} feedback.chilloutvr.net", true, true, false);
|
||||
|
||||
// game broke -> remove mods, find player.log
|
||||
|
||||
}
|
||||
return _emptyCauseCantReturnNull;
|
||||
});
|
||||
}
|
||||
|
||||
private static bool ContainsAny(string source, params string[] values)
|
||||
{
|
||||
foreach (string value in values)
|
||||
{
|
||||
if (source.Contains(value, StringComparison.InvariantCultureIgnoreCase))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
using MelonLoader;
|
||||
using NAK.FeedbackDotChilloutVRDotNet.Properties;
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: AssemblyVersion(AssemblyInfoParams.Version)]
|
||||
[assembly: AssemblyFileVersion(AssemblyInfoParams.Version)]
|
||||
[assembly: AssemblyInformationalVersion(AssemblyInfoParams.Version)]
|
||||
[assembly: AssemblyTitle(nameof(NAK.FeedbackDotChilloutVRDotNet))]
|
||||
[assembly: AssemblyCompany(AssemblyInfoParams.Author)]
|
||||
[assembly: AssemblyProduct(nameof(NAK.FeedbackDotChilloutVRDotNet))]
|
||||
|
||||
[assembly: MelonInfo(
|
||||
typeof(NAK.FeedbackDotChilloutVRDotNet.FeedbackDotChilloutVRDotNetMod),
|
||||
nameof(NAK.FeedbackDotChilloutVRDotNet),
|
||||
AssemblyInfoParams.Version,
|
||||
AssemblyInfoParams.Author,
|
||||
downloadLink: "https://github.com/NotAKidoS/NAK_CVR_Mods/tree/main/FeedbackDotChilloutVRDotNet"
|
||||
)]
|
||||
|
||||
[assembly: MelonGame("ChilloutVR", "ChilloutVR")]
|
||||
[assembly: MelonPlatform(MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)]
|
||||
[assembly: MelonPlatformDomain(MelonPlatformDomainAttribute.CompatibleDomains.MONO)]
|
||||
[assembly: MelonColor(255, 246, 25, 99)] // red-pink
|
||||
[assembly: MelonAuthorColor(255, 158, 21, 32)] // red
|
||||
[assembly: HarmonyDontPatchAll]
|
||||
|
||||
namespace NAK.FeedbackDotChilloutVRDotNet.Properties;
|
||||
internal static class AssemblyInfoParams
|
||||
{
|
||||
public const string Version = "1.0.0";
|
||||
public const string Author = "NotAKidoS";
|
||||
}
|
||||
54
.Experimental/FeedbackDotChilloutVRDotNet/README.md
Normal file
54
.Experimental/FeedbackDotChilloutVRDotNet/README.md
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
# ASTExtension
|
||||
|
||||
Extension mod for [Avatar Scale Tool](https://github.com/NotAKidoS/AvatarScaleTool):
|
||||
- VR Gesture to scale
|
||||
- Persistent height
|
||||
- Copy height from others
|
||||
|
||||
Best used with Avatar Scale Tool, but will attempt to work with found scaling setups.
|
||||
Requires already having Avatar Scaling on the avatar. This is **not** Universal Scaling.
|
||||
|
||||
## Supported Setups
|
||||
|
||||
ASTExtension will attempt to work with the following setups:
|
||||
|
||||
**Parameter Names:**
|
||||
- AvatarScale
|
||||
- Scale
|
||||
- Scaler
|
||||
- Scale/Scale
|
||||
- Height
|
||||
- LoliModifier
|
||||
- AvatarSize
|
||||
- Size
|
||||
- SizeScale
|
||||
- Scaling
|
||||
|
||||
These parameter names are not case sensitive and have been gathered from polling the community for common parameter names.
|
||||
|
||||
Assuming the parameter is a float, ASTExtension will attempt to use it as the height parameter. Will automatically calibrate to the height range of the found parameter, assuming the scaling animation is in a blend tree / state using motion time & is linear. The scaling animation state **must be active** at time of avatar load.
|
||||
|
||||
The max value ASTExtension will drive the parameter to is 100. As the mod is having to guess the max height, it may not be accurate if the max height is not capped at a multiple of 10.
|
||||
|
||||
Examples:
|
||||
- `AvatarScale` - 0 to 1 (slider)
|
||||
- This is the default setup for Avatar Scale Tool and will work perfectly.
|
||||
- `Scale` - 0 to 100 (input single)
|
||||
- This will also work perfectly as the max height is a multiple of 10.
|
||||
- `Height` - 0 to 2 (input single)
|
||||
- This will not work properly. The max value to drive the parameter to is not a multiple of 10, and as such ASTExtension will believe the parameter range is 0 to 1.
|
||||
- `BurntToast` - 0 to 10 (input single)
|
||||
- This will not work properly. The parameter name is not recognized by ASTExtension.
|
||||
|
||||
If your setup is theoretically supported but not working, it is likely the scaling animation is not linear or has loop enabled if using Motion Time, making the first and last frame identical height. In this case, you will need to fix your animation clip curves / blend tree to be linear &|| not loop, or use Avatar Scale Tool to generate a new scaling animation.
|
||||
|
||||
---
|
||||
|
||||
Here is the block of text where I tell you this mod is not affiliated with or endorsed by ABI.
|
||||
https://documentation.abinteractive.net/official/legal/tos/#7-modding-our-games
|
||||
|
||||
> This mod is an independent creation not affiliated with, supported by, or approved by Alpha Blend Interactive.
|
||||
|
||||
> Use of this mod is done so at the user's own risk and the creator cannot be held responsible for any issues arising from its use.
|
||||
|
||||
> To the best of my knowledge, I have adhered to the Modding Guidelines established by Alpha Blend Interactive.
|
||||
24
.Experimental/FeedbackDotChilloutVRDotNet/format.json
Normal file
24
.Experimental/FeedbackDotChilloutVRDotNet/format.json
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"_id": 223,
|
||||
"name": "ASTExtension",
|
||||
"modversion": "1.0.5",
|
||||
"gameversion": "2025r181",
|
||||
"loaderversion": "0.7.2",
|
||||
"modtype": "Mod",
|
||||
"author": "NotAKidoS",
|
||||
"description": "Extension mod for [Avatar Scale Tool](https://github.com/NotAKidoS/AvatarScaleTool):\n- VR Gesture to scale\n- Persistent height\n- Copy height from others\n\nBest used with Avatar Scale Tool, but will attempt to work with found scaling setups.\nRequires already having Avatar Scaling on the avatar. This is **not** Universal Scaling.",
|
||||
"searchtags": [
|
||||
"tool",
|
||||
"scaling",
|
||||
"height",
|
||||
"extension",
|
||||
"avatar"
|
||||
],
|
||||
"requirements": [
|
||||
"BTKUILib"
|
||||
],
|
||||
"downloadlink": "https://github.com/NotAKidoS/NAK_CVR_Mods/releases/download/r48/ASTExtension.dll",
|
||||
"sourcelink": "https://github.com/NotAKidoS/NAK_CVR_Mods/tree/main/ASTExtension/",
|
||||
"changelog": "- Rebuilt for CVR 2025r181",
|
||||
"embedcolor": "#f61963"
|
||||
}
|
||||
6
.Experimental/FuckDebugConsole/FuckDebugConsole.csproj
Normal file
6
.Experimental/FuckDebugConsole/FuckDebugConsole.csproj
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<RootNamespace>ASTExtension</RootNamespace>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
23
.Experimental/FuckDebugConsole/Main.cs
Normal file
23
.Experimental/FuckDebugConsole/Main.cs
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
using MelonLoader;
|
||||
using UnityEngine;
|
||||
|
||||
namespace NAK.FuckDebugConsole;
|
||||
|
||||
public class FuckDebugConsoleMod : MelonMod
|
||||
{
|
||||
private static readonly MelonPreferences_Category Category =
|
||||
MelonPreferences.CreateCategory(nameof(FuckDebugConsole));
|
||||
|
||||
internal static readonly MelonPreferences_Entry<bool> EntryEnableDebugConsole =
|
||||
Category.CreateEntry("enable_debug_console", false,
|
||||
"Enable Debug Console", description: "Whether to use the debug console at all.");
|
||||
|
||||
public override void OnInitializeMelon()
|
||||
{
|
||||
Debug.developerConsoleEnabled = EntryEnableDebugConsole.Value;
|
||||
EntryEnableDebugConsole.OnEntryValueChanged.Subscribe((oldValue, newValue) =>
|
||||
{
|
||||
Debug.developerConsoleEnabled = newValue;
|
||||
});
|
||||
}
|
||||
}
|
||||
32
.Experimental/FuckDebugConsole/Properties/AssemblyInfo.cs
Normal file
32
.Experimental/FuckDebugConsole/Properties/AssemblyInfo.cs
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
using MelonLoader;
|
||||
using NAK.FuckDebugConsole.Properties;
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: AssemblyVersion(AssemblyInfoParams.Version)]
|
||||
[assembly: AssemblyFileVersion(AssemblyInfoParams.Version)]
|
||||
[assembly: AssemblyInformationalVersion(AssemblyInfoParams.Version)]
|
||||
[assembly: AssemblyTitle(nameof(NAK.FuckDebugConsole))]
|
||||
[assembly: AssemblyCompany(AssemblyInfoParams.Author)]
|
||||
[assembly: AssemblyProduct(nameof(NAK.FuckDebugConsole))]
|
||||
|
||||
[assembly: MelonInfo(
|
||||
typeof(NAK.FuckDebugConsole.FuckDebugConsoleMod),
|
||||
nameof(NAK.FuckDebugConsole),
|
||||
AssemblyInfoParams.Version,
|
||||
AssemblyInfoParams.Author,
|
||||
downloadLink: "https://github.com/NotAKidoS/NAK_CVR_Mods/tree/main/FuckDebugConsole"
|
||||
)]
|
||||
|
||||
[assembly: MelonGame("ChilloutVR", "ChilloutVR")]
|
||||
[assembly: MelonPlatform(MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)]
|
||||
[assembly: MelonPlatformDomain(MelonPlatformDomainAttribute.CompatibleDomains.MONO)]
|
||||
[assembly: MelonColor(255, 246, 25, 99)] // red-pink
|
||||
[assembly: MelonAuthorColor(255, 158, 21, 32)] // red
|
||||
[assembly: HarmonyDontPatchAll]
|
||||
|
||||
namespace NAK.FuckDebugConsole.Properties;
|
||||
internal static class AssemblyInfoParams
|
||||
{
|
||||
public const string Version = "1.0.0";
|
||||
public const string Author = "NotAKidoS";
|
||||
}
|
||||
54
.Experimental/FuckDebugConsole/README.md
Normal file
54
.Experimental/FuckDebugConsole/README.md
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
# ASTExtension
|
||||
|
||||
Extension mod for [Avatar Scale Tool](https://github.com/NotAKidoS/AvatarScaleTool):
|
||||
- VR Gesture to scale
|
||||
- Persistent height
|
||||
- Copy height from others
|
||||
|
||||
Best used with Avatar Scale Tool, but will attempt to work with found scaling setups.
|
||||
Requires already having Avatar Scaling on the avatar. This is **not** Universal Scaling.
|
||||
|
||||
## Supported Setups
|
||||
|
||||
ASTExtension will attempt to work with the following setups:
|
||||
|
||||
**Parameter Names:**
|
||||
- AvatarScale
|
||||
- Scale
|
||||
- Scaler
|
||||
- Scale/Scale
|
||||
- Height
|
||||
- LoliModifier
|
||||
- AvatarSize
|
||||
- Size
|
||||
- SizeScale
|
||||
- Scaling
|
||||
|
||||
These parameter names are not case sensitive and have been gathered from polling the community for common parameter names.
|
||||
|
||||
Assuming the parameter is a float, ASTExtension will attempt to use it as the height parameter. Will automatically calibrate to the height range of the found parameter, assuming the scaling animation is in a blend tree / state using motion time & is linear. The scaling animation state **must be active** at time of avatar load.
|
||||
|
||||
The max value ASTExtension will drive the parameter to is 100. As the mod is having to guess the max height, it may not be accurate if the max height is not capped at a multiple of 10.
|
||||
|
||||
Examples:
|
||||
- `AvatarScale` - 0 to 1 (slider)
|
||||
- This is the default setup for Avatar Scale Tool and will work perfectly.
|
||||
- `Scale` - 0 to 100 (input single)
|
||||
- This will also work perfectly as the max height is a multiple of 10.
|
||||
- `Height` - 0 to 2 (input single)
|
||||
- This will not work properly. The max value to drive the parameter to is not a multiple of 10, and as such ASTExtension will believe the parameter range is 0 to 1.
|
||||
- `BurntToast` - 0 to 10 (input single)
|
||||
- This will not work properly. The parameter name is not recognized by ASTExtension.
|
||||
|
||||
If your setup is theoretically supported but not working, it is likely the scaling animation is not linear or has loop enabled if using Motion Time, making the first and last frame identical height. In this case, you will need to fix your animation clip curves / blend tree to be linear &|| not loop, or use Avatar Scale Tool to generate a new scaling animation.
|
||||
|
||||
---
|
||||
|
||||
Here is the block of text where I tell you this mod is not affiliated with or endorsed by ABI.
|
||||
https://documentation.abinteractive.net/official/legal/tos/#7-modding-our-games
|
||||
|
||||
> This mod is an independent creation not affiliated with, supported by, or approved by Alpha Blend Interactive.
|
||||
|
||||
> Use of this mod is done so at the user's own risk and the creator cannot be held responsible for any issues arising from its use.
|
||||
|
||||
> To the best of my knowledge, I have adhered to the Modding Guidelines established by Alpha Blend Interactive.
|
||||
24
.Experimental/FuckDebugConsole/format.json
Normal file
24
.Experimental/FuckDebugConsole/format.json
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"_id": 223,
|
||||
"name": "ASTExtension",
|
||||
"modversion": "1.0.5",
|
||||
"gameversion": "2025r181",
|
||||
"loaderversion": "0.7.2",
|
||||
"modtype": "Mod",
|
||||
"author": "NotAKidoS",
|
||||
"description": "Extension mod for [Avatar Scale Tool](https://github.com/NotAKidoS/AvatarScaleTool):\n- VR Gesture to scale\n- Persistent height\n- Copy height from others\n\nBest used with Avatar Scale Tool, but will attempt to work with found scaling setups.\nRequires already having Avatar Scaling on the avatar. This is **not** Universal Scaling.",
|
||||
"searchtags": [
|
||||
"tool",
|
||||
"scaling",
|
||||
"height",
|
||||
"extension",
|
||||
"avatar"
|
||||
],
|
||||
"requirements": [
|
||||
"BTKUILib"
|
||||
],
|
||||
"downloadlink": "https://github.com/NotAKidoS/NAK_CVR_Mods/releases/download/r48/ASTExtension.dll",
|
||||
"sourcelink": "https://github.com/NotAKidoS/NAK_CVR_Mods/tree/main/ASTExtension/",
|
||||
"changelog": "- Rebuilt for CVR 2025r181",
|
||||
"embedcolor": "#f61963"
|
||||
}
|
||||
|
|
@ -75,11 +75,11 @@ end
|
|||
|
||||
---
|
||||
|
||||
Here is the block of text where I tell you this mod is not affiliated with or endorsed by ABI.
|
||||
https://documentation.abinteractive.net/official/legal/tos/#7-modding-our-games
|
||||
Here is the block of text where I tell you this mod is not affiliated with or endorsed by ChilloutVR.
|
||||
https://docs.chilloutvr.net/official/legal/tos/#6-modding-our-game
|
||||
|
||||
> This mod is an independent creation not affiliated with, supported by, or approved by Alpha Blend Interactive.
|
||||
> This mod is an independent creation not affiliated with, supported by, or approved by ChilloutVR.
|
||||
|
||||
> Use of this mod is done so at the user's own risk and the creator cannot be held responsible for any issues arising from its use.
|
||||
|
||||
> To the best of my knowledge, I have adhered to the Modding Guidelines established by Alpha Blend Interactive.
|
||||
> To the best of my knowledge, I have adhered to the Modding Guidelines established by ChilloutVR.
|
||||
|
|
|
|||
|
|
@ -1,16 +1,11 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<ItemGroup>
|
||||
<Reference Include="BTKUILib">
|
||||
<HintPath>..\.ManagedLibs\BTKUILib.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Remove="Resources\origin-shift-inactive.png" />
|
||||
<EmbeddedResource Include="Resources\OriginShift-Icon-Inactive.png" />
|
||||
<None Remove="Resources\origin-shift-forced.png" />
|
||||
<EmbeddedResource Include="Resources\OriginShift-Icon-Forced.png" />
|
||||
<None Remove="Resources\origin-shift-active.png" />
|
||||
<None Remove="Resources\OriginShift-Icon-Active.png" />
|
||||
<EmbeddedResource Include="Resources\OriginShift-Icon-Active.png" />
|
||||
<None Remove="Resources\OriginShift-Icon-Forced.png" />
|
||||
<EmbeddedResource Include="Resources\OriginShift-Icon-Forced.png" />
|
||||
<None Remove="Resources\OriginShift-Icon-Inactive.png" />
|
||||
<EmbeddedResource Include="Resources\OriginShift-Icon-Inactive.png" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
|
|
|||
|
|
@ -42,11 +42,11 @@ The provided receiver components are automatically added to Props, Players, and
|
|||
|
||||
---
|
||||
|
||||
Here is the block of text where I tell you this mod is not affiliated with or endorsed by ABI.
|
||||
https://documentation.abinteractive.net/official/legal/tos/#7-modding-our-games
|
||||
Here is the block of text where I tell you this mod is not affiliated with or endorsed by ChilloutVR.
|
||||
https://docs.chilloutvr.net/official/legal/tos/#6-modding-our-game
|
||||
|
||||
> This mod is an independent creation not affiliated with, supported by, or approved by Alpha Blend Interactive.
|
||||
> This mod is an independent creation not affiliated with, supported by, or approved by ChilloutVR.
|
||||
|
||||
> Use of this mod is done so at the user's own risk and the creator cannot be held responsible for any issues arising from its use.
|
||||
|
||||
> To the best of my knowledge, I have adhered to the Modding Guidelines established by Alpha Blend Interactive.
|
||||
> To the best of my knowledge, I have adhered to the Modding Guidelines established by ChilloutVR.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue