@open-core/framework 1.0.1-beta.1
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/LICENSE +373 -0
- package/README.md +350 -0
- package/dist/client/client-bootstrap.d.ts +1 -0
- package/dist/client/client-bootstrap.js +53 -0
- package/dist/client/client-container.d.ts +2 -0
- package/dist/client/client-container.js +6 -0
- package/dist/client/client-core.d.ts +18 -0
- package/dist/client/client-core.js +52 -0
- package/dist/client/decorators/controller.d.ts +3 -0
- package/dist/client/decorators/controller.js +14 -0
- package/dist/client/decorators/export.d.ts +7 -0
- package/dist/client/decorators/export.js +15 -0
- package/dist/client/decorators/gameEvent.d.ts +47 -0
- package/dist/client/decorators/gameEvent.js +54 -0
- package/dist/client/decorators/index.d.ts +10 -0
- package/dist/client/decorators/index.js +26 -0
- package/dist/client/decorators/interval.d.ts +7 -0
- package/dist/client/decorators/interval.js +15 -0
- package/dist/client/decorators/key.d.ts +2 -0
- package/dist/client/decorators/key.js +10 -0
- package/dist/client/decorators/localEvent.d.ts +7 -0
- package/dist/client/decorators/localEvent.js +15 -0
- package/dist/client/decorators/nui.d.ts +1 -0
- package/dist/client/decorators/nui.js +9 -0
- package/dist/client/decorators/onNet.d.ts +1 -0
- package/dist/client/decorators/onNet.js +9 -0
- package/dist/client/decorators/resourceLifecycle.d.ts +11 -0
- package/dist/client/decorators/resourceLifecycle.js +24 -0
- package/dist/client/decorators/tick.d.ts +1 -0
- package/dist/client/decorators/tick.js +9 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.js +22 -0
- package/dist/client/loaders/exports.loader.d.ts +1 -0
- package/dist/client/loaders/exports.loader.js +13 -0
- package/dist/client/player/player.d.ts +262 -0
- package/dist/client/player/player.js +480 -0
- package/dist/client/player/player.loader.d.ts +1 -0
- package/dist/client/player/player.loader.js +22 -0
- package/dist/client/services/core/index.d.ts +1 -0
- package/dist/client/services/core/index.js +17 -0
- package/dist/client/services/core/spawn.service.d.ts +20 -0
- package/dist/client/services/core/spawn.service.js +143 -0
- package/dist/client/services/index.d.ts +4 -0
- package/dist/client/services/index.js +24 -0
- package/dist/client/services/streaming/index.d.ts +1 -0
- package/dist/client/services/streaming/index.js +17 -0
- package/dist/client/services/streaming/streaming.service.d.ts +165 -0
- package/dist/client/services/streaming/streaming.service.js +341 -0
- package/dist/client/services/ui/index.d.ts +3 -0
- package/dist/client/services/ui/index.js +19 -0
- package/dist/client/services/ui/notification.service.d.ts +76 -0
- package/dist/client/services/ui/notification.service.js +111 -0
- package/dist/client/services/ui/progress.service.d.ts +82 -0
- package/dist/client/services/ui/progress.service.js +210 -0
- package/dist/client/services/ui/textui.service.d.ts +82 -0
- package/dist/client/services/ui/textui.service.js +156 -0
- package/dist/client/services/world/blip.service.d.ts +112 -0
- package/dist/client/services/world/blip.service.js +215 -0
- package/dist/client/services/world/index.d.ts +4 -0
- package/dist/client/services/world/index.js +20 -0
- package/dist/client/services/world/marker.service.d.ts +94 -0
- package/dist/client/services/world/marker.service.js +153 -0
- package/dist/client/services/world/ped.service.d.ts +182 -0
- package/dist/client/services/world/ped.service.js +302 -0
- package/dist/client/services/world/vehicle.service.d.ts +168 -0
- package/dist/client/services/world/vehicle.service.js +296 -0
- package/dist/client/system/metadata-client.keys.d.ts +13 -0
- package/dist/client/system/metadata-client.keys.js +16 -0
- package/dist/client/system/processors/export.processor.d.ts +7 -0
- package/dist/client/system/processors/export.processor.js +39 -0
- package/dist/client/system/processors/gameEvent.processor.d.ts +10 -0
- package/dist/client/system/processors/gameEvent.processor.js +58 -0
- package/dist/client/system/processors/interval.processor.d.ts +7 -0
- package/dist/client/system/processors/interval.processor.js +43 -0
- package/dist/client/system/processors/key.processor.d.ts +8 -0
- package/dist/client/system/processors/key.processor.js +27 -0
- package/dist/client/system/processors/localEvent.processor.d.ts +7 -0
- package/dist/client/system/processors/localEvent.processor.js +38 -0
- package/dist/client/system/processors/netEvent.processor.d.ts +7 -0
- package/dist/client/system/processors/netEvent.processor.js +38 -0
- package/dist/client/system/processors/nui.processor.d.ts +7 -0
- package/dist/client/system/processors/nui.processor.js +40 -0
- package/dist/client/system/processors/resourceLifecycle.processor.d.ts +9 -0
- package/dist/client/system/processors/resourceLifecycle.processor.js +69 -0
- package/dist/client/system/processors/tick.processor.d.ts +5 -0
- package/dist/client/system/processors/tick.processor.js +37 -0
- package/dist/client/system/processors.register.d.ts +1 -0
- package/dist/client/system/processors.register.js +27 -0
- package/dist/client/types/game-events.d.ts +126 -0
- package/dist/client/types/game-events.js +83 -0
- package/dist/client/types/index.d.ts +1 -0
- package/dist/client/types/index.js +17 -0
- package/dist/client/ui-bridge.d.ts +116 -0
- package/dist/client/ui-bridge.js +201 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +46 -0
- package/dist/server/bootstrap.d.ts +16 -0
- package/dist/server/bootstrap.js +57 -0
- package/dist/server/bus/core-event-bus.d.ts +6 -0
- package/dist/server/bus/core-event-bus.js +31 -0
- package/dist/server/configs/api.config.d.ts +71 -0
- package/dist/server/configs/api.config.js +81 -0
- package/dist/server/configs/config.base.d.ts +63 -0
- package/dist/server/configs/config.base.js +64 -0
- package/dist/server/configs/index.d.ts +2 -0
- package/dist/server/configs/index.js +18 -0
- package/dist/server/container.d.ts +2 -0
- package/dist/server/container.js +6 -0
- package/dist/server/controllers/chat.controller.d.ts +10 -0
- package/dist/server/controllers/chat.controller.js +50 -0
- package/dist/server/controllers/command.controller.d.ts +7 -0
- package/dist/server/controllers/command.controller.js +47 -0
- package/dist/server/core.d.ts +1 -0
- package/dist/server/core.js +7 -0
- package/dist/server/database/adapters/oxmysql.adapter.d.ts +89 -0
- package/dist/server/database/adapters/oxmysql.adapter.js +149 -0
- package/dist/server/database/database.contract.d.ts +128 -0
- package/dist/server/database/database.contract.js +29 -0
- package/dist/server/database/database.service.d.ts +216 -0
- package/dist/server/database/database.service.js +301 -0
- package/dist/server/database/index.d.ts +53 -0
- package/dist/server/database/index.js +70 -0
- package/dist/server/database/types.d.ts +67 -0
- package/dist/server/database/types.js +7 -0
- package/dist/server/database.d.ts +7 -0
- package/dist/server/database.js +23 -0
- package/dist/server/decorators/bind.d.ts +2 -0
- package/dist/server/decorators/bind.js +15 -0
- package/dist/server/decorators/command.d.ts +19 -0
- package/dist/server/decorators/command.js +18 -0
- package/dist/server/decorators/controller.d.ts +3 -0
- package/dist/server/decorators/controller.js +14 -0
- package/dist/server/decorators/coreEvent.d.ts +2 -0
- package/dist/server/decorators/coreEvent.js +9 -0
- package/dist/server/decorators/export.d.ts +1 -0
- package/dist/server/decorators/export.js +9 -0
- package/dist/server/decorators/guard.d.ts +5 -0
- package/dist/server/decorators/guard.js +39 -0
- package/dist/server/decorators/index.d.ts +10 -0
- package/dist/server/decorators/index.js +26 -0
- package/dist/server/decorators/netEvent.d.ts +36 -0
- package/dist/server/decorators/netEvent.js +40 -0
- package/dist/server/decorators/onTick.d.ts +1 -0
- package/dist/server/decorators/onTick.js +9 -0
- package/dist/server/decorators/public.d.ts +16 -0
- package/dist/server/decorators/public.js +25 -0
- package/dist/server/decorators/requiresState.d.ts +55 -0
- package/dist/server/decorators/requiresState.js +62 -0
- package/dist/server/decorators/throttle.d.ts +9 -0
- package/dist/server/decorators/throttle.js +36 -0
- package/dist/server/decorators/utils.d.ts +7 -0
- package/dist/server/decorators/utils.js +13 -0
- package/dist/server/entities/index.d.ts +1 -0
- package/dist/server/entities/index.js +17 -0
- package/dist/server/entities/player.d.ts +157 -0
- package/dist/server/entities/player.js +217 -0
- package/dist/server/error-handler.d.ts +2 -0
- package/dist/server/error-handler.js +43 -0
- package/dist/server/index.d.ts +10 -0
- package/dist/server/index.js +29 -0
- package/dist/server/loaders/exports.loader.d.ts +0 -0
- package/dist/server/loaders/exports.loader.js +23 -0
- package/dist/server/loaders/playerSession.loader.d.ts +1 -0
- package/dist/server/loaders/playerSession.loader.js +42 -0
- package/dist/server/services/access-control.service.d.ts +56 -0
- package/dist/server/services/access-control.service.js +99 -0
- package/dist/server/services/chat.service.d.ts +7 -0
- package/dist/server/services/chat.service.js +31 -0
- package/dist/server/services/command.service.d.ts +15 -0
- package/dist/server/services/command.service.js +74 -0
- package/dist/server/services/config.service.d.ts +75 -0
- package/dist/server/services/config.service.js +116 -0
- package/dist/server/services/default/default-security.handler.d.ts +6 -0
- package/dist/server/services/default/default-security.handler.js +26 -0
- package/dist/server/services/http/http.service.d.ts +50 -0
- package/dist/server/services/http/http.service.js +126 -0
- package/dist/server/services/index.d.ts +10 -0
- package/dist/server/services/index.js +26 -0
- package/dist/server/services/parallel/index.d.ts +49 -0
- package/dist/server/services/parallel/index.js +67 -0
- package/dist/server/services/parallel/parallel-compute.service.d.ts +132 -0
- package/dist/server/services/parallel/parallel-compute.service.js +449 -0
- package/dist/server/services/parallel/types.d.ts +188 -0
- package/dist/server/services/parallel/types.js +7 -0
- package/dist/server/services/parallel/worker-pool.d.ts +83 -0
- package/dist/server/services/parallel/worker-pool.js +350 -0
- package/dist/server/services/parallel/worker.d.ts +19 -0
- package/dist/server/services/parallel/worker.js +49 -0
- package/dist/server/services/persistence.service.d.ts +59 -0
- package/dist/server/services/persistence.service.js +166 -0
- package/dist/server/services/player.service.d.ts +96 -0
- package/dist/server/services/player.service.js +132 -0
- package/dist/server/services/rate-limiter.service.d.ts +5 -0
- package/dist/server/services/rate-limiter.service.js +39 -0
- package/dist/server/services/registers.d.ts +1 -0
- package/dist/server/services/registers.js +18 -0
- package/dist/server/setup.d.ts +9 -0
- package/dist/server/setup.js +28 -0
- package/dist/server/system/metadata-server.keys.d.ts +9 -0
- package/dist/server/system/metadata-server.keys.js +12 -0
- package/dist/server/system/processors/command.processor.d.ts +9 -0
- package/dist/server/system/processors/command.processor.js +31 -0
- package/dist/server/system/processors/coreEvent.processor.d.ts +7 -0
- package/dist/server/system/processors/coreEvent.processor.js +38 -0
- package/dist/server/system/processors/export.processor.d.ts +7 -0
- package/dist/server/system/processors/export.processor.js +26 -0
- package/dist/server/system/processors/netEvent.processor.d.ts +11 -0
- package/dist/server/system/processors/netEvent.processor.js +100 -0
- package/dist/server/system/processors/tick.processor.d.ts +5 -0
- package/dist/server/system/processors/tick.processor.js +36 -0
- package/dist/server/system/processors.register.d.ts +1 -0
- package/dist/server/system/processors.register.js +21 -0
- package/dist/server/templates/admin/admin.controller-template.d.ts +10 -0
- package/dist/server/templates/admin/admin.controller-template.js +2 -0
- package/dist/server/templates/auth/auth-provider.contract.d.ts +58 -0
- package/dist/server/templates/auth/auth-provider.contract.js +23 -0
- package/dist/server/templates/index.d.ts +8 -0
- package/dist/server/templates/index.js +21 -0
- package/dist/server/templates/persistence/index.d.ts +30 -0
- package/dist/server/templates/persistence/index.js +34 -0
- package/dist/server/templates/persistence/player-persistence.contract.d.ts +86 -0
- package/dist/server/templates/persistence/player-persistence.contract.js +52 -0
- package/dist/server/templates/repository/index.d.ts +57 -0
- package/dist/server/templates/repository/index.js +61 -0
- package/dist/server/templates/repository/repository.contract.d.ts +224 -0
- package/dist/server/templates/repository/repository.contract.js +342 -0
- package/dist/server/templates/repository/repository.types.d.ts +51 -0
- package/dist/server/templates/repository/repository.types.js +7 -0
- package/dist/server/templates/security/permission.types.d.ts +32 -0
- package/dist/server/templates/security/permission.types.js +2 -0
- package/dist/server/templates/security/principal-provider.contract.d.ts +43 -0
- package/dist/server/templates/security/principal-provider.contract.js +19 -0
- package/dist/server/templates/security/security-handler.contract.d.ts +5 -0
- package/dist/server/templates/security/security-handler.contract.js +6 -0
- package/dist/server/types/core-events.d.ts +17 -0
- package/dist/server/types/core-events.js +2 -0
- package/dist/server/types/security.types.d.ts +7 -0
- package/dist/server/types/security.types.js +2 -0
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.js +17 -0
- package/dist/shared/logger/core-logger.d.ts +35 -0
- package/dist/shared/logger/core-logger.js +52 -0
- package/dist/shared/logger/index.d.ts +11 -0
- package/dist/shared/logger/index.js +26 -0
- package/dist/shared/logger/logger.config.d.ts +47 -0
- package/dist/shared/logger/logger.config.js +33 -0
- package/dist/shared/logger/logger.service.d.ts +161 -0
- package/dist/shared/logger/logger.service.js +279 -0
- package/dist/shared/logger/logger.types.d.ts +85 -0
- package/dist/shared/logger/logger.types.js +74 -0
- package/dist/shared/logger/transports/buffered.transport.d.ts +88 -0
- package/dist/shared/logger/transports/buffered.transport.js +174 -0
- package/dist/shared/logger/transports/console.transport.d.ts +37 -0
- package/dist/shared/logger/transports/console.transport.js +134 -0
- package/dist/shared/logger/transports/index.d.ts +3 -0
- package/dist/shared/logger/transports/index.js +19 -0
- package/dist/shared/logger/transports/transport.interface.d.ts +40 -0
- package/dist/shared/logger/transports/transport.interface.js +2 -0
- package/dist/system/class-constructor.d.ts +1 -0
- package/dist/system/class-constructor.js +2 -0
- package/dist/system/decorator-processor.d.ts +4 -0
- package/dist/system/decorator-processor.js +2 -0
- package/dist/system/metadata.scanner.d.ts +7 -0
- package/dist/system/metadata.scanner.js +45 -0
- package/dist/utils/errors.d.ts +14 -0
- package/dist/utils/errors.js +25 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +20 -0
- package/dist/utils/result.d.ts +12 -0
- package/dist/utils/result.js +10 -0
- package/dist/utils/rgb.d.ts +5 -0
- package/dist/utils/rgb.js +2 -0
- package/dist/utils/vector3.d.ts +13 -0
- package/dist/utils/vector3.js +27 -0
- package/package.json +70 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type { Vector3 } from '../../utils';
|
|
2
|
+
import type { LinkedID, PlayerSession } from '../services/player.service';
|
|
3
|
+
/**
|
|
4
|
+
* Core-level representation of a connected player on the server.
|
|
5
|
+
*
|
|
6
|
+
* This class wraps FiveM natives and session information.
|
|
7
|
+
* It serves as an abstraction layer to interact with the connected client
|
|
8
|
+
* (kicking, teleporting, emitting events) without dealing with raw IDs everywhere.
|
|
9
|
+
*
|
|
10
|
+
* ⚠️ **Design Note:** This class does NOT contain gameplay logic (money, jobs, inventory).
|
|
11
|
+
* Domain logic should live in your modules' services/models (e.g., `EconomyService`, `JobModel`).
|
|
12
|
+
*/
|
|
13
|
+
export declare class Player {
|
|
14
|
+
private readonly session;
|
|
15
|
+
private states;
|
|
16
|
+
/**
|
|
17
|
+
* Creates a new Player entity instance.
|
|
18
|
+
* This is typically instantiated by the `PlayerService` upon connection.
|
|
19
|
+
*
|
|
20
|
+
* @param session - The internal session data structure holding ID and metadata.
|
|
21
|
+
*/
|
|
22
|
+
constructor(session: PlayerSession);
|
|
23
|
+
/**
|
|
24
|
+
* The numeric FiveM Server ID (Source) of the player.
|
|
25
|
+
* Useful for internal logic and array indexing.
|
|
26
|
+
*/
|
|
27
|
+
get clientID(): number;
|
|
28
|
+
/**
|
|
29
|
+
* The FiveM Server ID as a string.
|
|
30
|
+
* Required by most FiveM native functions (e.g., `GetPlayerName`, `DropPlayer`).
|
|
31
|
+
*/
|
|
32
|
+
get clientIDStr(): string;
|
|
33
|
+
/**
|
|
34
|
+
* The persistent Account ID linked to this session, if the player is authenticated.
|
|
35
|
+
* Returns `undefined` if the player has not logged in yet.
|
|
36
|
+
*/
|
|
37
|
+
get accountID(): string | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* The display name of the player (Steam name or FiveM username).
|
|
40
|
+
*/
|
|
41
|
+
get name(): string;
|
|
42
|
+
/**
|
|
43
|
+
* Retrieves all platform identifiers associated with the player (steam, license, discord, ip, etc.).
|
|
44
|
+
*
|
|
45
|
+
* @returns An array of identifier strings (e.g., `['steam:11000...', 'license:2332...']`).
|
|
46
|
+
*/
|
|
47
|
+
getIdentifiers(): string[];
|
|
48
|
+
/**
|
|
49
|
+
* Sends a network event exclusively to this specific player (Client-side).
|
|
50
|
+
* Wrapper for `emitNet` ensuring the correct target Source ID is used.
|
|
51
|
+
*
|
|
52
|
+
* @param eventName - The name of the event to trigger on the client.
|
|
53
|
+
* @param args - Data to send to the client.
|
|
54
|
+
*/
|
|
55
|
+
emit(eventName: string, ...args: any[]): void;
|
|
56
|
+
/**
|
|
57
|
+
* Teleports the player to a given position using Server-Side natives.
|
|
58
|
+
*
|
|
59
|
+
* **Note:** This forces the entity position on the server. For smoother gameplay transitions
|
|
60
|
+
* (e.g., inside interiors or across the map), consider using `teleportClient`.
|
|
61
|
+
*
|
|
62
|
+
* @param vector - The target coordinates (x, y, z).
|
|
63
|
+
*/
|
|
64
|
+
teleport(vector: Vector3): void;
|
|
65
|
+
/**
|
|
66
|
+
* Requests the Client to teleport itself via the Core Spawner system.
|
|
67
|
+
*
|
|
68
|
+
* This method is preferred for gameplay logic as it allows the client to handle
|
|
69
|
+
* loading screens, fading, and collision loading gracefully.
|
|
70
|
+
*
|
|
71
|
+
* @param vector - The target coordinates (x, y, z).
|
|
72
|
+
*/
|
|
73
|
+
teleportClient(vector: Vector3): void;
|
|
74
|
+
/**
|
|
75
|
+
* Disconnects the player from the server.
|
|
76
|
+
*
|
|
77
|
+
* @param reason - The message displayed to the player upon disconnection.
|
|
78
|
+
*/
|
|
79
|
+
kick(reason?: string): void;
|
|
80
|
+
/**
|
|
81
|
+
* Sets the routing bucket (virtual world / dimension) for the player.
|
|
82
|
+
* Players in different buckets cannot see or interact with each other.
|
|
83
|
+
*
|
|
84
|
+
* @param bucket - The bucket ID (0 is the default shared world).
|
|
85
|
+
*/
|
|
86
|
+
setRoutingBucket(bucket: number): void;
|
|
87
|
+
/**
|
|
88
|
+
* Stores arbitrary transient metadata for this player's session.
|
|
89
|
+
* Useful for flags like `isDead`, `isInRaid`, `lastLocation`, etc.
|
|
90
|
+
*
|
|
91
|
+
* @param key - The unique key for the metadata.
|
|
92
|
+
* @param value - The value to store.
|
|
93
|
+
*/
|
|
94
|
+
setMeta(key: string, value: unknown): void;
|
|
95
|
+
/**
|
|
96
|
+
* Retrieves metadata previously stored in the session.
|
|
97
|
+
*
|
|
98
|
+
* @template T - The expected type of the value.
|
|
99
|
+
* @param key - The metadata key.
|
|
100
|
+
* @returns The value cast to T, or `undefined` if not set.
|
|
101
|
+
*/
|
|
102
|
+
getMeta<T = unknown>(key: string): T | undefined;
|
|
103
|
+
/**
|
|
104
|
+
* Links a persistent Account ID to the current session.
|
|
105
|
+
* Should be called after successful authentication.
|
|
106
|
+
*
|
|
107
|
+
* @param accountID - The unique ID from the database.
|
|
108
|
+
*/
|
|
109
|
+
linkAccount(accountID: LinkedID): void;
|
|
110
|
+
/**
|
|
111
|
+
* Checks if the player currently possesses a specific state flag.
|
|
112
|
+
*
|
|
113
|
+
* @param state - The unique string identifier of the state (e.g., 'dead', 'cuffed').
|
|
114
|
+
* @returns `true` if the state is active, `false` otherwise.
|
|
115
|
+
*/
|
|
116
|
+
hasState(state: string): boolean;
|
|
117
|
+
/**
|
|
118
|
+
* Applies a state flag to the player.
|
|
119
|
+
*
|
|
120
|
+
* @remarks
|
|
121
|
+
* Since states are stored in a `Set`, adding an existing state has no effect (idempotent).
|
|
122
|
+
* Ideally, this should trigger a sync event to the client if needed.
|
|
123
|
+
*
|
|
124
|
+
* @param state - The state key to add.
|
|
125
|
+
*/
|
|
126
|
+
addState(state: string): void;
|
|
127
|
+
/**
|
|
128
|
+
* Removes a specific state flag from the player.
|
|
129
|
+
*
|
|
130
|
+
* @param state - The state key to remove.
|
|
131
|
+
*/
|
|
132
|
+
removeState(state: string): void;
|
|
133
|
+
/**
|
|
134
|
+
* Toggles the presence of a state flag.
|
|
135
|
+
*
|
|
136
|
+
* @param state - The state key to toggle.
|
|
137
|
+
* @param force - If provided, forces the state to be added (`true`) or removed (`false`) regardless of its current status.
|
|
138
|
+
*
|
|
139
|
+
* @returns The final status of the state (`true` if active, `false` if inactive).
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```ts
|
|
143
|
+
* // Standard toggle
|
|
144
|
+
* player.toggleState('duty'); // turns on if off, off if on
|
|
145
|
+
*
|
|
146
|
+
* // Force enable (equivalent to addState but returns boolean)
|
|
147
|
+
* player.toggleState('duty', true); // always results in true
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
toggleState(state: string, force?: boolean): boolean;
|
|
151
|
+
/**
|
|
152
|
+
* Retrieves a snapshot of all currently active state flags for this player.
|
|
153
|
+
*
|
|
154
|
+
* @returns An array containing all active state keys.
|
|
155
|
+
*/
|
|
156
|
+
getStates(): string[];
|
|
157
|
+
}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Player = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Core-level representation of a connected player on the server.
|
|
6
|
+
*
|
|
7
|
+
* This class wraps FiveM natives and session information.
|
|
8
|
+
* It serves as an abstraction layer to interact with the connected client
|
|
9
|
+
* (kicking, teleporting, emitting events) without dealing with raw IDs everywhere.
|
|
10
|
+
*
|
|
11
|
+
* ⚠️ **Design Note:** This class does NOT contain gameplay logic (money, jobs, inventory).
|
|
12
|
+
* Domain logic should live in your modules' services/models (e.g., `EconomyService`, `JobModel`).
|
|
13
|
+
*/
|
|
14
|
+
class Player {
|
|
15
|
+
/**
|
|
16
|
+
* Creates a new Player entity instance.
|
|
17
|
+
* This is typically instantiated by the `PlayerService` upon connection.
|
|
18
|
+
*
|
|
19
|
+
* @param session - The internal session data structure holding ID and metadata.
|
|
20
|
+
*/
|
|
21
|
+
constructor(session) {
|
|
22
|
+
this.session = session;
|
|
23
|
+
this.states = new Set();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The numeric FiveM Server ID (Source) of the player.
|
|
27
|
+
* Useful for internal logic and array indexing.
|
|
28
|
+
*/
|
|
29
|
+
get clientID() {
|
|
30
|
+
return this.session.clientID;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The FiveM Server ID as a string.
|
|
34
|
+
* Required by most FiveM native functions (e.g., `GetPlayerName`, `DropPlayer`).
|
|
35
|
+
*/
|
|
36
|
+
get clientIDStr() {
|
|
37
|
+
return this.session.clientID.toString();
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The persistent Account ID linked to this session, if the player is authenticated.
|
|
41
|
+
* Returns `undefined` if the player has not logged in yet.
|
|
42
|
+
*/
|
|
43
|
+
get accountID() {
|
|
44
|
+
var _a;
|
|
45
|
+
return (_a = this.session.accountID) === null || _a === void 0 ? void 0 : _a.toString();
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The display name of the player (Steam name or FiveM username).
|
|
49
|
+
*/
|
|
50
|
+
get name() {
|
|
51
|
+
return GetPlayerName(this.clientIDStr);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Retrieves all platform identifiers associated with the player (steam, license, discord, ip, etc.).
|
|
55
|
+
*
|
|
56
|
+
* @returns An array of identifier strings (e.g., `['steam:11000...', 'license:2332...']`).
|
|
57
|
+
*/
|
|
58
|
+
getIdentifiers() {
|
|
59
|
+
const ids = [];
|
|
60
|
+
for (let i = 0;; i++) {
|
|
61
|
+
const id = GetPlayerIdentifier(this.clientIDStr, i);
|
|
62
|
+
if (!id)
|
|
63
|
+
break;
|
|
64
|
+
ids.push(id);
|
|
65
|
+
}
|
|
66
|
+
return ids;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Sends a network event exclusively to this specific player (Client-side).
|
|
70
|
+
* Wrapper for `emitNet` ensuring the correct target Source ID is used.
|
|
71
|
+
*
|
|
72
|
+
* @param eventName - The name of the event to trigger on the client.
|
|
73
|
+
* @param args - Data to send to the client.
|
|
74
|
+
*/
|
|
75
|
+
emit(eventName, ...args) {
|
|
76
|
+
emitNet(eventName, this.clientID, ...args);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Teleports the player to a given position using Server-Side natives.
|
|
80
|
+
*
|
|
81
|
+
* **Note:** This forces the entity position on the server. For smoother gameplay transitions
|
|
82
|
+
* (e.g., inside interiors or across the map), consider using `teleportClient`.
|
|
83
|
+
*
|
|
84
|
+
* @param vector - The target coordinates (x, y, z).
|
|
85
|
+
*/
|
|
86
|
+
teleport(vector) {
|
|
87
|
+
SetEntityCoords(GetPlayerPed(this.clientIDStr), vector.x, vector.y, vector.z, false, false, false, true);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Requests the Client to teleport itself via the Core Spawner system.
|
|
91
|
+
*
|
|
92
|
+
* This method is preferred for gameplay logic as it allows the client to handle
|
|
93
|
+
* loading screens, fading, and collision loading gracefully.
|
|
94
|
+
*
|
|
95
|
+
* @param vector - The target coordinates (x, y, z).
|
|
96
|
+
*/
|
|
97
|
+
teleportClient(vector) {
|
|
98
|
+
this.emit('core:spawner:teleport', vector);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Disconnects the player from the server.
|
|
102
|
+
*
|
|
103
|
+
* @param reason - The message displayed to the player upon disconnection.
|
|
104
|
+
*/
|
|
105
|
+
kick(reason = 'Kicked from server') {
|
|
106
|
+
DropPlayer(this.clientID.toString(), reason);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Sets the routing bucket (virtual world / dimension) for the player.
|
|
110
|
+
* Players in different buckets cannot see or interact with each other.
|
|
111
|
+
*
|
|
112
|
+
* @param bucket - The bucket ID (0 is the default shared world).
|
|
113
|
+
*/
|
|
114
|
+
setRoutingBucket(bucket) {
|
|
115
|
+
SetPlayerRoutingBucket(this.clientID.toString(), bucket);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Stores arbitrary transient metadata for this player's session.
|
|
119
|
+
* Useful for flags like `isDead`, `isInRaid`, `lastLocation`, etc.
|
|
120
|
+
*
|
|
121
|
+
* @param key - The unique key for the metadata.
|
|
122
|
+
* @param value - The value to store.
|
|
123
|
+
*/
|
|
124
|
+
setMeta(key, value) {
|
|
125
|
+
this.session.meta[key] = value;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Retrieves metadata previously stored in the session.
|
|
129
|
+
*
|
|
130
|
+
* @template T - The expected type of the value.
|
|
131
|
+
* @param key - The metadata key.
|
|
132
|
+
* @returns The value cast to T, or `undefined` if not set.
|
|
133
|
+
*/
|
|
134
|
+
getMeta(key) {
|
|
135
|
+
return this.session.meta[key];
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Links a persistent Account ID to the current session.
|
|
139
|
+
* Should be called after successful authentication.
|
|
140
|
+
*
|
|
141
|
+
* @param accountID - The unique ID from the database.
|
|
142
|
+
*/
|
|
143
|
+
linkAccount(accountID) {
|
|
144
|
+
this.session.accountID = accountID;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Checks if the player currently possesses a specific state flag.
|
|
148
|
+
*
|
|
149
|
+
* @param state - The unique string identifier of the state (e.g., 'dead', 'cuffed').
|
|
150
|
+
* @returns `true` if the state is active, `false` otherwise.
|
|
151
|
+
*/
|
|
152
|
+
hasState(state) {
|
|
153
|
+
return this.states.has(state);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Applies a state flag to the player.
|
|
157
|
+
*
|
|
158
|
+
* @remarks
|
|
159
|
+
* Since states are stored in a `Set`, adding an existing state has no effect (idempotent).
|
|
160
|
+
* Ideally, this should trigger a sync event to the client if needed.
|
|
161
|
+
*
|
|
162
|
+
* @param state - The state key to add.
|
|
163
|
+
*/
|
|
164
|
+
addState(state) {
|
|
165
|
+
this.states.add(state);
|
|
166
|
+
// this.emit('core:state:add', state) // ? optional !!
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Removes a specific state flag from the player.
|
|
170
|
+
*
|
|
171
|
+
* @param state - The state key to remove.
|
|
172
|
+
*/
|
|
173
|
+
removeState(state) {
|
|
174
|
+
this.states.delete(state);
|
|
175
|
+
// this.emit('core:state:remove', state) // ? optional !!
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Toggles the presence of a state flag.
|
|
179
|
+
*
|
|
180
|
+
* @param state - The state key to toggle.
|
|
181
|
+
* @param force - If provided, forces the state to be added (`true`) or removed (`false`) regardless of its current status.
|
|
182
|
+
*
|
|
183
|
+
* @returns The final status of the state (`true` if active, `false` if inactive).
|
|
184
|
+
*
|
|
185
|
+
* @example
|
|
186
|
+
* ```ts
|
|
187
|
+
* // Standard toggle
|
|
188
|
+
* player.toggleState('duty'); // turns on if off, off if on
|
|
189
|
+
*
|
|
190
|
+
* // Force enable (equivalent to addState but returns boolean)
|
|
191
|
+
* player.toggleState('duty', true); // always results in true
|
|
192
|
+
* ```
|
|
193
|
+
*/
|
|
194
|
+
toggleState(state, force) {
|
|
195
|
+
if (force !== undefined) {
|
|
196
|
+
force ? this.addState(state) : this.removeState(state);
|
|
197
|
+
return force;
|
|
198
|
+
}
|
|
199
|
+
if (this.hasState(state)) {
|
|
200
|
+
this.removeState(state);
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
this.addState(state);
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Retrieves a snapshot of all currently active state flags for this player.
|
|
210
|
+
*
|
|
211
|
+
* @returns An array containing all active state keys.
|
|
212
|
+
*/
|
|
213
|
+
getStates() {
|
|
214
|
+
return Array.from(this.states);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
exports.Player = Player;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleCommandError = handleCommandError;
|
|
4
|
+
const utils_1 = require("../utils");
|
|
5
|
+
const logger_1 = require("../shared/logger");
|
|
6
|
+
function normalizeError(error, origin) {
|
|
7
|
+
if ((0, utils_1.isAppError)(error)) {
|
|
8
|
+
return error;
|
|
9
|
+
}
|
|
10
|
+
if (error instanceof Error) {
|
|
11
|
+
return new utils_1.AppError('UNKNOWN', error.message, origin, { stack: error.stack });
|
|
12
|
+
}
|
|
13
|
+
return new utils_1.AppError('UNKNOWN', String(error), origin, { raw: error });
|
|
14
|
+
}
|
|
15
|
+
function handleCommandError(error, meta, playerId) {
|
|
16
|
+
const appError = normalizeError(error, 'server');
|
|
17
|
+
logger_1.loggers.command.error(`Command execution failed: /${meta.name}`, {
|
|
18
|
+
command: meta.name,
|
|
19
|
+
handler: meta.methodName,
|
|
20
|
+
playerId,
|
|
21
|
+
code: appError.code,
|
|
22
|
+
origin: appError.origin,
|
|
23
|
+
errorMessage: appError.message,
|
|
24
|
+
details: appError.details,
|
|
25
|
+
});
|
|
26
|
+
if (playerId !== null) {
|
|
27
|
+
switch (appError.code) {
|
|
28
|
+
case 'VALIDATION_ERROR':
|
|
29
|
+
case 'INSUFFICIENT_FUNDS':
|
|
30
|
+
case 'PERMISSION_DENIED':
|
|
31
|
+
case 'UNAUTHORIZED':
|
|
32
|
+
emitNet('chat:addMessage', playerId, {
|
|
33
|
+
args: ['^1Error', appError.message],
|
|
34
|
+
});
|
|
35
|
+
break;
|
|
36
|
+
default:
|
|
37
|
+
emitNet('chat:addMessage', playerId, {
|
|
38
|
+
args: ['^1Error', 'Ha ocurrido un error interno.'],
|
|
39
|
+
});
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './core';
|
|
2
|
+
export * from './decorators';
|
|
3
|
+
export * from './templates';
|
|
4
|
+
export * from './services';
|
|
5
|
+
export * from './entities';
|
|
6
|
+
export * from './configs';
|
|
7
|
+
export * from './setup';
|
|
8
|
+
export type * from './types/core-events';
|
|
9
|
+
import './controllers/command.controller';
|
|
10
|
+
import './controllers/chat.controller';
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
// Framework modules
|
|
18
|
+
__exportStar(require("./core"), exports);
|
|
19
|
+
__exportStar(require("./decorators"), exports);
|
|
20
|
+
__exportStar(require("./templates"), exports);
|
|
21
|
+
__exportStar(require("./services"), exports);
|
|
22
|
+
// Entities
|
|
23
|
+
__exportStar(require("./entities"), exports);
|
|
24
|
+
// Configs
|
|
25
|
+
__exportStar(require("./configs"), exports);
|
|
26
|
+
__exportStar(require("./setup"), exports);
|
|
27
|
+
// Controllers
|
|
28
|
+
require("./controllers/command.controller");
|
|
29
|
+
require("./controllers/chat.controller");
|
|
File without changes
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// import { di } from '../container'
|
|
3
|
+
// import { CommandService } from '../services/command.service'
|
|
4
|
+
// import { handleCommandError } from '../error-handler'
|
|
5
|
+
// export const exportsLoader = () => {
|
|
6
|
+
// const commandService = di.resolve(CommandService)
|
|
7
|
+
// exports('core:ExecuteCommand', async (src: number, name: string, args: string[], raw: string) => {
|
|
8
|
+
// try {
|
|
9
|
+
// await commandService.execute(Number(src), name, args, raw)
|
|
10
|
+
// return { ok: true }
|
|
11
|
+
// } catch (error) {
|
|
12
|
+
// handleCommandError(
|
|
13
|
+
// error,
|
|
14
|
+
// { name, methodName: 'ExportExecution', target: Object },
|
|
15
|
+
// Number(src),
|
|
16
|
+
// )
|
|
17
|
+
// return { ok: false }
|
|
18
|
+
// }
|
|
19
|
+
// })
|
|
20
|
+
// exports('core:GetCommands', () => {
|
|
21
|
+
// return commandService.getDefinitions()
|
|
22
|
+
// })
|
|
23
|
+
// }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const playerSessionLoader: () => void;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.playerSessionLoader = void 0;
|
|
4
|
+
const tsyringe_1 = require("tsyringe");
|
|
5
|
+
const player_service_1 = require("../services/player.service");
|
|
6
|
+
const persistence_service_1 = require("../services/persistence.service");
|
|
7
|
+
const core_event_bus_1 = require("../bus/core-event-bus");
|
|
8
|
+
const logger_1 = require("../../shared/logger");
|
|
9
|
+
const playerSessionLoader = () => {
|
|
10
|
+
const playerManager = tsyringe_1.container.resolve(player_service_1.PlayerService);
|
|
11
|
+
const persistenceService = tsyringe_1.container.resolve(persistence_service_1.PlayerPersistenceService);
|
|
12
|
+
// Initialize persistence service (resolves provider if configured)
|
|
13
|
+
persistenceService.initialize();
|
|
14
|
+
on('playerJoining', async (source) => {
|
|
15
|
+
var _a;
|
|
16
|
+
const clientId = Number(source);
|
|
17
|
+
const license = (_a = GetPlayerIdentifier(clientId.toString(), 0)) !== null && _a !== void 0 ? _a : undefined;
|
|
18
|
+
const player = playerManager.bind(clientId, { license });
|
|
19
|
+
logger_1.loggers.session.info(`Player session created`, {
|
|
20
|
+
clientId,
|
|
21
|
+
license: license !== null && license !== void 0 ? license : 'none',
|
|
22
|
+
});
|
|
23
|
+
// Load persisted data for the player
|
|
24
|
+
await persistenceService.handleSessionLoad(player);
|
|
25
|
+
(0, core_event_bus_1.emitCoreEvent)('core:playerSessionCreated', {
|
|
26
|
+
clientId,
|
|
27
|
+
license,
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
on('playerDropped', async () => {
|
|
31
|
+
const clientId = Number(global.source);
|
|
32
|
+
const player = playerManager.getByClient(clientId);
|
|
33
|
+
// Save player data before destroying session
|
|
34
|
+
if (player) {
|
|
35
|
+
await persistenceService.handleSessionSave(player);
|
|
36
|
+
}
|
|
37
|
+
playerManager.unbindByClient(clientId);
|
|
38
|
+
(0, core_event_bus_1.emitCoreEvent)('core:playerSessionDestroyed', { clientId });
|
|
39
|
+
logger_1.loggers.session.info(`Player session destroyed`, { clientId });
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
exports.playerSessionLoader = playerSessionLoader;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Server } from '../..';
|
|
2
|
+
import { PrincipalProviderContract } from '../templates';
|
|
3
|
+
/**
|
|
4
|
+
* **Core Security Service**
|
|
5
|
+
*
|
|
6
|
+
* This service acts as the central enforcement point for the Access Control system.
|
|
7
|
+
* It uses the configured `PrincipalProvider` to query roles and validates them against requirements.
|
|
8
|
+
*
|
|
9
|
+
* It is primarily used internally by the `@Guard` decorator, but can be injected
|
|
10
|
+
* into services to perform manual checks.
|
|
11
|
+
*/
|
|
12
|
+
export declare class AccessControlService {
|
|
13
|
+
private readonly principalProvider;
|
|
14
|
+
constructor(principalProvider: PrincipalProviderContract);
|
|
15
|
+
/**
|
|
16
|
+
* Verifies if a player meets a minimum numeric rank requirement.
|
|
17
|
+
*
|
|
18
|
+
* @param player - The target player.
|
|
19
|
+
* @param minRank - The minimum numeric value required (Inclusive).
|
|
20
|
+
*
|
|
21
|
+
* @returns `true` if `Principal.rank >= minRank`.
|
|
22
|
+
*
|
|
23
|
+
* @throws {AppError} code `UNAUTHORIZED` if the player has no Principal (not logged in).
|
|
24
|
+
* @throws {AppError} code `NO_RANK_IN_PRINCIPAL` if the Principal exists but has no `rank` defined.
|
|
25
|
+
*/
|
|
26
|
+
hasRank(player: Server.Player, minRank: number): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Verifies if a player possesses a specific permission string.
|
|
29
|
+
*
|
|
30
|
+
* @remarks
|
|
31
|
+
* This method supports the **Wildcard ('*')** permission. If the principal has `'*'`
|
|
32
|
+
* in their permissions array, this method always returns `true`.
|
|
33
|
+
*
|
|
34
|
+
* @param player - The target player.
|
|
35
|
+
* @param permission - The specific permission key (e.g., `'admin.ban'`).
|
|
36
|
+
* @returns `true` if the player has the permission or the wildcard.
|
|
37
|
+
*/
|
|
38
|
+
hasPermission(player: Server.Player, permission: string): Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* **Strict Enforcement**
|
|
41
|
+
*
|
|
42
|
+
* Validates a set of requirements against a player. If any requirement fails,
|
|
43
|
+
* it throws an exception, halting the execution flow.
|
|
44
|
+
*
|
|
45
|
+
* Used primarily by the `@Guard` decorator logic.
|
|
46
|
+
*
|
|
47
|
+
* @param player - The server player to validate.
|
|
48
|
+
* @param requirements - An object containing rank and/or permission constraints.
|
|
49
|
+
*
|
|
50
|
+
* @throws {AppError} code `PERMISSION_DENIED` if validation fails.
|
|
51
|
+
*/
|
|
52
|
+
enforce(player: Server.Player, requirements: {
|
|
53
|
+
minRank?: number;
|
|
54
|
+
permission?: string;
|
|
55
|
+
}): Promise<void>;
|
|
56
|
+
}
|