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