Add an option to enter vehicle as passenger

- Added ModMenuModule::Utils::EnterCarAsPassenger
- Added "Enter as passenger" button in ModMenuModule::VehiclesMenu
This commit is contained in:
izawartka 2026-08-19 18:05:45 +02:00
parent cd56d3908a
commit c0e93e1919
6 changed files with 83 additions and 0 deletions

View File

@ -516,6 +516,7 @@
<ClInclude Include="src\modules\modmenu\utils\categorized-native-cheats-utils.h" />
<ClInclude Include="src\modules\modmenu\utils\categorized-objects-utils.h" />
<ClInclude Include="src\modules\modmenu\utils\custom-render-queue-utils.h" />
<ClInclude Include="src\modules\modmenu\utils\enter-car-as-passenger.h" />
<ClInclude Include="src\modules\modmenu\utils\explode-all-cars.h" />
<ClInclude Include="src\modules\modmenu\utils\explode-last-car.h" />
<ClInclude Include="src\modules\modmenu\utils\fix-car-utils.h" />
@ -820,6 +821,7 @@
<ClCompile Include="src\modules\modmenu\utils\categorized-objects-utils.cpp" />
<ClCompile Include="src\modules\modmenu\utils\custom-render-queue-utils.cpp" />
<ClCompile Include="src\game\utils\teleport-utils.cpp" />
<ClCompile Include="src\modules\modmenu\utils\enter-car-as-passenger.cpp" />
<ClCompile Include="src\modules\modmenu\utils\explode-all-cars.cpp" />
<ClCompile Include="src\modules\modmenu\utils\explode-last-car.cpp" />
<ClCompile Include="src\modules\modmenu\utils\fix-car-utils.cpp" />

View File

@ -236,6 +236,7 @@
<ClCompile Include="src\modules\modmenu\menus\smooth-vehicle-camera-menu.cpp" />
<ClCompile Include="src\modules\modmenu\menus\smooth-follow-camera-menu.cpp" />
<ClCompile Include="src\modules\modmenu\quick-actions\toggle-smooth-camera.cpp" />
<ClCompile Include="src\modules\modmenu\utils\enter-car-as-passenger.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\converters\ammo.h" />
@ -606,6 +607,7 @@
<ClInclude Include="src\modules\modmenu\menus\smooth-vehicle-camera-menu.h" />
<ClInclude Include="src\modules\modmenu\menus\smooth-follow-camera-menu.h" />
<ClInclude Include="src\modules\modmenu\quick-actions\toggle-smooth-camera.h" />
<ClInclude Include="src\modules\modmenu\utils\enter-car-as-passenger.h" />
</ItemGroup>
<ItemGroup>
<None Include="GTA2.props" />

View File

@ -6,6 +6,7 @@
#include "../cheats/last-car.h"
#include "../cheats/disable-steering-assist.h"
#include "../../../converters/yes-no.h"
#include "../utils/enter-car-as-passenger.h"
ModMenuModule::VehiclesMenu::VehiclesMenu()
{
@ -45,6 +46,11 @@ bool ModMenuModule::VehiclesMenu::Attach()
disableSteeringAssistCheat->SetEnabled(newValue);
});
// enter as passenger
auto* enterAsPassengerText = m_menuController->CreateItem<UiModule::Text>(vertCont, L"Enter as passenger", options.textSize);
auto* enterAsPassengerBtn = m_menuController->CreateLatestItemController<UiModule::ButtonController>(enterAsPassengerText);
enterAsPassengerBtn->SetCallback(std::bind(&VehiclesMenu::EnterAsPassenger, this));
SetPreviousSelectedIndex();
return true;
@ -103,6 +109,15 @@ void ModMenuModule::VehiclesMenu::OnCheatStateChange(CheatStateEvent& event)
}
}
void ModMenuModule::VehiclesMenu::EnterAsPassenger() const
{
bool success = Utils::EnterCarAsPassenger();
if (!success) {
ToastManager::GetInstance()->Show({ L"Failed to enter vehicle", ToastType::Warning });
}
}
void ModMenuModule::VehiclesMenu::UpdateLastCarState()
{
if (!m_lastCarText) return;

View File

@ -18,6 +18,7 @@ namespace ModMenuModule {
void OnMenuAction(UiModule::Selectable* item, UiModule::MenuItemId id) override;
void OnLastCarStateChange(ModMenuModule::LastCarStateEvent& event);
void OnCheatStateChange(CheatStateEvent& event);
void EnterAsPassenger() const;
void UpdateLastCarState();
void UpdateCheatStates();

View File

@ -0,0 +1,57 @@
#include "enter-car-as-passenger.h"
Game::Car* GetCarToEnterAsPassenger(Game::Ped* ped)
{
if (!ped || !ped->gameObject || !ped->gameObject->sprite) return nullptr;
Game::TrafficManager* trafficManager = Game::Memory::GetTrafficManager();
if (!trafficManager) return nullptr;
// logic below is based on 0x004a76d0
if (ped->state == Game::PED_STATE_WASTED) return nullptr;
if (ped->currentCar) return nullptr;
if (ped->objective == Game::PED_OBJECTIVE_LEAVE_CAR) return nullptr;
return Game::Functions::GetNearestCarForEnter(
trafficManager,
0,
ped->gameObject->sprite, 3
);
}
static Game::byte GetDoorToEnterAsPassenger(Game::Car* car)
{
Game::byte doorIndex = 1;
Game::Passenger* passenger = car->lastPassenger;
while (passenger) {
if (passenger->ped && passenger->ped->targetCarDoor == doorIndex) {
passenger = car->lastPassenger;
doorIndex++;
}
else {
passenger = passenger->prev;
}
}
return doorIndex;
}
bool ModMenuModule::Utils::EnterCarAsPassenger()
{
Game::Ped* playerPed = Game::Utils::GetPlayerCurrentPed();
Game::Car* targetCar = GetCarToEnterAsPassenger(playerPed);
if (!targetCar) return false;
// logic below is based on 0x004a76d0
bool isTrain = Game::Functions::IsCarATrain(targetCar);
Game::PED_OBJECTIVE newObjective = isTrain ?
Game::PED_OBJECTIVE_ENTER_TRAIN :
Game::PED_OBJECTIVE_ENTER_CAR;
Game::Functions::UpdatePedStatesFromObjective(playerPed, 0, Game::PED_OBJECTIVE_NO_OBJ, 9999);
Game::Functions::PedSetObjective(playerPed, 0, newObjective, 9999);
playerPed->objectiveTargetCar = targetCar;
playerPed->enterCarAsPassenger = 1;
playerPed->targetCarDoor = GetDoorToEnterAsPassenger(targetCar);
return true;
}

View File

@ -0,0 +1,6 @@
#pragma once
#include "../common.h"
namespace ModMenuModule::Utils {
bool EnterCarAsPassenger();
}