@armoury/fivem-framework-server 0.0.0-stage → 1.0.8
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 +35 -5
- package/README.md +0 -3
|
@@ -0,0 +1,227 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ServerDBDependentController = void 0;
|
|
13
|
+
// TODO: Remove
|
|
14
|
+
const server_controller_1 = require("./server.controller");
|
|
15
|
+
const fivem_framework_common_1 = require("@armoury/fivem-framework-common");
|
|
16
|
+
let ServerDBDependentController = class ServerDBDependentController extends server_controller_1.ServerController {
|
|
17
|
+
get entities() {
|
|
18
|
+
return this._entities;
|
|
19
|
+
}
|
|
20
|
+
get cachedProperties() {
|
|
21
|
+
return this._cachedProperties;
|
|
22
|
+
}
|
|
23
|
+
get playerToEntityBindings() {
|
|
24
|
+
return this._playerToEntityBindings;
|
|
25
|
+
}
|
|
26
|
+
constructor(dbTableName, loadAllAtStart = false) {
|
|
27
|
+
super();
|
|
28
|
+
this.dbTableName = dbTableName;
|
|
29
|
+
this._entities = [];
|
|
30
|
+
this._cachedProperties = [];
|
|
31
|
+
this._playerToEntityBindings = new Map();
|
|
32
|
+
this.computeTableProperties();
|
|
33
|
+
if (loadAllAtStart) {
|
|
34
|
+
this.loadDBEntities();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
getEntities() {
|
|
38
|
+
return this._entities;
|
|
39
|
+
}
|
|
40
|
+
createEntity(entity, forceId) {
|
|
41
|
+
return (async () => {
|
|
42
|
+
try {
|
|
43
|
+
let entityProperties = this.getEntityProperties(entity);
|
|
44
|
+
let entityValues = this.getEntityPropertiesValues(entity, entityProperties);
|
|
45
|
+
if (forceId) {
|
|
46
|
+
entityProperties = ['id', ...entityProperties];
|
|
47
|
+
entityValues = [forceId.toString(), ...entityValues];
|
|
48
|
+
}
|
|
49
|
+
const id = await Cfx.exports['oxmysql'].insert_async(`INSERT INTO \`${this.dbTableName}\` (${entityProperties.join(', ')}) VALUES (${Array(entityProperties.length).fill('?').join(', ')})`, entityValues);
|
|
50
|
+
const createdEntity = Object.assign(Object.assign({}, entity), { id: forceId || id });
|
|
51
|
+
this._entities.push(createdEntity);
|
|
52
|
+
this.syncWithClients();
|
|
53
|
+
return createdEntity;
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.log(error);
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
})();
|
|
60
|
+
}
|
|
61
|
+
removeEntity(entity) {
|
|
62
|
+
return (async () => {
|
|
63
|
+
try {
|
|
64
|
+
const result = await Cfx.exports['oxmysql'].query_async(`DELETE FROM \`${this.dbTableName}\` WHERE id = ?`, [entity.id]);
|
|
65
|
+
this._entities = this._entities.filter((_entity) => _entity.id !== entity.id);
|
|
66
|
+
this.syncWithClients();
|
|
67
|
+
return !!result;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
console.log(error);
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
})();
|
|
74
|
+
}
|
|
75
|
+
saveDBEntityAsync(id) {
|
|
76
|
+
return (async () => {
|
|
77
|
+
try {
|
|
78
|
+
const entity = this.getEntityByDBId(id);
|
|
79
|
+
if (!entity)
|
|
80
|
+
return false;
|
|
81
|
+
const updateKeys = this.getEntityProperties(entity);
|
|
82
|
+
const updateValues = this.getEntityPropertiesValues(entity, updateKeys);
|
|
83
|
+
const concatString = ' = ?, ';
|
|
84
|
+
const result = await Cfx.exports['oxmysql'].update_async(`UPDATE \`${this.dbTableName}\` SET ${updateKeys.join(concatString).concat(concatString).slice(0, -2)} WHERE id = ?`, [...updateValues, entity.id]);
|
|
85
|
+
if (result) {
|
|
86
|
+
this.syncWithClients();
|
|
87
|
+
}
|
|
88
|
+
return result > 0;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.log(error);
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
})();
|
|
95
|
+
}
|
|
96
|
+
getEntityByDBId(id) {
|
|
97
|
+
return this._entities.find((_entity) => _entity.id === id);
|
|
98
|
+
}
|
|
99
|
+
async loadDBEntityFor(value, key = 'id', bindTo) {
|
|
100
|
+
const result = (await Cfx.exports['oxmysql'].query_async(`SELECT * FROM \`${this.dbTableName}\` WHERE ${key} = ?`, [value])).map((resultItem) => {
|
|
101
|
+
Object.keys(resultItem).forEach((property) => {
|
|
102
|
+
resultItem[property] = JSON.parse((0, fivem_framework_common_1.isJSON)(resultItem[property].toString()) ? resultItem[property] : `"${resultItem[property]}"`, function (_k, v) {
|
|
103
|
+
return (typeof v === "object" || isNaN(v)) ? v : Number(v);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
return resultItem;
|
|
107
|
+
});
|
|
108
|
+
if (result === null || result === void 0 ? void 0 : result.length) {
|
|
109
|
+
result.forEach((entity) => {
|
|
110
|
+
this._entities.push(entity);
|
|
111
|
+
if (bindTo) {
|
|
112
|
+
this.bindEntityToPlayerByEntityId(entity.id, bindTo);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
setTimeout(() => { this.syncWithClients(); }, 2000);
|
|
116
|
+
return ((result === null || result === void 0 ? void 0 : result.length) > 1 ? result : result[0]);
|
|
117
|
+
}
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
async loadDBEntities() {
|
|
121
|
+
const result = (await Cfx.exports['oxmysql'].query_async(`SELECT * FROM \`${this.dbTableName}\``, [])).map((resultItem) => {
|
|
122
|
+
Object.keys(resultItem).forEach((property) => {
|
|
123
|
+
resultItem[property] = JSON.parse((0, fivem_framework_common_1.isJSON)(resultItem[property].toString()) ? resultItem[property] : `"${resultItem[property]}"`, function (_k, v) {
|
|
124
|
+
return (typeof v === "object" || isNaN(v)) ? v : Number(v);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
return resultItem;
|
|
128
|
+
});
|
|
129
|
+
if (result === null || result === void 0 ? void 0 : result.length) {
|
|
130
|
+
this._entities = result;
|
|
131
|
+
setTimeout(() => { this.syncWithClients(); }, 2000);
|
|
132
|
+
}
|
|
133
|
+
return this._entities;
|
|
134
|
+
}
|
|
135
|
+
getEntityProperties(entity) {
|
|
136
|
+
const keys = [];
|
|
137
|
+
for (let key in entity) {
|
|
138
|
+
if (key !== 'id' && (!this._cachedProperties.length || this._cachedProperties.includes(key))) {
|
|
139
|
+
keys.push(key);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return keys;
|
|
143
|
+
}
|
|
144
|
+
getEntityPropertiesValues(entity, properties) {
|
|
145
|
+
return properties.map((key) => {
|
|
146
|
+
if (Array.isArray(entity[key]) || typeof (entity[key]) === 'object') {
|
|
147
|
+
return JSON.stringify(entity[key]);
|
|
148
|
+
}
|
|
149
|
+
return entity[key].toString();
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
syncWithClients(client) {
|
|
153
|
+
// TODO: Probable performance issue cause. Entity updates should be sent to clients only for a specific property, so they don't need to wipe ALL data and rewrite it back.
|
|
154
|
+
Cfx.Server.TriggerClientEvent(`${Cfx.Server.GetCurrentResourceName()}:db-send-entities`, client || -1, this.entities);
|
|
155
|
+
}
|
|
156
|
+
bindEntityToPlayer(entity, playerId) {
|
|
157
|
+
if (this.entities.includes(entity)) {
|
|
158
|
+
this.bindEntityToPlayerByEntityId(entity.id, playerId);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
bindEntityToPlayerByEntityId(id, playerId) {
|
|
162
|
+
const entityExists = this._entities.some((entity) => entity.id === id);
|
|
163
|
+
if (entityExists) {
|
|
164
|
+
if (this._playerToEntityBindings.has(playerId)) {
|
|
165
|
+
this._playerToEntityBindings.set(playerId, [...this._playerToEntityBindings.get(playerId), id]);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
this._playerToEntityBindings.set(playerId, [id]);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
onBoundEntityDestroyed(_entity, _boundPlayer) { }
|
|
173
|
+
onPlayerAuthenticate(playerId, _player) {
|
|
174
|
+
if (this._entities.length) {
|
|
175
|
+
this.syncWithClients(playerId);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
onPlayerDisconnect() {
|
|
179
|
+
if (this._playerToEntityBindings.has(Cfx.source)) {
|
|
180
|
+
const bindings = (this._playerToEntityBindings.has(Cfx.source)
|
|
181
|
+
? this._playerToEntityBindings.get(Cfx.source)
|
|
182
|
+
: []);
|
|
183
|
+
bindings.forEach((entityId) => {
|
|
184
|
+
const entityBoundToPlayer = this._entities.find((entity) => entity.id === entityId);
|
|
185
|
+
if (entityBoundToPlayer) {
|
|
186
|
+
this.onBoundEntityDestroyed(entityBoundToPlayer, Cfx.source);
|
|
187
|
+
this._entities.splice(this._entities.indexOf(entityBoundToPlayer), 1);
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
this._playerToEntityBindings.delete(Cfx.source);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
async computeTableProperties() {
|
|
194
|
+
const result = await Cfx.exports['oxmysql'].query_async(`DESCRIBE ${this.dbTableName}`, []);
|
|
195
|
+
if (result) {
|
|
196
|
+
result.forEach((sqlStructureObject) => {
|
|
197
|
+
this._cachedProperties.push(sqlStructureObject.Field);
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
console.error(`[SQL ERROR:] computeTableProperties for ${Cfx.Server.GetCurrentResourceName()} did not work.`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
exports.ServerDBDependentController = ServerDBDependentController;
|
|
206
|
+
__decorate([
|
|
207
|
+
(0, fivem_framework_common_1.Export)(),
|
|
208
|
+
__metadata("design:type", Function),
|
|
209
|
+
__metadata("design:paramtypes", []),
|
|
210
|
+
__metadata("design:returntype", Array)
|
|
211
|
+
], ServerDBDependentController.prototype, "getEntities", null);
|
|
212
|
+
__decorate([
|
|
213
|
+
(0, fivem_framework_common_1.EventListener)(),
|
|
214
|
+
__metadata("design:type", Function),
|
|
215
|
+
__metadata("design:paramtypes", [Number, Object]),
|
|
216
|
+
__metadata("design:returntype", void 0)
|
|
217
|
+
], ServerDBDependentController.prototype, "onPlayerAuthenticate", null);
|
|
218
|
+
__decorate([
|
|
219
|
+
(0, fivem_framework_common_1.EventListener)(),
|
|
220
|
+
__metadata("design:type", Function),
|
|
221
|
+
__metadata("design:paramtypes", []),
|
|
222
|
+
__metadata("design:returntype", void 0)
|
|
223
|
+
], ServerDBDependentController.prototype, "onPlayerDisconnect", null);
|
|
224
|
+
exports.ServerDBDependentController = ServerDBDependentController = __decorate([
|
|
225
|
+
(0, fivem_framework_common_1.Controller)(),
|
|
226
|
+
__metadata("design:paramtypes", [String, Boolean])
|
|
227
|
+
], ServerDBDependentController);
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// TODO: Remove
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ServerBase = void 0;
|
|
5
|
+
class ServerBase {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.routingBucketCondition = (source, routingBucket) => true;
|
|
8
|
+
this.assignServerBaseListeners();
|
|
9
|
+
}
|
|
10
|
+
// TODO: Remove this. We have created a brand new cool decorator for this
|
|
11
|
+
RegisterAdminCommand(commandName, adminLevelRequired, handlerFunction, restricted) {
|
|
12
|
+
Cfx.Server.RegisterCommand(commandName, (source, args, _raw) => {
|
|
13
|
+
if (Number(Cfx.exports['authentication'].getPlayerInfo(source, 'adminLevel')) < adminLevelRequired) {
|
|
14
|
+
// TODO: Add error chat message OR some kind of visual notice here
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
handlerFunction(source, args, _raw);
|
|
18
|
+
}, restricted);
|
|
19
|
+
}
|
|
20
|
+
assignServerBaseListeners() {
|
|
21
|
+
Cfx.Server.onNet(`${Cfx.Server.GetCurrentResourceName()}:set-client-routing-bucket`, (source, routingBucket) => {
|
|
22
|
+
if (this.routingBucketCondition(source, routingBucket)) {
|
|
23
|
+
Cfx.Server.SetEntityRoutingBucket(source, routingBucket);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
setRoutingBucket(playerId, routingBucket) {
|
|
28
|
+
Cfx.Server.SetEntityRoutingBucket(Cfx.Server.GetPlayerPed(playerId.toString()), routingBucket);
|
|
29
|
+
Cfx.Server.TriggerClientEvent(`${Cfx.Server.GetCurrentResourceName()}:set-routing-bucket`, playerId, routingBucket);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.ServerBase = ServerBase;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// TODO: Remove
|
|
3
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
4
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
5
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
6
|
+
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;
|
|
7
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
8
|
+
};
|
|
9
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
10
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.ServerController = void 0;
|
|
14
|
+
const fivem_framework_common_1 = require("@armoury/fivem-framework-common");
|
|
15
|
+
const server_entities_1 = require("./server.entities");
|
|
16
|
+
let ServerController = class ServerController extends server_entities_1.ServerEntities {
|
|
17
|
+
constructor() {
|
|
18
|
+
super(...arguments);
|
|
19
|
+
this._translationLanguage = 'en';
|
|
20
|
+
this._clientsidedResourceMap = new Map();
|
|
21
|
+
}
|
|
22
|
+
get translationLanguage() {
|
|
23
|
+
return this._translationLanguage;
|
|
24
|
+
}
|
|
25
|
+
get clientsidedResourceMap() {
|
|
26
|
+
return this._clientsidedResourceMap;
|
|
27
|
+
}
|
|
28
|
+
getPlayerClientsidedCacheKey(playerId, key) {
|
|
29
|
+
if (this._clientsidedResourceMap.has(playerId)) {
|
|
30
|
+
const metadataObject = this._clientsidedResourceMap.get(playerId);
|
|
31
|
+
if (metadataObject[key]) {
|
|
32
|
+
return metadataObject[key];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
updatePlayerClientsidedCacheKey(playerId, key, value) {
|
|
38
|
+
const currentPlayerClientsidedResourceMapValue = this._clientsidedResourceMap.has(playerId)
|
|
39
|
+
? this._clientsidedResourceMap.get(playerId) || {}
|
|
40
|
+
: {};
|
|
41
|
+
currentPlayerClientsidedResourceMapValue[key] = value;
|
|
42
|
+
this._clientsidedResourceMap.set(playerId, currentPlayerClientsidedResourceMapValue);
|
|
43
|
+
Cfx.Server.TriggerClientEvent('armoury-overlay:update-resource-metadata', playerId, Cfx.Server.GetCurrentResourceName(), key, value);
|
|
44
|
+
}
|
|
45
|
+
onPlayerClientsidedCacheLoaded(metadataObject) {
|
|
46
|
+
if (metadataObject[Cfx.Server.GetCurrentResourceName()]) {
|
|
47
|
+
this._clientsidedResourceMap.set(Cfx.source, metadataObject[Cfx.Server.GetCurrentResourceName()]);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
onPlayerDisconnect() {
|
|
51
|
+
if (this._clientsidedResourceMap.has(Cfx.source)) {
|
|
52
|
+
this._clientsidedResourceMap.delete(Cfx.source);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
translate(key, params) {
|
|
56
|
+
let content = this.translationFile[this._translationLanguage][key];
|
|
57
|
+
if (params) {
|
|
58
|
+
Object.keys(params).forEach((param) => {
|
|
59
|
+
content = content.replace(`{${param}}`, params[param]);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return content;
|
|
63
|
+
}
|
|
64
|
+
setTranslationLanguage(language) {
|
|
65
|
+
this._translationLanguage = language;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
exports.ServerController = ServerController;
|
|
69
|
+
__decorate([
|
|
70
|
+
(0, fivem_framework_common_1.EventListener)(),
|
|
71
|
+
__metadata("design:type", Function),
|
|
72
|
+
__metadata("design:paramtypes", [Object]),
|
|
73
|
+
__metadata("design:returntype", void 0)
|
|
74
|
+
], ServerController.prototype, "onPlayerClientsidedCacheLoaded", null);
|
|
75
|
+
__decorate([
|
|
76
|
+
(0, fivem_framework_common_1.EventListener)(),
|
|
77
|
+
__metadata("design:type", Function),
|
|
78
|
+
__metadata("design:paramtypes", []),
|
|
79
|
+
__metadata("design:returntype", void 0)
|
|
80
|
+
], ServerController.prototype, "onPlayerDisconnect", null);
|
|
81
|
+
exports.ServerController = ServerController = __decorate([
|
|
82
|
+
(0, fivem_framework_common_1.Controller)()
|
|
83
|
+
], ServerController);
|
|
@@ -0,0 +1,57 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ServerEntities = void 0;
|
|
13
|
+
// TODO: Remove
|
|
14
|
+
const fivem_framework_common_1 = require("@armoury/fivem-framework-common");
|
|
15
|
+
const server_base_1 = require("./server.base");
|
|
16
|
+
let ServerEntities = class ServerEntities extends server_base_1.ServerBase {
|
|
17
|
+
constructor() {
|
|
18
|
+
super(...arguments);
|
|
19
|
+
// Probable performance issue? Maybe calling the export so many times when changing the virtual world is too costly?
|
|
20
|
+
this._virtualWorldsWithPlayers = new Map();
|
|
21
|
+
}
|
|
22
|
+
/** This only counts virtual worlds related to the resource! If another resource changes the virtual world of the player, this resource won't know it! */
|
|
23
|
+
get virtualWorldsWithPlayers() {
|
|
24
|
+
return this._virtualWorldsWithPlayers;
|
|
25
|
+
}
|
|
26
|
+
onPlayerEnteredScope(data) {
|
|
27
|
+
Cfx.Server.TriggerClientEvent(`${Cfx.Server.GetCurrentResourceName()}:refresh-virtual-world`, data.for);
|
|
28
|
+
}
|
|
29
|
+
setPlayerVirtualWorld(playerId, virtualWorld) {
|
|
30
|
+
const currentPlayerVirtualWorld = this.getPlayerVirtualWorld(playerId);
|
|
31
|
+
if (!isNaN(currentPlayerVirtualWorld)) {
|
|
32
|
+
this._virtualWorldsWithPlayers.set(currentPlayerVirtualWorld, (this._virtualWorldsWithPlayers.has(currentPlayerVirtualWorld) ? this._virtualWorldsWithPlayers.get(currentPlayerVirtualWorld) : []).filter((_playerId) => _playerId !== playerId));
|
|
33
|
+
}
|
|
34
|
+
const newPlayersInVirtualWorld = [
|
|
35
|
+
...(this._virtualWorldsWithPlayers.has(virtualWorld) ? this._virtualWorldsWithPlayers.get(virtualWorld) : []),
|
|
36
|
+
playerId
|
|
37
|
+
];
|
|
38
|
+
this._virtualWorldsWithPlayers.set(virtualWorld, newPlayersInVirtualWorld);
|
|
39
|
+
Cfx.exports['authentication'].setPlayerInfo(playerId, 'virtualWorld', virtualWorld);
|
|
40
|
+
}
|
|
41
|
+
getPlayerVirtualWorld(playerId) {
|
|
42
|
+
return Math.max(0, Number(Cfx.exports['authentication'].getPlayerInfo(playerId, 'virtualWorld')));
|
|
43
|
+
}
|
|
44
|
+
removeClientsideVehicles() {
|
|
45
|
+
Cfx.Server.TriggerClientEvent(`${Cfx.Server.GetCurrentResourceName()}:ARM_remove-vehicles`, -1);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
exports.ServerEntities = ServerEntities;
|
|
49
|
+
__decorate([
|
|
50
|
+
(0, fivem_framework_common_1.EventListener)({ eventName: 'playerEnteredScope' }),
|
|
51
|
+
__metadata("design:type", Function),
|
|
52
|
+
__metadata("design:paramtypes", [Object]),
|
|
53
|
+
__metadata("design:returntype", void 0)
|
|
54
|
+
], ServerEntities.prototype, "onPlayerEnteredScope", null);
|
|
55
|
+
exports.ServerEntities = ServerEntities = __decorate([
|
|
56
|
+
(0, fivem_framework_common_1.Controller)()
|
|
57
|
+
], ServerEntities);
|
|
@@ -0,0 +1,21 @@
|
|
|
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("./server-resource-database.service"), exports);
|
|
18
|
+
__exportStar(require("./server-enterable-database.service"), exports);
|
|
19
|
+
__exportStar(require("./server-virtual-worlds.service"), exports);
|
|
20
|
+
__exportStar(require("./server-translate.service"), exports);
|
|
21
|
+
__exportStar(require("./session"), exports);
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ServerEnterableDatabase = void 0;
|
|
10
|
+
const injection_js_1 = require("injection-js");
|
|
11
|
+
const server_resource_database_service_1 = require("./server-resource-database.service");
|
|
12
|
+
const fivem_framework_common_1 = require("@armoury/fivem-framework-common");
|
|
13
|
+
let ServerEnterableDatabase = class ServerEnterableDatabase extends server_resource_database_service_1.ServerResourceDatabase {
|
|
14
|
+
getClosestToPlayer(player) {
|
|
15
|
+
return this.getClosestExitToPlayer(player) || this.getClosestEntranceToPlayer(player);
|
|
16
|
+
}
|
|
17
|
+
getClosestEntranceToPlayer(source) {
|
|
18
|
+
// TODO: Replace here to actually get the closest, not the first one in the range
|
|
19
|
+
const playerPosition = Cfx.Server.GetEntityCoords(Cfx.Server.GetPlayerPed(source.toString()));
|
|
20
|
+
const entity = this.entities.find((_entity) => (0, fivem_framework_common_1.isPlayerInRangeOfPoint)(playerPosition[0], playerPosition[1], playerPosition[2], _entity.entranceX, _entity.entranceY, _entity.entranceZ, 3.0));
|
|
21
|
+
return entity || null;
|
|
22
|
+
}
|
|
23
|
+
getClosestExitToPlayer(source) {
|
|
24
|
+
const virtualWorld = Math.max(0, Number(Cfx.exports['authentication'].getPlayerInfo(source, 'virtualWorld')));
|
|
25
|
+
const entity = this.getEntityByDBId(virtualWorld);
|
|
26
|
+
const playerPosition = Cfx.Server.GetEntityCoords(Cfx.Server.GetPlayerPed(source.toString()));
|
|
27
|
+
// TODO: Replace here to actually get the closest, not the first one in the range
|
|
28
|
+
if (entity && (0, fivem_framework_common_1.isPlayerInRangeOfPoint)(playerPosition[0], playerPosition[1], playerPosition[2], entity.exitX, entity.exitY, entity.exitZ, 3.0)) {
|
|
29
|
+
return entity;
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
exports.ServerEnterableDatabase = ServerEnterableDatabase;
|
|
35
|
+
exports.ServerEnterableDatabase = ServerEnterableDatabase = __decorate([
|
|
36
|
+
(0, injection_js_1.Injectable)()
|
|
37
|
+
], ServerEnterableDatabase);
|