hytopia 0.4.3 → 0.5.0-dev

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 (127) hide show
  1. package/docs/server.chunklattice.clear.md +17 -0
  2. package/docs/server.chunklattice.md +14 -0
  3. package/docs/server.collider.md +1 -1
  4. package/docs/server.collider.optionsfrommodeluri.md +18 -2
  5. package/docs/server.collideroptions.md +2 -2
  6. package/docs/server.collidershape.md +14 -0
  7. package/docs/server.defaultplayerentity._constructor_.md +47 -0
  8. package/docs/server.defaultplayerentity.md +61 -0
  9. package/docs/server.defaultplayerentitycontroller._constructor_.md +49 -0
  10. package/docs/{server.playerentitycontroller.attach.md → server.defaultplayerentitycontroller.attach.md} +2 -2
  11. package/docs/server.defaultplayerentitycontroller.autocancelmouseleftclick.md +13 -0
  12. package/docs/server.defaultplayerentitycontroller.canjump.md +13 -0
  13. package/docs/server.defaultplayerentitycontroller.canrun.md +13 -0
  14. package/docs/server.defaultplayerentitycontroller.canwalk.md +13 -0
  15. package/docs/server.defaultplayerentitycontroller.idleloopedanimations.md +13 -0
  16. package/docs/server.defaultplayerentitycontroller.interactoneshotanimations.md +13 -0
  17. package/docs/server.defaultplayerentitycontroller.isgrounded.md +13 -0
  18. package/docs/server.defaultplayerentitycontroller.isonplatform.md +13 -0
  19. package/docs/server.defaultplayerentitycontroller.isswimming.md +13 -0
  20. package/docs/server.defaultplayerentitycontroller.jumponeshotanimations.md +13 -0
  21. package/docs/server.defaultplayerentitycontroller.jumpvelocity.md +13 -0
  22. package/docs/server.defaultplayerentitycontroller.md +599 -0
  23. package/docs/server.defaultplayerentitycontroller.platform.md +13 -0
  24. package/docs/server.defaultplayerentitycontroller.runloopedanimations.md +13 -0
  25. package/docs/server.defaultplayerentitycontroller.runvelocity.md +13 -0
  26. package/docs/server.defaultplayerentitycontroller.spawn.md +53 -0
  27. package/docs/server.defaultplayerentitycontroller.stickstoplatforms.md +13 -0
  28. package/docs/server.defaultplayerentitycontroller.swimfastvelocity.md +13 -0
  29. package/docs/server.defaultplayerentitycontroller.swimgravity.md +13 -0
  30. package/docs/server.defaultplayerentitycontroller.swimloopedanimations.md +13 -0
  31. package/docs/server.defaultplayerentitycontroller.swimmaxgravityvelocity.md +13 -0
  32. package/docs/server.defaultplayerentitycontroller.swimslowvelocity.md +13 -0
  33. package/docs/server.defaultplayerentitycontroller.swimupwardvelocity.md +13 -0
  34. package/docs/{server.playerentitycontroller.tickwithplayerinput.md → server.defaultplayerentitycontroller.tickwithplayerinput.md} +2 -2
  35. package/docs/server.defaultplayerentitycontroller.walkloopedanimations.md +13 -0
  36. package/docs/server.defaultplayerentitycontroller.walkvelocity.md +13 -0
  37. package/docs/server.defaultplayerentitycontrolleroptions.autocancelmouseleftclick.md +13 -0
  38. package/docs/server.defaultplayerentitycontrolleroptions.canjump.md +13 -0
  39. package/docs/server.defaultplayerentitycontrolleroptions.canrun.md +13 -0
  40. package/docs/server.defaultplayerentitycontrolleroptions.canwalk.md +13 -0
  41. package/docs/server.defaultplayerentitycontrolleroptions.idleloopedanimations.md +13 -0
  42. package/docs/server.defaultplayerentitycontrolleroptions.interactoneshotanimations.md +13 -0
  43. package/docs/server.defaultplayerentitycontrolleroptions.jumponeshotanimations.md +13 -0
  44. package/docs/server.defaultplayerentitycontrolleroptions.jumpvelocity.md +13 -0
  45. package/docs/server.defaultplayerentitycontrolleroptions.md +399 -0
  46. package/docs/server.defaultplayerentitycontrolleroptions.runloopedanimations.md +13 -0
  47. package/docs/server.defaultplayerentitycontrolleroptions.runvelocity.md +13 -0
  48. package/docs/server.defaultplayerentitycontrolleroptions.stickstoplatforms.md +13 -0
  49. package/docs/server.defaultplayerentitycontrolleroptions.swimfastvelocity.md +13 -0
  50. package/docs/server.defaultplayerentitycontrolleroptions.swimgravity.md +13 -0
  51. package/docs/server.defaultplayerentitycontrolleroptions.swimloopedanimations.md +13 -0
  52. package/docs/server.defaultplayerentitycontrolleroptions.swimmaxgravityvelocity.md +13 -0
  53. package/docs/server.defaultplayerentitycontrolleroptions.swimslowvelocity.md +13 -0
  54. package/docs/server.defaultplayerentitycontrolleroptions.swimupwardvelocity.md +13 -0
  55. package/docs/server.defaultplayerentitycontrolleroptions.walkloopedanimations.md +13 -0
  56. package/docs/server.defaultplayerentitycontrolleroptions.walkvelocity.md +13 -0
  57. package/docs/server.defaultplayerentityoptions.md +15 -0
  58. package/docs/server.entity.md +21 -0
  59. package/docs/server.entity.modelpreferredshape.md +13 -0
  60. package/docs/server.md +77 -22
  61. package/docs/server.modelboundingbox.md +18 -0
  62. package/docs/server.modelentityoptions.md +19 -0
  63. package/docs/server.modelentityoptions.modelpreferredshape.md +13 -0
  64. package/docs/server.modelregistry.getboundingbox.md +1 -1
  65. package/docs/server.modelregistry.gettrimesh.md +71 -0
  66. package/docs/server.modelregistry.md +14 -0
  67. package/docs/server.modeltrimesh.md +16 -0
  68. package/docs/server.playerentity.md +1 -1
  69. package/docs/server.wedgecollideroptions.extents.md +13 -0
  70. package/docs/server.wedgecollideroptions.md +75 -0
  71. package/docs/server.wedgecollideroptions.shape.md +11 -0
  72. package/docs/server.world.loadmap.md +1 -1
  73. package/docs/server.world.md +1 -1
  74. package/examples/ai-agents/index.ts +2 -6
  75. package/examples/big-world/index.ts +2 -5
  76. package/examples/block-entity/index.ts +2 -5
  77. package/examples/child-entity/index.ts +2 -5
  78. package/examples/custom-ui/index.ts +3 -6
  79. package/examples/entity-controller/index.ts +2 -5
  80. package/examples/entity-spawn/index.ts +2 -5
  81. package/examples/hole-in-wall-game/index.ts +8 -9
  82. package/examples/hygrounds/classes/GameManager.ts +1 -0
  83. package/examples/hygrounds/classes/GamePlayerEntity.ts +5 -6
  84. package/examples/lighting/index.ts +3 -6
  85. package/examples/mobile-controls/index.ts +2 -5
  86. package/examples/pathfinding/index.ts +2 -5
  87. package/examples/payload-game/index.ts +15 -17
  88. package/examples/player-persistence/index.ts +2 -5
  89. package/examples/wall-dodge-game/index.ts +8 -11
  90. package/examples/zombies-fps/classes/GamePlayerEntity.ts +5 -8
  91. package/package.json +1 -1
  92. package/server.api.json +10086 -9232
  93. package/server.d.ts +241 -147
  94. package/server.js +143 -129
  95. package/docs/server.playerentitycontroller._constructor_.md +0 -49
  96. package/docs/server.playerentitycontroller.autocancelmouseleftclick.md +0 -13
  97. package/docs/server.playerentitycontroller.canjump.md +0 -13
  98. package/docs/server.playerentitycontroller.canrun.md +0 -13
  99. package/docs/server.playerentitycontroller.canwalk.md +0 -13
  100. package/docs/server.playerentitycontroller.idleloopedanimations.md +0 -13
  101. package/docs/server.playerentitycontroller.interactoneshotanimations.md +0 -13
  102. package/docs/server.playerentitycontroller.isgrounded.md +0 -13
  103. package/docs/server.playerentitycontroller.isonplatform.md +0 -13
  104. package/docs/server.playerentitycontroller.jumponeshotanimations.md +0 -13
  105. package/docs/server.playerentitycontroller.jumpvelocity.md +0 -13
  106. package/docs/server.playerentitycontroller.md +0 -464
  107. package/docs/server.playerentitycontroller.platform.md +0 -13
  108. package/docs/server.playerentitycontroller.runloopedanimations.md +0 -13
  109. package/docs/server.playerentitycontroller.runvelocity.md +0 -13
  110. package/docs/server.playerentitycontroller.spawn.md +0 -53
  111. package/docs/server.playerentitycontroller.stickstoplatforms.md +0 -13
  112. package/docs/server.playerentitycontroller.walkloopedanimations.md +0 -13
  113. package/docs/server.playerentitycontroller.walkvelocity.md +0 -13
  114. package/docs/server.playerentitycontrolleroptions.autocancelmouseleftclick.md +0 -13
  115. package/docs/server.playerentitycontrolleroptions.canjump.md +0 -13
  116. package/docs/server.playerentitycontrolleroptions.canrun.md +0 -13
  117. package/docs/server.playerentitycontrolleroptions.canwalk.md +0 -13
  118. package/docs/server.playerentitycontrolleroptions.idleloopedanimations.md +0 -13
  119. package/docs/server.playerentitycontrolleroptions.interactoneshotanimations.md +0 -13
  120. package/docs/server.playerentitycontrolleroptions.jumponeshotanimations.md +0 -13
  121. package/docs/server.playerentitycontrolleroptions.jumpvelocity.md +0 -13
  122. package/docs/server.playerentitycontrolleroptions.md +0 -285
  123. package/docs/server.playerentitycontrolleroptions.runloopedanimations.md +0 -13
  124. package/docs/server.playerentitycontrolleroptions.runvelocity.md +0 -13
  125. package/docs/server.playerentitycontrolleroptions.stickstoplatforms.md +0 -13
  126. package/docs/server.playerentitycontrolleroptions.walkloopedanimations.md +0 -13
  127. package/docs/server.playerentitycontrolleroptions.walkvelocity.md +0 -13
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  startServer,
3
3
  ColliderShape,
4
- PlayerEntity,
4
+ DefaultPlayerEntity,
5
5
  PlayerEvent,
6
6
  Entity,
7
7
  EntityEvent,
@@ -20,12 +20,9 @@ startServer(world => {
20
20
 
21
21
  world.loadMap(worldMap);
22
22
  world.on(PlayerEvent.JOINED_WORLD, ({ player }) => {
23
- const playerEntity = new PlayerEntity({
23
+ const playerEntity = new DefaultPlayerEntity({
24
24
  player,
25
25
  name: 'Player',
26
- modelUri: 'models/players/player.gltf',
27
- modelLoopedAnimations: [ 'idle' ],
28
- modelScale: 0.5,
29
26
  });
30
27
 
31
28
  playerEntity.spawn(world, { x: 0, y: 10, z: 0 });
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  startServer,
3
3
  Entity,
4
- PlayerEntity,
4
+ DefaultPlayerEntity,
5
5
  PlayerEvent,
6
6
  Quaternion,
7
7
  } from 'hytopia';
@@ -13,12 +13,9 @@ startServer(world => {
13
13
 
14
14
  // Spawn a player entity when a player joins the game.
15
15
  world.on(PlayerEvent.JOINED_WORLD, ({ player }) => {
16
- const playerEntity = new PlayerEntity({
16
+ const playerEntity = new DefaultPlayerEntity({
17
17
  player,
18
18
  name: 'Player',
19
- modelUri: 'models/players/player.gltf',
20
- modelLoopedAnimations: [ 'idle' ],
21
- modelScale: 0.5,
22
19
  });
23
20
 
24
21
  playerEntity.spawn(world, { x: 0, y: 10, z: 0 });
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  startServer,
3
3
  Audio,
4
+ DefaultPlayerEntity,
4
5
  Player,
5
- PlayerEntity,
6
6
  PlayerEvent,
7
7
  PlayerUIEvent,
8
8
  } from 'hytopia';
@@ -10,7 +10,7 @@ import {
10
10
  import worldMap from './assets/map.json';
11
11
 
12
12
  // Simple map for player -> singular controlled entity
13
- const playerEntityMap = new Map<Player, PlayerEntity>();
13
+ const playerEntityMap = new Map<Player, DefaultPlayerEntity>();
14
14
 
15
15
  startServer(world => {
16
16
  world.loadMap(worldMap);
@@ -24,12 +24,9 @@ startServer(world => {
24
24
  // or just use plain HTML like in this example.
25
25
  player.ui.load('ui/index.html');
26
26
 
27
- const playerEntity = new PlayerEntity({
27
+ const playerEntity = new DefaultPlayerEntity({
28
28
  player,
29
29
  name: 'Player',
30
- modelUri: 'models/players/player.gltf',
31
- modelLoopedAnimations: [ 'idle' ],
32
- modelScale: 0.5,
33
30
  });
34
31
 
35
32
  playerEntity.spawn(world, { x: 0, y: 10, z: 0 });
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  startServer,
3
- PlayerEntity,
3
+ DefaultPlayerEntity,
4
4
  PlayerEvent,
5
5
  } from 'hytopia';
6
6
 
@@ -19,12 +19,9 @@ startServer(world => {
19
19
  world.loadMap(worldMap);
20
20
 
21
21
  world.on(PlayerEvent.JOINED_WORLD, ({ player }) => {
22
- const playerEntity = new PlayerEntity({
22
+ const playerEntity = new DefaultPlayerEntity({
23
23
  player,
24
24
  name: 'Player',
25
- modelUri: 'models/players/player.gltf',
26
- modelLoopedAnimations: [ 'idle' ],
27
- modelScale: 0.5,
28
25
  controller: new MyEntityController(), // attach our entity controller
29
26
  });
30
27
 
@@ -3,9 +3,9 @@ import {
3
3
  BlockType,
4
4
  Collider,
5
5
  ColliderShape,
6
+ DefaultPlayerEntity,
6
7
  Entity,
7
8
  EntityEvent,
8
- PlayerEntity,
9
9
  PlayerEvent,
10
10
  RigidBodyType,
11
11
  World,
@@ -70,12 +70,9 @@ function setup(world: World) {
70
70
 
71
71
  // Spawn a player entity when a player joins the game.
72
72
  world.on(PlayerEvent.JOINED_WORLD, ({ player }) => {
73
- const playerEntity = new PlayerEntity({
73
+ const playerEntity = new DefaultPlayerEntity({
74
74
  player,
75
75
  name: 'Player',
76
- modelUri: 'models/players/player.gltf',
77
- modelLoopedAnimations: [ 'idle' ],
78
- modelScale: 0.5,
79
76
  });
80
77
 
81
78
  playerEntity.spawn(world, { x: 0, y: 10, z: 0 });
@@ -3,17 +3,18 @@ import {
3
3
  BlockType,
4
4
  Collider,
5
5
  ColliderShape,
6
+ DefaultPlayerEntity,
6
7
  Entity,
7
8
  EntityEvent,
8
9
  GameServer,
9
10
  RigidBodyType,
10
11
  startServer,
11
12
  Player,
12
- PlayerEntity,
13
13
  PlayerEvent,
14
14
  SceneUI,
15
15
  World,
16
16
  CollisionGroup,
17
+ PlayerEntity,
17
18
  } from 'hytopia';
18
19
 
19
20
  import GAME_WALL_SHAPES from './wall-shapes';
@@ -53,8 +54,8 @@ const GAME_CONFIG = {
53
54
  };
54
55
 
55
56
  // Game state
56
- const QUEUED_PLAYER_ENTITIES = new Set<PlayerEntity>();
57
- const GAME_PLAYER_ENTITIES = new Set<PlayerEntity>();
57
+ const QUEUED_PLAYER_ENTITIES = new Set<DefaultPlayerEntity>();
58
+ const GAME_PLAYER_ENTITIES = new Set<DefaultPlayerEntity>();
58
59
 
59
60
  let gameLevel = 1;
60
61
  let gameState: 'awaitingPlayers' | 'starting' | 'inProgress' = 'awaitingPlayers';
@@ -89,12 +90,10 @@ function onPlayerJoin(world: World, player: Player) {
89
90
  player.ui.load('ui/index.html');
90
91
  player.ui.sendData(gameUiState);
91
92
 
92
- const playerEntity = new PlayerEntity({
93
+ const playerEntity = new DefaultPlayerEntity({
93
94
  player,
94
95
  name: 'Player',
95
- modelUri: 'models/players/player.gltf',
96
- modelLoopedAnimations: ['idle'],
97
- modelScale: 0.5,
96
+ modelUri: 'models/players/soldier-player.gltf',
98
97
  });
99
98
 
100
99
  playerEntity.spawn(world, GAME_CONFIG.POSITIONS.PLAYER_SPAWN);
@@ -169,7 +168,7 @@ function addPlayerEntityToQueue(world: World, playerEntity: PlayerEntity) {
169
168
  world.chatManager.sendPlayerMessage(playerEntity.player, 'You have joined the next game queue!', '00FF00');
170
169
  uiUpdate({ queueCount: QUEUED_PLAYER_ENTITIES.size });
171
170
 
172
- if (gameState === 'awaitingPlayers' && QUEUED_PLAYER_ENTITIES.size > 0) {
171
+ if (gameState === 'awaitingPlayers' && QUEUED_PLAYER_ENTITIES.size > 1) {
173
172
  queueGame(world);
174
173
  }
175
174
 
@@ -272,7 +271,7 @@ function killPlayer(playerEntity: PlayerEntity) {
272
271
  playerEntity.setPosition(GAME_CONFIG.POSITIONS.PLAYER_SPAWN);
273
272
  GAME_PLAYER_ENTITIES.delete(playerEntity);
274
273
 
275
- if (GAME_PLAYER_ENTITIES.size <= 0) {
274
+ if (GAME_PLAYER_ENTITIES.size <= 1) {
276
275
  endGame();
277
276
  }
278
277
 
@@ -206,6 +206,7 @@ export default class GameManager {
206
206
 
207
207
  // Reset map to initial state
208
208
  this.world.loadMap(worldMap);
209
+ this._spawnBedrock(this.world);
209
210
 
210
211
  // Reset player state
211
212
  this.world.entityManager.getAllPlayerEntities().forEach(playerEntity => {
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  Audio,
3
3
  BaseEntityControllerEvent,
4
+ DefaultPlayerEntity,
5
+ DefaultPlayerEntityController,
4
6
  EventPayloads,
5
7
  Player,
6
- PlayerEntity,
7
8
  PlayerCameraMode,
8
9
  Vector3Like,
9
10
  QuaternionLike,
10
11
  World,
11
- PlayerEntityController,
12
12
  PlayerUIEvent,
13
13
  SceneUI,
14
14
  ErrorHandler,
@@ -41,7 +41,7 @@ interface PlayerPersistedData extends Record<string, unknown> {
41
41
  totalExp: number
42
42
  }
43
43
 
44
- export default class GamePlayerEntity extends PlayerEntity {
44
+ export default class GamePlayerEntity extends DefaultPlayerEntity {
45
45
  private readonly _damageAudio: Audio;
46
46
  private readonly _inventory: (ItemEntity | undefined)[] = new Array(TOTAL_INVENTORY_SLOTS).fill(undefined);
47
47
  private _dead: boolean = false;
@@ -58,8 +58,8 @@ export default class GamePlayerEntity extends PlayerEntity {
58
58
  private _totalExp: number = 0;
59
59
 
60
60
  // Player entities always assign a PlayerController to the entity
61
- public get playerController(): PlayerEntityController {
62
- return this.controller as PlayerEntityController;
61
+ public get playerController(): DefaultPlayerEntityController {
62
+ return this.controller as DefaultPlayerEntityController;
63
63
  }
64
64
 
65
65
  public get health(): number { return this._health; }
@@ -84,7 +84,6 @@ export default class GamePlayerEntity extends PlayerEntity {
84
84
  player,
85
85
  name: 'Player',
86
86
  modelUri: 'models/players/soldier-player.gltf',
87
- modelScale: 0.5,
88
87
  });
89
88
 
90
89
  this._setupPlayerController();
@@ -1,9 +1,9 @@
1
1
  import {
2
- Audio,
3
2
  startServer,
3
+ Audio,
4
+ DefaultPlayerEntity,
4
5
  Light,
5
6
  LightType,
6
- PlayerEntity,
7
7
  PlayerEvent,
8
8
  } from 'hytopia';
9
9
 
@@ -85,12 +85,9 @@ startServer(world => {
85
85
 
86
86
  // Spawn a player entity when a player joins the game.
87
87
  world.on(PlayerEvent.JOINED_WORLD, ({ player }) => {
88
- const playerEntity = new PlayerEntity({
88
+ const playerEntity = new DefaultPlayerEntity({
89
89
  player,
90
90
  name: 'Player',
91
- modelUri: 'models/players/player.gltf',
92
- modelLoopedAnimations: [ 'idle' ],
93
- modelScale: 0.5,
94
91
  });
95
92
 
96
93
  playerEntity.spawn(world, { x: 0, y: 10, z: 0 });
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  startServer,
3
- PlayerEntity,
3
+ DefaultPlayerEntity,
4
4
  PlayerEvent,
5
5
  } from 'hytopia';
6
6
 
@@ -11,12 +11,9 @@ startServer(world => {
11
11
 
12
12
  // Spawn a player entity when a player joins the game.
13
13
  world.on(PlayerEvent.JOINED_WORLD, ({ player }) => {
14
- const playerEntity = new PlayerEntity({
14
+ const playerEntity = new DefaultPlayerEntity({
15
15
  player,
16
16
  name: 'Player',
17
- modelUri: 'models/players/player.gltf',
18
- modelLoopedAnimations: [ 'idle' ],
19
- modelScale: 0.5,
20
17
  });
21
18
 
22
19
  // Load our game UI for this player, this creates our mobile controls UI
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  startServer,
3
+ DefaultPlayerEntity,
3
4
  Entity,
4
5
  PathfindingEntityController,
5
- PlayerEntity,
6
6
  PlayerEvent,
7
7
  Quaternion,
8
8
  RigidBodyType,
@@ -94,12 +94,9 @@ startServer(world => {
94
94
 
95
95
  // Spawn a player entity when a player joins the game.
96
96
  world.on(PlayerEvent.JOINED_WORLD, ({ player }) => {
97
- const playerEntity = new PlayerEntity({
97
+ const playerEntity = new DefaultPlayerEntity({
98
98
  player,
99
99
  name: 'Player',
100
- modelUri: 'models/players/player.gltf',
101
- modelLoopedAnimations: [ 'idle' ],
102
- modelScale: 0.5,
103
100
  });
104
101
 
105
102
  world.chatManager.sendPlayerMessage(player, 'To make the zombie pathfind to you, enter: /pathfind', '00FF00');
@@ -20,13 +20,13 @@ import {
20
20
  Audio,
21
21
  BaseEntityControllerEvent,
22
22
  BlockType,
23
- PlayerCameraMode,
23
+ DefaultPlayerEntity,
24
+ DefaultPlayerEntityController,
24
25
  ColliderShape,
25
26
  CollisionGroup,
26
- PlayerEntityController,
27
27
  Entity,
28
28
  EntityEvent,
29
- PlayerEntity,
29
+ PlayerCameraMode,
30
30
  PlayerEvent,
31
31
  RigidBodyType,
32
32
  SimpleEntityController,
@@ -105,12 +105,10 @@ startServer(world => { // Perform our game setup logic in the startServer init c
105
105
 
106
106
  // Setup Player Join & Spawn Controlled Entity
107
107
  world.on(PlayerEvent.JOINED_WORLD, ({ player }) => {
108
- const playerEntity = new PlayerEntity({ // Create an entity our newly joined player controls
108
+ const playerEntity = new DefaultPlayerEntity({ // Create an entity our newly joined player controls
109
109
  player,
110
110
  name: 'Player',
111
111
  modelUri: 'models/soldier-player.gltf',
112
- modelLoopedAnimations: [ 'idle_lower', 'idle_gun_right' ],
113
- modelScale: 0.5,
114
112
  });
115
113
 
116
114
 
@@ -127,7 +125,7 @@ startServer(world => { // Perform our game setup logic in the startServer init c
127
125
  playerEntity.spawn(world, randomSpawnCoordinate);
128
126
 
129
127
  // Override default model animations
130
- const playerController = playerEntity.controller as PlayerEntityController;
128
+ const playerController = playerEntity.controller as DefaultPlayerEntityController;
131
129
  playerController.idleLoopedAnimations = [ 'idle_lower', 'idle_gun_right' ];
132
130
  playerController.interactOneshotAnimations = [];
133
131
  playerController.walkLoopedAnimations = ['walk_lower', 'idle_gun_right' ];
@@ -186,10 +184,10 @@ startServer(world => { // Perform our game setup logic in the startServer init c
186
184
  startEnemySpawnLoop(world);
187
185
 
188
186
  // Game Commands
189
- chatManager.registerCommand('/start', () => {
190
- chatManager.sendBroadcastMessage('Game started!');
187
+ // chatManager.registerCommand('/start', () => {
188
+ // chatManager.sendBroadcastMessage('Game started!');
191
189
  started = true;
192
- });
190
+ // });
193
191
 
194
192
  chatManager.registerCommand('/stop', () => {
195
193
  chatManager.sendBroadcastMessage('Game stopped!');
@@ -327,7 +325,7 @@ function spawnPayloadEntity(world: World) {
327
325
  // We use a onCollision handler specific to this sensor, and
328
326
  // not the whole entity, so we can track the number of players in the payload sensor.
329
327
  onCollision: (other: BlockType | Entity, started: boolean) => {
330
- if (other instanceof PlayerEntity) {
328
+ if (other instanceof DefaultPlayerEntity) {
331
329
  started ? payloadPlayerEntityCount++ : payloadPlayerEntityCount--;
332
330
  console.log('player count change', payloadPlayerEntityCount, started, other.name);
333
331
  } else if (other instanceof Entity && other.name === 'Spider') {
@@ -356,7 +354,7 @@ function spawnSpider(world: World, coordinate: Vector3Like) {
356
354
  const baseScale = 0.5;
357
355
  const baseSpeed = 3;
358
356
  const randomScaleMultiplier = Math.random() * 2 + 1; // Random value between 1 and 3 // Random scale multiplier to make each spider a different size
359
- const targetPlayers = new Set<PlayerEntity>();
357
+ const targetPlayers = new Set<DefaultPlayerEntity>();
360
358
 
361
359
  const spider = new Entity({
362
360
  controller: new SimpleEntityController(),
@@ -381,7 +379,7 @@ function spawnSpider(world: World, coordinate: Vector3Like) {
381
379
  collidesWith: [ CollisionGroup.PLAYER ],
382
380
  },
383
381
  onCollision: (other: BlockType | Entity, started: boolean) => { // If a player enters or exits the aggro sensor, add or remove them from the target players set
384
- if (other instanceof PlayerEntity) {
382
+ if (other instanceof DefaultPlayerEntity) {
385
383
  started ? targetPlayers.add(other) : targetPlayers.delete(other);
386
384
  }
387
385
  },
@@ -395,7 +393,7 @@ function spawnSpider(world: World, coordinate: Vector3Like) {
395
393
  });
396
394
 
397
395
  spider.on(EntityEvent.ENTITY_COLLISION, ({ otherEntity, started }) => {
398
- if (started && otherEntity instanceof PlayerEntity && otherEntity.isSpawned) {
396
+ if (started && otherEntity instanceof DefaultPlayerEntity && otherEntity.isSpawned) {
399
397
  const spiderDirection = spider.directionFromRotation;
400
398
  const knockback = 4 * randomScaleMultiplier;
401
399
 
@@ -454,14 +452,14 @@ function onTickPathfindPayload(payload: EventPayloads[EntityEvent.TICK]) { // Mo
454
452
  entity.controller.face(targetWaypointCoordinate, speed / 2);
455
453
  }
456
454
 
457
- function onTickPathfindEnemy(entity: Entity, targetPlayers: Set<PlayerEntity>, speed: number, _tickDeltaMs: number) {
455
+ function onTickPathfindEnemy(entity: Entity, targetPlayers: Set<DefaultPlayerEntity>, speed: number, _tickDeltaMs: number) {
458
456
  if (!entity.isSpawned || !payloadEntity) return;
459
457
 
460
458
  const entityId = entity.id!;
461
459
  enemyPathfindAccumulators[entityId] ??= 0; // Initialize the accumulator for this enemy if it isn't initialized yet
462
460
 
463
461
  if (!enemyPathfindingTargets[entityId] || enemyPathfindAccumulators[entityId] >= PATHFIND_ACCUMULATOR_THRESHOLD) {
464
- const targetPlayer = targetPlayers.values().next().value as PlayerEntity | undefined;
462
+ const targetPlayer = targetPlayers.values().next().value as DefaultPlayerEntity | undefined;
465
463
 
466
464
  enemyPathfindingTargets[entityId] = targetPlayer?.isSpawned
467
465
  ? targetPlayer.position
@@ -523,7 +521,7 @@ function onTickWithPlayerInput(payload: EventPayloads[BaseEntityControllerEvent.
523
521
  }
524
522
  }
525
523
 
526
- function damagePlayer(playerEntity: PlayerEntity) {
524
+ function damagePlayer(playerEntity: DefaultPlayerEntity) {
527
525
  const chatManager = playerEntity.world!.chatManager;
528
526
 
529
527
  playerEntityHealth[playerEntity.id!]--;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  startServer,
3
- PlayerEntity,
3
+ DefaultPlayerEntity,
4
4
  PlayerEvent,
5
5
  Player,
6
6
  PersistenceManager,
@@ -13,12 +13,9 @@ startServer(world => {
13
13
 
14
14
  // Handle player join
15
15
  world.on(PlayerEvent.JOINED_WORLD, ({ player }) => {
16
- const playerEntity = new PlayerEntity({
16
+ const playerEntity = new DefaultPlayerEntity({
17
17
  player,
18
18
  name: 'Player',
19
- modelUri: 'models/players/player.gltf',
20
- modelLoopedAnimations: ['idle'],
21
- modelScale: 0.5,
22
19
  });
23
20
 
24
21
  playerEntity.spawn(world, { x: 0, y: 10, z: 0 });
@@ -2,6 +2,7 @@ import {
2
2
  Audio,
3
3
  CollisionGroup,
4
4
  ColliderShape,
5
+ DefaultPlayerEntity,
5
6
  BlockType,
6
7
  Entity,
7
8
  EntityEvent,
@@ -9,7 +10,6 @@ import {
9
10
  SceneUI,
10
11
  startServer,
11
12
  Player,
12
- PlayerEntity,
13
13
  PlayerEvent,
14
14
  RigidBodyType,
15
15
  SimpleEntityController,
@@ -71,7 +71,7 @@ startServer(world => {
71
71
  * with to join the game.
72
72
  */
73
73
  function setupJoinNPC(world: World) {
74
- let focusedPlayer: PlayerEntity | null = null;
74
+ let focusedPlayer: DefaultPlayerEntity | null = null;
75
75
 
76
76
  // Create our NPC
77
77
  const joinNPC = new Entity({
@@ -91,7 +91,7 @@ function setupJoinNPC(world: World) {
91
91
  isSensor: true,
92
92
  tag: 'teleport-sensor',
93
93
  onCollision: (other: BlockType | Entity, started: boolean) => {
94
- if (started && other instanceof PlayerEntity) {
94
+ if (started && other instanceof DefaultPlayerEntity) {
95
95
  startGame(other); // When a player entity enters this sensor, start the game for them
96
96
  }
97
97
  },
@@ -103,7 +103,7 @@ function setupJoinNPC(world: World) {
103
103
  isSensor: true, // This makes the collider not collide with other entities/objets
104
104
  tag: 'rotate-sensor',
105
105
  onCollision: (other: BlockType | Entity, started: boolean) => {
106
- if (started && other instanceof PlayerEntity) {
106
+ if (started && other instanceof DefaultPlayerEntity) {
107
107
  focusedPlayer = other;
108
108
  }
109
109
  },
@@ -210,7 +210,7 @@ function startBlockSpawner(world: World) {
210
210
  spawnBlock();
211
211
  }
212
212
 
213
- function startGame(playerEntity: PlayerEntity) {
213
+ function startGame(playerEntity: DefaultPlayerEntity) {
214
214
  playerEntity.setPosition({ x: 1, y: 4, z: 1 });
215
215
  playerEntity.setOpacity(0.3);
216
216
  playerEntity.player.ui.sendData({ type: 'game-start' });
@@ -226,7 +226,7 @@ function startGame(playerEntity: PlayerEntity) {
226
226
  }, 3500);
227
227
  }
228
228
 
229
- function endGame(playerEntity: PlayerEntity) {
229
+ function endGame(playerEntity: DefaultPlayerEntity) {
230
230
  const startTime = PLAYER_GAME_START_TIME.get(playerEntity.player) ?? Date.now();
231
231
  const scoreTime = Date.now() - startTime;
232
232
  const lastTopScoreTime = PLAYER_TOP_SCORES.get(playerEntity.player) ?? 0;
@@ -262,12 +262,9 @@ function onPlayerJoin(world: World, player: Player) {
262
262
  sendPlayerLeaderboardData(player);
263
263
 
264
264
  // Create the player entity
265
- const playerEntity = new PlayerEntity({
265
+ const playerEntity = new DefaultPlayerEntity({
266
266
  player,
267
267
  name: 'Player',
268
- modelUri: 'models/players/player.gltf',
269
- modelLoopedAnimations: [ 'idle' ],
270
- modelScale: 0.5,
271
268
  });
272
269
 
273
270
  playerEntity.on(EntityEvent.TICK, () => {
@@ -299,7 +296,7 @@ function onPlayerLeave(world: World, player: Player) {
299
296
  * We also con't collide with other players.
300
297
  * Collision groups work on if both contacted colliders belong to a group the other collides with.
301
298
  */
302
- function enablePlayerEntityGameCollisions(playerEntity: PlayerEntity, enabled: boolean) {
299
+ function enablePlayerEntityGameCollisions(playerEntity: DefaultPlayerEntity, enabled: boolean) {
303
300
  playerEntity.colliders.forEach(collider => {
304
301
  collider.setCollisionGroups({
305
302
  belongsTo: [ CollisionGroup.ENTITY, CollisionGroup.PLAYER ],
@@ -2,20 +2,18 @@ import {
2
2
  Audio,
3
3
  BaseEntityControllerEvent,
4
4
  CollisionGroup,
5
+ DefaultPlayerEntity,
6
+ DefaultPlayerEntityController,
5
7
  EventPayloads,
6
8
  Light,
7
9
  LightType,
8
10
  Player,
9
- PlayerCameraOrientation,
10
- PlayerEntity,
11
11
  PlayerCameraMode,
12
- PlayerInput,
13
12
  SceneUI,
14
13
  Vector3Like,
15
14
  QuaternionLike,
16
15
  World,
17
16
  Quaternion,
18
- PlayerEntityController,
19
17
  Vector3,
20
18
  } from 'hytopia';
21
19
 
@@ -31,7 +29,7 @@ const REVIVE_REQUIRED_HEALTH = 50;
31
29
  const REVIVE_PROGRESS_INTERVAL_MS = 1000;
32
30
  const REVIVE_DISTANCE_THRESHOLD = 3;
33
31
 
34
- export default class GamePlayerEntity extends PlayerEntity {
32
+ export default class GamePlayerEntity extends DefaultPlayerEntity {
35
33
  public health: number;
36
34
  public maxHealth: number;
37
35
  public money: number;
@@ -46,8 +44,8 @@ export default class GamePlayerEntity extends PlayerEntity {
46
44
  private _reviveDistanceVectorB: Vector3;
47
45
 
48
46
  // Player entities always assign a PlayerController to the entity, so we can safely create a convenience getter
49
- public get playerController(): PlayerEntityController {
50
- return this.controller as PlayerEntityController;
47
+ public get playerController(): DefaultPlayerEntityController {
48
+ return this.controller as DefaultPlayerEntityController;
51
49
  }
52
50
 
53
51
  public constructor(player: Player) {
@@ -55,7 +53,6 @@ export default class GamePlayerEntity extends PlayerEntity {
55
53
  player,
56
54
  name: 'Player',
57
55
  modelUri: 'models/players/soldier-player.gltf',
58
- modelScale: 0.5,
59
56
  });
60
57
 
61
58
  // Prevent mouse left click from being cancelled, required
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hytopia",
3
- "version": "0.4.3",
3
+ "version": "0.5.0-dev",
4
4
  "description": "The HYTOPIA SDK makes it easy for developers to create massively multiplayer games using JavaScript or TypeScript.",
5
5
  "main": "server.js",
6
6
  "bin": {