wounded.inc 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  1. #include <YSI_Coding\y_hooks>
  2. forward OnPlayerWounded(playerid);
  3. forward OnPlayerSpawnToHospital(playerid);
  4. forward OnPlayerWrongAnimation(playerid);
  5. static Injuries[MAX_PLAYERS];
  6. static DeadAnimation[MAX_PLAYERS];
  7. static DeathTimer[MAX_PLAYERS];
  8. static Text3D:DeadTD[MAX_PLAYERS];
  9. static bool:ValidDeadTD[MAX_PLAYERS];
  10. timer DeadAnimationCheck[150](playerid)
  11. {
  12. if(IsPlayerWounded(playerid))
  13. {
  14. if(!IsPlayerInAnyVehicle(playerid))
  15. {
  16. if(GetPlayerAnimationIndex(playerid) != DeadAnimation[playerid])
  17. {
  18. if(DeadAnimation[playerid] != 1701) OnPlayerWrongAnimation(playerid);
  19. else if(GetPlayerAnimationIndex(playerid) != 1701 && GetPlayerAnimationIndex(playerid) != 1151) OnPlayerWrongAnimation(playerid);
  20. }
  21. }
  22. else if(GetPlayerAnimationIndex(playerid) != 1019) OnPlayerWrongAnimation(playerid);
  23. defer DeadAnimationCheck(playerid);
  24. }
  25. }
  26. public OnPlayerWounded(playerid)
  27. {
  28. Injuries[playerid] = 1;
  29. DeathTimer[playerid] = gettime();
  30. new Float:x, Float:y, Float:z;
  31. GetPlayerPos(playerid, x, y, z);
  32. if(ValidDeadTD[playerid] == false)
  33. {
  34. ValidDeadTD[playerid] = true;
  35. DeadTD[playerid] = Create3DTextLabel(va_return("(( This player is brutally wounded,\n/injuries %d for more information ))", playerid), 0xFF6666FF, x, y, z, 20, 0, 1);
  36. Attach3DTextLabelToPlayer(DeadTD[playerid], playerid, 0.0, 0.0, 0.4);
  37. }
  38. SetPlayerHealth(playerid, 1);
  39. switch(random(6))
  40. {
  41. case 0: DeadAnimation[playerid] = 1701;
  42. case 1: DeadAnimation[playerid] = 385;
  43. case 2: DeadAnimation[playerid] = 387;
  44. case 3: DeadAnimation[playerid] = 388;
  45. case 4: DeadAnimation[playerid] = 390;
  46. case 5: DeadAnimation[playerid] = 392;
  47. }
  48. if(IsPlayerInAnyVehicle(playerid))
  49. {
  50. if(GetPlayerVehicleSeat(playerid) == 0)
  51. {
  52. new engine, lights, alarm, doors, bonnet, boot, objective;
  53. GetVehicleParamsEx(GetPlayerVehicleID(playerid), engine, lights, alarm, doors, bonnet, boot, objective);
  54. SetVehicleParamsEx(GetPlayerVehicleID(playerid), VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
  55. }
  56. }
  57. defer DeadAnimationCheck(playerid);
  58. SendClientMessage(playerid, 0xff9999ff, "** You were brutally wounded, you must wait 60 seconds before using /acceptdeath.");
  59. return 1;
  60. }
  61. public OnPlayerSpawnToHospital(playerid)
  62. {
  63. Corpse_Create(playerid);
  64. if(ValidDeadTD[playerid] == true)
  65. {
  66. Delete3DTextLabel(DeadTD[playerid]);
  67. ValidDeadTD[playerid] = false;
  68. }
  69. Injuries[playerid] = 0;
  70. DeathTimer[playerid] = 0;
  71. DeadAnimation[playerid] = 0;
  72. SetPlayerInterior(playerid, 0);
  73. SetPlayerVirtualWorld(playerid, 0);
  74. SetPlayerPos(playerid, 2032.1594, -1406.6229, 17.2038);
  75. SetPlayerFacingAngle(playerid, 153.6930);
  76. SetCameraBehindPlayer(playerid);
  77. ResetPlayerWeapons(playerid);
  78. SetPlayerHealth(playerid, 100);
  79. SetPlayerArmour(playerid, 0);
  80. SendClientMessage(playerid, 0xff9999ff, "** You have paid $350 to cover your medical expenses.");
  81. return 1;
  82. }
  83. public OnPlayerWrongAnimation(playerid)
  84. {
  85. if(!IsPlayerInAnyVehicle(playerid))
  86. {
  87. switch(DeadAnimation[playerid])
  88. {
  89. case 1701:
  90. {
  91. if(Injuries[playerid] < 4) ApplyAnimation(playerid, "WUZI", "CS_Dead_Guy", 4.1, 1, 1, 1, 1, 0, 1);
  92. else ApplyAnimation(playerid, "ped", "FLOOR_hit_f", 4.1, 0, 1, 1, 1, 0, 1);
  93. }
  94. case 385: ApplyAnimation(playerid, "CRACK", "CRCKDETH1", 4.1, 0, 1, 1, 1, 0, 1);
  95. case 387: ApplyAnimation(playerid, "CRACK", "CRCKDETH3", 4.1, 0, 1, 1, 1, 0, 1);
  96. case 388: ApplyAnimation(playerid, "CRACK", "CRCKDETH4", 4.1, 0, 1, 1, 1, 0, 1);
  97. case 390: ApplyAnimation(playerid, "CRACK", "CRCKIDLE2", 4.1, 0, 1, 1, 1, 0, 1);
  98. case 392: ApplyAnimation(playerid, "CRACK", "CRCKIDLE4", 4.1, 0, 1, 1, 1, 0, 1);
  99. }
  100. }
  101. else ApplyAnimation(playerid, "ped", "CAR_dead_RHS", 4.1, 0, 1, 1, 1, 0, 1);
  102. return 1;
  103. }
  104. hook OnPlayerConnect(playerid)
  105. {
  106. Injuries[playerid] = 0;
  107. DeathTimer[playerid] = 0;
  108. DeadAnimation[playerid] = 0;
  109. ValidDeadTD[playerid] = false;
  110. }
  111. hook OnPlayerDeath(playerid, killerid, reason)
  112. {
  113. if(!IsPlayerWounded(playerid)) Injuries[playerid] = 1;
  114. }
  115. hook OnPlayerFirstSpawn(playerid)
  116. {
  117. SetPlayerTeam(playerid, DEFAULT_TEAM);
  118. }
  119. hook OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart)
  120. {
  121. new Float:health, Float:armour;
  122. GetPlayerHealth(playerid, health);
  123. GetPlayerArmour(playerid, armour);
  124. if(!IsPlayerWounded(playerid))
  125. {
  126. switch(weaponid)
  127. {
  128. case WEAPON_FIST:
  129. {
  130. amount = 4;
  131. if(health > amount) SetPlayerHealth(playerid, health - amount);
  132. else CallRemoteFunction("OnPlayerWounded", "i", playerid);
  133. }
  134. case WEAPON_BRASSKNUCKLE..WEAPON_NITESTICK, WEAPON_BAT..WEAPON_POOLSTICK, WEAPON_CANE:
  135. {
  136. amount = 9;
  137. if(health > amount) SetPlayerHealth(playerid, health - amount);
  138. else CallRemoteFunction("OnPlayerWounded", "i", playerid);
  139. }
  140. case WEAPON_KNIFE, WEAPON_KATANA:
  141. {
  142. amount = 14;
  143. if(health > amount) SetPlayerHealth(playerid, health - amount);
  144. else CallRemoteFunction("OnPlayerWounded", "i", playerid);
  145. }
  146. case WEAPON_COLT45, WEAPON_SILENCED:
  147. {
  148. switch(bodypart)
  149. {
  150. case BODY_PART_TORSO:
  151. {
  152. amount = 25;
  153. if(health > amount && armour == 0) SetPlayerHealth(playerid, health - amount);
  154. else if(armour == 0) CallRemoteFunction("OnPlayerWounded", "i", playerid);
  155. if(armour > amount) SetPlayerArmour(playerid, armour - amount);
  156. else SetPlayerArmour(playerid, 0);
  157. }
  158. case BODY_PART_HEAD:
  159. {
  160. amount = 40;
  161. if(health > amount) SetPlayerHealth(playerid, health - amount);
  162. else CallRemoteFunction("OnPlayerWounded", "i", playerid);
  163. }
  164. case BODY_PART_GROIN..BODY_PART_LEFT_LEG:
  165. {
  166. amount = 18;
  167. if(health > amount) SetPlayerHealth(playerid, health - amount);
  168. else CallRemoteFunction("OnPlayerWounded", "i", playerid);
  169. }
  170. }
  171. }
  172. case WEAPON_DEAGLE:
  173. {
  174. switch(bodypart)
  175. {
  176. case BODY_PART_TORSO, BODY_PART_HEAD:
  177. {
  178. amount = 40;
  179. if(health > amount && armour == 0) SetPlayerHealth(playerid, health - amount);
  180. else if(armour == 0) CallRemoteFunction("OnPlayerWounded", "i", playerid);
  181. if(armour > amount) SetPlayerArmour(playerid, armour - amount);
  182. else SetPlayerArmour(playerid, 0);
  183. }
  184. case BODY_PART_GROIN..BODY_PART_LEFT_LEG:
  185. {
  186. amount = 20;
  187. if(health > amount) SetPlayerHealth(playerid, health - amount);
  188. else CallRemoteFunction("OnPlayerWounded", "i", playerid);
  189. }
  190. }
  191. }
  192. case WEAPON_SHOTGUN:
  193. {
  194. new Float:x, Float:y, Float:z;
  195. GetPlayerPos(playerid, x, y, z);
  196. new Float:distance = GetPlayerDistanceFromPoint(issuerid, x, y, z);
  197. if(distance < 8)
  198. {
  199. switch(bodypart)
  200. {
  201. case BODY_PART_TORSO:
  202. {
  203. amount = 60;
  204. if(health > amount && armour == 0) SetPlayerHealth(playerid, health - amount);
  205. else if(armour == 0) CallRemoteFunction("OnPlayerWounded", "i", playerid);
  206. if(armour > amount) SetPlayerArmour(playerid, armour - amount);
  207. else SetPlayerArmour(playerid, 0);
  208. }
  209. case BODY_PART_HEAD:
  210. {
  211. amount = 100;
  212. CallRemoteFunction("OnPlayerWounded", "i", playerid);
  213. }
  214. case BODY_PART_GROIN..BODY_PART_LEFT_LEG:
  215. {
  216. amount = 25;
  217. if(health > amount) SetPlayerHealth(playerid, health - amount);
  218. else CallRemoteFunction("OnPlayerWounded", "i", playerid);
  219. }
  220. }
  221. }
  222. else if(distance < 16)
  223. {
  224. switch(bodypart)
  225. {
  226. case BODY_PART_TORSO:
  227. {
  228. amount = 40;
  229. if(health > amount && armour == 0) SetPlayerHealth(playerid, health - amount);
  230. else if(armour == 0) CallRemoteFunction("OnPlayerWounded", "i", playerid);
  231. if(armour > amount) SetPlayerArmour(playerid, armour - amount);
  232. else SetPlayerArmour(playerid, 0);
  233. }
  234. case BODY_PART_HEAD:
  235. {
  236. amount = 60;
  237. if(health > amount) SetPlayerHealth(playerid, health - amount);
  238. else CallRemoteFunction("OnPlayerWounded", "i", playerid);
  239. }
  240. case BODY_PART_GROIN..BODY_PART_LEFT_LEG:
  241. {
  242. amount = 18;
  243. if(health > amount) SetPlayerHealth(playerid, health - amount);
  244. else CallRemoteFunction("OnPlayerWounded", "i", playerid);
  245. }
  246. }
  247. }
  248. else
  249. {
  250. switch(bodypart)
  251. {
  252. case BODY_PART_TORSO:
  253. {
  254. amount = 22;
  255. if(health > amount && armour == 0) SetPlayerHealth(playerid, health - amount);
  256. else if(armour == 0) CallRemoteFunction("OnPlayerWounded", "i", playerid);
  257. if(armour > amount) SetPlayerArmour(playerid, armour - amount);
  258. else SetPlayerArmour(playerid, 0);
  259. }
  260. case BODY_PART_HEAD:
  261. {
  262. amount = 32;
  263. if(health > amount) SetPlayerHealth(playerid, health - amount);
  264. else CallRemoteFunction("OnPlayerWounded", "i", playerid);
  265. }
  266. case BODY_PART_GROIN..BODY_PART_LEFT_LEG:
  267. {
  268. amount = 12;
  269. if(health > amount) SetPlayerHealth(playerid, health - amount);
  270. else CallRemoteFunction("OnPlayerWounded", "i", playerid);
  271. }
  272. }
  273. }
  274. }
  275. case WEAPON_UZI, WEAPON_MP5, WEAPON_TEC9:
  276. {
  277. switch(bodypart)
  278. {
  279. case BODY_PART_TORSO:
  280. {
  281. amount = 16;
  282. if(health > amount && armour == 0) SetPlayerHealth(playerid, health - amount);
  283. else if(armour == 0) CallRemoteFunction("OnPlayerWounded", "i", playerid);
  284. if(armour > amount) SetPlayerArmour(playerid, armour - amount);
  285. else SetPlayerArmour(playerid, 0);
  286. }
  287. case BODY_PART_HEAD:
  288. {
  289. amount = 28;
  290. if(health > amount) SetPlayerHealth(playerid, health - amount);
  291. else CallRemoteFunction("OnPlayerWounded", "i", playerid);
  292. }
  293. case BODY_PART_GROIN..BODY_PART_LEFT_LEG:
  294. {
  295. amount = 9;
  296. if(health > amount) SetPlayerHealth(playerid, health - amount);
  297. else CallRemoteFunction("OnPlayerWounded", "i", playerid);
  298. }
  299. }
  300. }
  301. case WEAPON_AK47:
  302. {
  303. switch(bodypart)
  304. {
  305. case BODY_PART_TORSO:
  306. {
  307. amount = 24;
  308. if(health > amount && armour == 0) SetPlayerHealth(playerid, health - amount);
  309. else if(armour == 0) CallRemoteFunction("OnPlayerWounded", "i", playerid);
  310. if(armour > amount) SetPlayerArmour(playerid, armour - amount);
  311. else SetPlayerArmour(playerid, 0);
  312. }
  313. case BODY_PART_HEAD:
  314. {
  315. amount = 32;
  316. if(health > amount) SetPlayerHealth(playerid, health - amount);
  317. else CallRemoteFunction("OnPlayerWounded", "i", playerid);
  318. }
  319. case BODY_PART_GROIN..BODY_PART_LEFT_LEG:
  320. {
  321. amount = 12;
  322. if(health > amount) SetPlayerHealth(playerid, health - amount);
  323. else CallRemoteFunction("OnPlayerWounded", "i", playerid);
  324. }
  325. }
  326. }
  327. case WEAPON_M4:
  328. {
  329. switch(bodypart)
  330. {
  331. case BODY_PART_TORSO:
  332. {
  333. amount = 20;
  334. if(health > amount && armour == 0) SetPlayerHealth(playerid, health - amount);
  335. else if(armour == 0) CallRemoteFunction("OnPlayerWounded", "i", playerid);
  336. if(armour > amount) SetPlayerArmour(playerid, armour - amount);
  337. else SetPlayerArmour(playerid, 0);
  338. }
  339. case BODY_PART_HEAD:
  340. {
  341. amount = 31;
  342. if(health > amount) SetPlayerHealth(playerid, health - amount);
  343. else CallRemoteFunction("OnPlayerWounded", "i", playerid);
  344. }
  345. case BODY_PART_GROIN..BODY_PART_LEFT_LEG:
  346. {
  347. amount = 10;
  348. if(health > amount) SetPlayerHealth(playerid, health - amount);
  349. else CallRemoteFunction("OnPlayerWounded", "i", playerid);
  350. }
  351. }
  352. }
  353. case WEAPON_RIFLE, WEAPON_SNIPER:
  354. {
  355. switch(bodypart)
  356. {
  357. case BODY_PART_TORSO:
  358. {
  359. amount = 60;
  360. if(health > amount && armour == 0) SetPlayerHealth(playerid, health - amount);
  361. else if(armour == 0) CallRemoteFunction("OnPlayerWounded", "i", playerid);
  362. if(armour > amount) SetPlayerArmour(playerid, armour - amount);
  363. else SetPlayerArmour(playerid, 0);
  364. }
  365. case BODY_PART_HEAD:
  366. {
  367. amount = 100;
  368. CallRemoteFunction("OnPlayerWounded", "i", playerid);
  369. }
  370. case BODY_PART_GROIN..BODY_PART_LEFT_LEG:
  371. {
  372. amount = 34;
  373. if(health > amount) SetPlayerHealth(playerid, health - amount);
  374. else CallRemoteFunction("OnPlayerWounded", "i", playerid);
  375. }
  376. }
  377. }
  378. }
  379. }
  380. return 1;
  381. }
  382. hook OnPlayerShotPlayer(playerid, hitid)
  383. {
  384. if(0 < Injuries[hitid] < 4)
  385. {
  386. Injuries[hitid]++;
  387. if(Injuries[hitid] >= 4)
  388. {
  389. SendClientMessage(hitid, 0xff6666ff, "** You're now dead, you will be able to use /acceptdeath in short time.");
  390. if(ValidDeadTD[hitid] == true) Update3DTextLabelText(DeadTD[hitid], 0xFF6666FF, "(( This player is dead ))");
  391. if(DeadAnimation[hitid] == 1701) ApplyAnimation(hitid, "ped", "FLOOR_hit_f", 4.1, 0, 1, 1, 1, 0, 1);
  392. }
  393. }
  394. }
  395. hook OnPlayerDisconnect(playerid, reason)
  396. {
  397. if(ValidDeadTD[playerid] == true)
  398. {
  399. Delete3DTextLabel(DeadTD[playerid]);
  400. ValidDeadTD[playerid] = false;
  401. }
  402. }
  403. hook OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
  404. {
  405. if(IsPlayerWounded(playerid))
  406. {
  407. ClearAnimations(playerid, 1);
  408. new Float:x, Float:y, Float:z;
  409. GetPlayerPos(playerid, x, y, z);
  410. SetPlayerPos(playerid, x, y, z);
  411. }
  412. }
  413. hook OnPlayerExitVehicle(playerid, vehicleid)
  414. {
  415. if(IsPlayerWounded(playerid))
  416. {
  417. new seat = GetPlayerVehicleSeat(playerid);
  418. ClearAnimations(playerid, 1);
  419. PutPlayerInVehicle(playerid, vehicleid, seat);
  420. }
  421. }
  422. RevivePlayer(playerid)
  423. {
  424. if(ValidDeadTD[playerid] == true)
  425. {
  426. Delete3DTextLabel(DeadTD[playerid]);
  427. ValidDeadTD[playerid] = false;
  428. }
  429. if(IsPlayerWounded(playerid))
  430. {
  431. ResetPlayerInjuries(playerid);
  432. Injuries[playerid] = 0;
  433. DeathTimer[playerid] = 0;
  434. DeadAnimation[playerid] = 0;
  435. if(IsPlayerInAnyVehicle(playerid))
  436. {
  437. new seat = GetPlayerVehicleSeat(playerid);
  438. new vehicle = GetPlayerVehicleID(playerid);
  439. ClearAnimations(playerid, 1);
  440. PutPlayerInVehicle(playerid, vehicle, seat);
  441. }
  442. else ClearAnimations(playerid, 1);
  443. }
  444. return 1;
  445. }
  446. IsPlayerWounded(playerid)
  447. {
  448. if(Injuries[playerid] > 0)
  449. {
  450. return true;
  451. }
  452. return false;
  453. }
  454. CMD:acceptdeath(playerid, params[])
  455. {
  456. if(!IsPlayerWounded(playerid)) return SendErrorMessage(playerid, "You are not wounded.");
  457. new time = gettime() - DeathTimer[playerid];
  458. if(time < 5) return SendErrorMessageF(playerid, "You can only use this command in %d seconds.", 5 - time);
  459. CallRemoteFunction("OnPlayerSpawnToHospital", "i", playerid);
  460. return 1;
  461. }