-
Notifications
You must be signed in to change notification settings - Fork 0
/
BuildInWater.cs
97 lines (84 loc) · 3.52 KB
/
BuildInWater.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using HarmonyLib;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class BuildInWater : Mod
{
public const string ModName = "buildinwater";
public const string HarmonyId = "com.wisnoski.greenhell." + ModName;
public static Harmony instance;
public void Start()
{
instance = new Harmony(HarmonyId);
instance.PatchAll(Assembly.GetExecutingAssembly());
if(Player.Get() != null){
((int[,])Traverse.Create(Player.Get()).Field("m_PlayerControllerArray").GetValue())[(int)PlayerControllerType.HeavyObject, (int)PlayerControllerType.Swim] = 1;
}
Debug.Log(string.Format("Mod {0} has been loaded!", ModName));
}
public void OnModUnload()
{
GameObject InGameMenu = GameObject.Find("InGameMenu");
if (InGameMenu != null && InGameMenu.transform.Find("MenuInGame").Find("Buttons").Find("ToggleSwim") != null)
{
Destroy(InGameMenu.transform.Find("MenuInGame").Find("Buttons").Find("ToggleSwim").gameObject);
}
instance.UnpatchAll(HarmonyId);
if(Player.Get()){
((int[,])Traverse.Create(Player.Get()).Field("m_PlayerControllerArray").GetValue())[(int)PlayerControllerType.HeavyObject, (int)PlayerControllerType.Swim] = 0;
}
Debug.Log(string.Format("Mod {0} has been unloaded!", ModName));
}
}
[HarmonyPatch(typeof(Player))]
[HarmonyPatch("Start")]
internal class Patch_Start
{
public static void Prefix(Player __instance)
{
((int[,])Traverse.Create(Player.Get()).Field("m_PlayerControllerArray").GetValue())[(int)PlayerControllerType.HeavyObject, (int)PlayerControllerType.Swim] = 1;
}
}
class Myclass
{
public static void Patch_UpdateInWater(){
Traverse.Create(Player.Get()).Field("m_InSwimWater").SetValue(false);
}
}
[HarmonyPatch(typeof(MenuInGame))]
[HarmonyPatch("OnShow")]
internal class Patch_MenuInGame_AddButton
{
static bool swim = true;
public static void Prefix(MenuInGame __instance)
{
GameObject InGameMenu = GameObject.Find("InGameMenu");
if (InGameMenu.transform.Find("MenuInGame").Find("Buttons").Find("ToggleSwim") == null)
{
GameObject btn = GameObject.Instantiate(InGameMenu.transform.Find("MenuInGame").Find("Buttons").Find("Resume").gameObject, InGameMenu.transform.Find("MenuInGame").Find("Buttons"));
btn.name = "ToggleSwim";
btn.GetComponent<UIButtonEx>().onClick.AddListener(Patch_MenuInGame_AddButton.toggleSwim);
InGameMenu.transform.Find("MenuInGame").GetComponent<MenuInGame>().AddMenuButton(btn.GetComponent<UIButtonEx>(), "Toggle Swim ");
btn.GetComponentInChildren<Text>().text = "Toggle Swim (" + (swim ? "ON" : "OFF") + ")";
}
}
public static void toggleMenu(){
GameObject InGameMenu = GameObject.Find("InGameMenu");
if (InGameMenu.transform.Find("MenuInGame").Find("Buttons").Find("ToggleSwim") != null){
InGameMenu.transform.Find("MenuInGame").Find("Buttons").Find("ToggleSwim").GetComponentInChildren<Text>().text = "Toggle Swim (" + (swim ? "ON" : "OFF") + ")";
}
}
public static void toggleSwim(){
var original_UpdateInWater = typeof(Player).GetMethod("UpdateInWater", BindingFlags.NonPublic | BindingFlags.Instance);
var postfix_noSwim = new HarmonyMethod(typeof(Myclass).GetMethod("Patch_UpdateInWater"));
swim = !swim;
if(swim){
BuildInWater.instance.Unpatch(original_UpdateInWater, HarmonyPatchType.Postfix, BuildInWater.HarmonyId);
}else{
BuildInWater.instance.Patch(original_UpdateInWater, postfix: postfix_noSwim);
}
toggleMenu();
}
}