damages.inc 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #define DIALOG_DAMAGE 1927
  2. #define MAX_DAMAGES 1000
  3. #define SCM SendClientMessage
  4. #define FORMAT:%0(%1) format(%0, sizeof(%0), %1)
  5. enum dmgInfo
  6. {
  7. dmgDamage,
  8. dmgWeapon,
  9. dmgBodypart,
  10. dmgKevlarhit,
  11. dmgSeconds,
  12. }
  13. new DamageInfo[MAX_PLAYERS][MAX_DAMAGES][dmgInfo];
  14. stock ResetPlayerDamages(playerid)
  15. {
  16. for(new i = 0; i < MAX_DAMAGES; i++)
  17. {
  18. if(DamageInfo[playerid][i][dmgDamage] != 0)
  19. {
  20. DamageInfo[playerid][i][dmgDamage] = 0;
  21. DamageInfo[playerid][i][dmgWeapon] = 0;
  22. DamageInfo[playerid][i][dmgBodypart] = 0;
  23. DamageInfo[playerid][i][dmgKevlarhit] = 0;
  24. DamageInfo[playerid][i][dmgSeconds] = 0;
  25. }
  26. }
  27. return 1;
  28. }
  29. Hook:d_OnPlayerConnect(playerid)
  30. {
  31. ResetPlayerDamages(playerid);
  32. return 1;
  33. }
  34. stock ShowPlayerDamages(playerid, toid)
  35. {
  36. new
  37. str[4096], str1[4096], count = 0, name[MAX_PLAYER_NAME];
  38. GetPlayerName(playerid, name, sizeof(name));
  39. for(new i = 0; i < MAX_DAMAGES; i++)
  40. {
  41. if(DamageInfo[playerid][i][dmgDamage] != 0) count++;
  42. }
  43. if(count == 0) return ShowPlayerDialog(toid, DIALOG_DAMAGE, DIALOG_STYLE_LIST, name, "There is no damage to display...", "Close", "");
  44. else if(count > 0)
  45. {
  46. for(new i = 0; i < MAX_DAMAGES; i++)
  47. {
  48. if(DamageInfo[playerid][i][dmgDamage] != 0)
  49. {
  50. FORMAT:str1("%d dmg from %s to %s (Kevlarhit: %d) %d s ago\n", DamageInfo[playerid][i][dmgDamage], GetWeaponNameEx(DamageInfo[playerid][i][dmgWeapon]), GetBodypartName(DamageInfo[playerid][i][dmgBodypart]), DamageInfo[playerid][i][dmgKevlarhit], gettime() - DamageInfo[playerid][i][dmgSeconds]);
  51. strcat(str, str1);
  52. }
  53. }
  54. ShowPlayerDialog(toid, DIALOG_DAMAGE, DIALOG_STYLE_LIST, name, str, "Close", "");
  55. }
  56. return 1;
  57. }
  58. CMD:damages(playerid, params[])
  59. {
  60. new targetid, Float: pPos[3];
  61. if(sscanf(params, "u", playerid)) return SCM(playerid, 0xFF6347FF, "{00BFFF}Usage:{FFFFFF}/damages [playerid/PartOfName]");
  62. if(!IsPlayerConnected(playerid)) return SCM(playerid, 0xFF6347FF, "Playerid is not an active player.");
  63. GetPlayerPos(playerid, pPos[0], pPos[1], pPos[2]);
  64. if(IsPlayerInRangeOfPoint(playerid, 7.0, pPos[0], pPos[1], pPos[2]))
  65. {
  66. ShowPlayerDamages(playerid, targetid);
  67. }
  68. else return SCM(playerid, 0xB8BAC6FF, "You're too far away.");
  69. return 1;
  70. }
  71. Hook:d_OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid, bodypart)
  72. {
  73. if(IsPlayerConnected(playerid))
  74. {
  75. new Float: pHP, Float: pArm;
  76. GetPlayerHealth(playerid, pHP);
  77. GetPlayerArmour(playerid, pArm);
  78. for(new i = 0; i < MAX_DAMAGES; i++)
  79. {
  80. if(!DamageInfo[playerid][i][dmgDamage])
  81. {
  82. playerid = i;
  83. break;
  84. }
  85. }
  86. for(new i = 0; i < MAX_DAMAGES; i++)
  87. {
  88. DamageInfo[playerid][i][dmgDamage] = floatround(amount, floatround_round);
  89. DamageInfo[playerid][i][dmgWeapon] = weaponid;
  90. DamageInfo[playerid][i][dmgBodypart] = bodypart;
  91. if(pArm > 0) DamageInfo[playerid][i][dmgKevlarhit] = 1;
  92. else if(pArm < 1) DamageInfo[playerid][i][dmgKevlarhit] = 0;
  93. DamageInfo[playerid][i][dmgSeconds] = gettime();
  94. }
  95. }
  96. return 1;
  97. }
  98. stock GetWeaponNameEx(weaponid)
  99. {
  100. new weaponname[60];
  101. GetWeaponName(weaponid, weaponname, sizeof(weaponname));
  102. return weaponname;
  103. }
  104. stock GetBodypartName(bodypart)
  105. {
  106. new bodyname[60];
  107. switch(bodypart)
  108. {
  109. case BODY_PART_TORSO: FORMAT:bodyname("TORSO");
  110. case BODY_PART_GROIN: FORMAT:bodyname("GROIN");
  111. case BODY_PART_RIGHT_ARM: FORMAT:bodyname("RIGHT ARM");
  112. case BODY_PART_LEFT_ARM: FORMAT:bodyname("LEFT ARM");
  113. case BODY_PART_RIGHT_LEG: FORMAT:bodyname("RIGHT ARM");
  114. case BODY_PART_LEFT_LEG: FORMAT:bodyname("LEFT LEG");
  115. case BODY_PART_HEAD: FORMAT:bodyname("HEAD");
  116. }
  117. return bodyname;
  118. }