HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <fakemeta>
  4. #include <hamsandwich>
  5. //PLUGINT FORDÍTOTTA: Imsocrazy
  6.  
  7. #define PLUGIN_VERSION "1.3a"
  8. #define MAX_SNIPERS 30
  9. #define DEFAULT_V "models/v_awp.mdl"
  10. #define DEFAULT_P "models/p_awp.mdl"
  11.  
  12. enum _:Info
  13. {
  14. Name[32],
  15. VModel[128],
  16. PModel[128],
  17. Flag
  18. }
  19.  
  20. new g_eSnipers[MAX_SNIPERS][Info]
  21. new g_iSnipersNum
  22. new g_iSniper[33]
  23. new bool:g_bFirstTime[33]
  24. new g_iSayText
  25. new g_pAtSpawn
  26.  
  27. public plugin_init()
  28. {
  29. register_plugin("AWP Models", PLUGIN_VERSION, "OciXCrom")
  30. register_cvar("CRXAWPModels", PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
  31. register_dictionary("AWPModels.txt")
  32.  
  33. register_event("CurWeapon", "OnSelectAWP", "be", "1=1", "2=18")
  34. RegisterHam(Ham_Spawn, "player", "OnPlayerSpawn", 1)
  35.  
  36. register_clcmd("say /awp", "ShowMenu")
  37. register_clcmd("say_team /awp", "ShowMenu")
  38.  
  39. g_pAtSpawn = register_cvar("am_open_at_spawn", "0")
  40. g_iSayText = get_user_msgid("SayText")
  41. }
  42.  
  43. public plugin_precache()
  44. ReadFile()
  45.  
  46. ReadFile()
  47. {
  48. new szConfigsName[256], szFilename[256]
  49. get_configsdir(szConfigsName, charsmax(szConfigsName))
  50. formatex(szFilename, charsmax(szFilename), "%s/AWPModels.ini", szConfigsName)
  51. new iFilePointer = fopen(szFilename, "rt")
  52.  
  53. if(iFilePointer)
  54. {
  55. new szData[300], szFlag[2]
  56.  
  57. while(!feof(iFilePointer))
  58. {
  59. fgets(iFilePointer, szData, charsmax(szData))
  60. trim(szData)
  61.  
  62. switch(szData[0])
  63. {
  64. case EOS, ';': continue
  65. default:
  66. {
  67. parse(szData, g_eSnipers[g_iSnipersNum][Name], charsmax(g_eSnipers[][Name]), g_eSnipers[g_iSnipersNum][VModel], charsmax(g_eSnipers[][VModel]),
  68. g_eSnipers[g_iSnipersNum][PModel], charsmax(g_eSnipers[][PModel]), szFlag, charsmax(szFlag))
  69.  
  70. if(!is_blank(g_eSnipers[g_iSnipersNum][VModel]))
  71. precache_model(g_eSnipers[g_iSnipersNum][VModel])
  72.  
  73. if(!is_blank(g_eSnipers[g_iSnipersNum][PModel]))
  74. precache_model(g_eSnipers[g_iSnipersNum][PModel])
  75.  
  76. g_eSnipers[g_iSnipersNum][Flag] = is_blank(szFlag) ? ADMIN_ALL : read_flags(szFlag)
  77.  
  78. szFlag[0] = EOS
  79. g_iSnipersNum++
  80. }
  81. }
  82. }
  83.  
  84. fclose(iFilePointer)
  85. }
  86. }
  87.  
  88. public ShowMenu(id)
  89. {
  90. new szTitle[128]
  91. formatex(szTitle, charsmax(szTitle), "%L", id, "AM_MENU_TITLE")
  92.  
  93. new iMenu = menu_create(szTitle, "MenuHandler")
  94.  
  95. for(new iFlags = get_user_flags(id), i; i < g_iSnipersNum; i++)
  96. {
  97. if(g_eSnipers[i][Flag] == ADMIN_ALL || iFlags & g_eSnipers[i][Flag])
  98. menu_additem(iMenu, formatin("%s %s", g_eSnipers[i][Name], g_iSniper[id] == i ? formatin("%L", id, "AM_MENU_SELECTED") : formatin("")))
  99. else
  100. menu_additem(iMenu, formatin("%s %L", g_eSnipers[i][Name], id, "AM_MENU_VIP_ONLY"), .paccess = g_eSnipers[i][Flag])
  101. }
  102.  
  103. if(menu_pages(iMenu) > 1)
  104. menu_setprop(iMenu, MPROP_TITLE, formatin("%s%L", szTitle, id, "AM_MENU_TITLE_PAGE"))
  105.  
  106. menu_display(id, iMenu)
  107. return PLUGIN_HANDLED
  108. }
  109.  
  110. public MenuHandler(id, iMenu, iItem)
  111. {
  112. if(iItem != MENU_EXIT)
  113. {
  114. if(g_iSniper[id] == iItem)
  115. ColorChat(id, "%L", id, "AM_CHAT_ALREADY")
  116. else
  117. {
  118. g_iSniper[id] = iItem
  119.  
  120. if(is_user_alive(id) && get_user_weapon(id) == CSW_AWP)
  121. OnSelectAWP(id)
  122.  
  123. ColorChat(id, "%L", id, "AM_CHAT_SELECTED", g_eSnipers[iItem][Name])
  124. }
  125. }
  126.  
  127. menu_destroy(iMenu)
  128. return PLUGIN_HANDLED
  129. }
  130.  
  131. public client_putinserver(id)
  132. {
  133. g_bFirstTime[id] = true
  134. g_iSniper[id] = 0
  135. }
  136.  
  137. public OnPlayerSpawn(id)
  138. {
  139. if(is_user_alive(id) && get_pcvar_num(g_pAtSpawn) && g_iSniper[id] == 0 && g_bFirstTime[id])
  140. {
  141. g_bFirstTime[id] = false
  142. ShowMenu(id)
  143. }
  144. }
  145.  
  146. public OnSelectAWP(id)
  147. {
  148. if(is_blank(g_eSnipers[g_iSniper[id]][VModel]))
  149. set_pev(id, pev_viewmodel2, DEFAULT_V)
  150. else set_pev(id, pev_viewmodel2, g_eSnipers[g_iSniper[id]][VModel])
  151.  
  152. if(is_blank(g_eSnipers[g_iSniper[id]][PModel]))
  153. set_pev(id, pev_weaponmodel2, DEFAULT_P)
  154. else set_pev(id, pev_weaponmodel2, g_eSnipers[g_iSniper[id]][PModel])
  155. }
  156.  
  157. bool:is_blank(szString[])
  158. return szString[0] == EOS
  159.  
  160. ColorChat(const id, const szInput[], any:...)
  161. {
  162. new iPlayers[32], iCount = 1
  163. static szMessage[191]
  164. vformat(szMessage, charsmax(szMessage), szInput, 3)
  165. format(szMessage[0], charsmax(szMessage), "%L %s", id ? id : LANG_PLAYER, "AM_CHAT_PREFIX", szMessage)
  166.  
  167. replace_all(szMessage, charsmax(szMessage), "!g", "^4")
  168. replace_all(szMessage, charsmax(szMessage), "!n", "^1")
  169. replace_all(szMessage, charsmax(szMessage), "!t", "^3")
  170.  
  171. if(id)
  172. iPlayers[0] = id
  173. else
  174. get_players(iPlayers, iCount, "ch")
  175.  
  176. for(new i; i < iCount; i++)
  177. {
  178. if(is_user_connected(iPlayers[i]))
  179. {
  180. message_begin(MSG_ONE_UNRELIABLE, g_iSayText, _, iPlayers[i])
  181. write_byte(iPlayers[i])
  182. write_string(szMessage)
  183. message_end()
  184. }
  185. }
  186. }
  187.  
  188. #if !defined MAX_FMT_LENTH
  189. #define MAX_FMT_LENGTH 256
  190. #endif
  191.  
  192. #if !defined __vformat_allower
  193. #define __vformat_allower __vformat_allower_
  194.  
  195. __vformat_allower_()
  196. {
  197. vformat("", 0, "", 0)
  198. }
  199. #endif
  200.  
  201. formatin(const format[], any:...)
  202. {
  203. static formatted[MAX_FMT_LENGTH]
  204. #emit PUSH.C 0x2
  205. #emit PUSH.S format
  206. const FORMATTED_CHARSMAX = charsmax(formatted)
  207. #emit PUSH.C FORMATTED_CHARSMAX
  208. #emit LOAD.S.PRI 0x8 // Get size of arguments (count of arguments multiply by sizeof(cell))
  209. #emit ADDR.ALT 0xC // This is the pointer to first argument
  210. #emit ADD // Now in PRI we have the pointer to hidden return argument
  211. #emit LOAD.I // Now in PRI we have the pointer to return buffer
  212. #emit PUSH.PRI
  213. #emit PUSH.C 0x10
  214. #emit SYSREQ.C vformat
  215. #emit STACK 0x14
  216. #emit RETN // Don't execute the code for copy return generated by compiler
  217. __vformat_allower()
  218. return formatted
  219. }