UNPKG

@dao3fun/player-fall-manager

Version:

管理玩家的坠落,实时计算坠落开始到结束期间的数据并返回。

88 lines 3.85 kB
export default class PlayerFallManager { constructor(FallConfig) { this.players = new Map(); this.isLog = false; this.thresholdY = FallConfig.thresholdY; this.onThresholdExceeded = FallConfig.onThresholdExceeded; this.tickToken = world.onTick(this.checkPlayersFall.bind(this)); } addPlayer(fallConfig) { const normalizeFallConfig = this.normalizeFallConfig(fallConfig); return this.players.set(normalizeFallConfig.entity.id || normalizeFallConfig.entity.player.userId, normalizeFallConfig); } removePlayer(id) { return this.players.delete(id); } checkPlayersFall({ elapsedTimeMS }) { for (const [id, fallConfig] of this.players) { this.checkPlayerFall(fallConfig, elapsedTimeMS); } } checkPlayerFall(fallConfig, elapsedTimeMS) { const player = fallConfig.entity.player; if (player.moveState === GamePlayerMoveState.FALL || player.moveState === GamePlayerMoveState.DOUBLE_JUMP || player.moveState === GamePlayerMoveState.JUMP) { this.handlePlayerFalling(player, fallConfig.entity.position.y, elapsedTimeMS); } else if (player.moveState === GamePlayerMoveState.GROUND) { this.handlePlayerLanding(player, fallConfig.entity.position.y, fallConfig); } } handlePlayerFalling(player, positionY, elapsedTimeMS) { if (player.PlayerFallManager_jumpStartTime === undefined) { player.PlayerFallManager_jumpStartTime = Date.now(); player.PlayerFallManager_jumpStartY = positionY; } player.PlayerFallManager_fallTime = Math.max(0, player.PlayerFallManager_fallTime + elapsedTimeMS); } handlePlayerLanding(player, landingY, fallConfig) { var _a; if (player.PlayerFallManager_jumpStartTime !== undefined) { const fallDistance = landingY - player.PlayerFallManager_jumpStartY; const absFallDistance = Math.abs(fallDistance); if (fallDistance < 0 && absFallDistance > ((_a = fallConfig.thresholdY) !== null && _a !== void 0 ? _a : this.thresholdY)) { const obj = { entity: fallConfig.entity, time: { start: player.PlayerFallManager_jumpStartTime, end: Date.now(), fallTimeMS: player.PlayerFallManager_fallTime }, yDistance: { start: player.PlayerFallManager_jumpStartY, end: landingY, absFallDistance, }, }; if (this.isLog) { console.log(` --------玩家坠落管理日志-------- |---玩家: ${fallConfig.entity.player.name}${fallConfig.entity.player.userId}), |---时间: { |---|---开始: ${player.PlayerFallManager_jumpStartTime}, |---|---结束: ${Date.now()}, |---|---差异: ${player.PlayerFallManager_fallTime} |---}, |---Y轴: { |---|---开始: ${player.PlayerFallManager_jumpStartY}, |---|---结束: ${landingY}, |---|---差异: ${absFallDistance}, |---} ---------------------- `); } fallConfig.onThresholdExceeded ? fallConfig.onThresholdExceeded.call(this, obj) : this.onThresholdExceeded.call(this, obj); } player.PlayerFallManager_jumpStartTime = undefined; player.PlayerFallManager_jumpStartY = undefined; } player.PlayerFallManager_fallTime = 0; } normalizeFallConfig(fallConfig) { if (fallConfig instanceof GameEntity) { return { entity: fallConfig, }; } return fallConfig; } }