Advertisement
Guest User

Untitled

a guest
Feb 12th, 2010
412
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.63 KB | None | 0 0
  1. #include <a_samp>
  2.  
  3. forward OnPlayerShootVehicle(playerid, vehicleid, unoccupied, weaponid, Float:heathlost);
  4. forward OnPlayerShootPlayer(playerid, victimid, weaponid, Float:heathlost, Float:armourlost);
  5. forward VehicleCheck();
  6.  
  7. new Float:OldHealth[MAX_PLAYERS];
  8. new Float:OldArmour[MAX_PLAYERS];
  9. new Float:OldVHealth[MAX_VEHICLES];
  10. new Float:OldPos[MAX_VEHICLES][3];
  11. new ShotBy[MAX_PLAYERS];
  12. new ShotWeapon[MAX_PLAYERS];
  13. new OnOff[MAX_PLAYERS];
  14. new VShotBy[MAX_VEHICLES];
  15. new VShotWeapon[MAX_VEHICLES];
  16. new VOnOff[MAX_VEHICLES];
  17. new VTick[MAX_VEHICLES];
  18. new VehicleCheckTimer;
  19. new NoDamage;
  20.  
  21. IsPlayerAimingAtPlayer(playerid, aimid)
  22. {
  23. new Float:X1, Float:Y1, Float:Z1, Float:X2, Float:Y2, Float:Z2;
  24. GetPlayerPos(playerid, X1, Y1, Z1);
  25. GetPlayerPos(aimid, X2, Y2, Z2);
  26. new Float:Distance = floatsqroot(floatpower(floatabs(X1-X2), 2) + floatpower(floatabs(Y1-Y2), 2));
  27. if(Distance < 100)
  28. {
  29. new Float:A;
  30. GetPlayerFacingAngle(playerid, A);
  31. X1 += (Distance * floatsin(-A, degrees));
  32. Y1 += (Distance * floatcos(-A, degrees));
  33. Distance = floatsqroot(floatpower(floatabs(X1-X2), 2) + floatpower(floatabs(Y1-Y2), 2));
  34. if(Distance < 1.0)
  35. {
  36. return true;
  37. }
  38. }
  39. return false;
  40. }
  41.  
  42. IsPlayerAimingAtVehicle(playerid, aimid)
  43. {
  44. new Float:X1, Float:Y1, Float:Z1, Float:X2, Float:Y2, Float:Z2;
  45. GetPlayerPos(playerid, X1, Y1, Z1);
  46. GetVehiclePos(aimid, X2, Y2, Z2);
  47. new Float:Distance = floatsqroot(floatpower(floatabs(X1-X2), 2) + floatpower(floatabs(Y1-Y2), 2));
  48. if(Distance < 100)
  49. {
  50. new Float:A;
  51. GetPlayerFacingAngle(playerid, A);
  52. X1 += (Distance * floatsin(-A, degrees));
  53. Y1 += (Distance * floatcos(-A, degrees));
  54. Distance = floatsqroot(floatpower(floatabs(X1-X2), 2) + floatpower(floatabs(Y1-Y2), 2));
  55. if(Distance < 1.0)
  56. {
  57. return true;
  58. }
  59. }
  60. return false;
  61. }
  62.  
  63. // Check KEY_HANDBRAKE for aim
  64. // Check KEY_FIRE for fire
  65. // Check KEY_HANDBRAKE and KEY_FIRE for aim and fire
  66. // Check KEY_HANDBRAKE and KEY_JUMP for blocking
  67.  
  68. stock WeaponCanFire(weaponid)
  69. {
  70. if(weaponid < 22 || weaponid == 37 || weaponid > 38)
  71. {
  72. return 0;
  73. }
  74. return 1;
  75. }
  76.  
  77. stock WeaponNeedsAimToFire(weaponid)
  78. {
  79. if(weaponid == 34 || weaponid == 35 || weaponid == 36)
  80. {
  81. return 1;
  82. }
  83. return 0;
  84. }
  85.  
  86. stock GetWeaponSlot(weaponid)
  87. {
  88. if(weaponid == 0 || weaponid == 1)
  89. {
  90. return 0;
  91. }
  92. if(weaponid > 1 && weaponid < 10)
  93. {
  94. return 1;
  95. }
  96. if(weaponid > 9 && weaponid < 16)
  97. {
  98. return 10;
  99. }
  100. if(weaponid > 15 && weaponid < 22)
  101. {
  102. return 8;
  103. }
  104. if(weaponid > 18 && weaponid < 25)
  105. {
  106. return 2;
  107. }
  108. if(weaponid > 24 && weaponid < 28)
  109. {
  110. return 3;
  111. }
  112. if(weaponid > 27 && weaponid < 30 || weaponid == 32)
  113. {
  114. return 4;
  115. }
  116. if(weaponid > 29 && weaponid < 32)
  117. {
  118. return 5;
  119. }
  120. if(weaponid > 32 && weaponid < 35)
  121. {
  122. return 6;
  123. }
  124. if(weaponid > 34 && weaponid < 39)
  125. {
  126. return 7;
  127. }
  128. if(weaponid == 39)
  129. {
  130. return 8;
  131. }
  132. if(weaponid == 40)
  133. {
  134. return 12;
  135. }
  136. if(weaponid > 40 && weaponid < 44)
  137. {
  138. return 9;
  139. }
  140. if(weaponid > 42 && weaponid < 47)
  141. {
  142. return 11;
  143. }
  144. return 0;
  145. }
  146.  
  147. // Taken from weapon.dat (GTASAROOT/data/weapon.dat)
  148. stock GetWeaponDamage(weaponid)
  149. {
  150. switch(weaponid)
  151. {
  152. case 22: // 9MM
  153. return 25;
  154. case 23: // Silenced 9MM
  155. return 40;
  156. case 24: // Deagle
  157. return 140;
  158. case 25: // Shotgun
  159. return 10;
  160. case 26: // Sawn Off Shotgun
  161. return 10;
  162. case 27: // Spaz 12
  163. return 15;
  164. case 28: // Micro UZI
  165. return 20;
  166. case 29: // MP5
  167. return 30;
  168. case 30: // AK-47
  169. return 30;
  170. case 31: // M4
  171. return 30;
  172. case 32: // Tec9
  173. return 20;
  174. case 33: // Country Rifle
  175. return 75;
  176. case 34: // Sniper Rifle
  177. return 125;
  178. case 35: // Rocket Launcher
  179. return 75;
  180. case 36: // HS Rocket Launcher
  181. return 75;
  182. case 37: // Flamethrower
  183. return 25;
  184. case 38: // Minigun
  185. return 140;
  186. case 39: // Satchel Charge
  187. return 75;
  188. case 41: // Spraycan
  189. return 1;
  190. case 42: // Fire Extinguisher
  191. return 1;
  192. }
  193. return 0;
  194. }
  195.  
  196. stock DoesVehicleExist(vehicleid)
  197. {
  198. if(GetVehicleModel(vehicleid))
  199. {
  200. return 1;
  201. }
  202. return 0;
  203. }
  204.  
  205.  
  206. stock IsVehicleSynced(vehicleid)
  207. {
  208. for(new i; i < MAX_PLAYERS; i++)
  209. {
  210. if(IsPlayerInVehicle(i, vehicleid) && GetPlayerState(i) == PLAYER_STATE_DRIVER)
  211. {
  212. return 1;
  213. }
  214. }
  215. return 0;
  216. }
  217.  
  218. stock CanRecieveDebugMessages(playerid)
  219. {
  220. new name[MAX_PLAYER_NAME];
  221. GetPlayerName(playerid, name, sizeof(name));
  222. if(!strcmp(name, "Carl_Stone", true))
  223. {
  224. return 1;
  225. }
  226. return 0;
  227. }
  228.  
  229. public OnFilterScriptInit()
  230. {
  231. VehicleCheckTimer = SetTimer("VehicleCheck", 250, 1); // Default should be 250.
  232. for(new i; i < MAX_PLAYERS; i++)
  233. {
  234. ShotBy[i] = INVALID_PLAYER_ID;
  235. }
  236. for(new i; i < MAX_VEHICLES; i++)
  237. {
  238. VShotBy[i] = INVALID_PLAYER_ID;
  239. }
  240. return 1;
  241. }
  242.  
  243. public OnFilterScriptExit()
  244. {
  245. KillTimer(VehicleCheckTimer);
  246. return 1;
  247. }
  248.  
  249. stock SendDebugMessage(message[])
  250. {
  251. for(new i; i < MAX_PLAYERS; i++)
  252. {
  253. if(CanRecieveDebugMessages(i))
  254. {
  255. SendClientMessage(i, 0xFF6347AA, message);
  256. }
  257. }
  258. }
  259.  
  260. // TODO: If 0 is returned and its an occupied vehicle restore the health
  261. // and if 0 is returned and its an unoccupied vehicle dont reduce the health.
  262. public OnPlayerShootVehicle(playerid, vehicleid, unoccupied, weaponid, Float:heathlost)
  263. {
  264. new str[80];
  265. new name[MAX_PLAYER_NAME];
  266. GetPlayerName(playerid, name, sizeof(name));
  267. format(str, sizeof(str), "Player %s shot vehicle %d (%d, %d)", name, vehicleid, unoccupied, weaponid);
  268. SendDebugMessage(str);
  269. if(!NoDamage)
  270. {
  271. return 1;
  272. }
  273. return 0;
  274. }
  275.  
  276. // TODO: If 0 is returned restore the players health.
  277. public OnPlayerShootPlayer(playerid, victimid, weaponid, Float:heathlost, Float:armourlost)
  278. {
  279. new str[80];
  280. new name[MAX_PLAYER_NAME];
  281. new name2[MAX_PLAYER_NAME];
  282. GetPlayerName(playerid, name, sizeof(name));
  283. GetPlayerName(victimid, name2, sizeof(name2));
  284. format(str, sizeof(str), "Player %s shot player %s (%d)", name, name2, weaponid);
  285. SendDebugMessage(str);
  286. if(!NoDamage)
  287. {
  288. return 1;
  289. }
  290. return 0;
  291. }
  292.  
  293. //#define NOBLOW
  294. #define BLOW
  295.  
  296. // TODO: Check if the vehicle position has moved
  297. // if it has and its occupied the occupant must
  298. // be frozen (needs testing).
  299. // TODO: If player weapon == 0 and position is changing
  300. // then they are punching it and the health should be
  301. // deducted depending on thier fighting style.
  302. // TODO: Hook the sync packet recieve function and
  303. // set npc/players keys from in there.
  304. // TODO: Only deal with unoccupied vehicles in here.
  305. public VehicleCheck()
  306. {
  307. new Float:Health;
  308. new Float:Pos[3];
  309. for(new i; i < MAX_VEHICLES; i++)
  310. {
  311. if(VTick[i] > 0)
  312. {
  313. #if defined BLOW
  314. if((GetTickCount() - VTick[i]) >= 16000) // 16 seconds since the vehicle got set on fire.
  315. #else
  316. if((GetTickCount() - VTick[i]) >= 60000) // 60 seconds since the vehicle got set smoking.
  317. #endif
  318. {
  319. // Make sure no one is in it, because if they are they will register the destroy for us
  320. // (read below for more info).
  321. if(!IsVehicleSynced(i))
  322. {
  323. // In SA-MP vehicles are respawned only if it was a players last vehicle.
  324. // So if it was a players last vehicle, That player sends the destroy rpc
  325. // and it gets respawned, However in some cases empty vehicles will not have
  326. // had a driver so there is no player to send the destroy rpc, So we have
  327. // to respawn it outselves and call OnVehicleDeath manually.
  328. // Make sure the person who shot it does not damage it on respawn.
  329. /*new str[80];
  330. format(str, sizeof(str), "Respawning unoccuiped vehicle %d.", i);
  331. SendDebugMessage(str);*/
  332. // TODO: Make this just call the function normally.
  333. CallLocalFunction("OnVehicleDeath", "ii", i, VShotBy[i]);
  334. VShotBy[i] = INVALID_PLAYER_ID;
  335. SetVehicleToRespawn(i);
  336. VTick[i] = 0;
  337. }
  338. }
  339. }
  340. else
  341. {
  342. if(DoesVehicleExist(i) && VShotBy[i] != INVALID_PLAYER_ID)
  343. {
  344. if(IsVehicleSynced(i))
  345. {
  346. if(GetVehicleHealth(i, Health))
  347. {
  348. if(Health < OldVHealth[i])
  349. {
  350. /*if(CanRecieveDebugMessages(VShotBy[i]))
  351. {
  352. new str[80];
  353. format(str, sizeof(str), "DEBUG: You shot vehicle %d.", i);
  354. SendClientMessage(VShotBy[i], 0xFF6347AA, str);
  355. }*/
  356. if(!OnPlayerShootVehicle(VShotBy[i], i, 0, VShotWeapon[i], (OldVHealth[i] - Health)))
  357. {
  358. // OnPlayerShootVehicle returned 0.
  359. // Restore the vehicles health.
  360. SetVehicleHealth(i, OldVHealth[i]);
  361. }
  362. VShotBy[i] = INVALID_PLAYER_ID;
  363. }
  364. OldVHealth[i] = Health;
  365. }
  366. }
  367. else
  368. {
  369. if(GetVehiclePos(i, Pos[0], Pos[1], Pos[2]))
  370. {
  371. if(Pos[0] != OldPos[i][0] || Pos[1] != OldPos[i][1] || Pos[2] != OldPos[i][2])
  372. {
  373. GetVehicleHealth(i, Health);
  374. new Damage;
  375. new Float:DamageHealth;
  376. if(Health > 0)
  377. {
  378. // TODO: If any vehicles are in range when it detonates reduce thier health.
  379. Damage = GetWeaponDamage(VShotWeapon[i]);
  380. new Float:NewHealth = (Health - Damage);
  381. #if defined NOWBLOW
  382. if(NewHealth < 400)
  383. {
  384. DamageHealth = 400;
  385. VTick[i] = GetTickCount();
  386. }
  387. else
  388. #endif
  389. {
  390. #if defined BLOW
  391. if(NewHealth < 250)
  392. {
  393. if(NewHealth < 0)
  394. {
  395. DamageHealth = 0;
  396. }
  397. else
  398. {
  399. DamageHealth = NewHealth;
  400. }
  401. /*if(CanRecieveDebugMessages(VShotBy[i]))
  402. {
  403. new str[80];
  404. format(str, sizeof(str), "DEBUG: Setting respawn tick for vehicle %d.", i);
  405. SendClientMessage(VShotBy[i], 0xFF6347AA, str);
  406. }*/
  407. VTick[i] = GetTickCount();
  408. }
  409. else
  410. {
  411. DamageHealth = NewHealth;
  412. }
  413. #else
  414. DamageHealth = NewHealth;
  415. #endif
  416. }
  417. }
  418. /*if(CanRecieveDebugMessages(VShotBy[i]))
  419. {
  420. new str[80];
  421. format(str, sizeof(str), "DEBUG: You shot unoccupied vehicle %d.", i);
  422. SendClientMessage(VShotBy[i], 0xFF6347AA, str);
  423. }*/
  424. if(OnPlayerShootVehicle(VShotBy[i], i, 1, VShotWeapon[i], Damage))
  425. {
  426. // OnPlayerShootVehicle returned 1.
  427. // Damage the vehicle.
  428. SetVehicleHealth(i, DamageHealth);
  429. }
  430. VShotBy[i] = INVALID_PLAYER_ID;
  431. }
  432. OldPos[i][0] = Pos[0];
  433. OldPos[i][1] = Pos[1];
  434. OldPos[i][2] = Pos[2];
  435. }
  436. }
  437. // Reset the VShotBy on the second tick.
  438. if(VShotBy[i] != INVALID_PLAYER_ID && !VOnOff[i])
  439. {
  440. VShotBy[i] = INVALID_PLAYER_ID;
  441. }
  442. if(VOnOff[i])
  443. {
  444. VOnOff[i] = 0;
  445. }
  446. }
  447. }
  448. }
  449. return 1;
  450. }
  451.  
  452. public OnPlayerDeath(playerid, killerid, reason)
  453. {
  454. /*if(CanRecieveDebugMessages(playerid) || CanRecieveDebugMessages(killerid))
  455. {
  456. new name[MAX_PLAYER_NAME];
  457. GetPlayerName(killerid, name, sizeof(name));
  458. new str[80];
  459. format(str, sizeof(str), "DEBUG: You killed %s.", name);
  460. SendClientMessage(playerid, 0xFF6347AA, str);
  461. GetPlayerName(playerid, name, sizeof(name));
  462. format(str, sizeof(str), "DEBUG: %s killed you.", name);
  463. SendClientMessage(playerid, 0xFF6347AA, str);
  464. }*/
  465. ShotBy[playerid] = INVALID_PLAYER_ID;
  466. return 1;
  467. }
  468.  
  469. // TODO: Deal with occupied vehicles in here.
  470. public OnPlayerUpdate(playerid)
  471. {
  472. new Float:Health, Float:Armour;
  473. GetPlayerHealth(playerid, Health);
  474. GetPlayerArmour(playerid, Armour);
  475. if(Health < OldHealth[playerid] || Armour < OldArmour[playerid])
  476. {
  477. if(ShotBy[playerid] != INVALID_PLAYER_ID)
  478. {
  479. new name[MAX_PLAYER_NAME];
  480. GetPlayerName(playerid, name, sizeof(name));
  481. /*new str[80];
  482. if(CanRecieveDebugMessages(ShotBy[playerid]))
  483. {
  484. if(Health == 0)
  485. {
  486. format(str, sizeof(str), "DEBUG: You killed %s.", name);
  487. }
  488. else
  489. {
  490. format(str, sizeof(str), "DEBUG: You shot %s.", name);
  491. }
  492. SendClientMessage(ShotBy[playerid], 0xFF6347AA, str);
  493. GetPlayerName(ShotBy[playerid], name, sizeof(name));
  494. if(Health == 0)
  495. {
  496. format(str, sizeof(str), "DEBUG: %s killed you.", name);
  497. }
  498. else
  499. {
  500. format(str, sizeof(str), "DEBUG: %s shot you.", name);
  501. }
  502. SendClientMessage(playerid, 0xFF6347AA, str);
  503. }*/
  504. if(!OnPlayerShootPlayer(ShotBy[playerid], playerid, ShotWeapon[playerid], (OldHealth[playerid] - Health), (OldArmour[playerid] - Armour)))
  505. {
  506. // OnPlayerShootPlayer returned 0.
  507. // Restore the players health/armour.
  508. SetPlayerHealth(playerid, OldHealth[playerid]);
  509. SetPlayerArmour(playerid, OldArmour[playerid]);
  510. }
  511. ShotBy[playerid] = INVALID_PLAYER_ID;
  512. }
  513. }
  514. // Reset the ShotBy on the second tick.
  515. if(ShotBy[playerid] != INVALID_PLAYER_ID && !OnOff[playerid])
  516. {
  517. ShotBy[playerid] = INVALID_PLAYER_ID;
  518. }
  519. if(OnOff[playerid])
  520. {
  521. OnOff[playerid] = 0;
  522. }
  523. OldHealth[playerid] = Health;
  524. OldArmour[playerid] = Armour;
  525. new weapon = GetPlayerWeapon(playerid);
  526. if(WeaponCanFire(weapon))
  527. {
  528. new udAnalog;
  529. new lrAnalog;
  530. new wKeys;
  531. GetPlayerKeys(playerid, wKeys, udAnalog, lrAnalog);
  532. if(wKeys & KEY_FIRE)
  533. {
  534. if(WeaponNeedsAimToFire(weapon) && !(wKeys & KEY_HANDBRAKE))
  535. {
  536. return 1;
  537. }
  538. for(new i; i < MAX_PLAYERS; i++)
  539. {
  540. if(i != playerid && IsPlayerConnected(i) && IsPlayerAimingAtPlayer(playerid, i))
  541. {
  542. if(CanRecieveDebugMessages(playerid))
  543. {
  544. new str[80];
  545. new name[MAX_PLAYER_NAME];
  546. GetPlayerName(i, name, sizeof(name));
  547. format(str, sizeof(str), "You are firing at player %s.", name);
  548. SendClientMessage(playerid, 0xFF6347AA, str);
  549. }
  550. ShotBy[i] = playerid;
  551. // Save the players current weapon just in case they switch the weapon
  552. // before the player health loss is synced which would cause incorrect
  553. // values.
  554. ShotWeapon[i] = weapon;
  555. OnOff[i] = 1;
  556. }
  557. }
  558. for(new i; i < MAX_VEHICLES; i++)
  559. {
  560. if(DoesVehicleExist(i) && IsPlayerAimingAtVehicle(playerid, i))
  561. {
  562. if(CanRecieveDebugMessages(playerid))
  563. {
  564. new str[80];
  565. format(str, sizeof(str), "You are firing at vehicle %d.", i);
  566. SendClientMessage(playerid, 0xFF6347AA, str);
  567. }
  568. VShotBy[i] = playerid;
  569. // Save the players current weapon just in case they switch the weapon
  570. // before the vehicle health loss is synced which would cause incorrect
  571. // damage values.
  572. VShotWeapon[i] = weapon;
  573. VOnOff[i] = 1;
  574. }
  575. }
  576. }
  577. }
  578. return 1;
  579. }
  580.  
  581. public OnPlayerCommandText(playerid, cmdtext[])
  582. {
  583. if(!strcmp(cmdtext, "/keys", true))
  584. {
  585. new str[80];
  586. new udAnalog;
  587. new lrAnalog;
  588. new wKeys;
  589. GetPlayerKeys(playerid, udAnalog, lrAnalog, wKeys);
  590. format(str, sizeof(str), "Keys(%d, %d, %d).", udAnalog, lrAnalog, wKeys);
  591. SendClientMessage(playerid, 0xFF6347AA, str);
  592. return 1;
  593. }
  594. if(!strcmp(cmdtext, "/nodamage", true))
  595. {
  596. NoDamage = !NoDamage;
  597. new str[80];
  598. format(str, sizeof(str), "NoDamage set to %d.", NoDamage);
  599. SendClientMessage(playerid, 0xFF6347AA, str);
  600. return 1;
  601. }
  602. return 0;
  603. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement