HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <fakemeta>
  3. #include <engine>
  4. #include <hamsandwich>
  5.  
  6. #define PLUGIN "Saved ya"
  7. #define VERSION "1.0"
  8. #define AUTHOR "EFFEX"
  9.  
  10. #define MIN_DISTANCE 500
  11. #define MIN_PLAYERS 3
  12. #define MAX_DELAY 2
  13.  
  14. #if !defined MAX_NAME_LENGTH
  15. #define MAX_NAME_LENGTH 32
  16. #endif
  17.  
  18. const Float:CHECK_DELAY = 0.5
  19.  
  20. new g_iPlayerCloseEnemyID[MAX_NAME_LENGTH + 1]
  21. new g_iLastTimeSeen[MAX_NAME_LENGTH + 1]
  22. new g_iUserWeapon[MAX_NAME_LENGTH + 1]
  23. new Float:g_fUserCheckDelay[MAX_NAME_LENGTH + 1]
  24.  
  25. new g_mMessageSayText
  26. new pCvarDeathMatchMod
  27.  
  28. public plugin_init()
  29. {
  30. register_plugin(PLUGIN, VERSION, AUTHOR)
  31.  
  32. pCvarDeathMatchMod = register_cvar("sy_deathmatch_support", "0")
  33. g_mMessageSayText = get_user_msgid("SayText")
  34.  
  35. RegisterHam(Ham_TakeDamage, "player", "ham_PlayerTakeDamage_Pre", 0)
  36. RegisterHam(Ham_Killed, "player", "ham_PlayerKilled_Post", 1)
  37. }
  38.  
  39. public ham_PlayerKilled_Post(iVictim, iAttacker, iShouldGibs)
  40. {
  41. if(!is_user_connected(iAttacker) || !is_user_connected(iVictim) || (iVictim == iAttacker))
  42. return HAM_IGNORED
  43.  
  44. if(get_user_team(iAttacker) == get_user_team(iVictim)
  45. || (g_iUserWeapon[iAttacker] == CSW_HEGRENADE)
  46. || hasObjectInTheWay(iAttacker, iVictim))
  47. return HAM_IGNORED
  48.  
  49. new iMateID = g_iPlayerCloseEnemyID[iVictim]
  50. if(iMateID == iAttacker)
  51. return HAM_IGNORED
  52.  
  53. if(iMateID && is_user_alive(iMateID))
  54. {
  55. new szMateName[MAX_NAME_LENGTH], szVictimName[MAX_NAME_LENGTH], szKillerName[MAX_NAME_LENGTH]
  56. get_user_name(iVictim, szVictimName, charsmax(szVictimName))
  57. get_user_name(iMateID, szMateName, charsmax(szMateName))
  58. get_user_name(iAttacker, szKillerName, charsmax(szKillerName))
  59.  
  60. sendColoredMessage(iMateID, "^x04** %s megmentett %s megölésével! **", szKillerName, szVictimName)
  61. sendColoredMessage(iAttacker, "^x04** Megmentetted %s -t, %s megölésével! **", szMateName, szVictimName)
  62.  
  63. g_iPlayerCloseEnemyID[iVictim] = 0
  64. }
  65. return HAM_IGNORED
  66. }
  67.  
  68. public ham_PlayerTakeDamage_Pre(iVictim, iInflictor, iAttacker, Float:fDamage, iDamageBits)
  69. {
  70. if(!is_user_connected(iAttacker) || !is_user_connected(iVictim) || (iVictim == iAttacker))
  71. return HAM_IGNORED
  72.  
  73. if(hasObjectInTheWay(iAttacker, iVictim))
  74. return HAM_IGNORED
  75.  
  76. if(iDamageBits & (1 << 24)) // he Damage
  77. {
  78. g_iUserWeapon[iAttacker] = CSW_HEGRENADE
  79. return HAM_IGNORED
  80. }
  81. else g_iUserWeapon[iAttacker] = get_user_weapon(iAttacker)
  82.  
  83. static Float:fOrigin[3]
  84. entity_get_vector(iAttacker, EV_VEC_origin, fOrigin)
  85. if(is_visible(iVictim, iAttacker) && is_in_viewcone(iVictim, fOrigin, 1))
  86. return HAM_IGNORED
  87.  
  88. g_iLastTimeSeen[iAttacker] = get_systime()
  89. g_iPlayerCloseEnemyID[iAttacker] = iVictim
  90. return HAM_IGNORED
  91. }
  92.  
  93. public client_PreThink(id)
  94. {
  95. if(!is_user_alive(id) && get_pcvar_num(pCvarDeathMatchMod))
  96. return
  97.  
  98. static iPlayers[MAX_NAME_LENGTH], iSysTime;iSysTime = get_systime()
  99. new iNum
  100. get_players(iPlayers, iNum, "a")
  101. if(iNum < MIN_PLAYERS) // at least 2 players in a team (so one of them could be saved)
  102. return
  103.  
  104. static Float:fCheckDelay;fCheckDelay = get_gametime()
  105. if((fCheckDelay - g_fUserCheckDelay[id]) <= CHECK_DELAY)
  106. return
  107.  
  108. static Float:fUserOrigin[3]
  109. entity_get_vector(id, EV_VEC_origin, fUserOrigin)
  110. for(new i, iPlayer, bool:bIsTooClose = false, Float:fOrigin[3];i < iNum;i++)
  111. {
  112. iPlayer = iPlayers[i]
  113. if((iPlayer == id) || (get_user_team(iPlayer) == get_user_team(id)))
  114. continue
  115.  
  116. if((get_user_weapon(id) == CSW_KNIFE) && (get_user_weapon(iPlayer) == CSW_KNIFE))
  117. continue // maybe having some fun making knife vs knife duel? ^^
  118.  
  119. entity_get_vector(iPlayer, EV_VEC_origin, fOrigin)
  120. bIsTooClose = bool:(get_distance_f(fUserOrigin, fOrigin) <= MIN_DISTANCE)
  121.  
  122. if(is_visible(id, iPlayer) && is_in_viewcone(id, fOrigin, 1) && bIsTooClose)
  123. {
  124. g_iLastTimeSeen[id] = iSysTime
  125. g_iPlayerCloseEnemyID[id] = iPlayer
  126. }
  127. }
  128.  
  129. if(g_iPlayerCloseEnemyID[id])
  130. {
  131. if((iSysTime - g_iLastTimeSeen[id]) >= MAX_DELAY)
  132. {
  133. g_iLastTimeSeen[id] = 0
  134. g_iPlayerCloseEnemyID[id] = 0
  135. }
  136. }
  137. g_fUserCheckDelay[id] = fCheckDelay
  138. }
  139.  
  140. sendColoredMessage(const id, const input[], any:...)
  141. {
  142. static szMsg[192]
  143. vformat(szMsg, 190, input, 3)
  144.  
  145. message_begin(MSG_ONE_UNRELIABLE, g_mMessageSayText, .player = id)
  146. write_byte(id)
  147. write_string(szMsg)
  148. message_end()
  149. }
  150.  
  151. bool:hasObjectInTheWay(iAttacker, iVictim)
  152. {
  153. static Float:fAttackerOrigin[3], Float:fVictimOrigin[3]
  154. pev(iAttacker, pev_origin, fAttackerOrigin)
  155. pev(iVictim, pev_origin, fVictimOrigin)
  156.  
  157. static tr, Float:fFraction
  158. engfunc(EngFunc_TraceLine, fVictimOrigin, fAttackerOrigin, 1, -1, tr)
  159. get_tr2(tr, TR_flFraction, fFraction)
  160.  
  161. return bool:(fFraction != 1.0)
  162. }
  163.