@armoury/fivem-framework-server 0.0.0-stage → 1.0.7

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 (129) hide show
  1. package/dist/cjs/decorators/command.decorator.js +37 -0
  2. package/dist/cjs/decorators/controller.decorator.js +9 -0
  3. package/dist/cjs/decorators/decorator.utils.js +43 -0
  4. package/dist/cjs/decorators/event-listener.decorator.js +64 -0
  5. package/dist/cjs/decorators/export.decorator.js +18 -0
  6. package/dist/cjs/decorators/index.js +16 -0
  7. package/dist/cjs/decorators/key-binding.decorator.js +29 -0
  8. package/dist/cjs/decorators/ui-listener.decorator.js +24 -0
  9. package/dist/cjs/server/entity-controllers/server-entity-entrance.controller.js +28 -0
  10. package/dist/cjs/server/index.js +82 -0
  11. package/dist/cjs/server/models/create-vehicle.enums.js +8 -0
  12. package/dist/cjs/server/models/index.js +17 -0
  13. package/dist/cjs/server/models/session/base-items/array.session-item.js +60 -0
  14. package/dist/cjs/server/models/session/base-items/index.js +17 -0
  15. package/dist/cjs/server/models/session/index.js +19 -0
  16. package/dist/cjs/server/models/session/session-item.model.js +19 -0
  17. package/dist/cjs/server/models/session/session.model.js +2 -0
  18. package/dist/cjs/server/server-db-dependent.controller.js +227 -0
  19. package/dist/cjs/server/server.base.js +32 -0
  20. package/dist/cjs/server/server.controller.js +83 -0
  21. package/dist/cjs/server/server.entities.js +57 -0
  22. package/dist/cjs/server/services/index.js +21 -0
  23. package/dist/cjs/server/services/server-enterable-database.service.js +37 -0
  24. package/dist/cjs/server/services/server-resource-database.service.js +242 -0
  25. package/dist/cjs/server/services/server-translate.service.js +54 -0
  26. package/dist/cjs/server/services/server-virtual-worlds.service.js +62 -0
  27. package/dist/cjs/server/services/session/default-entities/character.entity.js +31 -0
  28. package/dist/cjs/server/services/session/default-entities/index.js +24 -0
  29. package/dist/cjs/server/services/session/default-entities/session-account-id.js +10 -0
  30. package/dist/cjs/server/services/session/default-entities/session-cash.js +10 -0
  31. package/dist/cjs/server/services/session/default-entities/session-hours-played.js +16 -0
  32. package/dist/cjs/server/services/session/default-entities/session-id.js +10 -0
  33. package/dist/cjs/server/services/session/default-entities/session-language.js +10 -0
  34. package/dist/cjs/server/services/session/default-entities/session-last-location.js +19 -0
  35. package/dist/cjs/server/services/session/default-entities/session-name.js +10 -0
  36. package/dist/cjs/server/services/session/index.js +17 -0
  37. package/dist/cjs/server/services/session/server-session.service.js +271 -0
  38. package/dist/cjs/shared/index.js +17 -0
  39. package/dist/cjs/shared/models/account.js +2 -0
  40. package/dist/cjs/shared/models/character.js +2 -0
  41. package/dist/cjs/shared/models/index.js +18 -0
  42. package/dist/cjs/utils/utils.js +109 -0
  43. package/dist/esm/decorators/command.decorator.js +33 -0
  44. package/dist/esm/decorators/controller.decorator.js +6 -0
  45. package/dist/esm/decorators/decorator.utils.js +38 -0
  46. package/dist/esm/decorators/event-listener.decorator.js +59 -0
  47. package/dist/esm/decorators/export.decorator.js +14 -0
  48. package/dist/esm/decorators/index.js +6 -0
  49. package/dist/esm/decorators/key-binding.decorator.js +25 -0
  50. package/dist/esm/decorators/ui-listener.decorator.js +20 -0
  51. package/dist/esm/server/entity-controllers/server-entity-entrance.controller.js +24 -0
  52. package/dist/esm/server/index.js +64 -0
  53. package/dist/esm/server/models/create-vehicle.enums.js +5 -0
  54. package/dist/esm/server/models/index.js +1 -0
  55. package/dist/esm/server/models/session/base-items/array.session-item.js +56 -0
  56. package/dist/esm/server/models/session/base-items/index.js +1 -0
  57. package/dist/esm/server/models/session/index.js +3 -0
  58. package/dist/esm/server/models/session/session-item.model.js +15 -0
  59. package/dist/esm/server/models/session/session.model.js +1 -0
  60. package/dist/esm/server/server-db-dependent.controller.js +224 -0
  61. package/dist/esm/server/server.base.js +28 -0
  62. package/dist/esm/server/server.controller.js +80 -0
  63. package/dist/esm/server/server.entities.js +54 -0
  64. package/dist/esm/server/services/index.js +5 -0
  65. package/dist/esm/server/services/server-enterable-database.service.js +34 -0
  66. package/dist/esm/server/services/server-resource-database.service.js +239 -0
  67. package/dist/esm/server/services/server-translate.service.js +51 -0
  68. package/dist/esm/server/services/server-virtual-worlds.service.js +59 -0
  69. package/dist/esm/server/services/session/default-entities/character.entity.js +28 -0
  70. package/dist/esm/server/services/session/default-entities/index.js +8 -0
  71. package/dist/esm/server/services/session/default-entities/session-account-id.js +6 -0
  72. package/dist/esm/server/services/session/default-entities/session-cash.js +6 -0
  73. package/dist/esm/server/services/session/default-entities/session-hours-played.js +12 -0
  74. package/dist/esm/server/services/session/default-entities/session-id.js +6 -0
  75. package/dist/esm/server/services/session/default-entities/session-language.js +6 -0
  76. package/dist/esm/server/services/session/default-entities/session-last-location.js +15 -0
  77. package/dist/esm/server/services/session/default-entities/session-name.js +6 -0
  78. package/dist/esm/server/services/session/index.js +1 -0
  79. package/dist/esm/server/services/session/server-session.service.js +268 -0
  80. package/dist/esm/shared/index.js +1 -0
  81. package/dist/esm/shared/models/account.js +1 -0
  82. package/dist/esm/shared/models/character.js +1 -0
  83. package/dist/esm/shared/models/index.js +2 -0
  84. package/dist/esm/utils/utils.js +93 -0
  85. package/dist/types/ambient.declarations.d.ts +62840 -0
  86. package/dist/types/decorators/command.decorator.d.ts +5 -0
  87. package/dist/types/decorators/controller.decorator.d.ts +1 -0
  88. package/dist/types/decorators/decorator.utils.d.ts +15 -0
  89. package/dist/types/decorators/event-listener.decorator.d.ts +15 -0
  90. package/dist/types/decorators/export.decorator.d.ts +2 -0
  91. package/dist/types/decorators/index.d.ts +6 -0
  92. package/dist/types/decorators/key-binding.decorator.d.ts +8 -0
  93. package/dist/types/decorators/ui-listener.decorator.d.ts +4 -0
  94. package/dist/types/server/entity-controllers/server-entity-entrance.controller.d.ts +14 -0
  95. package/dist/types/server/index.d.ts +23 -0
  96. package/dist/types/server/models/create-vehicle.enums.d.ts +3 -0
  97. package/dist/types/server/models/index.d.ts +1 -0
  98. package/dist/types/server/models/session/base-items/array.session-item.d.ts +13 -0
  99. package/dist/types/server/models/session/base-items/index.d.ts +1 -0
  100. package/dist/types/server/models/session/index.d.ts +3 -0
  101. package/dist/types/server/models/session/session-item.model.d.ts +22 -0
  102. package/dist/types/server/models/session/session.model.d.ts +4 -0
  103. package/dist/types/server/server-db-dependent.controller.d.ts +29 -0
  104. package/dist/types/server/server.base.d.ts +7 -0
  105. package/dist/types/server/server.controller.d.ts +20 -0
  106. package/dist/types/server/server.entities.d.ts +13 -0
  107. package/dist/types/server/services/index.d.ts +5 -0
  108. package/dist/types/server/services/server-enterable-database.service.d.ts +14 -0
  109. package/dist/types/server/services/server-resource-database.service.d.ts +37 -0
  110. package/dist/types/server/services/server-translate.service.d.ts +12 -0
  111. package/dist/types/server/services/server-virtual-worlds.service.d.ts +15 -0
  112. package/dist/types/server/services/session/default-entities/character.entity.d.ts +5 -0
  113. package/dist/types/server/services/session/default-entities/index.d.ts +8 -0
  114. package/dist/types/server/services/session/default-entities/session-account-id.d.ts +4 -0
  115. package/dist/types/server/services/session/default-entities/session-cash.d.ts +4 -0
  116. package/dist/types/server/services/session/default-entities/session-hours-played.d.ts +5 -0
  117. package/dist/types/server/services/session/default-entities/session-id.d.ts +4 -0
  118. package/dist/types/server/services/session/default-entities/session-language.d.ts +4 -0
  119. package/dist/types/server/services/session/default-entities/session-last-location.d.ts +6 -0
  120. package/dist/types/server/services/session/default-entities/session-name.d.ts +4 -0
  121. package/dist/types/server/services/session/index.d.ts +1 -0
  122. package/dist/types/server/services/session/server-session.service.d.ts +70 -0
  123. package/dist/types/shared/index.d.ts +1 -0
  124. package/dist/types/shared/models/account.d.ts +5 -0
  125. package/dist/types/shared/models/character.d.ts +4 -0
  126. package/dist/types/shared/models/index.d.ts +2 -0
  127. package/dist/types/utils/utils.d.ts +15 -0
  128. package/package.json +32 -5
  129. package/README.md +0 -3
@@ -0,0 +1,268 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ var ServerSessionService_1;
14
+ import { Inject, Injectable, Optional } from "injection-js";
15
+ import { isJSON } from "../../../utils/utils";
16
+ import { EVENT_DIRECTIONS, EventListener, Export } from "../../../decorators";
17
+ let ServerSessionService = ServerSessionService_1 = class ServerSessionService {
18
+ get players() {
19
+ return Array.from(this._sessions.keys());
20
+ }
21
+ get authenticatedPlayers() {
22
+ return Array.from(this._sessions.entries())
23
+ .filter(([, session]) => session.id)
24
+ .map(([playerId,]) => playerId);
25
+ }
26
+ constructor(_sessionItems) {
27
+ var _a;
28
+ this._sessionItems = _sessionItems;
29
+ this._sessions = new Map();
30
+ this._untrackedSessionItems = [];
31
+ this._sessionItems = (_a = _sessionItems === null || _sessionItems === void 0 ? void 0 : _sessionItems.filter((item) => !!item)) !== null && _a !== void 0 ? _a : [];
32
+ if (!Cfx.exports['oxmysql']) {
33
+ console.error(`[Armoury (${Cfx.Server.GetCurrentResourceName()}):] Could not find the 'oxmysql' resource. Armoury's session service can't work without it. Did you forget to load it?`);
34
+ return;
35
+ }
36
+ }
37
+ /**
38
+ * Registers an account.
39
+ * @param playerId The playerId (NOT from the database) of this player
40
+ * @param accountName The account name of this player
41
+ * @param hashedPassword The hashed password of this account
42
+ * @param email The email of this account
43
+ * @returns The SQL ID of the newly-created account
44
+ */
45
+ async register(playerId, accountName, hashedPassword, email) {
46
+ const accountId = await Cfx.exports['oxmysql'].insert_async('INSERT INTO `accounts`(`name`, `password`, `email`) VALUES (?, ?, ?)', [accountName, hashedPassword, email]);
47
+ this._sessions.set(playerId, { accountId });
48
+ return accountId;
49
+ }
50
+ /**
51
+ * Logs into an account
52
+ * @param playerId The playerId (NOT from the database) of this player
53
+ * @param email The email of the account
54
+ * @param hashedPassword The hashed password fo this account
55
+ * @returns Account data for this account
56
+ */
57
+ async login(playerId, email, hashedPassword) {
58
+ const result = await Cfx.exports['oxmysql'].single_async('SELECT * FROM `accounts` WHERE email=? AND password=?', [email, hashedPassword]);
59
+ this._sessions.set(playerId, { accountId: result.id });
60
+ return result;
61
+ }
62
+ /**
63
+ * Fetches all the characters related to the provided account
64
+ * @param playerId The playerId (NOT from the database) of this player
65
+ * @param accountId The accountId of the
66
+ * @returns Data for all characters on the given account
67
+ */
68
+ async fetch(playerId, accountId) {
69
+ var _a;
70
+ accountId = accountId !== null && accountId !== void 0 ? accountId : (_a = this._sessions.get(playerId)) === null || _a === void 0 ? void 0 : _a.accountId;
71
+ return await global.exports['oxmysql'].query_async(`SELECT * FROM players WHERE accountId = ?`, [accountId]);
72
+ }
73
+ /**
74
+ * Loads the entire character given a character ID
75
+ * @param playerId The playerId (NOT from the database) of this player
76
+ * @param characterId The character's SQL ID
77
+ * @returns Data for the given characterId
78
+ */
79
+ async load(playerId, characterId) {
80
+ var _a;
81
+ if (!this._sessions.has(playerId)) {
82
+ throw new Error('No session has been found for that user.');
83
+ }
84
+ const session = await global.exports['oxmysql'].single_async('SELECT * FROM `players` WHERE id=? AND accountId=?', [characterId, (_a = this._sessions.get(playerId)) === null || _a === void 0 ? void 0 : _a.accountId]);
85
+ Array.from(Object.entries(session))
86
+ .map(([key,]) => { var _a; return (_a = this._sessionItems) === null || _a === void 0 ? void 0 : _a.find((sessionItem) => sessionItem.name === key); })
87
+ .filter((sessionItem) => !!sessionItem)
88
+ .forEach(async (sessionItem) => {
89
+ var _a, _b, _c, _d;
90
+ console.log('for sessionItem', sessionItem.name, 'the value is', (_b = await (sessionItem === null || sessionItem === void 0 ? void 0 : sessionItem.load((_a = this._sessions.get(playerId)) === null || _a === void 0 ? void 0 : _a.accountId, characterId, session[sessionItem === null || sessionItem === void 0 ? void 0 : sessionItem.name]))) !== null && _b !== void 0 ? _b : session[sessionItem === null || sessionItem === void 0 ? void 0 : sessionItem.name].value);
91
+ this.setPlayerInfo(playerId, sessionItem.name, (_d = await (sessionItem === null || sessionItem === void 0 ? void 0 : sessionItem.load((_c = this._sessions.get(playerId)) === null || _c === void 0 ? void 0 : _c.accountId, characterId, session[sessionItem === null || sessionItem === void 0 ? void 0 : sessionItem.name]))) !== null && _d !== void 0 ? _d : session[sessionItem === null || sessionItem === void 0 ? void 0 : sessionItem.name].value);
92
+ });
93
+ this._sessions.set(playerId, Object.assign(Object.assign({}, this._sessions.get(playerId)), { id: characterId }));
94
+ return session;
95
+ }
96
+ /**
97
+ * Creates a character
98
+ * @param playerId
99
+ * @param accountName
100
+ * @param hashedPassword
101
+ * @param email
102
+ * @returns
103
+ */
104
+ async create(playerId, accountId) {
105
+ var _a;
106
+ accountId = accountId !== null && accountId !== void 0 ? accountId : (_a = this._sessions.get(playerId)) === null || _a === void 0 ? void 0 : _a.accountId;
107
+ const characterId = await Cfx.exports['oxmysql'].insert_async('INSERT INTO `players`(`accountId`) VALUES (?)', [accountId]);
108
+ this._sessions.set(playerId, { accountId });
109
+ return characterId;
110
+ }
111
+ setPlayerInfo(playerId, stat, value, ...args) {
112
+ const updater = new SessionUpdater(playerId).from(stat, value, ...args);
113
+ updater.execute(this.getPlayerInfo(playerId, 'accountId'), this.getPlayerInfo(playerId, 'id'), this._sessionItems);
114
+ const untrackedItems = updater.items
115
+ .filter((item) => {
116
+ var _a;
117
+ return !this._untrackedSessionItems.includes(item.stat)
118
+ && !((_a = this._sessionItems) === null || _a === void 0 ? void 0 : _a.some((sessionItem) => sessionItem.name === item.stat));
119
+ });
120
+ if (untrackedItems.length) {
121
+ this._untrackedSessionItems.push(...untrackedItems.map((item) => item.stat));
122
+ }
123
+ }
124
+ setPlayerCash(playerId, value, options) {
125
+ return this.setPlayerInfo(playerId, 'cash', value, options);
126
+ }
127
+ givePlayerCash(playerId, value, options) {
128
+ return this.setPlayerCash(playerId, this.getPlayerCash(playerId) + value, options);
129
+ }
130
+ getPlayerCash(playerId) {
131
+ return this.getPlayerInfo(playerId, 'cash');
132
+ }
133
+ saveCritical(playerId) {
134
+ var _a, _b;
135
+ const criticalStats = (_b = (_a = this._sessionItems) === null || _a === void 0 ? void 0 : _a.filter((sessionItem) => sessionItem.critical)) === null || _b === void 0 ? void 0 : _b.map((sessionItem) => sessionItem.name);
136
+ console.log(`${Cfx.Server.GetCurrentResourceName()}: Critical keys are`, criticalStats, 'playerId is', playerId);
137
+ this.setPlayerInfo(playerId, criticalStats[0], this.getPlayerInfo(playerId, criticalStats[0]), ...criticalStats.slice(1).reduce((prev, curr) => [
138
+ ...prev,
139
+ curr,
140
+ this.getPlayerInfo(playerId, curr)
141
+ ], []), {
142
+ executeSqlCommand: true
143
+ });
144
+ }
145
+ getPlayerInfo(playerId, stat) {
146
+ let value = Cfx.Server.GetConvar(`${playerId}_PI_${stat}`, '-1');
147
+ if (isJSON(value.toString())) {
148
+ value = JSON.parse(value, function (_k, v) {
149
+ return typeof v === 'object' || isNaN(v) ? v : Number(v);
150
+ });
151
+ }
152
+ return value;
153
+ }
154
+ clearPlayerInfo(playerId) {
155
+ var _a;
156
+ [...(_a = this._sessionItems) === null || _a === void 0 ? void 0 : _a.map((sessionItem) => sessionItem.name), ...this._untrackedSessionItems]
157
+ .forEach((prop) => {
158
+ Cfx.Server.SetConvarReplicated(`${playerId}_PI_${prop}`, '-1');
159
+ Cfx.Server.SetConvarReplicated(`${playerId}_PI_${prop}_lastUpdate`, '-1');
160
+ });
161
+ }
162
+ onResourceStart(resource) {
163
+ var _a, _b;
164
+ if (resource !== Cfx.Server.GetCurrentResourceName()) {
165
+ if (Cfx.exports[resource].exchangeSessionItems) {
166
+ console.log(`[Armoury:] Resource (${resource}) has started. Attempting to exchange session items with it..`);
167
+ this.exchangeSessionItems((_b = Cfx.exports[resource].exchangeSessionItems((_a = this._sessionItems) !== null && _a !== void 0 ? _a : [])) !== null && _b !== void 0 ? _b : []);
168
+ }
169
+ }
170
+ }
171
+ exchangeSessionItems(items) {
172
+ var _a, _b;
173
+ items.forEach((item) => {
174
+ var _a, _b;
175
+ if (!((_a = this._sessionItems) === null || _a === void 0 ? void 0 : _a.some((sessionItem) => sessionItem.name === item.name))) {
176
+ (_b = this._sessionItems) === null || _b === void 0 ? void 0 : _b.push(item);
177
+ }
178
+ });
179
+ console.log(`[${Cfx.Server.GetCurrentResourceName()}:] My updated session items are now`, (_a = this._sessionItems) !== null && _a !== void 0 ? _a : []);
180
+ return (_b = this._sessionItems) !== null && _b !== void 0 ? _b : [];
181
+ }
182
+ static withDefaults() {
183
+ return ({
184
+ provide: ServerSessionService_1,
185
+ useFactory: (sessionItems) => new ServerSessionService_1(sessionItems || []),
186
+ deps: ['sessionItems'],
187
+ });
188
+ }
189
+ static withItems(...items) {
190
+ return [
191
+ ...items.map((sessionItem) => ({
192
+ provide: 'sessionItems',
193
+ useValue: new sessionItem(),
194
+ multi: true,
195
+ })),
196
+ ServerSessionService_1.withDefaults()
197
+ ];
198
+ }
199
+ };
200
+ __decorate([
201
+ EventListener({ eventName: 'onResourceStart', direction: EVENT_DIRECTIONS.CLIENT_TO_CLIENT }),
202
+ __metadata("design:type", Function),
203
+ __metadata("design:paramtypes", [String]),
204
+ __metadata("design:returntype", void 0)
205
+ ], ServerSessionService.prototype, "onResourceStart", null);
206
+ __decorate([
207
+ Export(),
208
+ __metadata("design:type", Function),
209
+ __metadata("design:paramtypes", [Array]),
210
+ __metadata("design:returntype", Array)
211
+ ], ServerSessionService.prototype, "exchangeSessionItems", null);
212
+ ServerSessionService = ServerSessionService_1 = __decorate([
213
+ Injectable(),
214
+ __param(0, Optional()),
215
+ __param(0, Inject('sessionItems')),
216
+ __metadata("design:paramtypes", [Array])
217
+ ], ServerSessionService);
218
+ export { ServerSessionService };
219
+ class SessionUpdater {
220
+ constructor(playerId) {
221
+ this.playerId = playerId;
222
+ this.items = [];
223
+ this.options = null;
224
+ }
225
+ from(...statsAndValues) {
226
+ if (statsAndValues.length % 2 !== 0 && typeof statsAndValues.slice(-1)[0] === 'object') {
227
+ this.options = statsAndValues.slice(-1)[0];
228
+ }
229
+ for (let i = 0; i < statsAndValues.length; i += 2) {
230
+ if (typeof statsAndValues[i] === 'string' && !!statsAndValues[i + 1]) {
231
+ this.add(statsAndValues[i], statsAndValues[i + 1]);
232
+ }
233
+ }
234
+ return this;
235
+ }
236
+ add(stat, value) {
237
+ this.items.push({ stat, value });
238
+ return this;
239
+ }
240
+ execute(accountId, characterId, sessionItems) {
241
+ var _a;
242
+ this.items.forEach((item) => {
243
+ let value = item.value;
244
+ const correspondingSessionItem = sessionItems.find((sessionItem) => sessionItem.name === item.stat);
245
+ if (correspondingSessionItem) {
246
+ value = correspondingSessionItem.compute(this.playerId, item.value);
247
+ }
248
+ Cfx.Server.SetConvarReplicated(`${this.playerId}_PI_${item.stat}`, Array.isArray(value) || typeof value === 'object'
249
+ ? JSON.stringify(value)
250
+ : value.toString());
251
+ Cfx.Server.SetConvarReplicated(`${this.playerId}_PI_${item.stat}_lastUpdate`, new Date().getTime().toString());
252
+ });
253
+ if ((_a = this.options) === null || _a === void 0 ? void 0 : _a.executeSqlCommand) {
254
+ const syncableItems = this.items.filter((item) => {
255
+ var _a, _b;
256
+ return sessionItems.some((sessionItem) => sessionItem.name === item.stat) && !((_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.ignoreSqlCommandFor) === null || _b === void 0 ? void 0 : _b.includes(item.stat));
257
+ });
258
+ if (syncableItems.length) {
259
+ const predicate = (item) => { var _a; return (_a = sessionItems.find((sessionItem) => sessionItem.name === item.stat)) === null || _a === void 0 ? void 0 : _a.save; };
260
+ const simpleSyncableItems = syncableItems.filter((item) => !predicate(item)).filter((item) => !!item && item.value != null);
261
+ console.log('simpleSyncableItems are', simpleSyncableItems);
262
+ Cfx.exports['oxmysql'].update_async(`UPDATE \`players\` SET ${simpleSyncableItems.map((item) => `${item.stat} = ?`).join(', ')} WHERE id = ?`, [...simpleSyncableItems.map((item) => JSON.stringify(item.value)), characterId]);
263
+ const nonSimpleSyncableItems = syncableItems.filter((item) => predicate(item));
264
+ nonSimpleSyncableItems.forEach((item) => sessionItems.find((sessionItem) => sessionItem.name === item.stat).save(accountId, characterId, item.value));
265
+ }
266
+ }
267
+ }
268
+ }
@@ -0,0 +1 @@
1
+ export * from './models';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export * from './account';
2
+ export * from './character';
@@ -0,0 +1,93 @@
1
+ const Delay = (ms) => new Promise(res => setTimeout(res, ms));
2
+ const isPlayerInArea = (playerPosX, playerPosY, playerPosZ, areaMinX, areaMinY, areaMinZ, areaMaxX, areaMaxY, areaMaxZ) => {
3
+ return playerPosX >= areaMinX && playerPosX <= areaMaxX && playerPosY >= areaMinY && playerPosY <= areaMaxY && playerPosZ >= areaMinZ && playerPosZ <= areaMaxZ;
4
+ };
5
+ const isPlayerInRangeOfPoint = (playerPosX, playerPosY, playerPosZ, pointX, pointY, pointZ, range) => {
6
+ return calculateDistance([playerPosX, playerPosY, playerPosZ, pointX, pointY, pointZ]) <= range;
7
+ };
8
+ const waitUntilThenDo = async (condition, func) => {
9
+ let attempts = 0;
10
+ while (!condition()) {
11
+ if (attempts > 50) {
12
+ return;
13
+ }
14
+ await Delay(10);
15
+ }
16
+ func();
17
+ };
18
+ export const calculateDistance = (pos) => {
19
+ var a = pos[3] - pos[0];
20
+ var b = pos[4] - pos[1];
21
+ var c = pos[5] - pos[2];
22
+ return Math.hypot(a, b, c);
23
+ };
24
+ export const calculateDistanceInKm = (pos) => {
25
+ var a = pos[3] - pos[0];
26
+ var b = pos[4] - pos[1];
27
+ var c = pos[5] - pos[2];
28
+ return Math.hypot(a, b, c) * 0.004;
29
+ };
30
+ export const getRandomPositionInsideArea = (x1, x2, y1, y2) => {
31
+ const sortedXs = [x1, x2].sort((current, previous) => current <= previous ? -1 : 1);
32
+ const sortedYs = [y1, y2].sort((current, previous) => current <= previous ? -1 : 1);
33
+ const [lowestX, highestX] = [sortedXs[0], sortedXs.slice(-1)[0]];
34
+ const [lowestY, highestY] = [sortedYs[0], sortedYs.slice(-1)[0]];
35
+ return [lowestX + (Math.random() * (highestX - lowestX)), lowestY + (Math.random() * (highestY - lowestY))];
36
+ };
37
+ export const isPositionIn2DArea = (x, y, x1, x2, y1, y2) => {
38
+ const sortedXs = [x1, x2].sort((current, previous) => current <= previous ? -1 : 1);
39
+ const sortedYs = [y1, y2].sort((current, previous) => current <= previous ? -1 : 1);
40
+ const [lowestX, highestX] = [sortedXs[0], sortedXs.slice(-1)[0]];
41
+ const [lowestY, highestY] = [sortedYs[0], sortedYs.slice(-1)[0]];
42
+ return x >= lowestX && x <= highestX && y >= lowestY && y <= highestY;
43
+ };
44
+ const numberWithCommas = (x) => {
45
+ return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
46
+ };
47
+ const isJSON = (str) => {
48
+ if (/^\s*$/.test(str))
49
+ return false;
50
+ str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
51
+ str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
52
+ str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
53
+ return (/^[\],:{}\s]*$/).test(str);
54
+ };
55
+ export const phoneFormatted = (phone) => {
56
+ const filteredValue = phone.toString().replace('-', '');
57
+ if (filteredValue.length > 3) {
58
+ return `${filteredValue.substring(0, 3)}-${filteredValue.substring(3)}`;
59
+ }
60
+ return phone.toString();
61
+ };
62
+ const suffixes = ['k', 'M', 'G', 'T', 'P', 'E'];
63
+ export const toThousandsString = (input, args) => {
64
+ let isNegative = input < 0;
65
+ input = Math.abs(input);
66
+ if (Number.isNaN(input)) {
67
+ return null;
68
+ }
69
+ if (input < 1000) {
70
+ return input;
71
+ }
72
+ const exp = Math.floor(Math.log(input) / Math.log(1000));
73
+ return ((isNegative ? '-' : '') + (input / Math.pow(1000, exp)).toFixed(args) + suffixes[exp - 1]);
74
+ };
75
+ export const fromThousandsString = (input) => {
76
+ var _a;
77
+ const existingSuffix = (input.match(/[a-zA-Z]/) || []).pop() || '';
78
+ if (!existingSuffix) {
79
+ return Number(input);
80
+ }
81
+ const existingNumber = Number((_a = input.match(/\d+/)) === null || _a === void 0 ? void 0 : _a[0]);
82
+ return (existingNumber *
83
+ Math.pow(1000, 1 +
84
+ suffixes
85
+ .map((suffix) => suffix.toLowerCase())
86
+ .indexOf(existingSuffix.toLowerCase())));
87
+ };
88
+ export const toTitleCase = (str) => {
89
+ return str.replace(/\w\S*/g, function (txt) {
90
+ return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
91
+ });
92
+ };
93
+ export { Delay, isPlayerInArea, isPlayerInRangeOfPoint, waitUntilThenDo, numberWithCommas, isJSON };