@open-core/framework 0.2.1-beta.1 → 0.2.2-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/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # OpenCore Framework (v0.2.1-beta.1)
1
+ # OpenCore Framework (v0.2.2-beta.1)
2
2
 
3
3
  OpenCore is a TypeScript multiplayer runtime framework targeting FiveM via an adapter.
4
4
 
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { ClassConstructor } from '../../../kernel/di/class-constructor';
3
+ import { Player } from '../entities/player';
3
4
  import { SecurityMetadata } from '../types/core-exports';
4
5
  export interface CommandConfig {
5
6
  /**
@@ -34,6 +35,7 @@ export interface CommandMetadata extends CommandConfig {
34
35
  /** Security metadata for remote validation */
35
36
  security?: SecurityMetadata;
36
37
  }
38
+ type ServerCommandHandler = (() => any) | ((player: Player, ...args: any[]) => any);
37
39
  /**
38
40
  * Registers a method as a chat command.
39
41
  *
@@ -76,6 +78,7 @@ export interface CommandMetadata extends CommandConfig {
76
78
  * }
77
79
  * ```
78
80
  */
79
- export declare function Command(name: string, schema: z.ZodType): MethodDecorator;
80
- export declare function Command(name: string): MethodDecorator;
81
- export declare function Command(config: CommandConfig): MethodDecorator;
81
+ export declare function Command(name: string, schema: z.ZodType): <T extends ServerCommandHandler>(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<T>) => void;
82
+ export declare function Command(name: string): <T extends ServerCommandHandler>(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<T>) => void;
83
+ export declare function Command(config: CommandConfig): <T extends ServerCommandHandler>(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<T>) => void;
84
+ export {};
@@ -1,4 +1,5 @@
1
1
  import { z } from 'zod';
2
+ import { Player } from '../entities/player';
2
3
  export interface NetEventOptions {
3
4
  /**
4
5
  * The network event name to register.
@@ -15,6 +16,7 @@ export interface NetEventOptions {
15
16
  */
16
17
  paramTypes: any;
17
18
  }
19
+ type ServerNetHandler<TArgs extends any[] = any[]> = (player: Player, ...args: TArgs) => any;
18
20
  /**
19
21
  * Registers a method as a server-side network event handler.
20
22
  *
@@ -58,5 +60,6 @@ export interface NetEventOptions {
58
60
  * }
59
61
  * ```
60
62
  */
61
- export declare function OnNet<_TArgs extends any[]>(eventName: string, schema: z.ZodType): MethodDecorator;
62
- export declare function OnNet<_TArgs extends any[]>(eventName: string, options?: Pick<NetEventOptions, 'schema'>): MethodDecorator;
63
+ export declare function OnNet<TArgs extends any[]>(eventName: string, schema: z.ZodType): <H extends ServerNetHandler<TArgs>>(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<H>) => void;
64
+ export declare function OnNet<TArgs extends any[]>(eventName: string, options?: Pick<NetEventOptions, 'schema'>): <H extends ServerNetHandler<TArgs>>(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<H>) => void;
65
+ export {};
@@ -1,5 +1,6 @@
1
1
  import { Server } from '../../..';
2
2
  import { RGB } from '../../../kernel/utils';
3
+ import { PlayerDirectoryPort } from './ports/player-directory.port';
3
4
  /**
4
5
  * Service for sending chat messages to players.
5
6
  *
@@ -7,6 +8,8 @@ import { RGB } from '../../../kernel/utils';
7
8
  * This service emits framework chat events over the network.
8
9
  */
9
10
  export declare class ChatService {
11
+ private readonly playerDirectory;
12
+ constructor(playerDirectory: PlayerDirectoryPort);
10
13
  /**
11
14
  * Broadcast a chat message to all connected players.
12
15
  *
@@ -30,4 +33,34 @@ export declare class ChatService {
30
33
  * @param player - Target player.
31
34
  */
32
35
  clearChat(player: Server.Player): void;
36
+ /**
37
+ * Send a chat message to multiple players.
38
+ *
39
+ * @param players - Array of target players or their client IDs.
40
+ * @param message - Message body.
41
+ * @param author - Author label.
42
+ * @param color - Message color (RGB).
43
+ */
44
+ sendMany(players: (Server.Player | number)[], message: string, author?: string, color?: RGB): void;
45
+ /**
46
+ * Send a chat message to players within a certain radius of a specific player.
47
+ *
48
+ * @param playerFrom - Origin player.
49
+ * @param message - Message body.
50
+ * @param radius - Distance radius in game units.
51
+ * @param author - Author label.
52
+ * @param color - Message color (RGB).
53
+ */
54
+ sendNearby(playerFrom: Server.Player, message: string, radius: number, author?: string, color?: RGB): void;
55
+ /**
56
+ * Broadcast a system message to all players.
57
+ *
58
+ * @param message - Message body.
59
+ * @param color - Message color (RGB). Defaults to a light blue/cyan.
60
+ */
61
+ broadcastSystem(message: string, color?: RGB): void;
62
+ /**
63
+ * Clear chat for all connected players.
64
+ */
65
+ clearChatAll(): void;
33
66
  }
@@ -5,9 +5,13 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
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
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
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
+ };
8
11
  Object.defineProperty(exports, "__esModule", { value: true });
9
12
  exports.ChatService = void 0;
10
13
  const tsyringe_1 = require("tsyringe");
14
+ const player_directory_port_1 = require("./ports/player-directory.port");
11
15
  /**
12
16
  * Service for sending chat messages to players.
13
17
  *
@@ -15,6 +19,9 @@ const tsyringe_1 = require("tsyringe");
15
19
  * This service emits framework chat events over the network.
16
20
  */
17
21
  let ChatService = class ChatService {
22
+ constructor(playerDirectory) {
23
+ this.playerDirectory = playerDirectory;
24
+ }
18
25
  /**
19
26
  * Broadcast a chat message to all connected players.
20
27
  *
@@ -50,8 +57,67 @@ let ChatService = class ChatService {
50
57
  clearChat(player) {
51
58
  emitNet('core:chat:clear', player.clientID);
52
59
  }
60
+ /**
61
+ * Send a chat message to multiple players.
62
+ *
63
+ * @param players - Array of target players or their client IDs.
64
+ * @param message - Message body.
65
+ * @param author - Author label.
66
+ * @param color - Message color (RGB).
67
+ */
68
+ sendMany(players, message, author = 'SYSTEM', color = { r: 255, g: 255, b: 255 }) {
69
+ players.forEach((p) => {
70
+ const targetId = typeof p === 'number' ? p : p.clientID;
71
+ emitNet('core:chat:addMessage', targetId, {
72
+ args: [author, message],
73
+ color: color,
74
+ });
75
+ });
76
+ }
77
+ /**
78
+ * Send a chat message to players within a certain radius of a specific player.
79
+ *
80
+ * @param playerFrom - Origin player.
81
+ * @param message - Message body.
82
+ * @param radius - Distance radius in game units.
83
+ * @param author - Author label.
84
+ * @param color - Message color (RGB).
85
+ */
86
+ sendNearby(playerFrom, message, radius, author = playerFrom.name, color = { r: 255, g: 255, b: 255 }) {
87
+ const originPos = playerFrom.getPosition();
88
+ if (!originPos)
89
+ return;
90
+ const allPlayers = this.playerDirectory.getAll();
91
+ const nearbyPlayers = allPlayers.filter((p) => {
92
+ const pos = p.getPosition();
93
+ if (!pos)
94
+ return false;
95
+ const dx = originPos.x - pos.x;
96
+ const dy = originPos.y - pos.y;
97
+ const dz = originPos.z - pos.z;
98
+ const distance = Math.sqrt(dx * dx + dy * dy + dz * dz);
99
+ return distance <= radius;
100
+ });
101
+ this.sendMany(nearbyPlayers, message, author, color);
102
+ }
103
+ /**
104
+ * Broadcast a system message to all players.
105
+ *
106
+ * @param message - Message body.
107
+ * @param color - Message color (RGB). Defaults to a light blue/cyan.
108
+ */
109
+ broadcastSystem(message, color = { r: 0, g: 191, b: 255 }) {
110
+ this.broadcast(message, 'SYSTEM', color);
111
+ }
112
+ /**
113
+ * Clear chat for all connected players.
114
+ */
115
+ clearChatAll() {
116
+ emitNet('core:chat:clear', -1);
117
+ }
53
118
  };
54
119
  exports.ChatService = ChatService;
55
120
  exports.ChatService = ChatService = __decorate([
56
- (0, tsyringe_1.injectable)()
121
+ (0, tsyringe_1.injectable)(),
122
+ __metadata("design:paramtypes", [player_directory_port_1.PlayerDirectoryPort])
57
123
  ], ChatService);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-core/framework",
3
- "version": "0.2.1-beta.1",
3
+ "version": "0.2.2-beta.1",
4
4
  "description": "Secure, Event-Driven, OOP Engine for FiveM. Stop scripting, start engineering.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -47,6 +47,7 @@
47
47
  "./package.json": "./package.json"
48
48
  },
49
49
  "scripts": {
50
+ "publish": "pnpm build && npm publish",
50
51
  "build": "tsc -p tsconfig.build.json",
51
52
  "watch": "tsc -p tsconfig.build.json --watch",
52
53
  "check": "biome check .",