@dao3fun/player-fall-manager
Version:
管理玩家的坠落,实时计算坠落开始到结束期间的数据并返回。
88 lines • 3.85 kB
JavaScript
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;
}
}