hytopia
Version:
The HYTOPIA SDK makes it easy for developers to create massively multiplayer games using JavaScript or TypeScript.
69 lines (59 loc) • 2.2 kB
text/typescript
import { GameServer, PathfindingEntityController } from 'hytopia';
import type { QuaternionLike, Vector3Like, World } from 'hytopia';
import EnemyEntity from '../EnemyEntity';
import type { EnemyEntityOptions } from '../EnemyEntity';
import type GamePlayerEntity from '../GamePlayerEntity';
export default class RipperEntity extends EnemyEntity {
public constructor(options: Partial<EnemyEntityOptions> = {}) {
const speed = options.speed ?? 2;
const animation = speed > 6 ? 'animation.ripper_zombie.sprint' : 'animation.ripper_zombie.walk';
super({
damage: options.damage ?? 6,
damageAudioUri: options.damageAudioUri ?? 'audio/sfx/entity/zombie/zombie-hurt.mp3',
health: options.health ?? 300,
idleAudioUri: options.idleAudioUri ?? 'audio/sfx/ripper-idle.mp3',
idleAudioVolume: 1,
idleAudioReferenceDistance: 8,
jumpHeight: options.jumpHeight ?? 2,
preferJumping: true,
reward: options.reward ?? 300,
speed,
controller: new PathfindingEntityController(),
modelUri: 'models/npcs/ripper-boss.gltf',
modelLoopedAnimations: [ animation ],
modelScale: 0.5,
rigidBodyOptions: {
enabledRotations: { x: false, y: true, z: false },
ccdEnabled: true,
},
});
}
public override spawn(world: World, position: Vector3Like, rotation?: QuaternionLike) {
super.spawn(world, position, rotation);
this._updateBossUI({
type: 'boss',
name: 'BOSS: RIPPER',
health: this.health,
maxHealth: this.maxHealth,
show: true,
});
}
public override takeDamage(damage: number, fromPlayer: GamePlayerEntity) {
// Do the UI check first, because otherwise
// takeDamage can trigger a despawn if health < 0
this._updateBossUI({
type: 'boss',
show: this.health - damage > 0,
healthPercent: ((this.health - damage) / this.maxHealth) * 100,
});
super.takeDamage(damage, fromPlayer);
}
private _updateBossUI(data = {}) {
if (!this.world) {
return;
}
GameServer.instance.playerManager.getConnectedPlayersByWorld(this.world).forEach(player => {
player.ui.sendData(data);
});
}
}