mirror of
https://github.com/Mr-X-GTA/YimMenu.git
synced 2025-06-17 14:57:27 +08:00
refactor(Teleport): Fixed and optimised code
This commit is contained in:
parent
337ac85200
commit
1d631a86ce
@ -1,41 +1,20 @@
|
|||||||
#include "teleport.hpp"
|
#include "teleport.hpp"
|
||||||
|
#include "functions.hpp"
|
||||||
#include "natives.hpp"
|
#include "natives.hpp"
|
||||||
#include "notify.hpp"
|
#include "notify.hpp"
|
||||||
#include "script.hpp"
|
#include "script.hpp"
|
||||||
|
|
||||||
namespace big
|
namespace big
|
||||||
{
|
{
|
||||||
bool teleport::load_ground_at_3dcoord(Vector3 location)
|
bool teleport::load_ground_at_3dcoord(Vector3& location)
|
||||||
{
|
{
|
||||||
float groundZ;
|
float groundZ;
|
||||||
uint8_t attempts = 10;
|
uint8_t attempts = 10;
|
||||||
|
|
||||||
for (uint8_t i = 0; i < attempts; i++)
|
for (uint8_t i = 0; i < attempts; i++)
|
||||||
{
|
{
|
||||||
// Only request a collision after the first try failed because the location might already be loaded on first attempt.
|
// Only request a collision after the first try failed because the location might already be loaded on first attempt.
|
||||||
for (uint8_t z = 0; i && z < 1000; z += 100)
|
for (uint16_t z = 0; i && z < 1000; z += 100)
|
||||||
{
|
|
||||||
STREAMING::REQUEST_COLLISION_AT_COORD(location.x, location.y, z);
|
|
||||||
|
|
||||||
script::get_current()->yield();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (MISC::GET_GROUND_Z_FOR_3D_COORD(location.x, location.y, 1000.f, &groundZ, false, false))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
script::get_current()->yield();
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Vector3 teleport::get_ground_at_3dcoord(Vector3 location)
|
|
||||||
{
|
|
||||||
float groundZ;
|
|
||||||
uint8_t attempts = 10;
|
|
||||||
for (uint8_t i = 0; i < attempts; i++)
|
|
||||||
{
|
|
||||||
// Only request a collision after the first try failed because the location might already be loaded on first attempt.
|
|
||||||
for (uint8_t z = 0; i && z < 1000; z += 100)
|
|
||||||
{
|
{
|
||||||
STREAMING::REQUEST_COLLISION_AT_COORD(location.x, location.y, (float)z);
|
STREAMING::REQUEST_COLLISION_AT_COORD(location.x, location.y, (float)z);
|
||||||
|
|
||||||
@ -46,42 +25,36 @@ namespace big
|
|||||||
{
|
{
|
||||||
location.z = groundZ + 1.f;
|
location.z = groundZ + 1.f;
|
||||||
|
|
||||||
break;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == attempts - 1) location.z = 1000.f;
|
|
||||||
|
|
||||||
script::get_current()->yield();
|
script::get_current()->yield();
|
||||||
}
|
}
|
||||||
|
|
||||||
return location;
|
location.z = 1000.f;
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool teleport::bring_blip(int blipSprite, int blipColor, int flag)
|
bool teleport::bring_blip(int blipSprite, int blipColor, int flag)
|
||||||
{
|
{
|
||||||
Blip blipHandle = HUD::GET_FIRST_BLIP_INFO_ID(blipSprite);
|
Blip blip;
|
||||||
while (HUD::DOES_BLIP_EXIST(blipHandle) && (blipColor != -1 && HUD::GET_BLIP_COLOUR(blipHandle) != blipColor))
|
for (blip = HUD::GET_FIRST_BLIP_INFO_ID(blipSprite);
|
||||||
{
|
HUD::DOES_BLIP_EXIST(blip) &&
|
||||||
blipHandle = HUD::GET_NEXT_BLIP_INFO_ID(blipSprite);
|
blipColor != -1 && HUD::GET_BLIP_COLOUR(blip);
|
||||||
|
blip = HUD::GET_NEXT_BLIP_INFO_ID(blipSprite)
|
||||||
|
) script::get_current()->yield();
|
||||||
|
if (!HUD::DOES_BLIP_EXIST(blip) || (blipColor != -1 && HUD::GET_BLIP_COLOUR(blip) != blipColor)) return false;
|
||||||
|
|
||||||
script::get_current()->yield();
|
Vector3 location = HUD::GET_BLIP_COORDS(blip);
|
||||||
}
|
|
||||||
if (!HUD::DOES_BLIP_EXIST(blipHandle) || (blipColor != -1 && HUD::GET_BLIP_COLOUR(blipHandle) != blipColor)) return false;
|
|
||||||
|
|
||||||
Vector3 location = HUD::GET_BLIP_COORDS(blipHandle);
|
|
||||||
|
|
||||||
Entity veh = VEHICLE::GET_CLOSEST_VEHICLE(location.x, location.y, location.z, 5.f, 0, flag);
|
Entity veh = VEHICLE::GET_CLOSEST_VEHICLE(location.x, location.y, location.z, 5.f, 0, flag);
|
||||||
|
|
||||||
if (!ENTITY::DOES_ENTITY_EXIST(veh)) return false;
|
if (!ENTITY::DOES_ENTITY_EXIST(veh)) return false;
|
||||||
|
|
||||||
while (!NETWORK::NETWORK_HAS_CONTROL_OF_ENTITY(veh))
|
func::take_control_of_entity(veh);
|
||||||
{
|
|
||||||
NETWORK::NETWORK_REQUEST_CONTROL_OF_ENTITY(veh);
|
|
||||||
|
|
||||||
script::get_current()->yield();
|
Ped player = PLAYER::PLAYER_PED_ID();
|
||||||
}
|
|
||||||
|
|
||||||
Ped player = PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(g_player.id);
|
|
||||||
location = ENTITY::GET_ENTITY_COORDS(player, true);
|
location = ENTITY::GET_ENTITY_COORDS(player, true);
|
||||||
|
|
||||||
ENTITY::SET_ENTITY_COORDS(veh, location.x, location.y, location.z + 1.f, 0, 0, 0, true);
|
ENTITY::SET_ENTITY_COORDS(veh, location.x, location.y, location.z + 1.f, 0, 0, 0, true);
|
||||||
@ -93,7 +66,8 @@ namespace big
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PED::SET_PED_INTO_VEHICLE(player, veh, -2);
|
int seatIndex = VEHICLE::IS_VEHICLE_SEAT_FREE(veh, -1, false) ? -1 : -2;
|
||||||
|
PED::SET_PED_INTO_VEHICLE(player, veh, seatIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -103,17 +77,16 @@ namespace big
|
|||||||
{
|
{
|
||||||
Ped player = PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(g_player.id);
|
Ped player = PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(g_player.id);
|
||||||
|
|
||||||
Blip blipHandle = HUD::GET_FIRST_BLIP_INFO_ID(blipSprite);
|
Blip blip;
|
||||||
while (HUD::DOES_BLIP_EXIST(blipHandle) && (blipColor != -1 && HUD::GET_BLIP_COLOUR(blipHandle) != blipColor))
|
for (blip = HUD::GET_FIRST_BLIP_INFO_ID(blipSprite);
|
||||||
{
|
HUD::DOES_BLIP_EXIST(blip) &&
|
||||||
blipHandle = HUD::GET_NEXT_BLIP_INFO_ID(blipSprite);
|
blipColor != -1 && HUD::GET_BLIP_COLOUR(blip);
|
||||||
|
blip = HUD::GET_NEXT_BLIP_INFO_ID(blipSprite)
|
||||||
|
) script::get_current()->yield();
|
||||||
|
if (!HUD::DOES_BLIP_EXIST(blip) || (blipColor != -1 && HUD::GET_BLIP_COLOUR(blip) != blipColor)) return false;
|
||||||
|
|
||||||
script::get_current()->yield();
|
Vector3 location = HUD::GET_BLIP_COORDS(blip);
|
||||||
}
|
load_ground_at_3dcoord(location);
|
||||||
if (!HUD::DOES_BLIP_EXIST(blipHandle) || (blipColor != -1 && HUD::GET_BLIP_COLOUR(blipHandle) != blipColor)) return false;
|
|
||||||
|
|
||||||
Vector3 location = HUD::GET_BLIP_COORDS(blipHandle);
|
|
||||||
location = get_ground_at_3dcoord(location);
|
|
||||||
|
|
||||||
PED::SET_PED_COORDS_KEEP_VEHICLE(player, location.x, location.y, location.z);
|
PED::SET_PED_COORDS_KEEP_VEHICLE(player, location.x, location.y, location.z);
|
||||||
|
|
||||||
@ -133,8 +106,7 @@ namespace big
|
|||||||
|
|
||||||
Vector3 location = ENTITY::GET_ENTITY_COORDS(target, true);
|
Vector3 location = ENTITY::GET_ENTITY_COORDS(target, true);
|
||||||
|
|
||||||
for (uint8_t i = 0; !load_ground_at_3dcoord(location); i++)
|
load_ground_at_3dcoord(location);
|
||||||
if (i == 5) break;
|
|
||||||
|
|
||||||
Ped current = PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(g_player.id);
|
Ped current = PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(g_player.id);
|
||||||
|
|
||||||
@ -158,8 +130,7 @@ namespace big
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int seatIndex = -2;
|
int seatIndex = VEHICLE::IS_VEHICLE_SEAT_FREE(veh, -1, false) ? -1 : -2;
|
||||||
if (VEHICLE::IS_VEHICLE_SEAT_FREE(veh, -1, 0)) seatIndex = -1;
|
|
||||||
|
|
||||||
PED::SET_PED_INTO_VEHICLE(current, veh, seatIndex);
|
PED::SET_PED_INTO_VEHICLE(current, veh, seatIndex);
|
||||||
}
|
}
|
||||||
@ -183,8 +154,7 @@ namespace big
|
|||||||
if (!HUD::DOES_BLIP_EXIST(blipHandle)) return false;
|
if (!HUD::DOES_BLIP_EXIST(blipHandle)) return false;
|
||||||
|
|
||||||
Vector3 location = HUD::GET_BLIP_COORDS(blipHandle);
|
Vector3 location = HUD::GET_BLIP_COORDS(blipHandle);
|
||||||
|
load_ground_at_3dcoord(location);
|
||||||
location = get_ground_at_3dcoord(location);
|
|
||||||
|
|
||||||
PED::SET_PED_COORDS_KEEP_VEHICLE(player, location.x, location.y, location.z);
|
PED::SET_PED_COORDS_KEEP_VEHICLE(player, location.x, location.y, location.z);
|
||||||
|
|
||||||
|
@ -6,9 +6,8 @@ namespace big
|
|||||||
class teleport
|
class teleport
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
static bool load_ground_at_3dcoord(Vector3& location);
|
||||||
static bool bring_blip(int blipSprite, int blipColor, int flag = 70);
|
static bool bring_blip(int blipSprite, int blipColor, int flag = 70);
|
||||||
static bool load_ground_at_3dcoord(Vector3 location);
|
|
||||||
static Vector3 get_ground_at_3dcoord(Vector3 location);
|
|
||||||
static bool teleport_to_blip(int blipSprite, int blipColor = -1);
|
static bool teleport_to_blip(int blipSprite, int blipColor = -1);
|
||||||
static void teleport_into_player_vehicle(Player player);
|
static void teleport_into_player_vehicle(Player player);
|
||||||
static void teleport_to_player(Player player);
|
static void teleport_to_player(Player player);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user