react-three-game 0.0.81 → 0.0.83

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/index.d.ts CHANGED
@@ -26,10 +26,11 @@ export type { Component, ComponentViewProps } from './tools/prefabeditor/compone
26
26
  export type { FieldDefinition, FieldType } from './tools/prefabeditor/components/Input';
27
27
  export type { Prefab, GameObject, ComponentData } from './tools/prefabeditor/types';
28
28
  export { findComponent, findComponentEntry, hasComponent } from './tools/prefabeditor/types';
29
- export { gameEvents, useGameEvent, getEntityIdFromRigidBody } from './tools/prefabeditor/GameEvents';
29
+ export { gameEvents, useGameEvent, usePhysicsEvent, useClickEvent, getEntityIdFromRigidBody } from './tools/prefabeditor/GameEvents';
30
30
  export type { GameEventType, GameEventMap, GameEventPayload, PhysicsEventType, InteractionEventType, PhysicsEventPayload, ClickEventPayload } from './tools/prefabeditor/GameEvents';
31
31
  export { loadFiles } from './tools/dragdrop/DragDropLoader';
32
32
  export type { AssetLoadOptions } from './tools/dragdrop/DragDropLoader';
33
33
  export { loadModel, loadSound, loadTexture } from './tools/dragdrop/modelLoader';
34
34
  export type { LoadedModel, LoadedModels, ModelLoadResult, LoadedSound, LoadedSounds, SoundLoadResult, LoadedTexture, LoadedTextures, TextureLoadResult, ProgressCallback, } from './tools/dragdrop/modelLoader';
35
35
  export { ModelListViewer, SoundListViewer, ModelPicker, SoundPicker, TextureListViewer, TexturePicker, SingleModelViewer, SingleSoundViewer, SingleTextureViewer, SharedCanvas, } from './tools/assetviewer/page';
36
+ export type { PrefabRootRef } from './tools/prefabeditor/PrefabRoot';
package/dist/index.js CHANGED
@@ -22,7 +22,7 @@ export { createModelNode, createImageNode, } from './tools/prefabeditor/prefab';
22
22
  export { useAssetRuntime, useEntityRuntime, useEntityObjectRef, useEntityRigidBodyRef } from './tools/prefabeditor/runtimeContext';
23
23
  export { findComponent, findComponentEntry, hasComponent } from './tools/prefabeditor/types';
24
24
  // Game Events (physics + custom events)
25
- export { gameEvents, useGameEvent, getEntityIdFromRigidBody } from './tools/prefabeditor/GameEvents';
25
+ export { gameEvents, useGameEvent, usePhysicsEvent, useClickEvent, getEntityIdFromRigidBody } from './tools/prefabeditor/GameEvents';
26
26
  // Asset Loading
27
27
  export { loadFiles } from './tools/dragdrop/DragDropLoader';
28
28
  export { loadModel, loadSound, loadTexture } from './tools/dragdrop/modelLoader';
@@ -40,6 +40,13 @@ export type GameEventType = keyof GameEventMap | (string & {});
40
40
  /** Get payload type for an event, or fallback to generic */
41
41
  export type GameEventPayload<T extends string> = T extends keyof GameEventMap ? GameEventMap[T] : Record<string, unknown>;
42
42
  type EventHandler<T = unknown> = (payload: T) => void;
43
+ type UnknownEventPayload = Record<string, unknown>;
44
+ declare function emitGameEvent<TType extends keyof GameEventMap>(type: TType, payload: GameEventMap[TType]): void;
45
+ declare function emitGameEvent(type: string, payload: UnknownEventPayload): void;
46
+ declare function onGameEvent<TType extends keyof GameEventMap>(type: TType, handler: EventHandler<GameEventMap[TType]>): () => void;
47
+ declare function onGameEvent(type: string, handler: EventHandler<UnknownEventPayload>): () => void;
48
+ declare function offGameEvent<TType extends keyof GameEventMap>(type: TType, handler: EventHandler<GameEventMap[TType]>): void;
49
+ declare function offGameEvent(type: string, handler: EventHandler<UnknownEventPayload>): void;
43
50
  /**
44
51
  * Game event system for all game interactions.
45
52
  *
@@ -66,16 +73,16 @@ export declare const gameEvents: {
66
73
  /**
67
74
  * Emit an event to all subscribers
68
75
  */
69
- emit<T extends string>(type: T, payload: GameEventPayload<T>): void;
76
+ emit: typeof emitGameEvent;
70
77
  /**
71
78
  * Subscribe to an event type
72
79
  * @returns Unsubscribe function
73
80
  */
74
- on<T extends string>(type: T, handler: EventHandler<GameEventPayload<T>>): () => void;
81
+ on: typeof onGameEvent;
75
82
  /**
76
83
  * Unsubscribe from an event type
77
84
  */
78
- off<T extends string>(type: T, handler: EventHandler<GameEventPayload<T>>): void;
85
+ off: typeof offGameEvent;
79
86
  /**
80
87
  * Remove all subscribers (useful for cleanup/reset)
81
88
  */
@@ -97,10 +104,22 @@ export declare const gameEvents: {
97
104
  *
98
105
  * // Custom event
99
106
  * useGameEvent('player:death', (payload) => {
100
- * showGameOver(payload.cause);
107
+ * const cause = typeof payload.cause === 'string' ? payload.cause : 'unknown';
108
+ * showGameOver(cause);
101
109
  * }, []);
102
110
  */
103
- export declare function useGameEvent<T extends string>(type: T, handler: EventHandler<GameEventPayload<T>>, deps?: unknown[]): void;
111
+ export declare function useGameEvent<TType extends keyof GameEventMap>(type: TType, handler: EventHandler<GameEventMap[TType]>, deps?: unknown[]): void;
112
+ export declare function useGameEvent(type: string, handler: EventHandler<UnknownEventPayload>, deps?: unknown[]): void;
113
+ /**
114
+ * React hook to subscribe to any physics event payload.
115
+ * Use this when the event name is dynamic but the payload comes from PhysicsComponent.
116
+ */
117
+ export declare function usePhysicsEvent(type: string, handler: EventHandler<PhysicsEventPayload>, deps?: unknown[]): void;
118
+ /**
119
+ * React hook to subscribe to click event payloads.
120
+ * Use this when the event name is dynamic but the payload comes from ClickComponent.
121
+ */
122
+ export declare function useClickEvent(type: string, handler: EventHandler<ClickEventPayload>, deps?: unknown[]): void;
104
123
  /**
105
124
  * Helper to extract entity ID from Rapier collision data.
106
125
  * Entity IDs are stored in RigidBody userData.
@@ -1,6 +1,40 @@
1
1
  import { useEffect, useCallback } from 'react';
2
2
  // Internal subscriber storage
3
3
  const subscribers = new Map();
4
+ function emitGameEvent(type, payload) {
5
+ const handlers = subscribers.get(type);
6
+ if (handlers) {
7
+ handlers.forEach(handler => {
8
+ try {
9
+ handler(payload);
10
+ }
11
+ catch (e) {
12
+ console.error(`Error in gameEvents handler for ${type}:`, e);
13
+ }
14
+ });
15
+ }
16
+ }
17
+ function onGameEvent(type, handler) {
18
+ if (!subscribers.has(type)) {
19
+ subscribers.set(type, new Set());
20
+ }
21
+ subscribers.get(type).add(handler);
22
+ return () => {
23
+ var _a;
24
+ (_a = subscribers.get(type)) === null || _a === void 0 ? void 0 : _a.delete(handler);
25
+ };
26
+ }
27
+ function offGameEvent(type, handler) {
28
+ var _a;
29
+ (_a = subscribers.get(type)) === null || _a === void 0 ? void 0 : _a.delete(handler);
30
+ }
31
+ function useTypedGameEvent(type, handler, deps = []) {
32
+ // eslint-disable-next-line react-hooks/exhaustive-deps
33
+ const stableHandler = useCallback(handler, deps);
34
+ useEffect(() => {
35
+ return onGameEvent(type, stableHandler);
36
+ }, [type, stableHandler]);
37
+ }
4
38
  /**
5
39
  * Game event system for all game interactions.
6
40
  *
@@ -27,40 +61,16 @@ export const gameEvents = {
27
61
  /**
28
62
  * Emit an event to all subscribers
29
63
  */
30
- emit(type, payload) {
31
- const handlers = subscribers.get(type);
32
- if (handlers) {
33
- handlers.forEach(handler => {
34
- try {
35
- handler(payload);
36
- }
37
- catch (e) {
38
- console.error(`Error in gameEvents handler for ${type}:`, e);
39
- }
40
- });
41
- }
42
- },
64
+ emit: emitGameEvent,
43
65
  /**
44
66
  * Subscribe to an event type
45
67
  * @returns Unsubscribe function
46
68
  */
47
- on(type, handler) {
48
- if (!subscribers.has(type)) {
49
- subscribers.set(type, new Set());
50
- }
51
- subscribers.get(type).add(handler);
52
- return () => {
53
- var _a;
54
- (_a = subscribers.get(type)) === null || _a === void 0 ? void 0 : _a.delete(handler);
55
- };
56
- },
69
+ on: onGameEvent,
57
70
  /**
58
71
  * Unsubscribe from an event type
59
72
  */
60
- off(type, handler) {
61
- var _a;
62
- (_a = subscribers.get(type)) === null || _a === void 0 ? void 0 : _a.delete(handler);
63
- },
73
+ off: offGameEvent,
64
74
  /**
65
75
  * Remove all subscribers (useful for cleanup/reset)
66
76
  */
@@ -75,27 +85,22 @@ export const gameEvents = {
75
85
  return ((_b = (_a = subscribers.get(type)) === null || _a === void 0 ? void 0 : _a.size) !== null && _b !== void 0 ? _b : 0) > 0;
76
86
  }
77
87
  };
88
+ export function useGameEvent(type, handler, deps = []) {
89
+ useTypedGameEvent(type, handler, deps);
90
+ }
78
91
  /**
79
- * React hook to subscribe to game events.
80
- * Automatically cleans up on unmount.
81
- *
82
- * @example
83
- * // Physics event
84
- * useGameEvent('sensor:enter', (payload) => {
85
- * if (payload.sourceEntityId === 'coin') collectCoin();
86
- * }, []);
87
- *
88
- * // Custom event
89
- * useGameEvent('player:death', (payload) => {
90
- * showGameOver(payload.cause);
91
- * }, []);
92
+ * React hook to subscribe to any physics event payload.
93
+ * Use this when the event name is dynamic but the payload comes from PhysicsComponent.
92
94
  */
93
- export function useGameEvent(type, handler, deps = []) {
94
- // eslint-disable-next-line react-hooks/exhaustive-deps
95
- const stableHandler = useCallback(handler, deps);
96
- useEffect(() => {
97
- return gameEvents.on(type, stableHandler);
98
- }, [type, stableHandler]);
95
+ export function usePhysicsEvent(type, handler, deps = []) {
96
+ useTypedGameEvent(type, handler, deps);
97
+ }
98
+ /**
99
+ * React hook to subscribe to click event payloads.
100
+ * Use this when the event name is dynamic but the payload comes from ClickComponent.
101
+ */
102
+ export function useClickEvent(type, handler, deps = []) {
103
+ useTypedGameEvent(type, handler, deps);
99
104
  }
100
105
  // ============================================================================
101
106
  // Helpers
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-three-game",
3
- "version": "0.0.81",
3
+ "version": "0.0.83",
4
4
  "description": "high performance 3D game engine built in React",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",