Advertisement
RayCodeCSC

CS 1.6 - Plugin

Jan 21st, 2018
9,135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.53 KB | None | 0 0
  1. /*
  2. CS Teams Editor
  3. Version 1.0
  4. Copyright 2013, Danakt Frost
  5.  
  6. CS Teams Editor is free software: you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation, either version 3 of the License, or
  9. (at your option) any later version.
  10.  
  11. CS Teams Editor is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with CS Teams Editor. If not, see <http://www.gnu.org/licenses/>.
  18.  
  19. Description:
  20. This plugin is designed to modify and supplement the Team Select Menu.
  21. See team_select_menu.ini
  22. */
  23.  
  24. #include <amxmodx>
  25. #include <amxmisc>
  26. #include <fakemeta>
  27.  
  28. // Defines and variables -------------------------------------------------------
  29. #define PLUGIN "CS Teams Editor"
  30. #define VERSION "1.0"
  31. #define AUTHOR "Danakt Frost"
  32.  
  33. #define FILE_NAME "team_select_menu.ini"
  34. #define MODEL "model"
  35. #define MAX_NUM_TEAMS 2
  36. #define MAX_PLAYERS 32
  37.  
  38. #define KEYS ( 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6 | 1<<7 | 1<<8 | 1<<9 )
  39.  
  40. #define EXTRAOFFSET 5
  41. #define OFFSET_ISVIP 209
  42. #define PLAYER_IS_VIP ( 1<<8 )
  43.  
  44. #define USER_TEAM 114
  45. #define cste_get_user_team(%0) (get_pdata_int(%0, USER_TEAM) - 1)
  46.  
  47. enum {
  48. CSTE_UNASSIGNED = -1,
  49. CSTE_TEAM_T = 0,
  50. CSTE_TEAM_CT,
  51. CSTE_SPECTATOR
  52. }
  53.  
  54. enum _:NumDatas {
  55. CLASS_NAME = 0,
  56. CLASS_TAG,
  57. CLASS_ACCESS
  58. }
  59.  
  60. new g_szConfigFile[128];
  61. new g_szClassesT[32][NumDatas][64],
  62. g_szClassesCT[32][NumDatas][64],
  63. g_szClassAccess[MAX_NUM_TEAMS][32];
  64. new g_szTeamName[2][128];
  65. new g_iCount[MAX_NUM_TEAMS];
  66. new g_iMsgId[MAX_PLAYERS+1],
  67. g_iUserTeam[MAX_PLAYERS+1];
  68. new bool:g_bChanged[MAX_PLAYERS+1];
  69. new g_szPlayerModel[MAX_PLAYERS+1][128];
  70. new g_iMaxPlayers;
  71. new g_pCvarAllowSpec,
  72. g_pCvarLimitTeams,
  73. g_pCvarTeamBalance;
  74.  
  75. // Plugin initialisation -------------------------------------------------------
  76. public plugin_init() {
  77. register_plugin(PLUGIN, VERSION, AUTHOR);
  78.  
  79. register_clcmd("chooseteam", "clcmd_chooseteam");
  80.  
  81. register_message(get_user_msgid("ShowMenu"), "TeamMenu_Hook");
  82. register_message(get_user_msgid("VGUIMenu"), "TeamMenuVGUI_Hook");
  83. register_message(get_user_msgid("ClCorpse"), "Message_ClCorpse");
  84.  
  85. register_forward(FM_SetClientKeyValue, "SetClientKeyValue");
  86. register_event("HLTV", "NewRound", "a", "1=0", "2=0")
  87.  
  88. register_menucmd(register_menuid("TeamMenu"), KEYS, "team_menu_handler");
  89. register_menucmd(register_menuid("ClassMenu"), KEYS, "class_menu_handler");
  90.  
  91. // Cvars
  92. g_pCvarAllowSpec = get_cvar_pointer("allow_spectators");
  93. g_pCvarLimitTeams = get_cvar_pointer("mp_limitteams");
  94. g_pCvarTeamBalance = get_cvar_pointer("mp_autoteambalance");
  95.  
  96. g_iMaxPlayers = get_maxplayers();
  97. }
  98.  
  99. // Plugin precaches ------------------------------------------------------------
  100. public plugin_precache() {
  101. get_configsdir(g_szConfigFile, 127);
  102. format(g_szConfigFile, 127, "%s/%s", g_szConfigFile, FILE_NAME);
  103.  
  104. new dFile = fopen(g_szConfigFile, "rt");
  105. new szModelFile[128], szErrorMsg[128];
  106. new szData[256];
  107. new iTeam = -1;
  108.  
  109. if(!dFile) {
  110. format(
  111. szErrorMsg, 127, "Plugin can't found file ^"%s^"",
  112. g_szConfigFile
  113. );
  114.  
  115. return set_fail_state(szErrorMsg);
  116. }
  117.  
  118.  
  119. while(!feof(dFile)) {
  120. fgets(dFile, szData, 255);
  121. if(szData[0] == '/' && szData[1] == '/'
  122. || szData[0] == ';' || szData[0] == '^n')
  123. continue;
  124.  
  125. replace(szData, 255, "^n", "");
  126.  
  127. if(szData[0] == '[') {
  128. iTeam++;
  129. if(iTeam > MAX_NUM_TEAMS)
  130. break;
  131.  
  132. replace(szData, 255, "]", "");
  133. replace(szData, 255, "[", "");
  134. format(g_szTeamName[iTeam], 127, "%s", szData);
  135. }
  136. else {
  137. if(iTeam < 0)
  138. continue;
  139.  
  140. new szClassData[NumDatas][64];
  141.  
  142. parse(
  143. szData, szClassData[CLASS_NAME], 63,
  144. szClassData[CLASS_TAG], 63,
  145. szClassData[CLASS_ACCESS], 63
  146. );
  147.  
  148. format(
  149. szModelFile, 127, "models/player/%s/%s.mdl",
  150. szClassData[CLASS_TAG], szClassData[CLASS_TAG]
  151. );
  152. if(!file_exists(szModelFile) || !szClassData[CLASS_TAG][0] ) {
  153. server_print(
  154. "[CSTE] Warning! Item ^"%s^" wasn't created: file ^"%s^" doesn't exist.",
  155. szClassData[CLASS_NAME], szModelFile
  156. );
  157. continue;
  158. }
  159. precache_model(szModelFile);
  160.  
  161. new iClassId = g_iCount[iTeam];
  162. for(new i = 0; i < NumDatas; i++) {
  163. if(iTeam == CSTE_TEAM_T)
  164. g_szClassesT[iClassId][i] = szClassData[i];
  165. else if(iTeam == CSTE_TEAM_CT)
  166. g_szClassesCT[iClassId][i] = szClassData[i];
  167. }
  168.  
  169. if(szClassData[CLASS_ACCESS][0])
  170. g_szClassAccess[iTeam][iClassId] = read_flags(
  171. szClassData[CLASS_ACCESS]
  172. );
  173. else
  174. g_szClassAccess[iTeam][iClassId] = ADMIN_ALL;
  175.  
  176. g_iCount[iTeam]++;
  177. }
  178. }
  179.  
  180. return PLUGIN_CONTINUE;
  181. }
  182.  
  183. // New round event -------------------------------------------------------------
  184. public NewRound() {
  185. for (new id = 1; id <= g_iMaxPlayers; id ++)
  186. g_bChanged[id] = false;
  187. }
  188.  
  189. // Client disconnect event -----------------------------------------------------
  190. public client_connect(id) {
  191. g_iUserTeam[id] = CSTE_UNASSIGNED;
  192. g_bChanged[id] = false;
  193. }
  194.  
  195. // Opening teams menu ----------------------------------------------------------
  196. public team_menu(id) {
  197. if(g_bChanged[id]) {
  198. client_print(id, print_center, "#Cstrike_TitlesTXT_Only_1_Team_Change");
  199. return;
  200. }
  201.  
  202. new szItem[512], len, bitKeys;
  203. bitKeys = ( 1<<0 | 1<<1 | 1<<4 | 1<<9 );
  204.  
  205. len = format(
  206. szItem, 511,"\ySelect a team^n^n\w1. %s^n\w2. %s^n^n\w5. Auto-select^n",
  207. g_szTeamName[0], g_szTeamName[1]
  208. );
  209.  
  210. if(get_pcvar_num(g_pCvarAllowSpec) && !is_user_alive(id)) {
  211. bitKeys |= 1<<5;
  212. len += format(szItem[len], 511-len, "\w6. Spectator^n");
  213. }
  214.  
  215. len += format(szItem[len], 511-len, "^n\w0. Exit^n");
  216. show_menu(id, bitKeys, szItem, -1, "TeamMenu");
  217. }
  218.  
  219. // Handle teams menu -----------------------------------------------------------
  220. public team_menu_handler(id, key) {
  221. switch(key+1) {
  222. case 1, 2: {
  223. if(join_allow(id) != key+1 && join_allow(id) != 3) {
  224. g_iUserTeam[id] = key;
  225. team_join(id, key);
  226. create_classes_menu(id, key);
  227. }
  228. }
  229. case 5: {
  230. new iRand;
  231. iRand = random(2);
  232. g_iUserTeam[id] = iRand;
  233. team_join(id, iRand);
  234. create_classes_menu(id, iRand);
  235. }
  236. case 6: {
  237. if(get_pcvar_num(g_pCvarAllowSpec) && !is_user_alive(id)) {
  238. g_iUserTeam[id] = CSTE_SPECTATOR;
  239. g_bChanged[id] = true;
  240. engclient_cmd(id, "jointeam", "6")
  241. }else
  242. team_menu(id);
  243. }
  244. }
  245. menu_setprop(szItem, MPROP_EXIT, MEXIT_ALL);
  246. menu_setprop(szItem, MPROP_NEXTNAME, "Dalej");
  247. menu_setprop(szItem, MPROP_BACKNAME, "Navrat");
  248. menu_setprop(szItem, MPROP_EXITNAME, "Zavriet");
  249.  
  250. return PLUGIN_HANDLED;
  251. }
  252.  
  253. // Opening classes menu --------------------------------------------------------
  254. public create_classes_menu(id, iTeam) {
  255. new szItem[512], len, bitKeys = 1<<(g_iCount[iTeam]), bAccess;
  256.  
  257. len = format(szItem, 511,"\ySelect your appearance^n^n");
  258. for(new i=0; i<g_iCount[iTeam];i++) {
  259. bAccess = (get_user_flags(id) & g_szClassAccess[iTeam][i]);
  260.  
  261. if(bAccess || g_szClassAccess[iTeam][i] == ADMIN_ALL) {
  262. len += format(
  263. szItem[len], 511-len, "%s%d. %s^n",
  264. (bAccess ? "\y" : "\w"), i + 1,
  265. get_class_info(iTeam, i, CLASS_NAME)
  266. );
  267.  
  268. bitKeys |= 1<<i;
  269. }else
  270. len += format(
  271. szItem[len], 511-len, "\d%d. %s\R\rNO ACCESS^n",
  272. i+1, get_class_info(iTeam, i, CLASS_NAME)
  273. );
  274.  
  275. }
  276. len += format(
  277. szItem[len], 511-len, "^n\w%d. Auto-select",
  278. g_iCount[iTeam] + 1
  279. );
  280.  
  281. show_menu(id, bitKeys, szItem, -1, "ClassMenu");
  282.  
  283. return PLUGIN_HANDLED;
  284. }
  285.  
  286. // Handle classes menu ---------------------------------------------------------
  287. public class_menu_handler(id, key) {
  288. new iMenuMsgid = g_iMsgId[id];
  289. new iMsgBlock = get_msg_block(iMenuMsgid);
  290.  
  291. set_msg_block(iMenuMsgid, BLOCK_SET);
  292. engclient_cmd(id, "joinclass", "1");
  293. set_msg_block(iMenuMsgid, iMsgBlock);
  294.  
  295. format(
  296. g_szPlayerModel[id], 127, "%s",
  297. get_class_info(g_iUserTeam[id], key, CLASS_TAG)
  298. );
  299.  
  300. // Auto-select
  301. if(key == g_iCount[g_iUserTeam[id]] )
  302. get_random_class_tag(id, g_iUserTeam[id], g_szPlayerModel[id], 127);
  303.  
  304. set_user_info(id, MODEL, g_szPlayerModel[id]);
  305. g_bChanged[id] = true;
  306.  
  307. return PLUGIN_HANDLED;
  308. }
  309.  
  310. // SetClientKeyValue forward ---------------------------------------------------
  311. public SetClientKeyValue(id, szInfoBuffer[], szKey[], szValue[]) {
  312. if(equal(szKey, MODEL) && is_user_connected(id)) {
  313. g_iUserTeam[id] = cste_get_user_team(id);
  314.  
  315. if(g_iUserTeam[id] == get_class_team_by_tag(g_szPlayerModel[id])
  316. && !equal(szValue, g_szPlayerModel[id])) {
  317. set_user_info(id, MODEL, g_szPlayerModel[id]);
  318. return FMRES_SUPERCEDE;
  319. }
  320. }
  321.  
  322. return FMRES_IGNORED;
  323. }
  324.  
  325. // Message ClCorpse ------------------------------------------------------------
  326. public Message_ClCorpse() {
  327. new id = get_msg_arg_int(12);
  328.  
  329. // if user is not VIP
  330. if(!(get_pdata_int(id, OFFSET_ISVIP, EXTRAOFFSET) & PLAYER_IS_VIP)) {
  331. set_msg_arg_string(1, g_szPlayerModel[id]);
  332. }
  333. }
  334.  
  335. // Player actions hooks --------------------------------------------------------
  336. // Team select menu hook
  337. public TeamMenu_Hook(iMsgid, dest, id) {
  338. static szTeamSelect[] = "#Team_Select";
  339. static szMenuTextCode[32];
  340. get_msg_arg_string(4, szMenuTextCode, sizeof szMenuTextCode - 1);
  341.  
  342. if(contain(szMenuTextCode, szTeamSelect) > -1) {
  343. team_menu(id);
  344. return PLUGIN_HANDLED;
  345. }
  346.  
  347. g_iMsgId[id] = iMsgid;
  348.  
  349. return PLUGIN_CONTINUE;
  350. }
  351.  
  352. // VGUI menu hook
  353. public TeamMenuVGUI_Hook(iMsgid, dest, id) {
  354. if(get_msg_arg_int(1) == 2) {
  355. team_menu(id);
  356. return PLUGIN_HANDLED;
  357. }
  358. else if(get_msg_arg_int(1) == 26) {
  359. create_classes_menu(id, CSTE_TEAM_T);
  360. return PLUGIN_HANDLED;
  361. }
  362. else if(get_msg_arg_int(1) == 27) {
  363. create_classes_menu(id, CSTE_TEAM_CT);
  364. return PLUGIN_HANDLED;
  365. }
  366. return PLUGIN_CONTINUE;
  367. }
  368.  
  369. // Console command hook
  370. public clcmd_chooseteam(id) {
  371. team_menu(id);
  372. return PLUGIN_HANDLED;
  373. }
  374.  
  375. //
  376. stock team_join(id, iTeam) {
  377. new szTeam[2];
  378. new iMenuMsgid = g_iMsgId[id];
  379. new iMsgBlock = get_msg_block(iMenuMsgid);
  380.  
  381. g_iUserTeam[id] = iTeam;
  382. g_bChanged[id] = true;
  383.  
  384. num_to_str(iTeam+1, szTeam, 1);
  385. set_msg_block(iMenuMsgid, BLOCK_SET);
  386. engclient_cmd(id, "jointeam", szTeam);
  387. set_msg_block(iMenuMsgid, iMsgBlock);
  388. }
  389.  
  390. // Stocks ----------------------------------------------------------------------
  391. stock get_class_info(iTeam, iClass, iData) {
  392. new szReturn[64];
  393.  
  394. if(iTeam == CSTE_TEAM_T)
  395. szReturn = g_szClassesT[iClass][iData];
  396. else if(iTeam == CSTE_TEAM_CT)
  397. szReturn = g_szClassesCT[iClass][iData];
  398.  
  399. return szReturn;
  400. }
  401.  
  402. stock get_random_class_tag(id, iTeam, szOutput[], len) {
  403. new bool:bDone = false;
  404. while(!bDone) {
  405. new iCount = g_iCount[iTeam];
  406. new iRandomClassNum = random_num(0, iCount);
  407.  
  408. if(g_szClassAccess[iTeam][iRandomClassNum] != ADMIN_ALL
  409. && (!(get_user_flags(id) & g_szClassAccess[iTeam][iRandomClassNum])
  410. || is_user_bot(id)))
  411. continue;
  412.  
  413. copy(szOutput, len, get_class_info(iTeam, iRandomClassNum, CLASS_TAG))
  414. bDone = true;
  415. }
  416. }
  417.  
  418. stock get_class_team_by_tag(const szTag[]) {
  419. for(new iTeam=0; iTeam<MAX_NUM_TEAMS; iTeam++)
  420. for(new i=0; i<g_iCount[iTeam]; i++) {
  421. if(equal(szTag, get_class_info(iTeam, i, CLASS_TAG)))
  422. return iTeam;
  423. }
  424.  
  425. return -2;
  426. }
  427.  
  428. stock join_allow(id) {
  429. new iNumT, iNumCT;
  430. new iPlayers[32];
  431.  
  432. get_players(iPlayers, iNumT, "eh", "TERRORIST")
  433. get_players(iPlayers, iNumCT, "eh", "CT")
  434.  
  435. if(cste_get_user_team(id) == CSTE_TEAM_CT)
  436. iNumCT--;
  437. else if(cste_get_user_team(id) == CSTE_TEAM_T)
  438. iNumT--;
  439.  
  440. new iTeamsLimit = get_pcvar_num(g_pCvarLimitTeams);
  441.  
  442. if(get_pcvar_num(g_pCvarTeamBalance) && iTeamsLimit != 0) {
  443. if(iNumT-iNumCT >= iTeamsLimit && iNumCT-iNumT >= iTeamsLimit)
  444. return 3;
  445. else if(iNumT-iNumCT >= iTeamsLimit)
  446. return 1;
  447. else if (iNumCT-iNumT >= iTeamsLimit)
  448. return 2;
  449. }
  450.  
  451. return 0;
  452. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement