HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <hamsandwich>
  3. #include <fakemeta>
  4.  
  5. #define is_user_valid(%0) (%0 && %0 < g_iMaxPlayers)
  6. #define MAXPLAYERS 32
  7. #define MAXLENGTH 28
  8. #define linux_diff_player 5
  9. #define m_iTeam 114
  10. #define m_iDeaths 444
  11.  
  12. #define DAMAGE_FOR_ASSIST 50
  13. #define MONEY_FOR_ASSIST 0
  14. #define FRAGS_FOR_ASSIST
  15. //#define FFA
  16. //#define HLTV_FIX
  17.  
  18. #if MONEY_FOR_ASSIST > 0
  19. #define MAXMONEY 16000
  20. #include <cstrike>
  21. #endif
  22.  
  23. //#define DEBUG
  24.  
  25. #if AMXX_VERSION_NUM < 183
  26. #define client_disconnected client_disconnect
  27. #endif
  28.  
  29. enum _:PLAYER_DATA
  30. {
  31. DAMAGE_ON[MAXPLAYERS + 1],
  32. ASSISTANT_NAME[32],
  33. ASSISTANT,
  34. MAXHEALTH,
  35. CONNECTED,
  36. TEAM
  37. }
  38.  
  39. new g_ePlayerData[MAXPLAYERS + 1][PLAYER_DATA], g_iMaxPlayers, HamHook:g_pHamSpawnPost
  40.  
  41. public plugin_init()
  42. {
  43. register_plugin("CS Revo: Advanced Kill Assists", "0.9", "Spection")
  44.  
  45. RegisterHam(Ham_TakeDamage, "player", "Ham_PlayerTakeDamage_Pre", false)
  46. RegisterHam(Ham_Killed, "player", "Ham_PlayerKilled_Pre", false)
  47. DisableHamForward((g_pHamSpawnPost = RegisterHam(Ham_Killed, "player", "Ham_PlayerKilled_Post", true)))
  48. RegisterHam(Ham_Spawn, "player", "Ham_PlayerSpawn_Post", true)
  49.  
  50. register_event("HLTV", "Event_HLTV", "a", "1=0", "2=0")
  51.  
  52. #if defined DEBUG
  53. register_clcmd("assist", "ClCmd_Assist")
  54. #endif
  55. g_iMaxPlayers = get_maxplayers() + 1
  56. }
  57.  
  58. public Event_HLTV()
  59. {
  60. for(new i = 1; i < g_iMaxPlayers; i++)
  61. {
  62. if(g_ePlayerData[i][CONNECTED])
  63. {
  64. g_ePlayerData[i][ASSISTANT] = 0
  65. arrayset(g_ePlayerData[i][DAMAGE_ON], 0, MAXPLAYERS + 1)
  66. g_ePlayerData[i][ASSISTANT_NAME] = ""
  67. }
  68. }
  69. }
  70.  
  71. public client_putinserver(id) g_ePlayerData[id][CONNECTED] = true
  72.  
  73. public client_disconnected(id)
  74. {
  75. g_ePlayerData[id][ASSISTANT] = 0
  76. arrayset(g_ePlayerData[id][DAMAGE_ON], 0, MAXPLAYERS + 1)
  77. g_ePlayerData[id][ASSISTANT_NAME] = ""
  78. g_ePlayerData[id][CONNECTED] = false
  79. }
  80.  
  81. public Ham_PlayerSpawn_Post(id)
  82. {
  83. #if !defined FFA
  84. g_ePlayerData[id][TEAM] = get_pdata_int(id, m_iTeam, linux_diff_player)
  85. #endif
  86. g_ePlayerData[id][MAXHEALTH] = pev(id, pev_health)
  87. g_ePlayerData[id][ASSISTANT] = 0
  88. g_ePlayerData[id][ASSISTANT_NAME] = ""
  89. }
  90.  
  91. public Ham_PlayerKilled_Pre(iVictim, iKiller)
  92. {
  93. if(g_ePlayerData[g_ePlayerData[iVictim][ASSISTANT]][CONNECTED]) g_ePlayerData[g_ePlayerData[iVictim][ASSISTANT]][DAMAGE_ON][iVictim] = 0
  94. if(!is_user_valid(iKiller)) return HAM_IGNORED
  95. g_ePlayerData[iKiller][DAMAGE_ON][iVictim] = 0
  96. if(iKiller == g_ePlayerData[iVictim][ASSISTANT] || iKiller == iVictim || !g_ePlayerData[iVictim][ASSISTANT_NAME][0]) return HAM_IGNORED
  97.  
  98. static szBuffer[64], szName[32], iLen[2]
  99. get_user_name(iKiller, szName, charsmax(szName))
  100. iLen[0] = strlen(szName)
  101. iLen[1] = strlen(g_ePlayerData[iVictim][ASSISTANT_NAME])
  102. if(iLen[0] > MAXLENGTH / 2)
  103. {
  104. if(iLen[1] > MAXLENGTH / 2)
  105. {
  106. if(iLen[0] - MAXLENGTH / 2 > 1)
  107. {
  108. if(iLen[1] - MAXLENGTH / 2 > 1)
  109. {
  110. strclip(szName, charsmax(szName), MAXLENGTH / 2)
  111. strclip(g_ePlayerData[iVictim][ASSISTANT_NAME], 31, MAXLENGTH / 2)
  112. }
  113. else strclip(szName, charsmax(szName), MAXLENGTH / 2 - (iLen[1] - MAXLENGTH / 2))
  114. }
  115. else strclip(g_ePlayerData[iVictim][ASSISTANT_NAME], 31, MAXLENGTH / 2 - (iLen[0] - MAXLENGTH / 2))
  116. }
  117. else strclip(szName, charsmax(szName), MAXLENGTH - iLen[1])
  118. }
  119. else if(iLen[1] > MAXLENGTH / 2) strclip(g_ePlayerData[iVictim][ASSISTANT_NAME], 31, MAXLENGTH - iLen[0])
  120.  
  121. formatex(szBuffer, charsmax(szBuffer), "%s + %s", szName, g_ePlayerData[iVictim][ASSISTANT_NAME])
  122.  
  123. if(g_ePlayerData[g_ePlayerData[iVictim][ASSISTANT]][CONNECTED])
  124. {
  125. #if MONEY_FOR_ASSIST > 0
  126. cs_set_user_money(g_ePlayerData[iVictim][ASSISTANT], min(cs_get_user_money(g_ePlayerData[iVictim][ASSISTANT]) + MONEY_FOR_ASSIST, MAXMONEY))
  127. #endif
  128.  
  129. #if defined FRAGS_FOR_ASSIST
  130. set_pev(g_ePlayerData[iVictim][ASSISTANT], pev_frags, float(pev(g_ePlayerData[iVictim][ASSISTANT], pev_frags) + 1))
  131. static iMsgScoreInfo
  132. if(!iMsgScoreInfo) iMsgScoreInfo = get_user_msgid("ScoreInfo")
  133. message_begin(MSG_ALL, iMsgScoreInfo)
  134. write_byte(g_ePlayerData[iVictim][ASSISTANT])
  135. write_short(pev(g_ePlayerData[iVictim][ASSISTANT], pev_frags))
  136. write_short(get_pdata_int(g_ePlayerData[iVictim][ASSISTANT], m_iDeaths, linux_diff_player))
  137. write_short(0)
  138. write_short(g_ePlayerData[g_ePlayerData[iVictim][ASSISTANT]][TEAM])
  139. message_end();
  140. #endif
  141. }
  142. g_ePlayerData[iVictim][ASSISTANT] = 0
  143. set_user_fake_name(iKiller, szBuffer)
  144. EnableHamForward(g_pHamSpawnPost)
  145. return HAM_IGNORED
  146. }
  147.  
  148. public Ham_PlayerKilled_Post(iVictim, iKiller)
  149. {
  150. DisableHamForward(g_pHamSpawnPost)
  151. #if AMXX_VERSION_NUM >= 183 && defined HLTV_FIX
  152. set_task(0.1, "task_resetinfo", iKiller + 64)
  153. #else
  154. reset_user_info(iKiller)
  155. #endif
  156. }
  157.  
  158. #if AMXX_VERSION_NUM >= 183 && defined HLTV_FIX
  159. public task_resetinfo(id) reset_user_info(id - 64)
  160. #endif
  161.  
  162. public Ham_PlayerTakeDamage_Pre(iVictim, iWeapon, iAttacker, Float:fDamage)
  163. {
  164. if(!is_user_valid(iAttacker) || iVictim == iAttacker) return HAM_IGNORED
  165. #if !defined FFA
  166. if(g_ePlayerData[iVictim][TEAM] == g_ePlayerData[iAttacker][TEAM]) return HAM_IGNORED
  167. #endif
  168. g_ePlayerData[iAttacker][DAMAGE_ON][iVictim] += floatround(fDamage)
  169. if(g_ePlayerData[iAttacker][DAMAGE_ON][iVictim] >= (float(g_ePlayerData[iVictim][MAXHEALTH]) * (DAMAGE_FOR_ASSIST.0 / 100.0)) && !g_ePlayerData[iVictim][ASSISTANT])
  170. {
  171. get_user_name(iAttacker, g_ePlayerData[iVictim][ASSISTANT_NAME], 31)
  172. g_ePlayerData[iVictim][ASSISTANT] = iAttacker
  173. }
  174. return HAM_IGNORED
  175. }
  176.  
  177. stock reset_user_info(id)
  178. {
  179. new szUserInfo[256]
  180. copy_infokey_buffer(engfunc(EngFunc_GetInfoKeyBuffer, id), szUserInfo, charsmax(szUserInfo))
  181. #if defined HLTV_FIX
  182. for(new i = 1; i < g_iMaxPlayers; i++)
  183. {
  184. if(!is_user_hltv(i) && g_ePlayerData[i][CONNECTED])
  185. {
  186. message_begin(MSG_ONE, SVC_UPDATEUSERINFO, _, i)
  187. #else
  188. message_begin(MSG_ALL, SVC_UPDATEUSERINFO)
  189. #endif
  190. write_byte(id - 1)
  191. write_long(get_user_userid(id))
  192. write_string(szUserInfo)
  193. write_long(0)
  194. write_long(0)
  195. write_long(0)
  196. write_long(0)
  197. message_end()
  198. #if defined HLTV_FIX
  199. }
  200. }
  201. #endif
  202. }
  203.  
  204. stock set_user_fake_name(const id, const name[])
  205. {
  206. #if defined HLTV_FIX
  207. for(new i = 1; i < g_iMaxPlayers; i++)
  208. {
  209. if(!is_user_hltv(i) && g_ePlayerData[i][CONNECTED])
  210. {
  211. message_begin(MSG_ONE, SVC_UPDATEUSERINFO, _, i)
  212. #else
  213. message_begin(MSG_ALL, SVC_UPDATEUSERINFO)
  214. #endif
  215. write_byte(id - 1)
  216. write_long(get_user_userid(id))
  217. write_char('\')
  218. write_char('n')
  219. write_char('a')
  220. write_char('m')
  221. write_char('e')
  222. write_char('\')
  223. write_string(name)
  224. for(new i; i < 16; i++) write_byte(0)
  225. message_end()
  226. #if defined HLTV_FIX
  227. }
  228. }
  229. #endif
  230. }
  231.  
  232. stock strclip(szString[], iSize, iClip)
  233. {
  234. copy(szString, iClip - 2, szString)
  235. add(szString, iSize, "..")
  236. }
  237.  
  238. #if defined DEBUG
  239. public ClCmd_Assist()
  240. {
  241. new id[3], szArg[64]
  242. for(new i; i < 3; i++)
  243. {
  244. read_argv(i + 1, szArg, charsmax(szArg))
  245. id[i] = str_to_num(szArg)
  246. }
  247. g_ePlayerData[id[2]][ASSISTANT] = id[1]
  248. get_user_name(id[1], g_ePlayerData[id[2]][ASSISTANT_NAME], 31)
  249. ExecuteHamB(Ham_Killed, id[2], id[0], 0)
  250. }
  251. #endif