@nativewrappers/common 0.0.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Convar.d.ts +13 -0
- package/Convar.js +50 -0
- package/GlobalData.d.ts +6 -0
- package/GlobalData.js +6 -0
- package/Kvp.d.ts +91 -0
- package/Kvp.js +161 -0
- package/Resource.d.ts +14 -0
- package/Resource.js +47 -0
- package/decors/Events.d.ts +14 -0
- package/decors/Events.js +167 -0
- package/index.d.ts +7 -0
- package/index.js +7 -0
- package/net/NetworkedMap.d.ts +23 -0
- package/net/NetworkedMap.js +182 -0
- package/package.json +30 -0
- package/types.d.ts +5 -0
- package/types.js +1 -0
- package/utils/ClassTypes.d.ts +11 -0
- package/utils/ClassTypes.js +12 -0
- package/utils/Color.d.ts +14 -0
- package/utils/Color.js +25 -0
- package/utils/Maths.d.ts +4 -0
- package/utils/Maths.js +10 -0
- package/utils/PointF.d.ts +12 -0
- package/utils/PointF.js +14 -0
- package/utils/Quaternion.d.ts +10 -0
- package/utils/Quaternion.js +27 -0
- package/utils/Vector.d.ts +390 -0
- package/utils/Vector.js +559 -0
- package/utils/Vector2.d.ts +1 -0
- package/utils/Vector2.js +1 -0
- package/utils/Vector3.d.ts +1 -0
- package/utils/Vector3.js +1 -0
- package/utils/Vector4.d.ts +1 -0
- package/utils/Vector4.js +1 -0
- package/utils/cleanPlayerName.d.ts +6 -0
- package/utils/cleanPlayerName.js +27 -0
- package/utils/enumValues.d.ts +12 -0
- package/utils/enumValues.js +14 -0
- package/utils/getStringFromUInt8Array.d.ts +8 -0
- package/utils/getStringFromUInt8Array.js +10 -0
- package/utils/getUInt32FromUint8Array.d.ts +8 -0
- package/utils/getUInt32FromUint8Array.js +8 -0
- package/utils/index.d.ts +12 -0
- package/utils/index.js +12 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { GlobalData } from "../GlobalData";
|
|
2
|
+
var MapChangeType;
|
|
3
|
+
(function (MapChangeType) {
|
|
4
|
+
// whenever a value inside of the object changed
|
|
5
|
+
MapChangeType[MapChangeType["SubValueChanged"] = 0] = "SubValueChanged";
|
|
6
|
+
// whenever a new key was added, or overwrote
|
|
7
|
+
MapChangeType[MapChangeType["Add"] = 1] = "Add";
|
|
8
|
+
// whenever a key was removed from the map
|
|
9
|
+
MapChangeType[MapChangeType["Remove"] = 2] = "Remove";
|
|
10
|
+
// whenever reset() was called on the map
|
|
11
|
+
MapChangeType[MapChangeType["Reset"] = 3] = "Reset";
|
|
12
|
+
// Whenever they're subscribed initially and get the initial load of data
|
|
13
|
+
MapChangeType[MapChangeType["Init"] = 4] = "Init";
|
|
14
|
+
})(MapChangeType || (MapChangeType = {}));
|
|
15
|
+
/**
|
|
16
|
+
* not ready to be used just thoughts right now
|
|
17
|
+
*/
|
|
18
|
+
export class NetworkedMap extends Map {
|
|
19
|
+
#syncName;
|
|
20
|
+
#queuedChanges = [];
|
|
21
|
+
#changeListeners = new Map();
|
|
22
|
+
#subscribers = new Set();
|
|
23
|
+
constructor(syncName, initialValue) {
|
|
24
|
+
super(initialValue);
|
|
25
|
+
this.#syncName = syncName;
|
|
26
|
+
GlobalData.NetworkedTicks.push(this);
|
|
27
|
+
on("playerDropped", () => this.onPlayerDropped());
|
|
28
|
+
// if we don't have a network tick then we want to register it.
|
|
29
|
+
SERVER: {
|
|
30
|
+
if (!GlobalData.NetworkTick && GlobalData.IS_SERVER) {
|
|
31
|
+
GlobalData.NetworkTick = setTick(() => {
|
|
32
|
+
for (const networkedThis of GlobalData.NetworkedTicks) {
|
|
33
|
+
networkedThis.networkTick();
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
SERVER: if (GlobalData.IS_SERVER)
|
|
39
|
+
return;
|
|
40
|
+
CLIENT: {
|
|
41
|
+
RegisterResourceAsEventHandler(`${this.#syncName}:syncChanges`);
|
|
42
|
+
addRawEventListener(`${this.#syncName}:syncChanges`, (data) => this.#handleSync(data));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// handles removing the player from the map whenever they're dropped
|
|
46
|
+
onPlayerDropped() {
|
|
47
|
+
this.removeSubscriber(source);
|
|
48
|
+
}
|
|
49
|
+
/*
|
|
50
|
+
* Adds a new subscriber to the map, if the
|
|
51
|
+
*/
|
|
52
|
+
addSubscriber(sub) {
|
|
53
|
+
this.#subscribers.add(sub);
|
|
54
|
+
const packed_data = msgpack_pack([MapChangeType.Init, Array.from(this)]);
|
|
55
|
+
TriggerClientEventInternal(`${this.#syncName}:syncChanges`, sub, packed_data, packed_data.length);
|
|
56
|
+
}
|
|
57
|
+
removeSubscriber(sub) {
|
|
58
|
+
return this.#subscribers.delete(sub);
|
|
59
|
+
}
|
|
60
|
+
#handleSync(msgpack_data) {
|
|
61
|
+
const data = msgpack_unpack(msgpack_data);
|
|
62
|
+
for (const change_data of data) {
|
|
63
|
+
const [change_type, key, value] = change_data;
|
|
64
|
+
switch (change_type) {
|
|
65
|
+
case MapChangeType.Add: {
|
|
66
|
+
this.set(key, value);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
case MapChangeType.Remove: {
|
|
70
|
+
super.delete(key);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
case MapChangeType.Reset: {
|
|
74
|
+
super.clear();
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
case MapChangeType.Init: {
|
|
78
|
+
const key_value = key;
|
|
79
|
+
for (const [k, v] of key_value) {
|
|
80
|
+
this.set(k, v);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
case MapChangeType.SubValueChanged: {
|
|
84
|
+
const data = this.get(key);
|
|
85
|
+
// @ts-ignore
|
|
86
|
+
data[value] = change_data[3];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/*
|
|
92
|
+
* Listens for the change on the specified key, it will get the resulting
|
|
93
|
+
* value on the change
|
|
94
|
+
*/
|
|
95
|
+
listenForChange(key, fn) {
|
|
96
|
+
const listener = this.#changeListeners.get(key);
|
|
97
|
+
listener ? listener.push(fn) : this.#changeListeners.set(key, [fn]);
|
|
98
|
+
}
|
|
99
|
+
#triggerEventForSubscribers(data) {
|
|
100
|
+
const packed_data = msgpack_pack(data);
|
|
101
|
+
for (const sub of this.#subscribers) {
|
|
102
|
+
TriggerClientEventInternal(`${this.#syncName}:syncChanges`, sub, packed_data, packed_data.length);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
#pushChangeForListener(key, value) {
|
|
106
|
+
const listener = this.#changeListeners.get(key);
|
|
107
|
+
if (!listener)
|
|
108
|
+
return;
|
|
109
|
+
for (const ln of listener) {
|
|
110
|
+
ln(value);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
set(key, value) {
|
|
114
|
+
let v = value;
|
|
115
|
+
// if we're an object
|
|
116
|
+
if (value instanceof Object) {
|
|
117
|
+
// define `this` so we can use it in the internal scope without breaking
|
|
118
|
+
// any rules
|
|
119
|
+
const curMap = this;
|
|
120
|
+
// apply a proxy around any changes so if the fields
|
|
121
|
+
const objectChangeHandler = {
|
|
122
|
+
get(target, prop, reciever) {
|
|
123
|
+
return Reflect.get(target, prop, reciever);
|
|
124
|
+
},
|
|
125
|
+
set(target, p, newValue, receiver) {
|
|
126
|
+
const success = Reflect.set(target, p, newValue, receiver);
|
|
127
|
+
if (success) {
|
|
128
|
+
curMap.#pushChangeForListener(key, target);
|
|
129
|
+
SERVER: {
|
|
130
|
+
curMap.#queuedChanges.push([
|
|
131
|
+
MapChangeType.SubValueChanged,
|
|
132
|
+
key,
|
|
133
|
+
p,
|
|
134
|
+
newValue,
|
|
135
|
+
]);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return success;
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
v = new Proxy(v, objectChangeHandler);
|
|
142
|
+
}
|
|
143
|
+
super.set(key, v);
|
|
144
|
+
this.#pushChangeForListener(key, v);
|
|
145
|
+
SERVER: {
|
|
146
|
+
this.#queuedChanges.push([MapChangeType.Add, key, v]);
|
|
147
|
+
}
|
|
148
|
+
return this;
|
|
149
|
+
}
|
|
150
|
+
clear() {
|
|
151
|
+
CLIENT: throw new Error(`Cannot call 'clear' on client`);
|
|
152
|
+
// if we're clearing our map then we want to remove all queued changes and
|
|
153
|
+
// just push a reset
|
|
154
|
+
this.#queuedChanges = [];
|
|
155
|
+
this.#queuedChanges.push([MapChangeType.Reset]);
|
|
156
|
+
super.clear();
|
|
157
|
+
}
|
|
158
|
+
delete(key) {
|
|
159
|
+
CLIENT: throw new Error(`Cannot call 'delete' on client`);
|
|
160
|
+
this.#queuedChanges.push([MapChangeType.Remove, key]);
|
|
161
|
+
return super.delete(key);
|
|
162
|
+
}
|
|
163
|
+
networkTick() {
|
|
164
|
+
if (this.#queuedChanges.length !== 0) {
|
|
165
|
+
this.#triggerEventForSubscribers(this.#queuedChanges);
|
|
166
|
+
this.#queuedChanges = [];
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
[Symbol.dispose]() {
|
|
170
|
+
removeEventListener("playerDropped", this.onPlayerDropped);
|
|
171
|
+
GlobalData.NetworkedTicks.filter((v) => v !== this);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Unregisters from the tick handler and removes the event listener
|
|
175
|
+
*/
|
|
176
|
+
dispose() {
|
|
177
|
+
this[Symbol.dispose]();
|
|
178
|
+
}
|
|
179
|
+
get [Symbol.toStringTag]() {
|
|
180
|
+
return "NetworkedMap";
|
|
181
|
+
}
|
|
182
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nativewrappers/common",
|
|
3
|
+
"description": "Native wrappers and utilities for use with Cfx.re's scripting runtimes.",
|
|
4
|
+
"author": "Remco Troost <d0p3t>",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"version": "0.0.44",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/nativewrappers/fivem.git"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/nativewrappers/fivem/issues"
|
|
14
|
+
},
|
|
15
|
+
"homepage": "https://fivemjs.avarian.dev/",
|
|
16
|
+
"keywords": [
|
|
17
|
+
"fivem",
|
|
18
|
+
"wrapper",
|
|
19
|
+
"javascript",
|
|
20
|
+
"typescript",
|
|
21
|
+
"citizenfx"
|
|
22
|
+
],
|
|
23
|
+
"files": [
|
|
24
|
+
"./**/*.js",
|
|
25
|
+
"./**/*.d.ts"
|
|
26
|
+
],
|
|
27
|
+
"exports": {
|
|
28
|
+
".": "./index.js"
|
|
29
|
+
}
|
|
30
|
+
}
|
package/types.d.ts
ADDED
package/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export var ClassTypes;
|
|
2
|
+
(function (ClassTypes) {
|
|
3
|
+
ClassTypes[ClassTypes["Ped"] = 0] = "Ped";
|
|
4
|
+
ClassTypes[ClassTypes["Prop"] = 1] = "Prop";
|
|
5
|
+
ClassTypes[ClassTypes["Vehicle"] = 2] = "Vehicle";
|
|
6
|
+
ClassTypes[ClassTypes["Entity"] = 3] = "Entity";
|
|
7
|
+
ClassTypes[ClassTypes["Player"] = 4] = "Player";
|
|
8
|
+
ClassTypes[ClassTypes["Vector2"] = 5] = "Vector2";
|
|
9
|
+
ClassTypes[ClassTypes["Vector3"] = 6] = "Vector3";
|
|
10
|
+
ClassTypes[ClassTypes["Vector4"] = 7] = "Vector4";
|
|
11
|
+
ClassTypes[ClassTypes["Quanterion"] = 8] = "Quanterion";
|
|
12
|
+
})(ClassTypes || (ClassTypes = {}));
|
package/utils/Color.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare class Color {
|
|
2
|
+
static Transparent: Color;
|
|
3
|
+
static Black: Color;
|
|
4
|
+
static White: Color;
|
|
5
|
+
static WhiteSmoke: Color;
|
|
6
|
+
static fromArgb(a: number, r: number, g: number, b: number): Color;
|
|
7
|
+
static fromRgb(r: number, g: number, b: number): Color;
|
|
8
|
+
static fromArray(primitive: [number, number, number] | number[]): Color;
|
|
9
|
+
a: number;
|
|
10
|
+
r: number;
|
|
11
|
+
g: number;
|
|
12
|
+
b: number;
|
|
13
|
+
constructor(r: number, g: number, b: number, a?: number);
|
|
14
|
+
}
|
package/utils/Color.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export class Color {
|
|
2
|
+
static Transparent = new Color(0, 0, 0, 0);
|
|
3
|
+
static Black = new Color(0, 0, 0);
|
|
4
|
+
static White = new Color(255, 255, 255);
|
|
5
|
+
static WhiteSmoke = new Color(245, 245, 245);
|
|
6
|
+
static fromArgb(a, r, g, b) {
|
|
7
|
+
return new Color(r, g, b, a);
|
|
8
|
+
}
|
|
9
|
+
static fromRgb(r, g, b) {
|
|
10
|
+
return new Color(r, g, b);
|
|
11
|
+
}
|
|
12
|
+
static fromArray(primitive) {
|
|
13
|
+
return new Color(primitive[0], primitive[1], primitive[2], 255);
|
|
14
|
+
}
|
|
15
|
+
a;
|
|
16
|
+
r;
|
|
17
|
+
g;
|
|
18
|
+
b;
|
|
19
|
+
constructor(r, g, b, a = 255) {
|
|
20
|
+
this.r = r;
|
|
21
|
+
this.g = g;
|
|
22
|
+
this.b = b;
|
|
23
|
+
this.a = a;
|
|
24
|
+
}
|
|
25
|
+
}
|
package/utils/Maths.d.ts
ADDED
package/utils/Maths.js
ADDED
package/utils/PointF.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Vector3 } from "./Vector3";
|
|
2
|
+
export declare class Quaternion {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
z: number;
|
|
6
|
+
w: number;
|
|
7
|
+
constructor(value: number);
|
|
8
|
+
constructor(vector: Vector3, w: number);
|
|
9
|
+
constructor(x: number, y: number, z: number, w: number);
|
|
10
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Vector3 } from "./Vector3";
|
|
2
|
+
export class Quaternion {
|
|
3
|
+
x;
|
|
4
|
+
y;
|
|
5
|
+
z;
|
|
6
|
+
w;
|
|
7
|
+
constructor(valueXOrVector, yOrW, z, w) {
|
|
8
|
+
if (valueXOrVector instanceof Vector3) {
|
|
9
|
+
this.x = valueXOrVector.x;
|
|
10
|
+
this.y = valueXOrVector.y;
|
|
11
|
+
this.z = valueXOrVector.z;
|
|
12
|
+
this.w = yOrW ?? 0;
|
|
13
|
+
}
|
|
14
|
+
else if (yOrW === undefined) {
|
|
15
|
+
this.x = valueXOrVector;
|
|
16
|
+
this.y = valueXOrVector;
|
|
17
|
+
this.z = valueXOrVector;
|
|
18
|
+
this.w = valueXOrVector;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
this.x = valueXOrVector;
|
|
22
|
+
this.y = yOrW;
|
|
23
|
+
this.z = z ?? 0;
|
|
24
|
+
this.w = w ?? 0;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|