diff --git a/Assets/MeatKit/BuildProfile.asset b/Assets/MeatKit/BuildProfile.asset
index eec7587..afcbe6f 100644
--- a/Assets/MeatKit/BuildProfile.asset
+++ b/Assets/MeatKit/BuildProfile.asset
@@ -13,7 +13,7 @@ MonoBehaviour:
m_EditorClassIdentifier:
PackageName: TNH_Quality_of_Life_Improvements
Author: muskit
- Version: 1.0.1
+ Version: 1.1.0
Icon: {fileID: 2800000, guid: 785b7946398f5314b95bf593d2d77d67, type: 3}
ReadMe: {fileID: 102900000, guid: ab1d6dea017447a48ac348db588a6f35, type: 3}
WebsiteURL: https://github.com/muskit/TNH-Quality-of-Life-Improvements
diff --git a/Assets/MeatKit/MeatKitPlugin.cs b/Assets/MeatKit/MeatKitPlugin.cs
index 88c6a61..1bbc749 100644
--- a/Assets/MeatKit/MeatKitPlugin.cs
+++ b/Assets/MeatKit/MeatKitPlugin.cs
@@ -1,4 +1,5 @@
#if H3VR_IMPORTED
+using HarmonyLib;
using System.IO;
using System.Reflection;
using BepInEx;
@@ -42,10 +43,11 @@ public class MeatKitPlugin : BaseUnityPlugin
private static InPlay instance;
- private LeaderboardPlayerCountPatch lpc;
private bool lpcModGone = false;
private float lpcModSearchTimeEnd;
+ private Harmony harmony;
+
private void SceneChanged(Scene from, Scene to)
{
//Logger.LogInfo(string.Format("scene chg: {0} --> {1}", from.name, to.name));
@@ -63,6 +65,11 @@ public class MeatKitPlugin : BaseUnityPlugin
}
}
+ public MeatKitPlugin(): base()
+ {
+ harmony = new Harmony("muskit.TNHQualityOfLifeImprovements");
+ }
+
private void Awake()
{
// load asset bundle
@@ -96,11 +103,17 @@ public class MeatKitPlugin : BaseUnityPlugin
true,
"Shows how many holds the player has completed by their radar hand.");
+ // patch KillAll code (only acts w/ health crystals)
+ TimedHealthCrystalPatch.Patch(harmony);
+
// patch leaderboard code
if (cfgShowLPC.Value)
- lpc = new LeaderboardPlayerCountPatch();
+ LeaderboardPlayerCountPatch.Patch(harmony);
+
+ if(cfgShowHolds.Value)
+ HoldCounter.Patch(harmony);
- // give 120 seconds to search for old mod
+ // give 120 seconds to search for old mod, which we want to kill
lpcModSearchTimeEnd = Time.realtimeSinceStartup + 120;
}
// DO NOT EDIT.
diff --git a/Assets/README.md b/Assets/README.md
index f1f38c3..3083209 100644
--- a/Assets/README.md
+++ b/Assets/README.md
@@ -12,12 +12,15 @@ Enable/disable these features in your mod manager's *Config editor*.
For any issues/ideas, please create an issue on the GitHub repo (linked on Thunderstore page).
## Changelog
+1.1.0
+* Added Health Crystals expiration indicator
+
1.0.1
-* Fixed the in-play improvements only applying in Classic Hallways map (whoops!!)
+* Fixed the in-play improvements only applying to Classic Hallways map (whoops!!)
* Added option to enable/disable showing player count of online leaderboards
* Added option to enable/disable HP text opacity/shadow change
* (Surprisingly, the HP text normally doesn't have full opacity)
-* Searching for TNH Leaderboards Player Count now stops after 120s
+* Searching for the deprecated TNH Leaderboards Player Count mod to kill now stops after 120s
1.0.0
diff --git a/Assets/_Prefabs/HealthCrystalTimer.prefab b/Assets/_Prefabs/HealthCrystalTimer.prefab
new file mode 100644
index 0000000..2f90aec
--- /dev/null
+++ b/Assets/_Prefabs/HealthCrystalTimer.prefab
@@ -0,0 +1,187 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1634027973393822}
+ m_IsPrefabParent: 1
+--- !u!1 &1475934434838188
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224853189626207054}
+ - component: {fileID: 222684863573680672}
+ - component: {fileID: 114673309682266402}
+ m_Layer: 5
+ m_Name: Image
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1634027973393822
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224077453978722080}
+ - component: {fileID: 223544683124447678}
+ - component: {fileID: 114094006499494552}
+ - component: {fileID: 114774830210974956}
+ - component: {fileID: 114654661998195444}
+ m_Layer: 5
+ m_Name: HealthCrystalTimer
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &114094006499494552
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1634027973393822}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 0
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 800, y: 600}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 0
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!114 &114654661998195444
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1634027973393822}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: c0cc182175a3417499d53e43378f028c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+--- !u!114 &114673309682266402
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1475934434838188}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 21300000, guid: 3677786155d617b4cb39bf42eddd24ad, type: 3}
+ m_Type: 3
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 0
+ m_FillOrigin: 2
+--- !u!114 &114774830210974956
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1634027973393822}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!222 &222684863573680672
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1475934434838188}
+--- !u!223 &223544683124447678
+Canvas:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1634027973393822}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 2
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &224077453978722080
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1634027973393822}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 224853189626207054}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 574, y: 308.5}
+ m_SizeDelta: {x: 468, y: 472}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224853189626207054
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1475934434838188}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224077453978722080}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 468, y: 472}
+ m_Pivot: {x: 0.5, y: 0.5}
diff --git a/Assets/_Prefabs/HealthCrystalTimer.prefab.meta b/Assets/_Prefabs/HealthCrystalTimer.prefab.meta
new file mode 100644
index 0000000..5f1abd6
--- /dev/null
+++ b/Assets/_Prefabs/HealthCrystalTimer.prefab.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: a97af7648bcd6394b867989bf8fb9ed0
+timeCreated: 1643099434
+licenseType: Free
+NativeFormatImporter:
+ mainObjectFileID: 100100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Prefabs/HoldCounter.prefab b/Assets/_Prefabs/HoldCounter.prefab
index 8e771c3..95ba49b 100644
--- a/Assets/_Prefabs/HoldCounter.prefab
+++ b/Assets/_Prefabs/HoldCounter.prefab
@@ -66,6 +66,24 @@ GameObject:
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
+--- !u!1 &1774018057659698
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224420167260936368}
+ - component: {fileID: 222388691975761020}
+ - component: {fileID: 114828117127462556}
+ - component: {fileID: 114042133408737726}
+ m_Layer: 5
+ m_Name: Text (2)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
--- !u!114 &114032145135548160
MonoBehaviour:
m_ObjectHideFlags: 1
@@ -99,6 +117,20 @@ MonoBehaviour:
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: HOLDS COMPLETED
+--- !u!114 &114042133408737726
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1774018057659698}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1573420865, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_EffectColor: {r: 0, g: 0, b: 0, a: 0.734}
+ m_EffectDistance: {x: 3.5, y: -3.5}
+ m_UseGraphicAlpha: 1
--- !u!114 &114133878122943296
MonoBehaviour:
m_ObjectHideFlags: 1
@@ -192,6 +224,39 @@ MonoBehaviour:
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: "-1 / \u221E"
+--- !u!114 &114828117127462556
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1774018057659698}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 12800000, guid: 05d48c500227c8a4bbb7c02e3ccbb0b3, type: 3}
+ m_FontSize: 26
+ m_FontStyle: 0
+ m_BestFit: 1
+ m_MinSize: 10
+ m_MaxSize: 100
+ m_Alignment: 7
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: 0 0
--- !u!114 &114972162530505676
MonoBehaviour:
m_ObjectHideFlags: 1
@@ -208,6 +273,12 @@ MonoBehaviour:
m_BlockingMask:
serializedVersion: 2
m_Bits: 4294967295
+--- !u!222 &222388691975761020
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1774018057659698}
--- !u!222 &222541359112789466
CanvasRenderer:
m_ObjectHideFlags: 1
@@ -255,8 +326,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
- m_AnchoredPosition: {x: 0, y: -45}
- m_SizeDelta: {x: 0, y: -90}
+ m_AnchoredPosition: {x: 0, y: -12.550003}
+ m_SizeDelta: {x: 0, y: -100.3}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!224 &224364969672532764
RectTransform:
@@ -276,6 +347,24 @@ RectTransform:
m_AnchoredPosition: {x: 0, y: 105.9}
m_SizeDelta: {x: 0, y: -211.8}
m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224420167260936368
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1774018057659698}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224724389550513542}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0}
+ m_AnchorMax: {x: 0.5, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 308.5, y: 64.57}
+ m_Pivot: {x: 0.5, y: 0}
--- !u!224 &224724389550513542
RectTransform:
m_ObjectHideFlags: 1
@@ -288,6 +377,7 @@ RectTransform:
m_Children:
- {fileID: 224364969672532764}
- {fileID: 224142695019321682}
+ - {fileID: 224420167260936368}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0}
diff --git a/Assets/_Prefabs/PlayerCount_LoadingText.prefab b/Assets/_Prefabs/PlayerCount_LoadingText.prefab
index 9b01004..b3c4779 100644
--- a/Assets/_Prefabs/PlayerCount_LoadingText.prefab
+++ b/Assets/_Prefabs/PlayerCount_LoadingText.prefab
@@ -113,9 +113,9 @@ MonoBehaviour:
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 0
- m_VerticalOverflow: 0
+ m_VerticalOverflow: 1
m_LineSpacing: 1
- m_Text: LOADING PLAYER COUNT
+ m_Text: RETRIEVING PLAYER COUNT
--- !u!222 &222658238543524802
CanvasRenderer:
m_ObjectHideFlags: 1
diff --git a/Assets/_Prefabs/Store.asset b/Assets/_Prefabs/Store.asset
index 9274818..629e3d0 100644
--- a/Assets/_Prefabs/Store.asset
+++ b/Assets/_Prefabs/Store.asset
@@ -16,3 +16,4 @@ MonoBehaviour:
- {fileID: 1428988585174978, guid: c034a3fdd4eaa554bb81a9a202bf37dd, type: 2}
- {fileID: 1421894940388160, guid: 2e88fb286dba59a45b49fb0ae7d9449b, type: 2}
- {fileID: 1395656030192232, guid: 6085354c72844664589bb5f21f9872b1, type: 2}
+ - {fileID: 1634027973393822, guid: a97af7648bcd6394b867989bf8fb9ed0, type: 2}
diff --git a/Assets/_Scripts/HoldCounter.cs b/Assets/_Scripts/HoldCounter.cs
index 2661bca..f27a649 100644
--- a/Assets/_Scripts/HoldCounter.cs
+++ b/Assets/_Scripts/HoldCounter.cs
@@ -1,5 +1,5 @@
-using System.Collections;
-using System.Collections.Generic;
+using System.Reflection;
+using HarmonyLib;
using UnityEngine;
using UnityEngine.UI;
using FistVR;
@@ -8,37 +8,62 @@ namespace TNHQoLImprovements
{
public class HoldCounter : MonoBehaviour
{
+ private Text lblHoldCount;
+ private Text lblWinLose;
+
+ public static int[] winLose = { -1, 1 };
+ public const string WIN_LOSE_TEXT = "{0} {1}";
+
+
private void OnDeath(bool _)
{
Debug.Log("I died!");
+ // TODO: bind stats to controller hand
}
- // TODO: lose counter. patch postfix FistVR.TNH_Manager.HoldPointCompleted
- private void OnHoldLose()
+ // TODO: win/lose counter. patch postfix FistVR.TNH_Manager.HoldPointCompleted
+ public static void Patch(Harmony harmony)
{
-
+ var original = typeof(TNH_Manager).GetMethod("HoldPointCompleted", BindingFlags.Public | BindingFlags.Instance);
+ var patch = typeof(HoldCounter).GetMethod("OnHoldEnd");
+ Debug.Log(string.Format("Original: {0} // Patch: {1}", original, patch));
+ harmony.Patch(original, postfix: new HarmonyMethod(patch));
+ }
+ public static void OnHoldEnd(TNH_HoldPoint p, bool success)
+ {
+ if (success)
+ winLose[0]++;
+ else
+ winLose[1]++;
}
void Start()
{
- //transform.parent = GameObject.Find("_NewTAHReticle/TAHReticle_HealthBar").transform;
- transform.parent = FindObjectOfType().transform.GetChild(3);
transform.localPosition = new Vector3(-1f, 0, -.5f);
transform.localRotation = Quaternion.Euler(90, 0, 0);
transform.localScale = new Vector3(0.002f, 0.002f, 0.002f);
+ lblHoldCount = transform.GetChild(1).GetComponent();
+ lblWinLose = transform.GetChild(2).GetComponent();
+
+ winLose[0] = 0;
+ winLose[1] = 0;
+
FindObjectOfType().PlayerDeathEvent += OnDeath;
}
void Update()
{
+ // Total hold count
string display = "";
if (InPlay.tnhManager.ProgressionMode == TNHSetting_ProgressionType.Marathon)
display = InPlay.tnhManager.m_level.ToString() + " / ∞";
else
display = string.Format("{0} / {1}", InPlay.tnhManager.m_level, InPlay.tnhManager.m_maxLevels);
+ lblHoldCount.text = display;
- transform.GetChild(1).GetComponent().text = display;
+ // Win/Lost holds
+ lblWinLose.text = string.Format(WIN_LOSE_TEXT, winLose[0], winLose[1]);
}
}
}
\ No newline at end of file
diff --git a/Assets/_Scripts/InPlay.cs b/Assets/_Scripts/InPlay.cs
index 7ec7d97..ec0053f 100644
--- a/Assets/_Scripts/InPlay.cs
+++ b/Assets/_Scripts/InPlay.cs
@@ -11,10 +11,8 @@ namespace TNHQoLImprovements
public class InPlay : MonoBehaviour
{
private GameObject gObjHUD;
- private GameObject gObjTokens;
public static TNH_Manager tnhManager;
- #region INITIALIZATION
void ImproveHPTextReadability()
{
var canvas = gObjHUD.GetComponent