HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <fakemeta>
  3.  
  4. #define PLUGIN "Admin Free Look"
  5. #define VERSION "2.0"
  6. #define AUTHOR "Jim"
  7.  
  8. #define ADMIN_ACCESS ADMIN_BAN //flag "d"
  9.  
  10. #define SPECT_KEYS MENU_KEY_1|MENU_KEY_2|MENU_KEY_5|MENU_KEY_6|MENU_KEY_0
  11. #define CLASS_KEYS MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5
  12.  
  13. #define LINUXDIFF 5
  14.  
  15. #if cellbits == 32
  16. #define OFFSET_TEAM 114
  17. #else
  18. #define OFFSET_TEAM 139
  19. #endif
  20.  
  21. #define TEAM_T 1
  22. #define TEAM_CT 2
  23. #define TEAM_SPEC 3
  24.  
  25. new bool:g_roundend
  26. new bool:g_corpse_made[33]
  27. new bool:g_model_selected[33]
  28. new g_team[33]
  29. new g_maxplayers
  30.  
  31. stock bool:is_admin(id)
  32. return g_team[id] && get_user_flags(id) & ADMIN_ACCESS ? true : false
  33.  
  34. stock bool:is_admin_dead(id)
  35. return is_admin(id) && g_corpse_made[id] ? true : false
  36.  
  37. public plugin_init()
  38. {
  39. register_plugin(PLUGIN, VERSION, AUTHOR)
  40.  
  41. register_event("HLTV", "new_round", "a", "1=0", "2=0")
  42. register_logevent("round_end", 2, "1=Round_End")
  43. register_event("ClCorpse", "hook_corpse", "a", "12>0")
  44. register_event("TeamInfo", "event_teaminfo", "a", "1>0")
  45. register_event("TextMsg", "joined_a_team", "a", "1=1", "2=#Game_join_terrorist", "2=#Game_join_ct")
  46.  
  47. register_clcmd("jointeam", "join_spec_cmd")
  48. register_clcmd("joinclass", "select_a_model")
  49. register_menucmd(register_menuid("IG_Team_Select_Spect",1), SPECT_KEYS, "join_spec_menucmd")
  50. register_menucmd(register_menuid("Terrorist_Select", 1), CLASS_KEYS, "select_a_model")
  51. register_menucmd(register_menuid("CT_Select", 1), CLASS_KEYS, "select_a_model")
  52.  
  53. g_maxplayers = get_maxplayers()
  54. }
  55.  
  56. public client_connect(id)
  57. {
  58. g_team[id] = 0
  59. g_model_selected[id] = false
  60. g_corpse_made[id] = false
  61. }
  62.  
  63. public client_disconnect(id)
  64. {
  65. g_team[id] = 0
  66. g_model_selected[id] = false
  67. g_corpse_made[id] = false
  68. }
  69.  
  70. public event_teaminfo()
  71. {
  72. new id = read_data(1)
  73. new team[2]
  74. read_data(2, team, 1)
  75. switch(team[0])
  76. {
  77. case 'T': g_team[id] = TEAM_T
  78. case 'C': g_team[id] = TEAM_CT
  79. case 'S': g_team[id] = TEAM_SPEC
  80. }
  81. }
  82.  
  83. public stay_spec(id)
  84. {
  85. if(g_team[id] != TEAM_SPEC)
  86. {
  87. g_team[id] = TEAM_SPEC
  88. message_begin(MSG_ALL, get_user_msgid("TeamInfo"))
  89. write_byte(id)
  90. write_string("SPECTATOR")
  91. message_end()
  92. }
  93. }
  94.  
  95. public join_spec_cmd(id)
  96. {
  97. new argv[2]
  98. read_argv(1, argv, 1)
  99. if(argv[0] == '6')
  100. stay_spec(id)
  101. }
  102.  
  103. public join_spec_menucmd(id, key)
  104. {
  105. if(key == 5)
  106. stay_spec(id)
  107. }
  108.  
  109. public joined_a_team()
  110. {
  111. new name[32]
  112. read_data(3, name, 31)
  113. new id = get_user_index(name)
  114. g_model_selected[id] = false
  115. }
  116.  
  117. public select_a_model(id)
  118. {
  119. g_model_selected[id] = true
  120. if(!g_roundend && is_admin(id))
  121. set_task(1.0, "delay", id)
  122. }
  123.  
  124. public delay(id)
  125. {
  126. if(g_team[id] && !is_user_alive(id))
  127. {
  128. g_corpse_made[id] = true
  129. free_look(id)
  130. }
  131. }
  132.  
  133. public hook_corpse()
  134. {
  135. new id = read_data(12)
  136. g_corpse_made[id] = true
  137. if(!g_roundend && is_admin(id))
  138. free_look(id)
  139. }
  140.  
  141. public free_look(id)
  142. {
  143. if(!g_roundend && is_admin_dead(id) && g_model_selected[id])
  144. set_pdata_int(id, OFFSET_TEAM, TEAM_SPEC, LINUXDIFF)
  145. }
  146.  
  147. public round_end()
  148. {
  149. g_roundend = true
  150. freelook_over()
  151. }
  152.  
  153. public new_round()
  154. {
  155. g_roundend = false
  156. freelook_over()
  157. }
  158.  
  159. public freelook_over()
  160. {
  161. for(new id = 1; id <= g_maxplayers; id++)
  162. {
  163. if(is_admin_dead(id) && get_pdata_int(id, OFFSET_TEAM, LINUXDIFF) == TEAM_SPEC && g_team[id] != TEAM_SPEC)
  164. set_pdata_int(id, OFFSET_TEAM, g_team[id], LINUXDIFF)
  165. g_corpse_made[id] = false
  166. }
  167. }