@directivegames/genesys.sdk 3.2.2 → 3.2.4

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.
Files changed (82) hide show
  1. package/README.md +60 -60
  2. package/dist/src/core/cli.js +22 -22
  3. package/dist/src/templates/scripts/genesys/genesys-mcp.js +25 -25
  4. package/dist/src/templates/scripts/genesys/mcp/editor-functions.js +4 -4
  5. package/dist/src/templates/src/templates/vehicle/src/ui-hints.js +30 -30
  6. package/package.json +176 -176
  7. package/scripts/post-install.ts +143 -143
  8. package/src/asset-pack/.gitattributes +88 -88
  9. package/src/asset-pack/eslint.config.js +45 -45
  10. package/src/asset-pack/gitignore +11 -11
  11. package/src/asset-pack/scripts/postinstall.ts +81 -81
  12. package/src/asset-pack/tsconfig.json +33 -33
  13. package/src/templates/.cursor/mcp.json +20 -20
  14. package/src/templates/.cursorignore +2 -2
  15. package/src/templates/.gitattributes +88 -88
  16. package/src/templates/.vscode/settings.json +6 -6
  17. package/src/templates/AGENTS.md +86 -86
  18. package/src/templates/README.md +24 -24
  19. package/src/templates/eslint.config.js +45 -45
  20. package/src/templates/gitignore +11 -11
  21. package/src/templates/index.html +34 -34
  22. package/src/templates/pnpm-lock.yaml +3676 -3676
  23. package/src/templates/scripts/genesys/build-project.ts +51 -51
  24. package/src/templates/scripts/genesys/calc-bounding-box.ts +272 -272
  25. package/src/templates/scripts/genesys/common.ts +46 -46
  26. package/src/templates/scripts/genesys/const.ts +9 -9
  27. package/src/templates/scripts/genesys/dev/dump-default-scene.ts +11 -11
  28. package/src/templates/scripts/genesys/dev/generate-manifest.ts +146 -146
  29. package/src/templates/scripts/genesys/dev/launcher.ts +46 -46
  30. package/src/templates/scripts/genesys/dev/storage-provider.ts +229 -229
  31. package/src/templates/scripts/genesys/dev/update-template-scenes.ts +84 -84
  32. package/src/templates/scripts/genesys/doc-server.ts +16 -16
  33. package/src/templates/scripts/genesys/genesys-mcp.ts +526 -526
  34. package/src/templates/scripts/genesys/mcp/doc-tools.ts +86 -86
  35. package/src/templates/scripts/genesys/mcp/editor-functions.ts +151 -151
  36. package/src/templates/scripts/genesys/mcp/editor-tools.ts +73 -73
  37. package/src/templates/scripts/genesys/mcp/get-scene-state.ts +35 -35
  38. package/src/templates/scripts/genesys/mcp/run-subprocess.ts +30 -30
  39. package/src/templates/scripts/genesys/mcp/search-actors.ts +858 -858
  40. package/src/templates/scripts/genesys/mcp/search-assets.ts +380 -380
  41. package/src/templates/scripts/genesys/mcp/utils.ts +281 -281
  42. package/src/templates/scripts/genesys/misc.ts +42 -42
  43. package/src/templates/scripts/genesys/mock.ts +6 -6
  44. package/src/templates/scripts/genesys/place-actors.ts +179 -179
  45. package/src/templates/scripts/genesys/post-install.ts +30 -30
  46. package/src/templates/scripts/genesys/prefab.schema.json +84 -84
  47. package/src/templates/scripts/genesys/remove-engine-comments.ts +134 -134
  48. package/src/templates/scripts/genesys/run-mcp-inspector.bat +4 -4
  49. package/src/templates/scripts/genesys/storageProvider.ts +182 -182
  50. package/src/templates/scripts/genesys/validate-prefabs.ts +138 -138
  51. package/src/templates/src/index.ts +22 -22
  52. package/src/templates/src/templates/firstPerson/assets/default.genesys-scene +165 -165
  53. package/src/templates/src/templates/firstPerson/src/game.ts +39 -39
  54. package/src/templates/src/templates/firstPerson/src/player.ts +63 -63
  55. package/src/templates/src/templates/fps/assets/default.genesys-scene +9459 -9459
  56. package/src/templates/src/templates/fps/src/game.ts +39 -39
  57. package/src/templates/src/templates/fps/src/player.ts +69 -69
  58. package/src/templates/src/templates/fps/src/weapon.ts +54 -54
  59. package/src/templates/src/templates/freeCamera/assets/default.genesys-scene +165 -165
  60. package/src/templates/src/templates/freeCamera/src/game.ts +39 -39
  61. package/src/templates/src/templates/freeCamera/src/player.ts +45 -45
  62. package/src/templates/src/templates/sideScroller/assets/default.genesys-scene +121 -121
  63. package/src/templates/src/templates/sideScroller/src/const.ts +45 -45
  64. package/src/templates/src/templates/sideScroller/src/game.ts +122 -122
  65. package/src/templates/src/templates/sideScroller/src/level-generator.ts +361 -361
  66. package/src/templates/src/templates/sideScroller/src/player.ts +125 -125
  67. package/src/templates/src/templates/thirdPerson/assets/default.genesys-scene +165 -165
  68. package/src/templates/src/templates/thirdPerson/src/game.ts +39 -39
  69. package/src/templates/src/templates/thirdPerson/src/player.ts +61 -61
  70. package/src/templates/src/templates/vehicle/assets/default.genesys-scene +225 -225
  71. package/src/templates/src/templates/vehicle/src/base-vehicle.ts +145 -145
  72. package/src/templates/src/templates/vehicle/src/game.ts +43 -43
  73. package/src/templates/src/templates/vehicle/src/mesh-vehicle.ts +191 -191
  74. package/src/templates/src/templates/vehicle/src/player.ts +109 -109
  75. package/src/templates/src/templates/vehicle/src/primitive-vehicle.ts +266 -266
  76. package/src/templates/src/templates/vehicle/src/ui-hints.ts +101 -101
  77. package/src/templates/src/templates/vr-game/assets/default.genesys-scene +246 -246
  78. package/src/templates/src/templates/vr-game/src/auto-imports.ts +1 -1
  79. package/src/templates/src/templates/vr-game/src/game.ts +66 -66
  80. package/src/templates/src/templates/vr-game/src/sample-vr-actor.ts +26 -26
  81. package/src/templates/tsconfig.json +34 -34
  82. package/src/templates/vite.config.ts +52 -52
@@ -1,145 +1,145 @@
1
- import * as ENGINE from 'genesys.js';
2
- import * as THREE from 'three';
3
-
4
- import { VehiclePlayer } from './player.js';
5
-
6
- /**
7
- * Base vehicle class that provides common vehicle functionality
8
- *
9
- * Key points:
10
- * - Handles camera setup with follow component for smooth third-person view
11
- * - Manages player interaction (enter/exit vehicle with proximity detection)
12
- * - Provides E key input handler for vehicle exit
13
- * - Calculates safe exit position when player leaves vehicle
14
- * - Automatically switches possession between player and vehicle
15
- *
16
- */
17
- export abstract class BaseVehicle extends ENGINE.Pawn {
18
- protected readonly interactionDistance = 5;
19
- protected nearbyPlayer: ENGINE.Pawn | null = null;
20
- protected enteredPlayer: ENGINE.Pawn | null = null;
21
-
22
- protected override doBeginPlay(): void {
23
- super.doBeginPlay();
24
- this.setupCamera();
25
- this.setupVicinityCheck();
26
- this.setupExitHandler();
27
- }
28
-
29
- protected setupCamera(): void {
30
- // create a follow component for smooth camera movement
31
- const followComponent = new ENGINE.FollowComponent({
32
- positionOffset: new THREE.Vector3(0, 4, 10),
33
- positionDamping: 0.02,
34
- lookAtOffset: new THREE.Vector3(0, 0, 0),
35
- target: this.rootComponent,
36
- useCameraLookAtConvention: true,
37
- });
38
- this.rootComponent.add(followComponent);
39
-
40
- // create a camera and add it to the follow component
41
- const camera = new THREE.PerspectiveCamera(ENGINE.CAMERA_FOV, 1, ENGINE.CAMERA_NEAR, ENGINE.CAMERA_FAR);
42
- followComponent.add(camera);
43
- }
44
-
45
- protected setupVicinityCheck(): void {
46
- // Check every frame for nearby players using tick delegate
47
- this.onTickPostPhysics.add(() => {
48
- this.checkForNearbyPlayer();
49
- });
50
- }
51
-
52
- protected checkForNearbyPlayer(): void {
53
- const players = this.world!.getActors(VehiclePlayer);
54
-
55
- let foundNearbyPlayer = false;
56
- for (const player of players) {
57
- const distance = this.rootComponent.position.distanceTo(player.rootComponent.position);
58
- if (distance <= this.interactionDistance) {
59
- this.nearbyPlayer = player;
60
- foundNearbyPlayer = true;
61
- break;
62
- }
63
- }
64
-
65
- if (!foundNearbyPlayer) {
66
- this.nearbyPlayer = null;
67
- }
68
- }
69
-
70
- public canBeEntered(): boolean {
71
- return this.nearbyPlayer !== null;
72
- }
73
-
74
- public getNearbyPlayer(): ENGINE.Pawn | null {
75
- return this.nearbyPlayer;
76
- }
77
-
78
- protected setupExitHandler(): void {
79
- // Add E key input handler for vehicle exit
80
- this.onKeyDown.add((e: KeyboardEvent) => {
81
- if (e.key.toLowerCase() === 'e' && this.enteredPlayer) {
82
- this.exitVehicle();
83
- return true;
84
- } else if (e.key.toLowerCase() === 'f') {
85
- if (this.movementComponent instanceof ENGINE.VehicleMovementComponent) {
86
- this.movementComponent.flipVehicle(false);
87
- }
88
- return true;
89
- }
90
- return false;
91
- });
92
- }
93
-
94
- public setEnteredPlayer(player: ENGINE.Pawn | null): void {
95
- this.enteredPlayer = player;
96
- }
97
-
98
- protected exitVehicle(): void {
99
- if (!this.enteredPlayer) return;
100
-
101
- // Calculate exit position (to the side of the vehicle)
102
- const exitPosition = this.calculateExitPosition();
103
-
104
- // Get the current player controller
105
- const controller = this.getPlayerController();
106
-
107
- if (controller) {
108
- // Move player to exit position
109
- this.enteredPlayer.rootComponent.position.copy(exitPosition);
110
-
111
- // Make player face the same direction as the vehicle (yaw only)
112
- this.enteredPlayer.rootComponent.rotation.x = 0;
113
- this.enteredPlayer.rootComponent.rotation.z = 0;
114
- this.enteredPlayer.rootComponent.rotation.y = this.rootComponent.rotation.y;
115
-
116
- // Restore player visibility and physics
117
- this.enteredPlayer.rootComponent.visible = true;
118
- // Only the root component has physics, do not propagate to children
119
- this.enteredPlayer.rootComponent.setPhysicsEnabled(true, false);
120
-
121
- // Switch possession back to player
122
- controller.unpossess();
123
- controller.possess(this.enteredPlayer);
124
-
125
- // Clear entered player reference
126
- this.enteredPlayer = null;
127
- }
128
- }
129
-
130
- protected calculateExitPosition(): THREE.Vector3 {
131
- // Calculate a position to the right side of the vehicle
132
- const vehiclePosition = this.rootComponent.position.clone();
133
- const vehicleRotation = this.rootComponent.rotation;
134
-
135
- // Create a vector pointing to the right of the vehicle
136
- const rightVector = new THREE.Vector3(1, 0, 0);
137
- rightVector.applyEuler(vehicleRotation);
138
-
139
- // Position the player 2 units to the right and slightly forward
140
- const exitOffset = rightVector.multiplyScalar(2);
141
- exitOffset.y = 1; // Raise slightly above ground
142
-
143
- return vehiclePosition.add(exitOffset);
144
- }
145
- }
1
+ import * as ENGINE from 'genesys.js';
2
+ import * as THREE from 'three';
3
+
4
+ import { VehiclePlayer } from './player.js';
5
+
6
+ /**
7
+ * Base vehicle class that provides common vehicle functionality
8
+ *
9
+ * Key points:
10
+ * - Handles camera setup with follow component for smooth third-person view
11
+ * - Manages player interaction (enter/exit vehicle with proximity detection)
12
+ * - Provides E key input handler for vehicle exit
13
+ * - Calculates safe exit position when player leaves vehicle
14
+ * - Automatically switches possession between player and vehicle
15
+ *
16
+ */
17
+ export abstract class BaseVehicle extends ENGINE.Pawn {
18
+ protected readonly interactionDistance = 5;
19
+ protected nearbyPlayer: ENGINE.Pawn | null = null;
20
+ protected enteredPlayer: ENGINE.Pawn | null = null;
21
+
22
+ protected override doBeginPlay(): void {
23
+ super.doBeginPlay();
24
+ this.setupCamera();
25
+ this.setupVicinityCheck();
26
+ this.setupExitHandler();
27
+ }
28
+
29
+ protected setupCamera(): void {
30
+ // create a follow component for smooth camera movement
31
+ const followComponent = new ENGINE.FollowComponent({
32
+ positionOffset: new THREE.Vector3(0, 4, 10),
33
+ positionDamping: 0.02,
34
+ lookAtOffset: new THREE.Vector3(0, 0, 0),
35
+ target: this.rootComponent,
36
+ useCameraLookAtConvention: true,
37
+ });
38
+ this.rootComponent.add(followComponent);
39
+
40
+ // create a camera and add it to the follow component
41
+ const camera = new THREE.PerspectiveCamera(ENGINE.CAMERA_FOV, 1, ENGINE.CAMERA_NEAR, ENGINE.CAMERA_FAR);
42
+ followComponent.add(camera);
43
+ }
44
+
45
+ protected setupVicinityCheck(): void {
46
+ // Check every frame for nearby players using tick delegate
47
+ this.onTickPostPhysics.add(() => {
48
+ this.checkForNearbyPlayer();
49
+ });
50
+ }
51
+
52
+ protected checkForNearbyPlayer(): void {
53
+ const players = this.world!.getActors(VehiclePlayer);
54
+
55
+ let foundNearbyPlayer = false;
56
+ for (const player of players) {
57
+ const distance = this.rootComponent.position.distanceTo(player.rootComponent.position);
58
+ if (distance <= this.interactionDistance) {
59
+ this.nearbyPlayer = player;
60
+ foundNearbyPlayer = true;
61
+ break;
62
+ }
63
+ }
64
+
65
+ if (!foundNearbyPlayer) {
66
+ this.nearbyPlayer = null;
67
+ }
68
+ }
69
+
70
+ public canBeEntered(): boolean {
71
+ return this.nearbyPlayer !== null;
72
+ }
73
+
74
+ public getNearbyPlayer(): ENGINE.Pawn | null {
75
+ return this.nearbyPlayer;
76
+ }
77
+
78
+ protected setupExitHandler(): void {
79
+ // Add E key input handler for vehicle exit
80
+ this.onKeyDown.add((e: KeyboardEvent) => {
81
+ if (e.key.toLowerCase() === 'e' && this.enteredPlayer) {
82
+ this.exitVehicle();
83
+ return true;
84
+ } else if (e.key.toLowerCase() === 'f') {
85
+ if (this.movementComponent instanceof ENGINE.VehicleMovementComponent) {
86
+ this.movementComponent.flipVehicle(false);
87
+ }
88
+ return true;
89
+ }
90
+ return false;
91
+ });
92
+ }
93
+
94
+ public setEnteredPlayer(player: ENGINE.Pawn | null): void {
95
+ this.enteredPlayer = player;
96
+ }
97
+
98
+ protected exitVehicle(): void {
99
+ if (!this.enteredPlayer) return;
100
+
101
+ // Calculate exit position (to the side of the vehicle)
102
+ const exitPosition = this.calculateExitPosition();
103
+
104
+ // Get the current player controller
105
+ const controller = this.getPlayerController();
106
+
107
+ if (controller) {
108
+ // Move player to exit position
109
+ this.enteredPlayer.rootComponent.position.copy(exitPosition);
110
+
111
+ // Make player face the same direction as the vehicle (yaw only)
112
+ this.enteredPlayer.rootComponent.rotation.x = 0;
113
+ this.enteredPlayer.rootComponent.rotation.z = 0;
114
+ this.enteredPlayer.rootComponent.rotation.y = this.rootComponent.rotation.y;
115
+
116
+ // Restore player visibility and physics
117
+ this.enteredPlayer.rootComponent.visible = true;
118
+ // Only the root component has physics, do not propagate to children
119
+ this.enteredPlayer.rootComponent.setPhysicsEnabled(true, false);
120
+
121
+ // Switch possession back to player
122
+ controller.unpossess();
123
+ controller.possess(this.enteredPlayer);
124
+
125
+ // Clear entered player reference
126
+ this.enteredPlayer = null;
127
+ }
128
+ }
129
+
130
+ protected calculateExitPosition(): THREE.Vector3 {
131
+ // Calculate a position to the right side of the vehicle
132
+ const vehiclePosition = this.rootComponent.position.clone();
133
+ const vehicleRotation = this.rootComponent.rotation;
134
+
135
+ // Create a vector pointing to the right of the vehicle
136
+ const rightVector = new THREE.Vector3(1, 0, 0);
137
+ rightVector.applyEuler(vehicleRotation);
138
+
139
+ // Position the player 2 units to the right and slightly forward
140
+ const exitOffset = rightVector.multiplyScalar(2);
141
+ exitOffset.y = 1; // Raise slightly above ground
142
+
143
+ return vehiclePosition.add(exitOffset);
144
+ }
145
+ }
@@ -1,43 +1,43 @@
1
-
2
- import * as ENGINE from 'genesys.js';
3
- import * as THREE from 'three';
4
-
5
- import './auto-imports.js';
6
- import { VehiclePlayer } from './player.js';
7
- import { UIHints } from './ui-hints.js';
8
-
9
- class MyGame extends ENGINE.BaseGameLoop {
10
- private pawn: VehiclePlayer | null = null;
11
- private controller: ENGINE.PlayerController | null = null;
12
-
13
- protected override createLoadingScreen(): ENGINE.ILoadingScreen | null {
14
- // enable the default loading screen
15
- return new ENGINE.DefaultLoadingScreen();
16
- }
17
-
18
- protected override async preStart(): Promise<void> {
19
- // default spawn location
20
- const position = new THREE.Vector3(0, ENGINE.CHARACTER_HEIGHT / 2, 0);
21
-
22
- // create the pawn
23
- this.pawn = new VehiclePlayer({ position });
24
-
25
- // create the controller and possess the pawn
26
- this.controller = new ENGINE.PlayerController();
27
- this.controller.possess(this.pawn);
28
-
29
- // create UI hints
30
- const uiHints = new UIHints();
31
-
32
- // add all actors to the world
33
- this.world.addActors(this.pawn, this.controller, uiHints);
34
- }
35
- }
36
-
37
- export function main(container: HTMLElement, gameId: string): ENGINE.IGameLoop {
38
- const game = new MyGame(container, {
39
- ...ENGINE.BaseGameLoop.DEFAULT_OPTIONS,
40
- gameId
41
- });
42
- return game;
43
- }
1
+
2
+ import * as ENGINE from 'genesys.js';
3
+ import * as THREE from 'three';
4
+
5
+ import './auto-imports.js';
6
+ import { VehiclePlayer } from './player.js';
7
+ import { UIHints } from './ui-hints.js';
8
+
9
+ class MyGame extends ENGINE.BaseGameLoop {
10
+ private pawn: VehiclePlayer | null = null;
11
+ private controller: ENGINE.PlayerController | null = null;
12
+
13
+ protected override createLoadingScreen(): ENGINE.ILoadingScreen | null {
14
+ // enable the default loading screen
15
+ return new ENGINE.DefaultLoadingScreen();
16
+ }
17
+
18
+ protected override async preStart(): Promise<void> {
19
+ // default spawn location
20
+ const position = new THREE.Vector3(0, ENGINE.CHARACTER_HEIGHT / 2, 0);
21
+
22
+ // create the pawn
23
+ this.pawn = new VehiclePlayer({ position });
24
+
25
+ // create the controller and possess the pawn
26
+ this.controller = new ENGINE.PlayerController();
27
+ this.controller.possess(this.pawn);
28
+
29
+ // create UI hints
30
+ const uiHints = new UIHints();
31
+
32
+ // add all actors to the world
33
+ this.world.addActors(this.pawn, this.controller, uiHints);
34
+ }
35
+ }
36
+
37
+ export function main(container: HTMLElement, gameId: string): ENGINE.IGameLoop {
38
+ const game = new MyGame(container, {
39
+ ...ENGINE.BaseGameLoop.DEFAULT_OPTIONS,
40
+ gameId
41
+ });
42
+ return game;
43
+ }