HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. /* Formatright © 2009, ConnorMcLeod
  2.  
  3. Players Models 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 Players Models; if not, write to the
  14. Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  15. Boston, MA 02111-1307, USA.
  16. */
  17.  
  18. // #define SET_MODELINDEX
  19.  
  20. #include <amxmodx>
  21. #include <fakemeta>
  22.  
  23. #pragma semicolon 1
  24.  
  25. #define VERSION "1.3.0"
  26.  
  27. #define SetUserModeled(%1) g_bModeled |= 1<<(%1 & 31)
  28. #define SetUserNotModeled(%1) g_bModeled &= ~( 1<<(%1 & 31) )
  29. #define IsUserModeled(%1) ( g_bModeled & 1<<(%1 & 31) )
  30.  
  31. #define SetUserConnected(%1) g_bConnected |= 1<<(%1 & 31)
  32. #define SetUserNotConnected(%1) g_bConnected &= ~( 1<<(%1 & 31) )
  33. #define IsUserConnected(%1) ( g_bConnected & 1<<(%1 & 31) )
  34.  
  35. #define MAX_MODEL_LENGTH 16
  36. #define MAX_AUTHID_LENGTH 25
  37.  
  38. #define MAX_PLAYERS 32
  39.  
  40. #define ClCorpse_ModelName 1
  41. #define ClCorpse_PlayerID 12
  42.  
  43. #define m_iTeam 114
  44. #define g_ulModelIndexPlayer 491
  45. #define fm_cs_get_user_team_index(%1) get_pdata_int(%1, m_iTeam)
  46.  
  47. new const MODEL[] = "model";
  48. new g_bModeled;
  49. new g_szCurrentModel[MAX_PLAYERS+1][MAX_MODEL_LENGTH];
  50.  
  51. new Trie:g_tTeamModels[2];
  52. new Trie:g_tModelIndexes;
  53. new Trie:g_tDefaultModels;
  54.  
  55. new g_szAuthid[MAX_PLAYERS+1][MAX_AUTHID_LENGTH];
  56. new g_bPersonalModel[MAX_PLAYERS+1];
  57.  
  58. new g_bConnected;
  59.  
  60. public plugin_init()
  61. {
  62. register_plugin("Players Models", VERSION, "ConnorMcLeod");
  63.  
  64. register_forward(FM_SetClientKeyValue, "SetClientKeyValue");
  65. register_message(get_user_msgid("ClCorpse"), "Message_ClCorpse");
  66. }
  67.  
  68. public plugin_precache()
  69. {
  70. new szConfigFile[128];
  71. get_localinfo("amxx_configsdir", szConfigFile, charsmax(szConfigFile));
  72. format(szConfigFile, charsmax(szConfigFile), "%s/players_models.ini", szConfigFile);
  73.  
  74. new iFile = fopen(szConfigFile, "rt");
  75. if( iFile )
  76. {
  77. new const szDefaultModels[][] = {"", "urban", "terror", "leet", "arctic", "gsg9",
  78. "gign", "sas", "guerilla", "vip", "militia", "spetsnaz" };
  79. new Trie:tDefaultModels = TrieCreate();
  80. for(new i=1; i<sizeof(szDefaultModels); i++)
  81. {
  82. TrieSetCell(tDefaultModels, szDefaultModels[i], i);
  83. }
  84.  
  85. g_tModelIndexes = TrieCreate();
  86.  
  87. g_tTeamModels[0] = TrieCreate();
  88. g_tTeamModels[1] = TrieCreate();
  89.  
  90. g_tDefaultModels = TrieCreate();
  91.  
  92. new szDatas[70], szRest[40], szKey[MAX_AUTHID_LENGTH], szModel1[MAX_MODEL_LENGTH], szModel2[MAX_MODEL_LENGTH], iVal;
  93. while( !feof(iFile) )
  94. {
  95. fgets(iFile, szDatas, charsmax(szDatas));
  96. trim(szDatas);
  97. if(!szDatas[0] || szDatas[0] == ';' || szDatas[0] == '#' || (szDatas[0] == '/' && szDatas[1] == '/'))
  98. {
  99. continue;
  100. }
  101.  
  102. strbreak(szDatas, szKey, charsmax(szKey), szRest, charsmax(szRest));
  103.  
  104. if( TrieGetCell(tDefaultModels, szKey, iVal) )
  105. {
  106. parse(szRest, szModel1, charsmax(szModel1));
  107. if( szModel1[0] && PrecachePlayerModel(szModel1) )
  108. {
  109. TrieSetString(g_tDefaultModels, szKey, szModel1);
  110. }
  111. }
  112. else if( equal(szKey, "STEAM_", 6) || equal(szKey, "BOT") )
  113. {
  114. parse(szRest, szModel1, charsmax(szModel1), szModel2, charsmax(szModel2));
  115. if( szModel1[0] && PrecachePlayerModel(szModel1) )
  116. {
  117. TrieSetString(g_tTeamModels[1], szKey, szModel1);
  118. }
  119. if( szModel2[0] && PrecachePlayerModel(szModel2) )
  120. {
  121. TrieSetString(g_tTeamModels[0], szKey, szModel2);
  122. }
  123. }
  124. }
  125. TrieDestroy(tDefaultModels);
  126. fclose( iFile );
  127. }
  128. }
  129.  
  130. PrecachePlayerModel( const szModel[] )
  131. {
  132. if( TrieKeyExists(g_tModelIndexes, szModel) )
  133. {
  134. return 1;
  135. }
  136.  
  137. new szFileToPrecache[64];
  138. formatex(szFileToPrecache, charsmax(szFileToPrecache), "models/player/%s/%s.mdl", szModel, szModel);
  139. if( !file_exists( szFileToPrecache ) )
  140. {
  141. return 0;
  142. }
  143.  
  144. TrieSetCell(g_tModelIndexes, szModel, precache_model(szFileToPrecache));
  145.  
  146. formatex(szFileToPrecache, charsmax(szFileToPrecache), "models/player/%s/%st.mdl", szModel, szModel);
  147. if( file_exists( szFileToPrecache ) )
  148. {
  149. precache_model(szFileToPrecache);
  150. return 1;
  151. }
  152. formatex(szFileToPrecache, charsmax(szFileToPrecache), "models/player/%s/%sT.mdl", szModel, szModel);
  153. if( file_exists( szFileToPrecache ) )
  154. {
  155. precache_model(szFileToPrecache);
  156. return 1;
  157. }
  158.  
  159. return 1;
  160. }
  161.  
  162. public plugin_end()
  163. {
  164. TrieDestroy(g_tTeamModels[0]);
  165. TrieDestroy(g_tTeamModels[1]);
  166. TrieDestroy(g_tModelIndexes);
  167. TrieDestroy(g_tDefaultModels);
  168. }
  169.  
  170. public client_authorized( id )
  171. {
  172. get_user_authid(id, g_szAuthid[id], MAX_AUTHID_LENGTH-1);
  173.  
  174. for(new i=1; i<=2; i++)
  175. {
  176. if( TrieKeyExists(g_tTeamModels[2-i], g_szAuthid[id]) )
  177. {
  178. g_bPersonalModel[id] |= i;
  179. }
  180. else
  181. {
  182. g_bPersonalModel[id] &= ~i;
  183. }
  184. }
  185. }
  186.  
  187. public client_putinserver(id)
  188. {
  189. if( !is_user_hltv(id) )
  190. {
  191. SetUserConnected(id);
  192. }
  193. }
  194.  
  195. public client_disconnect(id)
  196. {
  197. g_bPersonalModel[id] = 0;
  198. SetUserNotModeled(id);
  199. SetUserNotConnected(id);
  200. }
  201.  
  202. public SetClientKeyValue(id, const szInfoBuffer[], const szKey[], const szValue[])
  203. {
  204. if( equal(szKey, MODEL) && IsUserConnected(id) )
  205. {
  206. new iTeam = fm_cs_get_user_team_index(id);
  207. if( 1 <= iTeam <= 2 )
  208. {
  209. new szSupposedModel[MAX_MODEL_LENGTH];
  210.  
  211. if( g_bPersonalModel[id] & iTeam )
  212. {
  213. TrieGetString(g_tTeamModels[2-iTeam], g_szAuthid[id], szSupposedModel, charsmax(szSupposedModel));
  214. }
  215. else
  216. {
  217. TrieGetString(g_tDefaultModels, szValue, szSupposedModel, charsmax(szSupposedModel));
  218. }
  219.  
  220. if( szSupposedModel[0] )
  221. {
  222. if( !IsUserModeled(id)
  223. || !equal(g_szCurrentModel[id], szSupposedModel)
  224. || !equal(szValue, szSupposedModel) )
  225. {
  226. copy(g_szCurrentModel[id], MAX_MODEL_LENGTH-1, szSupposedModel);
  227. SetUserModeled(id);
  228. set_user_info(id, MODEL, szSupposedModel);
  229. #if defined SET_MODELINDEX
  230. new iModelIndex;
  231. TrieGetCell(g_tModelIndexes, szSupposedModel, iModelIndex);
  232. // set_pev(id, pev_modelindex, iModelIndex); // is this needed ?
  233. set_pdata_int(id, g_ulModelIndexPlayer, iModelIndex);
  234. #endif
  235. return FMRES_SUPERCEDE;
  236. }
  237. }
  238.  
  239. if( IsUserModeled(id) )
  240. {
  241. SetUserNotModeled(id);
  242. g_szCurrentModel[id][0] = 0;
  243. }
  244. }
  245. }
  246. return FMRES_IGNORED;
  247. }
  248.  
  249. public Message_ClCorpse()
  250. {
  251. new id = get_msg_arg_int(ClCorpse_PlayerID);
  252. if( IsUserModeled(id) )
  253. {
  254. set_msg_arg_string(ClCorpse_ModelName, g_szCurrentModel[id]);
  255. }
  256. }