Advertisement
adri1

NativeTrainerES

Apr 25th, 2015
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 75.65 KB | None | 0 0
  1. /*
  2. THIS FILE IS A PART OF GTA V SCRIPT HOOK SDK
  3. http://dev-c.com
  4. (C) Alexander Blade 2015
  5. */
  6.  
  7. /*
  8. F4 activate
  9. NUM2/8/4/6 navigate thru the menus and lists (numlock must be on)
  10. NUM5 select
  11. NUM0/BACKSPACE/F4 back
  12. NUM9/3 use vehicle boost when active
  13. NUM+ use vehicle rockets when active
  14. */
  15.  
  16. /*
  17. Traducido al español por adri1 (http://gtaforums.com/user/987650-adri1/)
  18. */
  19.  
  20. #include "script.h"
  21.  
  22. #include <string>
  23. #include <ctime>
  24.  
  25. #pragma warning(disable : 4244 4305) // double <-> float conversions
  26.  
  27. void draw_rect(float A_0, float A_1, float A_2, float A_3, int A_4, int A_5, int A_6, int A_7)
  28. {
  29. GRAPHICS::DRAW_RECT((A_0 + (A_2 * 0.5f)), (A_1 + (A_3 * 0.5f)), A_2, A_3, A_4, A_5, A_6, A_7);
  30. }
  31.  
  32. void draw_menu_line(std::string caption, float lineWidth, float lineHeight, float lineTop, float lineLeft, float textLeft, bool active, bool title, bool rescaleText = true)
  33. {
  34. // default values
  35. int text_col[4] = {255, 255, 255, 255},
  36. rect_col[4] = {70, 95, 95, 255};
  37. float text_scale = 0.35;
  38. int font = 0;
  39.  
  40. // correcting values for active line
  41. if (active)
  42. {
  43. text_col[0] = 0;
  44. text_col[1] = 0;
  45. text_col[2] = 0;
  46.  
  47. rect_col[0] = 218;
  48. rect_col[1] = 242;
  49. rect_col[2] = 216;
  50.  
  51. if (rescaleText) text_scale = 0.40;
  52. }
  53.  
  54. if (title)
  55. {
  56. rect_col[0] = 0;
  57. rect_col[1] = 0;
  58. rect_col[2] = 0;
  59.  
  60. if (rescaleText) text_scale = 0.50;
  61. font = 1;
  62. }
  63.  
  64. int screen_w, screen_h;
  65. GRAPHICS::GET_SCREEN_RESOLUTION(&screen_w, &screen_h);
  66.  
  67. textLeft += lineLeft;
  68.  
  69. float lineWidthScaled = lineWidth / (float)screen_w; // line width
  70. float lineTopScaled = (lineTop-25.0) / (float)screen_h; // line top offset
  71. float textLeftScaled = textLeft / (float)screen_w; // text left offset
  72. float lineHeightScaled = lineHeight / (float)screen_h; // line height
  73.  
  74. float lineLeftScaled = lineLeft / (float)screen_w;
  75.  
  76. // this is how it's done in original scripts
  77.  
  78. // text upper part
  79. UI::SET_TEXT_FONT(font);
  80. UI::SET_TEXT_SCALE(0.0, text_scale);
  81. UI::SET_TEXT_COLOUR(text_col[0], text_col[1], text_col[2], text_col[3]);
  82. UI::SET_TEXT_CENTRE(0);
  83. UI::SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0);
  84. UI::SET_TEXT_EDGE(0, 0, 0, 0, 0);
  85. UI::_SET_TEXT_ENTRY("STRING");
  86. UI::_ADD_TEXT_COMPONENT_STRING((LPSTR)caption.c_str());
  87. UI::_DRAW_TEXT(textLeftScaled, (((lineTopScaled + 0.00278f) + lineHeightScaled) - 0.005f));
  88.  
  89. // text lower part
  90. UI::SET_TEXT_FONT(font);
  91. UI::SET_TEXT_SCALE(0.0, text_scale);
  92. UI::SET_TEXT_COLOUR(text_col[0], text_col[1], text_col[2], text_col[3]);
  93. UI::SET_TEXT_CENTRE(0);
  94. UI::SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0);
  95. UI::SET_TEXT_EDGE(0, 0, 0, 0, 0);
  96. UI::_0x521FB041D93DD0E4("STRING");
  97. UI::_ADD_TEXT_COMPONENT_STRING((LPSTR)caption.c_str());
  98. int num25 = UI::_0x9040DFB09BE75706(textLeftScaled, (((lineTopScaled + 0.00278f) + lineHeightScaled) - 0.005f));
  99.  
  100. // rect
  101. draw_rect(lineLeftScaled, lineTopScaled + (0.00278f),
  102. lineWidthScaled, ((((float)(num25)* UI::_0xDB88A37483346780(text_scale, 0)) + (lineHeightScaled * 2.0f)) + 0.005f),
  103. rect_col[0], rect_col[1], rect_col[2], rect_col[3]);
  104. }
  105.  
  106. bool get_key_pressed(int nVirtKey)
  107. {
  108. //return (GetKeyState(nVirtKey) & 0x8000) != 0;
  109. return (GetAsyncKeyState(nVirtKey) & 0x8000) != 0;
  110. }
  111.  
  112. DWORD trainerResetTime = 0;
  113.  
  114. bool trainer_switch_pressed()
  115. {
  116. return (GetTickCount() > trainerResetTime + 1000) && get_key_pressed(VK_F4);
  117. }
  118.  
  119. void reset_trainer_switch()
  120. {
  121. trainerResetTime = GetTickCount();
  122. }
  123.  
  124. void get_button_state(bool *a, bool *b, bool *up, bool *down, bool *l, bool *r)
  125. {
  126. if (a) *a = get_key_pressed(VK_NUMPAD5);
  127. if (b) *b = get_key_pressed(VK_NUMPAD0) || trainer_switch_pressed() || get_key_pressed(VK_BACK);
  128. if (up) *up = get_key_pressed(VK_NUMPAD8);
  129. if (down) *down = get_key_pressed(VK_NUMPAD2);
  130. if (r) *r = get_key_pressed(VK_NUMPAD6);
  131. if (l) *l = get_key_pressed(VK_NUMPAD4);
  132. }
  133.  
  134. void menu_beep()
  135. {
  136. AUDIO::PLAY_SOUND_FRONTEND(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", 0);
  137. }
  138.  
  139. std::string statusText;
  140. DWORD statusTextDrawTicksMax;
  141. bool statusTextGxtEntry;
  142.  
  143. void update_status_text()
  144. {
  145. if (GetTickCount() < statusTextDrawTicksMax)
  146. {
  147. UI::SET_TEXT_FONT(0);
  148. UI::SET_TEXT_SCALE(0.5, 0.5);
  149. UI::SET_TEXT_COLOUR(255, 255, 255, 255);
  150. UI::SET_TEXT_WRAP(0.0, 1.0);
  151. UI::SET_TEXT_CENTRE(1);
  152. UI::SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0);
  153. UI::SET_TEXT_EDGE(1, 0, 0, 0, 205);
  154. if (statusTextGxtEntry)
  155. {
  156. UI::_SET_TEXT_ENTRY((char *)statusText.c_str());
  157. } else
  158. {
  159. UI::_SET_TEXT_ENTRY("STRING");
  160. UI::_ADD_TEXT_COMPONENT_STRING((char *)statusText.c_str());
  161. }
  162. UI::_DRAW_TEXT(0.5, 0.95);
  163. }
  164. }
  165.  
  166. void set_status_text(std::string str, DWORD time = 2500, bool isGxtEntry = false)
  167. {
  168. statusText = str;
  169. statusTextDrawTicksMax = GetTickCount() + time;
  170. statusTextGxtEntry = isGxtEntry;
  171. }
  172.  
  173. // features
  174. bool featurePlayerInvincible = false;
  175. bool featurePlayerInvincibleUpdated = false;
  176. bool featurePlayerNeverWanted = false;
  177. bool featurePlayerIgnored = false;
  178. bool featurePlayerIgnoredUpdated = false;
  179. bool featurePlayerUnlimitedAbility = false;
  180. bool featurePlayerNoNoise = false;
  181. bool featurePlayerNoNoiseUpdated = false;
  182. bool featurePlayerFastSwim = false;
  183. bool featurePlayerFastSwimUpdated = false;
  184. bool featurePlayerFastRun = false;
  185. bool featurePlayerFastRunUpdated = false;
  186. bool featurePlayerSuperJump = false;
  187.  
  188. bool featureWeaponNoReload = false;
  189. bool featureWeaponFireAmmo = false;
  190. bool featureWeaponExplosiveAmmo = false;
  191. bool featureWeaponExplosiveMelee = false;
  192. bool featureWeaponVehRockets = false;
  193.  
  194. DWORD featureWeaponVehShootLastTime = 0;
  195.  
  196. bool featureVehInvincible = false;
  197. bool featureVehInvincibleUpdated = false;
  198. bool featureVehSpeedBoost = false;
  199. bool featureVehWrapInSpawned = false;
  200.  
  201. bool featureWorldMoonGravity = false;
  202. bool featureWorldRandomCops = true;
  203. bool featureWorldRandomTrains = true;
  204. bool featureWorldRandomBoats = true;
  205. bool featureWorldGarbageTrucks = true;
  206.  
  207. bool featureTimePaused = false;
  208. bool featureTimePausedUpdated = false;
  209. bool featureTimeSynced = false;
  210.  
  211. bool featureWeatherWind = false;
  212.  
  213. bool featureMiscLockRadio = false;
  214. bool featureMiscHideHud = false;
  215.  
  216.  
  217. // player model control, switching on normal ped model when needed
  218.  
  219. LPCSTR animalModels[] = { "a_c_boar", "a_c_chimp", "a_c_cow", "a_c_coyote", "a_c_deer", "a_c_fish", "a_c_hen", "a_c_cat_01", "a_c_chickenhawk",
  220. "a_c_cormorant", "a_c_crow", "a_c_dolphin", "a_c_humpback", "a_c_killerwhale", "a_c_pigeon", "a_c_seagull", "a_c_sharkhammer",
  221. "a_c_pig", "a_c_rat", "a_c_rhesus", "a_c_chop", "a_c_husky", "a_c_mtlion", "a_c_retriever", "a_c_sharktiger", "a_c_shepherd" };
  222.  
  223. void check_player_model()
  224. {
  225. // common variables
  226. Player player = PLAYER::PLAYER_ID();
  227. Ped playerPed = PLAYER::PLAYER_PED_ID();
  228.  
  229. if (!ENTITY::DOES_ENTITY_EXIST(playerPed)) return;
  230.  
  231. Hash model = ENTITY::GET_ENTITY_MODEL(playerPed);
  232. if (ENTITY::IS_ENTITY_DEAD(playerPed))
  233. for (int i = 0; i < (sizeof(animalModels) / sizeof(animalModels[0])); i++)
  234. if (GAMEPLAY::GET_HASH_KEY((char *)animalModels[i]) == model)
  235. {
  236. set_status_text("Volviendo a humano.");
  237. model = GAMEPLAY::GET_HASH_KEY("player_zero");
  238. STREAMING::REQUEST_MODEL(model);
  239. while (!STREAMING::HAS_MODEL_LOADED(model))
  240. WAIT(0);
  241. PLAYER::SET_PLAYER_MODEL(PLAYER::PLAYER_ID(), model);
  242. PED::SET_PED_DEFAULT_COMPONENT_VARIATION(PLAYER::PLAYER_PED_ID());
  243. STREAMING::SET_MODEL_AS_NO_LONGER_NEEDED(model);
  244.  
  245. // wait until player is ressurected
  246. while (ENTITY::IS_ENTITY_DEAD(PLAYER::PLAYER_PED_ID()))
  247. WAIT(0);
  248.  
  249. break;
  250. }
  251. }
  252.  
  253. void update_vehicle_guns()
  254. {
  255. Player player = PLAYER::PLAYER_ID();
  256. Ped playerPed = PLAYER::PLAYER_PED_ID();
  257.  
  258. if (!ENTITY::DOES_ENTITY_EXIST(playerPed) || !featureWeaponVehRockets) return;
  259.  
  260. bool bSelect = get_key_pressed(0x6B); // num plus
  261. if (bSelect && featureWeaponVehShootLastTime + 150 < GetTickCount() &&
  262. PLAYER::IS_PLAYER_CONTROL_ON(player) && PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
  263. {
  264. Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
  265.  
  266. Vector3 v0, v1;
  267. GAMEPLAY::GET_MODEL_DIMENSIONS(ENTITY::GET_ENTITY_MODEL(veh), &v0, &v1);
  268.  
  269. Hash weaponAssetRocket = GAMEPLAY::GET_HASH_KEY("WEAPON_VEHICLE_ROCKET");
  270. if (!WEAPON::HAS_WEAPON_ASSET_LOADED(weaponAssetRocket))
  271. {
  272. WEAPON::REQUEST_WEAPON_ASSET(weaponAssetRocket, 31, 0);
  273. while (!WEAPON::HAS_WEAPON_ASSET_LOADED(weaponAssetRocket))
  274. WAIT(0);
  275. }
  276.  
  277. Vector3 coords0from = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, -(v1.x + 0.25f), v1.y + 1.25f, 0.1);
  278. Vector3 coords1from = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, (v1.x + 0.25f), v1.y + 1.25f, 0.1);
  279. Vector3 coords0to = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, -v1.x, v1.y + 100.0f, 0.1f);
  280. Vector3 coords1to = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, v1.x, v1.y + 100.0f, 0.1f);
  281.  
  282. GAMEPLAY::SHOOT_SINGLE_BULLET_BETWEEN_COORDS(coords0from.x, coords0from.y, coords0from.z,
  283. coords0to.x, coords0to.y, coords0to.z,
  284. 250, 1, weaponAssetRocket, playerPed, 1, 0, -1.0);
  285. GAMEPLAY::SHOOT_SINGLE_BULLET_BETWEEN_COORDS(coords1from.x, coords1from.y, coords1from.z,
  286. coords1to.x, coords1to.y, coords1to.z,
  287. 250, 1, weaponAssetRocket, playerPed, 1, 0, -1.0);
  288.  
  289. featureWeaponVehShootLastTime = GetTickCount();
  290. }
  291. }
  292.  
  293. bool skinchanger_used = false;
  294.  
  295. // Updates all features that can be turned off by the game, being called each game frame
  296. void update_features()
  297. {
  298. update_status_text();
  299.  
  300. update_vehicle_guns();
  301.  
  302. // changing player model if died while being an animal, since it can cause inf loading loop
  303. if (skinchanger_used)
  304. check_player_model();
  305.  
  306. // read default feature values from the game
  307. featureWorldRandomCops = PED::CAN_CREATE_RANDOM_COPS() == TRUE;
  308.  
  309. // common variables
  310. Player player = PLAYER::PLAYER_ID();
  311. Ped playerPed = PLAYER::PLAYER_PED_ID();
  312. BOOL bPlayerExists = ENTITY::DOES_ENTITY_EXIST(playerPed);
  313.  
  314. // player invincible
  315. if (featurePlayerInvincibleUpdated)
  316. {
  317. if (bPlayerExists && !featurePlayerInvincible)
  318. PLAYER::SET_PLAYER_INVINCIBLE(player, FALSE);
  319. featurePlayerInvincibleUpdated = false;
  320. }
  321. if (featurePlayerInvincible)
  322. {
  323. if (bPlayerExists)
  324. PLAYER::SET_PLAYER_INVINCIBLE(player, TRUE);
  325. }
  326.  
  327. // player never wanted
  328. if (featurePlayerNeverWanted)
  329. {
  330. if (bPlayerExists)
  331. PLAYER::CLEAR_PLAYER_WANTED_LEVEL(player);
  332. }
  333.  
  334. // police ignore player
  335. if (featurePlayerIgnoredUpdated)
  336. {
  337. if (bPlayerExists)
  338. PLAYER::SET_POLICE_IGNORE_PLAYER(player, featurePlayerIgnored);
  339. featurePlayerIgnoredUpdated = false;
  340. }
  341.  
  342. // player special ability
  343. if (featurePlayerUnlimitedAbility)
  344. {
  345. if (bPlayerExists)
  346. PLAYER::_RECHARGE_SPECIAL_ABILITY(player, 1);
  347. }
  348.  
  349. // player no noise
  350. if (featurePlayerNoNoiseUpdated)
  351. {
  352. if (bPlayerExists && !featurePlayerNoNoise)
  353. PLAYER::SET_PLAYER_NOISE_MULTIPLIER(player, 1.0);
  354. featurePlayerNoNoiseUpdated = false;
  355. }
  356. if (featurePlayerNoNoise)
  357. PLAYER::SET_PLAYER_NOISE_MULTIPLIER(player, 0.0);
  358.  
  359. // player fast swim
  360. if (featurePlayerFastSwimUpdated)
  361. {
  362. if (bPlayerExists && !featurePlayerFastSwim)
  363. PLAYER::_SET_SWIM_SPEED_MULTIPLIER(player, 1.0);
  364. featurePlayerFastSwimUpdated = false;
  365. }
  366. if (featurePlayerFastSwim)
  367. PLAYER::_SET_SWIM_SPEED_MULTIPLIER(player, 1.49);
  368.  
  369. // player fast run
  370. if (featurePlayerFastRunUpdated)
  371. {
  372. if (bPlayerExists && !featurePlayerFastRun)
  373. PLAYER::_SET_MOVE_SPEED_MULTIPLIER(player, 1.0);
  374. featurePlayerFastRunUpdated = false;
  375. }
  376. if (featurePlayerFastRun)
  377. PLAYER::_SET_MOVE_SPEED_MULTIPLIER(player, 1.49);
  378.  
  379. // player super jump
  380. if (featurePlayerSuperJump)
  381. {
  382. if (bPlayerExists)
  383. GAMEPLAY::SET_SUPER_JUMP_THIS_FRAME(player);
  384. }
  385.  
  386. // weapon
  387. if (featureWeaponFireAmmo)
  388. {
  389. if (bPlayerExists)
  390. GAMEPLAY::SET_FIRE_AMMO_THIS_FRAME(player);
  391. }
  392. if (featureWeaponExplosiveAmmo)
  393. {
  394. if (bPlayerExists)
  395. GAMEPLAY::SET_EXPLOSIVE_AMMO_THIS_FRAME(player);
  396. }
  397. if (featureWeaponExplosiveMelee)
  398. {
  399. if (bPlayerExists)
  400. GAMEPLAY::SET_EXPLOSIVE_MELEE_THIS_FRAME(player);
  401. }
  402.  
  403. // weapon no reload
  404. if (bPlayerExists && featureWeaponNoReload)
  405. {
  406. Hash cur;
  407. if (WEAPON::GET_CURRENT_PED_WEAPON(playerPed, &cur, 1))
  408. {
  409. if (WEAPON::IS_WEAPON_VALID(cur))
  410. {
  411. int maxAmmo;
  412. if (WEAPON::GET_MAX_AMMO(playerPed, cur, &maxAmmo))
  413. {
  414. WEAPON::SET_PED_AMMO(playerPed, cur, maxAmmo);
  415.  
  416. maxAmmo = WEAPON::GET_MAX_AMMO_IN_CLIP(playerPed, cur, 1);
  417. if (maxAmmo > 0)
  418. WEAPON::SET_AMMO_IN_CLIP(playerPed, cur, maxAmmo);
  419. }
  420. }
  421. }
  422. }
  423.  
  424. // player's vehicle invincible
  425. if (featureVehInvincibleUpdated)
  426. {
  427. if (bPlayerExists && !featureVehInvincible && PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
  428. {
  429. Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
  430. ENTITY::SET_ENTITY_INVINCIBLE(veh, FALSE);
  431. ENTITY::SET_ENTITY_PROOFS(veh, 0, 0, 0, 0, 0, 0, 0, 0);
  432. VEHICLE::SET_VEHICLE_TYRES_CAN_BURST(veh, 1);
  433. VEHICLE::SET_VEHICLE_WHEELS_CAN_BREAK(veh, 1);
  434. VEHICLE::SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(veh, 1);
  435. }
  436. featureVehInvincibleUpdated = false;
  437. }
  438. if (featureVehInvincible)
  439. {
  440. if (bPlayerExists && PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
  441. {
  442. Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
  443. ENTITY::SET_ENTITY_INVINCIBLE(veh, TRUE);
  444. ENTITY::SET_ENTITY_PROOFS(veh, 1, 1, 1, 1, 1, 1, 1, 1);
  445. VEHICLE::SET_VEHICLE_TYRES_CAN_BURST(veh, 0);
  446. VEHICLE::SET_VEHICLE_WHEELS_CAN_BREAK(veh, 0);
  447. VEHICLE::SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(veh, 0);
  448. }
  449. }
  450.  
  451. // player's vehicle boost
  452. if (featureVehSpeedBoost && bPlayerExists && PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
  453. {
  454. Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
  455. DWORD model = ENTITY::GET_ENTITY_MODEL(veh);
  456.  
  457. bool bUp = get_key_pressed(VK_NUMPAD9);
  458. bool bDown = get_key_pressed(VK_NUMPAD3);
  459.  
  460. if (bUp || bDown)
  461. {
  462. float speed = ENTITY::GET_ENTITY_SPEED(veh);
  463. if (bUp)
  464. {
  465. speed += speed * 0.05f;
  466. VEHICLE::SET_VEHICLE_FORWARD_SPEED(veh, speed);
  467. } else
  468. if (ENTITY::IS_ENTITY_IN_AIR(veh) || speed > 5.0)
  469. VEHICLE::SET_VEHICLE_FORWARD_SPEED(veh, 0.0);
  470. }
  471. }
  472.  
  473. // time pause
  474. if (featureTimePausedUpdated)
  475. {
  476. TIME::PAUSE_CLOCK(featureTimePaused);
  477. featureTimePausedUpdated = false;
  478. }
  479.  
  480. // time sync
  481. if (featureTimeSynced)
  482. {
  483. time_t now = time(0);
  484. tm t;
  485. localtime_s(&t, &now);
  486. TIME::SET_CLOCK_TIME(t.tm_hour, t.tm_min, t.tm_sec);
  487. }
  488.  
  489. // hide hud
  490. if (featureMiscHideHud)
  491. UI::HIDE_HUD_AND_RADAR_THIS_FRAME();
  492. }
  493.  
  494. LPCSTR pedModels[69][10] = {
  495. {"player_zero", "player_one", "player_two", "a_c_boar", "a_c_chimp", "a_c_cow", "a_c_coyote", "a_c_deer", "a_c_fish", "a_c_hen"},
  496. { "a_c_cat_01", "a_c_chickenhawk", "a_c_cormorant", "a_c_crow", "a_c_dolphin", "a_c_humpback", "a_c_killerwhale", "a_c_pigeon", "a_c_seagull", "a_c_sharkhammer"},
  497. {"a_c_pig", "a_c_rat", "a_c_rhesus", "a_c_chop", "a_c_husky", "a_c_mtlion", "a_c_retriever", "a_c_sharktiger", "a_c_shepherd", "s_m_m_movalien_01"},
  498. {"a_f_m_beach_01", "a_f_m_bevhills_01", "a_f_m_bevhills_02", "a_f_m_bodybuild_01", "a_f_m_business_02", "a_f_m_downtown_01", "a_f_m_eastsa_01", "a_f_m_eastsa_02", "a_f_m_fatbla_01", "a_f_m_fatcult_01"},
  499. {"a_f_m_fatwhite_01", "a_f_m_ktown_01", "a_f_m_ktown_02", "a_f_m_prolhost_01", "a_f_m_salton_01", "a_f_m_skidrow_01", "a_f_m_soucentmc_01", "a_f_m_soucent_01", "a_f_m_soucent_02", "a_f_m_tourist_01"},
  500. {"a_f_m_trampbeac_01", "a_f_m_tramp_01", "a_f_o_genstreet_01", "a_f_o_indian_01", "a_f_o_ktown_01", "a_f_o_salton_01", "a_f_o_soucent_01", "a_f_o_soucent_02", "a_f_y_beach_01", "a_f_y_bevhills_01"},
  501. {"a_f_y_bevhills_02", "a_f_y_bevhills_03", "a_f_y_bevhills_04", "a_f_y_business_01", "a_f_y_business_02", "a_f_y_business_03", "a_f_y_business_04", "a_f_y_eastsa_01", "a_f_y_eastsa_02", "a_f_y_eastsa_03"},
  502. {"a_f_y_epsilon_01", "a_f_y_fitness_01", "a_f_y_fitness_02", "a_f_y_genhot_01", "a_f_y_golfer_01", "a_f_y_hiker_01", "a_f_y_hippie_01", "a_f_y_hipster_01", "a_f_y_hipster_02", "a_f_y_hipster_03"},
  503. {"a_f_y_hipster_04", "a_f_y_indian_01", "a_f_y_juggalo_01", "a_f_y_runner_01", "a_f_y_rurmeth_01", "a_f_y_scdressy_01", "a_f_y_skater_01", "a_f_y_soucent_01", "a_f_y_soucent_02", "a_f_y_soucent_03"},
  504. {"a_f_y_tennis_01", "a_f_y_topless_01", "a_f_y_tourist_01", "a_f_y_tourist_02", "a_f_y_vinewood_01", "a_f_y_vinewood_02", "a_f_y_vinewood_03", "a_f_y_vinewood_04", "a_f_y_yoga_01", "a_m_m_acult_01"},
  505. {"a_m_m_afriamer_01", "a_m_m_beach_01", "a_m_m_beach_02", "a_m_m_bevhills_01", "a_m_m_bevhills_02", "a_m_m_business_01", "a_m_m_eastsa_01", "a_m_m_eastsa_02", "a_m_m_farmer_01", "a_m_m_fatlatin_01"},
  506. {"a_m_m_genfat_01", "a_m_m_genfat_02", "a_m_m_golfer_01", "a_m_m_hasjew_01", "a_m_m_hillbilly_01", "a_m_m_hillbilly_02", "a_m_m_indian_01", "a_m_m_ktown_01", "a_m_m_malibu_01", "a_m_m_mexcntry_01"},
  507. {"a_m_m_mexlabor_01", "a_m_m_og_boss_01", "a_m_m_paparazzi_01", "a_m_m_polynesian_01", "a_m_m_prolhost_01", "a_m_m_rurmeth_01", "a_m_m_salton_01", "a_m_m_salton_02", "a_m_m_salton_03", "a_m_m_salton_04"},
  508. {"a_m_m_skater_01", "a_m_m_skidrow_01", "a_m_m_socenlat_01", "a_m_m_soucent_01", "a_m_m_soucent_02", "a_m_m_soucent_03", "a_m_m_soucent_04", "a_m_m_stlat_02", "a_m_m_tennis_01", "a_m_m_tourist_01"},
  509. {"a_m_m_trampbeac_01", "a_m_m_tramp_01", "a_m_m_tranvest_01", "a_m_m_tranvest_02", "a_m_o_acult_01", "a_m_o_acult_02", "a_m_o_beach_01", "a_m_o_genstreet_01", "a_m_o_ktown_01", "a_m_o_salton_01"},
  510. {"a_m_o_soucent_01", "a_m_o_soucent_02", "a_m_o_soucent_03", "a_m_o_tramp_01", "a_m_y_acult_01", "a_m_y_acult_02", "a_m_y_beachvesp_01", "a_m_y_beachvesp_02", "a_m_y_beach_01", "a_m_y_beach_02"},
  511. {"a_m_y_beach_03", "a_m_y_bevhills_01", "a_m_y_bevhills_02", "a_m_y_breakdance_01", "a_m_y_busicas_01", "a_m_y_business_01", "a_m_y_business_02", "a_m_y_business_03", "a_m_y_cyclist_01", "a_m_y_dhill_01"},
  512. {"a_m_y_downtown_01", "a_m_y_eastsa_01", "a_m_y_eastsa_02", "a_m_y_epsilon_01", "a_m_y_epsilon_02", "a_m_y_gay_01", "a_m_y_gay_02", "a_m_y_genstreet_01", "a_m_y_genstreet_02", "a_m_y_golfer_01"},
  513. {"a_m_y_hasjew_01", "a_m_y_hiker_01", "a_m_y_hippy_01", "a_m_y_hipster_01", "a_m_y_hipster_02", "a_m_y_hipster_03", "a_m_y_indian_01", "a_m_y_jetski_01", "a_m_y_juggalo_01", "a_m_y_ktown_01"},
  514. {"a_m_y_ktown_02", "a_m_y_latino_01", "a_m_y_methhead_01", "a_m_y_mexthug_01", "a_m_y_motox_01", "a_m_y_motox_02", "a_m_y_musclbeac_01", "a_m_y_musclbeac_02", "a_m_y_polynesian_01", "a_m_y_roadcyc_01"},
  515. {"a_m_y_runner_01", "a_m_y_runner_02", "a_m_y_salton_01", "a_m_y_skater_01", "a_m_y_skater_02", "a_m_y_soucent_01", "a_m_y_soucent_02", "a_m_y_soucent_03", "a_m_y_soucent_04", "a_m_y_stbla_01"},
  516. {"a_m_y_stbla_02", "a_m_y_stlat_01", "a_m_y_stwhi_01", "a_m_y_stwhi_02", "a_m_y_sunbathe_01", "a_m_y_surfer_01", "a_m_y_vindouche_01", "a_m_y_vinewood_01", "a_m_y_vinewood_02", "a_m_y_vinewood_03"},
  517. {"a_m_y_vinewood_04", "a_m_y_yoga_01", "u_m_y_proldriver_01", "u_m_y_rsranger_01", "u_m_y_sbike", "u_m_y_staggrm_01", "u_m_y_tattoo_01", "csb_abigail", "csb_anita", "csb_anton"},
  518. {"csb_ballasog", "csb_bride", "csb_burgerdrug", "csb_car3guy1", "csb_car3guy2", "csb_chef", "csb_chin_goon", "csb_cletus", "csb_cop", "csb_customer"},
  519. {"csb_denise_friend", "csb_fos_rep", "csb_g", "csb_groom", "csb_grove_str_dlr", "csb_hao", "csb_hugh", "csb_imran", "csb_janitor", "csb_maude"},
  520. {"csb_mweather", "csb_ortega", "csb_oscar", "csb_porndudes", "csb_porndudes_p", "csb_prologuedriver", "csb_prolsec", "csb_ramp_gang", "csb_ramp_hic", "csb_ramp_hipster"},
  521. {"csb_ramp_marine", "csb_ramp_mex", "csb_reporter", "csb_roccopelosi", "csb_screen_writer", "csb_stripper_01", "csb_stripper_02", "csb_tonya", "csb_trafficwarden", "cs_amandatownley"},
  522. {"cs_andreas", "cs_ashley", "cs_bankman", "cs_barry", "cs_barry_p", "cs_beverly", "cs_beverly_p", "cs_brad", "cs_bradcadaver", "cs_carbuyer"},
  523. {"cs_casey", "cs_chengsr", "cs_chrisformage", "cs_clay", "cs_dale", "cs_davenorton", "cs_debra", "cs_denise", "cs_devin", "cs_dom"},
  524. {"cs_dreyfuss", "cs_drfriedlander", "cs_fabien", "cs_fbisuit_01", "cs_floyd", "cs_guadalope", "cs_gurk", "cs_hunter", "cs_janet", "cs_jewelass"},
  525. {"cs_jimmyboston", "cs_jimmydisanto", "cs_joeminuteman", "cs_johnnyklebitz", "cs_josef", "cs_josh", "cs_lamardavis", "cs_lazlow", "cs_lestercrest", "cs_lifeinvad_01"},
  526. {"cs_magenta", "cs_manuel", "cs_marnie", "cs_martinmadrazo", "cs_maryann", "cs_michelle", "cs_milton", "cs_molly", "cs_movpremf_01", "cs_movpremmale"},
  527. {"cs_mrk", "cs_mrsphillips", "cs_mrs_thornhill", "cs_natalia", "cs_nervousron", "cs_nigel", "cs_old_man1a", "cs_old_man2", "cs_omega", "cs_orleans"},
  528. {"cs_paper", "cs_paper_p", "cs_patricia", "cs_priest", "cs_prolsec_02", "cs_russiandrunk", "cs_siemonyetarian", "cs_solomon", "cs_stevehains", "cs_stretch"},
  529. {"cs_tanisha", "cs_taocheng", "cs_taostranslator", "cs_tenniscoach", "cs_terry", "cs_tom", "cs_tomepsilon", "cs_tracydisanto", "cs_wade", "cs_zimbor"},
  530. {"g_f_y_ballas_01", "g_f_y_families_01", "g_f_y_lost_01", "g_f_y_vagos_01", "g_m_m_armboss_01", "g_m_m_armgoon_01", "g_m_m_armlieut_01", "g_m_m_chemwork_01", "g_m_m_chemwork_01_p", "g_m_m_chiboss_01"},
  531. {"g_m_m_chiboss_01_p", "g_m_m_chicold_01", "g_m_m_chicold_01_p", "g_m_m_chigoon_01", "g_m_m_chigoon_01_p", "g_m_m_chigoon_02", "g_m_m_korboss_01", "g_m_m_mexboss_01", "g_m_m_mexboss_02", "g_m_y_armgoon_02"},
  532. {"g_m_y_azteca_01", "g_m_y_ballaeast_01", "g_m_y_ballaorig_01", "g_m_y_ballasout_01", "g_m_y_famca_01", "g_m_y_famdnf_01", "g_m_y_famfor_01", "g_m_y_korean_01", "g_m_y_korean_02", "g_m_y_korlieut_01"},
  533. {"g_m_y_lost_01", "g_m_y_lost_02", "g_m_y_lost_03", "g_m_y_mexgang_01", "g_m_y_mexgoon_01", "g_m_y_mexgoon_02", "g_m_y_mexgoon_03", "g_m_y_mexgoon_03_p", "g_m_y_pologoon_01", "g_m_y_pologoon_01_p"},
  534. {"g_m_y_pologoon_02", "g_m_y_pologoon_02_p", "g_m_y_salvaboss_01", "g_m_y_salvagoon_01", "g_m_y_salvagoon_02", "g_m_y_salvagoon_03", "g_m_y_salvagoon_03_p", "g_m_y_strpunk_01", "g_m_y_strpunk_02", "hc_driver"},
  535. {"hc_gunman", "hc_hacker", "ig_abigail", "ig_amandatownley", "ig_andreas", "ig_ashley", "ig_ballasog", "ig_bankman", "ig_barry", "ig_barry_p"},
  536. {"ig_bestmen", "ig_beverly", "ig_beverly_p", "ig_brad", "ig_bride", "ig_car3guy1", "ig_car3guy2", "ig_casey", "ig_chef", "ig_chengsr"},
  537. {"ig_chrisformage", "ig_clay", "ig_claypain", "ig_cletus", "ig_dale", "ig_davenorton", "ig_denise", "ig_devin", "ig_dom", "ig_dreyfuss"},
  538. {"ig_drfriedlander", "ig_fabien", "ig_fbisuit_01", "ig_floyd", "ig_groom", "ig_hao", "ig_hunter", "ig_janet", "ig_jay_norris", "ig_jewelass"},
  539. {"ig_jimmyboston", "ig_jimmydisanto", "ig_joeminuteman", "ig_johnnyklebitz", "ig_josef", "ig_josh", "ig_kerrymcintosh", "ig_lamardavis", "ig_lazlow", "ig_lestercrest"},
  540. {"ig_lifeinvad_01", "ig_lifeinvad_02", "ig_magenta", "ig_manuel", "ig_marnie", "ig_maryann", "ig_maude", "ig_michelle", "ig_milton", "ig_molly"},
  541. {"ig_mrk", "ig_mrsphillips", "ig_mrs_thornhill", "ig_natalia", "ig_nervousron", "ig_nigel", "ig_old_man1a", "ig_old_man2", "ig_omega", "ig_oneil"},
  542. {"ig_orleans", "ig_ortega", "ig_paper", "ig_patricia", "ig_priest", "ig_prolsec_02", "ig_ramp_gang", "ig_ramp_hic", "ig_ramp_hipster", "ig_ramp_mex"},
  543. {"ig_roccopelosi", "ig_russiandrunk", "ig_screen_writer", "ig_siemonyetarian", "ig_solomon", "ig_stevehains", "ig_stretch", "ig_talina", "ig_tanisha", "ig_taocheng"},
  544. {"ig_taostranslator", "ig_taostranslator_p", "ig_tenniscoach", "ig_terry", "ig_tomepsilon", "ig_tonya", "ig_tracydisanto", "ig_trafficwarden", "ig_tylerdix", "ig_wade"},
  545. {"ig_zimbor", "mp_f_deadhooker", "mp_f_freemode_01", "mp_f_misty_01", "mp_f_stripperlite", "mp_g_m_pros_01", "mp_headtargets", "mp_m_claude_01", "mp_m_exarmy_01", "mp_m_famdd_01"},
  546. {"mp_m_fibsec_01", "mp_m_freemode_01", "mp_m_marston_01", "mp_m_niko_01", "mp_m_shopkeep_01", "mp_s_m_armoured_01", "", "", "", ""},
  547. {"", "s_f_m_fembarber", "s_f_m_maid_01", "s_f_m_shop_high", "s_f_m_sweatshop_01", "s_f_y_airhostess_01", "s_f_y_bartender_01", "s_f_y_baywatch_01", "s_f_y_cop_01", "s_f_y_factory_01"},
  548. {"s_f_y_hooker_01", "s_f_y_hooker_02", "s_f_y_hooker_03", "s_f_y_migrant_01", "s_f_y_movprem_01", "s_f_y_ranger_01", "s_f_y_scrubs_01", "s_f_y_sheriff_01", "s_f_y_shop_low", "s_f_y_shop_mid"},
  549. {"s_f_y_stripperlite", "s_f_y_stripper_01", "s_f_y_stripper_02", "s_f_y_sweatshop_01", "s_m_m_ammucountry", "s_m_m_armoured_01", "s_m_m_armoured_02", "s_m_m_autoshop_01", "s_m_m_autoshop_02", "s_m_m_bouncer_01"},
  550. {"s_m_m_chemsec_01", "s_m_m_ciasec_01", "s_m_m_cntrybar_01", "s_m_m_dockwork_01", "s_m_m_doctor_01", "s_m_m_fiboffice_01", "s_m_m_fiboffice_02", "s_m_m_gaffer_01", "s_m_m_gardener_01", "s_m_m_gentransport"},
  551. {"s_m_m_hairdress_01", "s_m_m_highsec_01", "s_m_m_highsec_02", "s_m_m_janitor", "s_m_m_lathandy_01", "s_m_m_lifeinvad_01", "s_m_m_linecook", "s_m_m_lsmetro_01", "s_m_m_mariachi_01", "s_m_m_marine_01"},
  552. {"s_m_m_marine_02", "s_m_m_migrant_01", "u_m_y_zombie_01", "s_m_m_movprem_01", "s_m_m_movspace_01", "s_m_m_paramedic_01", "s_m_m_pilot_01", "s_m_m_pilot_02", "s_m_m_postal_01", "s_m_m_postal_02"},
  553. {"s_m_m_prisguard_01", "s_m_m_scientist_01", "s_m_m_security_01", "s_m_m_snowcop_01", "s_m_m_strperf_01", "s_m_m_strpreach_01", "s_m_m_strvend_01", "s_m_m_trucker_01", "s_m_m_ups_01", "s_m_m_ups_02"},
  554. {"s_m_o_busker_01", "s_m_y_airworker", "s_m_y_ammucity_01", "s_m_y_armymech_01", "s_m_y_autopsy_01", "s_m_y_barman_01", "s_m_y_baywatch_01", "s_m_y_blackops_01", "s_m_y_blackops_02", "s_m_y_busboy_01"},
  555. {"s_m_y_chef_01", "s_m_y_clown_01", "s_m_y_construct_01", "s_m_y_construct_02", "s_m_y_cop_01", "s_m_y_dealer_01", "s_m_y_devinsec_01", "s_m_y_dockwork_01", "s_m_y_doorman_01", "s_m_y_dwservice_01"},
  556. {"s_m_y_dwservice_02", "s_m_y_factory_01", "s_m_y_fireman_01", "s_m_y_garbage", "s_m_y_grip_01", "s_m_y_hwaycop_01", "s_m_y_marine_01", "s_m_y_marine_02", "s_m_y_marine_03", "s_m_y_mime"},
  557. {"s_m_y_pestcont_01", "s_m_y_pilot_01", "s_m_y_prismuscl_01", "s_m_y_prisoner_01", "s_m_y_ranger_01", "s_m_y_robber_01", "s_m_y_sheriff_01", "s_m_y_shop_mask", "s_m_y_strvend_01", "s_m_y_swat_01"},
  558. {"s_m_y_uscg_01", "s_m_y_valet_01", "s_m_y_waiter_01", "s_m_y_winclean_01", "s_m_y_xmech_01", "s_m_y_xmech_02", "u_f_m_corpse_01", "u_f_m_miranda", "u_f_m_promourn_01", "u_f_o_moviestar"},
  559. {"u_f_o_prolhost_01", "u_f_y_bikerchic", "u_f_y_comjane", "u_f_y_corpse_01", "u_f_y_corpse_02", "u_f_y_hotposh_01", "u_f_y_jewelass_01", "u_f_y_mistress", "u_f_y_poppymich", "u_f_y_princess"},
  560. {"u_f_y_spyactress", "u_m_m_aldinapoli", "u_m_m_bankman", "u_m_m_bikehire_01", "u_m_m_fibarchitect", "u_m_m_filmdirector", "u_m_m_glenstank_01", "u_m_m_griff_01", "u_m_m_jesus_01", "u_m_m_jewelsec_01"},
  561. {"u_m_m_jewelthief", "u_m_m_markfost", "u_m_m_partytarget", "u_m_m_prolsec_01", "u_m_m_promourn_01", "u_m_m_rivalpap", "u_m_m_spyactor", "u_m_m_willyfist", "u_m_o_finguru_01", "u_m_o_taphillbilly"},
  562. {"u_m_o_tramp_01", "u_m_y_abner", "u_m_y_antonb", "u_m_y_babyd", "u_m_y_baygor", "u_m_y_burgerdrug_01", "u_m_y_chip", "u_m_y_cyclist_01", "u_m_y_fibmugger_01", "u_m_y_guido_01"},
  563. {"u_m_y_gunvend_01", "u_m_y_hippie_01", "u_m_y_imporage", "u_m_y_justin", "u_m_y_mani", "u_m_y_militarybum", "u_m_y_paparazzi", "u_m_y_party_01", "u_m_y_pogo_01", "u_m_y_prisoner_01"}
  564. };
  565.  
  566. LPCSTR pedModelNames[69][10] = {
  567. {"MICHAEL", "FRANKLIN", "TREVOR", "JABALI", "CHIMPANCE", "VACA", "COYOTE", "CIERVO", "PEZ", "GALLINA"},
  568. { "GATO", "HALCON", "CORMORAN", "CUERVO", "DELFIN", "BALLENA 1", "BALLENA 2", "PALOMA", "GAVIOTA", "TIBURON" },
  569. {"CERDO", "RATA", "MONO", "CHOP", "PERRO", "LEOPARDO", "PERRO 2", "TIBURON TIGRE", "PERRO 3", "ALIEN"},
  570. {"BEACH", "BEVHILLS", "BEVHILLS", "BODYBUILD", "BUSINESS", "DOWNTOWN", "EASTSA", "EASTSA", "FATBLA", "FATCULT"},
  571. {"FATWHITE", "KTOWN", "KTOWN", "PROLHOST", "SALTON", "SKIDROW", "SOUCENTMC", "SOUCENT", "SOUCENT", "TOURIST"},
  572. {"TRAMPBEAC", "TRAMP", "GENSTREET", "INDIAN", "KTOWN", "SALTON", "SOUCENT", "SOUCENT", "BEACH", "BEVHILLS"},
  573. {"BEVHILLS", "BEVHILLS", "BEVHILLS", "BUSINESS", "BUSINESS", "BUSINESS", "BUSINESS", "EASTSA", "EASTSA", "EASTSA"},
  574. {"EPSILON", "FITNESS", "FITNESS", "GENHOT", "GOLFER", "HIKER", "HIPPIE", "HIPSTER", "HIPSTER", "HIPSTER"},
  575. {"HIPSTER", "INDIAN", "JUGGALO", "RUNNER", "RURMETH", "SCDRESSY", "SKATER", "SOUCENT", "SOUCENT", "SOUCENT"},
  576. {"TENNIS", "TOPLESS", "TOURIST", "TOURIST", "VINEWOOD", "VINEWOOD", "VINEWOOD", "VINEWOOD", "YOGA", "ACULT"},
  577. {"AFRIAMER", "BEACH", "BEACH", "BEVHILLS", "BEVHILLS", "BUSINESS", "EASTSA", "EASTSA", "FARMER", "FATLATIN"},
  578. {"GENFAT", "GENFAT", "GOLFER", "HASJEW", "HILLBILLY", "HILLBILLY", "INDIAN", "KTOWN", "MALIBU", "MEXCNTRY"},
  579. {"MEXLABOR", "OG_BOSS", "PAPARAZZI", "POLYNESIAN", "PROLHOST", "RURMETH", "SALTON", "SALTON", "SALTON", "SALTON"},
  580. {"SKATER", "SKIDROW", "SOCENLAT", "SOUCENT", "SOUCENT", "SOUCENT", "SOUCENT", "STLAT", "TENNIS", "TOURIST"},
  581. {"TRAMPBEAC", "TRAMP", "TRANVEST", "TRANVEST", "ACULT", "ACULT", "BEACH", "GENSTREET", "KTOWN", "SALTON"},
  582. {"SOUCENT", "SOUCENT", "SOUCENT", "TRAMP", "ACULT", "ACULT", "BEACHVESP", "BEACHVESP", "BEACH", "BEACH"},
  583. {"BEACH", "BEVHILLS", "BEVHILLS", "BREAKDANCE", "BUSICAS", "BUSINESS", "BUSINESS", "BUSINESS", "CYCLIST", "DHILL"},
  584. {"DOWNTOWN", "EASTSA", "EASTSA", "EPSILON", "EPSILON", "GAY", "GAY", "GENSTREET", "GENSTREET", "GOLFER"},
  585. {"HASJEW", "HIKER", "HIPPY", "HIPSTER", "HIPSTER", "HIPSTER", "INDIAN", "JETSKI", "JUGGALO", "KTOWN"},
  586. {"KTOWN", "LATINO", "METHHEAD", "MEXTHUG", "MOTOX", "MOTOX", "MUSCLBEAC", "MUSCLBEAC", "POLYNESIAN", "ROADCYC"},
  587. {"RUNNER", "RUNNER", "SALTON", "SKATER", "SKATER", "SOUCENT", "SOUCENT", "SOUCENT", "SOUCENT", "STBLA"},
  588. {"STBLA", "STLAT", "STWHI", "STWHI", "SUNBATHE", "SURFER", "VINDOUCHE", "VINEWOOD", "VINEWOOD", "VINEWOOD"},
  589. {"VINEWOOD", "YOGA", "PROLDRIVER", "RSRANGER", "SBIKE", "STAGGRM", "TATTOO", "ABIGAIL", "ANITA", "ANTON"},
  590. {"BALLASOG", "BRIDE", "BURGERDRUG", "CAR3GUY1", "CAR3GUY2", "CHEF", "CHIN_GOON", "CLETUS", "COP", "CUSTOMER"},
  591. {"DENISE_FRIEND", "FOS_REP", "G", "GROOM", "DLR", "HAO", "HUGH", "IMRAN", "JANITOR", "MAUDE"},
  592. {"MWEATHER", "ORTEGA", "OSCAR", "PORNDUDES", "PORNDUDES_P", "PROLOGUEDRIVER", "PROLSEC", "GANG", "HIC", "HIPSTER"},
  593. {"MARINE", "MEX", "REPORTER", "ROCCOPELOSI", "SCREEN_WRITER", "STRIPPER", "STRIPPER", "TONYA", "TRAFFICWARDEN", "AMANDATOWNLEY"},
  594. {"ANDREAS", "ASHLEY", "BANKMAN", "BARRY", "BARRY_P", "BEVERLY", "BEVERLY_P", "BRAD", "BRADCADAVER", "CARBUYER"},
  595. {"CASEY", "CHENGSR", "CHRISFORMAGE", "CLAY", "DALE", "DAVENORTON", "DEBRA", "DENISE", "DEVIN", "DOM"},
  596. {"DREYFUSS", "DRFRIEDLANDER", "FABIEN", "FBISUIT", "FLOYD", "GUADALOPE", "GURK", "HUNTER", "JANET", "JEWELASS"},
  597. {"JIMMYBOSTON", "JIMMYDISANTO", "JOEMINUTEMAN", "JOHNNYKLEBITZ", "JOSEF", "JOSH", "LAMARDAVIS", "LAZLOW", "LESTERCREST", "LIFEINVAD"},
  598. {"MAGENTA", "MANUEL", "MARNIE", "MARTINMADRAZO", "MARYANN", "MICHELLE", "MILTON", "MOLLY", "MOVPREMF", "MOVPREMMALE"},
  599. {"MRK", "MRSPHILLIPS", "MRS_THORNHILL", "NATALIA", "NERVOUSRON", "NIGEL", "OLD_MAN1A", "OLD_MAN2", "OMEGA", "ORLEANS"},
  600. {"PAPER", "PAPER_P", "PATRICIA", "PRIEST", "PROLSEC", "RUSSIANDRUNK", "SIEMONYETARIAN", "SOLOMON", "STEVEHAINS", "STRETCH"},
  601. {"TANISHA", "TAOCHENG", "TAOSTRANSLATOR", "TENNISCOACH", "TERRY", "TOM", "TOMEPSILON", "TRACYDISANTO", "WADE", "ZIMBOR"},
  602. {"BALLAS", "FAMILIES", "LOST", "VAGOS", "ARMBOSS", "ARMGOON", "ARMLIEUT", "CHEMWORK", "CHEMWORK_P", "CHIBOSS"},
  603. {"CHIBOSS_P", "CHICOLD", "CHICOLD_P", "CHIGOON", "CHIGOON_P", "CHIGOON", "KORBOSS", "MEXBOSS", "MEXBOSS", "ARMGOON"},
  604. {"AZTECA", "BALLAEAST", "BALLAORIG", "BALLASOUT", "FAMCA", "FAMDNF", "FAMFOR", "KOREAN", "KOREAN", "KORLIEUT"},
  605. {"LOST", "LOST", "LOST", "MEXGANG", "MEXGOON", "MEXGOON", "MEXGOON", "MEXGOON_P", "POLOGOON", "POLOGOON_P"},
  606. {"POLOGOON", "POLOGOON_P", "SALVABOSS", "SALVAGOON", "SALVAGOON", "SALVAGOON", "SALVAGOON_P", "STRPUNK", "STRPUNK", "HC_DRIVER"},
  607. {"HC_GUNMAN", "HC_HACKER", "ABIGAIL", "AMANDATOWNLEY", "ANDREAS", "ASHLEY", "BALLASOG", "BANKMAN", "BARRY", "BARRY_P"},
  608. {"BESTMEN", "BEVERLY", "BEVERLY_P", "BRAD", "BRIDE", "CAR3GUY1", "CAR3GUY2", "CASEY", "CHEF", "CHENGSR"},
  609. {"CHRISFORMAGE", "CLAY", "CLAYPAIN", "CLETUS", "DALE", "DAVENORTON", "DENISE", "DEVIN", "DOM", "DREYFUSS"},
  610. {"DRFRIEDLANDER", "FABIEN", "FBISUIT", "FLOYD", "GROOM", "HAO", "HUNTER", "JANET", "JAY_NORRIS", "JEWELASS"},
  611. {"JIMMYBOSTON", "JIMMYDISANTO", "JOEMINUTEMAN", "JOHNNYKLEBITZ", "JOSEF", "JOSH", "KERRYMCINTOSH", "LAMARDAVIS", "LAZLOW", "LESTERCREST"},
  612. {"LIFEINVAD", "LIFEINVAD", "MAGENTA", "MANUEL", "MARNIE", "MARYANN", "MAUDE", "MICHELLE", "MILTON", "MOLLY"},
  613. {"MRK", "MRSPHILLIPS", "MRS_THORNHILL", "NATALIA", "NERVOUSRON", "NIGEL", "OLD_MAN1A", "OLD_MAN2", "OMEGA", "ONEIL"},
  614. {"ORLEANS", "ORTEGA", "PAPER", "PATRICIA", "PRIEST", "PROLSEC", "GANG", "HIC", "HIPSTER", "MEX"},
  615. {"ROCCOPELOSI", "RUSSIANDRUNK", "SCREEN_WRITER", "SIEMONYETARIAN", "SOLOMON", "STEVEHAINS", "STRETCH", "TALINA", "TANISHA", "TAOCHENG"},
  616. {"TAOSTRANSLATOR", "TAOSTRANSLATOR_P", "TENNISCOACH", "TERRY", "TOMEPSILON", "TONYA", "TRACYDISANTO", "TRAFFICWARDEN", "TYLERDIX", "WADE"},
  617. {"ZIMBOR", "DEADHOOKER", "FREEMODE", "MISTY", "STRIPPERLITE", "PROS", "MP_HEADTARGETS", "CLAUDE", "EXARMY", "FAMDD"},
  618. {"FIBSEC", "FREEMODE", "MARSTON", "NIKO", "SHOPKEEP", "ARMOURED", "NONE", "NONE", "NONE", "NONE"},
  619. {"NONE", "FEMBARBER", "MAID", "SHOP_HIGH", "SWEATSHOP", "AIRHOSTESS", "BARTENDER", "BAYWATCH", "COP", "FACTORY"},
  620. {"HOOKER", "HOOKER", "HOOKER", "MIGRANT", "MOVPREM", "RANGER", "SCRUBS", "SHERIFF", "SHOP_LOW", "SHOP_MID"},
  621. {"STRIPPERLITE", "STRIPPER", "STRIPPER", "SWEATSHOP", "AMMUCOUNTRY", "ARMOURED", "ARMOURED", "AUTOSHOP", "AUTOSHOP", "BOUNCER"},
  622. {"CHEMSEC", "CIASEC", "CNTRYBAR", "DOCKWORK", "DOCTOR", "FIBOFFICE", "FIBOFFICE", "GAFFER", "GARDENER", "GENTRANSPORT"},
  623. {"HAIRDRESS", "HIGHSEC", "HIGHSEC", "JANITOR", "LATHANDY", "LIFEINVAD", "LINECOOK", "LSMETRO", "MARIACHI", "MARINE"},
  624. {"MARINE", "MIGRANT", "ZOMBIE", "MOVPREM", "MOVSPACE", "PARAMEDIC", "PILOT", "PILOT", "POSTAL", "POSTAL"},
  625. {"PRISGUARD", "SCIENTIST", "SECURITY", "SNOWCOP", "STRPERF", "STRPREACH", "STRVEND", "TRUCKER", "UPS", "UPS"},
  626. {"BUSKER", "AIRWORKER", "AMMUCITY", "ARMYMECH", "AUTOPSY", "BARMAN", "BAYWATCH", "BLACKOPS", "BLACKOPS", "BUSBOY"},
  627. {"CHEF", "CLOWN", "CONSTRUCT", "CONSTRUCT", "COP", "DEALER", "DEVINSEC", "DOCKWORK", "DOORMAN", "DWSERVICE"},
  628. {"DWSERVICE", "FACTORY", "FIREMAN", "GARBAGE", "GRIP", "HWAYCOP", "MARINE", "MARINE", "MARINE", "MIME"},
  629. {"PESTCONT", "PILOT", "PRISMUSCL", "PRISONER", "RANGER", "ROBBER", "SHERIFF", "SHOP_MASK", "STRVEND", "SWAT"},
  630. {"USCG", "VALET", "WAITER", "WINCLEAN", "XMECH", "XMECH", "CORPSE", "MIRANDA", "PROMOURN", "MOVIESTAR"},
  631. {"PROLHOST", "BIKERCHIC", "COMJANE", "CORPSE", "CORPSE", "HOTPOSH", "JEWELASS", "MISTRESS", "POPPYMICH", "PRINCESS"},
  632. {"SPYACTRESS", "ALDINAPOLI", "BANKMAN", "BIKEHIRE", "FIBARCHITECT", "FILMDIRECTOR", "GLENSTANK", "GRIFF", "JESUS", "JEWELSEC"},
  633. {"JEWELTHIEF", "MARKFOST", "PARTYTARGET", "PROLSEC", "PROMOURN", "RIVALPAP", "SPYACTOR", "WILLYFIST", "FINGURU", "TAPHILLBILLY"},
  634. {"TRAMP", "ABNER", "ANTONB", "BABYD", "BAYGOR", "BURGERDRUG", "CHIP", "CYCLIST", "FIBMUGGER", "GUIDO"},
  635. {"GUNVEND", "HIPPIE", "IMPORAGE", "JUSTIN", "MANI", "MILITARYBUM", "PAPARAZZI", "PARTY", "POGO", "PRISONER"}
  636. };
  637.  
  638. int skinchangerActiveLineIndex = 0;
  639. int skinchangerActiveItemIndex = 0;
  640.  
  641. bool process_skinchanger_menu()
  642. {
  643. DWORD waitTime = 150;
  644. const int lineCount = 69;
  645. const int itemCount = 10;
  646. const int itemCountLastLine = itemCount;
  647. while (true)
  648. {
  649. // timed menu draw, used for pause after active line switch
  650. DWORD maxTickCount = GetTickCount() + waitTime;
  651. do
  652. {
  653. // draw menu
  654. char caption[32];
  655. sprintf_s(caption, "Pagina %d / %d", skinchangerActiveLineIndex + 1, lineCount);
  656. draw_menu_line(caption, 350.0, 15.0, 18.0, 0.0, 5.0, false, true);
  657. for (int i = 0; i < itemCount; i++)
  658. if (strlen(pedModels[skinchangerActiveLineIndex][i]))
  659. draw_menu_line(pedModelNames[skinchangerActiveLineIndex][i], 100.0f, 5.0f, 56.0f, 0.0f + i * 110.0f, 5.0f, i == skinchangerActiveItemIndex, false, false);
  660.  
  661. update_features();
  662. WAIT(0);
  663. } while (GetTickCount() < maxTickCount);
  664. waitTime = 0;
  665.  
  666. bool bSelect, bBack, bUp, bDown, bLeft, bRight;
  667. get_button_state(&bSelect, &bBack, &bUp, &bDown, &bLeft, &bRight);
  668.  
  669. if (bSelect)
  670. {
  671. menu_beep();
  672. DWORD model = GAMEPLAY::GET_HASH_KEY((char *)pedModels[skinchangerActiveLineIndex][skinchangerActiveItemIndex]);
  673. if (STREAMING::IS_MODEL_IN_CDIMAGE(model) && STREAMING::IS_MODEL_VALID(model))
  674. {
  675. char statusText[32];
  676. sprintf_s(statusText, "Ahora eres ~y~%s", pedModelNames[skinchangerActiveLineIndex][skinchangerActiveItemIndex]);
  677. set_status_text(statusText);
  678. STREAMING::REQUEST_MODEL(model);
  679. while (!STREAMING::HAS_MODEL_LOADED(model)) WAIT(0);
  680. //STREAMING::LOAD_ALL_OBJECTS_NOW();
  681. PLAYER::SET_PLAYER_MODEL(PLAYER::PLAYER_ID(), model);
  682. //PED::SET_PED_RANDOM_COMPONENT_VARIATION(PLAYER::PLAYER_PED_ID(), FALSE);
  683. PED::SET_PED_DEFAULT_COMPONENT_VARIATION(PLAYER::PLAYER_PED_ID());
  684. WAIT(0);
  685. for (int i = 0; i < 12; i++)
  686. for (int j = 0; j < 100; j++)
  687. {
  688. int drawable = rand() % 10;
  689. int texture = rand() % 10;
  690. if (PED::IS_PED_COMPONENT_VARIATION_VALID(PLAYER::PLAYER_PED_ID(), i, drawable, texture))
  691. {
  692. PED::SET_PED_COMPONENT_VARIATION(PLAYER::PLAYER_PED_ID(), i, drawable, texture, 0);
  693. break;
  694. }
  695. }
  696. skinchanger_used = true;
  697. WAIT(100);
  698. STREAMING::SET_MODEL_AS_NO_LONGER_NEEDED(model);
  699. waitTime = 200;
  700. }
  701. } else
  702. if (bBack)
  703. {
  704. menu_beep();
  705. break;
  706. } else
  707. if (bRight)
  708. {
  709. menu_beep();
  710. skinchangerActiveItemIndex++;
  711. int itemsMax = (skinchangerActiveLineIndex == (lineCount - 1)) ? itemCountLastLine : itemCount;
  712. if (skinchangerActiveItemIndex == itemsMax)
  713. skinchangerActiveItemIndex = 0;
  714. waitTime = 100;
  715. } else
  716. if (bLeft)
  717. {
  718. menu_beep();
  719. if (skinchangerActiveItemIndex == 0)
  720. skinchangerActiveItemIndex = (skinchangerActiveLineIndex == (lineCount - 1)) ? itemCountLastLine : itemCount;
  721. skinchangerActiveItemIndex--;
  722. waitTime = 100;
  723. } else
  724. if (bUp)
  725. {
  726. menu_beep();
  727. if (skinchangerActiveLineIndex == 0)
  728. skinchangerActiveLineIndex = lineCount;
  729. skinchangerActiveLineIndex--;
  730. waitTime = 200;
  731. } else
  732. if (bDown)
  733. {
  734. menu_beep();
  735. skinchangerActiveLineIndex++;
  736. if (skinchangerActiveLineIndex == lineCount)
  737. skinchangerActiveLineIndex = 0;
  738. waitTime = 200;
  739. }
  740. if (skinchangerActiveLineIndex == (lineCount - 1))
  741. if (skinchangerActiveItemIndex >= itemCountLastLine)
  742. skinchangerActiveItemIndex = 0;
  743. }
  744. return false;
  745. }
  746.  
  747. int teleportActiveLineIndex = 0;
  748.  
  749. bool process_teleport_menu()
  750. {
  751. const float lineWidth = 250.0;
  752. const int lineCount = 17;
  753.  
  754. std::string caption = "Lugares";
  755.  
  756. static struct {
  757. LPCSTR text;
  758. float x;
  759. float y;
  760. float z;
  761. } lines[lineCount] = {
  762. { "SENALADO EN EL MAPA" },
  763. { "CASA DE MICHAEL", -852.4f, 160.0f, 65.6f },
  764. { "CASA DE FRANKLIN", 7.9f, 548.1f, 175.5f },
  765. { "CARAVANA DE TREVOR", 1985.7f, 3812.2f, 32.2f },
  766. { "ENTRADA DEL AEREOPUERTO", -1034.6f, -2733.6f, 13.8f },
  767. { "AEREOPUERTO", -1336.0f, -3044.0f, 13.9f },
  768. { "ELYSIAN ISLAND", 338.2f, -2715.9f, 38.5f },
  769. { "PUERTO", 760.4f, -2943.2f, 5.8f },
  770. { "CLUB DE STRIP", 127.4f, -1307.7f, 29.2f },
  771. { "ELBURRO HEIGHTS", 1384.0f, -2057.1f, 52.0f },
  772. { "FERIA", -1670.7f, -1125.0f, 13.0f },
  773. { "CHUMASH", -3192.6f, 1100.0f, 20.2f },
  774. { "GRANJA EOLICA", 2354.0f, 1830.3f, 101.1f },
  775. { "BASE MILITAR", -2047.4f, 3132.1f, 32.8f },
  776. { "MCKENZIE AIRFIELD", 2121.7f, 4796.3f, 41.1f },
  777. { "DESIERTO", 1747.0f, 3273.7f, 41.1f },
  778. { "CHILLIAD (MONTANA MAS ALTA)", 425.4f, 5614.3f, 766.5f }
  779. };
  780.  
  781. DWORD waitTime = 150;
  782. while (true)
  783. {
  784. // timed menu draw, used for pause after active line switch
  785. DWORD maxTickCount = GetTickCount() + waitTime;
  786. do
  787. {
  788. // draw menu
  789. draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
  790. for (int i = 0; i < lineCount; i++)
  791. if (i != teleportActiveLineIndex)
  792. draw_menu_line(lines[i].text, lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
  793. draw_menu_line(lines[teleportActiveLineIndex].text, lineWidth + 1.0, 11.0, 56.0 + teleportActiveLineIndex * 36.0, 0.0, 7.0, true, false);
  794.  
  795. update_features();
  796. WAIT(0);
  797. } while (GetTickCount() < maxTickCount);
  798. waitTime = 0;
  799.  
  800. // process buttons
  801. bool bSelect, bBack, bUp, bDown;
  802. get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
  803. if (bSelect)
  804. {
  805. menu_beep();
  806.  
  807. // get entity to teleport
  808. Entity e = PLAYER::PLAYER_PED_ID();
  809. if (PED::IS_PED_IN_ANY_VEHICLE(e, 0))
  810. e = PED::GET_VEHICLE_PED_IS_USING(e);
  811.  
  812. // get coords
  813. Vector3 coords;
  814. bool success = false;
  815. if (teleportActiveLineIndex == 0) // marker
  816. {
  817. bool blipFound = false;
  818. // search for marker blip
  819. int blipIterator = UI::_GET_BLIP_INFO_ID_ITERATOR();
  820. for (Blip i = UI::GET_FIRST_BLIP_INFO_ID(blipIterator); UI::DOES_BLIP_EXIST(i) != 0; i = UI::GET_NEXT_BLIP_INFO_ID(blipIterator))
  821. {
  822. if (UI::GET_BLIP_INFO_ID_TYPE(i) == 4)
  823. {
  824. coords = UI::GET_BLIP_INFO_ID_COORD(i);
  825. blipFound = true;
  826. break;
  827. }
  828. }
  829. if (blipFound)
  830. {
  831. // load needed map region and check height levels for ground existence
  832. bool groundFound = false;
  833. static float groundCheckHeight[] = {
  834. 100.0, 150.0, 50.0, 0.0, 200.0, 250.0, 300.0, 350.0, 400.0,
  835. 450.0, 500.0, 550.0, 600.0, 650.0, 700.0, 750.0, 800.0
  836. };
  837. for (int i = 0; i < sizeof(groundCheckHeight) / sizeof(float); i++)
  838. {
  839. ENTITY::SET_ENTITY_COORDS_NO_OFFSET(e, coords.x, coords.y, groundCheckHeight[i], 0, 0, 1);
  840. WAIT(100);
  841. if (GAMEPLAY::GET_GROUND_Z_FOR_3D_COORD(coords.x, coords.y, groundCheckHeight[i], &coords.z))
  842. {
  843. groundFound = true;
  844. coords.z += 3.0;
  845. break;
  846. }
  847. }
  848. // if ground not found then set Z in air and give player a parachute
  849. if (!groundFound)
  850. {
  851. coords.z = 1000.0;
  852. WEAPON::GIVE_DELAYED_WEAPON_TO_PED(PLAYER::PLAYER_PED_ID(), 0xFBAB5776, 1, 0);
  853. }
  854. success = true;
  855. } else
  856. {
  857. set_status_text("~r~No has puesto ningún punto en el mapa.");
  858. }
  859.  
  860. } else // predefined coords
  861. {
  862. coords.x = lines[teleportActiveLineIndex].x;
  863. coords.y = lines[teleportActiveLineIndex].y;
  864. coords.z = lines[teleportActiveLineIndex].z;
  865. success = true;
  866. }
  867.  
  868. // set player pos
  869. if (success)
  870. {
  871. ENTITY::SET_ENTITY_COORDS_NO_OFFSET(e, coords.x, coords.y, coords.z, 0, 0, 1);
  872. WAIT(0);
  873. set_status_text("~g~Teletransportado.");
  874. return true;
  875. }
  876.  
  877. waitTime = 200;
  878. } else
  879. if (bBack || trainer_switch_pressed())
  880. {
  881. menu_beep();
  882. break;
  883. } else
  884. if (bUp)
  885. {
  886. menu_beep();
  887. if (teleportActiveLineIndex == 0)
  888. teleportActiveLineIndex = lineCount;
  889. teleportActiveLineIndex--;
  890. waitTime = 150;
  891. } else
  892. if (bDown)
  893. {
  894. menu_beep();
  895. teleportActiveLineIndex++;
  896. if (teleportActiveLineIndex == lineCount)
  897. teleportActiveLineIndex = 0;
  898. waitTime = 150;
  899. }
  900. }
  901. return false;
  902. }
  903.  
  904. std::string line_as_str(std::string text, bool *pState)
  905. {
  906. while (text.size() < 18) text += " ";
  907. return text + (pState ? (*pState ? " [ON]" : " [OFF]") : "");
  908. }
  909.  
  910. int activeLineIndexPlayer = 0;
  911.  
  912. void process_player_menu()
  913. {
  914. const float lineWidth = 250.0;
  915. const int lineCount = 15;
  916.  
  917. std::string caption = "Jugador";
  918.  
  919. static struct {
  920. LPCSTR text;
  921. bool *pState;
  922. bool *pUpdated;
  923. } lines[lineCount] = {
  924. {"CAMBIAR SKIN", NULL, NULL},
  925. {"LUGARES", NULL, NULL},
  926. {"FIX PLAYER", NULL, NULL},
  927. {"RESETEAR SKIN", NULL, NULL},
  928. {"ANADIR DINERO", NULL, NULL},
  929. {"ANADIR UN NIVEL DE BUSQUEDA", NULL, NULL},
  930. {"QUITAR UN NIVEL DE BUSQUEDA", NULL, NULL},
  931. {"SIN NIVEL DE BUSQUEDA", &featurePlayerNeverWanted, NULL},
  932. {"INVENCIBLE", &featurePlayerInvincible, &featurePlayerInvincibleUpdated},
  933. {"LA POLICIA IGNORA", &featurePlayerIgnored, &featurePlayerIgnoredUpdated},
  934. {"HABI.ESPECIAL UNLIMITADA", &featurePlayerUnlimitedAbility, NULL},
  935. {"SILENCIOSO", &featurePlayerNoNoise, &featurePlayerNoNoiseUpdated},
  936. {"NADAR RAPIDO", &featurePlayerFastSwim, &featurePlayerFastSwimUpdated},
  937. {"CORRER RAPIDO", &featurePlayerFastRun, &featurePlayerFastRunUpdated},
  938. {"SUPER SALTO", &featurePlayerSuperJump, NULL}
  939. };
  940.  
  941. DWORD waitTime = 150;
  942. while (true)
  943. {
  944. // timed menu draw, used for pause after active line switch
  945. DWORD maxTickCount = GetTickCount() + waitTime;
  946. do
  947. {
  948. // draw menu
  949. draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
  950. for (int i = 0; i < lineCount; i++)
  951. if (i != activeLineIndexPlayer)
  952. draw_menu_line(line_as_str(lines[i].text, lines[i].pState),
  953. lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
  954. draw_menu_line(line_as_str(lines[activeLineIndexPlayer].text, lines[activeLineIndexPlayer].pState),
  955. lineWidth + 1.0, 11.0, 56.0 + activeLineIndexPlayer * 36.0, 0.0, 7.0, true, false);
  956.  
  957. update_features();
  958. WAIT(0);
  959. } while (GetTickCount() < maxTickCount);
  960. waitTime = 0;
  961.  
  962. // process buttons
  963. bool bSelect, bBack, bUp, bDown;
  964. get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
  965. if (bSelect)
  966. {
  967. menu_beep();
  968.  
  969. // common variables
  970. BOOL bPlayerExists = ENTITY::DOES_ENTITY_EXIST(PLAYER::PLAYER_PED_ID());
  971. Player player = PLAYER::PLAYER_ID();
  972. Ped playerPed = PLAYER::PLAYER_PED_ID();
  973.  
  974. switch (activeLineIndexPlayer)
  975. {
  976. // skin changer
  977. case 0:
  978. if (process_skinchanger_menu()) return;
  979. break;
  980. // teleport
  981. case 1:
  982. if (process_teleport_menu()) return;
  983. break;
  984. // fix player
  985. case 2:
  986. {
  987. ENTITY::SET_ENTITY_HEALTH(playerPed, ENTITY::GET_ENTITY_MAX_HEALTH(playerPed));
  988. PED::ADD_ARMOUR_TO_PED(playerPed, PLAYER::GET_PLAYER_MAX_ARMOUR(player) - PED::GET_PED_ARMOUR(playerPed));
  989. if (PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
  990. {
  991. Vehicle playerVeh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
  992. if (ENTITY::DOES_ENTITY_EXIST(playerVeh) && !ENTITY::IS_ENTITY_DEAD(playerVeh))
  993. VEHICLE::SET_VEHICLE_FIXED(playerVeh);
  994. }
  995. set_status_text("~g~Player fixed");
  996. }
  997. break;
  998. // reset model skin
  999. case 3:
  1000. {
  1001. PED::SET_PED_DEFAULT_COMPONENT_VARIATION(playerPed);
  1002. set_status_text("~g~Skin reseteado");
  1003. }
  1004. break;
  1005. // add cash
  1006. case 4:
  1007. for (int i = 0; i < 3; i++)
  1008. {
  1009. char statNameFull[32];
  1010. sprintf_s(statNameFull, "SP%d_TOTAL_CASH", i);
  1011. Hash hash = GAMEPLAY::GET_HASH_KEY(statNameFull);
  1012. int val;
  1013. STATS::STAT_GET_INT(hash, &val, -1);
  1014. val += 1000000;
  1015. STATS::STAT_SET_INT(hash, val, 1);
  1016. }
  1017. set_status_text("~g~Se ha anadido ~g~$1.000.000");
  1018. break;
  1019. // wanted up
  1020. case 5:
  1021. if (bPlayerExists && PLAYER::GET_PLAYER_WANTED_LEVEL(player) < 5)
  1022. {
  1023. PLAYER::SET_PLAYER_WANTED_LEVEL(player, PLAYER::GET_PLAYER_WANTED_LEVEL(player) + 1, 0);
  1024. PLAYER::SET_PLAYER_WANTED_LEVEL_NOW(player, 0);
  1025. set_status_text("~g~Nivel de busqueda aumentado");
  1026. }
  1027. break;
  1028. // wanted down
  1029. case 6:
  1030. if (bPlayerExists && PLAYER::GET_PLAYER_WANTED_LEVEL(player) > 0)
  1031. {
  1032. PLAYER::SET_PLAYER_WANTED_LEVEL(player, PLAYER::GET_PLAYER_WANTED_LEVEL(player) - 1, 0);
  1033. PLAYER::SET_PLAYER_WANTED_LEVEL_NOW(player, 0);
  1034. set_status_text("~g~Nivel de busqueda disminuido");
  1035. }
  1036. break;
  1037. // switchable features
  1038. default:
  1039. if (lines[activeLineIndexPlayer].pState)
  1040. *lines[activeLineIndexPlayer].pState = !(*lines[activeLineIndexPlayer].pState);
  1041. if (lines[activeLineIndexPlayer].pUpdated)
  1042. *lines[activeLineIndexPlayer].pUpdated = true;
  1043. }
  1044. waitTime = 200;
  1045. } else
  1046. if (bBack || trainer_switch_pressed())
  1047. {
  1048. menu_beep();
  1049. break;
  1050. } else
  1051. if (bUp)
  1052. {
  1053. menu_beep();
  1054. if (activeLineIndexPlayer == 0)
  1055. activeLineIndexPlayer = lineCount;
  1056. activeLineIndexPlayer--;
  1057. waitTime = 150;
  1058. } else
  1059. if (bDown)
  1060. {
  1061. menu_beep();
  1062. activeLineIndexPlayer++;
  1063. if (activeLineIndexPlayer == lineCount)
  1064. activeLineIndexPlayer = 0;
  1065. waitTime = 150;
  1066. }
  1067. }
  1068. }
  1069.  
  1070. int activeLineIndexWeapon = 0;
  1071.  
  1072. void process_weapon_menu()
  1073. {
  1074. const float lineWidth = 250.0;
  1075. const int lineCount = 6;
  1076.  
  1077. std::string caption = "Armas";
  1078.  
  1079. static struct {
  1080. LPCSTR text;
  1081. bool *pState;
  1082. bool *pUpdated;
  1083. } lines[lineCount] = {
  1084. {"TODAS LAS ARMAS", NULL, NULL},
  1085. {"NO RECARGAR", &featureWeaponNoReload, NULL},
  1086. {"BALAS CON FUEGO", &featureWeaponFireAmmo, NULL},
  1087. {"BALAS EXPLOSIVAS",&featureWeaponExplosiveAmmo, NULL},
  1088. {"PUNETAZO EXPLOSIVO", &featureWeaponExplosiveMelee, NULL},
  1089. {"ARMAS EN VEHICULOS", &featureWeaponVehRockets, NULL}
  1090. };
  1091.  
  1092. static LPCSTR weaponNames[] = {
  1093. "WEAPON_KNIFE", "WEAPON_NIGHTSTICK", "WEAPON_HAMMER", "WEAPON_BAT", "WEAPON_GOLFCLUB", "WEAPON_CROWBAR",
  1094. "WEAPON_PISTOL", "WEAPON_COMBATPISTOL", "WEAPON_APPISTOL", "WEAPON_PISTOL50", "WEAPON_MICROSMG", "WEAPON_SMG",
  1095. "WEAPON_ASSAULTSMG", "WEAPON_ASSAULTRIFLE", "WEAPON_CARBINERIFLE", "WEAPON_ADVANCEDRIFLE", "WEAPON_MG",
  1096. "WEAPON_COMBATMG", "WEAPON_PUMPSHOTGUN", "WEAPON_SAWNOFFSHOTGUN", "WEAPON_ASSAULTSHOTGUN", "WEAPON_BULLPUPSHOTGUN",
  1097. "WEAPON_STUNGUN", "WEAPON_SNIPERRIFLE", "WEAPON_HEAVYSNIPER", "WEAPON_GRENADELAUNCHER", "WEAPON_GRENADELAUNCHER_SMOKE",
  1098. "WEAPON_RPG", "WEAPON_MINIGUN", "WEAPON_GRENADE", "WEAPON_STICKYBOMB", "WEAPON_SMOKEGRENADE", "WEAPON_BZGAS",
  1099. "WEAPON_MOLOTOV", "WEAPON_FIREEXTINGUISHER", "WEAPON_PETROLCAN",
  1100. "WEAPON_SNSPISTOL", "WEAPON_SPECIALCARBINE", "WEAPON_HEAVYPISTOL", "WEAPON_BULLPUPRIFLE", "WEAPON_HOMINGLAUNCHER",
  1101. "WEAPON_PROXMINE", "WEAPON_SNOWBALL", "WEAPON_VINTAGEPISTOL", "WEAPON_DAGGER", "WEAPON_FIREWORK", "WEAPON_MUSKET",
  1102. "WEAPON_MARKSMANRIFLE", "WEAPON_HEAVYSHOTGUN", "WEAPON_GUSENBERG", "WEAPON_HATCHET", "WEAPON_RAILGUN"
  1103. };
  1104.  
  1105. DWORD waitTime = 150;
  1106. while (true)
  1107. {
  1108. // timed menu draw, used for pause after active line switch
  1109. DWORD maxTickCount = GetTickCount() + waitTime;
  1110. do
  1111. {
  1112. // draw menu
  1113. draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
  1114. for (int i = 0; i < lineCount; i++)
  1115. if (i != activeLineIndexWeapon)
  1116. draw_menu_line(line_as_str(lines[i].text, lines[i].pState),
  1117. lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
  1118. draw_menu_line(line_as_str(lines[activeLineIndexWeapon].text, lines[activeLineIndexWeapon].pState),
  1119. lineWidth + 1.0, 11.0, 56.0 + activeLineIndexWeapon * 36.0, 0.0, 7.0, true, false);
  1120.  
  1121. update_features();
  1122. WAIT(0);
  1123. } while (GetTickCount() < maxTickCount);
  1124. waitTime = 0;
  1125.  
  1126. // process buttons
  1127. bool bSelect, bBack, bUp, bDown;
  1128. get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
  1129. if (bSelect)
  1130. {
  1131. menu_beep();
  1132.  
  1133. // common variables
  1134. BOOL bPlayerExists = ENTITY::DOES_ENTITY_EXIST(PLAYER::PLAYER_PED_ID());
  1135. Player player = PLAYER::PLAYER_ID();
  1136. Ped playerPed = PLAYER::PLAYER_PED_ID();
  1137.  
  1138. switch (activeLineIndexWeapon)
  1139. {
  1140. case 0:
  1141. for (int i = 0; i < sizeof(weaponNames) / sizeof(weaponNames[0]); i++)
  1142. WEAPON::GIVE_DELAYED_WEAPON_TO_PED(playerPed, GAMEPLAY::GET_HASH_KEY((char *)weaponNames[i]), 1000, 0);
  1143. set_status_text("~g~Ahora tienes todas las armas");
  1144. break;
  1145. // switchable features
  1146. default:
  1147. if (lines[activeLineIndexWeapon].pState)
  1148. *lines[activeLineIndexWeapon].pState = !(*lines[activeLineIndexWeapon].pState);
  1149. if (lines[activeLineIndexWeapon].pUpdated)
  1150. *lines[activeLineIndexWeapon].pUpdated = true;
  1151. }
  1152. waitTime = 200;
  1153. } else
  1154. if (bBack || trainer_switch_pressed())
  1155. {
  1156. menu_beep();
  1157. break;
  1158. } else
  1159. if (bUp)
  1160. {
  1161. menu_beep();
  1162. if (activeLineIndexWeapon == 0)
  1163. activeLineIndexWeapon = lineCount;
  1164. activeLineIndexWeapon--;
  1165. waitTime = 150;
  1166. } else
  1167. if (bDown)
  1168. {
  1169. menu_beep();
  1170. activeLineIndexWeapon++;
  1171. if (activeLineIndexWeapon == lineCount)
  1172. activeLineIndexWeapon = 0;
  1173. waitTime = 150;
  1174. }
  1175. }
  1176. }
  1177.  
  1178. LPCSTR vehicleModels[35][10] = {
  1179. {"NINEF", "NINEF2", "BLISTA", "ASEA", "ASEA2", "BOATTRAILER", "BUS", "ARMYTANKER", "ARMYTRAILER", "ARMYTRAILER2"},
  1180. {"SUNTRAP", "COACH", "AIRBUS", "ASTEROPE", "AIRTUG", "AMBULANCE", "BARRACKS", "BARRACKS2", "BALLER", "BALLER2"},
  1181. {"BJXL", "BANSHEE", "BENSON", "BFINJECTION", "BIFF", "BLAZER", "BLAZER2", "BLAZER3", "BISON", "BISON2"},
  1182. {"BISON3", "BOXVILLE", "BOXVILLE2", "BOXVILLE3", "BOBCATXL", "BODHI2", "BUCCANEER", "BUFFALO", "BUFFALO2", "BULLDOZER"},
  1183. {"BULLET", "BLIMP", "BURRITO", "BURRITO2", "BURRITO3", "BURRITO4", "BURRITO5", "CAVALCADE", "CAVALCADE2", "POLICET"},
  1184. {"GBURRITO", "CABLECAR", "CADDY", "CADDY2", "CAMPER", "CARBONIZZARE", "CHEETAH", "COMET2", "COGCABRIO", "COQUETTE"},
  1185. {"CUTTER", "GRESLEY", "DILETTANTE", "DILETTANTE2", "DUNE", "DUNE2", "HOTKNIFE", "DLOADER", "DUBSTA", "DUBSTA2"},
  1186. {"DUMP", "RUBBLE", "DOCKTUG", "DOMINATOR", "EMPEROR", "EMPEROR2", "EMPEROR3", "ENTITYXF", "EXEMPLAR", "ELEGY2"},
  1187. {"F620", "FBI", "FBI2", "FELON", "FELON2", "FELTZER2", "FIRETRUK", "FLATBED", "FORKLIFT", "FQ2"},
  1188. {"FUSILADE", "FUGITIVE", "FUTO", "GRANGER", "GAUNTLET", "HABANERO", "HAULER", "HANDLER", "INFERNUS", "INGOT"},
  1189. {"INTRUDER", "ISSI2", "JACKAL", "JOURNEY", "JB700", "KHAMELION", "LANDSTALKER", "LGUARD", "MANANA", "MESA"},
  1190. {"MESA2", "MESA3", "CRUSADER", "MINIVAN", "MIXER", "MIXER2", "MONROE", "MOWER", "MULE", "MULE2"},
  1191. {"ORACLE", "ORACLE2", "PACKER", "PATRIOT", "PBUS", "PENUMBRA", "PEYOTE", "PHANTOM", "PHOENIX", "PICADOR"},
  1192. {"POUNDER", "POLICE", "POLICE4", "POLICE2", "POLICE3", "POLICEOLD1", "POLICEOLD2", "PONY", "PONY2", "PRAIRIE"},
  1193. {"PRANGER", "PREMIER", "PRIMO", "PROPTRAILER", "RANCHERXL", "RANCHERXL2", "RAPIDGT", "RAPIDGT2", "RADI", "RATLOADER"},
  1194. {"REBEL", "REGINA", "REBEL2", "RENTALBUS", "RUINER", "RUMPO", "RUMPO2", "RHINO", "RIOT", "RIPLEY"},
  1195. {"ROCOTO", "ROMERO", "SABREGT", "SADLER", "SADLER2", "SANDKING", "SANDKING2", "SCHAFTER2", "SCHWARZER", "SCRAP"},
  1196. {"SEMINOLE", "SENTINEL", "SENTINEL2", "ZION", "ZION2", "SERRANO", "SHERIFF", "SHERIFF2", "SPEEDO", "SPEEDO2"},
  1197. {"STANIER", "STINGER", "STINGERGT", "STOCKADE", "STOCKADE3", "STRATUM", "SULTAN", "SUPERD", "SURANO", "SURFER"},
  1198. {"SURFER2", "SURGE", "TACO", "TAILGATER", "TAXI", "TRASH", "TRACTOR", "TRACTOR2", "TRACTOR3", "GRAINTRAILER"},
  1199. {"BALETRAILER", "TIPTRUCK", "TIPTRUCK2", "TORNADO", "TORNADO2", "TORNADO3", "TORNADO4", "TOURBUS", "TOWTRUCK", "TOWTRUCK2"},
  1200. {"UTILLITRUCK", "UTILLITRUCK2", "UTILLITRUCK3", "VOODOO2", "WASHINGTON", "STRETCH", "YOUGA", "ZTYPE", "SANCHEZ", "SANCHEZ2"},
  1201. {"SCORCHER", "TRIBIKE", "TRIBIKE2", "TRIBIKE3", "FIXTER", "CRUISER", "BMX", "POLICEB", "AKUMA", "CARBONRS"},
  1202. {"BAGGER", "BATI", "BATI2", "RUFFIAN", "DAEMON", "DOUBLE", "PCJ", "VADER", "VIGERO", "FAGGIO2"},
  1203. {"HEXER", "ANNIHILATOR", "BUZZARD", "BUZZARD2", "CARGOBOB", "CARGOBOB2", "CARGOBOB3", "SKYLIFT", "POLMAV", "MAVERICK"},
  1204. {"NEMESIS", "FROGGER", "FROGGER2", "CUBAN800", "DUSTER", "STUNT", "MAMMATUS", "JET", "SHAMAL", "LUXOR"},
  1205. {"TITAN", "LAZER", "CARGOPLANE", "SQUALO", "MARQUIS", "DINGHY", "DINGHY2", "JETMAX", "PREDATOR", "TROPIC"},
  1206. {"SEASHARK", "SEASHARK2", "SUBMERSIBLE", "TRAILERS", "TRAILERS2", "TRAILERS3", "TVTRAILER", "RAKETRAILER", "TANKER", "TRAILERLOGS"},
  1207. {"TR2", "TR3", "TR4", "TRFLAT", "TRAILERSMALL", "VELUM", "ADDER", "VOLTIC", "VACCA", "BIFTA"},
  1208. { "SPEEDER", "PARADISE", "KALAHARI", "JESTER", "TURISMOR", "VESTRA", "ALPHA", "HUNTLEY", "THRUST", "MASSACRO" },
  1209. { "MASSACRO2", "ZENTORNO", "BLADE", "GLENDALE", "PANTO", "PIGALLE", "WARRENER", "RHAPSODY", "DUBSTA3", "MONSTER" },
  1210. { "SOVEREIGN", "INNOVATION", "HAKUCHOU", "FUROREGT", "MILJET", "COQUETTE2", "BTYPE", "BUFFALO3", "DOMINATOR2", "GAUNTLET2" },
  1211. { "MARSHALL", "DUKES", "DUKES2", "STALION", "STALION2", "BLISTA2", "BLISTA3", "DODO", "SUBMERSIBLE2", "HYDRA" },
  1212. { "INSURGENT", "INSURGENT2", "TECHNICAL", "SAVAGE", "VALKYRIE", "KURUMA", "KURUMA2", "JESTER2", "CASCO", "VELUM2" },
  1213. { "GUARDIAN", "ENDURO", "LECTRO", "SLAMVAN", "SLAMVAN2", "RATLOADER2", "", "", "", "" }
  1214. };
  1215.  
  1216. int carspawnActiveLineIndex = 0;
  1217. int carspawnActiveItemIndex = 0;
  1218.  
  1219. bool process_carspawn_menu()
  1220. {
  1221. DWORD waitTime = 150;
  1222. const int lineCount = 35;
  1223. const int itemCount = 10;
  1224. const int itemCountLastLine = 6;
  1225. while (true)
  1226. {
  1227. // timed menu draw, used for pause after active line switch
  1228. DWORD maxTickCount = GetTickCount() + waitTime;
  1229. do
  1230. {
  1231. // draw menu
  1232. char caption[32];
  1233. sprintf_s(caption, "Pagina %d / %d", carspawnActiveLineIndex + 1, lineCount);
  1234. draw_menu_line(caption, 350.0, 15.0, 18.0, 0.0, 5.0, false, true);
  1235. for (int i = 0; i < itemCount; i++)
  1236. if (strlen(vehicleModels[carspawnActiveLineIndex][i]))
  1237. draw_menu_line(vehicleModels[carspawnActiveLineIndex][i], 100.0, 5.0, 56.0, 0.0 + i * 110.0, 5.0, i == carspawnActiveItemIndex, false, false);
  1238.  
  1239. update_features();
  1240. WAIT(0);
  1241. } while (GetTickCount() < maxTickCount);
  1242. waitTime = 0;
  1243.  
  1244. bool bSelect, bBack, bUp, bDown, bLeft, bRight;
  1245. get_button_state(&bSelect, &bBack, &bUp, &bDown, &bLeft, &bRight);
  1246.  
  1247. if (bSelect)
  1248. {
  1249. menu_beep();
  1250. LPCSTR modelName = vehicleModels[carspawnActiveLineIndex][carspawnActiveItemIndex];
  1251. DWORD model = GAMEPLAY::GET_HASH_KEY((char *)modelName);
  1252. if (STREAMING::IS_MODEL_IN_CDIMAGE(model) && STREAMING::IS_MODEL_A_VEHICLE(model))
  1253. {
  1254. STREAMING::REQUEST_MODEL(model);
  1255. while (!STREAMING::HAS_MODEL_LOADED(model)) WAIT(0);
  1256. Vector3 coords = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER::PLAYER_PED_ID(), 0.0, 5.0, 0.0);
  1257. Vehicle veh = VEHICLE::CREATE_VEHICLE(model, coords.x, coords.y, coords.z, 0.0, 1, 1);
  1258. VEHICLE::SET_VEHICLE_ON_GROUND_PROPERLY(veh);
  1259.  
  1260. if (featureVehWrapInSpawned)
  1261. {
  1262. ENTITY::SET_ENTITY_HEADING(veh, ENTITY::GET_ENTITY_HEADING(PLAYER::PLAYER_PED_ID()));
  1263. PED::SET_PED_INTO_VEHICLE(PLAYER::PLAYER_PED_ID(), veh, -1);
  1264. }
  1265.  
  1266. WAIT(0);
  1267. STREAMING::SET_MODEL_AS_NO_LONGER_NEEDED(model);
  1268. ENTITY::SET_VEHICLE_AS_NO_LONGER_NEEDED(&veh);
  1269.  
  1270. char statusText[32];
  1271. sprintf_s(statusText, "~g~%s creado", modelName);
  1272. set_status_text(statusText);
  1273.  
  1274. return true;
  1275. }
  1276. } else
  1277. if (bBack)
  1278. {
  1279. menu_beep();
  1280. break;
  1281. } else
  1282. if (bRight)
  1283. {
  1284. menu_beep();
  1285. carspawnActiveItemIndex++;
  1286. int itemsMax = (carspawnActiveLineIndex == (lineCount - 1)) ? itemCountLastLine : itemCount;
  1287. if (carspawnActiveItemIndex == itemsMax)
  1288. carspawnActiveItemIndex = 0;
  1289. waitTime = 100;
  1290. } else
  1291. if (bLeft)
  1292. {
  1293. menu_beep();
  1294. if (carspawnActiveItemIndex == 0)
  1295. carspawnActiveItemIndex = (carspawnActiveLineIndex == (lineCount - 1)) ? itemCountLastLine : itemCount;
  1296. carspawnActiveItemIndex--;
  1297. waitTime = 100;
  1298. } else
  1299. if (bUp)
  1300. {
  1301. menu_beep();
  1302. if (carspawnActiveLineIndex == 0)
  1303. carspawnActiveLineIndex = lineCount;
  1304. carspawnActiveLineIndex--;
  1305. waitTime = 200;
  1306. } else
  1307. if (bDown)
  1308. {
  1309. menu_beep();
  1310. carspawnActiveLineIndex++;
  1311. if (carspawnActiveLineIndex == lineCount)
  1312. carspawnActiveLineIndex = 0;
  1313. waitTime = 200;
  1314. }
  1315. if (carspawnActiveLineIndex == (lineCount - 1))
  1316. if (carspawnActiveItemIndex >= itemCountLastLine)
  1317. carspawnActiveItemIndex = 0;
  1318. }
  1319. return false;
  1320. }
  1321.  
  1322. int activeLineIndexVeh = 0;
  1323.  
  1324. void process_veh_menu()
  1325. {
  1326. const float lineWidth = 250.0;
  1327. const int lineCount = 6;
  1328.  
  1329. std::string caption = "Vehiculos";
  1330.  
  1331. static struct {
  1332. LPCSTR text;
  1333. bool *pState;
  1334. bool *pUpdated;
  1335. } lines[lineCount] = {
  1336. {"CREAR VEHICULO", NULL, NULL},
  1337. {"PINTAR AL AZAR", NULL, NULL},
  1338. {"REPARAR VEHICULO", NULL, NULL},
  1339. {"WRAP IN SPAWNED", &featureVehWrapInSpawned, NULL},
  1340. {"INVENCIBLE", &featureVehInvincible, &featureVehInvincibleUpdated},
  1341. {"SUPER VELOCIDAD (9NUM)", &featureVehSpeedBoost, NULL}
  1342. };
  1343.  
  1344. DWORD waitTime = 150;
  1345. while (true)
  1346. {
  1347. // timed menu draw, used for pause after active line switch
  1348. DWORD maxTickCount = GetTickCount() + waitTime;
  1349. do
  1350. {
  1351. // draw menu
  1352. draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
  1353. for (int i = 0; i < lineCount; i++)
  1354. if (i != activeLineIndexVeh)
  1355. draw_menu_line(line_as_str(lines[i].text, lines[i].pState),
  1356. lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
  1357. draw_menu_line(line_as_str(lines[activeLineIndexVeh].text, lines[activeLineIndexVeh].pState),
  1358. lineWidth + 1.0, 11.0, 56.0 + activeLineIndexVeh * 36.0, 0.0, 7.0, true, false);
  1359.  
  1360. update_features();
  1361. WAIT(0);
  1362. } while (GetTickCount() < maxTickCount);
  1363. waitTime = 0;
  1364.  
  1365. // process buttons
  1366. bool bSelect, bBack, bUp, bDown;
  1367. get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
  1368. if (bSelect)
  1369. {
  1370. menu_beep();
  1371.  
  1372. // common variables
  1373. BOOL bPlayerExists = ENTITY::DOES_ENTITY_EXIST(PLAYER::PLAYER_PED_ID());
  1374. Player player = PLAYER::PLAYER_ID();
  1375. Ped playerPed = PLAYER::PLAYER_PED_ID();
  1376.  
  1377. switch (activeLineIndexVeh)
  1378. {
  1379. case 0:
  1380. if (process_carspawn_menu()) return;
  1381. break;
  1382. case 1:
  1383. if (bPlayerExists)
  1384. {
  1385. if (PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
  1386. {
  1387. Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
  1388. VEHICLE::SET_VEHICLE_CUSTOM_PRIMARY_COLOUR(veh, rand() % 255, rand() % 255, rand() % 255);
  1389. if (VEHICLE::_DOES_VEHICLE_HAVE_SECONDARY_COLOUR(veh))
  1390. VEHICLE::SET_VEHICLE_CUSTOM_SECONDARY_COLOUR(veh, rand() % 255, rand() % 255, rand() % 255);
  1391. } else
  1392. {
  1393. set_status_text("~r~No estas en ningun vehiculo");
  1394. }
  1395. }
  1396. break;
  1397. case 2:
  1398. if (bPlayerExists)
  1399. if (PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
  1400. VEHICLE::SET_VEHICLE_FIXED(PED::GET_VEHICLE_PED_IS_USING(playerPed));
  1401. else
  1402. set_status_text("~r~No estas en ningun vehiculo");
  1403. break;
  1404. // switchable features
  1405. default:
  1406. if (lines[activeLineIndexVeh].pState)
  1407. *lines[activeLineIndexVeh].pState = !(*lines[activeLineIndexVeh].pState);
  1408. if (lines[activeLineIndexVeh].pUpdated)
  1409. *lines[activeLineIndexVeh].pUpdated = true;
  1410. }
  1411. waitTime = 200;
  1412. } else
  1413. if (bBack || trainer_switch_pressed())
  1414. {
  1415. menu_beep();
  1416. break;
  1417. } else
  1418. if (bUp)
  1419. {
  1420. menu_beep();
  1421. if (activeLineIndexVeh == 0)
  1422. activeLineIndexVeh = lineCount;
  1423. activeLineIndexVeh--;
  1424. waitTime = 150;
  1425. } else
  1426. if (bDown)
  1427. {
  1428. menu_beep();
  1429. activeLineIndexVeh++;
  1430. if (activeLineIndexVeh == lineCount)
  1431. activeLineIndexVeh = 0;
  1432. waitTime = 150;
  1433. }
  1434. }
  1435. }
  1436.  
  1437. int activeLineIndexWorld = 0;
  1438.  
  1439. void process_world_menu()
  1440. {
  1441. const float lineWidth = 250.0;
  1442. const int lineCount = 5;
  1443.  
  1444. std::string caption = "Juego";
  1445.  
  1446. static struct {
  1447. LPCSTR text;
  1448. bool *pState;
  1449. bool *pUpdated;
  1450. } lines[lineCount] = {
  1451. {"GRAVEDAD LUNAR", &featureWorldMoonGravity, NULL},
  1452. {"RANDOM COPS", &featureWorldRandomCops, NULL},
  1453. {"RANDOM TRAINS", &featureWorldRandomTrains, NULL},
  1454. {"RANDOM BOATS", &featureWorldRandomBoats, NULL},
  1455. {"GARBAGE TRUCKS", &featureWorldGarbageTrucks, NULL}
  1456. };
  1457.  
  1458. DWORD waitTime = 150;
  1459. while (true)
  1460. {
  1461. // timed menu draw, used for pause after active line switch
  1462. DWORD maxTickCount = GetTickCount() + waitTime;
  1463. do
  1464. {
  1465. // draw menu
  1466. draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
  1467. for (int i = 0; i < lineCount; i++)
  1468. if (i != activeLineIndexWorld)
  1469. draw_menu_line(line_as_str(lines[i].text, lines[i].pState),
  1470. lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
  1471. draw_menu_line(line_as_str(lines[activeLineIndexWorld].text, lines[activeLineIndexWorld].pState),
  1472. lineWidth + 1.0, 11.0, 56.0 + activeLineIndexWorld * 36.0, 0.0, 7.0, true, false);
  1473.  
  1474. update_features();
  1475. WAIT(0);
  1476. } while (GetTickCount() < maxTickCount);
  1477. waitTime = 0;
  1478.  
  1479. // process buttons
  1480. bool bSelect, bBack, bUp, bDown;
  1481. get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
  1482. if (bSelect)
  1483. {
  1484. menu_beep();
  1485. switch (activeLineIndexWorld)
  1486. {
  1487. case 0:
  1488. featureWorldMoonGravity = !featureWorldMoonGravity;
  1489. GAMEPLAY::SET_GRAVITY_LEVEL(featureWorldMoonGravity);
  1490. break;
  1491. case 1:
  1492. // featureWorldRandomCops being set in update_features
  1493. PED::SET_CREATE_RANDOM_COPS(!featureWorldRandomCops);
  1494. break;
  1495. case 2:
  1496. featureWorldRandomTrains = !featureWorldRandomTrains;
  1497. VEHICLE::SET_RANDOM_TRAINS(featureWorldRandomTrains);
  1498. break;
  1499. case 3:
  1500. featureWorldRandomBoats = !featureWorldRandomBoats;
  1501. VEHICLE::SET_RANDOM_BOATS(featureWorldRandomBoats);
  1502. break;
  1503. case 4:
  1504. featureWorldGarbageTrucks = !featureWorldGarbageTrucks;
  1505. VEHICLE::SET_GARBAGE_TRUCKS(featureWorldGarbageTrucks);
  1506. break;
  1507. }
  1508. waitTime = 200;
  1509. } else
  1510. if (bBack || trainer_switch_pressed())
  1511. {
  1512. menu_beep();
  1513. break;
  1514. } else
  1515. if (bUp)
  1516. {
  1517. menu_beep();
  1518. if (activeLineIndexWorld == 0)
  1519. activeLineIndexWorld = lineCount;
  1520. activeLineIndexWorld--;
  1521. waitTime = 150;
  1522. } else
  1523. if (bDown)
  1524. {
  1525. menu_beep();
  1526. activeLineIndexWorld++;
  1527. if (activeLineIndexWorld == lineCount)
  1528. activeLineIndexWorld = 0;
  1529. waitTime = 150;
  1530. }
  1531. }
  1532. }
  1533.  
  1534. int activeLineIndexTime = 0;
  1535.  
  1536. void process_time_menu()
  1537. {
  1538. const float lineWidth = 250.0;
  1539. const int lineCount = 4;
  1540.  
  1541. std::string caption = "Tiempo";
  1542.  
  1543. static struct {
  1544. LPCSTR text;
  1545. bool *pState;
  1546. bool *pUpdated;
  1547. } lines[lineCount] = {
  1548. {"HORA ADELANTE", NULL, NULL},
  1549. {"HOUR ATRAS", NULL, NULL},
  1550. {"PARAR RELOJ", &featureTimePaused, &featureTimePausedUpdated},
  1551. {"HORA REAL", &featureTimeSynced, NULL}
  1552. };
  1553.  
  1554. DWORD waitTime = 150;
  1555. while (true)
  1556. {
  1557. // timed menu draw, used for pause after active line switch
  1558. DWORD maxTickCount = GetTickCount() + waitTime;
  1559. do
  1560. {
  1561. // draw menu
  1562. draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
  1563. for (int i = 0; i < lineCount; i++)
  1564. if (i != activeLineIndexTime)
  1565. draw_menu_line(line_as_str(lines[i].text, lines[i].pState),
  1566. lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
  1567. draw_menu_line(line_as_str(lines[activeLineIndexTime].text, lines[activeLineIndexTime].pState),
  1568. lineWidth + 1.0, 11.0, 56.0 + activeLineIndexTime * 36.0, 0.0, 7.0, true, false);
  1569.  
  1570. update_features();
  1571. WAIT(0);
  1572. } while (GetTickCount() < maxTickCount);
  1573. waitTime = 0;
  1574.  
  1575. // process buttons
  1576. bool bSelect, bBack, bUp, bDown;
  1577. get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
  1578. if (bSelect)
  1579. {
  1580. menu_beep();
  1581. switch (activeLineIndexTime)
  1582. {
  1583. // hour forward/backward
  1584. case 0:
  1585. case 1:
  1586. {
  1587. int h = TIME::GET_CLOCK_HOURS();
  1588. if (activeLineIndexTime == 0) h = (h == 23) ? 0 : h + 1; else h = (h == 0) ? 23 : h - 1;
  1589. int m = TIME::GET_CLOCK_MINUTES();
  1590. TIME::SET_CLOCK_TIME(h, m, 0);
  1591. char text[32];
  1592. sprintf_s(text, "Hora: ~y~%d:%d", h, m);
  1593. set_status_text(text);
  1594. }
  1595. break;
  1596. // switchable features
  1597. default:
  1598. if (lines[activeLineIndexTime].pState)
  1599. *lines[activeLineIndexTime].pState = !(*lines[activeLineIndexTime].pState);
  1600. if (lines[activeLineIndexTime].pUpdated)
  1601. *lines[activeLineIndexTime].pUpdated = true;
  1602. }
  1603. waitTime = 200;
  1604. } else
  1605. if (bBack || trainer_switch_pressed())
  1606. {
  1607. menu_beep();
  1608. break;
  1609. } else
  1610. if (bUp)
  1611. {
  1612. menu_beep();
  1613. if (activeLineIndexTime == 0)
  1614. activeLineIndexTime = lineCount;
  1615. activeLineIndexTime--;
  1616. waitTime = 150;
  1617. } else
  1618. if (bDown)
  1619. {
  1620. menu_beep();
  1621. activeLineIndexTime++;
  1622. if (activeLineIndexTime == lineCount)
  1623. activeLineIndexTime = 0;
  1624. waitTime = 150;
  1625. }
  1626. }
  1627. }
  1628.  
  1629. int activeLineIndexWeather = 0;
  1630.  
  1631. void process_weather_menu()
  1632. {
  1633. const float lineWidth = 250.0;
  1634. const int lineCount = 15;
  1635.  
  1636. std::string caption = "Clima";
  1637.  
  1638. static struct {
  1639. LPCSTR text;
  1640. bool *pState;
  1641. bool *pUpdated;
  1642. } lines[lineCount] = {
  1643. {"VIENTO", &featureWeatherWind, NULL},
  1644. {"MUY SOLEADO", NULL, NULL},
  1645. {"DESPEJADO", NULL, NULL},
  1646. {"NUBES", NULL, NULL},
  1647. {"NIEBLA TOXICA", NULL, NULL},
  1648. {"BRUMOSO", NULL, NULL},
  1649. {"CUBIERTO", NULL, NULL},
  1650. {"LLUVIA", NULL, NULL},
  1651. {"TORMENTA", NULL, NULL},
  1652. {"DESPEJANDOSE", NULL, NULL},
  1653. {"NEUTRAL", NULL, NULL},
  1654. {"NIEVE", NULL, NULL},
  1655. {"VENTISCA", NULL, NULL},
  1656. {"NIEVELUZ", NULL, NULL},
  1657. {"NAVIDAD", NULL, NULL}
  1658. };
  1659.  
  1660.  
  1661. DWORD waitTime = 150;
  1662. while (true)
  1663. {
  1664. // timed menu draw, used for pause after active line switch
  1665. DWORD maxTickCount = GetTickCount() + waitTime;
  1666. do
  1667. {
  1668. // draw menu
  1669. draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
  1670. for (int i = 0; i < lineCount; i++)
  1671. if (i != activeLineIndexWeather)
  1672. draw_menu_line(line_as_str(lines[i].text, lines[i].pState),
  1673. lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
  1674. draw_menu_line(line_as_str(lines[activeLineIndexWeather].text, lines[activeLineIndexWeather].pState),
  1675. lineWidth + 1.0, 11.0, 56.0 + activeLineIndexWeather * 36.0, 0.0, 7.0, true, false);
  1676.  
  1677. update_features();
  1678. WAIT(0);
  1679. } while (GetTickCount() < maxTickCount);
  1680. waitTime = 0;
  1681.  
  1682. // process buttons
  1683. bool bSelect, bBack, bUp, bDown;
  1684. get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
  1685. if (bSelect)
  1686. {
  1687. menu_beep();
  1688. switch (activeLineIndexWeather)
  1689. {
  1690. // wind
  1691. case 0:
  1692. featureWeatherWind = !featureWeatherWind;
  1693. if (featureWeatherWind)
  1694. {
  1695. GAMEPLAY::SET_WIND(1.0);
  1696. GAMEPLAY::SET_WIND_SPEED(11.99);
  1697. GAMEPLAY::SET_WIND_DIRECTION(ENTITY::GET_ENTITY_HEADING(PLAYER::PLAYER_PED_ID()));
  1698. } else
  1699. {
  1700. GAMEPLAY::SET_WIND(0.0);
  1701. GAMEPLAY::SET_WIND_SPEED(0.0);
  1702. }
  1703. break;
  1704. // set weather
  1705. default:
  1706. GAMEPLAY::SET_WEATHER_TYPE_NOW_PERSIST((char *)lines[activeLineIndexWeather].text);
  1707. GAMEPLAY::CLEAR_WEATHER_TYPE_PERSIST();
  1708. set_status_text(lines[activeLineIndexWeather].text);
  1709. }
  1710. waitTime = 200;
  1711. } else
  1712. if (bBack || trainer_switch_pressed())
  1713. {
  1714. menu_beep();
  1715. break;
  1716. } else
  1717. if (bUp)
  1718. {
  1719. menu_beep();
  1720. if (activeLineIndexWeather == 0)
  1721. activeLineIndexWeather = lineCount;
  1722. activeLineIndexWeather--;
  1723. waitTime = 150;
  1724. } else
  1725. if (bDown)
  1726. {
  1727. menu_beep();
  1728. activeLineIndexWeather++;
  1729. if (activeLineIndexWeather == lineCount)
  1730. activeLineIndexWeather = 0;
  1731. waitTime = 150;
  1732. }
  1733. }
  1734. }
  1735.  
  1736. int activeLineIndexMisc = 0;
  1737.  
  1738. void process_misc_menu()
  1739. {
  1740. const float lineWidth = 250.0;
  1741. const int lineCount = 2;
  1742.  
  1743. std::string caption = "Otros";
  1744.  
  1745. static struct {
  1746. LPCSTR text;
  1747. bool *pState;
  1748. bool *pUpdated;
  1749. } lines[lineCount] = {
  1750. {"SIGUIENTE CANCION", NULL, NULL},
  1751. {"OCULTAR RADAR", &featureMiscHideHud, NULL}
  1752. };
  1753.  
  1754.  
  1755. DWORD waitTime = 150;
  1756. while (true)
  1757. {
  1758. // timed menu draw, used for pause after active line switch
  1759. DWORD maxTickCount = GetTickCount() + waitTime;
  1760. do
  1761. {
  1762. // draw menu
  1763. draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
  1764. for (int i = 0; i < lineCount; i++)
  1765. if (i != activeLineIndexMisc)
  1766. draw_menu_line(line_as_str(lines[i].text, lines[i].pState),
  1767. lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
  1768. draw_menu_line(line_as_str(lines[activeLineIndexMisc].text, lines[activeLineIndexMisc].pState),
  1769. lineWidth + 1.0, 11.0, 56.0 + activeLineIndexMisc * 36.0, 0.0, 7.0, true, false);
  1770.  
  1771. update_features();
  1772. WAIT(0);
  1773. } while (GetTickCount() < maxTickCount);
  1774. waitTime = 0;
  1775.  
  1776. // process buttons
  1777. bool bSelect, bBack, bUp, bDown;
  1778. get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
  1779. if (bSelect)
  1780. {
  1781. menu_beep();
  1782. switch (activeLineIndexMisc)
  1783. {
  1784. // next radio track
  1785. case 0:
  1786. if (ENTITY::DOES_ENTITY_EXIST(PLAYER::PLAYER_PED_ID()) &&
  1787. PED::IS_PED_IN_ANY_VEHICLE(PLAYER::PLAYER_PED_ID(), 0))
  1788. AUDIO::SKIP_RADIO_FORWARD();
  1789. break;
  1790. // switchable features
  1791. default:
  1792. if (lines[activeLineIndexMisc].pState)
  1793. *lines[activeLineIndexMisc].pState = !(*lines[activeLineIndexMisc].pState);
  1794. if (lines[activeLineIndexMisc].pUpdated)
  1795. *lines[activeLineIndexMisc].pUpdated = true;
  1796. }
  1797. waitTime = 200;
  1798. } else
  1799. if (bBack || trainer_switch_pressed())
  1800. {
  1801. menu_beep();
  1802. break;
  1803. } else
  1804. if (bUp)
  1805. {
  1806. menu_beep();
  1807. if (activeLineIndexMisc == 0)
  1808. activeLineIndexMisc = lineCount;
  1809. activeLineIndexMisc--;
  1810. waitTime = 150;
  1811. } else
  1812. if (bDown)
  1813. {
  1814. menu_beep();
  1815. activeLineIndexMisc++;
  1816. if (activeLineIndexMisc == lineCount)
  1817. activeLineIndexMisc = 0;
  1818. waitTime = 150;
  1819. }
  1820. }
  1821. }
  1822.  
  1823. int activeLineIndexMain = 0;
  1824.  
  1825. void process_main_menu()
  1826. {
  1827. const float lineWidth = 250.0;
  1828. const int lineCount = 7;
  1829.  
  1830. std::string caption = "Menu principal (AB)";
  1831.  
  1832. static LPCSTR lineCaption[lineCount] = {
  1833. "JUGADOR",
  1834. "ARMAS",
  1835. "VEHICULOS",
  1836. "JUEGO",
  1837. "TIEMPO",
  1838. "CLIMA",
  1839. "OTROS"
  1840. };
  1841.  
  1842. DWORD waitTime = 150;
  1843. while (true)
  1844. {
  1845. // timed menu draw, used for pause after active line switch
  1846. DWORD maxTickCount = GetTickCount() + waitTime;
  1847. do
  1848. {
  1849. // draw menu
  1850. draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
  1851. for (int i = 0; i < lineCount; i++)
  1852. if (i != activeLineIndexMain)
  1853. draw_menu_line(lineCaption[i], lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
  1854. draw_menu_line(lineCaption[activeLineIndexMain], lineWidth + 1.0, 11.0, 56.0 + activeLineIndexMain * 36.0, 0.0, 7.0, true, false);
  1855.  
  1856. update_features();
  1857. WAIT(0);
  1858. } while (GetTickCount() < maxTickCount);
  1859. waitTime = 0;
  1860.  
  1861. // process buttons
  1862. bool bSelect, bBack, bUp, bDown;
  1863. get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
  1864. if (bSelect)
  1865. {
  1866. menu_beep();
  1867. switch (activeLineIndexMain)
  1868. {
  1869. case 0:
  1870. process_player_menu();
  1871. break;
  1872. case 1:
  1873. process_weapon_menu();
  1874. break;
  1875. case 2:
  1876. process_veh_menu();
  1877. break;
  1878. case 3:
  1879. process_world_menu();
  1880. break;
  1881. case 4:
  1882. process_time_menu();
  1883. break;
  1884. case 5:
  1885. process_weather_menu();
  1886. break;
  1887. case 6:
  1888. process_misc_menu();
  1889. break;
  1890. }
  1891. waitTime = 200;
  1892. } else
  1893. if (bBack || trainer_switch_pressed())
  1894. {
  1895. menu_beep();
  1896. break;
  1897. } else
  1898. if (bUp)
  1899. {
  1900. menu_beep();
  1901. if (activeLineIndexMain == 0)
  1902. activeLineIndexMain = lineCount;
  1903. activeLineIndexMain--;
  1904. waitTime = 150;
  1905. } else
  1906. if (bDown)
  1907. {
  1908. menu_beep();
  1909. activeLineIndexMain++;
  1910. if (activeLineIndexMain == lineCount)
  1911. activeLineIndexMain = 0;
  1912. waitTime = 150;
  1913. }
  1914. }
  1915. }
  1916.  
  1917. void reset_globals()
  1918. {
  1919. activeLineIndexMain =
  1920. activeLineIndexPlayer =
  1921. skinchangerActiveLineIndex =
  1922. skinchangerActiveItemIndex =
  1923. teleportActiveLineIndex =
  1924. activeLineIndexWeapon =
  1925. activeLineIndexVeh =
  1926. carspawnActiveLineIndex =
  1927. carspawnActiveItemIndex =
  1928. activeLineIndexWorld =
  1929. activeLineIndexWeather = 0;
  1930.  
  1931. featurePlayerInvincible =
  1932. featurePlayerInvincibleUpdated =
  1933. featurePlayerNeverWanted =
  1934. featurePlayerIgnored =
  1935. featurePlayerIgnoredUpdated =
  1936. featurePlayerUnlimitedAbility =
  1937. featurePlayerNoNoise =
  1938. featurePlayerNoNoiseUpdated =
  1939. featurePlayerFastSwim =
  1940. featurePlayerFastSwimUpdated =
  1941. featurePlayerFastRun =
  1942. featurePlayerFastRunUpdated =
  1943. featurePlayerSuperJump =
  1944. featureWeaponNoReload =
  1945. featureWeaponFireAmmo =
  1946. featureWeaponExplosiveAmmo =
  1947. featureWeaponExplosiveMelee =
  1948. featureWeaponVehRockets =
  1949. featureVehInvincible =
  1950. featureVehInvincibleUpdated =
  1951. featureVehSpeedBoost =
  1952. featureVehWrapInSpawned =
  1953. featureWorldMoonGravity =
  1954. featureTimePaused =
  1955. featureTimePausedUpdated =
  1956. featureTimeSynced =
  1957. featureWeatherWind =
  1958. featureMiscLockRadio =
  1959. featureMiscHideHud = false;
  1960.  
  1961. featureWorldRandomCops =
  1962. featureWorldRandomTrains =
  1963. featureWorldRandomBoats =
  1964. featureWorldGarbageTrucks = true;
  1965.  
  1966. skinchanger_used = false;
  1967. }
  1968.  
  1969. void main()
  1970. {
  1971. reset_globals();
  1972.  
  1973. while (true)
  1974. {
  1975. if (trainer_switch_pressed())
  1976. {
  1977. reset_trainer_switch();
  1978. process_main_menu();
  1979. DWORD time = GetTickCount() + 1000;
  1980. while (GetTickCount() < time)
  1981. {
  1982. update_features();
  1983. WAIT(0);
  1984. }
  1985. reset_trainer_switch();
  1986. }
  1987. update_features();
  1988.  
  1989. WAIT(0);
  1990. }
  1991. }
  1992.  
  1993. void ScriptMain()
  1994. {
  1995. srand(GetTickCount());
  1996. main();
  1997. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement