Advertisement
MasterHN

MenuMod

Jan 26th, 2018
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. #include "script.h"
  17. #include "keyboard.h"
  18.  
  19. #include <string>
  20. #include <ctime>
  21.  
  22. #pragma warning(disable : 4244 4305) // double <-> float conversions
  23.  
  24. 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)
  25. {
  26.     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);
  27. }
  28.  
  29. void draw_menu_line(std::string caption, float lineWidth, float lineHeight, float lineTop, float lineLeft, float textLeft, bool active, bool title, bool rescaleText = true)
  30. {
  31.     //If you use this design in a public menu, please credit me, The Crusader, for the design :)
  32.  
  33.     // default values
  34.     int text_col[4] = { 255, 255, 255, 250.0f },
  35.         rect_col[4] = { 0, 0, 0, 239.f };
  36.     float text_scale = 0.35;
  37.     int font = 0;
  38.     bool outline = false;   //your choice
  39.     bool dropShadow = false; //your choice
  40.  
  41.     // correcting values for active line
  42.     if (active)
  43.     {
  44.         text_col[0] = 0;
  45.         text_col[1] = 0;
  46.         text_col[2] = 0;
  47.         text_col[3] = 240.f;
  48.  
  49.         rect_col[0] = 200;
  50.         rect_col[1] = 9;
  51.         rect_col[2] = 5;
  52.         rect_col[3] = 220;
  53.  
  54.                          
  55.  
  56.         if (rescaleText) text_scale = 0.39; //37
  57.  
  58.     }
  59.     else if (title)
  60.     {
  61.         text_col[0] = 255;
  62.         text_col[1] = 255;
  63.         text_col[2] = 255;
  64.  
  65.         rect_col[0] = 200;
  66.         rect_col[1] = 9;
  67.         rect_col[2] = 5;
  68.         rect_col[3] = 220;
  69.  
  70.         if (rescaleText) text_scale = 0.75;
  71.         outline = true;
  72.  
  73.         font = 7;
  74.     }
  75.     else
  76.     {
  77.         outline = true;
  78.     }
  79.  
  80.  
  81.     int screen_w, screen_h;
  82.     GRAPHICS::GET_SCREEN_RESOLUTION(&screen_w, &screen_h);
  83.  
  84.     textLeft += lineLeft;
  85.  
  86.     float lineWidthScaled = lineWidth / (float)screen_w; // line width
  87.     float lineTopScaled = lineTop / (float)screen_h; // line top offset
  88.     float textLeftScaled = textLeft / (float)screen_w; // text left offset
  89.     float lineHeightScaled = lineHeight / (float)screen_h; // line height
  90.  
  91.     float lineLeftScaled = lineLeft / (float)screen_w;
  92.  
  93.     // this is how it's done in original scripts
  94.  
  95.     // text upper part
  96.     UI::SET_TEXT_FONT(font);
  97.     UI::SET_TEXT_SCALE(0.0, text_scale);
  98.     UI::SET_TEXT_COLOUR(text_col[0], text_col[1], text_col[2], text_col[3]);
  99.     UI::SET_TEXT_CENTRE(0);
  100.     UI::SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0);
  101.     UI::SET_TEXT_EDGE(0, 0, 0, 0, 0);
  102.     UI::_SET_TEXT_ENTRY("STRING");
  103.     UI::_ADD_TEXT_COMPONENT_STRING((LPSTR)caption.c_str());
  104.     UI::_DRAW_TEXT(textLeftScaled, (((lineTopScaled + 0.00278f) + lineHeightScaled) - 0.005f));
  105.  
  106.     // text lower part
  107.     UI::SET_TEXT_FONT(font);
  108.     UI::SET_TEXT_SCALE(0.0, text_scale);
  109.     UI::SET_TEXT_COLOUR(text_col[0], text_col[1], text_col[2], text_col[3]);
  110.     UI::SET_TEXT_CENTRE(0);
  111.     UI::SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0);
  112.     UI::SET_TEXT_EDGE(0, 0, 0, 0, 0);
  113.     UI::_SET_TEXT_GXT_ENTRY("STRING");
  114.     UI::_ADD_TEXT_COMPONENT_STRING((LPSTR)caption.c_str());
  115.     int num25 = UI::_0x9040DFB09BE75706(textLeftScaled, (((lineTopScaled + 0.00278f) + lineHeightScaled) - 0.005f));
  116.  
  117.     // rect
  118.     draw_rect(lineLeftScaled, lineTopScaled + (0.00278f),
  119.         lineWidthScaled, ((((float)(num25)* UI::_0xDB88A37483346780(text_scale, 0)) + (lineHeightScaled * 1.5f)) + 0.006f),
  120.         rect_col[0], rect_col[1], rect_col[2], rect_col[3]);
  121. }
  122.  
  123.  
  124. bool trainer_switch_pressed()
  125. {
  126.     return IsKeyJustUp(VK_F8);
  127. }
  128.  
  129. void get_button_state(bool *a, bool *b, bool *up, bool *down, bool *l, bool *r)
  130. {
  131.     if (a) *a = IsKeyDown(VK_NUMPAD5);
  132.     if (b) *b = IsKeyDown(VK_NUMPAD0) || trainer_switch_pressed() || IsKeyDown(VK_BACK);
  133.     if (up) *up = IsKeyDown(VK_NUMPAD8);
  134.     if (down) *down = IsKeyDown(VK_NUMPAD2);
  135.     if (r) *r = IsKeyDown(VK_NUMPAD6);
  136.     if (l) *l = IsKeyDown(VK_NUMPAD4);
  137. }
  138.  
  139. void menu_beep()
  140. {
  141.     AUDIO::PLAY_SOUND_FRONTEND(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", 0);
  142. }
  143.  
  144. std::string statusText;
  145. DWORD statusTextDrawTicksMax;
  146. bool statusTextGxtEntry;
  147.  
  148. void update_status_text()
  149. {
  150.     if (GetTickCount() < statusTextDrawTicksMax)
  151.     {
  152.         UI::SET_TEXT_FONT(0);
  153.         UI::SET_TEXT_SCALE(0.55, 0.55);
  154.         UI::SET_TEXT_COLOUR(255, 255, 255, 255);
  155.         UI::SET_TEXT_WRAP(0.0, 1.0);
  156.         UI::SET_TEXT_CENTRE(1);
  157.         UI::SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0);
  158.         UI::SET_TEXT_EDGE(1, 0, 0, 0, 205);
  159.         if (statusTextGxtEntry)
  160.         {
  161.             UI::_SET_TEXT_ENTRY((char *)statusText.c_str());
  162.         } else
  163.         {
  164.             UI::_SET_TEXT_ENTRY("STRING");
  165.             UI::_ADD_TEXT_COMPONENT_STRING((char *)statusText.c_str());
  166.         }
  167.         UI::_DRAW_TEXT(0.5, 0.5);
  168.     }
  169. }
  170.  
  171. void set_status_text(std::string str, DWORD time = 2500, bool isGxtEntry = false)
  172. {
  173.     statusText = str;
  174.     statusTextDrawTicksMax = GetTickCount() + time;
  175.     statusTextGxtEntry = isGxtEntry;
  176. }
  177.  
  178. // features
  179. bool featurePlayerInvincible            =   false;
  180. bool featurePlayerInvincibleUpdated     =   false;
  181. bool featurePlayerNeverWanted           =   false;
  182. bool featurePlayerIgnored               =   false;
  183. bool featurePlayerIgnoredUpdated        =   false;
  184. bool featurePlayerUnlimitedAbility      =   false;
  185. bool featurePlayerNoNoise               =   false;
  186. bool featurePlayerNoNoiseUpdated        =   false;
  187. bool featurePlayerFastSwim              =   false;
  188. bool featurePlayerFastSwimUpdated       =   false;
  189. bool featurePlayerFastRun               =   false;
  190. bool featurePlayerFastRunUpdated        =   false;
  191. bool featurePlayerSuperJump             =   false;
  192. bool featurePlayerUltraJump             =   false;
  193.  
  194. bool featureWeaponNoReload              =   false;
  195. bool featureWeaponFireAmmo              =   false;
  196. bool featureWeaponExplosiveAmmo         =   false;
  197. bool featureWeaponExplosiveMelee        =   false;
  198. bool featureWeaponVehRockets            =   false;
  199.  
  200. DWORD featureWeaponVehShootLastTime     =   0;
  201.  
  202. bool featureVehInvincible               =   false;
  203. bool featureVehInvincibleUpdated        =   false;
  204. bool featureVehInvincibleWheels         =   false;
  205. bool featureVehInvincibleWheelsUpdated  =   false;
  206. bool featureVehSeatbelt                 =   false;
  207. bool featureVehSeatbeltUpdated          =   false;
  208. bool featureVehSpeedBoost               =   false;
  209. bool featureVehWrapInSpawned            =   false;
  210.  
  211. bool featureWorldMoonGravity            =   false;
  212. bool featureWorldRandomCops             =   true;
  213. bool featureWorldRandomTrains           =   true;
  214. bool featureWorldRandomBoats            =   true;
  215. bool featureWorldGarbageTrucks          =   true;
  216.  
  217. bool featureTimePaused                  =   false;
  218. bool featureTimePausedUpdated           =   false;
  219. bool featureTimeSynced                  =   false;
  220.  
  221. bool featureWeatherWind                 =   false;
  222. bool featureWeatherPers                 =   false;
  223.  
  224. bool featureMiscLockRadio               =   false;
  225. bool featureMiscHideHud                 =   false;
  226.  
  227.  
  228. // player model control, switching on normal ped model when needed 
  229. void check_player_model()
  230. {
  231.     // common variables
  232.     Player player = PLAYER::PLAYER_ID();
  233.     Ped playerPed = PLAYER::PLAYER_PED_ID();   
  234.  
  235.     if (!ENTITY::DOES_ENTITY_EXIST(playerPed)) return;
  236.  
  237.     Hash model = ENTITY::GET_ENTITY_MODEL(playerPed);
  238.     if (ENTITY::IS_ENTITY_DEAD(playerPed) || PLAYER::IS_PLAYER_BEING_ARRESTED(player, TRUE))
  239.         if (model != GAMEPLAY::GET_HASH_KEY("player_zero") &&
  240.             model != GAMEPLAY::GET_HASH_KEY("player_one") &&
  241.             model != GAMEPLAY::GET_HASH_KEY("player_two"))
  242.         {
  243.             set_status_text("turning to normal");
  244.             WAIT(1000);
  245.  
  246.             model = GAMEPLAY::GET_HASH_KEY("player_zero");
  247.             STREAMING::REQUEST_MODEL(model);
  248.             while (!STREAMING::HAS_MODEL_LOADED(model))
  249.                 WAIT(0);
  250.             PLAYER::SET_PLAYER_MODEL(PLAYER::PLAYER_ID(), model);
  251.             PED::SET_PED_DEFAULT_COMPONENT_VARIATION(PLAYER::PLAYER_PED_ID());
  252.             STREAMING::SET_MODEL_AS_NO_LONGER_NEEDED(model);
  253.  
  254.             // wait until player is ressurected
  255.             while (ENTITY::IS_ENTITY_DEAD(PLAYER::PLAYER_PED_ID()) || PLAYER::IS_PLAYER_BEING_ARRESTED(player, TRUE))
  256.                 WAIT(0);
  257.  
  258.         }
  259. }
  260.  
  261. void update_vehicle_guns()
  262. {
  263.     Player player = PLAYER::PLAYER_ID();
  264.     Ped playerPed = PLAYER::PLAYER_PED_ID();   
  265.  
  266.     if (!ENTITY::DOES_ENTITY_EXIST(playerPed) || !featureWeaponVehRockets) return;
  267.  
  268.     bool bSelect = IsKeyDown(0x6B); // num plus
  269.     if (bSelect && featureWeaponVehShootLastTime + 150 < GetTickCount() &&
  270.         PLAYER::IS_PLAYER_CONTROL_ON(player) && PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
  271.     {
  272.         Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
  273.  
  274.         Vector3 v0, v1;
  275.         GAMEPLAY::GET_MODEL_DIMENSIONS(ENTITY::GET_ENTITY_MODEL(veh), &v0, &v1);
  276.  
  277.         Hash weaponAssetRocket = GAMEPLAY::GET_HASH_KEY("WEAPON_VEHICLE_ROCKET");
  278.         if (!WEAPON::HAS_WEAPON_ASSET_LOADED(weaponAssetRocket))
  279.         {
  280.             WEAPON::REQUEST_WEAPON_ASSET(weaponAssetRocket, 31, 0);
  281.             while (!WEAPON::HAS_WEAPON_ASSET_LOADED(weaponAssetRocket))
  282.                 WAIT(0);
  283.         }
  284.  
  285.         Vector3 coords0from = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, -(v1.x + 0.25f), v1.y + 1.25f, 0.1);
  286.         Vector3 coords1from = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh,  (v1.x + 0.25f), v1.y + 1.25f, 0.1);
  287.         Vector3 coords0to = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, -v1.x, v1.y + 100.0f, 0.1f);
  288.         Vector3 coords1to = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh,  v1.x, v1.y + 100.0f, 0.1f);
  289.  
  290.         GAMEPLAY::SHOOT_SINGLE_BULLET_BETWEEN_COORDS(coords0from.x, coords0from.y, coords0from.z,
  291.                                                      coords0to.x, coords0to.y, coords0to.z,
  292.                                                      250, 1, weaponAssetRocket, playerPed, 1, 0, -1.0);
  293.         GAMEPLAY::SHOOT_SINGLE_BULLET_BETWEEN_COORDS(coords1from.x, coords1from.y, coords1from.z,
  294.                                                      coords1to.x, coords1to.y, coords1to.z,
  295.                                                      250, 1, weaponAssetRocket, playerPed, 1, 0, -1.0);
  296.  
  297.         featureWeaponVehShootLastTime = GetTickCount();
  298.     }
  299. }
  300.  
  301. bool skinchanger_used = false;
  302.  
  303. // Updates all features that can be turned off by the game, being called each game frame
  304. void update_features()
  305. {
  306.     update_status_text();
  307.  
  308.     update_vehicle_guns();
  309.  
  310.     // changing player model if died/arrested while being in another skin, since it can cause inf loading loop
  311.     if (skinchanger_used)
  312.         check_player_model();
  313.  
  314.     // wait until player is ready, basicly to prevent using the trainer while player is dead or arrested
  315.     while (ENTITY::IS_ENTITY_DEAD(PLAYER::PLAYER_PED_ID()) || PLAYER::IS_PLAYER_BEING_ARRESTED(PLAYER::PLAYER_ID(), TRUE))
  316.         WAIT(0);
  317.  
  318.     // read default feature values from the game
  319.     featureWorldRandomCops = PED::CAN_CREATE_RANDOM_COPS() == TRUE;
  320.  
  321.     // common variables
  322.     Player player = PLAYER::PLAYER_ID();
  323.     Ped playerPed = PLAYER::PLAYER_PED_ID();   
  324.     BOOL bPlayerExists = ENTITY::DOES_ENTITY_EXIST(playerPed);
  325.  
  326.     // player invincible
  327.     if (featurePlayerInvincibleUpdated)
  328.     {
  329.         if (bPlayerExists && !featurePlayerInvincible)
  330.             PLAYER::SET_PLAYER_INVINCIBLE(player, FALSE);
  331.         featurePlayerInvincibleUpdated = false;
  332.     }
  333.     if (featurePlayerInvincible)
  334.     {
  335.         if (bPlayerExists)
  336.             PLAYER::SET_PLAYER_INVINCIBLE(player, TRUE);
  337.     }
  338.  
  339.     // player never wanted
  340.     if (featurePlayerNeverWanted)
  341.     {
  342.         if (bPlayerExists)
  343.             PLAYER::CLEAR_PLAYER_WANTED_LEVEL(player);
  344.     }
  345.  
  346.     // police ignore player
  347.     if (featurePlayerIgnoredUpdated)
  348.     {
  349.         if (bPlayerExists)
  350.             PLAYER::SET_POLICE_IGNORE_PLAYER(player, featurePlayerIgnored);
  351.         featurePlayerIgnoredUpdated = false;
  352.     }
  353.  
  354.     // player special ability
  355.     if (featurePlayerUnlimitedAbility)
  356.     {
  357.         if (bPlayerExists)
  358.             PLAYER::SPECIAL_ABILITY_FILL_METER(player, 1);
  359.     }
  360.  
  361.     // player no noise
  362.     if (featurePlayerNoNoiseUpdated)
  363.     {
  364.         if (bPlayerExists && !featurePlayerNoNoise)
  365.             PLAYER::SET_PLAYER_NOISE_MULTIPLIER(player, 1.0);
  366.         featurePlayerNoNoiseUpdated = false;
  367.     }
  368.     if (featurePlayerNoNoise)
  369.         PLAYER::SET_PLAYER_NOISE_MULTIPLIER(player, 0.0);
  370.  
  371.     // player fast swim
  372.     if (featurePlayerFastSwimUpdated)
  373.     {
  374.         if (bPlayerExists && !featurePlayerFastSwim)
  375.             PLAYER::SET_SWIM_MULTIPLIER_FOR_PLAYER(player, 1.0);
  376.         featurePlayerFastSwimUpdated = false;
  377.     }
  378.     if (featurePlayerFastSwim)
  379.         PLAYER::SET_SWIM_MULTIPLIER_FOR_PLAYER(player, 1.49);
  380.  
  381.     // player fast run
  382.     if (featurePlayerFastRunUpdated)
  383.     {
  384.         if (bPlayerExists && !featurePlayerFastRun)
  385.             PLAYER::SET_RUN_SPRINT_MULTIPLIER_FOR_PLAYER(player, 1.0);
  386.         featurePlayerFastRunUpdated = false;
  387.     }
  388.     if (featurePlayerFastRun)
  389.         PLAYER::SET_RUN_SPRINT_MULTIPLIER_FOR_PLAYER(player, 1.49);
  390.  
  391.     // player super jump
  392.     if (featurePlayerSuperJump)
  393.     {
  394.         if (bPlayerExists)
  395.             GAMEPLAY::SET_SUPER_JUMP_THIS_FRAME(player);
  396.     }
  397.  
  398.     // weapon
  399.     if (featureWeaponFireAmmo)
  400.     {
  401.         if (bPlayerExists)
  402.             GAMEPLAY::SET_FIRE_AMMO_THIS_FRAME(player);
  403.     }
  404.     if (featureWeaponExplosiveAmmo)
  405.     {
  406.         if (bPlayerExists)
  407.             GAMEPLAY::SET_EXPLOSIVE_AMMO_THIS_FRAME(player);
  408.     }
  409.     if (featureWeaponExplosiveMelee)
  410.     {
  411.         if (bPlayerExists)
  412.             GAMEPLAY::SET_EXPLOSIVE_MELEE_THIS_FRAME(player);
  413.     }
  414.  
  415.     // weapon no reload
  416.     if (bPlayerExists && featureWeaponNoReload)
  417.     {
  418.         Hash cur;
  419.         if (WEAPON::GET_CURRENT_PED_WEAPON(playerPed, &cur, 1))
  420.         {
  421.             if (WEAPON::IS_WEAPON_VALID(cur))
  422.             {
  423.                 int maxAmmo;
  424.                 if (WEAPON::GET_MAX_AMMO(playerPed, cur, &maxAmmo))
  425.                 {
  426.                     WEAPON::SET_PED_AMMO(playerPed, cur, maxAmmo);
  427.  
  428.                     maxAmmo = WEAPON::GET_MAX_AMMO_IN_CLIP(playerPed, cur, 1);
  429.                     if (maxAmmo > 0)
  430.                         WEAPON::SET_AMMO_IN_CLIP(playerPed, cur, maxAmmo);
  431.                 }
  432.             }
  433.         }
  434.     }
  435.  
  436.     // player's vehicle invincible
  437.     if (featureVehInvincibleUpdated)
  438.     {
  439.         if (bPlayerExists && !featureVehInvincible && PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
  440.         {
  441.             Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
  442.             ENTITY::SET_ENTITY_INVINCIBLE(veh, FALSE);
  443.             ENTITY::SET_ENTITY_PROOFS(veh, 0, 0, 0, 0, 0, 0, 0, 0);
  444.             VEHICLE::SET_VEHICLE_TYRES_CAN_BURST(veh, 1);
  445.             VEHICLE::SET_VEHICLE_WHEELS_CAN_BREAK(veh, 1);
  446.             VEHICLE::SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(veh, 1);
  447.         }
  448.         featureVehInvincibleUpdated = false;
  449.     }
  450.     if (featureVehInvincible)
  451.     {
  452.         if (bPlayerExists && PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
  453.         {
  454.             Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
  455.             ENTITY::SET_ENTITY_INVINCIBLE(veh, TRUE);
  456.             ENTITY::SET_ENTITY_PROOFS(veh, 1, 1, 1, 1, 1, 1, 1, 1);
  457.             VEHICLE::SET_VEHICLE_TYRES_CAN_BURST(veh, 0);
  458.             VEHICLE::SET_VEHICLE_WHEELS_CAN_BREAK(veh, 0);
  459.             VEHICLE::SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(veh, 0);
  460.         }
  461.     }
  462.  
  463.     // player's vehicle invincible wheels, usefull with custom handling
  464.     if (featureVehInvincibleWheelsUpdated)
  465.     {
  466.         if (bPlayerExists && !featureVehInvincibleWheels && PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
  467.         {
  468.             Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
  469.             VEHICLE::SET_VEHICLE_TYRES_CAN_BURST(veh, TRUE);
  470.             VEHICLE::SET_VEHICLE_WHEELS_CAN_BREAK(veh, TRUE);
  471.             VEHICLE::SET_VEHICLE_HAS_STRONG_AXLES(veh, FALSE);
  472.         }
  473.         featureVehInvincibleWheelsUpdated = false;
  474.     }
  475.     if (featureVehInvincibleWheels)
  476.     {
  477.         if (bPlayerExists && PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
  478.         {
  479.             Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
  480.             VEHICLE::SET_VEHICLE_TYRES_CAN_BURST(veh, FALSE);
  481.             VEHICLE::SET_VEHICLE_WHEELS_CAN_BREAK(veh, FALSE);
  482.             VEHICLE::SET_VEHICLE_HAS_STRONG_AXLES(veh, TRUE);
  483.         }
  484.     }
  485.  
  486.     if (featurePlayerUltraJump)
  487.     {
  488.         GAMEPLAY::SET_SUPER_JUMP_THIS_FRAME(player);
  489.         WEAPON::REMOVE_WEAPON_FROM_PED(playerPed, GAMEPLAY::GET_HASH_KEY("GADGET_PARACHUTE"));
  490.         if (PED::IS_PED_JUMPING(playerPed))
  491.         {
  492.             ENTITY::APPLY_FORCE_TO_ENTITY(playerPed, true, 0, 0, 5, 0, 0, 0, true, true, true, true, false, true);
  493.         }
  494.     }
  495.  
  496.     // seat belt
  497.     const int PED_FLAG_CAN_FLY_THRU_WINDSCREEN = 32;
  498.     if (featureVehSeatbeltUpdated)
  499.     {
  500.         if (bPlayerExists && !featureVehSeatbelt)
  501.             PED::SET_PED_CONFIG_FLAG(playerPed, PED_FLAG_CAN_FLY_THRU_WINDSCREEN, TRUE);
  502.         featureVehSeatbeltUpdated = false;
  503.     }
  504.     if (featureVehSeatbelt)
  505.     {
  506.         if (bPlayerExists)
  507.         {
  508.             if (PED::GET_PED_CONFIG_FLAG(playerPed, PED_FLAG_CAN_FLY_THRU_WINDSCREEN, TRUE))
  509.                 PED::SET_PED_CONFIG_FLAG(playerPed, PED_FLAG_CAN_FLY_THRU_WINDSCREEN, FALSE);
  510.         }
  511.     }
  512.  
  513.     // player's vehicle boost
  514.     if (featureVehSpeedBoost && bPlayerExists && PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
  515.     {
  516.         Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
  517.         DWORD model = ENTITY::GET_ENTITY_MODEL(veh);
  518.  
  519.         bool bUp = IsKeyDown(VK_NUMPAD9);
  520.         bool bDown = IsKeyDown(VK_NUMPAD3);
  521.  
  522.         if (bUp || bDown)
  523.         {          
  524.             float speed = ENTITY::GET_ENTITY_SPEED(veh);
  525.             if (bUp)
  526.             {
  527.                 if (speed < 3.0f) speed = 3.0f;
  528.                 speed += speed * 0.05f;
  529.                 VEHICLE::SET_VEHICLE_FORWARD_SPEED(veh, speed);
  530.             } else
  531.             if (ENTITY::IS_ENTITY_IN_AIR(veh) || speed > 5.0)
  532.                 VEHICLE::SET_VEHICLE_FORWARD_SPEED(veh, 0.0);
  533.         }
  534.     }
  535.  
  536.     // time pause
  537.     if (featureTimePausedUpdated)
  538.     {
  539.         TIME::PAUSE_CLOCK(featureTimePaused);
  540.         featureTimePausedUpdated = false;
  541.     }
  542.  
  543.     // time sync
  544.     if (featureTimeSynced)
  545.     {
  546.         time_t now = time(0);
  547.         tm t;
  548.         localtime_s(&t, &now);
  549.         TIME::SET_CLOCK_TIME(t.tm_hour, t.tm_min, t.tm_sec);
  550.     }
  551.  
  552.     // hide hud
  553.     if (featureMiscHideHud)
  554.         UI::HIDE_HUD_AND_RADAR_THIS_FRAME();
  555. }
  556.  
  557. LPCSTR pedModels[70][10] = {
  558.     {"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"},
  559.     { "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"},
  560.     {"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"},
  561.     {"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"},
  562.     {"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"},
  563.     {"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"},
  564.     {"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"},
  565.     {"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"},
  566.     {"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"},
  567.     {"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"},
  568.     {"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"},
  569.     {"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"},
  570.     {"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"},
  571.     {"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"},
  572.     {"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"},
  573.     {"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"},
  574.     {"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"},
  575.     {"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"},
  576.     {"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"},
  577.     {"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"},
  578.     {"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"},
  579.     {"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"},
  580.     {"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"},
  581.     {"csb_ballasog", "csb_bride", "csb_burgerdrug", "csb_car3guy1", "csb_car3guy2", "csb_chef", "csb_chin_goon", "csb_cletus", "csb_cop", "csb_customer"},
  582.     {"csb_denise_friend", "csb_fos_rep", "csb_g", "csb_groom", "csb_grove_str_dlr", "csb_hao", "csb_hugh", "csb_imran", "csb_janitor", "csb_maude"},
  583.     {"csb_mweather", "csb_ortega", "csb_oscar", "csb_porndudes", "csb_porndudes_p", "csb_prologuedriver", "csb_prolsec", "csb_ramp_gang", "csb_ramp_hic", "csb_ramp_hipster"},
  584.     {"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"},
  585.     {"cs_andreas", "cs_ashley", "cs_bankman", "cs_barry", "cs_barry_p", "cs_beverly", "cs_beverly_p", "cs_brad", "cs_bradcadaver", "cs_carbuyer"},
  586.     {"cs_casey", "cs_chengsr", "cs_chrisformage", "cs_clay", "cs_dale", "cs_davenorton", "cs_debra", "cs_denise", "cs_devin", "cs_dom"},
  587.     {"cs_dreyfuss", "cs_drfriedlander", "cs_fabien", "cs_fbisuit_01", "cs_floyd", "cs_guadalope", "cs_gurk", "cs_hunter", "cs_janet", "cs_jewelass"},
  588.     {"cs_jimmyboston", "cs_jimmydisanto", "cs_joeminuteman", "cs_johnnyklebitz", "cs_josef", "cs_josh", "cs_lamardavis", "cs_lazlow", "cs_lestercrest", "cs_lifeinvad_01"},
  589.     {"cs_magenta", "cs_manuel", "cs_marnie", "cs_martinmadrazo", "cs_maryann", "cs_michelle", "cs_milton", "cs_molly", "cs_movpremf_01", "cs_movpremmale"},
  590.     {"cs_mrk", "cs_mrsphillips", "cs_mrs_thornhill", "cs_natalia", "cs_nervousron", "cs_nigel", "cs_old_man1a", "cs_old_man2", "cs_omega", "cs_orleans"},
  591.     {"cs_paper", "cs_paper_p", "cs_patricia", "cs_priest", "cs_prolsec_02", "cs_russiandrunk", "cs_siemonyetarian", "cs_solomon", "cs_stevehains", "cs_stretch"},
  592.     {"cs_tanisha", "cs_taocheng", "cs_taostranslator", "cs_tenniscoach", "cs_terry", "cs_tom", "cs_tomepsilon", "cs_tracydisanto", "cs_wade", "cs_zimbor"},
  593.     {"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"},
  594.     {"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"},
  595.     {"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"},
  596.     {"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"},
  597.     {"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"},
  598.     {"hc_gunman", "hc_hacker", "ig_abigail", "ig_amandatownley", "ig_andreas", "ig_ashley", "ig_ballasog", "ig_bankman", "ig_barry", "ig_barry_p"},
  599.     {"ig_bestmen", "ig_beverly", "ig_beverly_p", "ig_brad", "ig_bride", "ig_car3guy1", "ig_car3guy2", "ig_casey", "ig_chef", "ig_chengsr"},
  600.     {"ig_chrisformage", "ig_clay", "ig_claypain", "ig_cletus", "ig_dale", "ig_davenorton", "ig_denise", "ig_devin", "ig_dom", "ig_dreyfuss"},
  601.     {"ig_drfriedlander", "ig_fabien", "ig_fbisuit_01", "ig_floyd", "ig_groom", "ig_hao", "ig_hunter", "ig_janet", "ig_jay_norris", "ig_jewelass"},
  602.     {"ig_jimmyboston", "ig_jimmydisanto", "ig_joeminuteman", "ig_johnnyklebitz", "ig_josef", "ig_josh", "ig_kerrymcintosh", "ig_lamardavis", "ig_lazlow", "ig_lestercrest"},
  603.     {"ig_lifeinvad_01", "ig_lifeinvad_02", "ig_magenta", "ig_manuel", "ig_marnie", "ig_maryann", "ig_maude", "ig_michelle", "ig_milton", "ig_molly"},
  604.     {"ig_mrk", "ig_mrsphillips", "ig_mrs_thornhill", "ig_natalia", "ig_nervousron", "ig_nigel", "ig_old_man1a", "ig_old_man2", "ig_omega", "ig_oneil"},
  605.     {"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"},
  606.     {"ig_roccopelosi", "ig_russiandrunk", "ig_screen_writer", "ig_siemonyetarian", "ig_solomon", "ig_stevehains", "ig_stretch", "ig_talina", "ig_tanisha", "ig_taocheng"},
  607.     {"ig_taostranslator", "ig_taostranslator_p", "ig_tenniscoach", "ig_terry", "ig_tomepsilon", "ig_tonya", "ig_tracydisanto", "ig_trafficwarden", "ig_tylerdix", "ig_wade"},
  608.     {"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"},
  609.     {"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", "", "", "", ""},
  610.     {"", "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"},
  611.     {"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"},
  612.     {"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"},
  613.     {"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"},
  614.     {"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"},
  615.     {"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"},
  616.     {"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"},
  617.     {"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"},
  618.     {"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"},
  619.     {"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"},
  620.     {"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"},
  621.     {"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"},
  622.     {"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"},
  623.     {"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"},
  624.     {"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"},
  625.     {"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"},
  626.     {"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"},
  627.     {"ig_benny", "ig_g", "ig_vagspeak", "mp_m_g_vagfun_01", "mp_m_boatstaff_01", "mp_f_boatstaff_01", "", "", "", ""}
  628. };
  629.  
  630. LPCSTR pedModelNames[70][10] = {
  631.     {"MICHAEL", "FRANKLIN", "TREVOR", "BOAR", "CHIMP", "COW", "COYOTE", "DEER", "FISH", "HEN"},
  632.     { "CAT", "HAWK", "CORMORANT", "CROW", "DOLPHIN", "HUMPBACK", "WHALE", "PIGEON", "SEAGULL", "SHARKHAMMER" },
  633.     {"PIG", "RAT", "RHESUS", "CHOP", "HUSKY", "MTLION", "RETRIEVER", "SHARKTIGER", "SHEPHERD", "ALIEN"},
  634.     {"BEACH", "BEVHILLS", "BEVHILLS", "BODYBUILD", "BUSINESS", "DOWNTOWN", "EASTSA", "EASTSA", "FATBLA", "FATCULT"},
  635.     {"FATWHITE", "KTOWN", "KTOWN", "PROLHOST", "SALTON", "SKIDROW", "SOUCENTMC", "SOUCENT", "SOUCENT", "TOURIST"},
  636.     {"TRAMPBEAC", "TRAMP", "GENSTREET", "INDIAN", "KTOWN", "SALTON", "SOUCENT", "SOUCENT", "BEACH", "BEVHILLS"},
  637.     {"BEVHILLS", "BEVHILLS", "BEVHILLS", "BUSINESS", "BUSINESS", "BUSINESS", "BUSINESS", "EASTSA", "EASTSA", "EASTSA"},
  638.     {"EPSILON", "FITNESS", "FITNESS", "GENHOT", "GOLFER", "HIKER", "HIPPIE", "HIPSTER", "HIPSTER", "HIPSTER"},
  639.     {"HIPSTER", "INDIAN", "JUGGALO", "RUNNER", "RURMETH", "SCDRESSY", "SKATER", "SOUCENT", "SOUCENT", "SOUCENT"},
  640.     {"TENNIS", "TOPLESS", "TOURIST", "TOURIST", "VINEWOOD", "VINEWOOD", "VINEWOOD", "VINEWOOD", "YOGA", "ACULT"},
  641.     {"AFRIAMER", "BEACH", "BEACH", "BEVHILLS", "BEVHILLS", "BUSINESS", "EASTSA", "EASTSA", "FARMER", "FATLATIN"},
  642.     {"GENFAT", "GENFAT", "GOLFER", "HASJEW", "HILLBILLY", "HILLBILLY", "INDIAN", "KTOWN", "MALIBU", "MEXCNTRY"},
  643.     {"MEXLABOR", "OG_BOSS", "PAPARAZZI", "POLYNESIAN", "PROLHOST", "RURMETH", "SALTON", "SALTON", "SALTON", "SALTON"},
  644.     {"SKATER", "SKIDROW", "SOCENLAT", "SOUCENT", "SOUCENT", "SOUCENT", "SOUCENT", "STLAT", "TENNIS", "TOURIST"},
  645.     {"TRAMPBEAC", "TRAMP", "TRANVEST", "TRANVEST", "ACULT", "ACULT", "BEACH", "GENSTREET", "KTOWN", "SALTON"},
  646.     {"SOUCENT", "SOUCENT", "SOUCENT", "TRAMP", "ACULT", "ACULT", "BEACHVESP", "BEACHVESP", "BEACH", "BEACH"},
  647.     {"BEACH", "BEVHILLS", "BEVHILLS", "BREAKDANCE", "BUSICAS", "BUSINESS", "BUSINESS", "BUSINESS", "CYCLIST", "DHILL"},
  648.     {"DOWNTOWN", "EASTSA", "EASTSA", "EPSILON", "EPSILON", "GAY", "GAY", "GENSTREET", "GENSTREET", "GOLFER"},
  649.     {"HASJEW", "HIKER", "HIPPY", "HIPSTER", "HIPSTER", "HIPSTER", "INDIAN", "JETSKI", "JUGGALO", "KTOWN"},
  650.     {"KTOWN", "LATINO", "METHHEAD", "MEXTHUG", "MOTOX", "MOTOX", "MUSCLBEAC", "MUSCLBEAC", "POLYNESIAN", "ROADCYC"},
  651.     {"RUNNER", "RUNNER", "SALTON", "SKATER", "SKATER", "SOUCENT", "SOUCENT", "SOUCENT", "SOUCENT", "STBLA"},
  652.     {"STBLA", "STLAT", "STWHI", "STWHI", "SUNBATHE", "SURFER", "VINDOUCHE", "VINEWOOD", "VINEWOOD", "VINEWOOD"},
  653.     {"VINEWOOD", "YOGA", "PROLDRIVER", "RSRANGER", "SBIKE", "STAGGRM", "TATTOO", "ABIGAIL", "ANITA", "ANTON"},
  654.     {"BALLASOG", "BRIDE", "BURGERDRUG", "CAR3GUY1", "CAR3GUY2", "CHEF", "CHIN_GOON", "CLETUS", "COP", "CUSTOMER"},
  655.     {"DENISE_FRIEND", "FOS_REP", "G", "GROOM", "DLR", "HAO", "HUGH", "IMRAN", "JANITOR", "MAUDE"},
  656.     {"MWEATHER", "ORTEGA", "OSCAR", "PORNDUDES", "PORNDUDES_P", "PROLOGUEDRIVER", "PROLSEC", "GANG", "HIC", "HIPSTER"},
  657.     {"MARINE", "MEX", "REPORTER", "ROCCOPELOSI", "SCREEN_WRITER", "STRIPPER", "STRIPPER", "TONYA", "TRAFFICWARDEN", "AMANDATOWNLEY"},
  658.     {"ANDREAS", "ASHLEY", "BANKMAN", "BARRY", "BARRY_P", "BEVERLY", "BEVERLY_P", "BRAD", "BRADCADAVER", "CARBUYER"},
  659.     {"CASEY", "CHENGSR", "CHRISFORMAGE", "CLAY", "DALE", "DAVENORTON", "DEBRA", "DENISE", "DEVIN", "DOM"},
  660.     {"DREYFUSS", "DRFRIEDLANDER", "FABIEN", "FBISUIT", "FLOYD", "GUADALOPE", "GURK", "HUNTER", "JANET", "JEWELASS"},
  661.     {"JIMMYBOSTON", "JIMMYDISANTO", "JOEMINUTEMAN", "JOHNNYKLEBITZ", "JOSEF", "JOSH", "LAMARDAVIS", "LAZLOW", "LESTERCREST", "LIFEINVAD"},
  662.     {"MAGENTA", "MANUEL", "MARNIE", "MARTINMADRAZO", "MARYANN", "MICHELLE", "MILTON", "MOLLY", "MOVPREMF", "MOVPREMMALE"},
  663.     {"MRK", "MRSPHILLIPS", "MRS_THORNHILL", "NATALIA", "NERVOUSRON", "NIGEL", "OLD_MAN1A", "OLD_MAN2", "OMEGA", "ORLEANS"},
  664.     {"PAPER", "PAPER_P", "PATRICIA", "PRIEST", "PROLSEC", "RUSSIANDRUNK", "SIEMONYETARIAN", "SOLOMON", "STEVEHAINS", "STRETCH"},
  665.     {"TANISHA", "TAOCHENG", "TAOSTRANSLATOR", "TENNISCOACH", "TERRY", "TOM", "TOMEPSILON", "TRACYDISANTO", "WADE", "ZIMBOR"},
  666.     {"BALLAS", "FAMILIES", "LOST", "VAGOS", "ARMBOSS", "ARMGOON", "ARMLIEUT", "CHEMWORK", "CHEMWORK_P", "CHIBOSS"},
  667.     {"CHIBOSS_P", "CHICOLD", "CHICOLD_P", "CHIGOON", "CHIGOON_P", "CHIGOON", "KORBOSS", "MEXBOSS", "MEXBOSS", "ARMGOON"},
  668.     {"AZTECA", "BALLAEAST", "BALLAORIG", "BALLASOUT", "FAMCA", "FAMDNF", "FAMFOR", "KOREAN", "KOREAN", "KORLIEUT"},
  669.     {"LOST", "LOST", "LOST", "MEXGANG", "MEXGOON", "MEXGOON", "MEXGOON", "MEXGOON_P", "POLOGOON", "POLOGOON_P"},
  670.     {"POLOGOON", "POLOGOON_P", "SALVABOSS", "SALVAGOON", "SALVAGOON", "SALVAGOON", "SALVAGOON_P", "STRPUNK", "STRPUNK", "HC_DRIVER"},
  671.     {"HC_GUNMAN", "HC_HACKER", "ABIGAIL", "AMANDATOWNLEY", "ANDREAS", "ASHLEY", "BALLASOG", "BANKMAN", "BARRY", "BARRY_P"},
  672.     {"BESTMEN", "BEVERLY", "BEVERLY_P", "BRAD", "BRIDE", "CAR3GUY1", "CAR3GUY2", "CASEY", "CHEF", "CHENGSR"},
  673.     {"CHRISFORMAGE", "CLAY", "CLAYPAIN", "CLETUS", "DALE", "DAVENORTON", "DENISE", "DEVIN", "DOM", "DREYFUSS"},
  674.     {"DRFRIEDLANDER", "FABIEN", "FBISUIT", "FLOYD", "GROOM", "HAO", "HUNTER", "JANET", "JAY_NORRIS", "JEWELASS"},
  675.     {"JIMMYBOSTON", "JIMMYDISANTO", "JOEMINUTEMAN", "JOHNNYKLEBITZ", "JOSEF", "JOSH", "KERRYMCINTOSH", "LAMARDAVIS", "LAZLOW", "LESTERCREST"},
  676.     {"LIFEINVAD", "LIFEINVAD", "MAGENTA", "MANUEL", "MARNIE", "MARYANN", "MAUDE", "MICHELLE", "MILTON", "MOLLY"},
  677.     {"MRK", "MRSPHILLIPS", "MRS_THORNHILL", "NATALIA", "NERVOUSRON", "NIGEL", "OLD_MAN1A", "OLD_MAN2", "OMEGA", "ONEIL"},
  678.     {"ORLEANS", "ORTEGA", "PAPER", "PATRICIA", "PRIEST", "PROLSEC", "GANG", "HIC", "HIPSTER", "MEX"},
  679.     {"ROCCOPELOSI", "RUSSIANDRUNK", "SCREEN_WRITER", "SIEMONYETARIAN", "SOLOMON", "STEVEHAINS", "STRETCH", "TALINA", "TANISHA", "TAOCHENG"},
  680.     {"TAOSTRANSLATOR", "TAOSTRANSLATOR_P", "TENNISCOACH", "TERRY", "TOMEPSILON", "TONYA", "TRACYDISANTO", "TRAFFICWARDEN", "TYLERDIX", "WADE"},
  681.     {"ZIMBOR", "DEADHOOKER", "FREEMODE", "MISTY", "STRIPPERLITE", "PROS", "MP_HEADTARGETS", "CLAUDE", "EXARMY", "FAMDD"},
  682.     {"FIBSEC", "FREEMODE", "MARSTON", "NIKO", "SHOPKEEP", "ARMOURED", "NONE", "NONE", "NONE", "NONE"},
  683.     {"NONE", "FEMBARBER", "MAID", "SHOP_HIGH", "SWEATSHOP", "AIRHOSTESS", "BARTENDER", "BAYWATCH", "COP", "FACTORY"},
  684.     {"HOOKER", "HOOKER", "HOOKER", "MIGRANT", "MOVPREM", "RANGER", "SCRUBS", "SHERIFF", "SHOP_LOW", "SHOP_MID"},
  685.     {"STRIPPERLITE", "STRIPPER", "STRIPPER", "SWEATSHOP", "AMMUCOUNTRY", "ARMOURED", "ARMOURED", "AUTOSHOP", "AUTOSHOP", "BOUNCER"},
  686.     {"CHEMSEC", "CIASEC", "CNTRYBAR", "DOCKWORK", "DOCTOR", "FIBOFFICE", "FIBOFFICE", "GAFFER", "GARDENER", "GENTRANSPORT"},
  687.     {"HAIRDRESS", "HIGHSEC", "HIGHSEC", "JANITOR", "LATHANDY", "LIFEINVAD", "LINECOOK", "LSMETRO", "MARIACHI", "MARINE"},
  688.     {"MARINE", "MIGRANT", "ZOMBIE", "MOVPREM", "MOVSPACE", "PARAMEDIC", "PILOT", "PILOT", "POSTAL", "POSTAL"},
  689.     {"PRISGUARD", "SCIENTIST", "SECURITY", "SNOWCOP", "STRPERF", "STRPREACH", "STRVEND", "TRUCKER", "UPS", "UPS"},
  690.     {"BUSKER", "AIRWORKER", "AMMUCITY", "ARMYMECH", "AUTOPSY", "BARMAN", "BAYWATCH", "BLACKOPS", "BLACKOPS", "BUSBOY"},
  691.     {"CHEF", "CLOWN", "CONSTRUCT", "CONSTRUCT", "COP", "DEALER", "DEVINSEC", "DOCKWORK", "DOORMAN", "DWSERVICE"},
  692.     {"DWSERVICE", "FACTORY", "FIREMAN", "GARBAGE", "GRIP", "HWAYCOP", "MARINE", "MARINE", "MARINE", "MIME"},
  693.     {"PESTCONT", "PILOT", "PRISMUSCL", "PRISONER", "RANGER", "ROBBER", "SHERIFF", "SHOP_MASK", "STRVEND", "SWAT"},
  694.     {"USCG", "VALET", "WAITER", "WINCLEAN", "XMECH", "XMECH", "CORPSE", "MIRANDA", "PROMOURN", "MOVIESTAR"},
  695.     {"PROLHOST", "BIKERCHIC", "COMJANE", "CORPSE", "CORPSE", "HOTPOSH", "JEWELASS", "MISTRESS", "POPPYMICH", "PRINCESS"},
  696.     {"SPYACTRESS", "ALDINAPOLI", "BANKMAN", "BIKEHIRE", "FIBARCHITECT", "FILMDIRECTOR", "GLENSTANK", "GRIFF", "JESUS", "JEWELSEC"},
  697.     {"JEWELTHIEF", "MARKFOST", "PARTYTARGET", "PROLSEC", "PROMOURN", "RIVALPAP", "SPYACTOR", "WILLYFIST", "FINGURU", "TAPHILLBILLY"},
  698.     {"TRAMP", "ABNER", "ANTONB", "BABYD", "BAYGOR", "BURGERDRUG", "CHIP", "CYCLIST", "FIBMUGGER", "GUIDO"},
  699.     {"GUNVEND", "HIPPIE", "IMPORAGE", "JUSTIN", "MANI", "MILITARYBUM", "PAPARAZZI", "PARTY", "POGO", "PRISONER"},
  700.     {"BENNY", "G", "VAGSPEAK", "VAGFUN", "BOATSTAFF", "FEMBOATSTAFF", "", "", "", ""}
  701. };
  702.  
  703. int skinchangerActiveLineIndex = 0;
  704. int skinchangerActiveItemIndex = 0;
  705.  
  706. bool process_skinchanger_menu()
  707. {
  708.     DWORD waitTime = 150;
  709.     const int lineCount = 70;
  710.     const int itemCount = 10;
  711.     const int itemCountLastLine = 6;
  712.     while (true)
  713.     {
  714.         // timed menu draw, used for pause after active line switch
  715.         DWORD maxTickCount = GetTickCount() + waitTime;
  716.         do
  717.         {
  718.             // draw menu
  719.             char caption[32];
  720.             sprintf_s(caption, "SKIN CHANGER   %d / %d", skinchangerActiveLineIndex + 1, lineCount);
  721.             draw_menu_line(caption, 350.0, 15.0, 18.0, 0.0, 5.0, false, true);
  722.             for (int i = 0; i < itemCount; i++)
  723.                 if (strlen(pedModels[skinchangerActiveLineIndex][i]) || strcmp(pedModelNames[skinchangerActiveLineIndex][i], "NONE") == 0)
  724.                     draw_menu_line(pedModelNames[skinchangerActiveLineIndex][i], 100.0f, 5.0f, 200.0f, 100.0f + i * 110.0f, 5.0f, i == skinchangerActiveItemIndex, false, false);
  725.            
  726.             update_features();
  727.             WAIT(0);
  728.         } while (GetTickCount() < maxTickCount);
  729.         waitTime = 0;
  730.  
  731.         bool bSelect, bBack, bUp, bDown, bLeft, bRight;
  732.         get_button_state(&bSelect, &bBack, &bUp, &bDown, &bLeft, &bRight);
  733.        
  734.         if (bSelect)
  735.         {
  736.             menu_beep();
  737.             DWORD model = GAMEPLAY::GET_HASH_KEY((char *)pedModels[skinchangerActiveLineIndex][skinchangerActiveItemIndex]);
  738.             if (STREAMING::IS_MODEL_IN_CDIMAGE(model) && STREAMING::IS_MODEL_VALID(model))
  739.             {
  740.                 STREAMING::REQUEST_MODEL(model);               
  741.                 while (!STREAMING::HAS_MODEL_LOADED(model)) WAIT(0);
  742.                 //STREAMING::LOAD_ALL_OBJECTS_NOW();
  743.                 PLAYER::SET_PLAYER_MODEL(PLAYER::PLAYER_ID(), model);
  744.                 //PED::SET_PED_RANDOM_COMPONENT_VARIATION(PLAYER::PLAYER_PED_ID(), FALSE);
  745.                 PED::SET_PED_DEFAULT_COMPONENT_VARIATION(PLAYER::PLAYER_PED_ID());             
  746.                 WAIT(0);
  747.                 for (int i = 0; i < 12; i++)
  748.                     for (int j = 0; j < 100; j++)
  749.                     {
  750.                         int drawable = rand() % 10;
  751.                         int texture = rand() % 10;
  752.                         if (PED::IS_PED_COMPONENT_VARIATION_VALID(PLAYER::PLAYER_PED_ID(), i, drawable, texture))
  753.                         {
  754.                             PED::SET_PED_COMPONENT_VARIATION(PLAYER::PLAYER_PED_ID(), i, drawable, texture, 0);
  755.                             break;
  756.                         }
  757.                     }
  758.                 skinchanger_used = true;
  759.                 WAIT(100);
  760.                 STREAMING::SET_MODEL_AS_NO_LONGER_NEEDED(model);               
  761.                 waitTime = 200;
  762.             }
  763.         } else
  764.         if (bBack)
  765.         {
  766.             menu_beep();
  767.             break;
  768.         } else
  769.         if (bRight)
  770.         {
  771.             menu_beep();
  772.             skinchangerActiveItemIndex++;
  773.             int itemsMax = (skinchangerActiveLineIndex == (lineCount - 1)) ? itemCountLastLine : itemCount;
  774.             if (skinchangerActiveItemIndex == itemsMax)
  775.                 skinchangerActiveItemIndex = 0;        
  776.             waitTime = 100;
  777.         } else
  778.         if (bLeft)
  779.         {
  780.             menu_beep();
  781.             if (skinchangerActiveItemIndex == 0)
  782.                 skinchangerActiveItemIndex = (skinchangerActiveLineIndex == (lineCount - 1)) ? itemCountLastLine : itemCount;
  783.             skinchangerActiveItemIndex--;
  784.             waitTime = 100;
  785.         } else
  786.         if (bUp)
  787.         {
  788.             menu_beep();
  789.             if (skinchangerActiveLineIndex == 0)
  790.                 skinchangerActiveLineIndex = lineCount;
  791.             skinchangerActiveLineIndex--;
  792.             waitTime = 200;
  793.         } else
  794.         if (bDown)
  795.         {
  796.             menu_beep();
  797.             skinchangerActiveLineIndex++;
  798.             if (skinchangerActiveLineIndex == lineCount)
  799.                 skinchangerActiveLineIndex = 0;        
  800.             waitTime = 200;
  801.         }
  802.         if (skinchangerActiveLineIndex == (lineCount - 1))
  803.             if (skinchangerActiveItemIndex >= itemCountLastLine)
  804.                 skinchangerActiveItemIndex = 0;
  805.     }
  806.     return false;
  807. }
  808.  
  809. int teleportActiveLineIndex = 0;
  810.  
  811. bool process_teleport_menu()
  812. {
  813.     const float lineWidth = 250.0;
  814.     const int lineCount = 17;
  815.  
  816.     std::string caption = "TELEPORT";
  817.  
  818.     static struct {
  819.         LPCSTR  text;
  820.         float x;
  821.         float y;
  822.         float z;
  823.     } lines[lineCount] = {
  824.             { "MARKER" },
  825.             { "MICHAEL'S HOUSE", -852.4f, 160.0f, 65.6f },
  826.             { "FRANKLIN'S HOUSE", 7.9f, 548.1f, 175.5f },
  827.             { "TREVOR'S TRAILER", 1985.7f, 3812.2f, 32.2f },
  828.             { "AIRPORT ENTRANCE", -1034.6f, -2733.6f, 13.8f },
  829.             { "AIRPORT FIELD", -1336.0f, -3044.0f, 13.9f },
  830.             { "ELYSIAN ISLAND", 338.2f, -2715.9f, 38.5f },
  831.             { "JETSAM", 760.4f, -2943.2f, 5.8f },
  832.             { "STRIPCLUB", 127.4f, -1307.7f, 29.2f },
  833.             { "ELBURRO HEIGHTS", 1384.0f, -2057.1f, 52.0f },
  834.             { "FERRIS WHEEL", -1670.7f, -1125.0f, 13.0f },
  835.             { "CHUMASH", -3192.6f, 1100.0f, 20.2f },
  836.             { "WINDFARM", 2354.0f, 1830.3f, 101.1f },
  837.             { "MILITARY BASE", -2047.4f, 3132.1f, 32.8f },
  838.             { "MCKENZIE AIRFIELD", 2121.7f, 4796.3f, 41.1f },
  839.             { "DESERT AIRFIELD", 1747.0f, 3273.7f, 41.1f },
  840.             { "CHILLIAD", 425.4f, 5614.3f, 766.5f }
  841.     };
  842.  
  843.     DWORD waitTime = 150;
  844.     while (true)
  845.     {
  846.         // timed menu draw, used for pause after active line switch
  847.         DWORD maxTickCount = GetTickCount() + waitTime;
  848.         do
  849.         {
  850.             // draw menu
  851.             draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
  852.             for (int i = 0; i < lineCount; i++)
  853.                 if (i != teleportActiveLineIndex)
  854.                     draw_menu_line(lines[i].text, lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
  855.             draw_menu_line(lines[teleportActiveLineIndex].text, lineWidth + 1.0, 11.0, 56.0 + teleportActiveLineIndex * 36.0, 0.0, 7.0, true, false);
  856.  
  857.             update_features();
  858.             WAIT(0);
  859.         } while (GetTickCount() < maxTickCount);
  860.         waitTime = 0;
  861.  
  862.         // process buttons
  863.         bool bSelect, bBack, bUp, bDown;
  864.         get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
  865.         if (bSelect)
  866.         {
  867.             menu_beep();
  868.  
  869.             // get entity to teleport
  870.             Entity e = PLAYER::PLAYER_PED_ID();
  871.             if (PED::IS_PED_IN_ANY_VEHICLE(e, 0))
  872.                 e = PED::GET_VEHICLE_PED_IS_USING(e);
  873.  
  874.             // get coords
  875.             Vector3 coords;
  876.             bool success = false;
  877.             if (teleportActiveLineIndex == 0) // marker
  878.             {          
  879.                 bool blipFound = false;
  880.                 // search for marker blip
  881.                 int blipIterator = UI::_GET_BLIP_INFO_ID_ITERATOR();
  882.                 for (Blip i = UI::GET_FIRST_BLIP_INFO_ID(blipIterator); UI::DOES_BLIP_EXIST(i) != 0; i = UI::GET_NEXT_BLIP_INFO_ID(blipIterator))
  883.                 {
  884.                     if (UI::GET_BLIP_INFO_ID_TYPE(i) == 4)
  885.                     {
  886.                         coords = UI::GET_BLIP_INFO_ID_COORD(i);
  887.                         blipFound = true;
  888.                         break;
  889.                     }
  890.                 }  
  891.                 if (blipFound)
  892.                 {
  893.                     // load needed map region and check height levels for ground existence
  894.                     bool groundFound = false;
  895.                     static float groundCheckHeight[] = {
  896.                         100.0, 150.0, 50.0, 0.0, 200.0, 250.0, 300.0, 350.0, 400.0,
  897.                         450.0, 500.0, 550.0, 600.0, 650.0, 700.0, 750.0, 800.0
  898.                     };                 
  899.                     for (int i = 0; i < sizeof(groundCheckHeight) / sizeof(float); i++)
  900.                     {
  901.                         ENTITY::SET_ENTITY_COORDS_NO_OFFSET(e, coords.x, coords.y, groundCheckHeight[i], 0, 0, 1);
  902.                         WAIT(100);
  903.                         if (GAMEPLAY::GET_GROUND_Z_FOR_3D_COORD(coords.x, coords.y, groundCheckHeight[i], &coords.z, FALSE))
  904.                         {
  905.                             groundFound = true;
  906.                             coords.z += 3.0;
  907.                             break;
  908.                         }
  909.                     }
  910.                     // if ground not found then set Z in air and give player a parachute
  911.                     if (!groundFound)
  912.                     {
  913.                         coords.z = 1000.0;
  914.                         WEAPON::GIVE_DELAYED_WEAPON_TO_PED(PLAYER::PLAYER_PED_ID(), 0xFBAB5776, 1, 0);
  915.                     }
  916.                     success = true;
  917.                 } else
  918.                 {
  919.                     set_status_text("map marker isn't set");
  920.                 }
  921.  
  922.             } else // predefined coords
  923.             {
  924.                 coords.x = lines[teleportActiveLineIndex].x;
  925.                 coords.y = lines[teleportActiveLineIndex].y;
  926.                 coords.z = lines[teleportActiveLineIndex].z;
  927.                 success = true;
  928.             }
  929.  
  930.             // set player pos
  931.             if (success)
  932.             {
  933.                 ENTITY::SET_ENTITY_COORDS_NO_OFFSET(e, coords.x, coords.y, coords.z, 0, 0, 1);
  934.                 WAIT(0);
  935.                 set_status_text("teleported");
  936.                 return true;
  937.             }
  938.            
  939.             waitTime = 200;
  940.         } else
  941.         if (bBack || trainer_switch_pressed())
  942.         {
  943.             menu_beep();
  944.             break;
  945.         } else
  946.         if (bUp)
  947.         {
  948.             menu_beep();
  949.             if (teleportActiveLineIndex == 0)
  950.                 teleportActiveLineIndex = lineCount;
  951.             teleportActiveLineIndex--;
  952.             waitTime = 150;
  953.         } else
  954.         if (bDown)
  955.         {
  956.             menu_beep();
  957.             teleportActiveLineIndex++;
  958.             if (teleportActiveLineIndex == lineCount)
  959.                 teleportActiveLineIndex = 0;           
  960.             waitTime = 150;
  961.         }
  962.     }
  963.     return false;
  964. }
  965.  
  966. std::string line_as_str(std::string text, bool *pState)
  967. {
  968.     while (text.size() < 18) text += " ";
  969.     return text + (pState ? (*pState ? " ~b~On" : " ~r~Off") : "");
  970. }
  971.  
  972. int activeLineIndexPlayer = 0;
  973.  
  974. void process_player_menu()
  975. {
  976.     const float lineWidth = 250.0;
  977.     const int lineCount = 16;
  978.    
  979.     std::string caption = "PLAYER  OPTIONS";
  980.  
  981.     static struct {
  982.         LPCSTR      text;
  983.         bool        *pState;
  984.         bool        *pUpdated;
  985.     } lines[lineCount] = {
  986.         {"SKIN CHANGER", NULL, NULL}, //case 0
  987.         {"TELEPORT", NULL, NULL},
  988.         {"FIX PLAYER", NULL, NULL},
  989.         {"RESET SKIN", NULL, NULL},
  990.         {"ADD CASH", NULL, NULL},
  991.         {"WANTED UP", NULL, NULL},
  992.         {"WANTED DOWN", NULL, NULL},
  993.         {"NEVER WANTED", &featurePlayerNeverWanted, NULL},
  994.         {"INVINCIBLE", &featurePlayerInvincible, &featurePlayerInvincibleUpdated},
  995.         {"POLICE IGNORED", &featurePlayerIgnored, &featurePlayerIgnoredUpdated},
  996.         {"UNLIM ABILITY", &featurePlayerUnlimitedAbility, NULL},
  997.         {"NOISELESS", &featurePlayerNoNoise, &featurePlayerNoNoiseUpdated},
  998.         {"FAST SWIM", &featurePlayerFastSwim, &featurePlayerFastSwimUpdated},
  999.         {"FAST RUN", &featurePlayerFastRun, &featurePlayerFastRunUpdated},
  1000.         {"SUPER JUMP", &featurePlayerSuperJump, NULL},
  1001.         {"ULTRA JUMP", &featurePlayerUltraJump, NULL },
  1002.     };
  1003.  
  1004.     DWORD waitTime = 150;
  1005.     while (true)
  1006.     {
  1007.         // timed menu draw, used for pause after active line switch
  1008.         DWORD maxTickCount = GetTickCount() + waitTime;
  1009.         do
  1010.         {
  1011.             // draw menu
  1012.             draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
  1013.             for (int i = 0; i < lineCount; i++)
  1014.                 if (i != activeLineIndexPlayer)
  1015.                     draw_menu_line(line_as_str(lines[i].text, lines[i].pState),
  1016.                                    lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
  1017.             draw_menu_line(line_as_str(lines[activeLineIndexPlayer].text, lines[activeLineIndexPlayer].pState),
  1018.                            lineWidth + 1.0, 11.0, 56.0 + activeLineIndexPlayer * 36.0, 0.0, 7.0, true, false);
  1019.  
  1020.             update_features();
  1021.             WAIT(0);
  1022.         } while (GetTickCount() < maxTickCount);
  1023.         waitTime = 0;
  1024.  
  1025.         // process buttons
  1026.         bool bSelect, bBack, bUp, bDown;
  1027.         get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
  1028.         if (bSelect)
  1029.         {
  1030.             menu_beep();
  1031.  
  1032.             // common variables
  1033.             BOOL bPlayerExists = ENTITY::DOES_ENTITY_EXIST(PLAYER::PLAYER_PED_ID());
  1034.             Player player = PLAYER::PLAYER_ID();
  1035.             Ped playerPed = PLAYER::PLAYER_PED_ID();
  1036.  
  1037.             switch (activeLineIndexPlayer)
  1038.             {
  1039.                 // skin changer
  1040.                 case 0:
  1041.                     if (process_skinchanger_menu()) return;
  1042.                     break;
  1043.                 // teleport
  1044.                 case 1:
  1045.                     if (process_teleport_menu()) return;
  1046.                     break;
  1047.                 // fix player
  1048.                 case 2:
  1049.                     {
  1050.                         ENTITY::SET_ENTITY_HEALTH(playerPed, ENTITY::GET_ENTITY_MAX_HEALTH(playerPed));
  1051.                         PED::ADD_ARMOUR_TO_PED(playerPed, PLAYER::GET_PLAYER_MAX_ARMOUR(player) - PED::GET_PED_ARMOUR(playerPed));
  1052.                         if (PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
  1053.                         {
  1054.                             Vehicle playerVeh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
  1055.                             if (ENTITY::DOES_ENTITY_EXIST(playerVeh) && !ENTITY::IS_ENTITY_DEAD(playerVeh))
  1056.                                 VEHICLE::SET_VEHICLE_FIXED(playerVeh);
  1057.                         }
  1058.                         set_status_text("player fixed");
  1059.                     }
  1060.                     break;
  1061.                 // reset model skin
  1062.                 case 3:
  1063.                     {
  1064.                         PED::SET_PED_DEFAULT_COMPONENT_VARIATION(playerPed);
  1065.                         set_status_text("using default model skin");
  1066.                     }
  1067.                     break;
  1068.                 // add cash
  1069.                 case 4:
  1070.                     for (int i = 0; i < 3; i++)
  1071.                     {
  1072.                         char statNameFull[32];
  1073.                         sprintf_s(statNameFull, "SP%d_TOTAL_CASH", i);
  1074.                         Hash hash = GAMEPLAY::GET_HASH_KEY(statNameFull);
  1075.                         int val;
  1076.                         STATS::STAT_GET_INT(hash, &val, -1);
  1077.                         val += 1000000;
  1078.                         STATS::STAT_SET_INT(hash, val, 1);
  1079.                     }
  1080.                     set_status_text("cash added");
  1081.                     break;
  1082.                 // wanted up
  1083.                 case 5:
  1084.                     if (bPlayerExists && PLAYER::GET_PLAYER_WANTED_LEVEL(player) < 5)
  1085.                     {
  1086.                         PLAYER::SET_PLAYER_WANTED_LEVEL(player, PLAYER::GET_PLAYER_WANTED_LEVEL(player) + 1, 0);
  1087.                         PLAYER::SET_PLAYER_WANTED_LEVEL_NOW(player, 0);
  1088.                         set_status_text("wanted up");
  1089.                     }
  1090.                     break;
  1091.                 // wanted down
  1092.                 case 6:
  1093.                     if (bPlayerExists && PLAYER::GET_PLAYER_WANTED_LEVEL(player) > 0)
  1094.                     {
  1095.                         PLAYER::SET_PLAYER_WANTED_LEVEL(player, PLAYER::GET_PLAYER_WANTED_LEVEL(player) - 1, 0);
  1096.                         PLAYER::SET_PLAYER_WANTED_LEVEL_NOW(player, 0);
  1097.                         set_status_text("wanted down");
  1098.                     }
  1099.                     break;
  1100.                 // switchable features
  1101.                 default:
  1102.                     if (lines[activeLineIndexPlayer].pState)
  1103.                         *lines[activeLineIndexPlayer].pState = !(*lines[activeLineIndexPlayer].pState);
  1104.                     if (lines[activeLineIndexPlayer].pUpdated)
  1105.                         *lines[activeLineIndexPlayer].pUpdated = true;                 
  1106.             }
  1107.             waitTime = 200;
  1108.         } else
  1109.         if (bBack || trainer_switch_pressed())
  1110.         {
  1111.             menu_beep();
  1112.             break;
  1113.         } else
  1114.         if (bUp)
  1115.         {
  1116.             menu_beep();
  1117.             if (activeLineIndexPlayer == 0)
  1118.                 activeLineIndexPlayer = lineCount;
  1119.             activeLineIndexPlayer--;
  1120.             waitTime = 150;
  1121.         } else
  1122.         if (bDown)
  1123.         {
  1124.             menu_beep();
  1125.             activeLineIndexPlayer++;
  1126.             if (activeLineIndexPlayer == lineCount)
  1127.                 activeLineIndexPlayer = 0;         
  1128.             waitTime = 150;
  1129.         }
  1130.     }
  1131. }
  1132.  
  1133. int activeLineIndexWeapon = 0;
  1134.  
  1135. void process_weapon_menu()
  1136. {
  1137.     const float lineWidth = 250.0;
  1138.     const int lineCount = 6;
  1139.  
  1140.     std::string caption = "WEAPON  OPTIONS";
  1141.  
  1142.     static struct {
  1143.         LPCSTR      text;
  1144.         bool        *pState;
  1145.         bool        *pUpdated;
  1146.     } lines[lineCount] = {
  1147.         {"GET ALL WEAPON"NULL,                         NULL},
  1148.         {"NO RELOAD",       &featureWeaponNoReload,       NULL},
  1149.         {"FIRE AMMO",       &featureWeaponFireAmmo,       NULL},
  1150.         {"EXPLOSIVE AMMO",  &featureWeaponExplosiveAmmo,  NULL},
  1151.         {"EXPLOSIVE MELEE", &featureWeaponExplosiveMelee, NULL},
  1152.         {"VEHICLE ROCKETS", &featureWeaponVehRockets,     NULL}
  1153.     };
  1154.  
  1155.     static LPCSTR weaponNames[] = {
  1156.         "WEAPON_KNIFE", "WEAPON_NIGHTSTICK", "WEAPON_HAMMER", "WEAPON_BAT", "WEAPON_GOLFCLUB", "WEAPON_CROWBAR",
  1157.         "WEAPON_PISTOL", "WEAPON_COMBATPISTOL", "WEAPON_APPISTOL", "WEAPON_PISTOL50", "WEAPON_MICROSMG", "WEAPON_SMG",
  1158.         "WEAPON_ASSAULTSMG", "WEAPON_ASSAULTRIFLE", "WEAPON_CARBINERIFLE", "WEAPON_ADVANCEDRIFLE", "WEAPON_MG",
  1159.         "WEAPON_COMBATMG", "WEAPON_PUMPSHOTGUN", "WEAPON_SAWNOFFSHOTGUN", "WEAPON_ASSAULTSHOTGUN", "WEAPON_BULLPUPSHOTGUN",
  1160.         "WEAPON_STUNGUN", "WEAPON_SNIPERRIFLE", "WEAPON_HEAVYSNIPER", "WEAPON_GRENADELAUNCHER", "WEAPON_GRENADELAUNCHER_SMOKE",
  1161.         "WEAPON_RPG", "WEAPON_MINIGUN", "WEAPON_GRENADE", "WEAPON_STICKYBOMB", "WEAPON_SMOKEGRENADE", "WEAPON_BZGAS",
  1162.         "WEAPON_MOLOTOV", "WEAPON_FIREEXTINGUISHER", "WEAPON_PETROLCAN",
  1163.         "WEAPON_SNSPISTOL", "WEAPON_SPECIALCARBINE", "WEAPON_HEAVYPISTOL", "WEAPON_BULLPUPRIFLE", "WEAPON_HOMINGLAUNCHER",
  1164.         "WEAPON_PROXMINE", "WEAPON_SNOWBALL", "WEAPON_VINTAGEPISTOL", "WEAPON_DAGGER", "WEAPON_FIREWORK", "WEAPON_MUSKET",
  1165.         "WEAPON_MARKSMANRIFLE", "WEAPON_HEAVYSHOTGUN", "WEAPON_GUSENBERG", "WEAPON_HATCHET", "WEAPON_RAILGUN",
  1166.         "WEAPON_COMBATPDW", "WEAPON_KNUCKLE", "WEAPON_MARKSMANPISTOL",
  1167.         "WEAPON_FLASHLIGHT", "WEAPON_MACHETE", "WEAPON_MACHINEPISTOL",
  1168.         "WEAPON_SWITCHBLADE", "WEAPON_REVOLVER"
  1169.     };
  1170.  
  1171.     DWORD waitTime = 150;
  1172.     while (true)
  1173.     {
  1174.         // timed menu draw, used for pause after active line switch
  1175.         DWORD maxTickCount = GetTickCount() + waitTime;
  1176.         do
  1177.         {
  1178.             // draw menu
  1179.             draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
  1180.             for (int i = 0; i < lineCount; i++)
  1181.                 if (i != activeLineIndexWeapon)
  1182.                     draw_menu_line(line_as_str(lines[i].text, lines[i].pState),
  1183.                                    lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
  1184.             draw_menu_line(line_as_str(lines[activeLineIndexWeapon].text, lines[activeLineIndexWeapon].pState),
  1185.                            lineWidth + 1.0, 11.0, 56.0 + activeLineIndexWeapon * 36.0, 0.0, 7.0, true, false);
  1186.  
  1187.             update_features();
  1188.             WAIT(0);
  1189.         } while (GetTickCount() < maxTickCount);
  1190.         waitTime = 0;
  1191.  
  1192.         // process buttons
  1193.         bool bSelect, bBack, bUp, bDown;
  1194.         get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
  1195.         if (bSelect)
  1196.         {
  1197.             menu_beep();
  1198.  
  1199.             // common variables
  1200.             BOOL bPlayerExists = ENTITY::DOES_ENTITY_EXIST(PLAYER::PLAYER_PED_ID());
  1201.             Player player = PLAYER::PLAYER_ID();
  1202.             Ped playerPed = PLAYER::PLAYER_PED_ID();
  1203.  
  1204.             switch (activeLineIndexWeapon)
  1205.             {
  1206.                 case 0:
  1207.                     for (int i = 0; i < sizeof(weaponNames) / sizeof(weaponNames[0]); i++)
  1208.                         WEAPON::GIVE_DELAYED_WEAPON_TO_PED(playerPed, GAMEPLAY::GET_HASH_KEY((char *)weaponNames[i]), 1000, 0);
  1209.                     set_status_text("all weapon added");
  1210.                     break;
  1211.                 // switchable features
  1212.                 default:
  1213.                     if (lines[activeLineIndexWeapon].pState)
  1214.                         *lines[activeLineIndexWeapon].pState = !(*lines[activeLineIndexWeapon].pState);
  1215.                     if (lines[activeLineIndexWeapon].pUpdated)
  1216.                         *lines[activeLineIndexWeapon].pUpdated = true;                 
  1217.             }
  1218.             waitTime = 200;
  1219.         } else
  1220.         if (bBack || trainer_switch_pressed())
  1221.         {
  1222.             menu_beep();
  1223.             break;
  1224.         } else
  1225.         if (bUp)
  1226.         {
  1227.             menu_beep();
  1228.             if (activeLineIndexWeapon == 0)
  1229.                 activeLineIndexWeapon = lineCount;
  1230.             activeLineIndexWeapon--;
  1231.             waitTime = 150;
  1232.         } else
  1233.         if (bDown)
  1234.         {
  1235.             menu_beep();
  1236.             activeLineIndexWeapon++;
  1237.             if (activeLineIndexWeapon == lineCount)
  1238.                 activeLineIndexWeapon = 0;         
  1239.             waitTime = 150;
  1240.         }
  1241.     }
  1242. }
  1243.  
  1244. LPCSTR vehicleModels[40][10] = {
  1245.     {"NINEF", "NINEF2", "BLISTA", "ASEA", "ASEA2", "BOATTRAILER", "BUS", "ARMYTANKER", "ARMYTRAILER", "ARMYTRAILER2"},
  1246.     {"SUNTRAP", "COACH", "AIRBUS", "ASTEROPE", "AIRTUG", "AMBULANCE", "BARRACKS", "BARRACKS2", "BALLER", "BALLER2"},
  1247.     {"BJXL", "BANSHEE", "BENSON", "BFINJECTION", "BIFF", "BLAZER", "BLAZER2", "BLAZER3", "BISON", "BISON2"},
  1248.     {"BISON3", "BOXVILLE", "BOXVILLE2", "BOXVILLE3", "BOBCATXL", "BODHI2", "BUCCANEER", "BUFFALO", "BUFFALO2", "BULLDOZER"},
  1249.     {"BULLET", "BLIMP", "BURRITO", "BURRITO2", "BURRITO3", "BURRITO4", "BURRITO5", "CAVALCADE", "CAVALCADE2", "POLICET"},
  1250.     {"GBURRITO", "CABLECAR", "CADDY", "CADDY2", "CAMPER", "CARBONIZZARE", "CHEETAH", "COMET2", "COGCABRIO", "COQUETTE"},
  1251.     {"CUTTER", "GRESLEY", "DILETTANTE", "DILETTANTE2", "DUNE", "DUNE2", "HOTKNIFE", "DLOADER", "DUBSTA", "DUBSTA2"},
  1252.     {"DUMP", "RUBBLE", "DOCKTUG", "DOMINATOR", "EMPEROR", "EMPEROR2", "EMPEROR3", "ENTITYXF", "EXEMPLAR", "ELEGY2"},
  1253.     {"F620", "FBI", "FBI2", "FELON", "FELON2", "FELTZER2", "FIRETRUK", "FLATBED", "FORKLIFT", "FQ2"},
  1254.     {"FUSILADE", "FUGITIVE", "FUTO", "GRANGER", "GAUNTLET", "HABANERO", "HAULER", "HANDLER", "INFERNUS", "INGOT"},
  1255.     {"INTRUDER", "ISSI2", "JACKAL", "JOURNEY", "JB700", "KHAMELION", "LANDSTALKER", "LGUARD", "MANANA", "MESA"},
  1256.     {"MESA2", "MESA3", "CRUSADER", "MINIVAN", "MIXER", "MIXER2", "MONROE", "MOWER", "MULE", "MULE2"},
  1257.     {"ORACLE", "ORACLE2", "PACKER", "PATRIOT", "PBUS", "PENUMBRA", "PEYOTE", "PHANTOM", "PHOENIX", "PICADOR"},
  1258.     {"POUNDER", "POLICE", "POLICE4", "POLICE2", "POLICE3", "POLICEOLD1", "POLICEOLD2", "PONY", "PONY2", "PRAIRIE"},
  1259.     {"PRANGER", "PREMIER", "PRIMO", "PROPTRAILER", "RANCHERXL", "RANCHERXL2", "RAPIDGT", "RAPIDGT2", "RADI", "RATLOADER"},
  1260.     {"REBEL", "REGINA", "REBEL2", "RENTALBUS", "RUINER", "RUMPO", "RUMPO2", "RHINO", "RIOT", "RIPLEY"},
  1261.     {"ROCOTO", "ROMERO", "SABREGT", "SADLER", "SADLER2", "SANDKING", "SANDKING2", "SCHAFTER2", "SCHWARZER", "SCRAP"},
  1262.     {"SEMINOLE", "SENTINEL", "SENTINEL2", "ZION", "ZION2", "SERRANO", "SHERIFF", "SHERIFF2", "SPEEDO", "SPEEDO2"},
  1263.     {"STANIER", "STINGER", "STINGERGT", "STOCKADE", "STOCKADE3", "STRATUM", "SULTAN", "SUPERD", "SURANO", "SURFER"},
  1264.     {"SURFER2", "SURGE", "TACO", "TAILGATER", "TAXI", "TRASH", "TRACTOR", "TRACTOR2", "TRACTOR3", "GRAINTRAILER"},
  1265.     {"BALETRAILER", "TIPTRUCK", "TIPTRUCK2", "TORNADO", "TORNADO2", "TORNADO3", "TORNADO4", "TOURBUS", "TOWTRUCK", "TOWTRUCK2"},
  1266.     {"UTILLITRUCK", "UTILLITRUCK2", "UTILLITRUCK3", "VOODOO2", "WASHINGTON", "STRETCH", "YOUGA", "ZTYPE", "SANCHEZ", "SANCHEZ2"},
  1267.     {"SCORCHER", "TRIBIKE", "TRIBIKE2", "TRIBIKE3", "FIXTER", "CRUISER", "BMX", "POLICEB", "AKUMA", "CARBONRS"},
  1268.     {"BAGGER", "BATI", "BATI2", "RUFFIAN", "DAEMON", "DOUBLE", "PCJ", "VADER", "VIGERO", "FAGGIO2"},
  1269.     {"HEXER", "ANNIHILATOR", "BUZZARD", "BUZZARD2", "CARGOBOB", "CARGOBOB2", "CARGOBOB3", "SKYLIFT", "POLMAV", "MAVERICK"},
  1270.     {"NEMESIS", "FROGGER", "FROGGER2", "CUBAN800", "DUSTER", "STUNT", "MAMMATUS", "JET", "SHAMAL", "LUXOR"},
  1271.     {"TITAN", "LAZER", "CARGOPLANE", "SQUALO", "MARQUIS", "DINGHY", "DINGHY2", "JETMAX", "PREDATOR", "TROPIC"},
  1272.     {"SEASHARK", "SEASHARK2", "SUBMERSIBLE", "TRAILERS", "TRAILERS2", "TRAILERS3", "TVTRAILER", "RAKETRAILER", "TANKER", "TRAILERLOGS"},
  1273.     {"TR2", "TR3", "TR4", "TRFLAT", "TRAILERSMALL", "VELUM", "ADDER", "VOLTIC", "VACCA", "BIFTA"},
  1274.     { "SPEEDER", "PARADISE", "KALAHARI", "JESTER", "TURISMOR", "VESTRA", "ALPHA", "HUNTLEY", "THRUST", "MASSACRO" },
  1275.     { "MASSACRO2", "ZENTORNO", "BLADE", "GLENDALE", "PANTO", "PIGALLE", "WARRENER", "RHAPSODY", "DUBSTA3", "MONSTER" },
  1276.     { "SOVEREIGN", "INNOVATION", "HAKUCHOU", "FUROREGT", "MILJET", "COQUETTE2", "BTYPE", "BUFFALO3", "DOMINATOR2", "GAUNTLET2" },
  1277.     { "MARSHALL", "DUKES", "DUKES2", "STALION", "STALION2", "BLISTA2", "BLISTA3", "DODO", "SUBMERSIBLE2", "HYDRA" },
  1278.     { "INSURGENT", "INSURGENT2", "TECHNICAL", "SAVAGE", "VALKYRIE", "KURUMA", "KURUMA2", "JESTER2", "CASCO", "VELUM2" },
  1279.     { "GUARDIAN", "ENDURO", "LECTRO", "SLAMVAN", "SLAMVAN2", "RATLOADER2", "SWIFT2", "LUXOR2", "FELTZER3", "OSIRIS" },
  1280.     { "VIRGO", "WINDSOR", "BESRA", "SWIFT", "BLIMP2", "VINDICATOR", "TORO", "T20", "COQUETTE3", "CHINO" },
  1281.     { "BRAWLER", "BUCCANEER2", "CHINO2", "FACTION", "FACTION2", "MOONBEAM", "MOONBEAM2", "PRIMO2", "VOODOO", "LURCHER" },
  1282.     { "BTYPE2", "BALLER3", "BALLER4", "BALLER5", "BALLER6", "CARGOBOB4", "COG55", "COG552", "COGNOSCENTI", "COGNOSCENTI2" },
  1283.     { "DINGHY4", "LIMO2", "MAMBA", "NIGHTSHADE", "SCHAFTER3", "SCHAFTER4", "SCHAFTER5", "SCHAFTER6", "SEASHARK3", "SPEEDER2" },
  1284.     { "SUPERVOLITO", "SUPERVOLITO2", "TORO2", "TROPIC2", "VALKYRIE2", "VERLIERER2", "TAMPA", "BANSHEE2", "SULTANRS", "BTYPE3" }
  1285. };
  1286.  
  1287. int carspawnActiveLineIndex = 0;
  1288. int carspawnActiveItemIndex = 0;
  1289.  
  1290. bool process_carspawn_menu()
  1291. {
  1292.     DWORD waitTime = 150;
  1293.     const int lineCount = 40;
  1294.     const int itemCount = 10;
  1295.     const int itemCountLastLine = 10;
  1296.     while (true)
  1297.     {
  1298.         // timed menu draw, used for pause after active line switch
  1299.         DWORD maxTickCount = GetTickCount() + waitTime;
  1300.         do
  1301.         {
  1302.             // draw menu
  1303.             char caption[32];
  1304.             sprintf_s(caption, "CAR SPAWNER   %d / %d", carspawnActiveLineIndex + 1, lineCount);
  1305.             draw_menu_line(caption, 350.0, 15.0, 18.0, 0.0, 5.0, false, true);
  1306.             for (int i = 0; i < itemCount; i++)
  1307.                 if (strlen(vehicleModels[carspawnActiveLineIndex][i]))
  1308.                     draw_menu_line(vehicleModels[carspawnActiveLineIndex][i], 100.0, 5.0, 200.0, 100.0 + i * 110.0, 5.0, i == carspawnActiveItemIndex, false, false);
  1309.            
  1310.             update_features();
  1311.             WAIT(0);
  1312.         } while (GetTickCount() < maxTickCount);
  1313.         waitTime = 0;
  1314.  
  1315.         bool bSelect, bBack, bUp, bDown, bLeft, bRight;
  1316.         get_button_state(&bSelect, &bBack, &bUp, &bDown, &bLeft, &bRight);
  1317.        
  1318.         if (bSelect)
  1319.         {
  1320.             menu_beep();
  1321.             LPCSTR modelName = vehicleModels[carspawnActiveLineIndex][carspawnActiveItemIndex];
  1322.             DWORD model = GAMEPLAY::GET_HASH_KEY((char *)modelName);
  1323.             if (STREAMING::IS_MODEL_IN_CDIMAGE(model) && STREAMING::IS_MODEL_A_VEHICLE(model))
  1324.             {
  1325.                 STREAMING::REQUEST_MODEL(model);               
  1326.                 while (!STREAMING::HAS_MODEL_LOADED(model)) WAIT(0);
  1327.                 Vector3 coords = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER::PLAYER_PED_ID(), 0.0, 5.0, 0.0);
  1328.                 Vehicle veh = VEHICLE::CREATE_VEHICLE(model, coords.x, coords.y, coords.z, 0.0, 1, 1);
  1329.                 VEHICLE::SET_VEHICLE_ON_GROUND_PROPERLY(veh);
  1330.  
  1331.                 if (featureVehWrapInSpawned)
  1332.                 {
  1333.                     ENTITY::SET_ENTITY_HEADING(veh, ENTITY::GET_ENTITY_HEADING(PLAYER::PLAYER_PED_ID()));
  1334.                     PED::SET_PED_INTO_VEHICLE(PLAYER::PLAYER_PED_ID(), veh, -1);
  1335.                 }
  1336.  
  1337.                 WAIT(0);
  1338.                 STREAMING::SET_MODEL_AS_NO_LONGER_NEEDED(model);
  1339.                 ENTITY::SET_VEHICLE_AS_NO_LONGER_NEEDED(&veh);
  1340.  
  1341.                 char statusText[32];
  1342.                 sprintf_s(statusText, "%s spawned", modelName);
  1343.                 set_status_text(statusText);
  1344.  
  1345.                 return true;
  1346.             }
  1347.         } else
  1348.         if (bBack)
  1349.         {
  1350.             menu_beep();
  1351.             break;
  1352.         } else
  1353.         if (bRight)
  1354.         {
  1355.             menu_beep();
  1356.             carspawnActiveItemIndex++;
  1357.             int itemsMax = (carspawnActiveLineIndex == (lineCount - 1)) ? itemCountLastLine : itemCount;
  1358.             if (carspawnActiveItemIndex == itemsMax)
  1359.                 carspawnActiveItemIndex = 0;           
  1360.             waitTime = 100;
  1361.         } else
  1362.         if (bLeft)
  1363.         {
  1364.             menu_beep();
  1365.             if (carspawnActiveItemIndex == 0)
  1366.                 carspawnActiveItemIndex = (carspawnActiveLineIndex == (lineCount - 1)) ? itemCountLastLine : itemCount;
  1367.             carspawnActiveItemIndex--;
  1368.             waitTime = 100;
  1369.         } else
  1370.         if (bUp)
  1371.         {
  1372.             menu_beep();
  1373.             if (carspawnActiveLineIndex == 0)
  1374.                 carspawnActiveLineIndex = lineCount;
  1375.             carspawnActiveLineIndex--;
  1376.             waitTime = 200;
  1377.         } else
  1378.         if (bDown)
  1379.         {
  1380.             menu_beep();
  1381.             carspawnActiveLineIndex++;
  1382.             if (carspawnActiveLineIndex == lineCount)
  1383.                 carspawnActiveLineIndex = 0;           
  1384.             waitTime = 200;
  1385.         }
  1386.         if (carspawnActiveLineIndex == (lineCount - 1))
  1387.             if (carspawnActiveItemIndex >= itemCountLastLine)
  1388.                 carspawnActiveItemIndex = 0;
  1389.     }
  1390.     return false;
  1391. }
  1392.  
  1393. int activeLineIndexVeh = 0;
  1394.  
  1395. void process_veh_menu()
  1396. {
  1397.     const float lineWidth = 250.0;
  1398.     const int lineCount = 8;
  1399.  
  1400.     std::string caption = "VEHICLE  OPTIONS";
  1401.  
  1402.     static struct {
  1403.         LPCSTR      text;
  1404.         bool        *pState;
  1405.         bool        *pUpdated;
  1406.     } lines[lineCount] = {
  1407.         {"CAR SPAWNER",     NULL, NULL},
  1408.         {"PAINT RANDOM",    NULL, NULL},
  1409.         {"FIX",             NULL, NULL},
  1410.         {"SEAT BELT",       &featureVehSeatbelt, &featureVehSeatbeltUpdated},
  1411.         {"WRAP IN SPAWNED", &featureVehWrapInSpawned, NULL},
  1412.         {"INVINCIBLE",      &featureVehInvincible, &featureVehInvincibleUpdated},
  1413.         {"STRONG WHEELS",   &featureVehInvincibleWheels, &featureVehInvincibleWheelsUpdated},
  1414.         {"SPEED BOOST",     &featureVehSpeedBoost, NULL}       
  1415.     };
  1416.  
  1417.     DWORD waitTime = 150;
  1418.     while (true)
  1419.     {
  1420.         // timed menu draw, used for pause after active line switch
  1421.         DWORD maxTickCount = GetTickCount() + waitTime;
  1422.         do
  1423.         {
  1424.             // draw menu
  1425.             draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
  1426.             for (int i = 0; i < lineCount; i++)
  1427.                 if (i != activeLineIndexVeh)
  1428.                     draw_menu_line(line_as_str(lines[i].text, lines[i].pState),
  1429.                                    lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
  1430.             draw_menu_line(line_as_str(lines[activeLineIndexVeh].text, lines[activeLineIndexVeh].pState),
  1431.                            lineWidth + 1.0, 11.0, 56.0 + activeLineIndexVeh * 36.0, 0.0, 7.0, true, false);
  1432.  
  1433.             update_features();
  1434.             WAIT(0);
  1435.         } while (GetTickCount() < maxTickCount);
  1436.         waitTime = 0;
  1437.  
  1438.         // process buttons
  1439.         bool bSelect, bBack, bUp, bDown;
  1440.         get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
  1441.         if (bSelect)
  1442.         {
  1443.             menu_beep();
  1444.  
  1445.             // common variables
  1446.             BOOL bPlayerExists = ENTITY::DOES_ENTITY_EXIST(PLAYER::PLAYER_PED_ID());
  1447.             Player player = PLAYER::PLAYER_ID();
  1448.             Ped playerPed = PLAYER::PLAYER_PED_ID();
  1449.  
  1450.             switch (activeLineIndexVeh)
  1451.             {
  1452.                 case 0:
  1453.                     if (process_carspawn_menu()) return;               
  1454.                     break;
  1455.                 case 1:
  1456.                     if (bPlayerExists)
  1457.                     {
  1458.                         if (PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
  1459.                         {
  1460.                             Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
  1461.                             VEHICLE::SET_VEHICLE_CUSTOM_PRIMARY_COLOUR(veh, rand() % 255, rand() % 255, rand() % 255);
  1462.                             if (VEHICLE::GET_IS_VEHICLE_PRIMARY_COLOUR_CUSTOM(veh))
  1463.                                 VEHICLE::SET_VEHICLE_CUSTOM_SECONDARY_COLOUR(veh, rand() % 255, rand() % 255, rand() % 255);
  1464.                         } else
  1465.                         {
  1466.                             set_status_text("player isn't in a vehicle");
  1467.                         }
  1468.                     }
  1469.                     break;
  1470.                 case 2:
  1471.                     if (bPlayerExists)
  1472.                         if (PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
  1473.                             VEHICLE::SET_VEHICLE_FIXED(PED::GET_VEHICLE_PED_IS_USING(playerPed));
  1474.                         else
  1475.                             set_status_text("player isn't in a vehicle");
  1476.                     break;
  1477.                 // switchable features
  1478.                 default:
  1479.                     if (lines[activeLineIndexVeh].pState)
  1480.                         *lines[activeLineIndexVeh].pState = !(*lines[activeLineIndexVeh].pState);
  1481.                     if (lines[activeLineIndexVeh].pUpdated)
  1482.                         *lines[activeLineIndexVeh].pUpdated = true;                
  1483.             }
  1484.             waitTime = 200;
  1485.         } else
  1486.         if (bBack || trainer_switch_pressed())
  1487.         {
  1488.             menu_beep();
  1489.             break;
  1490.         } else
  1491.         if (bUp)
  1492.         {
  1493.             menu_beep();
  1494.             if (activeLineIndexVeh == 0)
  1495.                 activeLineIndexVeh = lineCount;
  1496.             activeLineIndexVeh--;
  1497.             waitTime = 150;
  1498.         } else
  1499.         if (bDown)
  1500.         {
  1501.             menu_beep();
  1502.             activeLineIndexVeh++;
  1503.             if (activeLineIndexVeh == lineCount)
  1504.                 activeLineIndexVeh = 0;        
  1505.             waitTime = 150;
  1506.         }
  1507.     }
  1508. }
  1509.  
  1510. int activeLineIndexWorld = 0;
  1511.  
  1512. void process_world_menu()
  1513. {
  1514.     const float lineWidth = 250.0;
  1515.     const int lineCount = 5;
  1516.  
  1517.     std::string caption = "WORLD  OPTIONS";
  1518.  
  1519.     static struct {
  1520.         LPCSTR      text;
  1521.         bool        *pState;
  1522.         bool        *pUpdated;
  1523.     } lines[lineCount] = {
  1524.         {"MOON GRAVITY",    &featureWorldMoonGravity,   NULL},
  1525.         {"RANDOM COPS",     &featureWorldRandomCops,    NULL},
  1526.         {"RANDOM TRAINS",   &featureWorldRandomTrains,  NULL},
  1527.         {"RANDOM BOATS",    &featureWorldRandomBoats,   NULL},
  1528.         {"GARBAGE TRUCKS"&featureWorldGarbageTrucks, NULL}
  1529.     };
  1530.  
  1531.     DWORD waitTime = 150;
  1532.     while (true)
  1533.     {
  1534.         // timed menu draw, used for pause after active line switch
  1535.         DWORD maxTickCount = GetTickCount() + waitTime;
  1536.         do
  1537.         {
  1538.             // draw menu
  1539.             draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
  1540.             for (int i = 0; i < lineCount; i++)
  1541.                 if (i != activeLineIndexWorld)
  1542.                     draw_menu_line(line_as_str(lines[i].text, lines[i].pState),
  1543.                     lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
  1544.             draw_menu_line(line_as_str(lines[activeLineIndexWorld].text, lines[activeLineIndexWorld].pState),
  1545.                 lineWidth + 1.0, 11.0, 56.0 + activeLineIndexWorld * 36.0, 0.0, 7.0, true, false);
  1546.  
  1547.             update_features();
  1548.             WAIT(0);
  1549.         } while (GetTickCount() < maxTickCount);
  1550.         waitTime = 0;
  1551.  
  1552.         // process buttons
  1553.         bool bSelect, bBack, bUp, bDown;
  1554.         get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
  1555.         if (bSelect)
  1556.         {
  1557.             menu_beep();
  1558.             switch (activeLineIndexWorld)
  1559.             {
  1560.                 case 0:
  1561.                     featureWorldMoonGravity = !featureWorldMoonGravity;
  1562.                     GAMEPLAY::SET_GRAVITY_LEVEL(featureWorldMoonGravity ? 2 : 0);
  1563.                     break;
  1564.                 case 1:
  1565.                     // featureWorldRandomCops being set in update_features
  1566.                     PED::SET_CREATE_RANDOM_COPS(!featureWorldRandomCops);
  1567.                     break;
  1568.                 case 2:
  1569.                     featureWorldRandomTrains = !featureWorldRandomTrains;
  1570.                     VEHICLE::SET_RANDOM_TRAINS(featureWorldRandomTrains);
  1571.                     break;
  1572.                 case 3:
  1573.                     featureWorldRandomBoats = !featureWorldRandomBoats;
  1574.                     VEHICLE::SET_RANDOM_BOATS(featureWorldRandomBoats);
  1575.                     break;
  1576.                 case 4:
  1577.                     featureWorldGarbageTrucks = !featureWorldGarbageTrucks;
  1578.                     VEHICLE::SET_GARBAGE_TRUCKS(featureWorldGarbageTrucks);
  1579.                     break;
  1580.             }
  1581.             waitTime = 200;
  1582.         } else
  1583.         if (bBack || trainer_switch_pressed())
  1584.         {
  1585.             menu_beep();
  1586.             break;
  1587.         } else
  1588.         if (bUp)
  1589.         {
  1590.             menu_beep();
  1591.             if (activeLineIndexWorld == 0)
  1592.                 activeLineIndexWorld = lineCount;
  1593.             activeLineIndexWorld--;
  1594.             waitTime = 150;
  1595.         } else
  1596.         if (bDown)
  1597.         {
  1598.             menu_beep();
  1599.             activeLineIndexWorld++;
  1600.             if (activeLineIndexWorld == lineCount)
  1601.                 activeLineIndexWorld = 0;          
  1602.             waitTime = 150;
  1603.         }
  1604.     }
  1605. }
  1606.  
  1607. int activeLineIndexTime = 0;
  1608.  
  1609. void process_time_menu()
  1610. {
  1611.     const float lineWidth = 250.0;
  1612.     const int lineCount = 4;
  1613.  
  1614.     std::string caption = "TIME  OPTIONS";
  1615.  
  1616.     static struct {
  1617.         LPCSTR      text;
  1618.         bool        *pState;
  1619.         bool        *pUpdated;
  1620.     } lines[lineCount] = {
  1621.         {"HOUR FORWARD",     NULL,               NULL},
  1622.         {"HOUR BACKWARD",    NULL,               NULL},
  1623.         {"CLOCK PAUSED",     &featureTimePaused, &featureTimePausedUpdated},
  1624.         {"SYNC WITH SYSTEM", &featureTimeSynced, NULL}
  1625.     };
  1626.  
  1627.     DWORD waitTime = 150;
  1628.     while (true)
  1629.     {
  1630.         // timed menu draw, used for pause after active line switch
  1631.         DWORD maxTickCount = GetTickCount() + waitTime;
  1632.         do
  1633.         {
  1634.             // draw menu
  1635.             draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
  1636.             for (int i = 0; i < lineCount; i++)
  1637.                 if (i != activeLineIndexTime)
  1638.                     draw_menu_line(line_as_str(lines[i].text, lines[i].pState),
  1639.                     lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
  1640.             draw_menu_line(line_as_str(lines[activeLineIndexTime].text, lines[activeLineIndexTime].pState),
  1641.                 lineWidth + 1.0, 11.0, 56.0 + activeLineIndexTime * 36.0, 0.0, 7.0, true, false);
  1642.  
  1643.             update_features();
  1644.             WAIT(0);
  1645.         } while (GetTickCount() < maxTickCount);
  1646.         waitTime = 0;
  1647.  
  1648.         // process buttons
  1649.         bool bSelect, bBack, bUp, bDown;
  1650.         get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
  1651.         if (bSelect)
  1652.         {
  1653.             menu_beep();
  1654.             switch (activeLineIndexTime)
  1655.             {
  1656.             // hour forward/backward
  1657.             case 0:
  1658.             case 1:
  1659.                 {
  1660.                     int h = TIME::GET_CLOCK_HOURS();
  1661.                     if (activeLineIndexTime == 0) h = (h == 23) ? 0 : h + 1; else h = (h == 0) ? 23 : h - 1;
  1662.                     int m = TIME::GET_CLOCK_MINUTES();
  1663.                     TIME::SET_CLOCK_TIME(h, m, 0);
  1664.                     char text[32];
  1665.                     sprintf_s(text, "time %d:%d", h, m);
  1666.                     set_status_text(text);
  1667.                 }
  1668.                 break;
  1669.             // switchable features
  1670.             default:
  1671.                 if (lines[activeLineIndexTime].pState)
  1672.                     *lines[activeLineIndexTime].pState = !(*lines[activeLineIndexTime].pState);
  1673.                 if (lines[activeLineIndexTime].pUpdated)
  1674.                     *lines[activeLineIndexTime].pUpdated = true;   
  1675.             }
  1676.             waitTime = 200;
  1677.         } else
  1678.         if (bBack || trainer_switch_pressed())
  1679.         {
  1680.             menu_beep();
  1681.             break;
  1682.         } else
  1683.         if (bUp)
  1684.         {
  1685.             menu_beep();
  1686.             if (activeLineIndexTime == 0)
  1687.                 activeLineIndexTime = lineCount;
  1688.             activeLineIndexTime--;
  1689.             waitTime = 150;
  1690.         } else
  1691.         if (bDown)
  1692.         {
  1693.             menu_beep();
  1694.             activeLineIndexTime++;
  1695.             if (activeLineIndexTime == lineCount)
  1696.                 activeLineIndexTime = 0;           
  1697.             waitTime = 150;
  1698.         }
  1699.     }
  1700. }
  1701.  
  1702. int activeLineIndexWeather = 0;
  1703.  
  1704. void process_weather_menu()
  1705. {
  1706.     const float lineWidth = 250.0;
  1707.     const int lineCount = 16;
  1708.  
  1709.     std::string caption = "WEATHER  OPTIONS";
  1710.  
  1711.     static struct {
  1712.         LPCSTR      text;
  1713.         bool        *pState;
  1714.         bool        *pUpdated;
  1715.     } lines[lineCount] = {
  1716.         {"WIND",         &featureWeatherWind,   NULL},
  1717.         {"SET PERSIST",  &featureWeatherPers,   NULL},
  1718.         {"EXTRASUNNY",   NULL,                  NULL},
  1719.         {"CLEAR",        NULL,                  NULL},
  1720.         {"CLOUDS",       NULL,                  NULL},
  1721.         {"SMOG",         NULL,                  NULL},
  1722.         {"FOGGY",        NULL,                  NULL},
  1723.         {"OVERCAST",     NULL,                  NULL},
  1724.         {"RAIN",         NULL,                  NULL},
  1725.         {"THUNDER",      NULL,                  NULL},
  1726.         {"CLEARING",     NULL,                  NULL},
  1727.         {"NEUTRAL",      NULL,                  NULL},
  1728.         {"SNOW",         NULL,                  NULL},
  1729.         {"BLIZZARD",     NULL,                  NULL},
  1730.         {"SNOWLIGHT",    NULL,                  NULL},
  1731.         {"XMAS",         NULL,                  NULL}
  1732.     };
  1733.  
  1734.  
  1735.     DWORD waitTime = 150;
  1736.     while (true)
  1737.     {
  1738.         // timed menu draw, used for pause after active line switch
  1739.         DWORD maxTickCount = GetTickCount() + waitTime;
  1740.         do
  1741.         {
  1742.             // draw menu
  1743.             draw_menu_line(caption, lineWidth, 7.0, 13.6, 5.0, 5.0, false, true);
  1744.             for (int i = 0; i < lineCount; i++)
  1745.                 if (i != activeLineIndexWeather)
  1746.                     draw_menu_line(line_as_str(lines[i].text, lines[i].pState),
  1747.                     lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
  1748.             draw_menu_line(line_as_str(lines[activeLineIndexWeather].text, lines[activeLineIndexWeather].pState),
  1749.                 lineWidth + 1.0, 11.0, 56.0 + activeLineIndexWeather * 36.0, 0.0, 7.0, true, false);
  1750.  
  1751.             update_features();
  1752.             WAIT(0);
  1753.         } while (GetTickCount() < maxTickCount);
  1754.         waitTime = 0;
  1755.  
  1756.         // process buttons
  1757.         bool bSelect, bBack, bUp, bDown;
  1758.         get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
  1759.         if (bSelect)
  1760.         {
  1761.             menu_beep();
  1762.             switch (activeLineIndexWeather)
  1763.             {
  1764.             // wind
  1765.             case 0:
  1766.                 featureWeatherWind = !featureWeatherWind;
  1767.                 if (featureWeatherWind)
  1768.                 {
  1769.                     GAMEPLAY::SET_WIND(1.0);
  1770.                     GAMEPLAY::SET_WIND_SPEED(11.99);
  1771.                     GAMEPLAY::SET_WIND_DIRECTION(ENTITY::GET_ENTITY_HEADING(PLAYER::PLAYER_PED_ID()));
  1772.                 } else
  1773.                 {
  1774.                     GAMEPLAY::SET_WIND(0.0);
  1775.                     GAMEPLAY::SET_WIND_SPEED(0.0);
  1776.                 }
  1777.                 break;
  1778.             // set persist
  1779.             case 1:
  1780.                 featureWeatherPers = !featureWeatherPers;
  1781.                 break;
  1782.             // set weather
  1783.             default:
  1784.                 GAMEPLAY::CLEAR_OVERRIDE_WEATHER();
  1785.                 if (featureWeatherPers)
  1786.                 {
  1787.                     GAMEPLAY::SET_OVERRIDE_WEATHER((char *)lines[activeLineIndexWeather].text);
  1788.                 }
  1789.                 else
  1790.                 {
  1791.                     GAMEPLAY::SET_WEATHER_TYPE_NOW_PERSIST((char *)lines[activeLineIndexWeather].text);
  1792.                     GAMEPLAY::CLEAR_WEATHER_TYPE_PERSIST();
  1793.                 }              
  1794.                 set_status_text(lines[activeLineIndexWeather].text);
  1795.             }
  1796.             waitTime = 200;
  1797.         } else
  1798.         if (bBack || trainer_switch_pressed())
  1799.         {
  1800.             menu_beep();
  1801.             break;
  1802.         } else
  1803.         if (bUp)
  1804.         {
  1805.             menu_beep();
  1806.             if (activeLineIndexWeather == 0)
  1807.                 activeLineIndexWeather = lineCount;
  1808.             activeLineIndexWeather--;
  1809.             waitTime = 150;
  1810.         } else
  1811.         if (bDown)
  1812.         {
  1813.             menu_beep();
  1814.             activeLineIndexWeather++;
  1815.             if (activeLineIndexWeather == lineCount)
  1816.                 activeLineIndexWeather = 0;        
  1817.             waitTime = 150;
  1818.         }
  1819.     }
  1820. }
  1821.  
  1822. int activeLineIndexMisc = 0;
  1823.  
  1824. void process_misc_menu()
  1825. {
  1826.     const float lineWidth = 250.0;
  1827.     const int lineCount = 2;
  1828.  
  1829.     std::string caption = "MISC  OPTIONS";
  1830.  
  1831.     static struct {
  1832.         LPCSTR      text;
  1833.         bool        *pState;
  1834.         bool        *pUpdated;
  1835.     } lines[lineCount] = {
  1836.         {"NEXT RADIO TRACK",    NULL,                   NULL},
  1837.         {"HIDE HUD",            &featureMiscHideHud,    NULL}      
  1838.     };
  1839.  
  1840.  
  1841.     DWORD waitTime = 150;
  1842.     while (true)
  1843.     {
  1844.         // timed menu draw, used for pause after active line switch
  1845.         DWORD maxTickCount = GetTickCount() + waitTime;
  1846.         do
  1847.         {
  1848.             // draw menu
  1849.             draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
  1850.             for (int i = 0; i < lineCount; i++)
  1851.                 if (i != activeLineIndexMisc)
  1852.                     draw_menu_line(line_as_str(lines[i].text, lines[i].pState),
  1853.                     lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
  1854.             draw_menu_line(line_as_str(lines[activeLineIndexMisc].text, lines[activeLineIndexMisc].pState),
  1855.                 lineWidth + 1.0, 11.0, 56.0 + activeLineIndexMisc * 36.0, 0.0, 7.0, true, false);
  1856.  
  1857.             update_features();
  1858.             WAIT(0);
  1859.         } while (GetTickCount() < maxTickCount);
  1860.         waitTime = 0;
  1861.  
  1862.         // process buttons
  1863.         bool bSelect, bBack, bUp, bDown;
  1864.         get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
  1865.         if (bSelect)
  1866.         {
  1867.             menu_beep();
  1868.             switch (activeLineIndexMisc)
  1869.             {
  1870.             // next radio track
  1871.             case 0:
  1872.                 if (ENTITY::DOES_ENTITY_EXIST(PLAYER::PLAYER_PED_ID()) &&
  1873.                     PED::IS_PED_IN_ANY_VEHICLE(PLAYER::PLAYER_PED_ID(), 0))
  1874.                         AUDIO::SKIP_RADIO_FORWARD();
  1875.                 break;
  1876.             // switchable features
  1877.             default:
  1878.                 if (lines[activeLineIndexMisc].pState)
  1879.                     *lines[activeLineIndexMisc].pState = !(*lines[activeLineIndexMisc].pState);
  1880.                 if (lines[activeLineIndexMisc].pUpdated)
  1881.                     *lines[activeLineIndexMisc].pUpdated = true;
  1882.             }
  1883.             waitTime = 200;
  1884.         } else
  1885.         if (bBack || trainer_switch_pressed())
  1886.         {
  1887.             menu_beep();
  1888.             break;
  1889.         } else
  1890.         if (bUp)
  1891.         {
  1892.             menu_beep();
  1893.             if (activeLineIndexMisc == 0)
  1894.                 activeLineIndexMisc = lineCount;
  1895.             activeLineIndexMisc--;
  1896.             waitTime = 150;
  1897.         } else
  1898.         if (bDown)
  1899.         {
  1900.             menu_beep();
  1901.             activeLineIndexMisc++;
  1902.             if (activeLineIndexMisc == lineCount)
  1903.                 activeLineIndexMisc = 0;           
  1904.             waitTime = 150;
  1905.         }
  1906.     }
  1907. }
  1908.  
  1909. int activeLineIndexMain = 0;
  1910.  
  1911. void process_main_menu()
  1912. {
  1913.     const float lineWidth = 300.0;
  1914.     const int lineCount = 7;   
  1915.  
  1916.     std::string caption = "Crusaders Tutorial";
  1917.  
  1918.     static LPCSTR lineCaption[lineCount] = {
  1919.         "Player Menu ~r~>>",
  1920.         "Weapon Menu ~r~>>",
  1921.         "Vehicle Menu ~r~>>",
  1922.         "World Menu ~r~>>",
  1923.         "Time Menu ~r~>>",
  1924.         "Weather Menu ~r~>>",
  1925.         "Misc Menu ~r~>>",
  1926.     };
  1927.  
  1928.     DWORD waitTime = 150;
  1929.     while (true)
  1930.     {
  1931.         // timed menu draw, used for pause after active line switch
  1932.         DWORD maxTickCount = GetTickCount() + waitTime;
  1933.         do
  1934.         {
  1935.            
  1936.             draw_menu_line(caption, lineWidth, 7.9, 14.0, 4.0, 4.0, false, true);   //If you use this design in a public menu, please credit me, The Crusader, for the design :)
  1937.             for (int i = 0; i < lineCount; i++)
  1938.                 if (i != activeLineIndexMain)
  1939.                     draw_menu_line(lineCaption[i], lineWidth, 4.0, 60.0 + i * 22.8, 4.0, 9.0, false, false);
  1940.  
  1941.             draw_menu_line(lineCaption[activeLineIndexMain], lineWidth + 0.0, 2.0, 60.0 + activeLineIndexMain * 22.9, 4.0, 7.0, true, false);
  1942.  
  1943.             update_features();
  1944.             WAIT(0);
  1945.         } while (GetTickCount() < maxTickCount);
  1946.         waitTime = 0;
  1947.  
  1948.         // process buttons
  1949.         bool bSelect, bBack, bUp, bDown;
  1950.         get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
  1951.         if (bSelect)
  1952.         {
  1953.             menu_beep();
  1954.             switch (activeLineIndexMain)
  1955.             {
  1956.                 case 0:
  1957.                     process_player_menu();                 
  1958.                     break;
  1959.                 case 1:
  1960.                     process_weapon_menu();
  1961.                     break;
  1962.                 case 2:
  1963.                     process_veh_menu();
  1964.                     break;
  1965.                 case 3:
  1966.                     process_world_menu();
  1967.                     break;
  1968.                 case 4:
  1969.                     process_time_menu();
  1970.                     break;
  1971.                 case 5:
  1972.                     process_weather_menu();
  1973.                     break;
  1974.                 case 6:
  1975.                     process_misc_menu();
  1976.                     break;
  1977.             }
  1978.             waitTime = 200;
  1979.         } else
  1980.         if (bBack || trainer_switch_pressed())
  1981.         {
  1982.             menu_beep();
  1983.             break;
  1984.         } else
  1985.         if (bUp)
  1986.         {
  1987.             menu_beep();
  1988.             if (activeLineIndexMain == 0)
  1989.                 activeLineIndexMain = lineCount;
  1990.             activeLineIndexMain--;
  1991.             waitTime = 150;
  1992.         } else
  1993.         if (bDown)
  1994.         {
  1995.             menu_beep();
  1996.             activeLineIndexMain++;
  1997.             if (activeLineIndexMain == lineCount)
  1998.                 activeLineIndexMain = 0;           
  1999.             waitTime = 150;
  2000.         }
  2001.     }
  2002. }
  2003.  
  2004. void reset_globals()
  2005. {
  2006.     activeLineIndexMain         =
  2007.     activeLineIndexPlayer       =
  2008.     skinchangerActiveLineIndex  =
  2009.     skinchangerActiveItemIndex  =
  2010.     teleportActiveLineIndex     =
  2011.     activeLineIndexWeapon       =
  2012.     activeLineIndexVeh          =
  2013.     carspawnActiveLineIndex     =
  2014.     carspawnActiveItemIndex     =
  2015.     activeLineIndexWorld        =
  2016.     activeLineIndexWeather      =   0;
  2017.  
  2018.     featurePlayerInvincible             =
  2019.     featurePlayerInvincibleUpdated      =
  2020.     featurePlayerNeverWanted            =
  2021.  
  2022.     featurePlayerIgnored                =
  2023.     featurePlayerIgnoredUpdated         =
  2024.     featurePlayerUnlimitedAbility       =
  2025.     featurePlayerNoNoise                =
  2026.     featurePlayerNoNoiseUpdated         =
  2027.     featurePlayerFastSwim               =
  2028.     featurePlayerFastSwimUpdated        =
  2029.     featurePlayerFastRun                =
  2030.     featurePlayerUltraJump              =
  2031.     featurePlayerFastRunUpdated         =
  2032.     featurePlayerSuperJump              =
  2033.     featureWeaponNoReload               =
  2034.     featureWeaponFireAmmo               =
  2035.     featureWeaponExplosiveAmmo          =
  2036.     featureWeaponExplosiveMelee         =
  2037.     featureWeaponVehRockets             =
  2038.     featureVehInvincible                =
  2039.     featureVehInvincibleUpdated         =
  2040.     featureVehInvincibleWheels          =
  2041.     featureVehInvincibleWheelsUpdated   =
  2042.     featureVehSeatbelt                  =
  2043.     featureVehSeatbeltUpdated           =
  2044.     featureVehSpeedBoost                =
  2045.     featureVehWrapInSpawned             =
  2046.     featureWorldMoonGravity             =
  2047.     featureTimePaused                   =
  2048.     featureTimePausedUpdated            =
  2049.     featureTimeSynced                   =
  2050.     featureWeatherWind                  =
  2051.     featureWeatherPers                  =
  2052.     featureMiscLockRadio                =
  2053.     featureMiscHideHud                  =   false;
  2054.  
  2055.     featureWorldRandomCops      =
  2056.     featureWorldRandomTrains    =
  2057.     featureWorldRandomBoats     =
  2058.     featureWorldGarbageTrucks   =   true;
  2059.  
  2060.     skinchanger_used            =   false;
  2061. }
  2062.  
  2063. void main()
  2064. {  
  2065.     reset_globals();
  2066.  
  2067.     while (true)
  2068.     {
  2069.         if (trainer_switch_pressed())
  2070.         {
  2071.             menu_beep();
  2072.             process_main_menu();
  2073.         }
  2074.  
  2075.         update_features();     
  2076.         WAIT(0);
  2077.     }
  2078. }
  2079.  
  2080. void ScriptMain()
  2081. {
  2082.     srand(GetTickCount());
  2083.     main();
  2084. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement