three-player-controller 0.3.6 → 0.3.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/README.md CHANGED
@@ -1,4 +1,4 @@
1
- [English](README_En.md)
1
+ 中文 | [English](README_En.md)
2
2
 
3
3
  # three-player-controller
4
4
 
@@ -8,7 +8,11 @@
8
8
 
9
9
  # 示例
10
10
 
11
- - [示例](https://hh-hang.github.io/three-player-controller/index.html)
11
+ - [glb 场景](https://hh-hang.github.io/three-player-controller/index.html)
12
+
13
+ - [3dtiles 场景](https://hh-hang.github.io/three-player-controller/3dtilesScene.html)
14
+
15
+ - [3dtiles 自定义](https://hh-hang.github.io/three-player-controller/3dtilesCustomize.html)
12
16
 
13
17
  ### 普通控制
14
18
 
@@ -82,7 +86,7 @@ await player.init({
82
86
  runAnim: "run", // Run 动画名
83
87
  jumpAnim: "jump", // Jump 动画名
84
88
  },
85
- initPos: new THREE.Vector3(0, 0, 0), // 初始位置
89
+ initPos: new THREE.Vector3(0, 0, 0),
86
90
  });
87
91
 
88
92
  // 加入车辆控制
@@ -117,33 +121,19 @@ player.update();
117
121
 
118
122
  ```ts
119
123
  export function playerController(): {
120
- // 初始化
121
124
  init: (opts: PlayerControllerOptions, callback?: () => void) => void;
122
- // 加载车辆模型
123
125
  loadVehicleModel: (params: VehicleOptions) => void;
124
- // 切换人物模型
125
126
  switchPlayerModel: (model: PlayerControllerOptions["playerModel"]) => void;
126
- // 切换第一/第三人称
127
127
  changeView: () => void;
128
- // 复位玩家位置
129
128
  reset: (pos?: THREE.Vector3) => void;
130
- // 每帧调用
131
129
  update: (dt?: number) => void;
132
- // 销毁控制器
133
130
  destroy: () => void;
134
- // 外部输入控制
135
131
  setInput: (input: PlayerInput) => void;
136
- // 获取人物当前位置
137
132
  getPosition: () => THREE.Vector3;
138
- // 获取屏幕中心射线与场景的交点
139
133
  getCenterScreenRaycastHit: () => THREE.Intersection | undefined;
140
- // 获取人物模型
141
134
  getPerson: () => THREE.Object3D | null;
142
- // 获取当前驾驶的车辆实例
143
135
  getActiveVehicle: () => VehicleInstance | null;
144
- // 获取所有车辆实例
145
136
  getAllVehicles: () => VehicleInstance[];
146
- // 动态参数调整
147
137
  setMouseSensitivity: (mouseSensity: number) => void;
148
138
  setGravity: (gravity: number) => void;
149
139
  setJumpHeight: (jumpHeight: number) => void;
@@ -156,6 +146,18 @@ export function playerController(): {
156
146
  setOverShoulderView: (enable: boolean) => void;
157
147
  setPlayerScale: (scale: number) => void;
158
148
  setDebug: (debug: boolean) => void;
149
+ getCurrentPersonAnimationName: () => string | null;
150
+ registerAnimation: (key: string, clipName: string, opts?: {
151
+ loop?: boolean;
152
+ timeScale?: number;
153
+ duration?: number;
154
+ clampWhenFinished?: boolean;
155
+ onFinished?: () => void;
156
+ }) => void;
157
+ playAnimation: (key: string, opts?: {
158
+ fade?: number;
159
+ force?: boolean;
160
+ }) => void;
159
161
  };
160
162
  ```
161
163
 
@@ -188,6 +190,9 @@ export function playerController(): {
188
190
  | `setOverShoulderView(v)` | 开启/关闭过肩视角偏移 |
189
191
  | `setPlayerScale(scale)` | 动态设置人物缩放,同步更新碰撞体与所有相关物理参数 |
190
192
  | `setDebug(v)` | 开启/关闭碰撞体调试显示 |
193
+ | `getCurrentPersonAnimationName()` | 获取当前正在播放的动画名称 |
194
+ | `registerAnimation(key, clipName, opts?)` | 注册一个自定义动画,之后可通过 `playAnimation` 播放 |
195
+ | `playAnimation(key, opts?)` | 播放已注册的自定义动画 |
191
196
 
192
197
  ---
193
198
 
@@ -211,15 +216,15 @@ export function offAllEvent(): void; // 关闭所有输入事件
211
216
 
212
217
  ```ts
213
218
  player.setInput({
214
- moveX: 1 | 0 | -1, // 横向移动:1 右,-1 左,0 停
215
- moveY: 1 | 0 | -1, // 纵向移动:1 前,-1 后,0 停
216
- lookDeltaX: number, // 视角横向偏移量
217
- lookDeltaY: number, // 视角纵向偏移量
218
- jump: boolean, // 跳跃
219
- shift: boolean, // 奔跑
220
- toggleView: boolean, // 切换第一/第三人称
221
- toggleFly: boolean, // 切换飞行模式
222
- toggleVehicle: boolean, // 上车/下车
219
+ moveX: 1 | 0 | -1, // 横向移动:1 右,-1 左,0 停
220
+ moveY: 1 | 0 | -1, // 纵向移动:1 前,-1 后,0 停
221
+ lookDeltaX: number, // 视角横向偏移量
222
+ lookDeltaY: number, // 视角纵向偏移量
223
+ jump: boolean, // 跳跃
224
+ shift: boolean, // 奔跑
225
+ toggleView: boolean, // 切换第一/第三人称
226
+ toggleFly: boolean, // 切换飞行模式
227
+ toggleVehicle: boolean, // 上车/下车
223
228
  });
224
229
  ```
225
230
 
@@ -255,6 +260,7 @@ type PlayerControllerOptions = {
255
260
  rotateY?: number;
256
261
  headObjName?: string;
257
262
  flyEnabled?: boolean;
263
+ capsuleRadiusRatio?: number;
258
264
  };
259
265
  initPos?: THREE.Vector3;
260
266
  mouseSensity?: number;
@@ -309,8 +315,8 @@ type PlayerControllerOptions = {
309
315
 
310
316
  | 值 | 行为 |
311
317
  |----|------|
312
- | `0` | 隐藏鼠标,鼠标同时控制朝向和视角 |
313
- | `1` | 隐藏鼠标,鼠标仅控制视角(默认) |
318
+ | `0` | 隐藏鼠标,同时控制朝向和视角 |
319
+ | `1` | 隐藏鼠标,仅控制视角(默认) |
314
320
  | `2` | 显示鼠标,拖拽控制朝向和视角 |
315
321
  | `3` | 显示鼠标,拖拽仅控制视角 |
316
322
 
@@ -354,6 +360,55 @@ type VehicleOptions = {
354
360
 
355
361
  ---
356
362
 
363
+ ---
364
+
365
+ ## 四、自定义动画
366
+
367
+ 除内置动画外,可在加载模型后注册并播放自定义动画片段。
368
+
369
+ ### registerAnimation
370
+
371
+ ```ts
372
+ player.registerAnimation(key, clipName, opts?)
373
+ ```
374
+
375
+ | 参数 | 类型 | 说明 |
376
+ |------|------|------|
377
+ | `key` | `string` | 动画标识符,之后通过此 key 播放 |
378
+ | `clipName` | `string` | GLB 模型内动画片段的原始名称 |
379
+ | `opts.loop` | `boolean` | 是否循环,默认 `true` |
380
+ | `opts.timeScale` | `number` | 播放速度倍率,默认 `1` |
381
+ | `opts.duration` | `number` | 指定播放时长(秒),会自动计算 timeScale,与 `timeScale` 二选一 |
382
+ | `opts.clampWhenFinished` | `boolean` | 单次播放结束后是否停在最后一帧,默认 `false` |
383
+ | `opts.onFinished` | `() => void` | 动画播放完毕回调(仅单次播放时有效) |
384
+
385
+ ### playAnimation
386
+
387
+ ```ts
388
+ player.playAnimation(key, opts?)
389
+ ```
390
+
391
+ | 参数 | 类型 | 说明 |
392
+ |------|------|------|
393
+ | `key` | `string` | 已注册的动画标识符 |
394
+ | `opts.fade` | `number` | 过渡时间(秒),默认 `0.18` |
395
+ | `opts.force` | `boolean` | 是否强制从头重播(即使当前已在播放该动画) |
396
+
397
+ **示例:**
398
+
399
+ ```ts
400
+ // 注册一个单次播放、播完回调的动画
401
+ player.registerAnimation("attack", "Attack_Clip", {
402
+ loop: false,
403
+ duration: 1.2,
404
+ clampWhenFinished: true,
405
+ onFinished: () => console.log("攻击结束"),
406
+ });
407
+
408
+ // 播放
409
+ player.playAnimation("attack", { force: true });
410
+ ```
411
+
357
412
  # 感谢
358
413
 
359
414
  [three-mesh-bvh](https://github.com/gkjohnson/three-mesh-bvh)
@@ -361,4 +416,4 @@ type VehicleOptions = {
361
416
  [three](https://github.com/mrdoob/three.js)
362
417
 
363
418
  [npm]: https://img.shields.io/npm/v/three-player-controller
364
- [npm-url]: https://www.npmjs.com/package/three-player-controller
419
+ [npm-url]: https://www.npmjs.com/package/three-player-controller
package/dist/index.d.mts CHANGED
@@ -1,93 +1,61 @@
1
- import { RigidBody } from '@dimforge/rapier3d-compat';
2
1
  import * as THREE from 'three';
3
- import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
2
+ import { RigidBody } from '@dimforge/rapier3d-compat';
4
3
 
5
- /**
6
- * 障碍物检测接口
7
- */
8
4
  interface ObstacleChecker {
9
- /**
10
- * 检查两点之间的线段是否被障碍物阻挡
11
- */
12
5
  isBlocked(start: THREE.Vector3, end: THREE.Vector3): boolean;
13
- /**
14
- * 获取障碍物周围的导航节点
15
- */
16
6
  getNavigationNodes(start: THREE.Vector3, goal: THREE.Vector3): THREE.Vector3[];
17
7
  }
18
- /**
19
- * 路径规划器配置
20
- */
21
8
  interface PathPlannerConfig {
22
9
  debugEnabled?: boolean;
23
10
  scene?: THREE.Scene;
24
11
  scale?: number;
25
12
  }
26
- /**
27
- * A*路径规划器
28
- */
29
13
  declare class PathPlanner {
30
- private obstacleChecker;
31
- private config;
32
- private debugLines;
33
- private debugPoints;
14
+ obstacleChecker: ObstacleChecker;
15
+ config: PathPlannerConfig;
16
+ debugLines: THREE.Line[];
17
+ debugPoints: THREE.Mesh[];
34
18
  constructor(obstacleChecker: ObstacleChecker, config?: PathPlannerConfig);
35
19
  private heuristic;
36
20
  findPath(start: THREE.Vector3, goal: THREE.Vector3): THREE.Vector3[];
37
- /**
38
- * 重建路径
39
- */
40
21
  private reconstructPath;
41
- /**
42
- * 路径平滑
43
- */
44
22
  private smoothPath;
45
- /**
46
- * 可视化路径
47
- */
48
23
  private visualizePath;
49
- /**
50
- * 清除路径可视化
51
- */
52
24
  clearVisualization(): void;
53
- /**
54
- * 更新配置
55
- */
56
25
  updateConfig(config: Partial<PathPlannerConfig>): void;
57
- /**
58
- * 销毁
59
- */
60
26
  dispose(): void;
61
27
  }
62
28
 
29
+ type PlayerModelOptions = {
30
+ url: string;
31
+ scale: number;
32
+ idleAnim: string;
33
+ walkAnim: string;
34
+ runAnim: string;
35
+ jumpAnim: string;
36
+ leftWalkAnim?: string;
37
+ rightWalkAnim?: string;
38
+ backwardAnim?: string;
39
+ flyAnim?: string;
40
+ flyIdleAnim?: string;
41
+ enterCarAnim?: string;
42
+ exitCarAnim?: string;
43
+ gravity?: number;
44
+ jumpHeight?: number;
45
+ speed?: number;
46
+ flySpeed?: number;
47
+ rotateY?: number;
48
+ headObjName?: string;
49
+ flyEnabled?: boolean;
50
+ capsuleRadiusRatio?: number;
51
+ };
63
52
  type PlayerControllerOptions = {
64
53
  scene: THREE.Scene;
65
54
  camera: THREE.PerspectiveCamera;
66
- controls: OrbitControls;
67
- playerModel: {
68
- url: string;
69
- idleAnim: string;
70
- walkAnim: string;
71
- runAnim: string;
72
- jumpAnim: string;
73
- leftWalkAnim?: string;
74
- rightWalkAnim?: string;
75
- backwardAnim?: string;
76
- flyAnim?: string;
77
- flyIdleAnim?: string;
78
- enterCarAnim?: string;
79
- exitCarAnim?: string;
80
- scale: number;
81
- gravity?: number;
82
- jumpHeight?: number;
83
- speed?: number;
84
- playerFlySpeed?: number;
85
- rotateY?: number;
86
- headObjName?: string;
87
- flyEnabled?: boolean;
88
- };
55
+ controls: any;
56
+ playerModel: PlayerModelOptions;
89
57
  initPos?: THREE.Vector3;
90
- mouseSensity?: number;
58
+ mouseSensitivity?: number;
91
59
  minCamDistance?: number;
92
60
  maxCamDistance?: number;
93
61
  colliderMeshUrl?: string;
@@ -134,35 +102,47 @@ type VehicleInstance = {
134
102
  };
135
103
  speedMultiplier: number;
136
104
  };
105
+
137
106
  declare function playerController(): {
138
- init: (opts: PlayerControllerOptions, callback?: () => void) => Promise<void>;
139
- loadVehicleModel: (params: VehicleOptions) => Promise<void>;
140
- changeView: () => void;
141
- reset: (pos?: THREE.Vector3) => void;
107
+ init: (opts: PlayerControllerOptions, cb?: () => void) => Promise<void>;
108
+ loadVehicleModel: (opts: VehicleOptions) => Promise<void>;
142
109
  update: (dt?: number) => Promise<void>;
143
110
  destroy: () => void;
111
+ reset: (pos?: THREE.Vector3) => void;
144
112
  setInput: (i: any) => void;
113
+ changeView: () => void;
145
114
  getPosition: () => THREE.Vector3;
146
115
  getCenterScreenRaycastHit: () => THREE.Intersection<THREE.Object3D<THREE.Object3DEventMap>>;
116
+ getCurrentPersonAnimationName: () => string;
147
117
  getPerson: () => THREE.Object3D<THREE.Object3DEventMap>;
148
118
  getActiveVehicle: () => VehicleInstance;
149
119
  getAllVehicles: () => VehicleInstance[];
150
- switchPlayerModel: (model: PlayerControllerOptions["playerModel"]) => Promise<void>;
151
- setMouseSensitivity: (mouseSensity: number) => void;
152
- setGravity: (gravity: number) => void;
153
- setJumpHeight: (jumpHeight: number) => void;
154
- setPlayerSpeed: (playerSpeed: number) => void;
155
- setPlayerFlySpeed: (playerFlySpeed: number) => void;
156
- setMinCamDistance: (minCamDistance: number) => void;
157
- setMaxCamDistance: (maxCamDistance: number) => void;
158
- setThirdMouseMode: (thirdMouseMode: 0 | 1 | 2 | 3) => void;
159
- setEnableZoom: (enableZoom: boolean) => void;
160
- setDebug: (debug: boolean) => void;
161
- setOverShoulderView: (enable: boolean) => void;
120
+ switchPlayerModel: (model: PlayerModelOptions) => Promise<void>;
162
121
  setPlayerScale: (scale: number) => void;
122
+ setMouseSensitivity: (v: number) => void;
123
+ setGravity: (v: number) => void;
124
+ setJumpHeight: (v: number) => void;
125
+ setPlayerSpeed: (v: number) => void;
126
+ setPlayerFlySpeed: (v: number) => void;
127
+ setMinCamDistance: (v: number) => void;
128
+ setMaxCamDistance: (v: number) => void;
129
+ setThirdMouseMode: (v: 0 | 1 | 2 | 3) => void;
130
+ setEnableZoom: (v: boolean) => void;
131
+ setDebug: (v: boolean) => void;
132
+ setOverShoulderView: (v: boolean) => void;
133
+ registerAnimation: (key: string, clipName: string, opts?: {
134
+ loop?: boolean;
135
+ timeScale?: number;
136
+ clampWhenFinished?: boolean;
137
+ onFinished?: () => void;
138
+ }) => void;
139
+ playAnimation: (key: string, opts?: {
140
+ fade?: number;
141
+ force?: boolean;
142
+ }) => void;
163
143
  };
164
144
  type playerController = ReturnType<typeof playerController>;
165
145
  declare function onAllEvent(): void;
166
146
  declare function offAllEvent(): void;
167
147
 
168
- export { type PlayerControllerOptions, type VehicleInstance, type VehicleOptions, offAllEvent, onAllEvent, playerController };
148
+ export { type PlayerControllerOptions, type PlayerModelOptions, type VehicleInstance, type VehicleOptions, offAllEvent, onAllEvent, playerController };
package/dist/index.d.ts CHANGED
@@ -1,93 +1,61 @@
1
- import { RigidBody } from '@dimforge/rapier3d-compat';
2
1
  import * as THREE from 'three';
3
- import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
2
+ import { RigidBody } from '@dimforge/rapier3d-compat';
4
3
 
5
- /**
6
- * 障碍物检测接口
7
- */
8
4
  interface ObstacleChecker {
9
- /**
10
- * 检查两点之间的线段是否被障碍物阻挡
11
- */
12
5
  isBlocked(start: THREE.Vector3, end: THREE.Vector3): boolean;
13
- /**
14
- * 获取障碍物周围的导航节点
15
- */
16
6
  getNavigationNodes(start: THREE.Vector3, goal: THREE.Vector3): THREE.Vector3[];
17
7
  }
18
- /**
19
- * 路径规划器配置
20
- */
21
8
  interface PathPlannerConfig {
22
9
  debugEnabled?: boolean;
23
10
  scene?: THREE.Scene;
24
11
  scale?: number;
25
12
  }
26
- /**
27
- * A*路径规划器
28
- */
29
13
  declare class PathPlanner {
30
- private obstacleChecker;
31
- private config;
32
- private debugLines;
33
- private debugPoints;
14
+ obstacleChecker: ObstacleChecker;
15
+ config: PathPlannerConfig;
16
+ debugLines: THREE.Line[];
17
+ debugPoints: THREE.Mesh[];
34
18
  constructor(obstacleChecker: ObstacleChecker, config?: PathPlannerConfig);
35
19
  private heuristic;
36
20
  findPath(start: THREE.Vector3, goal: THREE.Vector3): THREE.Vector3[];
37
- /**
38
- * 重建路径
39
- */
40
21
  private reconstructPath;
41
- /**
42
- * 路径平滑
43
- */
44
22
  private smoothPath;
45
- /**
46
- * 可视化路径
47
- */
48
23
  private visualizePath;
49
- /**
50
- * 清除路径可视化
51
- */
52
24
  clearVisualization(): void;
53
- /**
54
- * 更新配置
55
- */
56
25
  updateConfig(config: Partial<PathPlannerConfig>): void;
57
- /**
58
- * 销毁
59
- */
60
26
  dispose(): void;
61
27
  }
62
28
 
29
+ type PlayerModelOptions = {
30
+ url: string;
31
+ scale: number;
32
+ idleAnim: string;
33
+ walkAnim: string;
34
+ runAnim: string;
35
+ jumpAnim: string;
36
+ leftWalkAnim?: string;
37
+ rightWalkAnim?: string;
38
+ backwardAnim?: string;
39
+ flyAnim?: string;
40
+ flyIdleAnim?: string;
41
+ enterCarAnim?: string;
42
+ exitCarAnim?: string;
43
+ gravity?: number;
44
+ jumpHeight?: number;
45
+ speed?: number;
46
+ flySpeed?: number;
47
+ rotateY?: number;
48
+ headObjName?: string;
49
+ flyEnabled?: boolean;
50
+ capsuleRadiusRatio?: number;
51
+ };
63
52
  type PlayerControllerOptions = {
64
53
  scene: THREE.Scene;
65
54
  camera: THREE.PerspectiveCamera;
66
- controls: OrbitControls;
67
- playerModel: {
68
- url: string;
69
- idleAnim: string;
70
- walkAnim: string;
71
- runAnim: string;
72
- jumpAnim: string;
73
- leftWalkAnim?: string;
74
- rightWalkAnim?: string;
75
- backwardAnim?: string;
76
- flyAnim?: string;
77
- flyIdleAnim?: string;
78
- enterCarAnim?: string;
79
- exitCarAnim?: string;
80
- scale: number;
81
- gravity?: number;
82
- jumpHeight?: number;
83
- speed?: number;
84
- playerFlySpeed?: number;
85
- rotateY?: number;
86
- headObjName?: string;
87
- flyEnabled?: boolean;
88
- };
55
+ controls: any;
56
+ playerModel: PlayerModelOptions;
89
57
  initPos?: THREE.Vector3;
90
- mouseSensity?: number;
58
+ mouseSensitivity?: number;
91
59
  minCamDistance?: number;
92
60
  maxCamDistance?: number;
93
61
  colliderMeshUrl?: string;
@@ -134,35 +102,47 @@ type VehicleInstance = {
134
102
  };
135
103
  speedMultiplier: number;
136
104
  };
105
+
137
106
  declare function playerController(): {
138
- init: (opts: PlayerControllerOptions, callback?: () => void) => Promise<void>;
139
- loadVehicleModel: (params: VehicleOptions) => Promise<void>;
140
- changeView: () => void;
141
- reset: (pos?: THREE.Vector3) => void;
107
+ init: (opts: PlayerControllerOptions, cb?: () => void) => Promise<void>;
108
+ loadVehicleModel: (opts: VehicleOptions) => Promise<void>;
142
109
  update: (dt?: number) => Promise<void>;
143
110
  destroy: () => void;
111
+ reset: (pos?: THREE.Vector3) => void;
144
112
  setInput: (i: any) => void;
113
+ changeView: () => void;
145
114
  getPosition: () => THREE.Vector3;
146
115
  getCenterScreenRaycastHit: () => THREE.Intersection<THREE.Object3D<THREE.Object3DEventMap>>;
116
+ getCurrentPersonAnimationName: () => string;
147
117
  getPerson: () => THREE.Object3D<THREE.Object3DEventMap>;
148
118
  getActiveVehicle: () => VehicleInstance;
149
119
  getAllVehicles: () => VehicleInstance[];
150
- switchPlayerModel: (model: PlayerControllerOptions["playerModel"]) => Promise<void>;
151
- setMouseSensitivity: (mouseSensity: number) => void;
152
- setGravity: (gravity: number) => void;
153
- setJumpHeight: (jumpHeight: number) => void;
154
- setPlayerSpeed: (playerSpeed: number) => void;
155
- setPlayerFlySpeed: (playerFlySpeed: number) => void;
156
- setMinCamDistance: (minCamDistance: number) => void;
157
- setMaxCamDistance: (maxCamDistance: number) => void;
158
- setThirdMouseMode: (thirdMouseMode: 0 | 1 | 2 | 3) => void;
159
- setEnableZoom: (enableZoom: boolean) => void;
160
- setDebug: (debug: boolean) => void;
161
- setOverShoulderView: (enable: boolean) => void;
120
+ switchPlayerModel: (model: PlayerModelOptions) => Promise<void>;
162
121
  setPlayerScale: (scale: number) => void;
122
+ setMouseSensitivity: (v: number) => void;
123
+ setGravity: (v: number) => void;
124
+ setJumpHeight: (v: number) => void;
125
+ setPlayerSpeed: (v: number) => void;
126
+ setPlayerFlySpeed: (v: number) => void;
127
+ setMinCamDistance: (v: number) => void;
128
+ setMaxCamDistance: (v: number) => void;
129
+ setThirdMouseMode: (v: 0 | 1 | 2 | 3) => void;
130
+ setEnableZoom: (v: boolean) => void;
131
+ setDebug: (v: boolean) => void;
132
+ setOverShoulderView: (v: boolean) => void;
133
+ registerAnimation: (key: string, clipName: string, opts?: {
134
+ loop?: boolean;
135
+ timeScale?: number;
136
+ clampWhenFinished?: boolean;
137
+ onFinished?: () => void;
138
+ }) => void;
139
+ playAnimation: (key: string, opts?: {
140
+ fade?: number;
141
+ force?: boolean;
142
+ }) => void;
163
143
  };
164
144
  type playerController = ReturnType<typeof playerController>;
165
145
  declare function onAllEvent(): void;
166
146
  declare function offAllEvent(): void;
167
147
 
168
- export { type PlayerControllerOptions, type VehicleInstance, type VehicleOptions, offAllEvent, onAllEvent, playerController };
148
+ export { type PlayerControllerOptions, type PlayerModelOptions, type VehicleInstance, type VehicleOptions, offAllEvent, onAllEvent, playerController };