-
Notifications
You must be signed in to change notification settings - Fork 2.1k
/
Rope.cs
128 lines (115 loc) · 2.77 KB
/
Rope.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
128
using System;
#if MONO_V2
using CitizenFX.Core;
using API = CitizenFX.FiveM.Native.Natives;
namespace CitizenFX.FiveM
#else
using CitizenFX.Core.Native;
namespace CitizenFX.Core
#endif
{
public enum RopeType
{
ThickRope = 4,
ThinMetalWire = 5,
}
public sealed class Rope : PoolObject, IEquatable<Rope>
{
public Rope(int handle) : base(handle)
{
}
public float Length
{
get
{
return API.GetRopeLength(Handle);
}
set
{
API.RopeForceLength(Handle, value);
}
}
public int VertexCount
{
get
{
return API.GetRopeVertexCount(Handle);
}
}
public void ResetLength(bool reset)
{
API.RopeResetLength(Handle, reset ? 1f : Length);
}
public void ActivatePhysics()
{
API.ActivatePhysics(Handle);
}
public void AttachEntity(Entity entity)
{
AttachEntity(entity, Vector3.Zero);
}
public void AttachEntity(Entity entity, Vector3 position)
{
API.AttachRopeToEntity(Handle, entity.Handle, position.X, position.Y, position.Z, false);
}
public void AttachEntities(Entity entityOne, Entity entityTwo, float length)
{
AttachEntities(entityOne, Vector3.Zero, entityTwo, Vector3.Zero, length);
}
public void AttachEntities(Entity entityOne, Vector3 positionOne, Entity entityTwo, Vector3 positionTwo, float length)
{
API.AttachEntitiesToRope(Handle, entityOne.Handle, entityTwo.Handle, positionOne.X, positionOne.Y, positionOne.Z, positionTwo.X, positionTwo.Y, positionTwo.Z, length, false, false, null, null);
}
public void DetachEntity(Entity entity)
{
API.DetachRopeFromEntity(Handle, entity.Handle);
}
public void PinVertex(int vertex, Vector3 position)
{
API.PinRopeVertex(Handle, vertex, position.X, position.Y, position.Z);
}
public void UnpinVertex(int vertex)
{
API.UnpinRopeVertex(Handle, vertex);
}
public Vector3 GetVertexCoord(int vertex)
{
return API.GetRopeVertexCoord(Handle, vertex);
}
public override void Delete()
{
int handle = Handle;
API.DeleteRope(ref handle);
Handle = handle;
}
public override bool Exists()
{
int handle = Handle;
return API.DoesRopeExist(ref handle);
}
public static bool Exists(Rope rope)
{
return !ReferenceEquals(rope, null) && rope.Exists();
}
public bool Equals(Rope rope)
{
return !ReferenceEquals(rope, null) && Handle == rope.Handle;
}
public override bool Equals(object obj)
{
return !ReferenceEquals(obj, null) && obj.GetType() == GetType() && Equals((Rope)obj);
}
public sealed override int GetHashCode()
{
return Handle;
}
public static bool operator ==(Rope left, Rope right)
{
return ReferenceEquals(left, null) ? ReferenceEquals(right, null) : left.Equals(right);
}
public static bool operator !=(Rope left, Rope right)
{
return !(left == right);
}
}
}