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.
- package/docs/server.chunklattice.clear.md +17 -0
- package/docs/server.chunklattice.md +14 -0
- package/docs/server.collider.md +1 -1
- package/docs/server.collider.optionsfrommodeluri.md +18 -2
- package/docs/server.collideroptions.md +2 -2
- package/docs/server.collidershape.md +14 -0
- package/docs/server.defaultplayerentity._constructor_.md +47 -0
- package/docs/server.defaultplayerentity.md +61 -0
- package/docs/server.defaultplayerentitycontroller._constructor_.md +49 -0
- package/docs/{server.playerentitycontroller.attach.md → server.defaultplayerentitycontroller.attach.md} +2 -2
- package/docs/server.defaultplayerentitycontroller.autocancelmouseleftclick.md +13 -0
- package/docs/server.defaultplayerentitycontroller.canjump.md +13 -0
- package/docs/server.defaultplayerentitycontroller.canrun.md +13 -0
- package/docs/server.defaultplayerentitycontroller.canwalk.md +13 -0
- package/docs/server.defaultplayerentitycontroller.idleloopedanimations.md +13 -0
- package/docs/server.defaultplayerentitycontroller.interactoneshotanimations.md +13 -0
- package/docs/server.defaultplayerentitycontroller.isgrounded.md +13 -0
- package/docs/server.defaultplayerentitycontroller.isonplatform.md +13 -0
- package/docs/server.defaultplayerentitycontroller.isswimming.md +13 -0
- package/docs/server.defaultplayerentitycontroller.jumponeshotanimations.md +13 -0
- package/docs/server.defaultplayerentitycontroller.jumpvelocity.md +13 -0
- package/docs/server.defaultplayerentitycontroller.md +599 -0
- package/docs/server.defaultplayerentitycontroller.platform.md +13 -0
- package/docs/server.defaultplayerentitycontroller.runloopedanimations.md +13 -0
- package/docs/server.defaultplayerentitycontroller.runvelocity.md +13 -0
- package/docs/server.defaultplayerentitycontroller.spawn.md +53 -0
- package/docs/server.defaultplayerentitycontroller.stickstoplatforms.md +13 -0
- package/docs/server.defaultplayerentitycontroller.swimfastvelocity.md +13 -0
- package/docs/server.defaultplayerentitycontroller.swimgravity.md +13 -0
- package/docs/server.defaultplayerentitycontroller.swimloopedanimations.md +13 -0
- package/docs/server.defaultplayerentitycontroller.swimmaxgravityvelocity.md +13 -0
- package/docs/server.defaultplayerentitycontroller.swimslowvelocity.md +13 -0
- package/docs/server.defaultplayerentitycontroller.swimupwardvelocity.md +13 -0
- package/docs/{server.playerentitycontroller.tickwithplayerinput.md → server.defaultplayerentitycontroller.tickwithplayerinput.md} +2 -2
- package/docs/server.defaultplayerentitycontroller.walkloopedanimations.md +13 -0
- package/docs/server.defaultplayerentitycontroller.walkvelocity.md +13 -0
- package/docs/server.defaultplayerentitycontrolleroptions.autocancelmouseleftclick.md +13 -0
- package/docs/server.defaultplayerentitycontrolleroptions.canjump.md +13 -0
- package/docs/server.defaultplayerentitycontrolleroptions.canrun.md +13 -0
- package/docs/server.defaultplayerentitycontrolleroptions.canwalk.md +13 -0
- package/docs/server.defaultplayerentitycontrolleroptions.idleloopedanimations.md +13 -0
- package/docs/server.defaultplayerentitycontrolleroptions.interactoneshotanimations.md +13 -0
- package/docs/server.defaultplayerentitycontrolleroptions.jumponeshotanimations.md +13 -0
- package/docs/server.defaultplayerentitycontrolleroptions.jumpvelocity.md +13 -0
- package/docs/server.defaultplayerentitycontrolleroptions.md +399 -0
- package/docs/server.defaultplayerentitycontrolleroptions.runloopedanimations.md +13 -0
- package/docs/server.defaultplayerentitycontrolleroptions.runvelocity.md +13 -0
- package/docs/server.defaultplayerentitycontrolleroptions.stickstoplatforms.md +13 -0
- package/docs/server.defaultplayerentitycontrolleroptions.swimfastvelocity.md +13 -0
- package/docs/server.defaultplayerentitycontrolleroptions.swimgravity.md +13 -0
- package/docs/server.defaultplayerentitycontrolleroptions.swimloopedanimations.md +13 -0
- package/docs/server.defaultplayerentitycontrolleroptions.swimmaxgravityvelocity.md +13 -0
- package/docs/server.defaultplayerentitycontrolleroptions.swimslowvelocity.md +13 -0
- package/docs/server.defaultplayerentitycontrolleroptions.swimupwardvelocity.md +13 -0
- package/docs/server.defaultplayerentitycontrolleroptions.walkloopedanimations.md +13 -0
- package/docs/server.defaultplayerentitycontrolleroptions.walkvelocity.md +13 -0
- package/docs/server.defaultplayerentityoptions.md +15 -0
- package/docs/server.entity.md +21 -0
- package/docs/server.entity.modelpreferredshape.md +13 -0
- package/docs/server.md +77 -22
- package/docs/server.modelboundingbox.md +18 -0
- package/docs/server.modelentityoptions.md +19 -0
- package/docs/server.modelentityoptions.modelpreferredshape.md +13 -0
- package/docs/server.modelregistry.getboundingbox.md +1 -1
- package/docs/server.modelregistry.gettrimesh.md +71 -0
- package/docs/server.modelregistry.md +14 -0
- package/docs/server.modeltrimesh.md +16 -0
- package/docs/server.playerentity.md +1 -1
- package/docs/server.wedgecollideroptions.extents.md +13 -0
- package/docs/server.wedgecollideroptions.md +75 -0
- package/docs/server.wedgecollideroptions.shape.md +11 -0
- package/docs/server.world.loadmap.md +1 -1
- package/docs/server.world.md +1 -1
- package/examples/ai-agents/index.ts +2 -6
- package/examples/big-world/index.ts +2 -5
- package/examples/block-entity/index.ts +2 -5
- package/examples/child-entity/index.ts +2 -5
- package/examples/custom-ui/index.ts +3 -6
- package/examples/entity-controller/index.ts +2 -5
- package/examples/entity-spawn/index.ts +2 -5
- package/examples/hole-in-wall-game/index.ts +8 -9
- package/examples/hygrounds/classes/GameManager.ts +1 -0
- package/examples/hygrounds/classes/GamePlayerEntity.ts +5 -6
- package/examples/lighting/index.ts +3 -6
- package/examples/mobile-controls/index.ts +2 -5
- package/examples/pathfinding/index.ts +2 -5
- package/examples/payload-game/index.ts +15 -17
- package/examples/player-persistence/index.ts +2 -5
- package/examples/wall-dodge-game/index.ts +8 -11
- package/examples/zombies-fps/classes/GamePlayerEntity.ts +5 -8
- package/package.json +1 -1
- package/server.api.json +10086 -9232
- package/server.d.ts +241 -147
- package/server.js +143 -129
- package/docs/server.playerentitycontroller._constructor_.md +0 -49
- package/docs/server.playerentitycontroller.autocancelmouseleftclick.md +0 -13
- package/docs/server.playerentitycontroller.canjump.md +0 -13
- package/docs/server.playerentitycontroller.canrun.md +0 -13
- package/docs/server.playerentitycontroller.canwalk.md +0 -13
- package/docs/server.playerentitycontroller.idleloopedanimations.md +0 -13
- package/docs/server.playerentitycontroller.interactoneshotanimations.md +0 -13
- package/docs/server.playerentitycontroller.isgrounded.md +0 -13
- package/docs/server.playerentitycontroller.isonplatform.md +0 -13
- package/docs/server.playerentitycontroller.jumponeshotanimations.md +0 -13
- package/docs/server.playerentitycontroller.jumpvelocity.md +0 -13
- package/docs/server.playerentitycontroller.md +0 -464
- package/docs/server.playerentitycontroller.platform.md +0 -13
- package/docs/server.playerentitycontroller.runloopedanimations.md +0 -13
- package/docs/server.playerentitycontroller.runvelocity.md +0 -13
- package/docs/server.playerentitycontroller.spawn.md +0 -53
- package/docs/server.playerentitycontroller.stickstoplatforms.md +0 -13
- package/docs/server.playerentitycontroller.walkloopedanimations.md +0 -13
- package/docs/server.playerentitycontroller.walkvelocity.md +0 -13
- package/docs/server.playerentitycontrolleroptions.autocancelmouseleftclick.md +0 -13
- package/docs/server.playerentitycontrolleroptions.canjump.md +0 -13
- package/docs/server.playerentitycontrolleroptions.canrun.md +0 -13
- package/docs/server.playerentitycontrolleroptions.canwalk.md +0 -13
- package/docs/server.playerentitycontrolleroptions.idleloopedanimations.md +0 -13
- package/docs/server.playerentitycontrolleroptions.interactoneshotanimations.md +0 -13
- package/docs/server.playerentitycontrolleroptions.jumponeshotanimations.md +0 -13
- package/docs/server.playerentitycontrolleroptions.jumpvelocity.md +0 -13
- package/docs/server.playerentitycontrolleroptions.md +0 -285
- package/docs/server.playerentitycontrolleroptions.runloopedanimations.md +0 -13
- package/docs/server.playerentitycontrolleroptions.runvelocity.md +0 -13
- package/docs/server.playerentitycontrolleroptions.stickstoplatforms.md +0 -13
- package/docs/server.playerentitycontrolleroptions.walkloopedanimations.md +0 -13
- package/docs/server.playerentitycontrolleroptions.walkvelocity.md +0 -13
@@ -1,7 +1,7 @@
|
|
1
1
|
import {
|
2
2
|
startServer,
|
3
3
|
ColliderShape,
|
4
|
-
|
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
|
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
|
-
|
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
|
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,
|
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
|
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
|
-
|
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
|
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
|
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<
|
57
|
-
const GAME_PLAYER_ENTITIES = new Set<
|
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
|
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 >
|
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 <=
|
274
|
+
if (GAME_PLAYER_ENTITIES.size <= 1) {
|
276
275
|
endGame();
|
277
276
|
}
|
278
277
|
|
@@ -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
|
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():
|
62
|
-
return this.controller as
|
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
|
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
|
-
|
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
|
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
|
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
|
-
|
23
|
+
DefaultPlayerEntity,
|
24
|
+
DefaultPlayerEntityController,
|
24
25
|
ColliderShape,
|
25
26
|
CollisionGroup,
|
26
|
-
PlayerEntityController,
|
27
27
|
Entity,
|
28
28
|
EntityEvent,
|
29
|
-
|
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
|
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
|
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
|
-
|
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
|
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<
|
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
|
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
|
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<
|
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
|
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:
|
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
|
-
|
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
|
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:
|
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
|
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
|
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:
|
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:
|
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
|
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:
|
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
|
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():
|
50
|
-
return this.controller as
|
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