hytopia 0.1.55 → 0.1.57
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/boilerplate/index.ts +1 -1
- package/docs/server.baseentitycontroller.attach.md +53 -0
- package/docs/server.baseentitycontroller.despawn.md +53 -0
- package/docs/server.baseentitycontroller.detach.md +53 -0
- package/docs/server.baseentitycontroller.md +260 -0
- package/docs/server.baseentitycontroller.onattach.md +13 -0
- package/docs/server.baseentitycontroller.ondespawn.md +13 -0
- package/docs/server.baseentitycontroller.ondetach.md +13 -0
- package/docs/server.baseentitycontroller.onspawn.md +13 -0
- package/docs/server.baseentitycontroller.ontick.md +13 -0
- package/docs/server.baseentitycontroller.ontickwithplayerinput.md +13 -0
- package/docs/server.baseentitycontroller.spawn.md +53 -0
- package/docs/server.baseentitycontroller.tick.md +67 -0
- package/docs/{server.basecharactercontroller.tickwithplayerinput.md → server.baseentitycontroller.tickwithplayerinput.md} +20 -4
- package/docs/server.entity.controller.md +13 -0
- package/docs/server.entity.md +34 -18
- package/docs/server.entity.modelanimationsplaybackrate.md +13 -0
- package/docs/server.entity.setcontroller.md +53 -0
- package/docs/server.entity.setmodelanimationsplaybackrate.md +57 -0
- package/docs/server.entityeventpayload.md +9 -0
- package/docs/server.entityeventpayload.setmodelanimationsplaybackrate.entity.md +11 -0
- package/docs/server.entityeventpayload.setmodelanimationsplaybackrate.md +70 -0
- package/docs/server.entityeventpayload.setmodelanimationsplaybackrate.playbackrate.md +11 -0
- package/docs/server.entityeventtype.md +14 -0
- package/docs/server.entityoptions.controller.md +13 -0
- package/docs/server.entityoptions.md +22 -3
- package/docs/server.entityoptions.modelanimationsplaybackrate.md +13 -0
- package/docs/server.facecallback.md +1 -1
- package/docs/server.facecompletecallback.md +1 -1
- package/docs/server.faceoptions.md +1 -1
- package/docs/server.md +27 -27
- package/docs/server.movecallback.md +1 -1
- package/docs/server.movecompletecallback.md +1 -1
- package/docs/server.moveoptions.md +1 -1
- package/docs/server.playerentity.md +1 -1
- package/docs/server.playerentitycontroller._constructor_.md +49 -0
- package/docs/server.playerentitycontroller.attach.md +53 -0
- package/docs/server.playerentitycontroller.canjump.md +13 -0
- package/docs/server.playerentitycontroller.canrun.md +13 -0
- package/docs/server.playerentitycontroller.canwalk.md +13 -0
- package/docs/server.playerentitycontroller.isgrounded.md +13 -0
- package/docs/server.playerentitycontroller.isonplatform.md +13 -0
- package/docs/server.playerentitycontroller.jumpvelocity.md +13 -0
- package/docs/server.playerentitycontroller.md +331 -0
- package/docs/server.playerentitycontroller.platform.md +13 -0
- package/docs/server.playerentitycontroller.runvelocity.md +13 -0
- package/docs/server.playerentitycontroller.spawn.md +53 -0
- package/docs/{server.defaultcharactercontroller.tickwithplayerinput.md → server.playerentitycontroller.tickwithplayerinput.md} +20 -4
- package/docs/server.playerentitycontroller.walkvelocity.md +13 -0
- package/docs/server.playerentitycontrolleroptions.canjump.md +13 -0
- package/docs/server.playerentitycontrolleroptions.canrun.md +13 -0
- package/docs/server.playerentitycontrolleroptions.canwalk.md +13 -0
- package/docs/server.playerentitycontrolleroptions.jumpvelocity.md +13 -0
- package/docs/{server.defaultcharactercontrolleroptions.md → server.playerentitycontrolleroptions.md} +10 -10
- package/docs/server.playerentitycontrolleroptions.runvelocity.md +13 -0
- package/docs/server.playerentitycontrolleroptions.walkvelocity.md +13 -0
- package/docs/server.playerui.lockpointer.md +53 -0
- package/docs/server.playerui.md +14 -0
- package/docs/server.playeruieventpayload.lockpointer.lock.md +11 -0
- package/docs/server.playeruieventpayload.lockpointer.md +70 -0
- package/docs/server.playeruieventpayload.lockpointer.playerui.md +11 -0
- package/docs/server.playeruieventpayload.md +9 -0
- package/docs/server.playeruieventtype.md +14 -0
- package/docs/{server.simplecharactercontroller.face.md → server.simpleentitycontroller.face.md} +2 -2
- package/docs/{server.simplecharactercontroller.md → server.simpleentitycontroller.md} +11 -13
- package/docs/{server.simplecharactercontroller.move.md → server.simpleentitycontroller.move.md} +2 -2
- package/examples/block-entity/index.ts +7 -7
- package/examples/custom-ui/index.ts +1 -1
- package/examples/entity-controller/MyEntityController.ts +321 -0
- package/examples/entity-controller/README.md +4 -0
- package/examples/{character-controller → entity-controller}/index.ts +6 -11
- package/examples/{character-controller → entity-controller}/package.json +1 -1
- package/examples/payload-game/index.ts +18 -19
- package/package.json +1 -1
- package/server.api.json +4129 -3498
- package/server.d.ts +229 -167
- package/server.js +85 -85
- package/docs/server.basecharactercontroller._constructor_.md +0 -65
- package/docs/server.basecharactercontroller.createcolliders.md +0 -19
- package/docs/server.basecharactercontroller.entity.md +0 -13
- package/docs/server.basecharactercontroller.md +0 -197
- package/docs/server.basecharactercontroller.ontick.md +0 -13
- package/docs/server.basecharactercontroller.ontickwithplayerinput.md +0 -13
- package/docs/server.basecharactercontroller.tick.md +0 -53
- package/docs/server.defaultcharactercontroller._constructor_.md +0 -65
- package/docs/server.defaultcharactercontroller.canjump.md +0 -13
- package/docs/server.defaultcharactercontroller.canrun.md +0 -13
- package/docs/server.defaultcharactercontroller.canwalk.md +0 -13
- package/docs/server.defaultcharactercontroller.createcolliders.md +0 -19
- package/docs/server.defaultcharactercontroller.isgrounded.md +0 -13
- package/docs/server.defaultcharactercontroller.isonplatform.md +0 -13
- package/docs/server.defaultcharactercontroller.jumpvelocity.md +0 -13
- package/docs/server.defaultcharactercontroller.md +0 -319
- package/docs/server.defaultcharactercontroller.platform.md +0 -13
- package/docs/server.defaultcharactercontroller.runvelocity.md +0 -13
- package/docs/server.defaultcharactercontroller.walkvelocity.md +0 -13
- package/docs/server.defaultcharactercontrolleroptions.canjump.md +0 -13
- package/docs/server.defaultcharactercontrolleroptions.canrun.md +0 -13
- package/docs/server.defaultcharactercontrolleroptions.canwalk.md +0 -13
- package/docs/server.defaultcharactercontrolleroptions.jumpvelocity.md +0 -13
- package/docs/server.defaultcharactercontrolleroptions.runvelocity.md +0 -13
- package/docs/server.defaultcharactercontrolleroptions.walkvelocity.md +0 -13
- package/docs/server.entity.charactercontroller.md +0 -13
- package/docs/server.entity.createcustomcharactercontroller.md +0 -13
- package/docs/server.entity.setcharactercontroller.md +0 -53
- package/docs/server.entityoptions.createcustomcharactercontroller.md +0 -13
- package/examples/character-controller/MyCharacterController.ts +0 -250
- package/examples/character-controller/README.md +0 -4
- /package/examples/{character-controller → entity-controller}/assets/map.json +0 -0
@@ -1,250 +0,0 @@
|
|
1
|
-
import {
|
2
|
-
Audio,
|
3
|
-
BaseCharacterController,
|
4
|
-
CollisionGroup,
|
5
|
-
Collider,
|
6
|
-
Entity,
|
7
|
-
ColliderShape,
|
8
|
-
CoefficientCombineRule,
|
9
|
-
BlockType,
|
10
|
-
} from 'hytopia';
|
11
|
-
|
12
|
-
import type {
|
13
|
-
PlayerInput,
|
14
|
-
PlayerCameraOrientation,
|
15
|
-
Vector3,
|
16
|
-
} from 'hytopia';
|
17
|
-
|
18
|
-
export default class MyCharacterController extends BaseCharacterController {
|
19
|
-
public jumpVelocity: number = 10;
|
20
|
-
public runVelocity: number = 8;
|
21
|
-
public walkVelocity: number = 4;
|
22
|
-
|
23
|
-
private _stepAudio: Audio;
|
24
|
-
private _groundContactCount: number = 0;
|
25
|
-
private _platform: Entity | undefined;
|
26
|
-
|
27
|
-
public constructor(entity: Entity) {
|
28
|
-
super(entity);
|
29
|
-
|
30
|
-
// Setup any audio or dependencies in the constructor.
|
31
|
-
this._stepAudio = new Audio({
|
32
|
-
uri: 'audio/sfx/step.wav',
|
33
|
-
loop: true,
|
34
|
-
volume: 0.1,
|
35
|
-
attachedToEntity: this.entity,
|
36
|
-
});
|
37
|
-
|
38
|
-
this.entity.lockAllRotations(); // prevent physics from applying rotation to the entity.
|
39
|
-
}
|
40
|
-
|
41
|
-
/** Whether the entity is grounded. */
|
42
|
-
public get isGrounded(): boolean { return this._groundContactCount > 0; }
|
43
|
-
|
44
|
-
/** Whether the entity is on a platform, a platform is any entity with a kinematic rigid body. */
|
45
|
-
public get isOnPlatform(): boolean { return !!this._platform; }
|
46
|
-
|
47
|
-
/** The platform the entity is on, if any. */
|
48
|
-
public get platform(): Entity | undefined { return this._platform; }
|
49
|
-
|
50
|
-
/**
|
51
|
-
* Create the colliders for the character controller.
|
52
|
-
*/
|
53
|
-
public createColliders(): Collider[] {
|
54
|
-
if (!this.entity.isSpawned) {
|
55
|
-
throw new Error('CharacterController.createSensorColliders(): Entity is not spawned!');
|
56
|
-
}
|
57
|
-
|
58
|
-
const colliders: Collider[] = [];
|
59
|
-
|
60
|
-
/**
|
61
|
-
* Our ground sensor detects when we're on the ground.
|
62
|
-
* It assumes a cylinder shape and is positioned manually
|
63
|
-
* relative to the default entity rigid body as defined
|
64
|
-
* by the DEFAULT_ENTITY_RIGID_BODY_OPTIONS constant of
|
65
|
-
* the hytopia package.
|
66
|
-
*/
|
67
|
-
colliders.push(new Collider({
|
68
|
-
shape: ColliderShape.CYLINDER,
|
69
|
-
radius: 0.30,
|
70
|
-
halfHeight: 0.125,
|
71
|
-
collisionGroups: {
|
72
|
-
belongsTo: [ CollisionGroup.ENTITY_SENSOR ],
|
73
|
-
collidesWith: [ CollisionGroup.BLOCK, CollisionGroup.ENTITY ],
|
74
|
-
},
|
75
|
-
isSensor: true,
|
76
|
-
relativeTranslation: { x: 0, y: -0.75, z: 0 },
|
77
|
-
tag: 'groundSensor',
|
78
|
-
onCollision: (_other: BlockType | Entity, started: boolean) => {
|
79
|
-
// Ground contact
|
80
|
-
this._groundContactCount += started ? 1 : -1;
|
81
|
-
|
82
|
-
if (!this._groundContactCount) { // Trigger animations
|
83
|
-
this.entity.startModelOneshotAnimations([ 'jump_loop' ]);
|
84
|
-
} else {
|
85
|
-
this.entity.stopModelAnimations([ 'jump_loop' ]);
|
86
|
-
}
|
87
|
-
|
88
|
-
// Platform contact
|
89
|
-
if (!(_other instanceof Entity) || !_other.isKinematic) return;
|
90
|
-
|
91
|
-
if (started) {
|
92
|
-
this._platform = _other;
|
93
|
-
} else if (_other === this._platform && !started) {
|
94
|
-
this._platform = undefined;
|
95
|
-
}
|
96
|
-
},
|
97
|
-
}));
|
98
|
-
|
99
|
-
/**
|
100
|
-
* A wall collider slightly larger than our player hitbox with
|
101
|
-
* a collision group that only collides with blocks. This prevent
|
102
|
-
* sticking and friction to blocks as a player moves, creating
|
103
|
-
* a smooth slide effect on walls that we jump into, etc.
|
104
|
-
*/
|
105
|
-
colliders.push(new Collider({
|
106
|
-
shape: ColliderShape.CAPSULE,
|
107
|
-
halfHeight: 0.30,
|
108
|
-
radius: 0.37,
|
109
|
-
collisionGroups: {
|
110
|
-
belongsTo: [ CollisionGroup.ENTITY_SENSOR ],
|
111
|
-
collidesWith: [ CollisionGroup.BLOCK ],
|
112
|
-
},
|
113
|
-
friction: 0,
|
114
|
-
frictionCombineRule: CoefficientCombineRule.Min,
|
115
|
-
tag: 'wallCollider',
|
116
|
-
}));
|
117
|
-
|
118
|
-
return colliders;
|
119
|
-
}
|
120
|
-
|
121
|
-
/**
|
122
|
-
* Handles movement of the entity based on player's input
|
123
|
-
* each tick. tickPlayerMovement is called internally if the entity
|
124
|
-
* is of the PlayerEntity class.
|
125
|
-
*/
|
126
|
-
public tickWithPlayerInput(input: PlayerInput, cameraOrientation: PlayerCameraOrientation, deltaTimeMs: number) {
|
127
|
-
if (!this.entity.isSpawned || !this.entity.world) return; // type guard.
|
128
|
-
|
129
|
-
super.tickWithPlayerInput(input, cameraOrientation, deltaTimeMs);
|
130
|
-
|
131
|
-
const { w, a, s, d, sp, sh, ml, mr } = input; // See PlayerInput type for all possible inputs.
|
132
|
-
const { yaw } = cameraOrientation; // Camera/perspectie orientation of player.
|
133
|
-
const currentVelocity = this.entity.getLinearVelocity();
|
134
|
-
const targetVelocities = { x: 0, y: 0, z: 0 };
|
135
|
-
const isRunning = sh;
|
136
|
-
|
137
|
-
// Handle movement animations if relevant.
|
138
|
-
if (w || a || s || d) {
|
139
|
-
if (isRunning) {
|
140
|
-
// We stop irrelevant animations to prevent blending issues.
|
141
|
-
this.entity.stopModelAnimations(Array.from(this.entity.modelLoopedAnimations).filter(v => v !== 'run'));
|
142
|
-
// If run is already playing, internally startModelLoopedAnimations will do nothing.
|
143
|
-
this.entity.startModelLoopedAnimations([ 'run' ]);
|
144
|
-
// Manually set a playback rate of our step audio to audibly sync to our walk speed.
|
145
|
-
this._stepAudio.setPlaybackRate(0.83);
|
146
|
-
} else {
|
147
|
-
this.entity.stopModelAnimations(Array.from(this.entity.modelLoopedAnimations).filter(v => v !== 'walk'));
|
148
|
-
this.entity.startModelLoopedAnimations([ 'walk' ]);
|
149
|
-
this._stepAudio.setPlaybackRate(0.5);
|
150
|
-
}
|
151
|
-
|
152
|
-
this._stepAudio.play(this.entity.world, !this._stepAudio.isPlaying);
|
153
|
-
} else {
|
154
|
-
this._stepAudio.pause();
|
155
|
-
this.entity.stopModelAnimations(Array.from(this.entity.modelLoopedAnimations).filter(v => v !== 'idle'));
|
156
|
-
this.entity.startModelLoopedAnimations([ 'idle' ]);
|
157
|
-
}
|
158
|
-
|
159
|
-
// Play a simple interact animation on left mouse click then clear the input.
|
160
|
-
if (ml) {
|
161
|
-
this.entity.startModelOneshotAnimations([ 'simple_interact' ]);
|
162
|
-
input.ml = false;
|
163
|
-
}
|
164
|
-
|
165
|
-
// Rocket the player up on mouse right click.
|
166
|
-
if (mr) {
|
167
|
-
targetVelocities.y = 20;
|
168
|
-
input.mr = false;
|
169
|
-
}
|
170
|
-
|
171
|
-
// Calculate target horizontal velocities (run/walk)
|
172
|
-
const velocity = isRunning ? this.runVelocity : this.walkVelocity;
|
173
|
-
|
174
|
-
if (w) {
|
175
|
-
targetVelocities.x -= velocity * Math.sin(yaw);
|
176
|
-
targetVelocities.z -= velocity * Math.cos(yaw);
|
177
|
-
}
|
178
|
-
|
179
|
-
if (s) {
|
180
|
-
targetVelocities.x += velocity * Math.sin(yaw);
|
181
|
-
targetVelocities.z += velocity * Math.cos(yaw);
|
182
|
-
}
|
183
|
-
|
184
|
-
if (a) {
|
185
|
-
targetVelocities.x -= velocity * Math.cos(yaw);
|
186
|
-
targetVelocities.z += velocity * Math.sin(yaw);
|
187
|
-
}
|
188
|
-
|
189
|
-
if (d) {
|
190
|
-
targetVelocities.x += velocity * Math.cos(yaw);
|
191
|
-
targetVelocities.z -= velocity * Math.sin(yaw);
|
192
|
-
}
|
193
|
-
|
194
|
-
// Normalize for diagonals
|
195
|
-
const length = Math.sqrt(targetVelocities.x * targetVelocities.x + targetVelocities.z * targetVelocities.z);
|
196
|
-
if (length > velocity) {
|
197
|
-
const factor = velocity / length;
|
198
|
-
targetVelocities.x *= factor;
|
199
|
-
targetVelocities.z *= factor;
|
200
|
-
}
|
201
|
-
|
202
|
-
// Calculate target vertical velocity (jump)
|
203
|
-
if (sp) {
|
204
|
-
if (this.isGrounded && currentVelocity.y <= 3) {
|
205
|
-
targetVelocities.y = this.jumpVelocity;
|
206
|
-
}
|
207
|
-
}
|
208
|
-
|
209
|
-
// Apply impulse relative to target velocities, taking platform velocity into account
|
210
|
-
const platformVelocity = this._platform ? this._platform.getLinearVelocity() : { x: 0, y: 0, z: 0 };
|
211
|
-
const deltaVelocities = {
|
212
|
-
x: targetVelocities.x - currentVelocity.x + platformVelocity.x,
|
213
|
-
y: targetVelocities.y + platformVelocity.y,
|
214
|
-
z: targetVelocities.z - currentVelocity.z + platformVelocity.z,
|
215
|
-
};
|
216
|
-
|
217
|
-
const hasExternalVelocity =
|
218
|
-
Math.abs(currentVelocity.x) > this.runVelocity ||
|
219
|
-
Math.abs(currentVelocity.y) > this.jumpVelocity ||
|
220
|
-
Math.abs(currentVelocity.z) > this.runVelocity;
|
221
|
-
|
222
|
-
if (!hasExternalVelocity) { // allow external velocities like impulses to resolve, otherwise our deltas will cancel them out.
|
223
|
-
if (Object.values(deltaVelocities).some(v => v !== 0)) {
|
224
|
-
const mass = this.entity.getMass();
|
225
|
-
|
226
|
-
this.entity.applyImpulse({ // multiply by mass for the impulse to result in applying the correct target velocity
|
227
|
-
x: deltaVelocities.x * mass,
|
228
|
-
y: deltaVelocities.y * mass,
|
229
|
-
z: deltaVelocities.z * mass,
|
230
|
-
});
|
231
|
-
}
|
232
|
-
}
|
233
|
-
|
234
|
-
// Apply rotation relative to camera orientation.
|
235
|
-
if (yaw !== undefined) {
|
236
|
-
const halfYaw = yaw / 2;
|
237
|
-
|
238
|
-
this.entity.setRotation({
|
239
|
-
x: 0,
|
240
|
-
y: Math.fround(Math.sin(halfYaw)),
|
241
|
-
z: 0,
|
242
|
-
w: Math.fround(Math.cos(halfYaw)),
|
243
|
-
});
|
244
|
-
}
|
245
|
-
}
|
246
|
-
|
247
|
-
public tickPathfindingMovement(_destination: Vector3, _deltaTimeMs: number) {
|
248
|
-
console.log('Non-player pathfinding not implemented!');
|
249
|
-
}
|
250
|
-
}
|
File without changes
|