Add bunny hop and max speed settings to player movement template

This commit is contained in:
2026-04-11 20:30:19 +02:00
parent 91790affcb
commit 985557efb2

View File

@@ -147,6 +147,8 @@ export interface PlayerStartJumpSettings {
coyoteTimeMs: number; coyoteTimeMs: number;
variableHeight: boolean; variableHeight: boolean;
maxHoldMs: number; maxHoldMs: number;
bunnyHop: boolean;
bunnyHopBoost: number;
} }
export interface PlayerStartSprintSettings { export interface PlayerStartSprintSettings {
@@ -160,6 +162,7 @@ export interface PlayerStartCrouchSettings {
export interface PlayerStartMovementTemplate { export interface PlayerStartMovementTemplate {
kind: PlayerStartMovementTemplateKind; kind: PlayerStartMovementTemplateKind;
moveSpeed: number; moveSpeed: number;
maxSpeed: number;
capabilities: PlayerStartMovementCapabilities; capabilities: PlayerStartMovementCapabilities;
jump: PlayerStartJumpSettings; jump: PlayerStartJumpSettings;
sprint: PlayerStartSprintSettings; sprint: PlayerStartSprintSettings;
@@ -169,6 +172,7 @@ export interface PlayerStartMovementTemplate {
export interface PlayerStartMovementTemplateOverrides { export interface PlayerStartMovementTemplateOverrides {
kind?: PlayerStartMovementTemplateKind; kind?: PlayerStartMovementTemplateKind;
moveSpeed?: number; moveSpeed?: number;
maxSpeed?: number;
capabilities?: Partial<PlayerStartMovementCapabilities>; capabilities?: Partial<PlayerStartMovementCapabilities>;
jump?: Partial<PlayerStartJumpSettings>; jump?: Partial<PlayerStartJumpSettings>;
sprint?: Partial<PlayerStartSprintSettings>; sprint?: Partial<PlayerStartSprintSettings>;
@@ -288,11 +292,14 @@ export const DEFAULT_PLAYER_START_NAVIGATION_MODE: PlayerStartNavigationMode =
export const DEFAULT_PLAYER_START_MOVEMENT_TEMPLATE_KIND: PlayerStartMovementTemplateKind = export const DEFAULT_PLAYER_START_MOVEMENT_TEMPLATE_KIND: PlayerStartMovementTemplateKind =
"default"; "default";
export const DEFAULT_PLAYER_START_MOVE_SPEED = 4.5; export const DEFAULT_PLAYER_START_MOVE_SPEED = 4.5;
export const DEFAULT_PLAYER_START_MAX_SPEED = 0;
export const DEFAULT_PLAYER_START_JUMP_SPEED = 7.2; export const DEFAULT_PLAYER_START_JUMP_SPEED = 7.2;
export const DEFAULT_PLAYER_START_JUMP_BUFFER_MS = 0; export const DEFAULT_PLAYER_START_JUMP_BUFFER_MS = 0;
export const DEFAULT_PLAYER_START_COYOTE_TIME_MS = 0; export const DEFAULT_PLAYER_START_COYOTE_TIME_MS = 0;
export const DEFAULT_PLAYER_START_VARIABLE_JUMP_HEIGHT = false; export const DEFAULT_PLAYER_START_VARIABLE_JUMP_HEIGHT = false;
export const DEFAULT_PLAYER_START_VARIABLE_JUMP_MAX_HOLD_MS = 160; export const DEFAULT_PLAYER_START_VARIABLE_JUMP_MAX_HOLD_MS = 160;
export const DEFAULT_PLAYER_START_BUNNY_HOP = false;
export const DEFAULT_PLAYER_START_BUNNY_HOP_BOOST = 0.05;
export const DEFAULT_PLAYER_START_SPRINT_SPEED_MULTIPLIER = 1.65; export const DEFAULT_PLAYER_START_SPRINT_SPEED_MULTIPLIER = 1.65;
export const DEFAULT_PLAYER_START_CROUCH_SPEED_MULTIPLIER = 0.45; export const DEFAULT_PLAYER_START_CROUCH_SPEED_MULTIPLIER = 0.45;
export const DEFAULT_PLAYER_START_MOVEMENT_CAPABILITIES: PlayerStartMovementCapabilities = export const DEFAULT_PLAYER_START_MOVEMENT_CAPABILITIES: PlayerStartMovementCapabilities =
@@ -306,7 +313,9 @@ export const DEFAULT_PLAYER_START_JUMP_SETTINGS: PlayerStartJumpSettings = {
bufferMs: DEFAULT_PLAYER_START_JUMP_BUFFER_MS, bufferMs: DEFAULT_PLAYER_START_JUMP_BUFFER_MS,
coyoteTimeMs: DEFAULT_PLAYER_START_COYOTE_TIME_MS, coyoteTimeMs: DEFAULT_PLAYER_START_COYOTE_TIME_MS,
variableHeight: DEFAULT_PLAYER_START_VARIABLE_JUMP_HEIGHT, variableHeight: DEFAULT_PLAYER_START_VARIABLE_JUMP_HEIGHT,
maxHoldMs: DEFAULT_PLAYER_START_VARIABLE_JUMP_MAX_HOLD_MS maxHoldMs: DEFAULT_PLAYER_START_VARIABLE_JUMP_MAX_HOLD_MS,
bunnyHop: DEFAULT_PLAYER_START_BUNNY_HOP,
bunnyHopBoost: DEFAULT_PLAYER_START_BUNNY_HOP_BOOST
}; };
export const DEFAULT_PLAYER_START_SPRINT_SETTINGS: PlayerStartSprintSettings = { export const DEFAULT_PLAYER_START_SPRINT_SETTINGS: PlayerStartSprintSettings = {
speedMultiplier: DEFAULT_PLAYER_START_SPRINT_SPEED_MULTIPLIER speedMultiplier: DEFAULT_PLAYER_START_SPRINT_SPEED_MULTIPLIER
@@ -322,7 +331,9 @@ export const RESPONSIVE_PLAYER_START_JUMP_SETTINGS: PlayerStartJumpSettings = {
bufferMs: RESPONSIVE_PLAYER_START_JUMP_BUFFER_MS, bufferMs: RESPONSIVE_PLAYER_START_JUMP_BUFFER_MS,
coyoteTimeMs: RESPONSIVE_PLAYER_START_COYOTE_TIME_MS, coyoteTimeMs: RESPONSIVE_PLAYER_START_COYOTE_TIME_MS,
variableHeight: true, variableHeight: true,
maxHoldMs: RESPONSIVE_PLAYER_START_VARIABLE_JUMP_MAX_HOLD_MS maxHoldMs: RESPONSIVE_PLAYER_START_VARIABLE_JUMP_MAX_HOLD_MS,
bunnyHop: DEFAULT_PLAYER_START_BUNNY_HOP,
bunnyHopBoost: DEFAULT_PLAYER_START_BUNNY_HOP_BOOST
}; };
export const DEFAULT_PLAYER_START_KEYBOARD_BINDINGS: PlayerStartKeyboardBindings = export const DEFAULT_PLAYER_START_KEYBOARD_BINDINGS: PlayerStartKeyboardBindings =
{ {
@@ -498,7 +509,9 @@ function clonePlayerStartJumpSettings(
bufferMs: settings.bufferMs, bufferMs: settings.bufferMs,
coyoteTimeMs: settings.coyoteTimeMs, coyoteTimeMs: settings.coyoteTimeMs,
variableHeight: settings.variableHeight, variableHeight: settings.variableHeight,
maxHoldMs: settings.maxHoldMs maxHoldMs: settings.maxHoldMs,
bunnyHop: settings.bunnyHop,
bunnyHopBoost: settings.bunnyHopBoost
}; };
} }
@@ -524,6 +537,7 @@ export function clonePlayerStartMovementTemplate(
return { return {
kind: template.kind, kind: template.kind,
moveSpeed: template.moveSpeed, moveSpeed: template.moveSpeed,
maxSpeed: template.maxSpeed,
capabilities: clonePlayerStartMovementCapabilities(template.capabilities), capabilities: clonePlayerStartMovementCapabilities(template.capabilities),
jump: clonePlayerStartJumpSettings(template.jump), jump: clonePlayerStartJumpSettings(template.jump),
sprint: clonePlayerStartSprintSettings(template.sprint), sprint: clonePlayerStartSprintSettings(template.sprint),
@@ -698,6 +712,7 @@ export function createPlayerStartMovementTemplate(
kind === "responsive" kind === "responsive"
? { ? {
moveSpeed: DEFAULT_PLAYER_START_MOVE_SPEED, moveSpeed: DEFAULT_PLAYER_START_MOVE_SPEED,
maxSpeed: DEFAULT_PLAYER_START_MAX_SPEED,
capabilities: DEFAULT_PLAYER_START_MOVEMENT_CAPABILITIES, capabilities: DEFAULT_PLAYER_START_MOVEMENT_CAPABILITIES,
jump: RESPONSIVE_PLAYER_START_JUMP_SETTINGS, jump: RESPONSIVE_PLAYER_START_JUMP_SETTINGS,
sprint: DEFAULT_PLAYER_START_SPRINT_SETTINGS, sprint: DEFAULT_PLAYER_START_SPRINT_SETTINGS,
@@ -705,12 +720,14 @@ export function createPlayerStartMovementTemplate(
} }
: { : {
moveSpeed: DEFAULT_PLAYER_START_MOVE_SPEED, moveSpeed: DEFAULT_PLAYER_START_MOVE_SPEED,
maxSpeed: DEFAULT_PLAYER_START_MAX_SPEED,
capabilities: DEFAULT_PLAYER_START_MOVEMENT_CAPABILITIES, capabilities: DEFAULT_PLAYER_START_MOVEMENT_CAPABILITIES,
jump: DEFAULT_PLAYER_START_JUMP_SETTINGS, jump: DEFAULT_PLAYER_START_JUMP_SETTINGS,
sprint: DEFAULT_PLAYER_START_SPRINT_SETTINGS, sprint: DEFAULT_PLAYER_START_SPRINT_SETTINGS,
crouch: DEFAULT_PLAYER_START_CROUCH_SETTINGS crouch: DEFAULT_PLAYER_START_CROUCH_SETTINGS
}; };
const moveSpeed = overrides.moveSpeed ?? preset.moveSpeed; const moveSpeed = overrides.moveSpeed ?? preset.moveSpeed;
const maxSpeed = overrides.maxSpeed ?? preset.maxSpeed;
const capabilities: PlayerStartMovementCapabilities = { const capabilities: PlayerStartMovementCapabilities = {
jump: jump:
overrides.capabilities?.jump ?? preset.capabilities.jump, overrides.capabilities?.jump ?? preset.capabilities.jump,
@@ -726,7 +743,10 @@ export function createPlayerStartMovementTemplate(
overrides.jump?.coyoteTimeMs ?? preset.jump.coyoteTimeMs, overrides.jump?.coyoteTimeMs ?? preset.jump.coyoteTimeMs,
variableHeight: variableHeight:
overrides.jump?.variableHeight ?? preset.jump.variableHeight, overrides.jump?.variableHeight ?? preset.jump.variableHeight,
maxHoldMs: overrides.jump?.maxHoldMs ?? preset.jump.maxHoldMs maxHoldMs: overrides.jump?.maxHoldMs ?? preset.jump.maxHoldMs,
bunnyHop: overrides.jump?.bunnyHop ?? preset.jump.bunnyHop,
bunnyHopBoost:
overrides.jump?.bunnyHopBoost ?? preset.jump.bunnyHopBoost
}; };
const sprint: PlayerStartSprintSettings = { const sprint: PlayerStartSprintSettings = {
speedMultiplier: speedMultiplier:
@@ -738,6 +758,7 @@ export function createPlayerStartMovementTemplate(
}; };
assertPositiveFiniteNumber(moveSpeed, "Player Start move speed"); assertPositiveFiniteNumber(moveSpeed, "Player Start move speed");
assertNonNegativeFiniteNumber(maxSpeed, "Player Start max speed");
assertBoolean( assertBoolean(
capabilities.jump, capabilities.jump,
"Player Start movement template jump capability" "Player Start movement template jump capability"
@@ -767,6 +788,11 @@ export function createPlayerStartMovementTemplate(
jump.maxHoldMs, jump.maxHoldMs,
"Player Start variable jump max hold milliseconds" "Player Start variable jump max hold milliseconds"
); );
assertBoolean(jump.bunnyHop, "Player Start bunny hop setting");
assertNonNegativeFiniteNumber(
jump.bunnyHopBoost,
"Player Start bunny hop boost"
);
assertPositiveFiniteNumber( assertPositiveFiniteNumber(
sprint.speedMultiplier, sprint.speedMultiplier,
"Player Start sprint speed multiplier" "Player Start sprint speed multiplier"
@@ -779,6 +805,7 @@ export function createPlayerStartMovementTemplate(
return { return {
kind, kind,
moveSpeed, moveSpeed,
maxSpeed,
capabilities, capabilities,
jump, jump,
sprint, sprint,
@@ -792,6 +819,7 @@ export function inferPlayerStartMovementTemplateKind(
const candidate = createPlayerStartMovementTemplate({ const candidate = createPlayerStartMovementTemplate({
kind: "custom", kind: "custom",
moveSpeed: template.moveSpeed, moveSpeed: template.moveSpeed,
maxSpeed: template.maxSpeed,
capabilities: template.capabilities, capabilities: template.capabilities,
jump: template.jump, jump: template.jump,
sprint: template.sprint, sprint: template.sprint,
@@ -806,6 +834,8 @@ export function inferPlayerStartMovementTemplateKind(
if ( if (
candidate.moveSpeed === candidate.moveSpeed ===
createPlayerStartMovementTemplate({ kind: presetKind }).moveSpeed && createPlayerStartMovementTemplate({ kind: presetKind }).moveSpeed &&
candidate.maxSpeed ===
createPlayerStartMovementTemplate({ kind: presetKind }).maxSpeed &&
candidate.capabilities.jump === candidate.capabilities.jump ===
createPlayerStartMovementTemplate({ kind: presetKind }).capabilities.jump && createPlayerStartMovementTemplate({ kind: presetKind }).capabilities.jump &&
candidate.capabilities.sprint === candidate.capabilities.sprint ===
@@ -822,6 +852,10 @@ export function inferPlayerStartMovementTemplateKind(
createPlayerStartMovementTemplate({ kind: presetKind }).jump.variableHeight && createPlayerStartMovementTemplate({ kind: presetKind }).jump.variableHeight &&
candidate.jump.maxHoldMs === candidate.jump.maxHoldMs ===
createPlayerStartMovementTemplate({ kind: presetKind }).jump.maxHoldMs && createPlayerStartMovementTemplate({ kind: presetKind }).jump.maxHoldMs &&
candidate.jump.bunnyHop ===
createPlayerStartMovementTemplate({ kind: presetKind }).jump.bunnyHop &&
candidate.jump.bunnyHopBoost ===
createPlayerStartMovementTemplate({ kind: presetKind }).jump.bunnyHopBoost &&
candidate.sprint.speedMultiplier === candidate.sprint.speedMultiplier ===
createPlayerStartMovementTemplate({ kind: presetKind }).sprint.speedMultiplier && createPlayerStartMovementTemplate({ kind: presetKind }).sprint.speedMultiplier &&
candidate.crouch.speedMultiplier === candidate.crouch.speedMultiplier ===