Guest User

gas

a guest
May 25th, 2015
287
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // 1.0 Realistic fuel system
  2. //     made by Srdjan, date 10/09/2011
  3.  
  4.  
  5. #include <a_samp>
  6.  
  7. #define COLOR_RED 0xAA3333AA
  8. #define COLOR_WHITE 0xFFFFFFAA
  9. #define COLOR_YELLOW 0xFFFF0066
  10.  
  11. #define COLOR_FADE1 0xE6E6E6E6
  12. #define COLOR_FADE2 0xC8C8C8C8
  13. #define COLOR_FADE3 0xAAAAAAAA
  14. #define COLOR_FADE4 0x8C8C8C8C
  15. #define COLOR_FADE5 0x6E6E6E6E
  16.  
  17. #define REGULARGAS_PRICE 4.23
  18. #define MIDGRADE_PRICE 4.55
  19. #define PREMIUM_PRICE 4.84
  20. #define DIESELFUEL_PRICE 5.03
  21.  
  22. #define DISPLAY_DIALOG_ID 1045
  23.  
  24.  
  25. enum rfs_Coords
  26. {
  27.     Float: x, Float: y, Float: z
  28. }
  29.  
  30. new rfs_GasStations [][rfs_Coords] =
  31. {
  32.     { 1595.5406, 2198.0520, 10.3863 },
  33.     { 2202.0649, 2472.6697, 10.5677 },
  34.     { 2115.1929, 919.9908, 10.5266 },
  35.     { 2640.7209, 1105.9565, 10.5274 },
  36.     { 608.5971, 1699.6238, 6.9922 },
  37.     { 618.4878, 1684.5792, 6.9922 },
  38.     { 2146.3467, 2748.2893, 10.5245 },
  39.     { -1679.4595, 412.5129, 6.9973 },
  40.     { -1327.5607, 2677.4316, 49.8093 },
  41.     { -1470.0050, 1863.2375, 32.3521 },
  42.     { -2409.2200, 976.2798, 45.2969 },
  43.     { -2244.1396, -2560.5833, 31.9219 },
  44.     { -1606.0544, -2714.3083, 48.5335 },
  45.     { 1937.4293, -1773.1865, 13.3828 },
  46.     { -91.3854, -1169.9175, 2.4213 },
  47.     { 1383.4221, 462.5385, 20.1506 },
  48.     { 660.4590, -565.0394, 16.3359 },
  49.     { 1381.7206, 459.1907, 20.3452 },
  50.     { -1605.7156, -2714.4573, 48.5335 },
  51.     { 1008.1107, -937.3372, 42.6493 },
  52.     { -2029.4047, 157.2388, 28.5722 }
  53. };
  54.  
  55. new rfs_SportVehicles [] =
  56. {
  57.     402, 411, 415, 602, 429, 541, 587, 565, 494, 502, 503,
  58.     559, 603, 506, 451, 558, 477, 560, 562,
  59. };
  60.  
  61. new rfs_OffRoadVehicles [] =
  62. {
  63.     400, 424, 489, 495, 505, 568, 579, 599,
  64. };
  65.  
  66. new rfs_Trucks [] =
  67. {
  68.     403, 406, 407, 408, 413, 414, 416, 418, 423, 427, 428,
  69.     431, 432, 433, 437, 440, 443, 444, 455, 456, 459, 470,
  70.     482, 483, /*485,*/ 486, 498, 499, 508, 514, 515, 524,
  71.     /*531, 532,*/543, 556, 557, /*572,*/573, 578, 582, 588,
  72.     601, 609
  73.  
  74. };
  75.  
  76. new rfs_CommonVehicles [] =
  77. {
  78.     401, 404, 405, 409, 410, 412, 419, 420, 421, 422, 426,
  79.     434, 436, 438, 439, 442, 445, 458, 466, 467, 474, 475,
  80.     478, 479, 490, 491, 492, 496, 500, 504, 507, 516, 517,
  81.     518, 525, 526, 527, 528, 529, 533, 534, 535, 536, 540,
  82.     542, 543, 545, 546, 547, 549, 560, 551, 552, 554, 555,
  83.     561, 566, 567, 575, 576, 580, 585, 589, 596, 597, 598,
  84.     600, 604, 605
  85.    
  86. };
  87.  
  88. new rfs_Bikes [] =
  89. {
  90.     448, 457, 461, 462, 468, 471, 521, 522, 523, 530, 571,
  91.     574, 581, 583, 586
  92. };
  93.  
  94. new rfs_AirVehicles [] =
  95. {
  96.     592, 577, 511, 512, 593, 520, 553, 476, 519, 460, 513,
  97.     548, 425, 417, 487, 488, 497, 563, 447, 469
  98. };
  99.  
  100. new rfs_GasTypes [4][] =
  101. {
  102.     "regular gas",
  103.     "midgrade",
  104.     "premium",
  105.     "diesel fuel"
  106. };
  107.  
  108. new rfs_ChoosingGasType [MAX_PLAYERS];
  109. new rfs_ChoosingFuelAmount [MAX_PLAYERS];
  110. new rfs_WaitingEngine [MAX_PLAYERS];
  111. new Float: rfs_VehicleFuel [MAX_VEHICLES];
  112. new pl_vehid [MAX_PLAYERS];
  113. new veh_display [MAX_VEHICLES];
  114. new FirstTimeInVehicle [MAX_VEHICLES];
  115. new Float: old_veh_pos [MAX_VEHICLES][3];
  116. new ChoosenGas [MAX_VEHICLES];
  117. new Float: iCounter [MAX_VEHICLES];
  118. new RefillTimer [MAX_VEHICLES];
  119. new Float: TotalDistance [MAX_VEHICLES];
  120. new Float: DistanceFromStart [MAX_VEHICLES];
  121.  
  122. new Text: rfs_td_distance [MAX_VEHICLES];
  123. new Text: rfs_td_fuel_available [MAX_VEHICLES];
  124. new Text: rfs_td_fuel_consumption [MAX_VEHICLES];
  125. new Text: rfs_td_gas_station [MAX_VEHICLES];
  126. new Text: rfs_td_dist_total [MAX_VEHICLES];
  127. new Text: rfs_td_dist_start [MAX_VEHICLES];
  128. new Text: rfs_td_time_total [MAX_VEHICLES];
  129. new Text3D: rfs_3dtd_vehicle_refilling [MAX_VEHICLES];
  130.  
  131.  
  132. forward rfs_OnFilterScriptInit ();
  133. forward rfs_OnFilterScriptExit ();
  134. forward rfs_OnPlayerText (playerid, text[]);
  135. forward rfs_GasChosen (playerid, i);
  136. forward Float: VehicleConsumption (vehid);
  137. forward Float: rfs_GasPrice (i);
  138. forward UpdateDisplay ();
  139. forward UpdateTextDraws ();
  140. forward UpdateDistance ();
  141. forward Refilling (playerid, vehicleid, Float: amount);
  142. forward HideTDGasStation (playerid, vehicleid);
  143.  
  144. forward ProxDetector (Float:radi, playerid, string[], col1, col2, col3, col4, col5);
  145.  
  146.  
  147. public OnFilterScriptInit ()
  148. {
  149.     rfs_OnFilterScriptInit ();
  150.     return 1;
  151. }
  152.  
  153. public OnFilterScriptExit ()
  154. {
  155.     rfs_OnFilterScriptExit ();
  156.     return 1;
  157. }
  158.  
  159. public OnPlayerText (playerid, text[])
  160. {
  161.     rfs_OnPlayerText (playerid, text);
  162.     return 0;
  163. }
  164.  
  165. public rfs_OnFilterScriptInit ()
  166. {
  167.     for (new i = 0; i < MAX_PLAYERS; i++)
  168.     {
  169.         rfs_ChoosingGasType [i] = 0;
  170.         rfs_ChoosingFuelAmount [i] = 0;
  171.         rfs_WaitingEngine [i] = 0;
  172.     }
  173.    
  174.     for (new i = 0; i < MAX_VEHICLES; i++)
  175.     {
  176.         rfs_td_distance [i] = TextDrawCreate (530.0, 420.0, "Distance~n~");
  177.         TextDrawFont (rfs_td_distance [i], 2);
  178.         TextDrawUseBox (rfs_td_distance [i], 1);
  179.         TextDrawLetterSize (rfs_td_distance [i], 0.4, 0.6);
  180.         TextDrawBackgroundColor (rfs_td_distance [i], 0x66aa0044);
  181.        
  182.         rfs_td_fuel_available [i] = TextDrawCreate (490.0, 420.0, "Fuel available~n~");
  183.         TextDrawFont (rfs_td_fuel_available [i], 2);
  184.         TextDrawUseBox (rfs_td_fuel_available [i], 1);
  185.         TextDrawLetterSize (rfs_td_fuel_available [i], 0.4, 0.6);
  186.         TextDrawBackgroundColor (rfs_td_fuel_available [i], 0x66aa0044);
  187.        
  188.         rfs_td_fuel_consumption [i] = TextDrawCreate (475.0, 420.0, "Fuel consumption~n~");
  189.         TextDrawFont (rfs_td_fuel_consumption [i], 2);
  190.         TextDrawUseBox (rfs_td_fuel_consumption [i], 1);
  191.         TextDrawLetterSize (rfs_td_fuel_consumption [i], 0.4, 0.6);
  192.         TextDrawBackgroundColor (rfs_td_fuel_consumption [i], 0x66aa0044);
  193.        
  194.         rfs_td_dist_total [i] = TextDrawCreate (430.0, 420.0, "Distance travelled~n~in total:   0.0");
  195.         TextDrawFont (rfs_td_dist_total [i], 2);
  196.         TextDrawUseBox (rfs_td_dist_total [i], 1);
  197.         TextDrawLetterSize (rfs_td_dist_total [i], 0.4, 0.6);
  198.         TextDrawBackgroundColor (rfs_td_dist_total [i], 0x66aa0044);
  199.        
  200.         rfs_td_dist_start [i] = TextDrawCreate (435.0, 420.0, "Distance travelled~n~since start:   0.0");
  201.         TextDrawFont (rfs_td_dist_start [i], 2);
  202.         TextDrawUseBox (rfs_td_dist_start [i], 1);
  203.         TextDrawLetterSize (rfs_td_dist_start [i], 0.4, 0.6);
  204.         TextDrawBackgroundColor (rfs_td_dist_start [i], 0x66aa0044);
  205.  
  206.         rfs_td_time_total [i] = TextDrawCreate (470.0, 420.0, "Time elapsed~n~in total:  00:00");
  207.         TextDrawFont (rfs_td_time_total [i], 2);
  208.         TextDrawUseBox (rfs_td_time_total [i], 1);
  209.         TextDrawLetterSize (rfs_td_time_total [i], 0.4, 0.6);
  210.         TextDrawBackgroundColor (rfs_td_time_total [i], 0x66aa0044);
  211.        
  212.         rfs_td_gas_station [i] = TextDrawCreate (440.0, 420.0, "Name:~n~Liters:~n~Price:~n~Price per liter:");
  213.         TextDrawFont (rfs_td_gas_station [i], 2);
  214.         TextDrawUseBox (rfs_td_gas_station [i], 1);
  215.         TextDrawLetterSize (rfs_td_gas_station [i], 0.4, 0.6);
  216.         TextDrawBackgroundColor (rfs_td_gas_station [i], 0x66aa0044);
  217.        
  218.         veh_display [i] = 1;
  219.         FirstTimeInVehicle [i] = 1;
  220.        
  221.         rfs_3dtd_vehicle_refilling [i] = Create3DTextLabel ("This vehicle is being refilled", COLOR_YELLOW, 0.0, 0.0, -20.0, 300.0, 0, 1);
  222.     }
  223.    
  224.     SetTimer ("UpdateDisplay", 1000, 1);
  225.     SetTimer ("UpdateTextDraws", 1000, 1);
  226.     SetTimer ("UpdateDistance", 3000, 1);
  227.     printf ("\nRealistic fuel system by Srdjan loaded.\n");
  228.     return 1;
  229. }
  230.  
  231. public rfs_OnFilterScriptExit ()
  232. {
  233.     for (new i = 0; i < MAX_PLAYERS; i++)
  234.     {
  235.         HideTextDraws (i);
  236.     }
  237.     return 1;
  238. }
  239.  
  240. public OnPlayerCommandText (playerid, cmdtext[])
  241. {
  242.     if (!strcmp (cmdtext, "/refill", true))
  243.     {
  244.         if (!IsPlayerInAnyVehicle (playerid)) return 1;
  245.         if (GetPlayerState (playerid) != PLAYER_STATE_DRIVER) return 1;
  246.        
  247.         if (rfs_IsPlayerAtGasStation (playerid))
  248.         {
  249.             rfs_StationWorkerMessage (playerid);
  250.             SendClientMessage (playerid, COLOR_YELLOW, "HINT: Type in one of following: \"regular gas\", \"midgrade\", \"premium\", \"diesel fuel\"");
  251.             SendClientMessage (playerid, COLOR_YELLOW, "HINT: You can say one of those as a part of sentence, e.g. \"Hello. Can you fill regular gas, please.\"");
  252.             rfs_ChoosingGasType [playerid] = 1;
  253.         }
  254.         return 1;
  255.     }
  256.    
  257.     if (!strcmp (cmdtext, "/engine", true))
  258.     {
  259.         if (!IsPlayerInAnyVehicle (playerid)) return 1;
  260.         if (GetPlayerState (playerid) != PLAYER_STATE_DRIVER) return 1;
  261.         new engine, lights, alarm, doors, bonnet, boot, objective;
  262.         GetVehicleParamsEx (GetPlayerVehicleID (playerid), engine, lights, alarm, doors, bonnet, boot, objective);
  263.         if (!engine)
  264.         {
  265.             SetVehicleParamsEx (GetPlayerVehicleID (playerid), 1, lights, alarm, doors, bonnet, boot, objective);
  266.             DistanceFromStart [GetPlayerVehicleID (playerid)] = 0.0;
  267.         }
  268.         else
  269.         {
  270.             SetVehicleParamsEx (GetPlayerVehicleID (playerid), 0, lights, alarm, doors, bonnet, boot, objective);
  271.             if (rfs_WaitingEngine [playerid])
  272.             {
  273.            
  274.             }
  275.         }
  276.         return 1;
  277.     }
  278.    
  279.     if (!strcmp (cmdtext, "/comp", true))
  280.     {
  281.         if (!IsPlayerInAnyVehicle (playerid)) return 1;
  282.         if (RefillTimer [GetPlayerVehicleID (playerid)] != 0) return 1;
  283.         ShowPlayerDialog (playerid, DISPLAY_DIALOG_ID, DIALOG_STYLE_LIST, "Vehicle computer display:", "Distance \nFuel available \nFuel consumption \nDistance travelled in total \nDistance travelled since last start \nTime you've been traveling in total", "Confirm", "Cancel");
  284.         return 1;
  285.     }
  286.    
  287.     return 0;
  288. }
  289.  
  290. stock rfs_IsPlayerAtGasStation (playerid)
  291. {
  292.     for (new i = 0; i < sizeof (rfs_GasStations); i++)
  293.     {
  294.         if (IsPlayerInRangeOfPoint (playerid, 10.0, rfs_GasStations[i][x], rfs_GasStations[i][y], rfs_GasStations[i][z])) return 1;
  295.     }
  296.     return 0;
  297. }
  298.  
  299. stock rfs_StationWorkerMessage (playerid)
  300. {
  301.     new str[64];
  302.     new h, m, s;
  303.     gettime (h, m, s);
  304.  
  305.     if (h > 3 && h < 13)
  306.     {
  307.         str = "Gas station worker: Good morning, how can I help you?";
  308.     }
  309.     else if (h >= 13 && h < 19)
  310.     {
  311.         str = "Gas station worker: Good afternoon, how can I help you?";
  312.     }
  313.     else
  314.     {
  315.         str = "Gas station worker: Good evening, how can I help you?";
  316.     }
  317.    
  318.     for (new i = 0; i < MAX_PLAYERS; i++)
  319.     {
  320.         if (IsPlayerConnected (i))
  321.         {
  322.             if (IsPlayerInVehicle (i, GetPlayerVehicleID (playerid)))
  323.             {
  324.                 SendClientMessage (playerid, COLOR_WHITE, str);
  325.             }
  326.         }
  327.     }
  328. }
  329.  
  330. public rfs_OnPlayerText (playerid, text[])
  331. {
  332.     new str[128], name[MAX_PLAYER_NAME];
  333.     GetPlayerName (playerid, name, sizeof (name));
  334.     strreplace (name, '_', ' ');
  335.     format (str, sizeof (str), "%s says: %s", name, text);
  336.     ProxDetector (16.0, playerid, str, COLOR_FADE1, COLOR_FADE2, COLOR_FADE3, COLOR_FADE4, COLOR_FADE5);
  337.  
  338.     if (rfs_ChoosingGasType [playerid])
  339.     {
  340.         if (!rfs_IsPlayerAtGasStation (playerid)) return rfs_ChoosingGasType [playerid] = 0;
  341.         for (new i = 0; i < sizeof (rfs_GasTypes); i++)
  342.         {
  343.             if (strfind (text, rfs_GasTypes [i], true) > -1)
  344.             {
  345.                 veh_display [GetPlayerVehicleID (playerid)] = 0;
  346.                 SetTimerEx ("rfs_GasChosen", 150, 0, "dd", playerid, i);
  347.                 return 0;
  348.             }
  349.         }
  350.         SendClientMessage (playerid, COLOR_WHITE, "Gas station worker: Sorry, we don't have that gas available.");
  351.     }
  352.    
  353.     if (rfs_ChoosingFuelAmount [playerid])
  354.     {
  355.         if (!rfs_IsPlayerAtGasStation (playerid)) return rfs_ChoosingFuelAmount [playerid] = 0;
  356.         new Float: amount = strval (text);
  357.         if (amount < 0.1) return 1;
  358.         new vehid = GetPlayerVehicleID (playerid);
  359.         if (amount > rfs_VehFuelTankCapacity (vehid) || amount > rfs_VehFuelTankCapacity (vehid) - rfs_VehicleFuel [vehid])
  360.         {
  361.             amount = rfs_VehFuelTankCapacity (vehid) - rfs_VehicleFuel [vehid];
  362.         }
  363.         Update3DTextLabelText (rfs_3dtd_vehicle_refilling [vehid], COLOR_YELLOW, "This vehicle is being refilled.");
  364.         Attach3DTextLabelToVehicle (rfs_3dtd_vehicle_refilling [vehid], vehid, 0.0, 0.0, 1.5);
  365.         veh_display [vehid] = 0;
  366.         HideTextDraws (playerid);
  367.         rfs_ChoosingFuelAmount [playerid] = 0;
  368.         TogglePlayerControllable (playerid, 0);
  369.         RefillTimer [vehid] = SetTimerEx ("Refilling", 75, 1, "ddf", playerid, vehid, amount);
  370.     }
  371.     return 0;
  372. }
  373.  
  374. stock HideTextDraws (playerid)
  375. {
  376.     TextDrawHideForPlayer (playerid, rfs_td_distance [pl_vehid [playerid]]);
  377.     TextDrawHideForPlayer (playerid, rfs_td_fuel_available [pl_vehid [playerid]]);
  378.     TextDrawHideForPlayer (playerid, rfs_td_fuel_consumption [pl_vehid [playerid]]);
  379.     TextDrawHideForPlayer (playerid, rfs_td_dist_total [pl_vehid [playerid]]);
  380.     TextDrawHideForPlayer (playerid, rfs_td_dist_start [pl_vehid [playerid]]);
  381.     TextDrawHideForPlayer (playerid, rfs_td_time_total [pl_vehid [playerid]]);
  382.     return 1;
  383. }
  384.  
  385. public Refilling (playerid, vehicleid, Float: amount)
  386. {
  387.     new str[128];
  388.     format (str, sizeof (str), "Name: %s~n~Liters: %0.2f~n~Price: %0.2f~n~Price per liter: %0.2f", rfs_GasName (ChoosenGas [vehicleid]), iCounter [vehicleid], rfs_GasPrice (ChoosenGas [vehicleid]) * iCounter [vehicleid], rfs_GasPrice (ChoosenGas [vehicleid]));
  389.     TextDrawSetString (rfs_td_gas_station [GetPlayerVehicleID (playerid)], str);
  390.     TextDrawShowForPlayer (playerid, rfs_td_gas_station [vehicleid]);
  391.     iCounter [vehicleid] = iCounter [vehicleid] + 0.1;
  392.  
  393.     if (iCounter [vehicleid] + 0.1 > amount)
  394.     {
  395.         KillTimer (RefillTimer [vehicleid]);
  396.         rfs_VehicleFuel [vehicleid] = rfs_VehicleFuel [vehicleid] + iCounter [vehicleid];
  397.         SetTimerEx ("HideTDGasStation", 3000, 0, "dd", playerid, vehicleid);
  398.         new price = floatround (iCounter [vehicleid] * rfs_GasPrice (ChoosenGas [vehicleid]), floatround_floor);
  399.         GivePlayerMoney (playerid, - price);
  400.         iCounter [vehicleid] = 0.0;
  401.         TogglePlayerControllable (playerid, 1);
  402.         RefillTimer [vehicleid] = 0;
  403.         Update3DTextLabelText (rfs_3dtd_vehicle_refilling [vehicleid], COLOR_YELLOW, " ");
  404.     }
  405. }
  406.  
  407. public HideTDGasStation (playerid, vehicleid)
  408. {
  409.     TextDrawHideForPlayer (playerid, rfs_td_gas_station [vehicleid]);
  410.     veh_display [vehicleid] = 1;
  411. }
  412.  
  413. public rfs_GasChosen (playerid, i)
  414. {
  415.     new str[128];
  416.     format (str, sizeof (str), "Gas station worker: You need some %s? Alright. How many liters do you want?", rfs_GasName (i));
  417.     ProxDetector (16.0, playerid, str, COLOR_FADE1, COLOR_FADE2, COLOR_FADE3, COLOR_FADE4, COLOR_FADE5);
  418.     format (str, sizeof (str), "HINT: Type in the amount of fuel you want. Your vehicle tank can contain up to %d liters.", rfs_VehFuelTankCapacity (GetPlayerVehicleID (playerid)));
  419.     SendClientMessage (playerid, COLOR_YELLOW, str);
  420.     format (str, sizeof (str), "Name: %s~n~Liters: 0.00~n~Price: 0.00~n~Price per liter: %0.2f", rfs_GasName (i), rfs_GasPrice (i));
  421.     TextDrawSetString (rfs_td_gas_station [GetPlayerVehicleID (playerid)], str);
  422.     HideTextDraws (playerid);
  423.     TextDrawShowForPlayer (playerid, rfs_td_gas_station [GetPlayerVehicleID (playerid)]);
  424.     ChoosenGas [GetPlayerVehicleID (playerid)] = i;
  425.     rfs_ChoosingGasType [playerid] = 0;
  426.     rfs_ChoosingFuelAmount [playerid] = 1;
  427.     return 0;
  428. }
  429.  
  430. stock rfs_GasName (i)
  431. {
  432.     new str[12];
  433.     switch (i)
  434.     {
  435.         case 0: { format (str, sizeof (str), "regular gas"); }
  436.         case 1: { format (str, sizeof (str), "midgrade"); }
  437.         case 2: { format (str, sizeof (str), "premium"); }
  438.         case 3: { format (str, sizeof (str), "diesel fuel"); }
  439.     }
  440.     return str;
  441. }
  442.  
  443. Float: rfs_GasPrice (i)
  444. {
  445.     switch (i)
  446.     {
  447.         case 0: { return REGULARGAS_PRICE; }
  448.         case 1: { return MIDGRADE_PRICE; }
  449.         case 2: { return PREMIUM_PRICE; }
  450.         case 3: { return DIESELFUEL_PRICE; }
  451.     }
  452.     return -1.0;
  453. }
  454.  
  455. stock rfs_VehFuelTankCapacity (vehicleid)
  456. {
  457.     new modelid = GetVehicleModel (vehicleid);
  458.     switch (VehicleType (modelid))
  459.     {
  460.         case 1: { return 70; }
  461.         case 2: { return 60; }
  462.         case 3: { return 80; }
  463.         case 4: { return 130; }
  464.         case 5: { return 25; }
  465.         case 6: { return 200; }
  466.     }
  467.     return -1;
  468. }
  469.  
  470. stock VehicleType (modelid)
  471. {
  472.     new g = 0;
  473.     for (new i = 0; i < sizeof (rfs_SportVehicles); i++)
  474.     {
  475.         if (modelid == rfs_SportVehicles[i]) { g = 1; }
  476.     }
  477.    
  478.     for (new i = 0; i < sizeof (rfs_CommonVehicles); i++)
  479.     {
  480.         if (modelid == rfs_CommonVehicles[i]) { g = 2; }
  481.     }
  482.    
  483.     for (new i = 0; i < sizeof (rfs_OffRoadVehicles); i++)
  484.     {
  485.         if (modelid == rfs_OffRoadVehicles[i]) { g = 3; }
  486.     }
  487.    
  488.     for (new i = 0; i < sizeof (rfs_Trucks); i++)
  489.     {
  490.         if (modelid == rfs_Trucks[i]) { g = 4; }
  491.     }
  492.  
  493.     for (new i = 0; i < sizeof (rfs_Bikes); i++)
  494.     {
  495.         if (modelid == rfs_Bikes[i]) { g = 5; }
  496.     }
  497.    
  498.     for (new i = 0; i < sizeof (rfs_AirVehicles); i++)
  499.     {
  500.         if (modelid == rfs_AirVehicles[i]) { g = 6; }
  501.     }
  502.     return g;
  503. }
  504.  
  505. stock strreplace(string[], find, replace)
  506. {
  507.     for(new i=0; string[i]; i++)
  508.     {
  509.         if(string[i] == find)
  510.         {
  511.             string[i] = replace;
  512.         }
  513.     }
  514. }
  515.  
  516. public ProxDetector(Float:radi, playerid, string[], col1, col2, col3, col4, col5)
  517. {
  518.     if(IsPlayerConnected(playerid))
  519.     {
  520.         new Float:posx, Float:posy, Float:posz;
  521.         new Float:oldposx, Float:oldposy, Float:oldposz;
  522.         new Float:tempposx, Float:tempposy, Float:tempposz;
  523.         GetPlayerPos(playerid, oldposx, oldposy, oldposz);
  524.         for(new i = 0; i < MAX_PLAYERS; i++)
  525.         {
  526.             if(IsPlayerConnected(i) && (GetPlayerVirtualWorld(playerid) == GetPlayerVirtualWorld(i)))
  527.             {
  528.                 GetPlayerPos(i, posx, posy, posz);
  529.                 tempposx = (oldposx -posx);
  530.                 tempposy = (oldposy -posy);
  531.                 tempposz = (oldposz -posz);
  532.                 if (((tempposx < radi/16) && (tempposx > -radi/16)) && ((tempposy < radi/16) && (tempposy > -radi/16)) && ((tempposz < radi/16) && (tempposz > -radi/16)))
  533.                 {
  534.                     SendClientMessage(i, col1, string);
  535.                 }
  536.                 else if (((tempposx < radi/8) && (tempposx > -radi/8)) && ((tempposy < radi/8) && (tempposy > -radi/8)) && ((tempposz < radi/8) && (tempposz > -radi/8)))
  537.                 {
  538.                     SendClientMessage(i, col2, string);
  539.                 }
  540.                 else if (((tempposx < radi/4) && (tempposx > -radi/4)) && ((tempposy < radi/4) && (tempposy > -radi/4)) && ((tempposz < radi/4) && (tempposz > -radi/4)))
  541.                 {
  542.                     SendClientMessage(i, col3, string);
  543.                 }
  544.                 else if (((tempposx < radi/2) && (tempposx > -radi/2)) && ((tempposy < radi/2) && (tempposy > -radi/2)) && ((tempposz < radi/2) && (tempposz > -radi/2)))
  545.                 {
  546.                     SendClientMessage(i, col4, string);
  547.                 }
  548.                 else if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
  549.                 {
  550.                     SendClientMessage(i, col5, string);
  551.                 }
  552.             }
  553.             else
  554.             {
  555.                 SendClientMessage(i, col1, string);
  556.             }
  557.         }
  558.     }
  559.  
  560.     return 1;
  561. }
  562.  
  563. public OnPlayerStateChange (playerid, newstate, oldstate)
  564. {
  565.     if (oldstate == PLAYER_STATE_ONFOOT && newstate == PLAYER_STATE_DRIVER)
  566.     {
  567.         new str[64], vehid = GetPlayerVehicleID (playerid);
  568.         if (VehicleType (GetVehicleModel (vehid)) == 0) return 1;
  569.    
  570.         if (FirstTimeInVehicle [vehid])
  571.         {
  572.             GetVehiclePos (vehid, old_veh_pos [vehid][0], old_veh_pos [vehid][1], old_veh_pos [vehid][2]);
  573.             FirstTimeInVehicle [vehid] = 0;
  574.             rfs_VehicleFuel [vehid] = randnumb (1, rfs_VehFuelTankCapacity (vehid));
  575.             format (str, sizeof (str), "Distance~n~     %d km", floatround (rfs_VehicleFuel [vehid] / VehicleConsumption (vehid) * 100, floatround_tozero));
  576.             TextDrawSetString (rfs_td_distance [vehid], str);
  577.             format (str, sizeof (str), "Fuel available~n~%0.1f liters (%d%%)", rfs_VehicleFuel [vehid], floatround ((100 * rfs_VehicleFuel [vehid]) / rfs_VehFuelTankCapacity (vehid), floatround_tozero));
  578.             TextDrawSetString (rfs_td_fuel_available [vehid], str);
  579.             format (str, sizeof (str), "Fuel consumption~n~%0.1f liters/100 km", VehicleConsumption (vehid));
  580.             TextDrawSetString (rfs_td_fuel_consumption [vehid], str);
  581.             TextDrawShowForPlayer (playerid, rfs_td_distance [GetPlayerVehicleID (playerid)]);
  582.             veh_display [vehid] = 1;
  583.             SetTimerEx ("UpdateTime", 60000, 1, "dd", playerid, vehid);
  584.         }
  585.  
  586.         switch (veh_display [vehid])
  587.         {
  588.             case 1:
  589.             {
  590.                 TextDrawShowForPlayer (playerid, rfs_td_distance [vehid]);
  591.             }
  592.             case 2:
  593.             {
  594.                 TextDrawShowForPlayer (playerid, rfs_td_fuel_available [vehid]);
  595.             }
  596.             case 3:
  597.             {
  598.                 TextDrawShowForPlayer (playerid, rfs_td_fuel_consumption [vehid]);
  599.             }
  600.             case 4:
  601.             {
  602.                 TextDrawShowForPlayer (playerid, rfs_td_dist_total [vehid]);
  603.             }
  604.             case 5:
  605.             {
  606.                 TextDrawShowForPlayer (playerid, rfs_td_dist_start [vehid]);
  607.             }
  608.             case 6:
  609.             {
  610.                 TextDrawShowForPlayer (playerid, rfs_td_time_total [vehid]);
  611.             }
  612.         }
  613.        
  614.         pl_vehid [playerid] = vehid;
  615.     }
  616.    
  617.     if (newstate == PLAYER_STATE_ONFOOT && oldstate == PLAYER_STATE_DRIVER)
  618.     {
  619.         HideTextDraws (playerid);
  620.     }
  621.     return 1;
  622. }
  623.  
  624. //////////////
  625. new Minutes [MAX_VEHICLES];
  626. forward UpdateTime (playerid, vehicleid);
  627. public UpdateTime (playerid, vehicleid)
  628. {
  629.     Minutes [vehicleid] ++;
  630.     new hours, str[64], tempmin;
  631.     hours = floatround (Minutes [vehicleid] / 60, floatround_floor);
  632.     tempmin = Minutes [vehicleid] - 60 * hours;
  633.     if (hours < 10)
  634.     {
  635.         if (tempmin < 10)
  636.         {
  637.             format (str, sizeof (str), "Time elapsed~n~in total:  0%d:0%d", hours, tempmin);
  638.         }
  639.         else
  640.         {
  641.             format (str, sizeof (str), "Time elapsed~n~in total:  0%d:%d", hours, tempmin);
  642.         }
  643.     }
  644.     else
  645.     {
  646.         if (tempmin < 10)
  647.         {
  648.             format (str, sizeof (str), "Time elapsed~n~in total:  %d:0%d", hours, tempmin);
  649.         }
  650.         else
  651.         {
  652.             format (str, sizeof (str), "Time elapsed~n~in total:  %d:%d", hours, tempmin);
  653.         }
  654.     }
  655.     TextDrawSetString (rfs_td_time_total [vehicleid], str);
  656. }
  657. //////////////
  658.  
  659. stock randnumb (min, max)
  660. {
  661.     return random (max - min) + min;
  662. }
  663.  
  664. public OnDialogResponse (playerid, dialogid, response, listitem, inputtext[])
  665. {
  666.     if (dialogid == DISPLAY_DIALOG_ID)
  667.     {
  668.         if (response)
  669.         {
  670.             new vehid = GetPlayerVehicleID (playerid);
  671.             if (VehicleType (GetVehicleModel (vehid) == 0 )) return 1;
  672.             switch (listitem)
  673.             {
  674.                 case 0:
  675.                 {
  676.                     veh_display [vehid] = 1;
  677.                     HideTextDraws (playerid);
  678.                     TextDrawShowForPlayer (playerid, rfs_td_distance [vehid]);
  679.                 }
  680.                 case 1:
  681.                 {
  682.                     veh_display [vehid] = 2;
  683.                     HideTextDraws (playerid);
  684.                     TextDrawShowForPlayer (playerid, rfs_td_fuel_available [vehid]);
  685.                 }
  686.                 case 2:
  687.                 {
  688.                     veh_display [vehid] = 3;
  689.                     HideTextDraws (playerid);
  690.                     TextDrawShowForPlayer (playerid, rfs_td_fuel_consumption [vehid]);
  691.                 }
  692.                 case 3:
  693.                 {
  694.                     veh_display [vehid] = 4;
  695.                     HideTextDraws (playerid);
  696.                     TextDrawShowForPlayer (playerid, rfs_td_dist_total [vehid]);
  697.                 }
  698.                 case 4:
  699.                 {
  700.                     veh_display [vehid] = 5;
  701.                     HideTextDraws (playerid);
  702.                     TextDrawShowForPlayer (playerid, rfs_td_dist_start [vehid]);
  703.                 }
  704.                 case 5:
  705.                 {
  706.                     veh_display [vehid] = 6;
  707.                     HideTextDraws (playerid);
  708.                     TextDrawShowForPlayer (playerid, rfs_td_time_total [vehid]);
  709.                 }
  710.             }
  711.         }
  712.     }
  713.     return 1;
  714. }
  715.  
  716. Float: VehicleConsumption (vehid)
  717. {
  718.     if (VehicleType (GetVehicleModel (vehid) == 0 )) return -1.0;
  719.     new Float: speed [3], multiplier, final_speed, Float: health;
  720.     GetVehicleVelocity (vehid, speed [0], speed [1], speed [2]);
  721.     final_speed = floatround (floatsqroot (floatpower (speed [0], 2) + floatpower (speed [1], 2) + floatpower (speed [2], 2)) * 160.666667, floatround_round);
  722.     GetVehicleHealth (vehid, health);
  723.  
  724.     switch (VehicleType (GetVehicleModel (vehid)))
  725.     {
  726.         case 1:
  727.         {
  728.             if (final_speed <= 80.0)
  729.             {
  730.                 multiplier = floatround (final_speed / 10, floatround_round);
  731.             }
  732.             else
  733.             {
  734.                 multiplier = - floatround (final_speed / 10, floatround_round);
  735.             }
  736.        
  737.             return 9.5 + multiplier * 0.02 + (10.0 - health / 100) / 2;
  738.         }
  739.         case 2:
  740.         {
  741.             if (final_speed <= 65.0)
  742.             {
  743.                 multiplier = floatround (final_speed / 10, floatround_round);
  744.             }
  745.             else
  746.             {
  747.                 multiplier = - floatround (final_speed / 10, floatround_round);
  748.             }
  749.             return 7.5 + multiplier * 0.02 + (10.0 - health / 100) / 2;
  750.         }
  751.         case 3:
  752.         {
  753.             if (final_speed <= 85.0)
  754.             {
  755.                 multiplier = floatround (final_speed / 10, floatround_round);
  756.             }
  757.             else
  758.             {
  759.                 multiplier = - floatround (final_speed / 10, floatround_round);
  760.             }
  761.             return 10.5 + multiplier * 0.02 + (10.0 - health / 100) / 2;
  762.         }
  763.         case 4:
  764.         {
  765.             if (final_speed <= 75.0)
  766.             {
  767.                 multiplier = floatround (final_speed / 10, floatround_round);
  768.             }
  769.             else
  770.             {
  771.                 multiplier = - floatround (final_speed / 10, floatround_round);
  772.             }
  773.             return 15.5 + multiplier * 0.02 + (10.0 - health / 100) / 2;
  774.         }
  775.         case 5:
  776.         {
  777.             if (final_speed <= 60.0)
  778.             {
  779.                 multiplier = floatround (final_speed / 10, floatround_round);
  780.             }
  781.             else
  782.             {
  783.                 multiplier = - floatround (final_speed / 10, floatround_round);
  784.             }
  785.             return 4.5 + multiplier * 0.02 + (10.0 - health / 100) / 2;
  786.         }
  787.         case 6:
  788.         {
  789.             multiplier = floatround (final_speed / 10, floatround_round);
  790.             return 20.0 + multiplier * 0.02 + (10.0 - health / 100) / 2;
  791.         }
  792.     }
  793.     return -1.0;
  794. }
  795.  
  796. public UpdateDisplay ()
  797. {
  798.     for (new i = 0; i < MAX_PLAYERS; i++)
  799.     {
  800.         if (IsPlayerConnected (i))
  801.         {
  802.             if (IsPlayerInAnyVehicle (i))
  803.             {
  804.                 if (GetPlayerState (i) == PLAYER_STATE_DRIVER)
  805.                 {
  806.                     new vehid = GetPlayerVehicleID (i);
  807.                     if (VehicleType (GetVehicleModel (vehid) < 0 )) return 0;
  808.                     new str[64];
  809.  
  810.                     format (str, sizeof (str), "Fuel available~n~%0.1f liters (%d%%)", rfs_VehicleFuel [vehid], floatround ((100 * rfs_VehicleFuel [vehid]) / rfs_VehFuelTankCapacity (vehid), floatround_tozero));
  811.                     TextDrawSetString (rfs_td_fuel_available [vehid], str);
  812.                    
  813.                     format (str, sizeof (str), "Fuel consumption~n~%0.1f liters/100 km", VehicleConsumption (vehid));
  814.                     TextDrawSetString (rfs_td_fuel_consumption [vehid], str);
  815.                 }
  816.             }
  817.         }
  818.     }
  819.     return 1;
  820. }
  821.  
  822. public UpdateDistance ()
  823. {
  824.     for (new i = 0; i < MAX_PLAYERS; i++)
  825.     {
  826.         if (IsPlayerConnected (i))
  827.         {
  828.             if (IsPlayerInAnyVehicle (i))
  829.             {
  830.                 if (GetPlayerState (i) == PLAYER_STATE_DRIVER)
  831.                 {
  832.                     new vehid = GetPlayerVehicleID (i);
  833.                     if (VehicleType (GetVehicleModel (vehid) < 0 )) return 0;
  834.                     new Float: vehpos [3];
  835.                     new str[64];
  836.                     GetVehiclePos (vehid, vehpos [0], vehpos [1], vehpos [2]);
  837.                     vehpos [0] = vehpos [0] - old_veh_pos [vehid][0];
  838.                     vehpos [1] = vehpos [1] - old_veh_pos [vehid][1];
  839.                     vehpos [2] = vehpos [2] - old_veh_pos [vehid][2];
  840.                     GetVehiclePos (vehid, old_veh_pos [vehid][0], old_veh_pos [vehid][1], old_veh_pos [vehid][2]);
  841.                    
  842.                     new Float: distance = floatsqroot (vehpos [0] * vehpos [0] + vehpos [1] * vehpos [1] + vehpos [2] * vehpos [2]);
  843.                    
  844.                     TotalDistance [vehid] = TotalDistance [vehid] + distance * 4 / 5;
  845.                     DistanceFromStart [vehid] = DistanceFromStart [vehid] + distance * 4 / 5;
  846.                    
  847.                     if (distance != 0)
  848.                     {
  849.                         rfs_VehicleFuel [vehid] = rfs_VehicleFuel [vehid] - VehicleConsumption (vehid) / 25000 * distance;
  850.                     }
  851.                     else
  852.                     {
  853.                         rfs_VehicleFuel [vehid] = rfs_VehicleFuel [vehid] - VehicleConsumption (vehid) / 25000 * 20;
  854.                     }
  855.                     format (str, sizeof (str), "Distance~n~     %d km", floatround (rfs_VehicleFuel [vehid] / VehicleConsumption (vehid) * 100, floatround_tozero));
  856.                     TextDrawSetString (rfs_td_distance [vehid], str);
  857.                    
  858.                     format (str, sizeof (str), "Distance travelled~n~in total:   %0.3f km", TotalDistance [vehid] / 1000);
  859.                     TextDrawSetString (rfs_td_dist_total [vehid], str);
  860.                    
  861.                     format (str, sizeof (str), "Distance travelled~n~since start:   %0.3f km", DistanceFromStart [vehid] / 1000);
  862.                     TextDrawSetString (rfs_td_dist_start [vehid], str);
  863.                 }
  864.             }
  865.         }
  866.     }
  867.     return 1;
  868. }
  869.  
  870. public UpdateTextDraws ()
  871. {
  872.     for (new i = 0; i < MAX_PLAYERS; i++)
  873.     {
  874.         if (IsPlayerConnected (i))
  875.         {
  876.             if (IsPlayerInAnyVehicle (i))
  877.             {
  878.                 if (GetPlayerState (i) == PLAYER_STATE_DRIVER)
  879.                 {
  880.                     new vehid = GetPlayerVehicleID (i);
  881.                     if (VehicleType (GetVehicleModel (vehid) == 0 )) continue;
  882.                     switch (veh_display [vehid])
  883.                     {
  884.                         case 0:
  885.                         {
  886.                             HideTextDraws (i);
  887.                         }
  888.                         case 1:
  889.                         {
  890.                             HideTextDraws (i);
  891.                             TextDrawShowForPlayer (i, rfs_td_distance [vehid]);
  892.                         }
  893.                         case 2:
  894.                         {
  895.                             HideTextDraws (i);
  896.                             TextDrawShowForPlayer (i, rfs_td_fuel_available [vehid]);
  897.                         }
  898.                         case 3:
  899.                         {
  900.                             HideTextDraws (i);
  901.                             TextDrawShowForPlayer (i, rfs_td_fuel_consumption [vehid]);
  902.                         }
  903.                         case 4:
  904.                         {
  905.                             HideTextDraws (i);
  906.                             TextDrawShowForPlayer (i, rfs_td_dist_total [vehid]);
  907.                         }
  908.                         case 5:
  909.                         {
  910.                             HideTextDraws (i);
  911.                             TextDrawShowForPlayer (i, rfs_td_dist_start [vehid]);
  912.                         }
  913.                         case 6:
  914.                         {
  915.                             HideTextDraws (i);
  916.                             TextDrawShowForPlayer (i, rfs_td_time_total [vehid]);
  917.                         }
  918.                     }
  919.                 }
  920.             }
  921.             else
  922.             {
  923.                 HideTextDraws (i);
  924.                 pl_vehid [i] = INVALID_VEHICLE_ID;
  925.             }
  926.         }
  927.     }
  928.     return 1;
  929. }
  930.  
  931. // Credits to Srdjan
Add Comment
Please, Sign In to add comment