mirror of
https://github.com/NotAKidoS/NAK_CVR_Mods.git
synced 2026-01-01 14:17:31 +00:00
mass commit of laziness
This commit is contained in:
parent
ce992c70ee
commit
6d4fc549d9
167 changed files with 5471 additions and 675 deletions
|
|
@ -0,0 +1,2 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project Sdk="Microsoft.NET.Sdk" />
|
||||
89
.Experimental/ByeByePerformanceThankYouAMD/Main.cs
Normal file
89
.Experimental/ByeByePerformanceThankYouAMD/Main.cs
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
using System.Collections;
|
||||
using ABI_RC.Core;
|
||||
using ABI_RC.Core.IO;
|
||||
using ABI_RC.Core.Util.Encryption;
|
||||
using ABI_RC.Systems.GameEventSystem;
|
||||
using HarmonyLib;
|
||||
using MelonLoader;
|
||||
using UnityEngine;
|
||||
|
||||
namespace NAK.ByeByePerformanceThankYouAMD;
|
||||
|
||||
public class ByeByePerformanceThankYouAMDMod : MelonMod
|
||||
{
|
||||
private static MelonLogger.Instance Logger;
|
||||
|
||||
private static readonly MelonPreferences_Category Category =
|
||||
MelonPreferences.CreateCategory(nameof(ByeByePerformanceThankYouAMD));
|
||||
|
||||
private static readonly MelonPreferences_Entry<bool> EntryDisableMaterialInstancing =
|
||||
Category.CreateEntry(
|
||||
identifier: "disable_material_instancing",
|
||||
true,
|
||||
display_name: "Disable Material Instancing",
|
||||
description: "Disables material instancing to mitigate a shit visual issue on AMD");
|
||||
|
||||
public override void OnInitializeMelon()
|
||||
{
|
||||
Logger = LoggerInstance;
|
||||
ApplyPatches(typeof(CVREncryptionRouter_Patches));
|
||||
}
|
||||
|
||||
private void ApplyPatches(Type type)
|
||||
{
|
||||
try
|
||||
{
|
||||
HarmonyInstance.PatchAll(type);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
LoggerInstance.Msg($"Failed while patching {type.Name}!");
|
||||
LoggerInstance.Error(e);
|
||||
}
|
||||
}
|
||||
|
||||
internal static void ScanForInstancedMaterials()
|
||||
{
|
||||
if (!EntryDisableMaterialInstancing.Value)
|
||||
return;
|
||||
|
||||
Logger.Msg("An Asset Bundle has loaded, scanning for instanced materials to disable...");
|
||||
|
||||
if (Resources.FindObjectsOfTypeAll(typeof(Material)) is not Material[] allMaterials)
|
||||
{
|
||||
Logger.Msg("No materials found.");
|
||||
return;
|
||||
}
|
||||
|
||||
int count = 0;
|
||||
foreach (Material material in allMaterials)
|
||||
{
|
||||
if (!material || !material.enableInstancing) continue;
|
||||
material.enableInstancing = false;
|
||||
count++;
|
||||
}
|
||||
|
||||
Logger.Msg($"Finished scanning for instanced materials. Disabled instancing on {count} loaded materials.");
|
||||
}
|
||||
}
|
||||
|
||||
internal static class CVREncryptionRouter_Patches
|
||||
{
|
||||
[HarmonyPostfix]
|
||||
[HarmonyPatch(typeof(CVREncryptionRouter), nameof(CVREncryptionRouter.LoadEncryptedBundle), typeof(bool))]
|
||||
private static void CVREncryptionRouter_LoadEncryptedBundle_Postfix(ref IEnumerator __result)
|
||||
{
|
||||
__result = Wrapper(__result);
|
||||
}
|
||||
|
||||
private static IEnumerator Wrapper(IEnumerator inner)
|
||||
{
|
||||
yield return null; // before start
|
||||
|
||||
while (inner.MoveNext())
|
||||
yield return inner.Current;
|
||||
|
||||
// after finish
|
||||
ByeByePerformanceThankYouAMDMod.ScanForInstancedMaterials();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
using MelonLoader;
|
||||
using NAK.ByeByePerformanceThankYouAMD.Properties;
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: AssemblyVersion(AssemblyInfoParams.Version)]
|
||||
[assembly: AssemblyFileVersion(AssemblyInfoParams.Version)]
|
||||
[assembly: AssemblyInformationalVersion(AssemblyInfoParams.Version)]
|
||||
[assembly: AssemblyTitle(nameof(NAK.ByeByePerformanceThankYouAMD))]
|
||||
[assembly: AssemblyCompany(AssemblyInfoParams.Author)]
|
||||
[assembly: AssemblyProduct(nameof(NAK.ByeByePerformanceThankYouAMD))]
|
||||
|
||||
[assembly: MelonInfo(
|
||||
typeof(NAK.ByeByePerformanceThankYouAMD.ByeByePerformanceThankYouAMDMod),
|
||||
nameof(NAK.ByeByePerformanceThankYouAMD),
|
||||
AssemblyInfoParams.Version,
|
||||
AssemblyInfoParams.Author,
|
||||
downloadLink: "https://github.com/NotAKidoS/NAK_CVR_Mods/tree/main/ByeByePerformanceThankYouAMD"
|
||||
)]
|
||||
|
||||
[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.ByeByePerformanceThankYouAMD.Properties;
|
||||
internal static class AssemblyInfoParams
|
||||
{
|
||||
public const string Version = "1.0.0";
|
||||
public const string Author = "NotAKidoS";
|
||||
}
|
||||
14
.Experimental/ByeByePerformanceThankYouAMD/README.md
Normal file
14
.Experimental/ByeByePerformanceThankYouAMD/README.md
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
# SearchWithSpacesFix
|
||||
|
||||
Fixes search terms that use spaces.
|
||||
|
||||
---
|
||||
|
||||
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.
|
||||
23
.Experimental/ByeByePerformanceThankYouAMD/format.json
Normal file
23
.Experimental/ByeByePerformanceThankYouAMD/format.json
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"_id": -1,
|
||||
"name": "SearchWithSpacesFix",
|
||||
"modversion": "1.0.0",
|
||||
"gameversion": "2024r177",
|
||||
"loaderversion": "0.6.1",
|
||||
"modtype": "Mod",
|
||||
"author": "NotAKidoS",
|
||||
"description": "Fixes search terms that include spaces.",
|
||||
"searchtags": [
|
||||
"search",
|
||||
"spaces",
|
||||
"fix",
|
||||
"meow"
|
||||
],
|
||||
"requirements": [
|
||||
"None"
|
||||
],
|
||||
"downloadlink": "https://github.com/NotAKidoS/NAK_CVR_Mods/releases/download/r42/SearchWithSpacesFix.dll",
|
||||
"sourcelink": "https://github.com/NotAKidoS/NAK_CVR_Mods/tree/main/SearchWithSpacesFix/",
|
||||
"changelog": "- Initial release",
|
||||
"embedcolor": "#f61963"
|
||||
}
|
||||
|
|
@ -1,5 +1,4 @@
|
|||
using System.Text;
|
||||
using ABI_RC.Core.InteractionSystem;
|
||||
using ABI_RC.Core.UI;
|
||||
using ABI.CCK.Components;
|
||||
using ABI.CCK.Components.ScriptableObjects;
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ using ABI.CCK.Components;
|
|||
using HarmonyLib;
|
||||
using MelonLoader;
|
||||
using NAK.CVRLuaToolsExtension.NamedPipes;
|
||||
using UnityEngine;
|
||||
|
||||
namespace NAK.CVRLuaToolsExtension;
|
||||
|
||||
|
|
|
|||
103
.Experimental/DummyMenu/Components/DummyMenuManager.cs
Normal file
103
.Experimental/DummyMenu/Components/DummyMenuManager.cs
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
using ABI_RC.Core.UI.UIRework;
|
||||
using ABI_RC.Systems.InputManagement;
|
||||
using UnityEngine;
|
||||
|
||||
namespace NAK.DummyMenu;
|
||||
|
||||
public class DummyMenuManager : CVRUIManagerBaseInput
|
||||
{
|
||||
#region Boilerplate
|
||||
|
||||
public static DummyMenuManager Instance { get; private set; }
|
||||
|
||||
public override void Start()
|
||||
{
|
||||
if (Instance && Instance != this)
|
||||
{
|
||||
Destroy(gameObject);
|
||||
return;
|
||||
}
|
||||
Instance = this;
|
||||
base.Start();
|
||||
|
||||
ListenForModSettingChanges();
|
||||
}
|
||||
|
||||
public override void ReloadView()
|
||||
{
|
||||
if (IsViewShown && !ModSettings.EntryReloadMenuEvenWhenOpen.Value) return;
|
||||
TrySetMenuPage();
|
||||
base.ReloadView();
|
||||
}
|
||||
|
||||
public override void OnFinishedLoad(string _)
|
||||
{
|
||||
base.OnFinishedLoad(_);
|
||||
|
||||
// Usually done in OnReadyForBindings, but that isn't called for my menu :)
|
||||
_cohtmlRenderMaterial = _uiRenderer.sharedMaterial;
|
||||
// ReSharper disable thrice Unity.PreferAddressByIdToGraphicsParams
|
||||
_cohtmlRenderMaterial.SetTexture("_DesolvePattern", pattern);
|
||||
_cohtmlRenderMaterial.SetTexture("_DesolveTiming", timing);
|
||||
_cohtmlRenderMaterial.SetTextureScale("_DesolvePattern", new Vector2(16, 9));
|
||||
}
|
||||
|
||||
public void ToggleView()
|
||||
{
|
||||
bool invertShown = !IsViewShown;
|
||||
ToggleView(invertShown);
|
||||
CursorLockManager.Instance.SetUnlockWithId(invertShown, nameof(DummyMenuManager));
|
||||
}
|
||||
|
||||
#endregion Boilerplate
|
||||
|
||||
private void ListenForModSettingChanges()
|
||||
{
|
||||
ModSettings.EntryPageCouiPath.OnEntryValueChanged.Subscribe((oldValue, newValue) =>
|
||||
{
|
||||
DummyMenuMod.Logger.Msg($"Changing COUI page from {oldValue} to {newValue}");
|
||||
cohtmlView.Page = newValue;
|
||||
});
|
||||
|
||||
ModSettings.EntryPageWidth.OnEntryValueChanged.Subscribe((oldValue, newValue) =>
|
||||
{
|
||||
DummyMenuMod.Logger.Msg($"Changing COUI width from {oldValue} to {newValue}");
|
||||
cohtmlView.Width = newValue;
|
||||
DummyMenuPositionHelper.Instance.UpdateAspectRatio(cohtmlView.Width, cohtmlView.Height);
|
||||
});
|
||||
|
||||
ModSettings.EntryPageHeight.OnEntryValueChanged.Subscribe((oldValue, newValue) =>
|
||||
{
|
||||
DummyMenuMod.Logger.Msg($"Changing COUI height from {oldValue} to {newValue}");
|
||||
cohtmlView.Height = newValue;
|
||||
DummyMenuPositionHelper.Instance.UpdateAspectRatio(cohtmlView.Width, cohtmlView.Height);
|
||||
});
|
||||
|
||||
ModSettings.EntryToggleMeToResetModifiers.OnEntryValueChanged.Subscribe((_, newValue) =>
|
||||
{
|
||||
if (!newValue) return;
|
||||
DummyMenuMod.Logger.Msg("Resetting modifiers to default because the toggle was enabled");
|
||||
ModSettings.EntryToggleMeToResetModifiers.Value = false;
|
||||
ModSettings.EntryDesktopMenuScaleModifier.ResetToDefault();
|
||||
ModSettings.EntryDesktopMenuDistanceModifier.ResetToDefault();
|
||||
ModSettings.EntryVrMenuScaleModifier.ResetToDefault();
|
||||
ModSettings.EntryVrMenuDistanceModifier.ResetToDefault();
|
||||
});
|
||||
}
|
||||
|
||||
public void TrySetMenuPage()
|
||||
{
|
||||
string couiPath = ModSettings.EntryPageCouiPath.Value;
|
||||
string fullCouiPath = CreateDummyMenu.GetFullCouiPath(couiPath);
|
||||
if (File.Exists(fullCouiPath))
|
||||
{
|
||||
DummyMenuMod.Logger.Msg($"Found COUI page at {fullCouiPath}. Setting it as the controlledview page.");
|
||||
cohtmlView.Page = "coui://" + couiPath;
|
||||
}
|
||||
else
|
||||
{
|
||||
DummyMenuMod.Logger.Error($"No COUI page found at {fullCouiPath}. Please create one at that path, or change the mod setting to point to an existing file. Using default example page instead.");
|
||||
cohtmlView.Page = "coui://" + CreateDummyMenu.ExampleDummyMenuPath;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
using ABI_RC.Core.InteractionSystem;
|
||||
using ABI_RC.Core.Savior;
|
||||
using UnityEngine;
|
||||
|
||||
namespace NAK.DummyMenu;
|
||||
|
||||
[DefaultExecutionOrder(16000)] // just before ControllerRay
|
||||
public class DummyMenuPositionHelper : MenuPositionHelperBase
|
||||
{
|
||||
public static DummyMenuPositionHelper Instance { get; private set; }
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (Instance && Instance != this)
|
||||
{
|
||||
Destroy(this);
|
||||
return;
|
||||
}
|
||||
Instance = this;
|
||||
}
|
||||
|
||||
public override bool IsMenuOpen => DummyMenuManager.Instance.IsViewShown;
|
||||
public override float MenuScaleModifier => MetaPort.Instance.isUsingVr ? ModSettings.EntryVrMenuScaleModifier.Value : ModSettings.EntryDesktopMenuScaleModifier.Value;
|
||||
public override float MenuDistanceModifier => MetaPort.Instance.isUsingVr ? ModSettings.EntryVrMenuDistanceModifier.Value : ModSettings.EntryDesktopMenuDistanceModifier.Value;
|
||||
|
||||
public void UpdateAspectRatio(float width, float height)
|
||||
{
|
||||
if (width <= 0f || height <= 0f)
|
||||
return;
|
||||
|
||||
_menuAspectRatio = width / height;
|
||||
|
||||
float normalizedWidth = width / Mathf.Max(width, height);
|
||||
float normalizedHeight = height / Mathf.Max(width, height);
|
||||
menuTransform.localScale = new Vector3(normalizedWidth, normalizedHeight, 1f);
|
||||
}
|
||||
}
|
||||
243
.Experimental/DummyMenu/CreateDummyMenu.cs
Normal file
243
.Experimental/DummyMenu/CreateDummyMenu.cs
Normal file
|
|
@ -0,0 +1,243 @@
|
|||
using ABI_RC.Core;
|
||||
using ABI_RC.Core.InteractionSystem;
|
||||
using ABI_RC.Core.UI;
|
||||
using UnityEngine;
|
||||
|
||||
namespace NAK.DummyMenu;
|
||||
|
||||
public static class CreateDummyMenu
|
||||
{
|
||||
public static void Create()
|
||||
{
|
||||
CreateDefaultExamplePageIfNeeded();
|
||||
|
||||
GameObject cohtmlRootObject = GameObject.Find("Cohtml");
|
||||
|
||||
// Create menu rig
|
||||
// Cohtml -> Root -> Offset -> Menu
|
||||
GameObject dummyMenuRoot = new("DummyMenuRoot");
|
||||
GameObject dummyMenuOffset = new("DummyMenuOffset");
|
||||
GameObject dummyMenuItself = new("DummyMenu");
|
||||
dummyMenuItself.transform.SetParent(dummyMenuOffset.transform);
|
||||
dummyMenuOffset.transform.SetParent(dummyMenuRoot.transform);
|
||||
dummyMenuRoot.transform.SetParent(cohtmlRootObject.transform);
|
||||
|
||||
// Add dummy menu position helper
|
||||
DummyMenuPositionHelper positionHelper = dummyMenuRoot.AddComponent<DummyMenuPositionHelper>();
|
||||
positionHelper._offsetTransform = dummyMenuOffset.transform;
|
||||
positionHelper.menuTransform = dummyMenuItself.transform;
|
||||
|
||||
// Add components to menu (MeshFilter, MeshRenderer, Animator, CohtmlControlledView)
|
||||
MeshFilter meshFilter = dummyMenuItself.AddComponent<MeshFilter>();
|
||||
MeshRenderer meshRenderer = dummyMenuItself.AddComponent<MeshRenderer>();
|
||||
Animator animator = dummyMenuItself.AddComponent<Animator>();
|
||||
CohtmlControlledView controlledView = dummyMenuItself.AddComponent<CohtmlControlledView>();
|
||||
|
||||
// Add dummy menu manager
|
||||
DummyMenuManager menuManager = dummyMenuItself.AddComponent<DummyMenuManager>();
|
||||
menuManager.cohtmlView = controlledView;
|
||||
menuManager._viewAnimator = animator;
|
||||
menuManager._uiRenderer = meshRenderer;
|
||||
|
||||
// Steal from main menu
|
||||
menuManager.pattern = ViewManager.Instance.pattern;
|
||||
menuManager.timing = ViewManager.Instance.timing;
|
||||
meshFilter.mesh = ViewManager.Instance.GetComponent<MeshFilter>().sharedMesh;
|
||||
meshRenderer.sharedMaterial = null; // assign empty material
|
||||
animator.runtimeAnimatorController = ViewManager.Instance.GetComponent<Animator>().runtimeAnimatorController;
|
||||
|
||||
// Put everything on UI Internal layer
|
||||
dummyMenuRoot.SetLayerRecursive(CVRLayers.UIInternal);
|
||||
|
||||
// Apply initial settings
|
||||
menuManager.TrySetMenuPage();
|
||||
|
||||
float pageWidth = ModSettings.EntryPageWidth.Value;
|
||||
float pageHeight = ModSettings.EntryPageHeight.Value;
|
||||
positionHelper.UpdateAspectRatio(pageWidth, pageHeight);
|
||||
}
|
||||
|
||||
internal const string ExampleDummyMenuPath = "UIResources/DummyMenu/_example.html";
|
||||
internal static string GetFullCouiPath(string couiPath) => Path.Combine(Application.streamingAssetsPath, "Cohtml", couiPath);
|
||||
|
||||
private static void CreateDefaultExamplePageIfNeeded()
|
||||
{
|
||||
// Check if there is a file at our default path
|
||||
string fullPath = GetFullCouiPath(ExampleDummyMenuPath);
|
||||
if (File.Exists(fullPath))
|
||||
{
|
||||
DummyMenuMod.Logger.Msg($"Dummy menu HTML file already exists at {fullPath}. No need to create a new one.");
|
||||
return;
|
||||
}
|
||||
DummyMenuMod.Logger.Msg($"No dummy menu HTML file found at {fullPath}. Creating a default one.");
|
||||
|
||||
// Create the directory if it doesn't exist
|
||||
string directory = Path.GetDirectoryName(fullPath);
|
||||
if (!Directory.Exists(directory)) Directory.CreateDirectory(directory!);
|
||||
|
||||
// Create a default HTML file
|
||||
using StreamWriter writer = new(fullPath, false);
|
||||
writer.Write(DefaultHtmlContent);
|
||||
writer.Flush();
|
||||
writer.Close();
|
||||
DummyMenuMod.Logger.Msg($"Created default dummy menu HTML file at {fullPath}. You can now open the dummy menu in-game.");
|
||||
}
|
||||
|
||||
#region Default HTML Content
|
||||
|
||||
private const string DefaultHtmlContent = """
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<title>Cohtml Bubble Pop — 1280×720</title>
|
||||
<style>
|
||||
html,body {
|
||||
height:100%; margin:0;
|
||||
background:#061018;
|
||||
display:flex; align-items:center; justify-content:center;
|
||||
font-family:Arial,Helvetica,sans-serif;
|
||||
}
|
||||
#stage {
|
||||
width:1280px; height:720px;
|
||||
position:relative; overflow:hidden;
|
||||
border-radius:20px;
|
||||
border:6px solid rgba(0,255,255,0.12);
|
||||
box-shadow:0 20px 60px rgba(0,0,0,0.7), inset 0 0 80px rgba(0,255,255,0.03);
|
||||
background:linear-gradient(135deg,#03121a 0%,#071826 60%);
|
||||
-webkit-user-select:none; user-select:none;
|
||||
}
|
||||
.panel {
|
||||
position:absolute; left:50%; top:50%;
|
||||
transform:translate(-50%,-50%);
|
||||
text-align:center; color:#dff9ff;
|
||||
pointer-events:none;
|
||||
z-index:10;
|
||||
}
|
||||
.title {
|
||||
font-size:56px; font-weight:700; letter-spacing:1px;
|
||||
margin:0; text-shadow:0 6px 30px rgba(0,255,255,0.06);
|
||||
}
|
||||
.subtitle { font-size:20px; opacity:0.85; margin-top:6px; }
|
||||
/* bubbles */
|
||||
.bubble {
|
||||
position:absolute; border-radius:50%;
|
||||
pointer-events:auto;
|
||||
will-change:transform,opacity;
|
||||
box-shadow:0 6px 40px rgba(0,255,255,0.12),
|
||||
inset 0 -8px 30px rgba(255,255,255,0.02);
|
||||
display:block; transform-origin:center center;
|
||||
}
|
||||
.pop-anim { animation:pop .28s ease forwards }
|
||||
@keyframes pop {
|
||||
0%{transform:scale(1)}
|
||||
50%{transform:scale(1.25)}
|
||||
100%{transform:scale(0);opacity:0}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="stage" role="application" aria-label="Bubble pop scene">
|
||||
<div class="panel">
|
||||
<h1 class="title">Hello World</h1>
|
||||
<div class="subtitle">Bubble pop — Gameface fixed</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
(function(){
|
||||
const stage = document.getElementById('stage');
|
||||
const bubbles = new Set();
|
||||
let lastTime = performance.now();
|
||||
|
||||
function rand(min,max){ return Math.random()*(max-min)+min; }
|
||||
|
||||
function createBubbleAt(x){
|
||||
const rect = stage.getBoundingClientRect();
|
||||
const size = Math.round(rand(28,110));
|
||||
const b = document.createElement('div');
|
||||
b.className='bubble';
|
||||
b.style.width = size + 'px';
|
||||
b.style.height = size + 'px';
|
||||
const left = Math.max(0, Math.min(rect.width - size, x - size/2));
|
||||
b.dataset.x = left;
|
||||
b.dataset.y = rect.height + size;
|
||||
b.style.left = left + 'px';
|
||||
b.style.top = rect.height + 'px';
|
||||
b.style.background =
|
||||
'radial-gradient(circle at 30% 25%, rgba(255,255,255,0.9), rgba(255,255,255,0.25) 10%, rgba(0,200,230,0.18) 40%, rgba(0,40,60,0.06) 100%)';
|
||||
b.style.border = '1px solid rgba(255,255,255,0.08)';
|
||||
b.style.opacity = '0';
|
||||
b._vy = -rand(20,120);
|
||||
b._vx = rand(-40,40);
|
||||
b._rot = rand(-120,120);
|
||||
b._life = 0;
|
||||
b._size = size;
|
||||
b._ttl = rand(4200,12000);
|
||||
b._popped = false;
|
||||
|
||||
b.addEventListener('pointerdown', (e)=>{
|
||||
e.stopPropagation();
|
||||
popBubble(b);
|
||||
});
|
||||
|
||||
stage.appendChild(b);
|
||||
bubbles.add(b);
|
||||
return b;
|
||||
}
|
||||
|
||||
function popBubble(b){
|
||||
if(!b || b._popped) return;
|
||||
b._popped = true;
|
||||
b.classList.add('pop-anim');
|
||||
setTimeout(()=>{ try{ b.remove(); }catch{} bubbles.delete(b); },300);
|
||||
}
|
||||
|
||||
let autoInterval = setInterval(()=>{
|
||||
const rect = stage.getBoundingClientRect();
|
||||
createBubbleAt(rand(40, rect.width - 40));
|
||||
}, 420);
|
||||
|
||||
stage.addEventListener('pointerdown', (e)=>{
|
||||
if(e.target.classList.contains('bubble')) return;
|
||||
const rect = stage.getBoundingClientRect();
|
||||
const x = e.clientX - rect.left;
|
||||
createBubbleAt(x);
|
||||
});
|
||||
|
||||
function animate(now){
|
||||
const dt = Math.min(80, now - lastTime);
|
||||
lastTime = now;
|
||||
const rect = stage.getBoundingClientRect();
|
||||
for(const b of Array.from(bubbles)){
|
||||
if(b._popped) continue;
|
||||
b._life += dt;
|
||||
const nx = parseFloat(b.dataset.x) + b._vx * (dt/1000);
|
||||
const ny = parseFloat(b.dataset.y) + b._vy * (dt/1000);
|
||||
b.dataset.x = nx; b.dataset.y = ny;
|
||||
const rot = (b._rot * (b._life/1000));
|
||||
b.style.transform = `rotate(${rot}deg)`;
|
||||
b.style.left = nx + 'px'; b.style.top = ny + 'px';
|
||||
const ttl = b._ttl;
|
||||
if(b._life > ttl){
|
||||
const over = (b._life - ttl)/1000;
|
||||
b.style.opacity = Math.max(0, 1 - over*2);
|
||||
}else{
|
||||
b.style.opacity = Math.min(1, b._life / 200);
|
||||
}
|
||||
if(ny + b._size < -150 || parseFloat(b.style.opacity) <= 0.01){
|
||||
try{ b.remove(); }catch{} bubbles.delete(b);
|
||||
}
|
||||
}
|
||||
requestAnimationFrame(animate);
|
||||
}
|
||||
requestAnimationFrame(animate);
|
||||
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
""";
|
||||
|
||||
#endregion Default HTML Content
|
||||
}
|
||||
6
.Experimental/DummyMenu/DummyMenu.csproj
Normal file
6
.Experimental/DummyMenu/DummyMenu.csproj
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<RootNamespace>YouAreMineNow</RootNamespace>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
21
.Experimental/DummyMenu/Main.cs
Normal file
21
.Experimental/DummyMenu/Main.cs
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
using ABI_RC.Systems.GameEventSystem;
|
||||
using MelonLoader;
|
||||
using UnityEngine;
|
||||
|
||||
namespace NAK.DummyMenu;
|
||||
|
||||
public class DummyMenuMod : MelonMod
|
||||
{
|
||||
internal static MelonLogger.Instance Logger;
|
||||
|
||||
public override void OnInitializeMelon()
|
||||
{
|
||||
Logger = LoggerInstance;
|
||||
CVRGameEventSystem.Initialization.OnPlayerSetupStart.AddListener(CreateDummyMenu.Create);
|
||||
}
|
||||
|
||||
public override void OnUpdate()
|
||||
{
|
||||
if (Input.GetKeyDown(ModSettings.EntryToggleDummyMenu.Value)) DummyMenuManager.Instance.ToggleView();
|
||||
}
|
||||
}
|
||||
64
.Experimental/DummyMenu/ModSettings.cs
Normal file
64
.Experimental/DummyMenu/ModSettings.cs
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
using cohtml;
|
||||
using MelonLoader;
|
||||
using UnityEngine;
|
||||
|
||||
namespace NAK.DummyMenu;
|
||||
|
||||
public static class ModSettings
|
||||
{
|
||||
private static readonly MelonPreferences_Category Category = MelonPreferences.CreateCategory(nameof(DummyMenu));
|
||||
|
||||
internal static readonly MelonPreferences_Entry<KeyCode> EntryToggleDummyMenu =
|
||||
Category.CreateEntry(
|
||||
identifier: "toggle_dummy_menu",
|
||||
default_value: KeyCode.F3,
|
||||
display_name: "Toggle Menu Key",
|
||||
description: "Key used to toggle the dummy menu.");
|
||||
|
||||
internal static readonly MelonPreferences_Entry<string> EntryPageCouiPath =
|
||||
Category.CreateEntry(
|
||||
identifier: "page_coui_path",
|
||||
default_value: "UIResources/DummyMenu/menu.html",
|
||||
display_name: "Page Coui Path",
|
||||
description: "Path to the folder containing the root menu html. This is relative to the StreamingAssets folder.");
|
||||
|
||||
internal static readonly MelonPreferences_Entry<int> EntryPageWidth =
|
||||
Category.CreateEntry("page_width", CohtmlView.DefaultWidth,
|
||||
display_name: "Page Width",
|
||||
description: "Width of the menu page in pixels. Default is 1280 pixels.");
|
||||
|
||||
internal static readonly MelonPreferences_Entry<int> EntryPageHeight =
|
||||
Category.CreateEntry("page_height", CohtmlView.DefaultHeight,
|
||||
display_name: "Page Height",
|
||||
description: "Height of the menu page in pixels. Default is 720 pixels.");
|
||||
|
||||
internal static readonly MelonPreferences_Entry<bool> EntryReloadMenuEvenWhenOpen =
|
||||
Category.CreateEntry("reload_menu_even_when_open", false,
|
||||
display_name: "Reload Menu Even When Open",
|
||||
description: "If enabled, the menu will be reloaded even if it is already open.");
|
||||
|
||||
internal static readonly MelonPreferences_Entry<float> EntryVrMenuScaleModifier =
|
||||
Category.CreateEntry("vr_menu_scale_modifier", 0.75f,
|
||||
display_name: "VR Menu Scale Modifier",
|
||||
description: "Adjusts the scale of the menu while in VR. Default is 0.75.");
|
||||
|
||||
internal static readonly MelonPreferences_Entry<float> EntryDesktopMenuScaleModifier =
|
||||
Category.CreateEntry("desktop_menu_scale_modifier", 1f,
|
||||
display_name: "Desktop Menu Scale Modifier",
|
||||
description: "Adjusts the scale of the menu while in Desktop mode. Default is 1.");
|
||||
|
||||
internal static readonly MelonPreferences_Entry<float> EntryVrMenuDistanceModifier =
|
||||
Category.CreateEntry("vr_menu_distance_modifier", 1f,
|
||||
display_name: "VR Menu Distance Modifier",
|
||||
description: "Adjusts the distance of the menu from the camera while in VR. Default is 1.");
|
||||
|
||||
internal static readonly MelonPreferences_Entry<float> EntryDesktopMenuDistanceModifier =
|
||||
Category.CreateEntry("desktop_menu_distance_modifier", 1.2f,
|
||||
display_name: "Desktop Menu Distance Modifier",
|
||||
description: "Adjusts the distance of the menu from the camera while in Desktop mode. Default is 1.2.");
|
||||
|
||||
internal static readonly MelonPreferences_Entry<bool> EntryToggleMeToResetModifiers =
|
||||
Category.CreateEntry("toggle_me_to_reset_modifiers", false,
|
||||
display_name: "Toggle Me To Reset Modifiers",
|
||||
description: "If enabled, toggling the menu will reset any scale/distance modifiers applied by other mods.");
|
||||
}
|
||||
32
.Experimental/DummyMenu/Properties/AssemblyInfo.cs
Normal file
32
.Experimental/DummyMenu/Properties/AssemblyInfo.cs
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
using MelonLoader;
|
||||
using NAK.DummyMenu.Properties;
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: AssemblyVersion(AssemblyInfoParams.Version)]
|
||||
[assembly: AssemblyFileVersion(AssemblyInfoParams.Version)]
|
||||
[assembly: AssemblyInformationalVersion(AssemblyInfoParams.Version)]
|
||||
[assembly: AssemblyTitle(nameof(NAK.DummyMenu))]
|
||||
[assembly: AssemblyCompany(AssemblyInfoParams.Author)]
|
||||
[assembly: AssemblyProduct(nameof(NAK.DummyMenu))]
|
||||
|
||||
[assembly: MelonInfo(
|
||||
typeof(NAK.DummyMenu.DummyMenuMod),
|
||||
nameof(NAK.DummyMenu),
|
||||
AssemblyInfoParams.Version,
|
||||
AssemblyInfoParams.Author,
|
||||
downloadLink: "https://github.com/NotAKidoS/NAK_CVR_Mods/tree/main/DummyMenu"
|
||||
)]
|
||||
|
||||
[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.DummyMenu.Properties;
|
||||
internal static class AssemblyInfoParams
|
||||
{
|
||||
public const string Version = "1.0.0";
|
||||
public const string Author = "NotAKidoS";
|
||||
}
|
||||
|
|
@ -1,6 +1,4 @@
|
|||
using ABI_RC.Core.Player;
|
||||
using MelonLoader;
|
||||
using UnityEngine;
|
||||
using MelonLoader;
|
||||
|
||||
namespace NAK.LuaNetworkVariables;
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ using System.Reflection;
|
|||
downloadLink: "https://github.com/NotAKidoS/NAK_CVR_Mods/tree/main/LuaNetworkVariables"
|
||||
)]
|
||||
|
||||
[assembly: MelonGame("Alpha Blend Interactive", "ChilloutVR")]
|
||||
[assembly: MelonGame("ChilloutVR", "ChilloutVR")]
|
||||
[assembly: MelonPlatform(MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)]
|
||||
[assembly: MelonPlatformDomain(MelonPlatformDomainAttribute.CompatibleDomains.MONO)]
|
||||
[assembly: MelonColor(255, 246, 25, 99)] // red-pink
|
||||
|
|
@ -27,6 +27,6 @@ using System.Reflection;
|
|||
namespace NAK.LuaNetworkVariables.Properties;
|
||||
internal static class AssemblyInfoParams
|
||||
{
|
||||
public const string Version = "1.0.2";
|
||||
public const string Version = "1.0.3";
|
||||
public const string Author = "NotAKidoS";
|
||||
}
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
{
|
||||
"_id": 234,
|
||||
"name": "WhereAmIPointing",
|
||||
"modversion": "1.0.1",
|
||||
"gameversion": "2024r175",
|
||||
"loaderversion": "0.6.1",
|
||||
"modtype": "Mod",
|
||||
"author": "NotAKidoS",
|
||||
"description": "Simple mod that makes your controller rays always visible when the menus are open. Useful for when you're trying to aim at something in the distance. Also visualizes which ray is being used for menu interaction.",
|
||||
"searchtags": [
|
||||
"controller",
|
||||
"ray",
|
||||
"line",
|
||||
"tomato"
|
||||
],
|
||||
"requirements": [
|
||||
"None"
|
||||
],
|
||||
"downloadlink": "https://github.com/NotAKidoS/NAK_CVR_Mods/releases/download/r40/WhereAmIPointing.dll",
|
||||
"sourcelink": "https://github.com/NotAKidoS/NAK_CVR_Mods/tree/main/WhereAmIPointing/",
|
||||
"changelog": "- Fixed line renderer alpha not being reset when the menu is closed.",
|
||||
"embedcolor": "#f61963"
|
||||
}
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
using ABI_RC.Core.Player;
|
||||
using BTKUILib;
|
||||
using BTKUILib.UIObjects;
|
||||
using BTKUILib.UIObjects.Components;
|
||||
using ABI_RC.Systems.UI.UILib;
|
||||
using ABI_RC.Systems.UI.UILib.UIObjects;
|
||||
using ABI_RC.Systems.UI.UILib.UIObjects.Components;
|
||||
using NAK.OriginShift;
|
||||
|
||||
namespace NAK.OriginShiftMod.Integrations;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
using ABI_RC.Core.Player;
|
||||
using BTKUILib;
|
||||
using BTKUILib.UIObjects;
|
||||
using ABI_RC.Systems.UI.UILib;
|
||||
using ABI_RC.Systems.UI.UILib.UIObjects;
|
||||
using NAK.OriginShift;
|
||||
|
||||
namespace NAK.OriginShiftMod.Integrations;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
using System.Reflection;
|
||||
using BTKUILib;
|
||||
using BTKUILib.UIObjects;
|
||||
using BTKUILib.UIObjects.Components;
|
||||
using ABI_RC.Systems.UI.UILib;
|
||||
using ABI_RC.Systems.UI.UILib.UIObjects;
|
||||
using ABI_RC.Systems.UI.UILib.UIObjects.Components;
|
||||
using MelonLoader;
|
||||
using UnityEngine;
|
||||
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ public static class ThirdPersonAddon
|
|||
|
||||
private static IEnumerator FixThirdPersonCompatibility()
|
||||
{
|
||||
yield return null; // wait a frame for the camera to be setup
|
||||
yield return null; // wait a frame for the camera to be setup
|
||||
GameObject thirdPersonCameraObj = GameObject.Find("_PLAYERLOCAL/[CameraRigDesktop]/Camera/ThirdPersonCameraObj");
|
||||
thirdPersonCameraObj.AddComponentIfMissing<OriginShiftOcclusionCullingDisabler>();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,9 @@
|
|||
#if !UNITY_EDITOR
|
||||
using System.Globalization;
|
||||
using ABI_RC.Core.UI;
|
||||
using ABI_RC.Core.Util.AssetFiltering;
|
||||
using ABI_RC.Systems.Movement;
|
||||
using MelonLoader;
|
||||
using NAK.OriginShift.Components;
|
||||
using NAK.OriginShiftMod.Integrations;
|
||||
using OriginShift.Integrations;
|
||||
using UnityEngine;
|
||||
|
||||
namespace NAK.OriginShift;
|
||||
|
||||
|
|
@ -36,7 +32,6 @@ public class OriginShiftMod : MelonMod
|
|||
|
||||
// Compatibility Mode
|
||||
ApplyPatches(typeof(Patches.PlayerSetupPatches)); // net ik, camera occlusion culling
|
||||
ApplyPatches(typeof(Patches.Comms_ClientPatches)); // voice pos
|
||||
ApplyPatches(typeof(Patches.CVRSyncHelperPatches)); // spawnable pos
|
||||
ApplyPatches(typeof(Patches.PuppetMasterPatches)); // remote player pos
|
||||
ApplyPatches(typeof(Patches.CVRObjectSyncPatches)); // remote object pos
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
//
|
||||
// #region Constants
|
||||
//
|
||||
// private const string ModId = "MelonMod.NAK.RelativeSync";
|
||||
// private const string ModId = "MelonMod.NAK.RelativeSyncJitterFix";
|
||||
//
|
||||
// #endregion
|
||||
//
|
||||
|
|
|
|||
|
|
@ -1,11 +1,9 @@
|
|||
using ABI.CCK.Components;
|
||||
using JetBrains.Annotations;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Events;
|
||||
|
||||
#if !UNITY_EDITOR
|
||||
using ABI_RC.Core.Util;
|
||||
using ABI_RC.Core.Util.AssetFiltering;
|
||||
#endif
|
||||
|
||||
namespace NAK.OriginShift.Components;
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ public class OriginShiftParticleSystemReceiver : MonoBehaviour
|
|||
_particleSystems = GetComponentsInChildren<ParticleSystem>(true);
|
||||
if (_particleSystems.Length == 0)
|
||||
{
|
||||
OriginShiftMod.Logger.Error("OriginShiftParticleSystemReceiver: No ParticleSystems found on GameObject: " + gameObject.name, this);
|
||||
// OriginShiftMod.Logger.Error("OriginShiftParticleSystemReceiver: No ParticleSystems found on GameObject: " + gameObject.name, this);
|
||||
enabled = false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ public class OriginShiftRigidbodyReceiver : MonoBehaviour
|
|||
_rigidbody = GetComponentInChildren<Rigidbody>();
|
||||
if (_rigidbody == null)
|
||||
{
|
||||
OriginShiftMod.Logger.Error("OriginShiftRigidbodyReceiver: No Rigidbody found on GameObject: " + gameObject.name, this);
|
||||
// OriginShiftMod.Logger.Error("OriginShiftRigidbodyReceiver: No Rigidbody found on GameObject: " + gameObject.name, this);
|
||||
enabled = false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ public class OriginShiftTrailRendererReceiver : MonoBehaviour
|
|||
_trailRenderers = GetComponentsInChildren<TrailRenderer>(true);
|
||||
if (_trailRenderers.Length == 0)
|
||||
{
|
||||
OriginShiftMod.Logger.Error("OriginShiftTrailRendererReceiver: No TrailRenderers found on GameObject: " + gameObject.name, this);
|
||||
// OriginShiftMod.Logger.Error("OriginShiftTrailRendererReceiver: No TrailRenderers found on GameObject: " + gameObject.name, this);
|
||||
enabled = false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
using System;
|
||||
using ABI_RC.Core.Base;
|
||||
using ABI_RC.Core.Player;
|
||||
using ABI.CCK.Components;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
using System.Collections;
|
||||
using ABI_RC.Core;
|
||||
using ABI_RC.Core.Player;
|
||||
using NAK.OriginShift.Components;
|
||||
using NAK.OriginShift.Extensions;
|
||||
|
|
|
|||
|
|
@ -6,11 +6,9 @@ using ABI_RC.Core.Player;
|
|||
using ABI_RC.Core.Util;
|
||||
using ABI_RC.Systems.Camera;
|
||||
using ABI_RC.Systems.Communications.Networking;
|
||||
using ABI_RC.Systems.GameEventSystem;
|
||||
using ABI_RC.Systems.Movement;
|
||||
using ABI.CCK.Components;
|
||||
using DarkRift;
|
||||
using ECM2;
|
||||
using HarmonyLib;
|
||||
using NAK.OriginShift.Components;
|
||||
using NAK.OriginShift.Hacks;
|
||||
|
|
@ -129,7 +127,7 @@ internal static class PortableCameraPatches
|
|||
[HarmonyPatch(typeof(PortableCamera), nameof(PortableCamera.Start))]
|
||||
private static void Postfix_PortableCamera_Start(ref PortableCamera __instance)
|
||||
{
|
||||
__instance.cameraComponent.AddComponentIfMissing<OriginShiftOcclusionCullingDisabler>();
|
||||
__instance.CameraComponent.AddComponentIfMissing<OriginShiftOcclusionCullingDisabler>();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -143,17 +141,6 @@ internal static class PathingCameraPatches
|
|||
}
|
||||
}
|
||||
|
||||
internal static class Comms_ClientPatches
|
||||
{
|
||||
[HarmonyPrefix]
|
||||
[HarmonyPatch(typeof(Comms_Client), nameof(Comms_Client.SetPosition))]
|
||||
private static void Prefix_Comms_Client_GetPlayerMovementData(ref Vector3 listenerPosition)
|
||||
{
|
||||
if (OriginShiftManager.CompatibilityMode) // adjust root position back to absolute world position
|
||||
listenerPosition = OriginShiftManager.GetAbsolutePosition(listenerPosition);
|
||||
}
|
||||
}
|
||||
|
||||
internal static class CVRSyncHelperPatches
|
||||
{
|
||||
[HarmonyPrefix] // outbound spawnable
|
||||
|
|
@ -180,15 +167,11 @@ internal static class CVRSyncHelperPatches
|
|||
|
||||
[HarmonyPrefix] // outbound spawn prop
|
||||
[HarmonyPatch(typeof(CVRSyncHelper), nameof(CVRSyncHelper.SpawnProp))]
|
||||
private static void Prefix_CVRSyncHelper_SpawnProp(ref float posX, ref float posY, ref float posZ)
|
||||
private static void Prefix_CVRSyncHelper_SpawnProp(ref Vector3 position)
|
||||
{
|
||||
if (OriginShiftManager.CompatibilityMode) // adjust root position back to absolute world position
|
||||
{
|
||||
Vector3 position = new(posX, posY, posZ); // imagine not using Vector3
|
||||
position = OriginShiftManager.GetAbsolutePosition(position);
|
||||
posX = position.x;
|
||||
posY = position.y;
|
||||
posZ = position.z;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ using System.Reflection;
|
|||
downloadLink: "https://github.com/NotAKidoS/NAK_CVR_Mods/tree/main/OriginShift"
|
||||
)]
|
||||
|
||||
[assembly: MelonGame("Alpha Blend Interactive", "ChilloutVR")]
|
||||
[assembly: MelonGame("ChilloutVR", "ChilloutVR")]
|
||||
[assembly: MelonPlatform(MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)]
|
||||
[assembly: MelonPlatformDomain(MelonPlatformDomainAttribute.CompatibleDomains.MONO)]
|
||||
[assembly: MelonColor(255, 125, 126, 129)]
|
||||
|
|
@ -28,7 +28,7 @@ using System.Reflection;
|
|||
namespace NAK.OriginShift.Properties;
|
||||
internal static class AssemblyInfoParams
|
||||
{
|
||||
public const string Version = "1.0.0";
|
||||
public const string Version = "1.0.1";
|
||||
public const string Author = "NotAKidoS";
|
||||
}
|
||||
#endif
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
{
|
||||
"_id": 211,
|
||||
"name": "RelativeSync",
|
||||
"modversion": "1.0.3",
|
||||
"gameversion": "2024r175",
|
||||
"loaderversion": "0.6.1",
|
||||
"modtype": "Mod",
|
||||
"author": "NotAKidoS",
|
||||
"description": "Relative sync for Movement Parent & Chairs. Requires both users to have the mod installed. Synced over Mod Network.\n\nProvides some Experimental settings to also fix local jitter on movement parents.",
|
||||
"searchtags": [
|
||||
"relative",
|
||||
"sync",
|
||||
"movement",
|
||||
"chair"
|
||||
],
|
||||
"requirements": [
|
||||
"None"
|
||||
],
|
||||
"downloadlink": "https://github.com/NotAKidoS/NAK_CVR_Mods/releases/download/r29/RelativeSync.dll",
|
||||
"sourcelink": "https://github.com/NotAKidoS/NAK_CVR_Mods/tree/main/RelativeSync/",
|
||||
"changelog": "- Enabled the Experimental settings to fix **local** jitter on Movement Parents by default\n- Adjusted BBCC No Interpolation fix to account for potential native fix (now respects initial value)",
|
||||
"embedcolor": "#507e64"
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue