dirk-cfx-react 1.1.2 → 1.1.6

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.
@@ -0,0 +1,813 @@
1
+ import { useEffect, useMemo } from 'react';
2
+ import { create } from 'zustand';
3
+ import axios from 'axios';
4
+
5
+ // src/utils/colorWithAlpha.ts
6
+ var colorNames = {
7
+ AliceBlue: { r: 240, g: 248, b: 255 },
8
+ AntiqueWhite: { r: 250, g: 235, b: 215 },
9
+ Aqua: { r: 0, g: 255, b: 255 },
10
+ Aquamarine: { r: 127, g: 255, b: 212 },
11
+ Azure: { r: 240, g: 255, b: 255 },
12
+ Beige: { r: 245, g: 245, b: 220 },
13
+ Bisque: { r: 255, g: 228, b: 196 },
14
+ Black: { r: 0, g: 0, b: 0 },
15
+ BlanchedAlmond: { r: 255, g: 235, b: 205 },
16
+ Blue: { r: 0, g: 0, b: 255 },
17
+ BlueViolet: { r: 138, g: 43, b: 226 },
18
+ Brown: { r: 165, g: 42, b: 42 },
19
+ BurlyWood: { r: 222, g: 184, b: 135 },
20
+ CadetBlue: { r: 95, g: 158, b: 160 },
21
+ Chartreuse: { r: 127, g: 255, b: 0 },
22
+ Chocolate: { r: 210, g: 105, b: 30 },
23
+ Coral: { r: 255, g: 127, b: 80 },
24
+ CornflowerBlue: { r: 100, g: 149, b: 237 },
25
+ Cornsilk: { r: 255, g: 248, b: 220 },
26
+ Crimson: { r: 220, g: 20, b: 60 },
27
+ Cyan: { r: 0, g: 255, b: 255 },
28
+ DarkBlue: { r: 0, g: 0, b: 139 },
29
+ DarkCyan: { r: 0, g: 139, b: 139 },
30
+ DarkGoldenRod: { r: 184, g: 134, b: 11 },
31
+ DarkGray: { r: 169, g: 169, b: 169 },
32
+ DarkGreen: { r: 0, g: 100, b: 0 },
33
+ DarkKhaki: { r: 189, g: 183, b: 107 },
34
+ DarkMagenta: { r: 139, g: 0, b: 139 },
35
+ DarkOliveGreen: { r: 85, g: 107, b: 47 },
36
+ DarkOrange: { r: 255, g: 140, b: 0 },
37
+ DarkOrchid: { r: 153, g: 50, b: 204 },
38
+ DarkRed: { r: 139, g: 0, b: 0 },
39
+ DarkSalmon: { r: 233, g: 150, b: 122 },
40
+ DarkSeaGreen: { r: 143, g: 188, b: 143 },
41
+ DarkSlateBlue: { r: 72, g: 61, b: 139 },
42
+ DarkSlateGray: { r: 47, g: 79, b: 79 },
43
+ DarkTurquoise: { r: 0, g: 206, b: 209 },
44
+ DarkViolet: { r: 148, g: 0, b: 211 },
45
+ DeepPink: { r: 255, g: 20, b: 147 },
46
+ DeepSkyBlue: { r: 0, g: 191, b: 255 },
47
+ DimGray: { r: 105, g: 105, b: 105 },
48
+ DodgerBlue: { r: 30, g: 144, b: 255 },
49
+ FireBrick: { r: 178, g: 34, b: 34 },
50
+ FloralWhite: { r: 255, g: 250, b: 240 },
51
+ ForestGreen: { r: 34, g: 139, b: 34 },
52
+ Fuchsia: { r: 255, g: 0, b: 255 },
53
+ Gainsboro: { r: 220, g: 220, b: 220 },
54
+ GhostWhite: { r: 248, g: 248, b: 255 },
55
+ Gold: { r: 255, g: 215, b: 0 },
56
+ GoldenRod: { r: 218, g: 165, b: 32 },
57
+ Gray: { r: 128, g: 128, b: 128 },
58
+ Green: { r: 0, g: 128, b: 0 },
59
+ GreenYellow: { r: 173, g: 255, b: 47 },
60
+ HoneyDew: { r: 240, g: 255, b: 240 },
61
+ HotPink: { r: 255, g: 105, b: 180 },
62
+ IndianRed: { r: 205, g: 92, b: 92 },
63
+ Indigo: { r: 75, g: 0, b: 130 },
64
+ Ivory: { r: 255, g: 255, b: 240 },
65
+ Khaki: { r: 240, g: 230, b: 140 },
66
+ Lavender: { r: 230, g: 230, b: 250 },
67
+ LavenderBlush: { r: 255, g: 240, b: 245 },
68
+ LawnGreen: { r: 124, g: 252, b: 0 },
69
+ LemonChiffon: { r: 255, g: 250, b: 205 },
70
+ LightBlue: { r: 173, g: 216, b: 230 },
71
+ LightCoral: { r: 240, g: 128, b: 128 },
72
+ LightCyan: { r: 224, g: 255, b: 255 },
73
+ LightGoldenRodYellow: { r: 250, g: 250, b: 210 },
74
+ LightGray: { r: 211, g: 211, b: 211 },
75
+ LightGreen: { r: 144, g: 238, b: 144 },
76
+ LightPink: { r: 255, g: 182, b: 193 },
77
+ LightSalmon: { r: 255, g: 160, b: 122 },
78
+ LightSeaGreen: { r: 32, g: 178, b: 170 },
79
+ LightSkyBlue: { r: 135, g: 206, b: 250 },
80
+ LightSlateGray: { r: 119, g: 136, b: 153 },
81
+ LightSteelBlue: { r: 176, g: 196, b: 222 },
82
+ LightYellow: { r: 255, g: 255, b: 224 },
83
+ Lime: { r: 0, g: 255, b: 0 },
84
+ LimeGreen: { r: 50, g: 205, b: 50 },
85
+ Linen: { r: 250, g: 240, b: 230 },
86
+ Magenta: { r: 255, g: 0, b: 255 },
87
+ Maroon: { r: 128, g: 0, b: 0 },
88
+ // Maroon
89
+ MediumAquaMarine: { r: 102, g: 205, b: 170 },
90
+ MediumBlue: { r: 0, g: 0, b: 205 },
91
+ MediumOrchid: { r: 186, g: 85, b: 211 },
92
+ MediumPurple: { r: 147, g: 112, b: 219 },
93
+ MediumSeaGreen: { r: 60, g: 179, b: 113 },
94
+ MediumSlateBlue: { r: 123, g: 104, b: 238 },
95
+ MediumSpringGreen: { r: 0, g: 250, b: 154 },
96
+ MediumTurquoise: { r: 72, g: 209, b: 204 },
97
+ MediumVioletRed: { r: 199, g: 21, b: 133 },
98
+ MidnightBlue: { r: 25, g: 25, b: 112 },
99
+ MintCream: { r: 245, g: 255, b: 250 },
100
+ MistyRose: { r: 255, g: 228, b: 225 },
101
+ Moccasin: { r: 255, g: 228, b: 181 },
102
+ NavajoWhite: { r: 255, g: 222, b: 173 },
103
+ Navy: { r: 0, g: 0, b: 128 },
104
+ OldLace: { r: 253, g: 245, b: 230 },
105
+ Olive: { r: 128, g: 128, b: 0 },
106
+ OliveDrab: { r: 107, g: 142, b: 35 },
107
+ Orange: { r: 255, g: 165, b: 0 },
108
+ OrangeRed: { r: 255, g: 69, b: 0 },
109
+ Orchid: { r: 218, g: 112, b: 214 },
110
+ PaleGoldenRod: { r: 238, g: 232, b: 170 },
111
+ PaleGreen: { r: 152, g: 251, b: 152 },
112
+ PaleTurquoise: { r: 175, g: 238, b: 238 },
113
+ PaleVioletRed: { r: 219, g: 112, b: 147 },
114
+ PapayaWhip: { r: 255, g: 239, b: 213 },
115
+ PeachPuff: { r: 255, g: 218, b: 185 },
116
+ Peru: { r: 205, g: 133, b: 63 },
117
+ Pink: { r: 255, g: 192, b: 203 },
118
+ Plum: { r: 221, g: 160, b: 221 },
119
+ PowderBlue: { r: 176, g: 224, b: 230 },
120
+ Purple: { r: 128, g: 0, b: 128 },
121
+ RebeccaPurple: { r: 102, g: 51, b: 153 },
122
+ Red: { r: 255, g: 0, b: 0 },
123
+ RosyBrown: { r: 188, g: 143, b: 143 },
124
+ RoyalBlue: { r: 65, g: 105, b: 225 },
125
+ SaddleBrown: { r: 139, g: 69, b: 19 },
126
+ Salmon: { r: 250, g: 128, b: 114 },
127
+ SandyBrown: { r: 244, g: 164, b: 96 },
128
+ SeaGreen: { r: 46, g: 139, b: 87 },
129
+ SeaShell: { r: 255, g: 245, b: 238 },
130
+ Sienna: { r: 160, g: 82, b: 45 },
131
+ Silver: { r: 192, g: 192, b: 192 },
132
+ SkyBlue: { r: 135, g: 206, b: 235 },
133
+ SlateBlue: { r: 106, g: 90, b: 205 },
134
+ SlateGray: { r: 112, g: 128, b: 144 },
135
+ Snow: { r: 255, g: 250, b: 250 },
136
+ SpringGreen: { r: 0, g: 255, b: 127 },
137
+ SteelBlue: { r: 70, g: 130, b: 180 },
138
+ Tan: { r: 210, g: 180, b: 140 },
139
+ Teal: { r: 0, g: 128, b: 128 },
140
+ Thistle: { r: 216, g: 191, b: 216 },
141
+ Tomato: { r: 255, g: 99, b: 71 },
142
+ Turquoise: { r: 64, g: 224, b: 208 },
143
+ Violet: { r: 238, g: 130, b: 238 },
144
+ Wheat: { r: 245, g: 222, b: 179 },
145
+ White: { r: 255, g: 255, b: 255 },
146
+ WhiteSmoke: { r: 245, g: 245, b: 245 },
147
+ Yellow: { r: 255, g: 255, b: 0 },
148
+ YellowGreen: { r: 154, g: 205, b: 50 }
149
+ };
150
+ function colorWithAlpha(color, alpha) {
151
+ const lowerCasedColor = color.toLowerCase();
152
+ if (colorNames[lowerCasedColor]) {
153
+ const rgb = colorNames[lowerCasedColor];
154
+ return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})`;
155
+ }
156
+ if (/^#([A-Fa-f0-9]{6})$/.test(color)) {
157
+ const hex = color.slice(1);
158
+ const bigint = parseInt(hex, 16);
159
+ const r = bigint >> 16 & 255;
160
+ const g = bigint >> 8 & 255;
161
+ const b = bigint & 255;
162
+ return `rgba(${r}, ${g}, ${b}, ${alpha})`;
163
+ }
164
+ if (/^rgb\((\d{1,3}), (\d{1,3}), (\d{1,3})\)$/.test(color)) {
165
+ const result = color.match(/^rgb\((\d{1,3}), (\d{1,3}), (\d{1,3})\)$/);
166
+ if (result) {
167
+ return `rgba(${result[1]}, ${result[2]}, ${result[3]}, ${alpha})`;
168
+ }
169
+ }
170
+ return color;
171
+ }
172
+
173
+ // src/utils/misc.ts
174
+ var isEnvBrowser = () => !window.invokeNative;
175
+ var noop = () => {
176
+ };
177
+ var splitFAString = (faString) => {
178
+ const [prefix, newIcon] = faString.split("-");
179
+ if (!prefix || !newIcon) return { prefix: "fas", newIcon: "question" };
180
+ return { prefix, newIcon };
181
+ };
182
+ var numberToRoman = (num) => {
183
+ const romanNumerals = ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII", "XIII", "XIV", "XV", "XVI", "XVII", "XVIII", "XIX", "XX"];
184
+ return romanNumerals[num];
185
+ };
186
+ var copyToClipboard = (text) => {
187
+ const el = document.createElement("textarea");
188
+ el.value = text;
189
+ document.body.appendChild(el);
190
+ el.select();
191
+ document.execCommand("copy");
192
+ document.body.removeChild(el);
193
+ };
194
+ var openLink = (url) => {
195
+ if (isEnvBrowser()) {
196
+ window.open(url, "_blank");
197
+ } else {
198
+ window.invokeNative("openLink", url);
199
+ }
200
+ };
201
+
202
+ // src/utils/fetchNui.ts
203
+ async function fetchNui(eventName, data, mockData) {
204
+ const options = {
205
+ method: "post",
206
+ headers: {
207
+ "Content-Type": "application/json; charset=UTF-8"
208
+ },
209
+ body: JSON.stringify(data)
210
+ };
211
+ if (isEnvBrowser() && mockData) return mockData;
212
+ if (isEnvBrowser() && mockData === void 0) {
213
+ console.warn(
214
+ `[fetchNui] Called fetchNui for event "${eventName}" in browser environment without mockData. Returning empty object.`
215
+ );
216
+ return {};
217
+ }
218
+ const resourceName = window.GetParentResourceName ? window.GetParentResourceName() : "nui-frame-app";
219
+ const resp = await fetch(`https://${resourceName}/${eventName}`, options);
220
+ return await resp.json();
221
+ }
222
+ var initialFetches = {};
223
+ async function registerInitialFetch(eventName, data, mockData) {
224
+ const fetcher = () => fetchNui(eventName, data, mockData);
225
+ initialFetches[eventName] = fetcher;
226
+ return fetcher();
227
+ }
228
+ async function runFetches() {
229
+ return Promise.all(
230
+ Object.entries(initialFetches).map(async ([eventName, fetcher]) => {
231
+ const data = await fetcher();
232
+ return { eventName, data };
233
+ })
234
+ );
235
+ }
236
+ var useAutoFetcher = () => {
237
+ useEffect(() => {
238
+ if (isEnvBrowser()) return;
239
+ const run = async () => {
240
+ await runFetches();
241
+ };
242
+ run();
243
+ }, []);
244
+ };
245
+
246
+ // src/utils/internalEvent.ts
247
+ var internalEvent = (events, timer = 1e3) => {
248
+ if (isEnvBrowser()) {
249
+ for (const event of events) {
250
+ setTimeout(() => {
251
+ window.dispatchEvent(
252
+ new MessageEvent("message", {
253
+ data: {
254
+ action: event.action,
255
+ data: event.data
256
+ }
257
+ })
258
+ );
259
+ }, timer);
260
+ }
261
+ }
262
+ };
263
+ var localeStore = create((set, get) => {
264
+ return {
265
+ locales: {
266
+ "OccupantsDesc": "Here you can view and manage the occupants of your traphouse. These occupants can be used mainly for selling drugs to the NPCs surrounding your traphouse. However they have other uses to so be careful who you add as an occupant."
267
+ },
268
+ locale: (key, ...args) => {
269
+ const exists = get().locales[key];
270
+ let translation = exists || key;
271
+ if (args.length) {
272
+ translation = translation.replace(/%s/g, () => String(args.shift() || ""));
273
+ }
274
+ return translation;
275
+ }
276
+ };
277
+ });
278
+ var locale = localeStore.getState().locale;
279
+ registerInitialFetch("GET_LOCALES", void 0).then((data) => {
280
+ localeStore.setState({ locales: data });
281
+ });
282
+
283
+ // src/utils/map.ts
284
+ var mapCenter = [-119.43, 58.84];
285
+ var latPr100 = 1.421;
286
+ function gameToMap(x, y) {
287
+ return [
288
+ mapCenter[0] + latPr100 / 100 * y,
289
+ // lng
290
+ mapCenter[1] + latPr100 / 100 * x
291
+ // lat
292
+ ];
293
+ }
294
+ function mapToGame(lat, lng) {
295
+ return [
296
+ (lng - mapCenter[1]) * 100 / latPr100,
297
+ (lat - mapCenter[0]) * 100 / latPr100
298
+ ];
299
+ }
300
+ var useProfanityStore = create(() => [
301
+ "ars3",
302
+ "a55",
303
+ "a55hole",
304
+ "ahole",
305
+ "anus",
306
+ "ash0le",
307
+ "ash0les",
308
+ "asholes",
309
+ "4r5e",
310
+ "5h1t",
311
+ "5hit",
312
+ "a55",
313
+ "anal",
314
+ "anus",
315
+ "ar5e",
316
+ "arrse",
317
+ "arse",
318
+ "ass",
319
+ "ass-fucker",
320
+ "asses",
321
+ "assfucker",
322
+ "assfukka",
323
+ "asshole",
324
+ "assholes",
325
+ "asswhole",
326
+ "a_s_s",
327
+ "b!tch",
328
+ "b00bs",
329
+ "b17ch",
330
+ "b1tch",
331
+ "ballsack",
332
+ "beastial",
333
+ "beastiality",
334
+ "bestial",
335
+ "bestiality",
336
+ "bi+ch",
337
+ "biatch",
338
+ "bitch",
339
+ "bitcher",
340
+ "bitchers",
341
+ "bitches",
342
+ "bitchin",
343
+ "bitching",
344
+ "blow job",
345
+ "blowjob",
346
+ "blowjobs",
347
+ "boiolas",
348
+ "bollock",
349
+ "bollok",
350
+ "boner",
351
+ "boob",
352
+ "boobs",
353
+ "booobs",
354
+ "boooobs",
355
+ "booooobs",
356
+ "booooooobs",
357
+ "breasts",
358
+ "buceta",
359
+ "bunny fucker",
360
+ "butthole",
361
+ "buttmuch",
362
+ "buttplug",
363
+ "c0ck",
364
+ "c0cksucker",
365
+ "carpet muncher",
366
+ "chink",
367
+ "cipa",
368
+ "cl1t",
369
+ "clit",
370
+ "clitoris",
371
+ "clits",
372
+ "cnut",
373
+ "cock",
374
+ "cock-sucker",
375
+ "cockface",
376
+ "cockhead",
377
+ "cockmunch",
378
+ "cockmuncher",
379
+ "cocks",
380
+ "cocksuck",
381
+ "cocksucked",
382
+ "cocksucker",
383
+ "cocksucking",
384
+ "cocksucks",
385
+ "cocksuka",
386
+ "cocksukka",
387
+ "cokmuncher",
388
+ "coksucka",
389
+ "coon",
390
+ "cum",
391
+ "cummer",
392
+ "cumming",
393
+ "cums",
394
+ "cumshot",
395
+ "cunilingus",
396
+ "cunillingus",
397
+ "cunnilingus",
398
+ "cunt",
399
+ "cuntlick",
400
+ "cuntlicker",
401
+ "cuntlicking",
402
+ "cunts",
403
+ "cyalis",
404
+ "cyberfuc",
405
+ "cyberfuck",
406
+ "cyberfucked",
407
+ "cyberfucker",
408
+ "cyberfuckers",
409
+ "cyberfucking",
410
+ "d1ck",
411
+ "dlck",
412
+ "dog-fucker",
413
+ "doggin",
414
+ "dogging",
415
+ "donkeyribber",
416
+ "dyke",
417
+ "ejaculate",
418
+ "ejaculated",
419
+ "ejaculates",
420
+ "ejaculating",
421
+ "ejaculatings",
422
+ "ejaculation",
423
+ "ejakulate",
424
+ "f u c k",
425
+ "f u c k e r",
426
+ "f4nny",
427
+ "fag",
428
+ "fagging",
429
+ "faggitt",
430
+ "faggot",
431
+ "faggs",
432
+ "fagot",
433
+ "fagots",
434
+ "fags",
435
+ "fannyflaps",
436
+ "fannyfucker",
437
+ "fatass",
438
+ "fcuk",
439
+ "fcuker",
440
+ "fcuking",
441
+ "feck",
442
+ "fecker",
443
+ "felching",
444
+ "fellate",
445
+ "fellatio",
446
+ "fingerfuck",
447
+ "fingerfucked",
448
+ "fingerfucker",
449
+ "fingerfuckers",
450
+ "fingerfucking",
451
+ "fingerfucks",
452
+ "fistfuck",
453
+ "fistfucked",
454
+ "fistfucker",
455
+ "fistfuckers",
456
+ "fistfucking",
457
+ "fistfuckings",
458
+ "fistfucks",
459
+ "fuck",
460
+ "fucka",
461
+ "fucked",
462
+ "fucker",
463
+ "fuckers",
464
+ "fuckhead",
465
+ "fuckheads",
466
+ "fuckin",
467
+ "fucking",
468
+ "fuckings",
469
+ "fuckingshitmotherfucker",
470
+ "fuckme",
471
+ "fucks",
472
+ "fuckwhit",
473
+ "fuckwit",
474
+ "fudge packer",
475
+ "fudgepacker",
476
+ "fuk",
477
+ "fuker",
478
+ "fukker",
479
+ "fukkin",
480
+ "fuks",
481
+ "fukwhit",
482
+ "fukwit",
483
+ "fux",
484
+ "fux0r",
485
+ "f_u_c_k",
486
+ "gangbang",
487
+ "gangbanged",
488
+ "gangbangs",
489
+ "gaysex",
490
+ "God",
491
+ "god-dam",
492
+ "god-damned",
493
+ "goddamn",
494
+ "goddamned",
495
+ "homo",
496
+ "jack-off",
497
+ "jerk-off",
498
+ "l3i+ch",
499
+ "l3itch",
500
+ "labia",
501
+ "lusting",
502
+ "m0f0",
503
+ "m0fo",
504
+ "m45terbate",
505
+ "ma5terb8",
506
+ "ma5terbate",
507
+ "masochist",
508
+ "master-bate",
509
+ "masterb8",
510
+ "masterbat*",
511
+ "masterbat3",
512
+ "masterbate",
513
+ "masterbation",
514
+ "masterbations",
515
+ "masturbate",
516
+ "mo-fo",
517
+ "mof0",
518
+ "mothafuck",
519
+ "mothafucka",
520
+ "mothafuckas",
521
+ "mothafuckaz",
522
+ "mothafucked",
523
+ "mothafucker",
524
+ "mothafuckers",
525
+ "mothafuckin",
526
+ "mothafucking",
527
+ "mothafuckings",
528
+ "mothafucks",
529
+ "mother fucker",
530
+ "motherfuck",
531
+ "motherfucked",
532
+ "motherfucker",
533
+ "motherfuckers",
534
+ "motherfuckin",
535
+ "motherfucking",
536
+ "motherfuckings",
537
+ "motherfuckka",
538
+ "motherfucks",
539
+ "muthafecker",
540
+ "muthafuckker",
541
+ "mutherfucker",
542
+ "n1gga",
543
+ "n1gger",
544
+ "nazi",
545
+ "nigg3r",
546
+ "nigg4h",
547
+ "nigga",
548
+ "niggah",
549
+ "niggas",
550
+ "niggaz",
551
+ "nigger",
552
+ "niggers",
553
+ "nob jokey",
554
+ "nobjocky",
555
+ "nobjokey",
556
+ "orgasim",
557
+ "orgasims",
558
+ "orgasm",
559
+ "orgasms",
560
+ "p0rn",
561
+ "penis",
562
+ "penisfucker",
563
+ "phonesex",
564
+ "phuck",
565
+ "phuked",
566
+ "phuking",
567
+ "phukked",
568
+ "phukking",
569
+ "phuks",
570
+ "phuq",
571
+ "pigfucker",
572
+ "pimpis",
573
+ "piss",
574
+ "pissed",
575
+ "pisser",
576
+ "pissers",
577
+ "pisses",
578
+ "pissflaps",
579
+ "pissin",
580
+ "pissing",
581
+ "pissoff",
582
+ "poop",
583
+ "porn",
584
+ "porno",
585
+ "pornography",
586
+ "pornos",
587
+ "prick",
588
+ "pricks",
589
+ "pron",
590
+ "pube",
591
+ "pusse",
592
+ "pussi",
593
+ "pussies",
594
+ "pussy",
595
+ "pussys",
596
+ "rectum",
597
+ "retard",
598
+ "rimjaw",
599
+ "rimming",
600
+ "s hit",
601
+ "s.o.b.",
602
+ "scroat",
603
+ "scrote",
604
+ "scrotum",
605
+ "semen",
606
+ "sex",
607
+ "sh!+",
608
+ "sh!t",
609
+ "sh1t",
610
+ "shemale",
611
+ "shit",
612
+ "shitdick",
613
+ "shite",
614
+ "shited",
615
+ "shitey",
616
+ "shitfuck",
617
+ "shitfull",
618
+ "shithead",
619
+ "shiting",
620
+ "shitings",
621
+ "shits",
622
+ "shitted",
623
+ "shitter",
624
+ "shitters",
625
+ "shitting",
626
+ "shittings",
627
+ "shitty",
628
+ "skank",
629
+ "slut",
630
+ "sluts",
631
+ "smegma",
632
+ "smut",
633
+ "son-of-a-bitch",
634
+ "spac",
635
+ "s_h_i_t",
636
+ "t1tt1e5",
637
+ "t1tties",
638
+ "teets",
639
+ "teez",
640
+ "testical",
641
+ "testicle",
642
+ "titfuck",
643
+ "tits",
644
+ "titt",
645
+ "tittie5",
646
+ "tittiefucker",
647
+ "titties",
648
+ "tittyfuck",
649
+ "tittywank",
650
+ "titwank",
651
+ "tosser",
652
+ "tw4t",
653
+ "twat",
654
+ "twathead",
655
+ "twatty",
656
+ "twunt",
657
+ "twunter",
658
+ "v14gra",
659
+ "v1gra",
660
+ "vagina",
661
+ "viagra",
662
+ "vulva",
663
+ "w00se",
664
+ "whoar",
665
+ "whore",
666
+ "xrated"
667
+ ]);
668
+ var isProfanity = (word) => {
669
+ const all = useProfanityStore.getState();
670
+ const profanityArray = Array.isArray(all) ? all : typeof all === "object" && all !== null ? Object.values(all) : [];
671
+ return profanityArray.includes(word);
672
+ };
673
+ function calculateXPForLevel(level, settings) {
674
+ if (level < settings.baseLevel) return 0;
675
+ if (level === 1) return 0;
676
+ if (level === 2) return settings.baseXP;
677
+ let totalXP = settings.baseXP;
678
+ for (let i = 2; i <= level - 1; i++) {
679
+ const baseRuneScapeXP = Math.floor((i + 300 * 2 ** (i / 7)) / 4);
680
+ totalXP += baseRuneScapeXP * settings.modifier;
681
+ }
682
+ return Math.floor(totalXP);
683
+ }
684
+ function generateLevelMap(settings) {
685
+ const levelMap = {};
686
+ for (let level = settings.baseLevel; level <= settings.maxLevel; level++) {
687
+ levelMap[level.toString()] = calculateXPForLevel(level, settings);
688
+ }
689
+ return levelMap;
690
+ }
691
+ function getLevelFromXP(xp, levelMap, settings) {
692
+ for (let level = settings.baseLevel; level <= settings.maxLevel; level++) {
693
+ const xpForLevel = levelMap[level.toString()];
694
+ if (xpForLevel > xp) return level - 1;
695
+ }
696
+ return settings.maxLevel;
697
+ }
698
+ function createSkill(defaultSettings) {
699
+ const useStore = create((set) => ({
700
+ settings: defaultSettings,
701
+ levelMap: generateLevelMap(defaultSettings),
702
+ setSettings: (updater) => set((state) => {
703
+ const newSettings = typeof updater === "function" ? updater(state.settings) : updater;
704
+ return {
705
+ settings: newSettings,
706
+ levelMap: generateLevelMap(newSettings)
707
+ };
708
+ })
709
+ }));
710
+ const useSkill = (xp) => {
711
+ const { settings, levelMap } = useStore();
712
+ return useMemo(() => {
713
+ const currentLevel = getLevelFromXP(xp, levelMap, settings);
714
+ const nextLevel = Math.min(currentLevel + 1, settings.maxLevel);
715
+ const currentLevelXP = levelMap[currentLevel.toString()] || 0;
716
+ const nextLevelXP = levelMap[nextLevel.toString()] || 0;
717
+ const xpInCurrentLevel = xp - currentLevelXP;
718
+ const xpRequiredForLevel = nextLevelXP - currentLevelXP;
719
+ const progressToLevel = xpRequiredForLevel > 0 ? xpInCurrentLevel / xpRequiredForLevel * 100 : 100;
720
+ const xpToNextLevel = Math.max(0, nextLevelXP - xp);
721
+ const prevLevelXP = calculateXPForLevel(currentLevel - 1, settings);
722
+ return {
723
+ currentLevel,
724
+ nextLevel,
725
+ currentLevelXP,
726
+ prevLevelXP,
727
+ nextLevelXP,
728
+ progressToLevel: Math.min(100, Math.max(0, progressToLevel)),
729
+ xpToNextLevel
730
+ };
731
+ }, [xp, levelMap, settings]);
732
+ };
733
+ const skill = {
734
+ get settings() {
735
+ return useStore.getState().settings;
736
+ },
737
+ setSettings: (updater) => {
738
+ useStore.getState().setSettings(updater);
739
+ },
740
+ useSettings: () => useStore((state) => state.settings)
741
+ };
742
+ return {
743
+ skill,
744
+ useSkill
745
+ };
746
+ }
747
+ var dummyURL = "https://fmapi.net/api/v2/presigned-url/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJON0UxM0tzejFRM0NuSzRHWFBPbmUiLCJ0ZWFtSWQiOiJlMDQ1YnpwZzg5TGpoaUFTaURIdVoiLCJmaWxlVHlwZSI6ImltYWdlIiwidG9rZW5JZCI6ImpwczJ4Z0M1eFZqcnRoeWZTZnFsYSIsInNldHRpbmdzIjp7IlRlYW1JRCI6ImUwNDVienBnODlMamhpQVNpREh1WiIsIkltYWdlTm90aWZpY2F0aW9uVHlwZSI6IiIsIkRpc2NvcmRXZWJob29rIjoiIiwiRGlzY29yZEltYWdlQ2hhbm5lbCI6IiIsIlZpZGVvTm90aWZpY2F0aW9uVHlwZSI6IiIsIkRpc2NvcmRWaWRlb1dlYmhvb2siOiIiLCJEaXNjb3JkVmlkZW9DaGFubmVsIjoiIiwiQXVkaW9Ob3RpZmljYXRpb25UeXBlIjoiIiwiRGlzY29yZEF1ZGlvV2ViaG9vayI6IiIsIkRpc2NvcmRBdWRpb0NoYW5uZWwiOiIiLCJEaXNjb3JkQm90VG9rZW4iOiIiLCJSZXRlbnRpb25FbmFibGVkIjpmYWxzZSwiUmV0ZW50aW9uRGF5cyI6NywiVmlkZW9SZXRlbnRpb25FbmFibGVkIjpmYWxzZSwiVmlkZW9SZXRlbnRpb25EYXlzIjo3LCJBdWRpb1JldGVudGlvbkVuYWJsZWQiOmZhbHNlLCJBdWRpb1JldGVudGlvbkRheXMiOjcsIkxvZ0FsZXJ0RW5hYmxlZCI6ZmFsc2UsIkxvZ0FsZXJ0TGV2ZWxzIjpbXSwiTG9nQWxlcnREaXNjb3JkV2ViaG9vayI6IiIsIk92ZXJyaWRlSW1hZ2VRdWFsaXR5IjpmYWxzZSwiSW1hZ2VRdWFsaXR5Ijo1MH0sImV4cCI6MTc2MTg1MTEzNH0.fpPeQ0GCm5GNTddjttUQ78VMqRUAufXoOvv5C7Vh3WA";
748
+ async function updatePresignedURL() {
749
+ return await fetchNui("GET_PRESIGNED_URL", void 0, dummyURL);
750
+ }
751
+ async function uploadImage(props) {
752
+ const uploadURL = await updatePresignedURL();
753
+ const response = await fetch(props.fileURL);
754
+ const blob = await response.blob();
755
+ const file = new File([blob], "upload.png", { type: blob.type });
756
+ const formData = new FormData();
757
+ formData.append("file", file);
758
+ formData.append(
759
+ "metadata",
760
+ JSON.stringify({
761
+ name: props.name || file.name,
762
+ description: props.description || "Uploaded via DirkScripts"
763
+ })
764
+ );
765
+ const uploadRes = await axios.post(uploadURL, formData, {
766
+ headers: { "Content-Type": "multipart/form-data" }
767
+ });
768
+ const finalUrl = uploadRes.data?.data?.url ?? uploadRes.data?.url;
769
+ if (!finalUrl) throw new Error("Upload succeeded but no URL returned");
770
+ return finalUrl;
771
+ }
772
+ async function getImageShape(file) {
773
+ return new Promise((resolve, reject) => {
774
+ const img = new Image();
775
+ img.onload = () => {
776
+ if (img.width > img.height) resolve("wide");
777
+ else resolve("square");
778
+ };
779
+ img.onerror = () => reject(new Error("Failed to load image"));
780
+ img.src = typeof file === "string" ? file : URL.createObjectURL(file);
781
+ });
782
+ }
783
+ var useSettings = create(() => ({
784
+ hydrated: false,
785
+ game: "fivem",
786
+ primaryColor: "dirk",
787
+ primaryShade: 9,
788
+ itemImgPath: "",
789
+ customTheme: [
790
+ "#f0f4ff",
791
+ "#d9e3ff",
792
+ "#bfcfff",
793
+ "#a6bbff",
794
+ "#8ca7ff",
795
+ "#7393ff",
796
+ "#5a7fff",
797
+ "#406bff",
798
+ "#2547ff",
799
+ "#0b33ff"
800
+ ]
801
+ }));
802
+ registerInitialFetch("GET_SETTINGS").then((data) => {
803
+ useSettings.setState({
804
+ ...data,
805
+ hydrated: true
806
+ });
807
+ }).catch(() => {
808
+ useSettings.setState({ hydrated: true });
809
+ });
810
+
811
+ export { colorWithAlpha, copyToClipboard, createSkill, fetchNui, gameToMap, getImageShape, initialFetches, internalEvent, isEnvBrowser, isProfanity, latPr100, locale, localeStore, mapCenter, mapToGame, noop, numberToRoman, openLink, registerInitialFetch, runFetches, splitFAString, updatePresignedURL, uploadImage, useAutoFetcher, useProfanityStore, useSettings };
812
+ //# sourceMappingURL=index.js.map
813
+ //# sourceMappingURL=index.js.map