Guest User

Core.pwn

a guest
Aug 24th, 2015
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 28.39 KB | None | 0 0
  1. #include <YSI\y_hooks>
  2.  
  3.  
  4. #define VEHICLE_HEALTH_MIN (250.0)
  5. #define VEHICLE_HEALTH_CHUNK_1 (300.0)
  6. #define VEHICLE_HEALTH_CHUNK_2 (450.0)
  7. #define VEHICLE_HEALTH_CHUNK_3 (650.0)
  8. #define VEHICLE_HEALTH_CHUNK_4 (800.0)
  9. #define VEHICLE_HEALTH_MAX (990.0)
  10.  
  11. #define VEHICLE_HEALTH_CHUNK_1_COLOUR 0xFF0000FF
  12. #define VEHICLE_HEALTH_CHUNK_2_COLOUR 0xFF7700FF
  13. #define VEHICLE_HEALTH_CHUNK_3_COLOUR 0xFFFF00FF
  14. #define VEHICLE_HEALTH_CHUNK_4_COLOUR 0x808000FF
  15.  
  16. #define VEHICLE_UI_INACTIVE 0xFF0000FF
  17. #define VEHICLE_UI_ACTIVE 0x808000FF
  18.  
  19.  
  20.  
  21. enum E_VEHICLE_DATA
  22. {
  23. veh_type,
  24. Float: veh_health,
  25. Float: veh_Fuel,
  26. veh_key,
  27. veh_engine,
  28. veh_panels,
  29. veh_doors,
  30. veh_lights,
  31. veh_tires,
  32. veh_armour,
  33. veh_colour1,
  34. veh_colour2,
  35. Float: veh_spawnX,
  36. Float: veh_spawnY,
  37. Float: veh_spawnZ,
  38. Float: veh_spawnR,
  39.  
  40. veh_lastUsed,
  41. veh_used,
  42. veh_occupied,
  43. veh_dead
  44. }
  45.  
  46.  
  47. static
  48. veh_Data [MAX_VEHICLES][E_VEHICLE_DATA],
  49. veh_TypeCount [MAX_VEHICLE_TYPE];
  50.  
  51. new
  52. Iterator: veh_Index<MAX_VEHICLES>;
  53.  
  54. static
  55. PlayerText: veh_FuelUI [MAX_PLAYERS] = {PlayerText:INVALID_TEXT_DRAW, ...},
  56. PlayerText: veh_DamageUI [MAX_PLAYERS] = {PlayerText:INVALID_TEXT_DRAW, ...},
  57. PlayerText: veh_EngineUI [MAX_PLAYERS] = {PlayerText:INVALID_TEXT_DRAW, ...},
  58. PlayerText: veh_DoorsUI [MAX_PLAYERS] = {PlayerText:INVALID_TEXT_DRAW, ...},
  59. PlayerText: veh_NameUI [MAX_PLAYERS] = {PlayerText:INVALID_TEXT_DRAW, ...},
  60. PlayerText: veh_SpeedUI [MAX_PLAYERS] = {PlayerText:INVALID_TEXT_DRAW, ...},
  61.  
  62. Float: veh_TempHealth [MAX_PLAYERS],
  63. Float: veh_TempVelocity [MAX_PLAYERS],
  64. veh_Entering [MAX_PLAYERS],
  65. veh_EnterTick [MAX_PLAYERS];
  66.  
  67.  
  68. forward OnVehicleCreated(vehicleid);
  69. forward OnVehicleDestroyed(vehicleid);
  70. forward OnVehicleReset(oldid, newid);
  71.  
  72.  
  73. hook OnPlayerConnect(playerid)
  74. {
  75. veh_NameUI[playerid] =CreatePlayerTextDraw(playerid, 621.000000, 415.000000, "Infernus");
  76. PlayerTextDrawAlignment (playerid, veh_NameUI[playerid], 3);
  77. PlayerTextDrawBackgroundColor (playerid, veh_NameUI[playerid], 255);
  78. PlayerTextDrawFont (playerid, veh_NameUI[playerid], 2);
  79. PlayerTextDrawLetterSize (playerid, veh_NameUI[playerid], 0.349999, 1.799998);
  80. PlayerTextDrawColor (playerid, veh_NameUI[playerid], -1);
  81. PlayerTextDrawSetOutline (playerid, veh_NameUI[playerid], 1);
  82. PlayerTextDrawSetProportional (playerid, veh_NameUI[playerid], 1);
  83.  
  84. veh_SpeedUI[playerid] =CreatePlayerTextDraw(playerid, 620.000000, 401.000000, "220km/h");
  85. PlayerTextDrawAlignment (playerid, veh_SpeedUI[playerid], 3);
  86. PlayerTextDrawBackgroundColor (playerid, veh_SpeedUI[playerid], 255);
  87. PlayerTextDrawFont (playerid, veh_SpeedUI[playerid], 2);
  88. PlayerTextDrawLetterSize (playerid, veh_SpeedUI[playerid], 0.250000, 1.599998);
  89. PlayerTextDrawColor (playerid, veh_SpeedUI[playerid], -1);
  90. PlayerTextDrawSetOutline (playerid, veh_SpeedUI[playerid], 1);
  91. PlayerTextDrawSetProportional (playerid, veh_SpeedUI[playerid], 1);
  92.  
  93. veh_FuelUI[playerid] =CreatePlayerTextDraw(playerid, 620.000000, 386.000000, "0.0/0.0L");
  94. PlayerTextDrawAlignment (playerid, veh_FuelUI[playerid], 3);
  95. PlayerTextDrawBackgroundColor (playerid, veh_FuelUI[playerid], 255);
  96. PlayerTextDrawFont (playerid, veh_FuelUI[playerid], 2);
  97. PlayerTextDrawLetterSize (playerid, veh_FuelUI[playerid], 0.250000, 1.599999);
  98. PlayerTextDrawColor (playerid, veh_FuelUI[playerid], -1);
  99. PlayerTextDrawSetOutline (playerid, veh_FuelUI[playerid], 1);
  100. PlayerTextDrawSetProportional (playerid, veh_FuelUI[playerid], 1);
  101.  
  102. veh_DamageUI[playerid] =CreatePlayerTextDraw(playerid, 620.000000, 371.000000, "DMG");
  103. PlayerTextDrawAlignment (playerid, veh_DamageUI[playerid], 3);
  104. PlayerTextDrawBackgroundColor (playerid, veh_DamageUI[playerid], 255);
  105. PlayerTextDrawFont (playerid, veh_DamageUI[playerid], 2);
  106. PlayerTextDrawLetterSize (playerid, veh_DamageUI[playerid], 0.250000, 1.599999);
  107. PlayerTextDrawColor (playerid, veh_DamageUI[playerid], RED);
  108. PlayerTextDrawSetOutline (playerid, veh_DamageUI[playerid], 1);
  109. PlayerTextDrawSetProportional (playerid, veh_DamageUI[playerid], 1);
  110.  
  111. veh_EngineUI[playerid] =CreatePlayerTextDraw(playerid, 620.000000, 356.000000, "ENG");
  112. PlayerTextDrawAlignment (playerid, veh_EngineUI[playerid], 3);
  113. PlayerTextDrawBackgroundColor (playerid, veh_EngineUI[playerid], 255);
  114. PlayerTextDrawFont (playerid, veh_EngineUI[playerid], 2);
  115. PlayerTextDrawLetterSize (playerid, veh_EngineUI[playerid], 0.250000, 1.599999);
  116. PlayerTextDrawColor (playerid, veh_EngineUI[playerid], RED);
  117. PlayerTextDrawSetOutline (playerid, veh_EngineUI[playerid], 1);
  118. PlayerTextDrawSetProportional (playerid, veh_EngineUI[playerid], 1);
  119.  
  120. veh_DoorsUI[playerid] =CreatePlayerTextDraw(playerid, 620.000000, 341.000000, "DOR");
  121. PlayerTextDrawAlignment (playerid, veh_DoorsUI[playerid], 3);
  122. PlayerTextDrawBackgroundColor (playerid, veh_DoorsUI[playerid], 255);
  123. PlayerTextDrawFont (playerid, veh_DoorsUI[playerid], 2);
  124. PlayerTextDrawLetterSize (playerid, veh_DoorsUI[playerid], 0.250000, 1.599999);
  125. PlayerTextDrawColor (playerid, veh_DoorsUI[playerid], RED);
  126. PlayerTextDrawSetOutline (playerid, veh_DoorsUI[playerid], 1);
  127. PlayerTextDrawSetProportional (playerid, veh_DoorsUI[playerid], 1);
  128. }
  129.  
  130. SetPlayerVehicleSpeedUI(playerid, str[])
  131. {
  132. PlayerTextDrawSetString(playerid, veh_SpeedUI[playerid], str);
  133. }
  134.  
  135.  
  136. /*==============================================================================
  137.  
  138. Core
  139.  
  140. ==============================================================================*/
  141.  
  142.  
  143. stock CreateWorldVehicle(type, Float:x, Float:y, Float:z, Float:r, colour1, colour2, world = 0)
  144. {
  145. if(!(0 <= type < veh_TypeTotal))
  146. {
  147. printf("ERROR: Tried to create invalid vehicle type (%d).", type);
  148. return 0;
  149. }
  150.  
  151. //printf("[CreateWorldVehicle] Creating vehicle of type %d model %d at %f, %f, %f", type, veh_TypeData[type][veh_modelId], x, y, z);
  152.  
  153. new vehicleid = _veh_create(type, x, y, z, r, colour1, colour2, world);
  154.  
  155. veh_TypeCount[type]++;
  156.  
  157. CallLocalFunction("OnVehicleCreated", "d", vehicleid);
  158. _veh_SyncData(vehicleid);
  159.  
  160. return vehicleid;
  161. }
  162.  
  163. stock DestroyWorldVehicle(vehicleid)
  164. {
  165. if(!IsValidVehicle(vehicleid))
  166. return 0;
  167.  
  168. CallLocalFunction("OnVehicleDestroyed", "d", vehicleid);
  169. DestroyVehicle(vehicleid, 3);
  170. Iter_Remove(veh_Index, vehicleid);
  171.  
  172. return 1;
  173. }
  174.  
  175. stock ResetVehicle(vehicleid)
  176. {
  177. new
  178. type = GetVehicleType(vehicleid),
  179. tmp[E_VEHICLE_DATA],
  180. newid;
  181.  
  182. tmp = veh_Data[vehicleid];
  183.  
  184. DestroyVehicle(vehicleid, 4);
  185.  
  186. newid = _veh_create(type,
  187. veh_Data[vehicleid][veh_spawnX],
  188. veh_Data[vehicleid][veh_spawnY],
  189. veh_Data[vehicleid][veh_spawnZ],
  190. veh_Data[vehicleid][veh_spawnR],
  191. veh_Data[vehicleid][veh_colour1],
  192. veh_Data[vehicleid][veh_colour2]);
  193.  
  194. CallLocalFunction("OnVehicleReset", "dd", vehicleid, newid);
  195.  
  196. veh_Data[newid] = tmp;
  197.  
  198. _veh_SyncData(newid);
  199. SetVehicleSpawnPoint(newid, veh_Data[newid][veh_spawnX], veh_Data[newid][veh_spawnY], veh_Data[newid][veh_spawnZ], veh_Data[newid][veh_spawnR]);
  200. }
  201.  
  202. stock RespawnVehicle(vehicleid)
  203. {
  204. SetVehicleToRespawn(vehicleid);
  205. _veh_SyncData(vehicleid);
  206. }
  207.  
  208.  
  209. /*==============================================================================
  210.  
  211. Internal
  212.  
  213. ==============================================================================*/
  214.  
  215.  
  216. _veh_create(type, Float:x, Float:y, Float:z, Float:r, colour1, colour2, world = 0)
  217. {
  218. new vehicleid = CreateVehicle(GetVehicleTypeModel(type), x, y, z, r, colour1, colour2, 864000);
  219.  
  220. if(!IsValidVehicle(vehicleid))
  221. return 0;
  222.  
  223. SetVehicleVirtualWorld(vehicleid, world);
  224.  
  225. veh_Data[vehicleid][veh_type] = type;
  226. veh_Data[vehicleid][veh_health] = VEHICLE_HEALTH_MAX;
  227. veh_Data[vehicleid][veh_Fuel] = 0.0;
  228. veh_Data[vehicleid][veh_key] = 0;
  229.  
  230. veh_Data[vehicleid][veh_engine] = 0;
  231. veh_Data[vehicleid][veh_panels] = 0;
  232. veh_Data[vehicleid][veh_doors] = 0;
  233. veh_Data[vehicleid][veh_lights] = 0;
  234. veh_Data[vehicleid][veh_tires] = 0;
  235.  
  236. veh_Data[vehicleid][veh_armour] = 0;
  237.  
  238. veh_Data[vehicleid][veh_colour1] = colour1;
  239. veh_Data[vehicleid][veh_colour2] = colour2;
  240.  
  241. veh_Data[vehicleid][veh_spawnX] = x;
  242. veh_Data[vehicleid][veh_spawnY] = y;
  243. veh_Data[vehicleid][veh_spawnZ] = z;
  244. veh_Data[vehicleid][veh_spawnR] = r;
  245.  
  246. veh_Data[vehicleid][veh_lastUsed] = 0;
  247. veh_Data[vehicleid][veh_used] = 0;
  248. veh_Data[vehicleid][veh_occupied] = 0;
  249. veh_Data[vehicleid][veh_dead] = 0;
  250.  
  251. return vehicleid;
  252. }
  253.  
  254. _veh_SyncData(vehicleid)
  255. {
  256. if(veh_Data[vehicleid][veh_health] > VEHICLE_HEALTH_MAX)
  257. veh_Data[vehicleid][veh_health] = VEHICLE_HEALTH_CHUNK_4;
  258.  
  259. SetVehicleHealth(vehicleid, veh_Data[vehicleid][veh_health]);
  260.  
  261. UpdateVehicleDamageStatus(vehicleid, veh_Data[vehicleid][veh_panels], veh_Data[vehicleid][veh_doors], veh_Data[vehicleid][veh_lights], veh_Data[vehicleid][veh_tires]);
  262.  
  263. if(VEHICLE_CATEGORY_MOTORBIKE <= GetVehicleTypeCategory(GetVehicleType(vehicleid)) <= VEHICLE_CATEGORY_PUSHBIKE)
  264. SetVehicleParamsEx(vehicleid, 1, 0, 0, 0, 0, 0, 0);
  265.  
  266. else
  267. SetVehicleParamsEx(vehicleid, 0, 0, 0, IsVehicleLocked(vehicleid), 0, 0, 0);
  268.  
  269. return 1;
  270. }
  271.  
  272.  
  273. hook OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  274. {
  275. if(IsPlayerKnockedOut(playerid))
  276. return 0;
  277.  
  278. if(IsPlayerInAnyVehicle(playerid))
  279. {
  280. new vehicleid = GetPlayerVehicleID(playerid);
  281.  
  282. if(newkeys & KEY_YES)
  283. {
  284. if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
  285. {
  286. new
  287. Float:health,
  288. type = GetVehicleType(vehicleid);
  289.  
  290. GetVehicleHealth(vehicleid, health);
  291.  
  292. if(GetVehicleTypeMaxFuel(type) > 0.0)
  293. {
  294. if(health >= 300.0)
  295. {
  296. if(GetVehicleFuel(vehicleid) > 0.0)
  297. SetVehicleEngine(vehicleid, !GetVehicleEngine(vehicleid));
  298. }
  299. }
  300. }
  301. }
  302. if(newkeys & KEY_NO)
  303. {
  304. VehicleLightsState(vehicleid, !VehicleLightsState(vehicleid));
  305. }
  306. if(newkeys & KEY_CTRL_BACK)//262144)
  307. {
  308. ShowRadioUI(playerid);
  309. }
  310.  
  311. return 1;
  312. }
  313.  
  314. /*
  315. if(HOLDING(KEY_SPRINT) || PRESSED(KEY_SPRINT) || RELEASED(KEY_SPRINT))
  316. {
  317. if(GetPlayerState(playerid) == PLAYER_STATE_ENTER_VEHICLE_DRIVER)
  318. {
  319. foreach(new i : Player)
  320. {
  321. if(i == playerid)
  322. continue;
  323.  
  324. if(GetPlayerVehicleID(i) == veh_Entering[playerid])
  325. CancelPlayerMovement(playerid);
  326. }
  327. }
  328. }
  329. */
  330. return 1;
  331. }
  332.  
  333. PlayerVehicleUpdate(playerid)
  334. {
  335. new
  336. vehicleid,
  337. vehicletype,
  338. Float:health,
  339. // Float:velocitychange,
  340. Float:maxfuel,
  341. Float:fuelcons,
  342. playerstate;
  343.  
  344. vehicleid = GetPlayerVehicleID(playerid);
  345. vehicletype = GetVehicleType(vehicleid);
  346.  
  347. if(!IsValidVehicleType(vehicletype))
  348. return;
  349.  
  350. if(GetVehicleTypeCategory(vehicletype) == VEHICLE_CATEGORY_PUSHBIKE)
  351. return;
  352.  
  353. GetVehicleHealth(vehicleid, health);
  354. // velocitychange = floatabs(veh_TempVelocity[playerid] - GetPlayerTotalVelocity(playerid));
  355. maxfuel = GetVehicleTypeMaxFuel(vehicletype);
  356. fuelcons = GetVehicleTypeFuelConsumption(vehicletype);
  357. playerstate = GetPlayerState(playerid);
  358.  
  359. if(playerstate == PLAYER_STATE_DRIVER)
  360. {
  361. if(health > 300.0)
  362. {
  363. new Float:diff = veh_TempHealth[playerid] - health;
  364.  
  365. if(diff > 10.0 && veh_TempHealth[playerid] < VEHICLE_HEALTH_MAX)
  366. {
  367. health += diff * 0.8;
  368. SetVehicleHealth(vehicleid, health);
  369. }
  370. }
  371. else
  372. {
  373. SetVehicleHealth(vehicleid, 299.0);
  374. }
  375. }
  376.  
  377. // if(velocitychange > 70.0)
  378. // {
  379. // switch(GetVehicleTypeCategory(vehicletype))
  380. // {
  381. // case VEHICLE_CATEGORY_HELICOPTER, VEHICLE_CATEGORY_PLANE:
  382. // SetVehicleAngularVelocity(vehicleid, 0.0, 0.0, 1.0);
  383. //
  384. // default:
  385. // PlayerInflictWound(INVALID_PLAYER_ID, playerid, E_WND_TYPE:1, velocitychange * 0.0001136, velocitychange * 0.00166, -1, BODY_PART_HEAD, "Collision");
  386. // }
  387. // }
  388.  
  389. if(health <= VEHICLE_HEALTH_CHUNK_1)
  390. PlayerTextDrawColor(playerid, veh_DamageUI[playerid], VEHICLE_HEALTH_CHUNK_1_COLOUR);
  391.  
  392. else if(health <= VEHICLE_HEALTH_CHUNK_2)
  393. PlayerTextDrawColor(playerid, veh_DamageUI[playerid], VEHICLE_HEALTH_CHUNK_1_COLOUR);
  394.  
  395. else if(health <= VEHICLE_HEALTH_CHUNK_3)
  396. PlayerTextDrawColor(playerid, veh_DamageUI[playerid], VEHICLE_HEALTH_CHUNK_2_COLOUR);
  397.  
  398. else if(health <= VEHICLE_HEALTH_CHUNK_4)
  399. PlayerTextDrawColor(playerid, veh_DamageUI[playerid], VEHICLE_HEALTH_CHUNK_3_COLOUR);
  400.  
  401. else if(health <= VEHICLE_HEALTH_MAX)
  402. PlayerTextDrawColor(playerid, veh_DamageUI[playerid], VEHICLE_HEALTH_CHUNK_4_COLOUR);
  403.  
  404. if(maxfuel > 0.0) // If the vehicle is a fuel powered vehicle
  405. {
  406. new
  407. Float:fuel = GetVehicleFuel(vehicleid),
  408. str[18];
  409.  
  410. if(fuel <= 0.0)
  411. {
  412. SetVehicleEngine(vehicleid, 0);
  413. PlayerTextDrawColor(playerid, veh_EngineUI[playerid], VEHICLE_UI_INACTIVE);
  414. }
  415.  
  416. format(str, 18, "%.2fL/%.2f", GetVehicleFuel(vehicleid), maxfuel);
  417. PlayerTextDrawSetString(playerid, veh_FuelUI[playerid], str);
  418. PlayerTextDrawShow(playerid, veh_FuelUI[playerid]);
  419.  
  420. if(GetVehicleEngine(vehicleid))
  421. {
  422. if(fuel > 0.0)
  423. fuel -= ((fuelcons / 100) * (((GetPlayerTotalVelocity(playerid)/60)/60)/10) + 0.0001);
  424.  
  425. SetVehicleFuel(vehicleid, fuel);
  426. PlayerTextDrawColor(playerid, veh_EngineUI[playerid], VEHICLE_UI_ACTIVE);
  427.  
  428. if(health <= VEHICLE_HEALTH_CHUNK_1)
  429. {
  430. SetVehicleEngine(vehicleid, 0);
  431. PlayerTextDrawColor(playerid, veh_EngineUI[playerid], VEHICLE_UI_INACTIVE);
  432. }
  433. else if(health <= VEHICLE_HEALTH_CHUNK_2 && GetPlayerTotalVelocity(playerid) > 1.0)
  434. {
  435. new Float:enginechance = (20 - ((health - VEHICLE_HEALTH_CHUNK_2) / 3));
  436.  
  437. SetVehicleHealth(vehicleid, health - ((VEHICLE_HEALTH_CHUNK_1 - (health - VEHICLE_HEALTH_CHUNK_1)) / 1000.0));
  438.  
  439. if(GetPlayerTotalVelocity(playerid) > 30.0)
  440. {
  441. if(random(100) < enginechance)
  442. {
  443. VehicleEngineState(vehicleid, 0);
  444. PlayerTextDrawColor(playerid, veh_EngineUI[playerid], VEHICLE_UI_INACTIVE);
  445. }
  446. }
  447. else
  448. {
  449. if(random(100) < 100 - enginechance)
  450. {
  451. VehicleEngineState(vehicleid, 1);
  452. PlayerTextDrawColor(playerid, veh_EngineUI[playerid], VEHICLE_UI_ACTIVE);
  453. }
  454. }
  455. }
  456. }
  457. else
  458. {
  459. PlayerTextDrawColor(playerid, veh_EngineUI[playerid], VEHICLE_UI_INACTIVE);
  460. }
  461. }
  462. else
  463. {
  464. PlayerTextDrawHide(playerid, veh_FuelUI[playerid]);
  465. }
  466.  
  467. if(IsVehicleTypeLockable(vehicletype))
  468. {
  469. if(VehicleDoorsState(vehicleid))
  470. PlayerTextDrawColor(playerid, veh_DoorsUI[playerid], VEHICLE_UI_ACTIVE);
  471.  
  472. else
  473. PlayerTextDrawColor(playerid, veh_DoorsUI[playerid], VEHICLE_UI_INACTIVE);
  474.  
  475. PlayerTextDrawShow(playerid, veh_DoorsUI[playerid]);
  476. }
  477. else
  478. {
  479. PlayerTextDrawHide(playerid, veh_DoorsUI[playerid]);
  480. }
  481.  
  482. PlayerTextDrawShow(playerid, veh_DamageUI[playerid]);
  483. PlayerTextDrawShow(playerid, veh_EngineUI[playerid]);
  484.  
  485. if(IsWeaponDriveby(GetPlayerWeapon(playerid)))
  486. {
  487. if(GetTickCountDifference(GetTickCount(), GetPlayerVehicleExitTick(playerid)) > 3000 && playerstate == PLAYER_STATE_DRIVER)
  488. SetPlayerArmedWeapon(playerid, 0);
  489. }
  490.  
  491. veh_TempVelocity[playerid] = GetPlayerTotalVelocity(playerid);
  492. veh_TempHealth[playerid] = health;
  493.  
  494. return;
  495. }
  496.  
  497. VehicleSurfingCheck(playerid)
  498. {
  499. new
  500. vehicleid = GetPlayerSurfingVehicleID(playerid),
  501. Float:vx,
  502. Float:vy,
  503. Float:vz,
  504. Float:velocity;
  505.  
  506. if(IsVehicleTypeSurfable(GetVehicleType(vehicleid)))
  507. return;
  508.  
  509. GetVehicleVelocity(vehicleid, vx, vy, vz);
  510. velocity = floatsqroot( (vx * vx) + (vy * vy) + (vz * vz) ) * 150.0;
  511.  
  512. if(velocity > 40.0)
  513. {
  514. if(!IsPlayerKnockedOut(playerid))
  515. {
  516. new
  517. Float:x,
  518. Float:y,
  519. Float:z;
  520.  
  521. GetPlayerPos(playerid, x, y, z);
  522. SetPlayerPos(playerid, x - (vx * 2.0), y - (vy * 2.0), z - 0.5);
  523.  
  524. SetPlayerVelocity(playerid, 0.0, 0.0, 0.0);
  525.  
  526. KnockOutPlayer(playerid, 3000);
  527. }
  528. }
  529.  
  530. return;
  531. }
  532.  
  533. hook OnPlayerStateChange(playerid, newstate, oldstate)
  534. {
  535. veh_TempHealth[playerid] = 0.0;
  536. veh_TempVelocity[playerid] = 0.0;
  537. veh_Entering[playerid] = -1;
  538.  
  539. if(newstate == PLAYER_STATE_DRIVER)
  540. {
  541. new
  542. vehicleid,
  543. vehicletype,
  544. vehiclename[32],
  545. Float:x,
  546. Float:y,
  547. Float:z;
  548.  
  549. vehicleid = GetPlayerVehicleID(playerid);
  550. vehicletype = GetVehicleType(vehicleid);
  551. GetVehicleTypeName(vehicletype, vehiclename);
  552. GetVehiclePos(vehicleid, x, y, z);
  553.  
  554. if(GetVehicleTypeCategory(GetVehicleType(vehicleid)) == VEHICLE_CATEGORY_PUSHBIKE)
  555. SetVehicleEngine(vehicleid, 1);
  556.  
  557. else
  558. VehicleEngineState(vehicleid, veh_Data[vehicleid][veh_engine]);
  559.  
  560. veh_Data[vehicleid][veh_used] = true;
  561. veh_Data[vehicleid][veh_occupied] = true;
  562.  
  563. ShowVehicleUI(playerid, vehicleid);
  564.  
  565. veh_EnterTick[playerid] = GetTickCount();
  566.  
  567. logf("[VEHICLE] %p entered vehicle as driver %d (%s) at %f, %f, %f", playerid, vehicleid, vehiclename, x, y, z);
  568. }
  569.  
  570. if(oldstate == PLAYER_STATE_DRIVER)
  571. {
  572. new
  573. vehicleid,
  574. vehicletype,
  575. vehiclename[32];
  576.  
  577. vehicleid = GetPlayerLastVehicle(playerid);
  578. vehicletype = GetVehicleType(vehicleid);
  579. GetVehicleTypeName(vehicletype, vehiclename);
  580. GetVehiclePos(vehicleid, veh_Data[vehicleid][veh_spawnX], veh_Data[vehicleid][veh_spawnY], veh_Data[vehicleid][veh_spawnZ]);
  581. GetVehicleZAngle(vehicleid, veh_Data[vehicleid][veh_spawnR]);
  582.  
  583. veh_Data[vehicleid][veh_occupied] = false;
  584. veh_Data[vehicleid][veh_lastUsed] = GetTickCount();
  585.  
  586. SetVehicleExternalLock(vehicleid, 0);
  587. SetCameraBehindPlayer(playerid);
  588. HideVehicleUI(playerid);
  589.  
  590. logf("[VEHICLE] %p exited vehicle as driver %d (%s) at %f, %f, %f", playerid, vehicleid, vehiclename, veh_Data[vehicleid][veh_spawnX], veh_Data[vehicleid][veh_spawnY], veh_Data[vehicleid][veh_spawnZ]);
  591. }
  592.  
  593. if(newstate == PLAYER_STATE_PASSENGER)
  594. {
  595. new
  596. vehicleid,
  597. vehicletype,
  598. vehiclename[32],
  599. Float:x,
  600. Float:y,
  601. Float:z;
  602.  
  603. vehicleid = GetPlayerVehicleID(playerid);
  604. vehicletype = GetVehicleType(vehicleid);
  605. GetVehicleTypeName(vehicletype, vehiclename);
  606. GetVehiclePos(vehicleid, x, y, z);
  607.  
  608. ShowVehicleUI(playerid, GetPlayerVehicleID(playerid));
  609.  
  610. logf("[VEHICLE] %p entered vehicle as passenger %d (%s) at %f, %f, %f", playerid, vehicleid, vehiclename, x, y, z);
  611. }
  612.  
  613. if(oldstate == PLAYER_STATE_PASSENGER)
  614. {
  615. new
  616. vehicleid,
  617. vehicletype,
  618. vehiclename[32],
  619. Float:x,
  620. Float:y,
  621. Float:z;
  622.  
  623. vehicleid = GetPlayerLastVehicle(playerid);
  624. vehicletype = GetVehicleType(vehicleid);
  625. GetVehicleTypeName(vehicletype, vehiclename);
  626. GetVehiclePos(vehicleid, x, y, z);
  627.  
  628. SetVehicleExternalLock(GetPlayerLastVehicle(playerid), 0);
  629. HideVehicleUI(playerid);
  630. logf("[VEHICLE] %p exited vehicle as passenger %d (%s) at %f, %f, %f", playerid, vehicleid, vehiclename, x, y, z);
  631. }
  632.  
  633. return 1;
  634. }
  635.  
  636. ShowVehicleUI(playerid, vehicleid)
  637. {
  638. new vehiclename[MAX_VEHICLE_TYPE_NAME];
  639.  
  640. GetVehicleTypeName(GetVehicleType(vehicleid), vehiclename);
  641.  
  642. PlayerTextDrawSetString(playerid, veh_NameUI[playerid], vehiclename);
  643. PlayerTextDrawShow(playerid, veh_NameUI[playerid]);
  644. PlayerTextDrawShow(playerid, veh_SpeedUI[playerid]);
  645.  
  646. if(GetVehicleTypeCategory(GetVehicleType(vehicleid)) != VEHICLE_CATEGORY_PUSHBIKE)
  647. {
  648. PlayerTextDrawShow(playerid, veh_FuelUI[playerid]);
  649. PlayerTextDrawShow(playerid, veh_DamageUI[playerid]);
  650. PlayerTextDrawShow(playerid, veh_EngineUI[playerid]);
  651. PlayerTextDrawShow(playerid, veh_DoorsUI[playerid]);
  652. }
  653. }
  654.  
  655. HideVehicleUI(playerid)
  656. {
  657. PlayerTextDrawHide(playerid, veh_NameUI[playerid]);
  658. PlayerTextDrawHide(playerid, veh_SpeedUI[playerid]);
  659. PlayerTextDrawHide(playerid, veh_FuelUI[playerid]);
  660. PlayerTextDrawHide(playerid, veh_DamageUI[playerid]);
  661. PlayerTextDrawHide(playerid, veh_EngineUI[playerid]);
  662. PlayerTextDrawHide(playerid, veh_DoorsUI[playerid]);
  663. }
  664.  
  665. public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
  666. {
  667. if(!ispassenger)
  668. veh_Entering[playerid] = vehicleid;
  669.  
  670. return 1;
  671. }
  672.  
  673. public OnPlayerExitVehicle(playerid, vehicleid)
  674. {
  675. veh_Data[vehicleid][veh_lastUsed] = GetTickCount();
  676. }
  677.  
  678. public OnVehicleDamageStatusUpdate(vehicleid, playerid)
  679. {
  680. // TODO: Some anticheat magic before syncing.
  681. GetVehicleDamageStatus(vehicleid,
  682. veh_Data[vehicleid][veh_panels],
  683. veh_Data[vehicleid][veh_doors],
  684. veh_Data[vehicleid][veh_lights],
  685. veh_Data[vehicleid][veh_tires]);
  686. }
  687.  
  688. public OnUnoccupiedVehicleUpdate(vehicleid, playerid, passenger_seat, Float:new_x, Float:new_y, Float:new_z, Float:vel_x, Float:vel_y, Float:vel_z)
  689. {
  690. if(IsValidVehicle(GetTrailerVehicleID(vehicleid)))
  691. return 1;
  692.  
  693. new Float:distance = GetVehicleDistanceFromPoint(vehicleid, new_x, new_y, new_z);
  694.  
  695. if(distance > 0.0)
  696. {
  697. if(GetTickCountDifference(GetTickCount(), veh_Data[vehicleid][veh_lastUsed]) < 10000)
  698. return 1;
  699.  
  700. new Float:thresh;
  701.  
  702. switch(GetVehicleTypeCategory(GetVehicleType(vehicleid)))
  703. {
  704. case VEHICLE_CATEGORY_TRUCK:
  705. thresh = 0.05;
  706.  
  707. case VEHICLE_CATEGORY_MOTORBIKE, VEHICLE_CATEGORY_PUSHBIKE:
  708. thresh = 0.2;
  709.  
  710. case VEHICLE_CATEGORY_BOAT:
  711. thresh = 2.6;
  712.  
  713. case VEHICLE_CATEGORY_HELICOPTER, VEHICLE_CATEGORY_PLANE:
  714. thresh = 0.01;
  715.  
  716. default:
  717. thresh = 0.1;
  718. }
  719.  
  720. if(distance > thresh)
  721. {
  722. new
  723. Float:x,
  724. Float:y,
  725. Float:z;
  726.  
  727. GetVehiclePos(vehicleid, x, y, z);
  728. SetVehiclePos(vehicleid, x, y, z);
  729. }
  730.  
  731. return 0;
  732. }
  733.  
  734. #if defined veh_OnUnoccupiedVehicleUpdate
  735. return veh_OnUnoccupiedVehicleUpdate(vehicleid, playerid, passenger_seat, new_x, new_y, new_z, vel_x, vel_y, vel_z);
  736. #else
  737. return 1;
  738. #endif
  739. }
  740. #if defined _ALS_OnUnoccupiedVehicleUpdate
  741. #undef OnUnoccupiedVehicleUpdate
  742. #else
  743. #define _ALS_OnUnoccupiedVehicleUpdate
  744. #endif
  745.  
  746. #define OnUnoccupiedVehicleUpdate veh_OnUnoccupiedVehicleUpdate
  747. #if defined veh_OnUnoccupiedVehicleUpdate
  748. forward veh_OnUnoccupiedVehicleUpdate(vehicleid, playerid, passenger_seat, Float:new_x, Float:new_y, Float:new_z, Float:vel_x, Float:vel_y, Float:vel_z);
  749. #endif
  750.  
  751. IsVehicleValidOutOfBounds(vehicleid)
  752. {
  753. if(!IsPointInMapBounds(veh_Data[vehicleid][veh_spawnX], veh_Data[vehicleid][veh_spawnY], veh_Data[vehicleid][veh_spawnZ]))
  754. {
  755. switch(GetVehicleTypeCategory(GetVehicleType(vehicleid)))
  756. {
  757. case VEHICLE_CATEGORY_HELICOPTER, VEHICLE_CATEGORY_PLANE:
  758. return 1;
  759.  
  760. default:
  761. return 0;
  762. }
  763. }
  764.  
  765. return 0;
  766. }
  767.  
  768. /*
  769. Handling vehicle deaths:
  770. When a vehicle "dies" (reported by the client) it might be false. This hook
  771. aims to fix bugs with vehicle deaths and all code that's intended to run
  772. when a vehicle is destroyed should be put under OnVehicleDestroy(ed).
  773. */
  774. public OnVehicleDeath(vehicleid, killerid)
  775. {
  776. new name[MAX_PLAYER_NAME];
  777.  
  778. GetPlayerName(killerid, name, MAX_PLAYER_NAME);
  779. GetVehiclePos(vehicleid, veh_Data[vehicleid][veh_spawnX], veh_Data[vehicleid][veh_spawnY], veh_Data[vehicleid][veh_spawnZ]);
  780.  
  781. veh_Data[vehicleid][veh_dead] = true;
  782.  
  783. printf("[OnVehicleDeath] Vehicle %d killed by %s at %f %f %f", vehicleid, name, veh_Data[vehicleid][veh_spawnX], veh_Data[vehicleid][veh_spawnY], veh_Data[vehicleid][veh_spawnZ]);
  784. }
  785.  
  786. public OnVehicleSpawn(vehicleid)
  787. {
  788. if(veh_Data[vehicleid][veh_dead])
  789. {
  790. if(IsVehicleValidOutOfBounds(vehicleid))
  791. {
  792. printf("Dead Vehicle %d Spawned, is valid out-of-bounds vehicle, resetting.", vehicleid);
  793.  
  794. veh_Data[vehicleid][veh_dead] = false;
  795. ResetVehicle(vehicleid);
  796. }
  797. else
  798. {
  799. printf("Dead Vehicle %d Spawned, spawning as inactive.", vehicleid);
  800.  
  801. veh_Data[vehicleid][veh_health] = 300.0;
  802. VehicleDoorsState(vehicleid, true);
  803. ResetVehicle(vehicleid);
  804. }
  805. }
  806.  
  807. return 1;
  808. }
  809.  
  810. /*
  811. Hook for CreateVehicle, if the first parameter isn't a valid model ID but is
  812. a valid vehicle-type from this index, use the index create function instead.
  813. */
  814. stock vti_CreateVehicle(vehicletype, Float:x, Float:y, Float:z, Float:rotation, color1, color2, respawn_delay)
  815. {
  816. #pragma unused vehicletype, x, y, z, rotation, color1, color2, respawn_delay
  817. printf("ERROR: Cannot create vehicle by model ID.");
  818.  
  819. return 0;
  820. }
  821. #if defined _ALS_CreateVehicle
  822. #undef CreateVehicle
  823. #else
  824. #define _ALS_CreateVehicle
  825. #endif
  826. #define CreateVehicle vti_CreateVehicle
  827.  
  828.  
  829. /*==============================================================================
  830.  
  831. Interface
  832.  
  833. ==============================================================================*/
  834.  
  835.  
  836. // veh_type
  837. stock GetVehicleType(vehicleid)
  838. {
  839. if(!IsValidVehicle(vehicleid))
  840. return INVALID_VEHICLE_TYPE;
  841.  
  842. return veh_Data[vehicleid][veh_type];
  843. }
  844.  
  845. // veh_health
  846. stock Float:GetVehicleHP(vehicleid)
  847. {
  848. if(!IsValidVehicle(vehicleid))
  849. return 0.0;
  850.  
  851. return veh_Data[vehicleid][veh_health];
  852. }
  853.  
  854. stock SetVehicleHP(vehicleid, Float:health)
  855. {
  856. if(!IsValidVehicle(vehicleid))
  857. return 0;
  858.  
  859. veh_Data[vehicleid][veh_health] = health;
  860. _veh_SyncData(vehicleid); // hotfix
  861.  
  862. return 1;
  863. }
  864.  
  865. // veh_Fuel
  866. forward Float:GetVehicleFuel(vehicleid);
  867. stock Float:GetVehicleFuel(vehicleid)
  868. {
  869. if(!IsValidVehicle(vehicleid))
  870. return 0.0;
  871.  
  872. if(veh_Data[vehicleid][veh_Fuel] < 0.0)
  873. veh_Data[vehicleid][veh_Fuel] = 0.0;
  874.  
  875. return veh_Data[vehicleid][veh_Fuel];
  876. }
  877.  
  878. stock SetVehicleFuel(vehicleid, Float:amount)
  879. {
  880. if(!IsValidVehicle(vehicleid))
  881. return 0;
  882.  
  883. new Float:maxfuel = GetVehicleTypeMaxFuel(GetVehicleType(vehicleid));
  884.  
  885. if(amount > maxfuel)
  886. amount = maxfuel;
  887.  
  888. veh_Data[vehicleid][veh_Fuel] = amount;
  889.  
  890. return 1;
  891. }
  892.  
  893. stock GiveVehicleFuel(vehicleid, Float:amount)
  894. {
  895. if(!IsValidVehicle(vehicleid))
  896. return 0;
  897.  
  898. new maxfuel = GetVehicleTypeMaxFuel(GetVehicleType(vehicleid));
  899.  
  900. veh_Data[vehicleid][veh_Fuel] += amount;
  901.  
  902. if(veh_Data[vehicleid][veh_Fuel] > maxfuel)
  903. veh_Data[vehicleid][veh_Fuel] = maxfuel;
  904.  
  905. return 1;
  906. }
  907.  
  908. // veh_key
  909. stock GetVehicleKey(vehicleid)
  910. {
  911. if(!IsValidVehicle(vehicleid))
  912. return -1;
  913.  
  914. return veh_Data[vehicleid][veh_key];
  915. }
  916.  
  917. stock SetVehicleKey(vehicleid, key)
  918. {
  919. if(!IsValidVehicle(vehicleid))
  920. return 0;
  921.  
  922. veh_Data[vehicleid][veh_key] = key;
  923.  
  924. return 1;
  925. }
  926.  
  927. // veh_engine
  928. stock GetVehicleEngine(vehicleid)
  929. {
  930. if(!IsValidVehicle(vehicleid))
  931. return 0;
  932.  
  933. return veh_Data[vehicleid][veh_engine];
  934. }
  935.  
  936. stock SetVehicleEngine(vehicleid, toggle)
  937. {
  938. if(!IsValidVehicle(vehicleid))
  939. return 0;
  940.  
  941. veh_Data[vehicleid][veh_engine] = toggle;
  942. VehicleEngineState(vehicleid, toggle);
  943.  
  944. return 1;
  945. }
  946.  
  947. // veh_panels
  948. // veh_doors
  949. // veh_lights
  950. // veh_tires
  951. stock SetVehicleDamageData(vehicleid, panels, doors, lights, tires)
  952. {
  953. if(!IsValidVehicle(vehicleid))
  954. return 0;
  955.  
  956. veh_Data[vehicleid][veh_panels] = panels;
  957. veh_Data[vehicleid][veh_doors] = doors;
  958. veh_Data[vehicleid][veh_lights] = lights;
  959. veh_Data[vehicleid][veh_tires] = tires;
  960.  
  961. UpdateVehicleDamageStatus(vehicleid, panels, doors, lights, tires);
  962.  
  963. return 1;
  964. }
  965.  
  966. // veh_armour
  967.  
  968. // veh_colour1
  969. // veh_colour2
  970. stock GetVehicleColours(vehicleid, &colour1, &colour2)
  971. {
  972. if(!IsValidVehicle(vehicleid))
  973. return 0;
  974.  
  975. colour1 = veh_Data[vehicleid][veh_colour1];
  976. colour2 = veh_Data[vehicleid][veh_colour2];
  977.  
  978. return 1;
  979. }
  980.  
  981. stock SetVehicleColours(vehicleid, colour1, colour2)
  982. {
  983. if(!IsValidVehicle(vehicleid))
  984. return 0;
  985.  
  986. veh_Data[vehicleid][veh_colour1] = colour1;
  987. veh_Data[vehicleid][veh_colour2] = colour2;
  988.  
  989. return 1;
  990. }
  991.  
  992. // veh_spawnX
  993. // veh_spawnY
  994. // veh_spawnZ
  995. // veh_spawnR
  996. stock SetVehicleSpawnPoint(vehicleid, Float:x, Float:y, Float:z, Float:r)
  997. {
  998. if(!IsValidVehicle(vehicleid))
  999. return 0;
  1000.  
  1001. veh_Data[vehicleid][veh_spawnX] = x;
  1002. veh_Data[vehicleid][veh_spawnY] = y;
  1003. veh_Data[vehicleid][veh_spawnZ] = z;
  1004. veh_Data[vehicleid][veh_spawnR] = r;
  1005.  
  1006. return 1;
  1007. }
  1008.  
  1009. stock GetVehicleSpawnPoint(vehicleid, &Float:x, &Float:y, &Float:z, &Float:r)
  1010. {
  1011. if(!IsValidVehicle(vehicleid))
  1012. return 0;
  1013.  
  1014. x = veh_Data[vehicleid][veh_spawnX];
  1015. y = veh_Data[vehicleid][veh_spawnY];
  1016. z = veh_Data[vehicleid][veh_spawnZ];
  1017. r = veh_Data[vehicleid][veh_spawnR];
  1018.  
  1019. return 1;
  1020. }
  1021.  
  1022. // veh_lastUsed
  1023. stock GetVehicleLastUseTick(vehicleid)
  1024. {
  1025. if(!IsValidVehicle(vehicleid))
  1026. return 0;
  1027.  
  1028. return veh_Data[vehicleid][veh_lastUsed];
  1029. }
  1030.  
  1031. // veh_used
  1032. stock IsVehicleUsed(vehicleid)
  1033. {
  1034. if(!IsValidVehicle(vehicleid))
  1035. return 0;
  1036.  
  1037. return veh_Data[vehicleid][veh_used];
  1038. }
  1039.  
  1040. // veh_occupied
  1041. stock IsVehicleOccupied(vehicleid)
  1042. {
  1043. if(!IsValidVehicle(vehicleid))
  1044. return 0;
  1045.  
  1046. return veh_Data[vehicleid][veh_occupied];
  1047. }
  1048.  
  1049.  
  1050. // veh_dead
  1051. stock IsVehicleDead(vehicleid)
  1052. {
  1053. if(!IsValidVehicle(vehicleid))
  1054. return 0;
  1055.  
  1056. return veh_Data[vehicleid][veh_dead];
  1057. }
  1058.  
  1059. // veh_TypeCount
  1060. stock GetVehicleTypeCount(vehicletype)
  1061. {
  1062. if(!(0 <= vehicletype < veh_TypeTotal))
  1063. return 0;
  1064.  
  1065. return veh_TypeCount[vehicletype];
  1066. }
  1067.  
  1068. // veh_Entering
  1069. stock GetPlayerEnteringVehicle(playerid)
  1070. {
  1071. if(!IsPlayerConnected(playerid))
  1072. return 0;
  1073.  
  1074. return veh_Entering[playerid];
  1075. }
  1076. // veh_EnterTick
  1077. stock GetPlayerVehicleEnterTick(playerid)
  1078. {
  1079. if(!IsPlayerConnected(playerid))
  1080. return 0;
  1081.  
  1082. return veh_EnterTick[playerid];
  1083. }
Advertisement
Add Comment
Please, Sign In to add comment