Patch_GameScript_Update.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. using GadgetCore;
  2. using GadgetCore.API;
  3. using HarmonyLib;
  4. using System;
  5. using System.Reflection;
  6. using UnityEngine;
  7. namespace CombatChipChest.Patches
  8. {
  9. [HarmonyPatch(typeof(GameScript))]
  10. [HarmonyPatch("Update")]
  11. [HarmonyGadget("CombatChipChest")]
  12. public static class Patch_GameScript_Update
  13. {
  14. [HarmonyPrefix]
  15. public static void Prefix(GameScript __instance, ref Item ___holdingItem, ref int ___curhoveringstat, ref bool ___holdingCombatChip, bool ___exitingcombatmode)
  16. {
  17. try
  18. {
  19. if (MenuScript.player)
  20. {
  21. if (GameScript.inventoryOpen)
  22. {
  23. var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  24. RaycastHit hit;
  25. if (Physics.Raycast(ray, out hit, 5f))
  26. {
  27. if (hit.transform.gameObject.name.StartsWith("combat_storage_slot"))
  28. {
  29. var slot = int.Parse(hit.transform.gameObject.name.Substring("combat_storage_slot".Length));
  30. HoverCombatChipChest(__instance, slot, ref ___curhoveringstat);
  31. }
  32. }
  33. }
  34. if (!GameScript.pausing && Input.GetMouseButtonDown(0) && GameScript.inventoryOpen)
  35. {
  36. var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  37. RaycastHit hit;
  38. if (Physics.Raycast(ray, out hit, 7f))
  39. {
  40. if (hit.transform.gameObject.name.StartsWith("combat_storage_slot"))
  41. {
  42. var slot = int.Parse(hit.transform.gameObject.name.Substring("combat_storage_slot".Length));
  43. if (slot >= 0 && slot < 16)
  44. {
  45. if (___holdingItem.id != 0)
  46. {
  47. if (Core.combatChipStore.ChipIDs[slot] != ___holdingItem.id)
  48. {
  49. if (Core.combatChipStore.ChipIDs[slot] == 0)
  50. {
  51. Place(__instance, slot, ref ___holdingItem, ref ___holdingCombatChip);
  52. }
  53. else
  54. {
  55. Swap(__instance, slot, ref ___holdingItem);
  56. }
  57. }
  58. }
  59. else if (Core.combatChipStore.ChipIDs[slot] != 0)
  60. {
  61. Select(__instance, slot, ref ___holdingItem, ref ___holdingCombatChip, ___exitingcombatmode);
  62. }
  63. }
  64. }
  65. }
  66. }
  67. }
  68. }
  69. catch (Exception e) { Core.logger.LogConsole(e.Message); }
  70. }
  71. public static void HoverCombatChipChest(GameScript __instance, int slot, ref int ___curhoveringstat)
  72. {
  73. try
  74. {
  75. if (slot >= 0 && slot < 16)
  76. {
  77. if (slot != ___curhoveringstat)
  78. {
  79. ___curhoveringstat = slot;
  80. if (Core.combatChipStore.ChipIDs[slot] != 0)
  81. {
  82. __instance.GetComponent<AudioSource>().PlayOneShot((AudioClip)Resources.Load("Au/hover"), Menuu.soundLevel / 10f);
  83. }
  84. }
  85. Core.combatChipStore.UpdateText(Core.combatChipStore.ChipIDs[slot]);
  86. }
  87. }
  88. catch { }
  89. }
  90. private static void Swap(GameScript __instance, int slot, ref Item ___holdingItem)
  91. {
  92. try
  93. {
  94. if (slot >= 0 && slot < 16)
  95. {
  96. if (slot >= 0 && slot < 16)
  97. {
  98. __instance.GetComponent<AudioSource>().PlayOneShot((AudioClip)Resources.Load("Au/CLICK1"), Menuu.soundLevel / 10f);
  99. int id = ___holdingItem.id;
  100. ___holdingItem.id = Core.combatChipStore.ChipIDs[slot];
  101. Core.combatChipStore.ChipIDs[slot] = id;
  102. __instance.RefreshCombatChipMenu();
  103. __instance.RefreshHoldingSlot();
  104. Core.combatChipStore.UpdateLatestUI();
  105. __instance.UpdateHP();
  106. __instance.UpdateMana();
  107. }
  108. }
  109. }
  110. catch (Exception e) { Core.logger.LogConsole(e.Message); }
  111. }
  112. private static void Select(GameScript __instance, int slot, ref Item ___holdingItem, ref bool ___holdingCombatChip, bool ___exitingcombatmode)
  113. {
  114. try
  115. {
  116. if (slot >= 0 && slot < 16)
  117. {
  118. if (!___exitingcombatmode)
  119. {
  120. __instance.GetComponent<AudioSource>().PlayOneShot((AudioClip)Resources.Load("Au/CLICK1"), Menuu.soundLevel / 10f);
  121. ___holdingItem = __instance.EmptyItem();
  122. ___holdingCombatChip = true;
  123. ___holdingItem.id = Core.combatChipStore.ChipIDs[slot];
  124. Core.combatChipStore.ChipIDs[slot] = 0;
  125. __instance.RefreshCombatChipMenu();
  126. __instance.RefreshHoldingSlot();
  127. Core.combatChipStore.UpdateLatestUI();
  128. __instance.UpdateHP();
  129. __instance.UpdateMana();
  130. }
  131. }
  132. }
  133. catch (Exception e) { Core.logger.LogConsole(e.Message); }
  134. }
  135. private static void Place(GameScript __instance, int slot, ref Item ___holdingItem, ref bool ___holdingCombatChip)
  136. {
  137. try
  138. {
  139. if (slot >= 0 && slot < 16)
  140. {
  141. __instance.GetComponent<AudioSource>().PlayOneShot((AudioClip)Resources.Load("Au/CLICK1"), Menuu.soundLevel / 10f);
  142. Core.combatChipStore.ChipIDs[slot] = ___holdingItem.id;
  143. ___holdingItem = __instance.EmptyItem();
  144. __instance.RefreshCombatChipMenu();
  145. ___holdingCombatChip = false;
  146. __instance.RefreshHoldingSlot();
  147. Core.combatChipStore.UpdateLatestUI();
  148. __instance.UpdateHP();
  149. __instance.UpdateMana();
  150. }
  151. }
  152. catch (Exception e) { Core.logger.LogConsole(e.Message); }
  153. }
  154. private static void set(GameScript __instance, string prop, object o)
  155. {
  156. var field = typeof(GameScript).GetField(prop, BindingFlags.NonPublic | BindingFlags.Instance);
  157. field.SetValue(__instance, o);
  158. }
  159. private static T get<T>(GameScript __instance, string prop)
  160. {
  161. var field = typeof(GameScript).GetField(prop, BindingFlags.NonPublic | BindingFlags.Instance);
  162. return (T)field.GetValue(__instance);
  163. }
  164. private static object call(GameScript __instance, string meth, object[] o = null)
  165. {
  166. MethodInfo dynMethod = __instance.GetType().GetMethod(meth, BindingFlags.NonPublic | BindingFlags.Instance);
  167. return dynMethod.Invoke(__instance, o ?? new object[0]);
  168. }
  169. }
  170. }