This repository has been archived by the owner on Jul 13, 2020. It is now read-only.
forked from Bluscream/VRLoader_Portal_To_Friend
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMod.cs
127 lines (118 loc) · 5.28 KB
/
Mod.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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using System.Reflection;
using UnityEngine;
using UnityEngine.UI;
using VRC.UI;
using VRCSDK2;
using UnityEngine.Events;
using VRC.Core;
using VRLoader.Attributes;
using VRLoader.Modules;
using System.Linq;
namespace PortalToFriend
{
[ModuleInfo("Drop portal to instance", "1.0", "bay, yoshifan, plu")]
public class Mod : VRModule
{
public const string userPanelString = "MenuContent/Screens/UserInfo/User Panel/";
private bool initialized = false;
void OnGUI() {
if (initialized) return;
var userPanel = GameObject.Find(userPanelString);
Utils.Log("Mod.OnGUI and not initialized");
if (userPanel is null) return;
initialized = true;
Init();
}
private void Init() {
Utils.Log("Mod.Init");
new GameObject("mod").AddComponent<ModComponent>();
}
}
class ModComponent : MonoBehaviour
{
public GameObject UserDropPortal { get; private set; }
public static VRCUiManager VrcuimInstance { get; private set; }
public static VRCUiPopupManager PopupManagerInstance;
void Awake()
{
Utils.Log("ModComponent.Awake");
DontDestroyOnLoad(this);
var userPanel = GameObject.Find(Mod.userPanelString);
var playlistButton = GameObject.Find("MenuContent/Screens/UserInfo/User Panel/Playlists/PlaylistsButton");
var playlists = GameObject.Find("MenuContent/Screens/UserInfo/User Panel/Playlists");
UserDropPortal = Instantiate(playlistButton, playlists.transform);
UserDropPortal.transform.SetParent(userPanel.transform);
UserDropPortal.GetComponent<RectTransform>().anchoredPosition += new Vector2(0, 75);
UserDropPortal.GetComponentInChildren<Text>().text = "Drop Portal to Instance";
UserDropPortal.GetComponentInChildren<Button>().onClick = new Button.ButtonClickedEvent();
UserDropPortal.GetComponentInChildren<Button>().onClick.AddListener(DropPortalToUserClicked);
}
private void DropPortalToUserClicked()
{
var player = GetVRCUiMInstance().menuContent.GetComponentInChildren<PageUserInfo>().user;
Utils.Log("Selected User:", player.displayName, player.id.Enclose());
Utils.Log("Location:", player.location);
if (player.id == APIUser.CurrentUser.id)
{
GetVRCUiPopupManager().ShowAlert("Error", "You cannot drop a portal to yourself!");
return;
}
else if (player.location.IsNullOrEmpty())
{
GetVRCUiPopupManager().ShowAlert("Error", $"Player {player.displayName.Quote()} has no valid location!");
return;
}
else if (player.location == "private")
{
GetVRCUiPopupManager().ShowAlert("Error", $"Player {player.displayName.Quote()} location is private!");
return;
}
var location = player.location;
string[] array = location.Split(':');
Utils.Log("Dropping Portal to instance: ", player.displayName);
DropPortalToLocation(array);
}
public static void DropPortalToLocation(string[] location)
{
Utils.Log("ModComponent.DropPortalToLocation");
var gameObject = Networking.Instantiate(VRC_EventHandler.VrcBroadcastType.Always, "Portals/PortalInternalDynamic", VRCPlayer.Instance.transform.position + VRCPlayer.Instance.transform.forward, VRCPlayer.Instance.transform.rotation);
Networking.RPC(VRC_EventHandler.VrcTargetType.AllBufferOne, gameObject, "ConfigurePortal", new object[]
{
location[0],
location[1],
0
});
}
public static VRCUiManager GetVRCUiMInstance()
{
if (ModComponent.VrcuimInstance == null)
{
var method = typeof(VRCUiManager).GetMethod("get_Instance", BindingFlags.Static | BindingFlags.Public);
if (method == null)
{
return null;
}
ModComponent.VrcuimInstance = (VRCUiManager)method.Invoke(null, new object[0]);
}
return VrcuimInstance;
}
public static VRCUiPopupManager GetVRCUiPopupManager()
{
if (PopupManagerInstance == null)
{
FieldInfo[] nonpublicStaticPopupFields = typeof(VRCUiPopupManager).GetFields(BindingFlags.NonPublic | BindingFlags.Static);
if (nonpublicStaticPopupFields.Length == 0)
{
return null;
}
FieldInfo uiPopupManagerInstanceField = nonpublicStaticPopupFields.First(field => field.FieldType == typeof(VRCUiPopupManager));
if (uiPopupManagerInstanceField == null)
{
return null;
}
PopupManagerInstance = uiPopupManagerInstanceField.GetValue(null) as VRCUiPopupManager;
}
return PopupManagerInstance;
}
}
}