From 73b4d949bc042b180a19e513f9d76d6c2d87f0d9 Mon Sep 17 00:00:00 2001 From: MegaMech Date: Tue, 7 Jan 2025 16:43:36 -0700 Subject: [PATCH] Target player follows player and fix --- src/engine/World.cpp | 2 ++ src/enhancements/freecam/freecam.h | 1 + src/enhancements/freecam/freecam_engine.c | 16 ++++++++++++++++ src/port/ui/FreecamWindow.cpp | 12 ++++++++++-- 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/engine/World.cpp b/src/engine/World.cpp index 1e68a4b26..7b6e053ff 100644 --- a/src/engine/World.cpp +++ b/src/engine/World.cpp @@ -71,6 +71,7 @@ u32 World::NextCup() { CurrentCup->CursorPosition = 0; return CupIndex; } + return Cups.size() - hack; } u32 World::PreviousCup() { @@ -80,6 +81,7 @@ u32 World::PreviousCup() { CurrentCup->CursorPosition = 0; return CupIndex; } + return 0; } void World::SetCup(Cup* cup) { diff --git a/src/enhancements/freecam/freecam.h b/src/enhancements/freecam/freecam.h index 4eaa45a89..e7a1a1ece 100644 --- a/src/enhancements/freecam/freecam.h +++ b/src/enhancements/freecam/freecam.h @@ -16,6 +16,7 @@ void freecam_keyboard_manager(Camera*, Vec3f); extern f32 gFreecamSpeed; extern f32 gFreecamSpeedMultiplier; extern f32 gFreecamRotateSmoothingFactor; +extern f32 gFreecamRotateFollowFactor; extern u32 fRankIndex; extern u32 gFreecamControllerType; diff --git a/src/enhancements/freecam/freecam_engine.c b/src/enhancements/freecam/freecam_engine.c index 398d0f566..444c714d0 100644 --- a/src/enhancements/freecam/freecam_engine.c +++ b/src/enhancements/freecam/freecam_engine.c @@ -48,6 +48,8 @@ void freecam_calculate_forward_vector_allow_rotation(Camera* camera, Vec3f forwa forwardVector[2] = cosf(yaw); } +f32 gFreecamFollowFactor = 0.7; + void freecam_target_player(Camera* camera, Vec3f forwardVector) { // Apply damping to velocity freeCam.velocity[0] *= gDampValue; @@ -90,4 +92,18 @@ void freecam_target_player(Camera* camera, Vec3f forwardVector) { freeCam.forwardVector[0] = forwardVector[0]; freeCam.forwardVector[1] = forwardVector[1]; freeCam.forwardVector[2] = forwardVector[2]; + + + // Movement + freeCam.velocity[0] += gPlayers[fRankIndex].velocity[0] * gFreecamFollowFactor; + freeCam.velocity[1] += gPlayers[fRankIndex].velocity[1] * gFreecamFollowFactor; + freeCam.velocity[2] += gPlayers[fRankIndex].velocity[2] * gFreecamFollowFactor; } + +void freecam_get_player_from_character(s32 characterId) { + for (size_t i = 0; i < NUM_PLAYERS; i++) { + if (gPlayers[i].characterId == characterId) { + fRankIndex = i; + } + } +} \ No newline at end of file diff --git a/src/port/ui/FreecamWindow.cpp b/src/port/ui/FreecamWindow.cpp index fcf532747..f06397c54 100644 --- a/src/port/ui/FreecamWindow.cpp +++ b/src/port/ui/FreecamWindow.cpp @@ -22,9 +22,12 @@ extern f32 gDampValue; extern f32 gFreecamSpeed; extern f32 gFreecamSpeedMultiplier; extern f32 gFreecamRotateSmoothingFactor; +extern f32 gFreecamFollowFactor; extern char* D_800E76A8[]; extern u32 fRankIndex; +extern u32 fTargetPlayer; extern u32 gFreecamControllerType; +void freecam_get_player_from_character(s32 characterId); } namespace Freecam { @@ -45,6 +48,8 @@ float minSpeedMultiplier = 1.5f; float maxSpeedMultiplier = 15.0f; float minFreecamRotateFactor = 0.0f; float maxFreecamRotateFactor = 1.0f; +float minFreecamFollowFactor = 0.0f; +float maxFreecamFollowFactor = 1.0f; uint32_t focusPlayer; @@ -73,13 +78,15 @@ void FreecamWindow::DrawElement() { &minSpeedMultiplier, &maxSpeedMultiplier, "%f")) {}; if (ImGui::SliderScalar("Camera Rotation Smoothing", ImGuiDataType_Float, &gFreecamRotateSmoothingFactor, &minFreecamRotateFactor, &maxFreecamRotateFactor, "%f")) {}; + if (ImGui::SliderScalar("Follow Factor", ImGuiDataType_Float, &gFreecamFollowFactor, + &minFreecamFollowFactor, &maxFreecamFollowFactor, "%f")) {}; ImGui::Spacing(); ImGui::Text("Target Player"); if (ImGui::Button("None")) { - fRankIndex = -1; + fTargetPlayer = false; } for (size_t i = 0; i < NUM_PLAYERS; i++) { @@ -88,7 +95,8 @@ void FreecamWindow::DrawElement() { } ImGui::SameLine(); if (ImGui::Button(D_800E76A8[i])) { - fRankIndex = i; + freecam_get_player_from_character(i); + fTargetPlayer = true; } }