@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.
Files changed (45) hide show
  1. package/Convar.d.ts +13 -0
  2. package/Convar.js +50 -0
  3. package/GlobalData.d.ts +6 -0
  4. package/GlobalData.js +6 -0
  5. package/Kvp.d.ts +91 -0
  6. package/Kvp.js +161 -0
  7. package/Resource.d.ts +14 -0
  8. package/Resource.js +47 -0
  9. package/decors/Events.d.ts +14 -0
  10. package/decors/Events.js +167 -0
  11. package/index.d.ts +7 -0
  12. package/index.js +7 -0
  13. package/net/NetworkedMap.d.ts +23 -0
  14. package/net/NetworkedMap.js +182 -0
  15. package/package.json +30 -0
  16. package/types.d.ts +5 -0
  17. package/types.js +1 -0
  18. package/utils/ClassTypes.d.ts +11 -0
  19. package/utils/ClassTypes.js +12 -0
  20. package/utils/Color.d.ts +14 -0
  21. package/utils/Color.js +25 -0
  22. package/utils/Maths.d.ts +4 -0
  23. package/utils/Maths.js +10 -0
  24. package/utils/PointF.d.ts +12 -0
  25. package/utils/PointF.js +14 -0
  26. package/utils/Quaternion.d.ts +10 -0
  27. package/utils/Quaternion.js +27 -0
  28. package/utils/Vector.d.ts +390 -0
  29. package/utils/Vector.js +559 -0
  30. package/utils/Vector2.d.ts +1 -0
  31. package/utils/Vector2.js +1 -0
  32. package/utils/Vector3.d.ts +1 -0
  33. package/utils/Vector3.js +1 -0
  34. package/utils/Vector4.d.ts +1 -0
  35. package/utils/Vector4.js +1 -0
  36. package/utils/cleanPlayerName.d.ts +6 -0
  37. package/utils/cleanPlayerName.js +27 -0
  38. package/utils/enumValues.d.ts +12 -0
  39. package/utils/enumValues.js +14 -0
  40. package/utils/getStringFromUInt8Array.d.ts +8 -0
  41. package/utils/getStringFromUInt8Array.js +10 -0
  42. package/utils/getUInt32FromUint8Array.d.ts +8 -0
  43. package/utils/getUInt32FromUint8Array.js +8 -0
  44. package/utils/index.d.ts +12 -0
  45. 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
@@ -0,0 +1,5 @@
1
+ import type { Buffer } from "buffer";
2
+ export type MsgpackBuffer = {
3
+ buffer: Buffer;
4
+ type: number;
5
+ };
package/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ export declare enum ClassTypes {
2
+ Ped = 0,
3
+ Prop = 1,
4
+ Vehicle = 2,
5
+ Entity = 3,
6
+ Player = 4,
7
+ Vector2 = 5,
8
+ Vector3 = 6,
9
+ Vector4 = 7,
10
+ Quanterion = 8
11
+ }
@@ -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 = {}));
@@ -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
+ }
@@ -0,0 +1,4 @@
1
+ export declare abstract class Maths {
2
+ static clamp(num: number, min: number, max: number): number;
3
+ static getRandomInt(min: number, max: number): number;
4
+ }
package/utils/Maths.js ADDED
@@ -0,0 +1,10 @@
1
+ export class Maths {
2
+ static clamp(num, min, max) {
3
+ return num <= min ? min : num >= max ? max : num;
4
+ }
5
+ static getRandomInt(min, max) {
6
+ min = Math.ceil(min);
7
+ max = Math.floor(max);
8
+ return Math.floor(Math.random() * (max - min)) + min;
9
+ }
10
+ }
@@ -0,0 +1,12 @@
1
+ export interface PointF {
2
+ x: number;
3
+ y: number;
4
+ z: number;
5
+ }
6
+ export declare class PointF implements PointF {
7
+ x: number;
8
+ y: number;
9
+ z: number;
10
+ static empty(): PointF;
11
+ constructor(x: number, y: number, z: number);
12
+ }
@@ -0,0 +1,14 @@
1
+ /* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */
2
+ export class PointF {
3
+ x;
4
+ y;
5
+ z;
6
+ static empty() {
7
+ return new PointF(0, 0, 0);
8
+ }
9
+ constructor(x, y, z) {
10
+ this.x = x;
11
+ this.y = y;
12
+ this.z = z;
13
+ }
14
+ }
@@ -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
+ }