CheatMenuSA/src/teleport.cpp

306 lines
9.8 KiB
C++
Raw Normal View History

2021-10-25 10:03:27 -04:00
#include "pch.h"
2021-09-20 08:41:40 -04:00
#include "teleport.h"
#include "menu.h"
#include "ui.h"
#include "util.h"
2020-12-02 16:19:16 -05:00
2021-08-01 21:41:48 -04:00
#ifdef GTASA
// FlA
2021-10-25 10:03:27 -04:00
tRadarTrace* CRadar::ms_RadarTrace = reinterpret_cast<tRadarTrace*>(patch::GetPointer(0x5838B0 + 2));
void Teleport::FetchRadarSpriteData()
2020-12-02 16:19:16 -05:00
{
2022-01-07 03:18:00 -05:00
uint cur_timer = CTimer::m_snTimeInMilliseconds;
static uint timer = cur_timer;
static int maxSprites = *(uint*)0x5D5870;
2022-01-07 03:18:00 -05:00
// Update the radar list each 5 seconds
if (cur_timer - timer < 5000)
{
return;
}
2022-06-15 06:45:43 -04:00
m_tpData.m_pData->RemoveTable("Radar");
for (int i = 0; i != maxSprites; ++i)
2022-01-07 03:18:00 -05:00
{
CVector pos = CRadar::ms_RadarTrace[i].m_vecPos;
2022-06-15 06:45:43 -04:00
std::string sprite = std::to_string(CRadar::ms_RadarTrace[i].m_nRadarSprite);
std::string keyName = m_SpriteData.Get<std::string>(sprite.c_str(), "Unknown");
keyName += ", " + Util::GetLocationName(&pos);
std::string key = "Radar." + keyName;
m_tpData.m_pData->Set(key.c_str(), std::format("0, {}, {}, {}", pos.x, pos.y, pos.z));
2022-01-07 03:18:00 -05:00
}
}
2021-08-01 21:41:48 -04:00
#endif
2020-12-02 16:19:16 -05:00
void Teleport::Init()
{
m_bQuickTeleport = gConfig.Get("quick_teleport", false);
2020-12-02 16:19:16 -05:00
2022-01-07 03:18:00 -05:00
Events::processScriptsEvent += []
{
if ((m_Teleport::m_bEnabled == true) && ((CTimer::m_snTimeInMilliseconds - m_Teleport::m_nTimer) > 500))
{
CPlayerPed* player = FindPlayerPed();
2020-12-02 16:19:16 -05:00
2021-08-14 20:36:11 -04:00
#ifdef GTASA
2022-01-07 03:18:00 -05:00
CEntity* player_entity = FindPlayerEntity(-1);
m_Teleport::m_fPos.z = CWorld::FindGroundZFor3DCoord(m_Teleport::m_fPos.x, m_Teleport::m_fPos.y,
m_Teleport::m_fPos.z + 100.0f, nullptr, &player_entity) + 1.0f;
#else
m_Teleport::m_fPos.z = CWorld::FindGroundZFor3DCoord(m_Teleport::m_fPos.x, m_Teleport::m_fPos.y,
m_Teleport::m_fPos.z + 100.0f, nullptr) + 1.0f;
#endif
CVehicle* pVeh = player->m_pVehicle;
if (pVeh && BY_GAME(player->m_nPedFlags.bInVehicle, player->m_pVehicle, player->m_pVehicle))
{
BY_GAME(pVeh->Teleport(m_Teleport::m_fPos, false), pVeh->Teleport(m_Teleport::m_fPos), player->Teleport(m_Teleport::m_fPos));
}
else
{
BY_GAME(player->Teleport(m_Teleport::m_fPos, false), player->Teleport(m_Teleport::m_fPos), player->Teleport(m_Teleport::m_fPos));
}
m_Teleport::m_bEnabled = false;
Command<Commands::FREEZE_CHAR_POSITION_AND_DONT_LOAD_COLLISION>(CPools::GetPedRef(player), false);
Command<Commands::RESTORE_CAMERA_JUMPCUT>();
TheCamera.Fade(0, 1);
}
if (m_bQuickTeleport)
{
if (quickTeleport.Pressed()
&& ((CTimer::m_snTimeInMilliseconds - m_nQuickTeleportTimer) > 500))
{
m_nQuickTeleportTimer = CTimer::m_snTimeInMilliseconds;
TeleportPlayer(true);
}
}
};
2020-12-02 16:19:16 -05:00
}
void Teleport::TeleportPlayer(bool get_marker, CVector pos, int interior_id)
2020-12-02 16:19:16 -05:00
{
2022-01-07 03:18:00 -05:00
CPlayerPed* pPlayer = FindPlayerPed();
CVehicle* pVeh = pPlayer->m_pVehicle;
2021-08-14 20:36:11 -04:00
#ifdef GTASA
2022-01-07 03:18:00 -05:00
if (get_marker)
{
tRadarTrace targetBlip = CRadar::ms_RadarTrace[LOWORD(FrontEndMenuManager.m_nTargetBlipIndex)];
2022-05-16 14:42:00 -04:00
if (targetBlip.m_nRadarSprite != RADAR_SPRITE_WAYPOINT)
2022-01-07 03:18:00 -05:00
{
SetHelpMessage(TEXT("Teleport.TargetBlipText"));
2022-01-07 03:18:00 -05:00
return;
}
CEntity* pPlayerEntity = FindPlayerEntity(-1);
pos = targetBlip.m_vecPos;
pos.z = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, 1000, nullptr, &pPlayerEntity) + 500.f;
2022-01-07 03:18:00 -05:00
m_Teleport::m_fPos = pos;
m_Teleport::m_nTimer = CTimer::m_snTimeInMilliseconds;
m_Teleport::m_bEnabled = true;
TheCamera.Fade(0, 0);
Command<Commands::FREEZE_CHAR_POSITION_AND_DONT_LOAD_COLLISION>(CPools::GetPedRef(pPlayer), true);
}
2021-08-14 20:36:11 -04:00
#endif
2020-12-02 16:19:16 -05:00
2021-10-21 19:07:30 -04:00
#ifdef GTA3
2022-01-07 03:18:00 -05:00
CStreaming::LoadScene(pos);
2021-10-21 19:07:30 -04:00
#else
2022-01-07 03:18:00 -05:00
CStreaming::LoadScene(&pos);
CStreaming::LoadSceneCollision(&pos);
2021-10-21 19:07:30 -04:00
#endif
2022-01-07 03:18:00 -05:00
CStreaming::LoadAllRequestedModels(false);
2021-06-18 12:49:11 -04:00
2021-08-14 20:36:11 -04:00
#ifdef GTASA
2022-01-07 03:18:00 -05:00
if (pVeh && pPlayer->m_nPedFlags.bInVehicle)
{
if (CModelInfo::IsTrainModel(pVeh->m_nModelIndex))
{
CVector vehPos = pVeh->GetPosition();
Command<Commands::WARP_CHAR_FROM_CAR_TO_COORD>(CPools::GetPedRef(pPlayer), vehPos.x, vehPos.y, vehPos.z + 2.0f);
if (DistanceBetweenPoints(pos, vehPos) > 100.0f)
{
Command<Commands::DELETE_ALL_TRAINS>();
}
2022-01-07 03:18:00 -05:00
pPlayer->Teleport(pos, false);
}
else
{
pVeh->Teleport(pos, false);
if (pVeh->m_nVehicleClass == VEHICLE_BIKE)
{
reinterpret_cast<CBike*>(pVeh)->PlaceOnRoadProperly();
}
else if (pVeh->m_nVehicleClass != VEHICLE_BOAT)
{
reinterpret_cast<CAutomobile*>(pVeh)->PlaceOnRoadProperly();
}
pVeh->m_nAreaCode = interior_id;
}
2022-01-07 03:18:00 -05:00
}
else
{
pPlayer->Teleport(pos, false);
}
#else
if (pVeh && pPlayer->m_pVehicle)
{
#ifdef GTAVC
pPlayer->m_nAreaCode = interior_id;
2021-10-21 19:07:30 -04:00
#endif
2022-01-07 03:18:00 -05:00
pVeh->Teleport(pos);
}
else
{
pPlayer->Teleport(pos);
}
2021-08-14 20:36:11 -04:00
#endif
2020-12-25 12:44:41 -05:00
#if defined GTASA || defined GTAVC
pPlayer->m_nAreaCode = interior_id;
2022-01-07 03:18:00 -05:00
Command<Commands::SET_AREA_VISIBLE>(interior_id);
#endif
2020-12-02 16:19:16 -05:00
}
2021-10-25 10:03:27 -04:00
void Teleport::TeleportToLocation(std::string& rootkey, std::string& bLocName, std::string& loc)
2020-12-02 16:19:16 -05:00
{
2022-01-07 03:18:00 -05:00
try
{
int dimension = 0;
CVector pos;
sscanf(loc.c_str(), "%d,%f,%f,%f", &dimension, &pos.x, &pos.y, &pos.z);
TeleportPlayer(false, pos, dimension);
}
catch (...)
{
SetHelpMessage(TEXT("Teleport.InvalidLocation"));
2022-01-07 03:18:00 -05:00
}
2020-12-02 16:19:16 -05:00
}
2021-10-25 10:03:27 -04:00
void Teleport::RemoveTeleportEntry(std::string& category, std::string& key, std::string& val)
2020-12-02 16:19:16 -05:00
{
2022-01-07 03:18:00 -05:00
if (category == "Custom")
{
2022-06-15 06:45:43 -04:00
m_tpData.m_pData->RemoveKey("Custom", key.c_str());
SetHelpMessage(TEXT("Teleport.LocationRemoved"));
2022-06-15 06:45:43 -04:00
m_tpData.m_pData->Save();
2022-01-07 03:18:00 -05:00
}
else
{
SetHelpMessage(TEXT("Teleport.CustomLocationRemoveOnly"));
2022-01-07 03:18:00 -05:00
}
2020-12-02 16:19:16 -05:00
}
2022-01-20 02:04:45 -05:00
void Teleport::ShowPage()
2020-12-02 16:19:16 -05:00
{
2022-01-07 03:18:00 -05:00
if (ImGui::BeginTabBar("Teleport", ImGuiTabBarFlags_NoTooltip + ImGuiTabBarFlags_FittingPolicyScroll))
{
ImGui::Spacing();
if (ImGui::BeginTabItem(TEXT("Window.TeleportPage")))
2022-01-07 03:18:00 -05:00
{
ImGui::Spacing();
if (ImGui::BeginChild("Teleport Child"))
{
ImGui::Columns(2, nullptr, false);
ImGui::Checkbox(TEXT("Teleport.InsertCoord"), &m_bInsertCoord);
2022-01-07 03:18:00 -05:00
ImGui::NextColumn();
2021-08-14 20:36:11 -04:00
#ifdef GTASA
if (Ui::CheckboxWithHint(TEXT("Teleport.QuickTeleport"), &m_bQuickTeleport,
std::string(TEXT_S("Teleport.QuickTeleportHint")
+ quickTeleport.GetNameString()).c_str()))
2022-01-07 03:18:00 -05:00
{
gConfig.Set("quick_teleport", m_bQuickTeleport);
2022-01-07 03:18:00 -05:00
}
#endif
ImGui::Columns(1);
ImGui::Spacing();
if (m_bInsertCoord)
{
CVector pos = FindPlayerPed()->GetPosition();
strcpy(m_nInputBuffer,
(std::to_string(static_cast<int>(pos.x)) + ", " + std::to_string(static_cast<int>(pos.y)) +
", " + std::to_string(static_cast<int>(pos.z))).c_str());
}
ImGui::InputTextWithHint(TEXT("Teleport.Coordinates"), "x, y, z", m_nInputBuffer, IM_ARRAYSIZE(m_nInputBuffer));
2022-01-07 03:18:00 -05:00
ImGui::Spacing();
if (ImGui::Button(TEXT("Teleport.TeleportToCoord"), Ui::GetSize(2)))
2022-01-07 03:18:00 -05:00
{
CVector pos{0, 0, 10};
try
{
sscanf(m_nInputBuffer,"%f,%f,%f", &pos.x, &pos.y, &pos.z);
pos.z += 1.0f;
TeleportPlayer(false, pos);
}
catch (...)
{
SetHelpMessage(TEXT("Teleport.InvalidCoord"));
2022-01-07 03:18:00 -05:00
}
}
ImGui::SameLine();
2021-08-14 20:36:11 -04:00
#ifdef GTASA
if (ImGui::Button(TEXT("Teleport.TeleportMarker"), Ui::GetSize(2)))
2022-01-07 03:18:00 -05:00
{
TeleportPlayer(true);
}
2021-08-14 20:36:11 -04:00
#else
if (ImGui::Button(TEXT("Teleport.TeleportCenter"), Ui::GetSize(2)))
2022-01-07 03:18:00 -05:00
{
TeleportPlayer(false, CVector(0, 0, 23));
}
2021-08-14 20:36:11 -04:00
#endif
2022-01-07 03:18:00 -05:00
ImGui::EndChild();
}
ImGui::EndTabItem();
}
2020-12-02 16:19:16 -05:00
if (ImGui::BeginTabItem(TEXT("Window.Search")))
2022-01-07 03:18:00 -05:00
{
2021-08-14 20:36:11 -04:00
#ifdef GTASA
2022-01-07 03:18:00 -05:00
FetchRadarSpriteData();
2022-02-07 03:46:55 -05:00
#endif
2022-01-07 03:18:00 -05:00
ImGui::Spacing();
if (ImGui::CollapsingHeader(TEXT("Window.AddNew")))
2022-01-07 03:18:00 -05:00
{
2022-02-07 03:46:55 -05:00
ImGui::Spacing();
ImGui::InputTextWithHint(TEXT("Teleport.Location"), TEXT("Teleport.LocationHint"), m_nLocationBuffer, IM_ARRAYSIZE(m_nInputBuffer));
ImGui::InputTextWithHint(TEXT("Teleport.Coordinates"), "x, y, z", m_nInputBuffer, IM_ARRAYSIZE(m_nInputBuffer));
2022-02-07 03:46:55 -05:00
ImGui::Spacing();
if (ImGui::Button(TEXT("Teleport.AddLocation"), Ui::GetSize()))
2022-02-07 03:46:55 -05:00
{
2022-06-15 06:45:43 -04:00
std::string key = std::string("Custom.") + m_nLocationBuffer;
m_tpData.m_pData->Set(key.c_str(), ("0, " + std::string(m_nInputBuffer)));
2022-02-07 03:46:55 -05:00
#ifdef GTASA
// Clear the Radar coordinates
2022-06-15 06:45:43 -04:00
m_tpData.m_pData->RemoveTable("Radar");
2022-02-07 03:46:55 -05:00
#endif
2022-06-15 06:45:43 -04:00
m_tpData.m_pData->Save();
2022-02-07 03:46:55 -05:00
}
2022-01-07 03:18:00 -05:00
}
2022-02-07 03:46:55 -05:00
ImGui::Spacing();
Ui::DrawJSON(m_tpData, TeleportToLocation,RemoveTeleportEntry);
2022-01-07 03:18:00 -05:00
ImGui::EndTabItem();
}
ImGui::EndTabBar();
}
2021-06-18 12:49:11 -04:00
}