From 2362fd41d7ccfc188be2b64639355526e88ef336 Mon Sep 17 00:00:00 2001 From: kelson8 Date: Mon, 17 Jun 2024 12:55:07 -0400 Subject: [PATCH] Add player functions class, update test hud class. Add sound testing, spawn random ped, change respawn point to somewhere and reset it, mess around with events. --- src/test/player_functions.cpp | 106 ++++++++ src/test/player_functions.h | 13 + src/test/test_hud.cpp | 35 ++- src/test/test_hud.h | 6 +- src/test/test_ped.cpp | 456 ++++++++++++++++++++++++++++------ src/test/test_ped.h | 6 +- 6 files changed, 526 insertions(+), 96 deletions(-) create mode 100644 src/test/player_functions.cpp create mode 100644 src/test/player_functions.h diff --git a/src/test/player_functions.cpp b/src/test/player_functions.cpp new file mode 100644 index 0000000..7c482b3 --- /dev/null +++ b/src/test/player_functions.cpp @@ -0,0 +1,106 @@ +#include "pch.h" +#include "player_functions.h" + +PlayerFunctions::PlayerFunctions() +{ + //if (m_bRespawnMiddleOfMap) + //{ + + //} +} + +void PlayerFunctions::KillPlayer() +{ + CPlayerPed* player = FindPlayerPed(); + player->m_fHealth = 0; + player->m_fArmour = 0; +} + +static void SetNeverWanted(bool toggle) +{ + if(toggle) + { + // Enable never wanted + } + else + { + // Disable never wanted + } +} + +static void SetInvincible(bool toggle) +{ + if (toggle) + { + // Enable invincibility + } + else + { + // Disable invincibility + } +} + +static void SetInfiniteAmmo(bool toggle) +{ + if (toggle) + { + // Enable infinite ammo + } + else + { + // Disable infinite ammo + } +} + +//static bool IsPlayerInCar() +//{ +// +//} + +/// This is untested but it should work. +/// +/// Checks if the player is in the specified area. +/// Values are the first set of x,y,z and the second set in a cube, if you have ever messed with mta sa lua it's kind of like that. +/// So if you want the player to be killed going from 2,2,2 to 20,20,20 that would be possible. +/// +/// If player is in specified area +/// +//static bool IsPlayerInArea(float x1, float y1, float z1, float x2, float y2, float z2) +bool PlayerFunctions::IsPlayerInArea(float x1, float y1, float z1, float x2, float y2, float z2) +{ + CPlayerPed* player = FindPlayerPed(); + int hplayer = CPools::GetPedRef(player); + + CVector playerPos = player->GetPosition(); + + // https://library.sannybuilder.com/#/sa/default/00A4 + + if (Command(hplayer, + x1, y1, z1, x2, y2, z2, false)) { + return true; + } + else + { + return false; + } +} + +/// +/// Check if player is in a train +/// +/// If the player is in a train +bool PlayerFunctions::IsPlayerInTrain() +{ + CPlayerPed* player = FindPlayerPed(); + int hplayer = CPools::GetPedRef(player); + if (Command(hplayer)) { + return true; + } + else + { + return false; + } +} + + + diff --git a/src/test/player_functions.h b/src/test/player_functions.h new file mode 100644 index 0000000..4ac5071 --- /dev/null +++ b/src/test/player_functions.h @@ -0,0 +1,13 @@ +#pragma once +//#include "pch.h" + +class PlayerFunctions +{ +public: + bool m_bRespawnMiddleOfMap; + PlayerFunctions(); + PlayerFunctions(const PlayerFunctions&); + static void KillPlayer(); + static bool IsPlayerInArea(float x1, float y1, float z1, float x2, float y2, float z2); + static bool IsPlayerInTrain(); +}; diff --git a/src/test/test_hud.cpp b/src/test/test_hud.cpp index 672c8e7..846e7b9 100644 --- a/src/test/test_hud.cpp +++ b/src/test/test_hud.cpp @@ -4,6 +4,23 @@ bool toggleHud = true; bool toggleRadar = true; +HudTestPage::HudTestPage() +{ + +} + + // GTA SA Specific memory addresses, will most likely crash 3 and vc. + // What are these doing? From scene.cpp on lines 172-177. + // Is Nop setting the value to zero? I think that is what it's doing. + // patch::Set(0x609A4E, 0x4D48689); + // patch::Set(0x609A52, 0); + // patch::Nop(0x609A4E, 6); + + + + // patch::Set + // patch::Set(Address, value, true); +#ifdef GTASA static void ToggleRadarMenu() { @@ -37,21 +54,13 @@ static void ToggleHudMenu() } } +#endif //GTASA + +/// +/// Main code for HudTestMenu +/// void HudTestPage::HudTestMenu() { - -// GTA SA Specific memory addresses, will most likely crash 3 and vc. -// What are these doing? From scene.cpp on lines 172-177. -// Is Nop setting the value to zero? I think that is what it's doing. - // patch::Set(0x609A4E, 0x4D48689); - // patch::Set(0x609A52, 0); - // patch::Nop(0x609A4E, 6); - - - - // patch::Set - // patch::Set(Address, value, true); - #ifdef GTASA ToggleHudMenu(); ToggleRadarMenu(); diff --git a/src/test/test_hud.h b/src/test/test_hud.h index 5519b40..d3c2855 100644 --- a/src/test/test_hud.h +++ b/src/test/test_hud.h @@ -4,9 +4,9 @@ class HudTestPage { private: - HudTestPage(); - HudTestPage(const HudTestPage&); void Draw(); public: - static void HudTestMenu(); + HudTestPage(); + HudTestPage(const HudTestPage&); + void HudTestMenu(); }; diff --git a/src/test/test_ped.cpp b/src/test/test_ped.cpp index b607ed8..bb9de62 100644 --- a/src/test/test_ped.cpp +++ b/src/test/test_ped.cpp @@ -1,16 +1,79 @@ #include "pch.h" #include "test_ped.h" +#include "utils/widget.h" #ifdef GTASA #include "CExplosion.h" +#include "CPopulation.h" +#include "CTaskComplexWanderStandard.h" #endif +// My code +#include "player_functions.h" + // Incomplete. // https://library.sannybuilder.com/#/sa/default/0672 //Command(pPed); + +PedTestPage::PedTestPage() +{ + +} + bool playerCanDrown = true; +// https://sampwiki.blast.hk/wiki/SoundID +enum soundIds { + BLANK_SOUND = 0, + CRASH_SOUND = 1009, + GARAGE_DOOR_OPENING = 1035, + SELECTION_SOUND = 1058, + METALLIC_FENCE_RATTLE1 = 1100, + METALLIC_FENCE_RATTLE2 = 1101, + SPRAY_CAN = 1134, + CRASH1_SOUND = 1140, + CRASH2_SOUND = 1141, + THROW_SATCHEL_SOUND = 1145, + CAR_HORN = 1147, + BLIP_SOUND = 1149, + EXPLOSION_SOUND = 1159, + HANGER_DOORS = 1165, + DRIVING_SCHOOL_RESULTS_MUSIC = 1183, + BIKE_BOAT_SCHOOL_RESULTS_MUSIC = 1183, + FLIGHT_SCHOOL_RESULTS_MUSIC = 1187, +}; + +//static std::vector soundIds = { +static std::vector soundIds = { + std::to_string(BLANK_SOUND), std::to_string(CRASH_SOUND), std::to_string(GARAGE_DOOR_OPENING), + std::to_string(SELECTION_SOUND), std::to_string(METALLIC_FENCE_RATTLE1), + std::to_string(METALLIC_FENCE_RATTLE2), std::to_string(SPRAY_CAN), + std::to_string(CRASH1_SOUND), std::to_string(CRASH2_SOUND), std::to_string(THROW_SATCHEL_SOUND), std::to_string(CAR_HORN), + std::to_string(BLIP_SOUND), std::to_string(EXPLOSION_SOUND), + std::to_string(HANGER_DOORS), std::to_string(DRIVING_SCHOOL_RESULTS_MUSIC), + std::to_string(BIKE_BOAT_SCHOOL_RESULTS_MUSIC), std::to_string(FLIGHT_SCHOOL_RESULTS_MUSIC) +}; + +//static std::vector soundIds = { +// BLANK_SOUND, CRASH_SOUND, GARAGE_DOOR_OPENING, SELECTION_SOUND, +// METALLIC_FENCE_RATTLE1, METALLIC_FENCE_RATTLE2, SPRAY_CAN, +// CRASH1_SOUND, CRASH2_SOUND, THROW_SATCHEL_SOUND, CAR_HORN, +// BLIP_SOUND, EXPLOSION_SOUND, HANGER_DOORS, DRIVING_SCHOOL_RESULTS_MUSIC, +// BIKE_BOAT_SCHOOL_RESULTS_MUSIC, FLIGHT_SCHOOL_RESULTS_MUSIC +//}; + +// Taken from plugin-sdk examples under PedSpawner in Main.cpp +int pedModelIds[] = { 0, 7, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 57, 58, 59, 60, 61, 62, 66, 67, 68, 70, 71, 72, 73, 78, 79, 80, 81, 82, 83, 84, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 120, 121, 122, 123, 124, 125, 126, 127, 128, 132, + 133, 134, 135, 136, 137, 142, 143, 144, 146, 147, 153, 154, 155, 156, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 170, 171, + 173, 174, 175, 176, 177, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 200, 202, 203, 204, 206, 209, 210, 212, 213, 217, 220, + 221, 222, 223, 227, 228, 229, 230, 234, 235, 236, 239, 240, 241, 242, 247, 248, 249, 250, 252, 253, 254, 255, 258, 259, 260, 261, 262, + 9, 10, 11, 12, 13, 31, 38, 39, 40, 41, 53, 54, 55, 56, 63, 64, 69, 75, 76, 77, 85, 87, 88, 89, 90, 91, 92, 93, 129, 130, 131, 138, 139, + 140, 141, 145, 148, 150, 151, 152, 157, 169, 172, 178, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 201, 205, 207, 211, 214, 215, + 216, 218, 219, 224, 225, 226, 231, 232, 233, 237, 238, 243, 244, 245, 246, 251, 256, 257, 263 }; + static void SuicideMenu() { #ifdef GTASA @@ -26,6 +89,8 @@ static void SuicideMenu() #endif //GTASA } +// Why does this not have sound? I'm not using ADD_EXPLOSION_NO_SOUND +// I manually added an explosion using ADD_ONE_OFF_SOUND static void BombMenu() { #ifdef GTASA @@ -40,10 +105,70 @@ static void BombMenu() // https://library.sannybuilder.com/#/sa/default/020C // x, y, z, EXPLOSION_CAR Command(playerPos.x, playerPos.y, playerPos.z, EXPLOSION_CAR); + + // https://library.sannybuilder.com/#/sa/default/018C + // These might work: https://sampwiki.blast.hk/wiki/SoundID + //Command(playerPos.x, playerPos.y, playerPos.z, 1159); + Command(playerPos.x, playerPos.y, playerPos.z, EXPLOSION_SOUND); + + // This does about the same as above with a bit more code. + //CExplosion::AddExplosion(FindPlayerPed(), FindPlayerPed(), EXPLOSION_CAR, playerPos, 1000, 1, 1.0f, true); } #endif //GTASA } +// New + +#define _TEST +// Sound testing, incomplete. +#ifdef _TEST +// Set this to nothing +int defaultSoundType = 0; +static void SoundMenu() +{ +#ifdef GTASA + CPlayerPed* player = FindPlayerPed(); + CVector playerPos = player->GetPosition(); + ImGui::Text("Sound"); + // Not sure how to get a list box to play each sound with a button under. + // This is complaining, I guess because I gave it an int instead of string. + + // This doesn't seem to work + if (Widget::ListBox("Sounds", soundIds, defaultSoundType)) + defaultSoundType = defaultSoundType; + //if (ImGui::ListBox("Sounds", soundIds, defaultSoundType)) + { + if (ImGui::Button("Play sound")) { + Command(playerPos.x, playerPos.y, playerPos.z, defaultSoundType); + } + } + + // This might work: + // https://stackoverflow.com/questions/10847237/how-to-convert-from-int-to-char + //const char* soundIdsChar = char(soundIds); + + // Will these work? I think this is converting the int to a char. + // https://stackoverflow.com/questions/4254615/how-to-cast-vectorunsigned-char-to-char + //reinterpret_cast (soundIds[0]); + + // Now to create a for loop + // Will this work for the int? + //for (int i = 0; i < soundIds.size(); i++) + //{ + // const char* soundIdsChars = reinterpret_cast (soundIds[i]); + // + // if (Widget::ListBox("Sounds", soundIds, defaultSoundType)) + // //if (ImGui::ListBox("Sounds", soundIds, defaultSoundType)) + // { + + // } + //} + +#endif //GTASA +} + +#endif //_TEST + static void ShowCoordsMenu() { #ifdef GTASA @@ -77,8 +202,9 @@ static void ShowMarkerCoordsMenu() #ifdef GTASA CPlayerPed* player = FindPlayerPed(); - //if (ImGui::Button("Show Marker Coords")) - //{ + if (ImGui::Button("Show Marker Coords")) + { + Util::SetMessage("Not implemented yet!"); // if (Command()) // { @@ -88,7 +214,9 @@ static void ShowMarkerCoordsMenu() // } // //Command(playerPos.x, playerPos.y, playerPos.z, EXPLOSION_CAR); - //} + } +#else + Util::SetMessage("No markers in VC or 3!"); #endif //GTASA } @@ -116,8 +244,8 @@ static void TogglePlayerDrownMenu() static void GravityValuesMenu() { - CPlayerPed* player = FindPlayerPed(); #ifdef GTASA + CPlayerPed* player = FindPlayerPed(); ImGui::Separator(); ImGui::Text("Gravity Values"); //ImGui::Columns(4); @@ -153,98 +281,272 @@ static void GravityValuesMenu() #endif //GTASA } - -// Very WIP and incomplete. -static void SpawnPedMenu() +// This should spawn a random ped. +#ifdef GTASA +static void SpawnRandomPed() { CPlayerPed* player = FindPlayerPed(); + // Taken from plugin-sdk examples under PedSpawner in Main.cpp + // https://github.com/DK22Pac/plugin-sdk/blob/master/examples/PedSpawner/Main.cpp + int modelID = pedModelIds[rand() % 250]; // Random model id + CStreaming::RequestModel(modelID, 0); // Request the model + CStreaming::LoadAllRequestedModels(false); // Whatever this does. + CPed* ped = new CCivilianPed(CPopulation::IsFemale(modelID) ? PED_TYPE_CIVFEMALE : PED_TYPE_CIVMALE, modelID); - /* -* void PedPage::AddNewPed() -Example for what i'm trying to do spawning in a ped. - Command(model); - Command(); - if (Command(model)) + if (ped) + { + // Is this getting the offset for the coordinates? + ped->SetPosn(FindPlayerPed()->TransformFromObjectSpace(CVector(0.0f, 5.0f, 3.0f))); + ped->SetOrientation(0.0f, 0.0f, 0.0f); + CWorld::Add(ped); + ped->PositionAnyPedOutOfCollision(); + ped->m_pIntelligence->m_TaskMgr.SetTask(new CTaskComplexWanderStandard(4, rand() % 8, true), 4, false); + } +} + + +static void SpawnPedMenu() { - std::string key = std::format("Custom.{} (Added)", name); - m_PedData.m_pData->Set(key.c_str(), std::to_string(model)); - m_PedData.m_pData->Save(); - Util::SetMessage(TEXT("Ped.AddPedMSG")); - Command(model); + if (ImGui::Button("Spawn Ped")) { + SpawnRandomPed(); + } + + } -else + +#endif //GTASA + +// TODO Remove this later. +/// +/// Area check test. +/// This seems to work. +/// +static void AreaCheckTest() { - Util::SetMessage(TEXT("Vehicle.InvalidID")); + CPlayerPed* player = FindPlayerPed(); + int hplayer = CPools::GetPedRef(player); + + CVector playerPos = player->GetPosition(); + // TODO Setup some random coords for this + CVector testLocationArea1 = CVector(2, 2, 2); + CVector testLocationArea2 = CVector(20, 20, 20); + + // https://library.sannybuilder.com/#/sa/default/00A4 + //Command(hplayer, + // testLocationArea1.x, testLocationArea1.y, testLocationArea1.z, + // testLocationArea2.x, testLocationArea2.y, testLocationArea2.z, true); + + // Will this work? + if (Command(hplayer, + testLocationArea1.x, testLocationArea1.y, testLocationArea1.z, + testLocationArea2.x, testLocationArea2.y, testLocationArea2.z, true)) { + + Util::SetMessage("You are in the zone!"); + } + else + { + Util::SetMessage("You are not in the zone!"); + } } -*/ -// First request the model -// Then load all models -// Lastly check if the model is available. -// If not say "Invalid model" +// TODO Remove this later. +/// +/// Working on a new method for this. +/// Kill the player when the enter this area, fires off with an event below. +/// Returns true if the player is in the specified coords. +/// +static bool IsPlayerInArea() +{ + CPlayerPed* player = FindPlayerPed(); + int hplayer = CPools::GetPedRef(player); -// -//if (ImGui::Button("Spawn Ped")) -//{ -// //CPed* pPed = new CPed::; -// //CWaterLevel:: -// //CWorld::Add() -//} + CVector playerPos = player->GetPosition(); + // TODO Setup some random coords for this + CVector testLocationArea1 = CVector(2, 2, 2); + CVector testLocationArea2 = CVector(20, 20, 20); - //if (ImGui::Button("Spawn ped to attack vehicle")) - //{ - // Util::SetMessage("Not setup!"); - //} + // https://library.sannybuilder.com/#/sa/default/00A4 - /* - if (ImGui::CollapsingHeader("Spawner")) - { - // PedPage::AddNewPed - // This doesn't work yet. -//#define _DISABLED_CODE -#ifdef _DISABLED_CODE - static char name[8]; - static int model = 0; - ImGui::InputTextWithHint(TEXT("Menu.Name"), "PEDNAME", name, 7); - Widget::InputInt(TEXT("Ped.Model"), &model, 0, 999999); - ImGui::Spacing(); - ImVec2 sz = Widget::CalcSize(2); - if (ImGui::Button(TEXT("Ped.AddPed"), sz)) - { - Command(model); - Command(); - if (Command(model)) - { - std::string key = std::format("Custom.{} (Added)", name); - // This part doesn't want to work. - //m_PedData.m_pData->Set(key.c_str(), std::to_string(model)); - pedPage.m_PedData.m_pData->Set(key.c_str(), std::to_string(model)); - pedPage.m_PedData.m_pData->Save(); - // - Util::SetMessage(TEXT("Ped.AddPedMSG")); - Command(model); - } - else - { - Util::SetMessage(TEXT("Vehicle.InvalidID")); - } - } - ImGui::SameLine(); - if (ImGui::Button(TEXT("Ped.GetPlayerModel"), sz)) - { - model = FindPlayerPed()->m_nModelIndex; - } -#endif //_DISABLED_CODE -*/ + // This seems to work fine. + if (Command(hplayer, + testLocationArea1.x, testLocationArea1.y, testLocationArea1.z, + testLocationArea2.x, testLocationArea2.y, testLocationArea2.z, false)) { + + return true; + } + else + { + return false; + } +} + +// TODO Make this use the function I have defined in the PlayerFunctions class. +static void AreaCheckTestMenu() +{ + ImGui::Text("Area Check testing."); + if (ImGui::Button("Check Area #1")) { + AreaCheckTest(); + } +} + +///////////// + + +bool playerSprint = true; +static void MiscTestMenu() +{ +#ifdef GTASA + CPlayerPed* player = FindPlayerPed(); + // I'm not exactly sure what this is doing. + int hplayer = CPools::GetPedRef(player); + + // https://library.sannybuilder.com/#/sa/default/06AF + // This just crashes it. +//#define _TEST1 +#ifdef _TEST1 + + if (ImGui::Checkbox("Toggle running", &playerSprint)) + { + if(!playerSprint) + { + Command(hplayer, false); + Util::SetMessage("You have disabled sprinting!"); + } + else + { + Command(hplayer, true); + Util::SetMessage("You have enabled sprinting!"); + } + } +#endif //GTASA +#endif //_TEST1 + +} + +static void KillPlayer() +{ + CPlayerPed* player = FindPlayerPed(); + player->m_fHealth = 0; + player->m_fArmour = 0; } +/// +/// Change the respawn point, possibly use an event to do this. +/// +static void TestChangeRespawnMenu() +{ + if (ImGui::Button("Set Respawn to 22,22,10")) + { + // Needs the decimals or it doesn't work right. + Command(22.0, 22.0, 2.0, 20.0); + Util::SetMessage("Respawn point set to middle of map."); + } + if (ImGui::Button("Fix respawn back to normal")) + { + Command(); + Util::SetMessage("Reset respawn points."); + } +} + +// Will this work? +bool respawnMiddleOfMap; +static void SetRespawnMiddleOfMapMenu() +{ + PlayerFunctions* playerFunctions = new PlayerFunctions(); + //if (ImGui::Checkbox("Respawn middle of map", &playerFunctions->m_bRespawnMiddleOfMap)) + if (ImGui::Checkbox("Respawn middle of map", &respawnMiddleOfMap)) + { + //if (playerFunctions->m_bRespawnMiddleOfMap) { + if (respawnMiddleOfMap) { + playerFunctions->m_bRespawnMiddleOfMap = true; + Util::SetMessage("You have enabled respawn at the middle of the map!"); + + } + else + { + playerFunctions->m_bRespawnMiddleOfMap = false; + Util::SetMessage("Spawning reset to normal."); + + } + } + //if (ImGui::Checkbox("Respawn middle of map", &PlayerFunctions::m_bRespawnMiddleOfMap)) + //{ + // if (PlayerFunctions::m_bRespawnMiddleOfMap) { + // PlayerFunctions::m_bRespawnMiddleOfMap = true; + // Util::SetMessage("You have enabled respawn at the middle of the map!"); + // } + // else + // { + // PlayerFunctions::m_bRespawnMiddleOfMap = false; + // Util::SetMessage("Spawning reset to normal."); + // } + //} + //if (ImGui::Button("Respawn middle of map")) + //{ + // PlayerFunctions::m_bRespawnMiddleOfMap = true; + //} +} + + +/// +/// Main code for PlayerTestMenu +/// void PedTestPage::PlayerTestMenu() { + + //Events::initGameEvent += [this]() + // { + + // }; + + Events::processScriptsEvent += [this]() + //Events::gameProcessEvent += [this]() + { + // Well this just spams the text and doesn't stop the noises when in the area. +#ifdef _TEST + // This seems to work for killing the player in the area. + if (IsPlayerInArea()) { + + //KillPlayer(); + //PlayerFunctions::KillPlayer(); + //Util::SetMessage("Welcome to the circle"); + //AreaCheckTest(); + } + else + { + + //Util::SetMessage("You will now die!"); + } + +#endif //_TEST1 + }; + SuicideMenu(); BombMenu(); ShowCoordsMenu(); ShowMarkerCoordsMenu(); TogglePlayerDrownMenu(); - GravityValuesMenu(); + GravityValuesMenu(); + ImGui::Separator(); + + // Test features +#ifdef _TEST + SoundMenu(); + ImGui::Separator(); +#ifdef GTASA + SpawnPedMenu(); + + // New + // Respawn stuff + TestChangeRespawnMenu(); + SetRespawnMiddleOfMapMenu(); + +#endif //GTASA + // I could probably set this to activate when the player goes into it and send a message saying you are in the zone. + AreaCheckTestMenu(); + + MiscTestMenu(); +#endif //TEST + } \ No newline at end of file diff --git a/src/test/test_ped.h b/src/test/test_ped.h index cd20595..c2c31b3 100644 --- a/src/test/test_ped.h +++ b/src/test/test_ped.h @@ -4,10 +4,10 @@ class PedTestPage { private: - PedTestPage(); - PedTestPage(const PedTestPage&); void Draw(); public: + PedTestPage(); + PedTestPage(const PedTestPage&); //static void PedTestMenu(); - static void PlayerTestMenu(); + void PlayerTestMenu(); };