HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. /* Formatright © 2009, ConnorMcLeod
  2.  
  3. Migraine 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 Migraine; if not, write to the
  14. Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  15. Boston, MA 02111-1307, USA.
  16. */
  17.  
  18. #include amxmodx
  19. #include amxmisc
  20. #include cstrike
  21. #include fakemeta
  22. #include hamsandwich
  23.  
  24. #define VERSION "0.0.5"
  25.  
  26. #define MAX_PLAYERS 32
  27.  
  28. #define SetUserReversed(%1) g_bMigraineux |= 1<<(%1 & 31)
  29. #define ClearUserReversed(%1) g_bMigraineux &= ~( 1<<(%1 & 31) )
  30. #define HasUserMigraine(%1) g_bMigraineux & 1<<(%1 & 31)
  31.  
  32. enum _:GlobalState {None, Terrorists, Cts, All}
  33.  
  34. new g_bMigraineux
  35.  
  36. new Float:g_vecPunchAngles[MAX_PLAYERS+1][3]
  37. new g_iFfPlayerPreThink
  38. new g_iGlobalState
  39.  
  40. public plugin_init()
  41. {
  42. register_plugin("Migraine", VERSION, "ConnorMcLeod")
  43.  
  44. RegisterHam(Ham_Spawn, "player", "Player_Spawn_Post", 1)
  45.  
  46. register_concmd("amx_migraine", "AdminCommand_Migraine", ADMIN_LEVEL_A, "- < name/@CT/@TE/@ALL > < 0/1 >")
  47. }
  48.  
  49. public client_putinserver( id )
  50. {
  51. ClearUserReversed(id)
  52. CheckForward()
  53. }
  54.  
  55. public client_disconnect( id )
  56. {
  57. ClearUserReversed(id)
  58. CheckForward()
  59. }
  60.  
  61. public Player_Spawn_Post( id )
  62. {
  63. if( is_user_alive(id) )
  64. {
  65. switch( g_iGlobalState )
  66. {
  67. case Terrorists, Cts:
  68. {
  69. if( g_iGlobalState == _:cs_get_user_team(id) )
  70. {
  71. SetUserReversed(id)
  72. }
  73. else
  74. {
  75. ClearUserReversed(id)
  76. CheckForward()
  77. }
  78. }
  79. case All:
  80. {
  81. SetUserReversed(id)
  82. CheckForward()
  83. }
  84. }
  85. }
  86. }
  87.  
  88. public AdminCommand_Migraine(id, level, cid)
  89. {
  90. if( cmd_access(id, level, cid, 3) )
  91. {
  92. new szTarget[32], szOnOff[2], iPlayer, iOnOff
  93. read_argv(1, szTarget, charsmax(szTarget))
  94. read_argv(2, szOnOff, charsmax(szOnOff))
  95.  
  96. switch( szOnOff[0] )
  97. {
  98. case '0':
  99. {
  100. iOnOff = 0
  101. }
  102. case '1':
  103. {
  104. iOnOff = 1
  105. }
  106. default:
  107. {
  108. return PLUGIN_HANDLED
  109. }
  110. }
  111.  
  112. if( szTarget[0] == '@' )
  113. {
  114. if( !iOnOff )
  115. {
  116. g_bMigraineux = 0
  117. g_iGlobalState = None
  118. CheckForward()
  119. for(new i; i<sizeof(g_vecPunchAngles); i++)
  120. {
  121. g_vecPunchAngles[iPlayer][0] = 0.0
  122. g_vecPunchAngles[iPlayer][1] = 0.0
  123. }
  124. return PLUGIN_HANDLED
  125. }
  126.  
  127. new iPlayers[MAX_PLAYERS], iNum
  128. get_players(iPlayers, iNum)
  129. for(new i; i<iNum; i++)
  130. {
  131. iPlayer = iPlayers[i]
  132. switch( szTarget[1] )
  133. {
  134. case 'a','A':
  135. {
  136. g_iGlobalState = All
  137. SetUserReversed(iPlayer)
  138. }
  139. case 't', 'T':
  140. {
  141. g_iGlobalState = Terrorists
  142.  
  143. if( cs_get_user_team(iPlayer) == CS_TEAM_T )
  144. {
  145. SetUserReversed(iPlayer)
  146. }
  147. else
  148. {
  149. ClearUserReversed(iPlayer)
  150. }
  151. }
  152. case 'c', 'C':
  153. {
  154. g_iGlobalState = Cts
  155.  
  156. if( cs_get_user_team(iPlayer) == CS_TEAM_CT )
  157. {
  158. SetUserReversed(iPlayer)
  159. }
  160. else
  161. {
  162. ClearUserReversed(iPlayer)
  163. }
  164. }
  165. default:
  166. {
  167. return PLUGIN_HANDLED
  168. }
  169. }
  170. g_vecPunchAngles[iPlayer][0] = 0.0
  171. g_vecPunchAngles[iPlayer][1] = 0.0
  172. }
  173. }
  174. else
  175. {
  176. iPlayer = cmd_target(id, szTarget, CMDTARGET_OBEY_IMMUNITY|CMDTARGET_ALLOW_SELF)
  177. if( iPlayer )
  178. {
  179. if( iOnOff )
  180. {
  181. SetUserReversed(iPlayer)
  182. }
  183. else
  184. {
  185. ClearUserReversed(iPlayer)
  186. }
  187. g_vecPunchAngles[iPlayer][0] = 0.0
  188. g_vecPunchAngles[iPlayer][1] = 0.0
  189. }
  190. }
  191. CheckForward()
  192. }
  193. return PLUGIN_HANDLED
  194. }
  195.  
  196. public PlayerPreThink( id )
  197. {
  198. if(HasUserMigraine(id) && is_user_alive(id))
  199. {
  200. if( g_vecPunchAngles[id][1] < 180.0 )
  201. {
  202. g_vecPunchAngles[id][1] += 2.0
  203. g_vecPunchAngles[id][0] = g_vecPunchAngles[id][1] * 2.0
  204. }
  205. else
  206. {
  207. g_vecPunchAngles[id][0] = 0.0
  208. }
  209.  
  210. static Float:vecPunchAngle[3]
  211. vecPunchAngle[0] = g_vecPunchAngles[id][0]
  212. vecPunchAngle[1] = g_vecPunchAngles[id][0]
  213. vecPunchAngle[2] = g_vecPunchAngles[id][1]
  214.  
  215. set_pev(id, pev_punchangle, vecPunchAngle)
  216. }
  217. }
  218.  
  219. CheckForward()
  220. {
  221. if( !g_bMigraineux != !g_iFfPlayerPreThink )
  222. {
  223. if( g_bMigraineux )
  224. {
  225. g_iFfPlayerPreThink = register_forward(FM_PlayerPreThink, "PlayerPreThink")
  226. }
  227. else
  228. {
  229. unregister_forward(FM_PlayerPreThink, g_iFfPlayerPreThink)
  230. g_iFfPlayerPreThink = 0
  231. }
  232. }
  233. }