Hello! I have a problem with this plugin:CS Teams Editor. Everyone have skins and round by round each of them dissapear. I used before Players Models 1.3.1 and there was no problem but I prefer this plugin..it is more complex or give me something similar with this version please
Code:
/*
CS Teams Editor
Version 1.0
Copyright 2013, Danakt Frost
CS Teams Editor is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
CS Teams Editor is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with CS Teams Editor. If not, see <http://www.gnu.org/licenses/>.
Description:
This plugin is designed to modify and supplement the Team Select Menu.
See team_select_menu.ini
*/
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
// Defines and variables -------------------------------------------------------
#define PLUGIN "CS Teams Editor"
#define VERSION "1.0"
#define AUTHOR "Danakt Frost"
#define FILE_NAME "team_select_menu.ini"
#define MODEL "model"
#define MAX_NUM_TEAMS 2
#define MAX_PLAYERS 32
#define KEYS ( 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6 | 1<<7 | 1<<8 | 1<<9 )
#define EXTRAOFFSET 5
#define OFFSET_ISVIP 209
#define PLAYER_IS_VIP ( 1<<8 )
#define USER_TEAM 114
#define cste_get_user_team(%0) (get_pdata_int(%0, USER_TEAM) - 1)
enum {
CSTE_UNASSIGNED = -1,
CSTE_TEAM_T = 0,
CSTE_TEAM_CT,
CSTE_SPECTATOR
}
enum _:NumDatas {
CLASS_NAME = 0,
CLASS_TAG,
CLASS_ACCESS
}
new g_szConfigFile[128];
new g_szClassesT[32][NumDatas][64],
g_szClassesCT[32][NumDatas][64],
g_szClassAccess[MAX_NUM_TEAMS][32];
new g_szTeamName[2][128];
new g_iCount[MAX_NUM_TEAMS];
new g_iMsgId[MAX_PLAYERS+1],
g_iUserTeam[MAX_PLAYERS+1];
new bool:g_bChanged[MAX_PLAYERS+1];
new g_szPlayerModel[MAX_PLAYERS+1][128];
new g_iMaxPlayers;
new g_pCvarAllowSpec,
g_pCvarLimitTeams,
g_pCvarTeamBalance;
// Plugin initialisation -------------------------------------------------------
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("chooseteam", "clcmd_chooseteam");
register_message(get_user_msgid("ShowMenu"), "TeamMenu_Hook");
register_message(get_user_msgid("VGUIMenu"), "TeamMenuVGUI_Hook");
register_message(get_user_msgid("ClCorpse"), "Message_ClCorpse");
register_forward(FM_SetClientKeyValue, "SetClientKeyValue");
register_event("HLTV", "NewRound", "a", "1=0", "2=0")
register_menucmd(register_menuid("TeamMenu"), KEYS, "team_menu_handler");
register_menucmd(register_menuid("ClassMenu"), KEYS, "class_menu_handler");
// Cvars
g_pCvarAllowSpec = get_cvar_pointer("allow_spectators");
g_pCvarLimitTeams = get_cvar_pointer("mp_limitteams");
g_pCvarTeamBalance = get_cvar_pointer("mp_autoteambalance");
g_iMaxPlayers = get_maxplayers();
}
// Plugin precaches ------------------------------------------------------------
public plugin_precache() {
get_configsdir(g_szConfigFile, 127);
format(g_szConfigFile, 127, "%s/%s", g_szConfigFile, FILE_NAME);
new dFile = fopen(g_szConfigFile, "rt");
new szModelFile[128], szErrorMsg[128];
new szData[256];
new iTeam = -1;
if(!dFile) {
format(
szErrorMsg, 127, "Plugin can't found file ^"%s^"",
g_szConfigFile
);
return set_fail_state(szErrorMsg);
}
while(!feof(dFile)) {
fgets(dFile, szData, 255);
if(szData[0] == '/' && szData[1] == '/'
|| szData[0] == ';' || szData[0] == '^n')
continue;
replace(szData, 255, "^n", "");
if(szData[0] == '[') {
iTeam++;
if(iTeam > MAX_NUM_TEAMS)
break;
replace(szData, 255, "]", "");
replace(szData, 255, "[", "");
format(g_szTeamName[iTeam], 127, "%s", szData);
}
else {
if(iTeam < 0)
continue;
new szClassData[NumDatas][64];
parse(
szData, szClassData[CLASS_NAME], 63,
szClassData[CLASS_TAG], 63,
szClassData[CLASS_ACCESS], 63
);
format(
szModelFile, 127, "models/player/%s/%s.mdl",
szClassData[CLASS_TAG], szClassData[CLASS_TAG]
);
if(!file_exists(szModelFile) || !szClassData[CLASS_TAG][0] ) {
server_print(
"[CSTE] Warning! Item ^"%s^" wasn't created: file ^"%s^" doesn't exist.",
szClassData[CLASS_NAME], szModelFile
);
continue;
}
precache_model(szModelFile);
new iClassId = g_iCount[iTeam];
for(new i = 0; i < NumDatas; i++) {
if(iTeam == CSTE_TEAM_T)
g_szClassesT[iClassId][i] = szClassData[i];
else if(iTeam == CSTE_TEAM_CT)
g_szClassesCT[iClassId][i] = szClassData[i];
}
if(szClassData[CLASS_ACCESS][0])
g_szClassAccess[iTeam][iClassId] = read_flags(
szClassData[CLASS_ACCESS]
);
else
g_szClassAccess[iTeam][iClassId] = ADMIN_ALL;
g_iCount[iTeam]++;
}
}
return PLUGIN_CONTINUE;
}
// New round event -------------------------------------------------------------
public NewRound() {
for (new id = 1; id <= g_iMaxPlayers; id ++)
g_bChanged[id] = false;
}
// Client disconnect event -----------------------------------------------------
public client_connect(id) {
g_iUserTeam[id] = CSTE_UNASSIGNED;
g_bChanged[id] = false;
}
// Opening teams menu ----------------------------------------------------------
public team_menu(id) {
if(g_bChanged[id]) {
client_print(id, print_center, "#Cstrike_TitlesTXT_Only_1_Team_Change");
return;
}
new szItem[512], len, bitKeys;
bitKeys = ( 1<<0 | 1<<1 | 1<<4 | 1<<9 );
len = format(
szItem, 511,"\ySelect a team^n^n\w1. %s^n\w2. %s^n^n\w5. Auto-select^n",
g_szTeamName[0], g_szTeamName[1]
);
if(get_pcvar_num(g_pCvarAllowSpec) && !is_user_alive(id)) {
bitKeys |= 1<<5;
len += format(szItem[len], 511-len, "\w6. Spectator^n");
}
len += format(szItem[len], 511-len, "^n\w0. Exit^n");
show_menu(id, bitKeys, szItem, -1, "TeamMenu");
}
// Handle teams menu -----------------------------------------------------------
public team_menu_handler(id, key) {
switch(key+1) {
case 1, 2: {
if(join_allow(id) != key+1 && join_allow(id) != 3) {
g_iUserTeam[id] = key;
team_join(id, key);
create_classes_menu(id, key);
}
}
case 5: {
new iRand;
iRand = random(2);
g_iUserTeam[id] = iRand;
team_join(id, iRand);
create_classes_menu(id, iRand);
}
case 6: {
if(get_pcvar_num(g_pCvarAllowSpec) && !is_user_alive(id)) {
g_iUserTeam[id] = CSTE_SPECTATOR;
g_bChanged[id] = true;
engclient_cmd(id, "jointeam", "6")
}else
team_menu(id);
}
}
return PLUGIN_HANDLED;
}
// Opening classes menu --------------------------------------------------------
public create_classes_menu(id, iTeam) {
new szItem[512], len, bitKeys = 1<<(g_iCount[iTeam]), bAccess;
len = format(szItem, 511,"\ySelect your appearance^n^n");
for(new i=0; i<g_iCount[iTeam];i++) {
bAccess = (get_user_flags(id) & g_szClassAccess[iTeam][i]);
if(bAccess || g_szClassAccess[iTeam][i] == ADMIN_ALL) {
len += format(
szItem[len], 511-len, "%s%d. %s^n",
(bAccess ? "\y" : "\w"), i + 1,
get_class_info(iTeam, i, CLASS_NAME)
);
bitKeys |= 1<<i;
}else
len += format(
szItem[len], 511-len, "\d%d. %s\R\rNO ACCESS^n",
i+1, get_class_info(iTeam, i, CLASS_NAME)
);
}
len += format(
szItem[len], 511-len, "^n\w%d. Auto-select",
g_iCount[iTeam] + 1
);
show_menu(id, bitKeys, szItem, -1, "ClassMenu");
return PLUGIN_HANDLED;
}
// Handle classes menu ---------------------------------------------------------
public class_menu_handler(id, key) {
new iMenuMsgid = g_iMsgId[id];
new iMsgBlock = get_msg_block(iMenuMsgid);
set_msg_block(iMenuMsgid, BLOCK_SET);
engclient_cmd(id, "joinclass", "1");
set_msg_block(iMenuMsgid, iMsgBlock);
format(
g_szPlayerModel[id], 127, "%s",
get_class_info(g_iUserTeam[id], key, CLASS_TAG)
);
// Auto-select
if(key == g_iCount[g_iUserTeam[id]] )
get_random_class_tag(id, g_iUserTeam[id], g_szPlayerModel[id], 127);
set_user_info(id, MODEL, g_szPlayerModel[id]);
g_bChanged[id] = true;
return PLUGIN_HANDLED;
}
// SetClientKeyValue forward ---------------------------------------------------
public SetClientKeyValue(id, szInfoBuffer[], szKey[], szValue[]) {
if(equal(szKey, MODEL) && is_user_connected(id)) {
g_iUserTeam[id] = cste_get_user_team(id);
if(g_iUserTeam[id] == get_class_team_by_tag(g_szPlayerModel[id])
&& !equal(szValue, g_szPlayerModel[id])) {
set_user_info(id, MODEL, g_szPlayerModel[id]);
return FMRES_SUPERCEDE;
}
}
return FMRES_IGNORED;
}
// Message ClCorpse ------------------------------------------------------------
public Message_ClCorpse() {
new id = get_msg_arg_int(12);
// if user is not VIP
if(!(get_pdata_int(id, OFFSET_ISVIP, EXTRAOFFSET) & PLAYER_IS_VIP)) {
set_msg_arg_string(1, g_szPlayerModel[id]);
}
}
// Player actions hooks --------------------------------------------------------
// Team select menu hook
public TeamMenu_Hook(iMsgid, dest, id) {
static szTeamSelect[] = "#Team_Select";
static szMenuTextCode[32];
get_msg_arg_string(4, szMenuTextCode, sizeof szMenuTextCode - 1);
if(contain(szMenuTextCode, szTeamSelect) > -1) {
team_menu(id);
return PLUGIN_HANDLED;
}
g_iMsgId[id] = iMsgid;
return PLUGIN_CONTINUE;
}
// VGUI menu hook
public TeamMenuVGUI_Hook(iMsgid, dest, id) {
if(get_msg_arg_int(1) == 2) {
team_menu(id);
return PLUGIN_HANDLED;
}
else if(get_msg_arg_int(1) == 26) {
create_classes_menu(id, CSTE_TEAM_T);
return PLUGIN_HANDLED;
}
else if(get_msg_arg_int(1) == 27) {
create_classes_menu(id, CSTE_TEAM_CT);
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
// Console command hook
public clcmd_chooseteam(id) {
team_menu(id);
return PLUGIN_HANDLED;
}
//
stock team_join(id, iTeam) {
new szTeam[2];
new iMenuMsgid = g_iMsgId[id];
new iMsgBlock = get_msg_block(iMenuMsgid);
g_iUserTeam[id] = iTeam;
g_bChanged[id] = true;
num_to_str(iTeam+1, szTeam, 1);
set_msg_block(iMenuMsgid, BLOCK_SET);
engclient_cmd(id, "jointeam", szTeam);
set_msg_block(iMenuMsgid, iMsgBlock);
}
// Stocks ----------------------------------------------------------------------
stock get_class_info(iTeam, iClass, iData) {
new szReturn[64];
if(iTeam == CSTE_TEAM_T)
szReturn = g_szClassesT[iClass][iData];
else if(iTeam == CSTE_TEAM_CT)
szReturn = g_szClassesCT[iClass][iData];
return szReturn;
}
stock get_random_class_tag(id, iTeam, szOutput[], len) {
new bool:bDone = false;
while(!bDone) {
new iCount = g_iCount[iTeam];
new iRandomClassNum = random_num(0, iCount);
if(g_szClassAccess[iTeam][iRandomClassNum] != ADMIN_ALL
&& (!(get_user_flags(id) & g_szClassAccess[iTeam][iRandomClassNum])
|| is_user_bot(id)))
continue;
copy(szOutput, len, get_class_info(iTeam, iRandomClassNum, CLASS_TAG))
bDone = true;
}
}
stock get_class_team_by_tag(const szTag[]) {
for(new iTeam=0; iTeam<MAX_NUM_TEAMS; iTeam++)
for(new i=0; i<g_iCount[iTeam]; i++) {
if(equal(szTag, get_class_info(iTeam, i, CLASS_TAG)))
return iTeam;
}
return -2;
}
stock join_allow(id) {
new iNumT, iNumCT;
new iPlayers[32];
get_players(iPlayers, iNumT, "eh", "TERRORIST")
get_players(iPlayers, iNumCT, "eh", "CT")
if(cste_get_user_team(id) == CSTE_TEAM_CT)
iNumCT--;
else if(cste_get_user_team(id) == CSTE_TEAM_T)
iNumT--;
new iTeamsLimit = get_pcvar_num(g_pCvarLimitTeams);
if(get_pcvar_num(g_pCvarTeamBalance) && iTeamsLimit != 0) {
if(iNumT-iNumCT >= iTeamsLimit && iNumCT-iNumT >= iTeamsLimit)
return 3;
else if(iNumT-iNumCT >= iTeamsLimit)
return 1;
else if (iNumCT-iNumT >= iTeamsLimit)
return 2;
}
return 0;
}