Add SpawnPedMenu

- Added ModMenuModule::SpawnPedMenu placed inside of ModMenuModule::WorldMenu
This commit is contained in:
izawartka 2026-08-04 08:02:39 +02:00
parent 64b126156a
commit 530b53a6a6
6 changed files with 136 additions and 0 deletions

View File

@ -439,6 +439,7 @@
<ClInclude Include="src\modules\modmenu\menus\saved-vehicle-options-menu.h" />
<ClInclude Include="src\modules\modmenu\menus\select-camera-modes-menu.h" />
<ClInclude Include="src\modules\modmenu\menus\spawn-object-menu.h" />
<ClInclude Include="src\modules\modmenu\menus\spawn-ped-menu.h" />
<ClInclude Include="src\modules\modmenu\menus\spawn-vehicle-menu.h" />
<ClInclude Include="src\modules\modmenu\menus\vehicles-menu.h" />
<ClInclude Include="src\modules\modmenu\menus\version-menu.h" />
@ -730,6 +731,7 @@
<ClCompile Include="src\modules\modmenu\menus\saved-vehicle-options-menu.cpp" />
<ClCompile Include="src\modules\modmenu\menus\select-camera-modes-menu.cpp" />
<ClCompile Include="src\modules\modmenu\menus\spawn-object-menu.cpp" />
<ClCompile Include="src\modules\modmenu\menus\spawn-ped-menu.cpp" />
<ClCompile Include="src\modules\modmenu\menus\spawn-vehicle-menu.cpp" />
<ClCompile Include="src\modules\modmenu\menus\vehicles-menu.cpp" />
<ClCompile Include="src\modules\modmenu\menus\version-menu.cpp" />

View File

@ -187,6 +187,7 @@
<ClCompile Include="src\modules\modmenu\menus\position-rotation-menu.cpp" />
<ClCompile Include="src\modules\modmenu\segments\position-rotation-menu-segment.cpp" />
<ClCompile Include="src\modules\modmenu\cheats\position-store.cpp" />
<ClCompile Include="src\modules\modmenu\menus\spawn-ped-menu.cpp" />
<ClCompile Include="src\modules\modmenu\segments\spawn-ped-segment.cpp" />
<ClCompile Include="src\modules\modmenu\menus\ped-template\options-menu.cpp" />
<ClCompile Include="src\game\utils\gang-utils.cpp" />
@ -530,6 +531,7 @@
<ClInclude Include="src\modules\modmenu\cheats\position-store.h" />
<ClInclude Include="src\modules\modmenu\events\position-store-entries-update.h" />
<ClInclude Include="src\modules\modmenu\events\player-pos-rot-update.h" />
<ClInclude Include="src\modules\modmenu\menus\spawn-ped-menu.h" />
<ClInclude Include="src\modules\modmenu\segments\spawn-ped-segment.h" />
<ClInclude Include="src\modules\modmenu\menus\ped-template\options-menu.h" />
<ClInclude Include="src\game\utils\gang-utils.h" />

View File

@ -22,6 +22,7 @@
#include "camera-advanced-menu.h"
#include "world-menu.h"
#include "spawn-object-menu.h"
#include "spawn-ped-menu.h"
#include "ped-template/ped-template-menus.h"
#include "position-menu.h"
#include "native-cheats-menu.h"

View File

@ -0,0 +1,99 @@
#include "spawn-ped-menu.h"
#include "../root.h"
#include "../segments/position-rotation-menu-segment.h"
#include "../segments/spawn-ped-segment.h"
ModMenuModule::SpawnPedMenu::SpawnPedMenu()
{
m_posRotMenuSegment = CreateSegment<PositionRotationMenuSegment>("ModMenu_SpawnPedMenu_PositionRotationMenuSegment");
m_SpawnPedSegment = CreateSegment<SpawnPedSegment>("ModMenu_SpawnPedMenu_SpawnSegment");
}
ModMenuModule::SpawnPedMenu::~SpawnPedMenu()
{
}
bool ModMenuModule::SpawnPedMenu::Attach()
{
UiModule::Component* vertCont;
CreateMenu(L"#Spawn character#", vertCont);
UiModule::RootModule* uiRoot = UiModule::RootModule::GetInstance();
const auto& options = ModMenuModule::RootModule::GetInstance()->GetOptions();
PersistenceModule::PersistenceManager* persistence = PersistenceModule::PersistenceManager::GetInstance();
m_menuController->CreateItem<UiModule::Text>(vertCont, L"Go back", options.textSize);
uiRoot->AddComponent<UiModule::Spacer>(vertCont, 0, options.menuSpacerHeight);
AttachSegment(m_posRotMenuSegment, this, vertCont);
AttachSegment(m_SpawnPedSegment, this, vertCont);
// spawn button
auto spawnText = m_menuController->CreateItem<UiModule::Text>(vertCont, L"Spawn", options.textSize);
auto spawnBtn = m_menuController->CreateLatestItemController<UiModule::ButtonController>(spawnText);
spawnBtn->SetCallback(this, &SpawnPedMenu::Spawn);
SetPreviousSelectedIndex();
return true;
}
void ModMenuModule::SpawnPedMenu::Detach()
{
SaveCurrentSelectedIndex();
DetachSegment(m_posRotMenuSegment);
DetachSegment(m_SpawnPedSegment);
DestroyMenu();
}
void ModMenuModule::SpawnPedMenu::OnShow()
{
SetSegmentsVisible(true);
}
void ModMenuModule::SpawnPedMenu::OnHide()
{
SetSegmentsVisible(false);
}
void ModMenuModule::SpawnPedMenu::OnMenuAction(UiModule::Selectable* item, UiModule::MenuItemId id)
{
if (id == 0) {
MenuManager::GetInstance()->RemoveLastMenu();
return;
}
if (m_posRotMenuSegment->OnPassedMenuAction(item, id)) {
return;
}
m_SpawnPedSegment->OnPassedMenuAction(item, id);
return;
}
void ModMenuModule::SpawnPedMenu::Spawn()
{
auto spawnSegmentDataOpt = m_SpawnPedSegment->GetSegmentData();
if (!spawnSegmentDataOpt.has_value()) {
spdlog::error("Cannot spawn ped: failed to get SpawnPedSegment data.");
return;
}
auto positionSegmentDataOpt = m_posRotMenuSegment->GetSegmentData();
if (!positionSegmentDataOpt.has_value()) {
spdlog::error("Cannot spawn ped: failed to get PositionRotationMenuSegment data");
return;
}
auto& spawnSegmentData = spawnSegmentDataOpt.value();
auto& positionSegmentData = positionSegmentDataOpt.value();
bool success = spawnSegmentData.inNearestCar ?
Utils::SpawnPed::SpawnPedInNearestCar(positionSegmentData.position, spawnSegmentData.pedTemplate.data) :
Utils::SpawnPed::SpawnPed(positionSegmentData.position, positionSegmentData.rotation, spawnSegmentData.pedTemplate.data);
if (!success) {
ToastManager::GetInstance()->Show({ L"Failed to spawn character", ToastType::Error });
}
}

View File

@ -0,0 +1,27 @@
#pragma once
#include "../common.h"
#include "../menu-base.h"
#include "../segment-support.h"
namespace ModMenuModule {
class PositionRotationMenuSegment;
class SpawnPedSegment;
class SpawnPedMenu : public MenuBase, public SegmentSupport {
public:
SpawnPedMenu();
virtual ~SpawnPedMenu();
private:
virtual bool Attach() override;
virtual void Detach() override;
virtual void OnShow() override;
virtual void OnHide() override;
void OnMenuAction(UiModule::Selectable* item, UiModule::MenuItemId id) override;
void Spawn();
PositionRotationMenuSegment* m_posRotMenuSegment = nullptr;
SpawnPedSegment* m_SpawnPedSegment = nullptr;
};
}

View File

@ -1,5 +1,6 @@
#include "world-menu.h"
#include "spawn-object-menu.h"
#include "spawn-ped-menu.h"
#include "../root.h"
ModMenuModule::WorldMenu::WorldMenu()
@ -21,6 +22,7 @@ bool ModMenuModule::WorldMenu::Attach()
m_menuController->CreateItem<UiModule::Text>(vertCont, L"Go back", options.textSize);
m_menuController->CreateItem<UiModule::Text>(vertCont, L"Spawn object", options.textSize);
m_menuController->CreateItem<UiModule::Text>(vertCont, L"Spawn character", options.textSize);
SetPreviousSelectedIndex();
@ -36,6 +38,9 @@ void ModMenuModule::WorldMenu::OnMenuAction(UiModule::Selectable* item, UiModule
case 1: // Spawn object
ModMenuModule::MenuManager::GetInstance()->AddMenu<ModMenuModule::SpawnObjectMenu>();
break;
case 2: // Spawn character
ModMenuModule::MenuManager::GetInstance()->AddMenu<ModMenuModule::SpawnPedMenu>();
break;
default:
break;
}