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
|
|
76
|
+
emit: typeof emitGameEvent;
|
|
70
77
|
/**
|
|
71
78
|
* Subscribe to an event type
|
|
72
79
|
* @returns Unsubscribe function
|
|
73
80
|
*/
|
|
74
|
-
on
|
|
81
|
+
on: typeof onGameEvent;
|
|
75
82
|
/**
|
|
76
83
|
* Unsubscribe from an event type
|
|
77
84
|
*/
|
|
78
|
-
off
|
|
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
|
-
*
|
|
107
|
+
* const cause = typeof payload.cause === 'string' ? payload.cause : 'unknown';
|
|
108
|
+
* showGameOver(cause);
|
|
101
109
|
* }, []);
|
|
102
110
|
*/
|
|
103
|
-
export declare function useGameEvent<
|
|
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
|
|
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
|
|
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
|
|
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
|
|
80
|
-
*
|
|
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
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|