Advertisement
Guest User

Untitled

a guest
Dec 4th, 2022
39
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.34 KB | None | 0 0
  1. /* --------------------------------------------------------------------------
  2. Kill assist (for CS) v1.2b
  3. by Digi (a.k.a. Hunter-Digital)
  4. www.thehunters.ro
  5. -----------------------------------------------------------------
  6.  
  7. Description:
  8.  
  9. When a player gets killed, this plugin checks if another player, from the same team,
  10. did enough damage to the victim so that he could be an accomplice to the kill and
  11. the assister will also receive a frag
  12. (all of these are cvar controlled)
  13.  
  14.  
  15. CVars and default values:
  16.  
  17. - amx_killassist_enable 0/1/2 (default: 1)
  18. Enable modes: 0 = Disable / 1 = Enable with DeathMsg / 2 = Enable with HUD message
  19.  
  20. - amx_killassist_mindamage 1-9999 (default: 50)
  21. Minimum amount of damage to deal to be nominated for an assisted kill
  22.  
  23. - amx_killassist_givefrags 0/1 (default: 1)
  24. Give or not give the assister frags
  25.  
  26. - amx_killassist_givemoney 0-16000 (default: 300)
  27. Give or not give the assister some money, 0 disables, 1 or more sets how much money
  28.  
  29. - amx_killassist_onlyalive 0/1 (default: 0)
  30. Only alive players can be of assistance in killing other players
  31.  
  32.  
  33. Credits and thanks:
  34.  
  35. - ConnorMcLeod - for helping with quick name changing
  36. - arkshine - for helping with name squeeze
  37. - joaquimandrade - code improvements
  38. - anakin_cstrike - code improvements
  39. - Nextra - more code improvements
  40. - ajvn - some ideas
  41. - Dores - and more code improvements
  42. - frearmer - hud message sugestion
  43.  
  44.  
  45. Changelog:
  46.  
  47. v1.2b - modified public variable to "killassist_version" and fixed deathmsg not showing when you suicide with worldspawn or an entity
  48. v1.2 - added no-name-changing support, prints HUD message, to activate, set enabled to 2
  49. v1.1b - simplified cvar checking using clamp()
  50. v1.1 - converted to CS only, new cvars: amx_killassist_onlyalive, amx_killassist_givemoney, enriched cvar handling, added team cache and fixed some bugs
  51. v1.0d - Removed useless stuff xD, added pcvar on amx_mode and used formatex()
  52. v1.0c - Some modifications and added g_bOnline
  53. v1.0b - Fixed admin name bug
  54. v1.0 - Release
  55.  
  56. -------------------------------------------------------------- */
  57.  
  58. /* Feel free to modify these HUD message values */
  59.  
  60. #define HUD_colorR 255 // default: 255
  61. #define HUD_colorG 155 // default: 155
  62. #define HUD_colorB 0 // default: 0
  63. #define HUD_posX 0.6 // default: 0.6
  64. #define HUD_posY 0.2 // default: 0.2
  65. #define HUD_fx 0 // default: 0
  66. #define HUD_fxTime 0.0 // default: 0.0
  67. #define HUD_holdTime 1.0 // default: 1.0
  68. #define HUD_fadeInTime 0.3 // default: 0.3
  69. #define HUD_fadeOutTime 2.0 // default: 2.0
  70. #define HUD_channel -1 // default: -1
  71.  
  72. /* -------------------------------------------------------------------------
  73. Nothing to edit below this point */
  74.  
  75. #include <amxmodx>
  76. #include <hamsandwich>
  77. #include <cstrike>
  78. #include <engine>
  79. #include <fun>
  80.  
  81. #define PLUGIN_TITLE "Kill assist (for CS)"
  82. #define PLUGIN_VERSION "1.2b"
  83. #define PLUGIN_AUTHOR "Digi (www.thehunters.ro)"
  84. #define PLUGIN_PUBLICVAR "killassist_version"
  85.  
  86. #define MAXPLAYERS 32 + 1
  87.  
  88. #define TEAM_NONE 0
  89. #define TEAM_TE 1
  90. #define TEAM_CT 2
  91. #define TEAM_SPEC 3
  92.  
  93. #define is_player(%1) (1 <= %1 <= g_iMaxPlayers)
  94.  
  95. new msgID_sayText
  96. new msgID_deathMsg
  97. new msgID_scoreInfo
  98. new msgID_money
  99.  
  100. new pCVar_amxMode
  101.  
  102. new pCVar_enabled
  103. new pCVar_minDamage
  104. new pCVar_giveFrags
  105. new pCVar_giveMoney
  106. new pCVar_onlyAlive
  107.  
  108. new ch_pCVar_enabled
  109. new ch_pCVar_minDamage
  110. new ch_pCVar_giveFrags
  111. new ch_pCVar_giveMoney
  112. new ch_pCVar_onlyAlive
  113.  
  114. new g_szName[MAXPLAYERS][32]
  115. new g_iTeam[MAXPLAYERS]
  116. new g_iDamage[MAXPLAYERS][MAXPLAYERS]
  117. new bool:g_bAlive[MAXPLAYERS] = {false, ...}
  118. new bool:g_bOnline[MAXPLAYERS] = {false, ...}
  119.  
  120. new g_iLastAmxMode
  121. new g_iMaxPlayers = 0
  122. new bool:g_bAmxModeExists = false
  123.  
  124. public plugin_init()
  125. {
  126. register_plugin(PLUGIN_TITLE, PLUGIN_VERSION, PLUGIN_AUTHOR)
  127. register_cvar(PLUGIN_PUBLICVAR, PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY)
  128.  
  129. pCVar_enabled = register_cvar("amx_killassist_enabled", "1")
  130. pCVar_minDamage = register_cvar("amx_killassist_mindamage", "50")
  131. pCVar_giveFrags = register_cvar("amx_killassist_givefrags", "1")
  132. pCVar_giveMoney = register_cvar("amx_killassist_givemoney", "300")
  133. pCVar_onlyAlive = register_cvar("amx_killassist_onlyalive", "0")
  134.  
  135. if(cvar_exists("amx_mode"))
  136. {
  137. pCVar_amxMode = get_cvar_pointer("amx_mode")
  138.  
  139. g_bAmxModeExists = true
  140. }
  141.  
  142. msgID_money = get_user_msgid("Money")
  143. msgID_sayText = get_user_msgid("SayText")
  144. msgID_deathMsg = get_user_msgid("DeathMsg")
  145. msgID_scoreInfo = get_user_msgid("ScoreInfo")
  146.  
  147. register_message(msgID_deathMsg, "msg_deathMsg")
  148.  
  149. register_logevent("event_roundStart", 2, "1=Round_Start")
  150.  
  151. register_event("Damage", "player_damage", "be", "2!0", "3=0", "4!0")
  152. register_event("DeathMsg", "player_die", "ae")
  153. register_event("TeamInfo", "player_joinTeam", "a")
  154.  
  155. RegisterHam(Ham_Spawn, "player", "player_spawn", 1)
  156.  
  157. g_iMaxPlayers = get_maxplayers()
  158. }
  159.  
  160. public plugin_cfg() event_roundStart()
  161.  
  162. public event_roundStart()
  163. {
  164. ch_pCVar_enabled = clamp(get_pcvar_num(pCVar_enabled), 0, 2)
  165. ch_pCVar_minDamage = clamp(get_pcvar_num(pCVar_minDamage), 0, 9999)
  166. ch_pCVar_giveFrags = clamp(get_pcvar_num(pCVar_giveFrags), 0, 1)
  167. ch_pCVar_giveMoney = clamp(get_pcvar_num(pCVar_giveMoney), 0, 16000)
  168. ch_pCVar_onlyAlive = clamp(get_pcvar_num(pCVar_onlyAlive), 0, 1)
  169. }
  170.  
  171. public client_putinserver(iPlayer)
  172. {
  173. g_bOnline[iPlayer] = true
  174.  
  175. get_user_name(iPlayer, g_szName[iPlayer], 31)
  176. }
  177.  
  178. public client_disconnected(iPlayer)
  179. {
  180. g_iTeam[iPlayer] = TEAM_NONE
  181. g_bAlive[iPlayer] = false
  182. g_bOnline[iPlayer] = false
  183. }
  184.  
  185. public player_joinTeam()
  186. {
  187. new iPlayer, szTeam[2]
  188.  
  189. iPlayer = read_data(1)
  190. read_data(2, szTeam, 1)
  191.  
  192. switch(szTeam[0])
  193. {
  194. case 'T': g_iTeam[iPlayer] = TEAM_TE
  195. case 'C': g_iTeam[iPlayer] = TEAM_CT
  196. default: g_iTeam[iPlayer] = TEAM_SPEC // since you can't transfer yourself to unassigned team...
  197. }
  198.  
  199. return PLUGIN_CONTINUE
  200. }
  201.  
  202. public player_spawn(iPlayer)
  203. {
  204. if(!is_user_alive(iPlayer))
  205. return HAM_IGNORED
  206.  
  207. g_bAlive[iPlayer] = true // he's alive !
  208.  
  209. new szName[32]
  210.  
  211. get_user_name(iPlayer, szName, 31)
  212.  
  213. if(!equali(szName, g_szName[iPlayer])) // make sure he has his name !
  214. {
  215. set_msg_block(msgID_sayText, BLOCK_ONCE)
  216. set_user_info(iPlayer, "name", g_szName[iPlayer])
  217. }
  218.  
  219. // reset damage meters
  220.  
  221. for(new p = 1; p <= g_iMaxPlayers; p++)
  222. g_iDamage[iPlayer][p] = 0
  223.  
  224. return HAM_IGNORED
  225. }
  226.  
  227. public player_damage(iVictim)
  228. {
  229. if(!ch_pCVar_enabled || !is_player(iVictim))
  230. return PLUGIN_CONTINUE
  231.  
  232. new iAttacker = get_user_attacker(iVictim)
  233.  
  234. if(!is_player(iAttacker))
  235. return PLUGIN_CONTINUE
  236.  
  237. g_iDamage[iAttacker][iVictim] += read_data(2)
  238.  
  239. return PLUGIN_CONTINUE
  240. }
  241.  
  242. public player_die()
  243. {
  244. if(!ch_pCVar_enabled)
  245. return PLUGIN_CONTINUE
  246.  
  247. new iVictim = read_data(2)
  248. new iKiller = read_data(1)
  249. new iHS = read_data(3)
  250. new szWeapon[24]
  251. read_data(4, szWeapon, 23)
  252.  
  253. if(!is_player(iVictim))
  254. {
  255. do_deathmsg(iKiller, iVictim, iHS, szWeapon)
  256.  
  257. return PLUGIN_CONTINUE
  258. }
  259.  
  260. g_bAlive[iVictim] = false
  261.  
  262. if(!is_player(iKiller))
  263. {
  264. do_deathmsg(iKiller, iVictim, iHS, szWeapon)
  265.  
  266. return PLUGIN_CONTINUE
  267. }
  268.  
  269. new iKillerTeam = g_iTeam[iKiller]
  270.  
  271. if(iKiller != iVictim && g_iTeam[iVictim] != iKillerTeam)
  272. {
  273. new iKiller2 = 0
  274. new iDamage2 = 0
  275.  
  276. for(new p = 1; p <= g_iMaxPlayers; p++)
  277. {
  278. if(p != iKiller && g_bOnline[p] && (ch_pCVar_onlyAlive && g_bAlive[p] || !ch_pCVar_onlyAlive) && iKillerTeam == g_iTeam[p] && g_iDamage[p][iVictim] >= ch_pCVar_minDamage && g_iDamage[p][iVictim] > iDamage2)
  279. {
  280. iKiller2 = p
  281. iDamage2 = g_iDamage[p][iVictim]
  282. }
  283.  
  284. g_iDamage[p][iVictim] = 0
  285. }
  286.  
  287. if(iKiller2 > 0 && iDamage2 > ch_pCVar_minDamage)
  288. {
  289. if(ch_pCVar_giveFrags)
  290. {
  291. new iFrags = get_user_frags(iKiller2)+1
  292.  
  293. set_user_frags(iKiller2, iFrags)
  294.  
  295. message_begin(MSG_ALL, msgID_scoreInfo)
  296. write_byte(iKiller2)
  297. write_short(iFrags)
  298. write_short(get_user_deaths(iKiller2))
  299. write_short(0)
  300. write_short(iKillerTeam)
  301. message_end()
  302. }
  303.  
  304. if(ch_pCVar_giveMoney)
  305. {
  306. new iMoney = cs_get_user_money(iKiller2) + ch_pCVar_giveMoney
  307.  
  308. if(iMoney > 16000)
  309. iMoney = 16000
  310.  
  311. cs_set_user_money(iKiller2, iMoney)
  312.  
  313. if(g_bAlive[iKiller2]) // no reason to send a money message when the player has no hud :}
  314. {
  315. message_begin(MSG_ONE_UNRELIABLE, msgID_money, _, iKiller2)
  316. write_long(iMoney)
  317. write_byte(1)
  318. message_end()
  319. }
  320. }
  321.  
  322. if(ch_pCVar_enabled == 2)
  323. {
  324. new szName1[32], szName2[32], szName3[32], szMsg[128]
  325.  
  326. get_user_name(iKiller, szName1, 31)
  327. get_user_name(iKiller2, szName2, 31)
  328. get_user_name(iVictim, szName3, 31)
  329.  
  330. formatex(szMsg, 63, "%s killed %s assisted by %s", szName1, szName3, szName2)
  331.  
  332. set_hudmessage(HUD_colorR, HUD_colorG, HUD_colorB, HUD_posX, HUD_posY, HUD_fx, HUD_fxTime, HUD_holdTime, HUD_fadeInTime, HUD_fadeOutTime, HUD_channel)
  333. show_hudmessage(0, szMsg)
  334. }
  335. else
  336. {
  337. new szName1[32], iName1Len, szName2[32], iName2Len, szNames[32], szWeaponLong[32]
  338.  
  339. iName1Len = get_user_name(iKiller, szName1, 31)
  340. iName2Len = get_user_name(iKiller2, szName2, 31)
  341.  
  342. g_szName[iKiller] = szName1
  343.  
  344. if(iName1Len < 14)
  345. {
  346. formatex(szName1, iName1Len, "%s", szName1)
  347. formatex(szName2, 28-iName1Len, "%s", szName2)
  348. }
  349. else if(iName2Len < 14)
  350. {
  351. formatex(szName1, 28-iName2Len, "%s", szName1)
  352. formatex(szName2, iName2Len, "%s", szName2)
  353. }
  354. else
  355. {
  356. formatex(szName1, 13, "%s", szName1)
  357. formatex(szName2, 13, "%s", szName2)
  358. }
  359.  
  360. formatex(szNames, 31, "%s + %s", szName1, szName2)
  361.  
  362. set_msg_block(msgID_sayText, BLOCK_ONCE)
  363. set_user_info(iKiller, "name", szNames)
  364.  
  365. if(g_bAmxModeExists)
  366. {
  367. g_iLastAmxMode = get_pcvar_num(pCVar_amxMode)
  368.  
  369. set_pcvar_num(pCVar_amxMode, 0)
  370. }
  371.  
  372. if(equali(szWeapon, "grenade"))
  373. szWeaponLong = "weapon_hegrenade"
  374. else
  375. formatex(szWeaponLong, 31, "weapon_%s", szWeapon)
  376.  
  377. new args[4]
  378.  
  379. args[0] = iVictim
  380. args[1] = iKiller
  381. args[2] = iHS
  382. args[3] = get_weaponid(szWeaponLong)
  383.  
  384. set_task(0.1, "player_diePost", 0, args, 4)
  385. }
  386. }
  387. else if(ch_pCVar_enabled == 1)
  388. do_deathmsg(iKiller, iVictim, iHS, szWeapon)
  389. }
  390. else if(ch_pCVar_enabled == 1)
  391. do_deathmsg(iVictim, iVictim, iHS, szWeapon)
  392.  
  393. return PLUGIN_CONTINUE
  394. }
  395.  
  396. public player_diePost(arg[])
  397. {
  398. new szWeapon[24]
  399. new iKiller = arg[1]
  400.  
  401. get_weaponname(arg[3], szWeapon, 23)
  402. replace(szWeapon, 23, "weapon_", "")
  403.  
  404. do_deathmsg(iKiller, arg[0], arg[2], szWeapon)
  405.  
  406. set_msg_block(msgID_sayText, BLOCK_ONCE)
  407. set_user_info(iKiller, "name", g_szName[iKiller])
  408.  
  409. if(g_bAmxModeExists)
  410. set_pcvar_num(pCVar_amxMode, g_iLastAmxMode)
  411.  
  412. return PLUGIN_CONTINUE
  413. }
  414.  
  415. public msg_deathMsg()
  416. return ch_pCVar_enabled == 1 ? PLUGIN_HANDLED : PLUGIN_CONTINUE
  417.  
  418. /* originally from messages_stocks.inc, but simplified */
  419.  
  420. stock do_deathmsg(iKiller, iVictim, iHS, const szWeapon[])
  421. {
  422. message_begin(MSG_ALL, msgID_deathMsg)
  423. write_byte(iKiller)
  424. write_byte(iVictim)
  425. write_byte(iHS)
  426. write_string(szWeapon)
  427. message_end()
  428. }
  429.  
  430. /* --------------------------------------------------------------------------
  431. EOF
  432. -------------------------------------------------------------- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement