-
Notifications
You must be signed in to change notification settings - Fork 28
Expand file tree
/
Copy pathClientSimPickupHelper.cs
More file actions
185 lines (145 loc) · 5.41 KB
/
ClientSimPickupHelper.cs
File metadata and controls
185 lines (145 loc) · 5.41 KB
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
using System;
using UnityEngine;
using VRC.SDKBase;
namespace VRC.SDK3.ClientSim
{
[AddComponentMenu("")]
public class ClientSimPickupHelper : ClientSimBehaviour, IClientSimPickupable
{
private Rigidbody _rigidbody;
private VRC_Pickup _pickup;
private VRCPlayerApi _heldPlayer;
private VRC_Pickup.PickupHand _heldHand;
private Action<IClientSimPickupable> _forceDropHandler;
private static ClientSimSettings _settings;
private void OnEnable()
{
if (_settings == null)
{
_settings = ClientSimSettings.Instance;
}
}
public static void InitializePickup(VRC_Pickup pickup)
{
ClientSimPickupHelper previousHelper = pickup.gameObject.GetComponent<ClientSimPickupHelper>();
if (previousHelper != null)
{
DestroyImmediate(previousHelper);
if (_settings.displayLogs)
{
pickup.LogWarning($"Destroying old pickup helper on object: {Tools.GetGameObjectPath(pickup.gameObject)}");
}
}
ClientSimPickupHelper helper = pickup.gameObject.AddComponent<ClientSimPickupHelper>();
helper.SetPickup(pickup);
}
public static void ForceDrop(VRC_Pickup pickup)
{
ClientSimPickupHelper helper = pickup.GetComponent<ClientSimPickupHelper>();
if (helper)
{
helper._forceDropHandler?.Invoke(helper);
}
}
public static VRCPlayerApi GetCurrentPlayer(VRC_Pickup pickup)
{
ClientSimPickupHelper helper = pickup.GetComponent<ClientSimPickupHelper>();
if (!helper)
{
return null;
}
return helper.GetHoldingPlayer();
}
public static VRC_Pickup.PickupHand GetPickupHand(VRC_Pickup pickup)
{
ClientSimPickupHelper helper = pickup.GetComponent<ClientSimPickupHelper>();
if (helper)
{
return helper._heldHand;
}
return VRC_Pickup.PickupHand.None;
}
public static void PickupDestroy(VRC_Pickup pickup)
{
ForceDrop(pickup);
}
public static void PlayHapticForPickup(VRC_Pickup obj, float duration, float amplitude, float frequency)
{
VRCPlayerApi player = obj.currentPlayer;
VRC_Pickup.PickupHand hand = obj.currentHand;
if (Utilities.IsValid(player) && hand != VRC_Pickup.PickupHand.None)
{
player.PlayHapticEventInHand(obj.currentHand, duration, amplitude, frequency);
}
}
private void SetPickup(VRC_Pickup pickup)
{
_pickup = pickup;
_rigidbody = GetComponent<Rigidbody>();
}
#region IClientSimInteractible
public float GetProximity()
{
return _pickup.proximity;
}
public bool CanInteract()
{
return _pickup.pickupable;
}
public string GetInteractText()
{
if (!string.IsNullOrEmpty(_pickup.InteractionText))
{
return _pickup.InteractionText;
}
return AutoHold() ? "Equip" : "Hold to Grab";
}
public Vector3 GetInteractTextPlacement()
{
// VRChatBug: Tooltips always ignore the tooltipPlacement transform and instead place the tooltip at the top
// of the first collider on the object.
return ClientSimTooltip.GetToolTipPosition(gameObject);
}
public void Interact() { }
#endregion
#region IClientSimPickupable
public void Pickup(VRCPlayerApi player, VRC_Pickup.PickupHand heldHand, Action<IClientSimPickupable> forceDropHandler)
{
if (IsHeld())
{
return;
}
_heldPlayer = player;
_heldHand = heldHand;
_forceDropHandler = forceDropHandler;
}
public void Drop(VRCPlayerApi player)
{
if (GetHoldingPlayer() != player)
{
return;
}
_heldPlayer = null;
_heldHand = VRC_Pickup.PickupHand.None;
_forceDropHandler = null;
}
public bool IsHeld() => Utilities.IsValid(_heldPlayer);
public VRCPlayerApi GetHoldingPlayer() => IsHeld() ? _heldPlayer : null;
public bool AutoHold() => _pickup.AutoHold == VRC_Pickup.AutoHoldMode.Yes;
public GameObject GetGameObject() => gameObject;
public Transform GetTransform() => transform;
public Rigidbody GetRigidbody() => _rigidbody;
public VRC_Pickup GetPickup() => _pickup;
public VRC_Pickup.PickupOrientation GetOrientation() => _pickup.orientation;
public Transform GetGunLocation() => _pickup.ExactGun;
public Transform GetGripLocation() => _pickup.ExactGrip;
public float GetThrowVelocityBoostScale() => _pickup.ThrowVelocityBoostScale;
public bool AllowManipulation() => _pickup.allowManipulationWhenEquipped;
#endregion
// TODO display use text after picking up a pickup.
public string PickupText()
{
return _pickup.UseText;
}
}
}