HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. /* Copyright Š 2008, ConnorMcLeod
  2.  
  3. Free For All is free software;
  4. you can redistribute it and/or modify it under the terms of the
  5. GNU General Public License as published by the Free Software Foundation.
  6.  
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11.  
  12. You should have received a copy of the GNU General Public License
  13. along with Free For All; if not, write to the
  14. Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  15. Boston, MA 02111-1307, USA.
  16. */
  17.  
  18. /*
  19. v0.0.6
  20. - Disable Forwards and registered message when plugin is disabled
  21. v0.0.5
  22. - Recursion should be fixed for all Ham forwards
  23. - Removed Cvar, new command instead
  24. - Hide Radar
  25. v0.0.4
  26. - Fixed HamKilled possible loop when a player kills himself
  27. v0.0.3
  28. - Removed useless vars
  29. v0.0.2
  30. - Block Radar
  31. v0.0.1
  32. - First shot
  33. */
  34.  
  35. #include <amxmodx>
  36. #include <fakemeta>
  37. #include <hamsandwich>
  38.  
  39. #define PLUGIN "Free For All"
  40. #define AUTHOR "ConnorMcLeod"
  41. #define VERSION "1.0"
  42.  
  43. #define OFFSET_TEAM 114
  44. #define fm_get_user_team(%1) get_pdata_int(%1,OFFSET_TEAM)
  45. #define fm_set_user_team(%1,%2) set_pdata_int(%1,OFFSET_TEAM,%2)
  46.  
  47. new gmsgRadar
  48. new g_iMaxPlayers
  49. new mp_friendlyfire, g_iOldFFVal
  50. new HamHook:g_hTraceAttack, HamHook:g_hTakeDamage, HamHook:g_hKilled, g_mRadarHook
  51. new bool:g_bFFA
  52.  
  53. public plugin_init()
  54. {
  55. register_plugin( PLUGIN, VERSION, AUTHOR )
  56.  
  57. register_concmd("amx_set_ffa", "AdminCommand_SetFFA", ADMIN_CFG)
  58. register_clcmd("drawradar", "ClientCommand_DrawRadar") // not sure this is hookable but anyway Radar Msg is bloqued as well
  59.  
  60. g_iMaxPlayers = get_maxplayers()
  61. mp_friendlyfire = get_cvar_pointer("mp_friendlyfire")
  62. g_iOldFFVal = get_pcvar_num(mp_friendlyfire)
  63. gmsgRadar = get_user_msgid("Radar")
  64. }
  65.  
  66. public AdminCommand_SetFFA(id, level)
  67. {
  68. if( !(get_user_flags(id) & level) )
  69. {
  70. return PLUGIN_HANDLED
  71. }
  72.  
  73. if( read_argc() < 2 )
  74. {
  75. if( id )
  76. {
  77. client_print(id, print_console, "Hasznalat: amx_set_ffa <0|1>" )
  78. }
  79. else
  80. {
  81. server_print( "Hasznalat: amx_set_ffa <0|1>" )
  82. }
  83. }
  84. else
  85. {
  86. new szArg[3]
  87. read_argv(1, szArg, charsmax(szArg))
  88. if( g_bFFA && (szArg[0] == '0' || szArg[1] == 'f' || szArg[1] == 'F') )
  89. {
  90. set_pcvar_num(mp_friendlyfire, g_iOldFFVal)
  91. client_cmd(0, "drawradar")
  92. Register_Forwards((g_bFFA=false))
  93. }
  94. else if( !g_bFFA && (szArg[0] == '1' || szArg[1] == 'n' || szArg[1] == 'N') )
  95. {
  96. g_iOldFFVal = get_pcvar_num(mp_friendlyfire)
  97. set_pcvar_num(mp_friendlyfire, 1)
  98. client_cmd(0, "hideradar")
  99. Register_Forwards((g_bFFA=true))
  100. }
  101. }
  102.  
  103. if( id )
  104. {
  105. client_print(id, print_console, "FFA mod %s", g_bFFA ? "Bekapcsolva" : "Kikapcsolva" )
  106. }
  107. else
  108. {
  109. server_print( "FFA mod %s", g_bFFA ? "Bekapcsolva" : "Kikapcsolva" )
  110. }
  111. return PLUGIN_HANDLED
  112. }
  113.  
  114. public client_connect(id)
  115. {
  116. if( g_bFFA )
  117. {
  118. client_cmd(id, "hideradar")
  119. }
  120. }
  121.  
  122. public TraceAttack(victim, attacker, Float:damage, Float:direction[3], tracehandle, damagebits)
  123. {
  124. if( victim != attacker && (1 <= attacker <= g_iMaxPlayers) )
  125. {
  126. new vteam = fm_get_user_team(victim)
  127. if( vteam == fm_get_user_team(attacker) )
  128. {
  129. fm_set_user_team(victim, vteam == 1 ? 2 : 1)
  130. ExecuteHamB(Ham_TraceAttack, victim, attacker, damage, direction, tracehandle, damagebits)
  131. fm_set_user_team(victim, vteam)
  132. return HAM_SUPERCEDE
  133. }
  134. }
  135. return HAM_IGNORED
  136. }
  137.  
  138. public TakeDamage(victim, idinflictor, attacker, Float:damage, damagebits)
  139. {
  140. if( victim != attacker && (1 <= attacker <= g_iMaxPlayers) )
  141. {
  142. new vteam = fm_get_user_team(victim)
  143. if( vteam == fm_get_user_team(attacker) )
  144. {
  145. fm_set_user_team(victim, vteam == 1 ? 2 : 1)
  146. ExecuteHamB(Ham_TakeDamage, victim, idinflictor, attacker, damage, damagebits)
  147. fm_set_user_team(victim, vteam)
  148. return HAM_SUPERCEDE
  149. }
  150. }
  151. return HAM_IGNORED
  152. }
  153.  
  154. public Killed(victim, attacker, shouldgib)
  155. {
  156. if( victim != attacker && (1 <= attacker <= g_iMaxPlayers) )
  157. {
  158. new vteam = fm_get_user_team(victim)
  159. if( vteam == fm_get_user_team(attacker) )
  160. {
  161. fm_set_user_team(victim, vteam == 1 ? 2 : 1)
  162. ExecuteHamB(Ham_Killed, victim, attacker, shouldgib)
  163. fm_set_user_team(victim, vteam)
  164. return HAM_SUPERCEDE
  165. }
  166. }
  167. return HAM_IGNORED
  168. }
  169.  
  170. public Message_Radar(iMsgId, MSG_DEST, id)
  171. {
  172. return PLUGIN_HANDLED
  173. }
  174.  
  175. public ClientCommand_DrawRadar(id)
  176. {
  177. return _:g_bFFA
  178. }
  179.  
  180. Register_Forwards(bool:bState)
  181. {
  182. if(bState)
  183. {
  184. if( g_hTraceAttack )
  185. {
  186. EnableHamForward( g_hTraceAttack )
  187. }
  188. else
  189. {
  190. g_hTraceAttack = RegisterHam(Ham_TraceAttack, "player", "TraceAttack")
  191. }
  192.  
  193. if( g_hTakeDamage )
  194. {
  195. EnableHamForward( g_hTakeDamage )
  196. }
  197. else
  198. {
  199. g_hTakeDamage = RegisterHam(Ham_TakeDamage, "player", "TakeDamage")
  200. }
  201.  
  202. if( g_hKilled )
  203. {
  204. EnableHamForward( g_hKilled )
  205. }
  206. else
  207. {
  208. g_hKilled = RegisterHam(Ham_Killed, "player", "Killed")
  209. }
  210.  
  211. if( !g_mRadarHook )
  212. {
  213. g_mRadarHook = register_message( gmsgRadar, "Message_Radar")
  214. }
  215. }
  216. else
  217. {
  218. if( g_hTraceAttack )
  219. {
  220. DisableHamForward( g_hTraceAttack )
  221. }
  222.  
  223. if( g_hTakeDamage )
  224. {
  225. DisableHamForward( g_hTakeDamage )
  226. }
  227.  
  228. if( g_hKilled )
  229. {
  230. DisableHamForward( g_hKilled )
  231. }
  232.  
  233. if( g_mRadarHook )
  234. {
  235. unregister_message(gmsgRadar, g_mRadarHook)
  236. g_mRadarHook = 0
  237. }
  238. }
  239. }