hytopia
Version:
The HYTOPIA SDK makes it easy for developers to create massively multiplayer games using JavaScript or TypeScript.
58 lines (47 loc) • 1.84 kB
text/typescript
import { Quaternion } from 'hytopia';
import type { PlayerEntity, Vector3Like, QuaternionLike } from 'hytopia';
import GunEntity from '../GunEntity';
import type { GunEntityOptions } from '../GunEntity';
export default class PistolEntity extends GunEntity {
public constructor(options: Partial<GunEntityOptions> = {}) {
super({
ammo: options.ammo ?? 10,
damage: options.damage ?? 3,
fireRate: options.fireRate ?? 9,
hand: options.hand ?? 'right',
iconImageUri: options.iconImageUri ?? 'icons/pistol.png',
idleAnimation: options.idleAnimation ?? 'idle_gun_right',
name: options.name ?? 'Pistol',
maxAmmo: options.maxAmmo ?? 10,
modelUri: options.modelUri ?? 'models/items/pistol.glb',
modelScale: options.modelScale ?? 1.3,
parent: options.parent,
range: options.range ?? 50,
reloadAudioUri: options.reloadAudioUri ?? 'audio/sfx/pistol-reload.mp3',
reloadTimeMs: options.reloadTimeMs ?? 1250,
shootAnimation: options.shootAnimation ?? 'shoot_gun_right',
shootAudioUri: options.shootAudioUri ?? 'audio/sfx/pistol-shoot.mp3',
});
}
public override shoot() {
if (!this.parent || !this.processShoot()) {
return;
}
const parentPlayerEntity = this.parent as PlayerEntity;
if (!parentPlayerEntity.world) {
return;
}
// shoot the bullet
super.shoot();
// cancel the input, pistols require click to shoot
parentPlayerEntity.player.input.ml = false;
// play shoot animation
parentPlayerEntity.startModelOneshotAnimations([ 'shoot_gun_right' ]);
}
public override getMuzzleFlashPositionRotation(): { position: Vector3Like, rotation: QuaternionLike } {
return {
position: { x: 0.03, y: 0.1, z: -0.5 },
rotation: Quaternion.fromEuler(0, 90, 0),
};
}
}