Всем привет, в общем перешел на новый билд, так же обновил AMX 1.8.3 и начался мусор в логах. Перекомпилировал все плагины под 1.8.3, всё вроде работает, кроме 1-ого плагина
Выбивает такие ошибки:
Код
L 08/08/2014 - 12:24:52: [AMXX] Run time error 3: stack error
L 08/08/2014 - 12:24:52: [AMXX] [0] team_select.sma::team_menu (line 209)
L 08/08/2014 - 12:24:52: [AMXX] [1] team_select.sma::TeamMenu_Hook (line 356)
L 08/08/2014 - 12:24:53: [AMXX] Displaying debug trace (plugin "team_select.amxx", version "0.1beta")
строка 209 - new szItem[512], len, bitKeys;
строка 356 - team_menu(id);
Код:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <cstrike>
#include <hamsandwich>
#include <VIPSystem>
#define PLUGIN "Team Select Menu Customizer"
#define VERSION "0.1beta"
#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 USER_TEAM 114
#define tsmc_get_user_team(%0) (get_pdata_int(%0, USER_TEAM)-1)
enum
{
TSMC_UNASSIGNED = -1,
TSMC_TEAM_T = 0,
TSMC_TEAM_CT,
TSMC_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_ModelKey[33];
new g_pCvarAllowSpec, g_pCvarLimitTeams, g_pCvarTeamBalance;
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("chooseteam", "clcmd_chooseteam");
register_clcmd("joinclass", "clcmd_chooseteam");
register_clcmd("jointeam", "clcmd_chooseteam");
register_clcmd("model", "model");
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") ;
RegisterHam(Ham_Spawn, "player", "player_spawn", 1);
register_menucmd(register_menuid("TeamMenu"), KEYS, "team_menu_handler");
register_menucmd(register_menuid("ClassMenu"), KEYS, "class_menu_handler");
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();
}
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("[TSMC] 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 == TSMC_TEAM_T)
g_szClassesT[iClassId][i] = szClassData[i];
else if(iTeam == TSMC_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] = VIP_FLAG_ALL;
g_iCount[iTeam]++;
}
}
return PLUGIN_CONTINUE;
}
public NewRound()
{
for (new id=1; id<=g_iMaxPlayers; id++)
g_bChanged[id] = false;
}
public model(id)
{
return PLUGIN_HANDLED;
}
public client_connect(id)
{
g_iUserTeam[id] = TSMC_UNASSIGNED;
g_bChanged[id] = false;
}
public player_spawn(id)
{
if(!is_user_connected(id)) return HAM_IGNORED;
if (!g_ModelKey[id])
{
g_ModelKey[id] = random_num(1,3);
format(g_szPlayerModel[id], 127, "%s", get_class_info(g_iUserTeam[id], g_ModelKey[id], CLASS_TAG));
set_user_info(id, MODEL, g_szPlayerModel[id]);
}
return HAM_IGNORED
}
get_ct()
{
new AliveCT;
new Players[32]
new playerCount, i
get_players(Players, playerCount, "ch")
for (i=0; i<playerCount; i++)
{
if(is_user_connected(Players[i]) && get_user_team(Players[i]) == 2) AliveCT++;
}
return AliveCT;
}
get_t()
{
new AliveT;
new Players[32]
new playerCount, i
get_players(Players, playerCount, "ch")
for (i=0; i<playerCount; i++)
{
if(is_user_connected(Players[i]) && get_user_team(Players[i]) == 1) AliveT++;
}
return AliveT;
}
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,"\r\wВыбор команды:^n^n\r1. \w%s^n\r2. \w%s^n^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, "\r6. \wНаблюдатели^n");
}
len += format(szItem[len], 511-len, "^n\r0. \wВыход^n");
show_menu(id, bitKeys, szItem, -1, "TeamMenu");
}
public team_menu_handler(id, key)
{
switch(key+1)
{
case 1:
{
if (get_t() > get_ct()) return PLUGIN_HANDLED;
g_iUserTeam[id] = key;
team_join(id, key);
create_classes_menu(id, key);
}
case 2:
{
if (get_ct() > get_t()) return PLUGIN_HANDLED;
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] = TSMC_SPECTATOR;
g_bChanged[id] = true;
engclient_cmd(id, "jointeam", "6")
}else
team_menu(id);
}
}
return PLUGIN_HANDLED;
}
public create_classes_menu(id, iTeam)
{
new szItem[512], len, bitKeys = 1<<(g_iCount[iTeam]), bAccess;
len = format(szItem, 511,"\r\wВыбор персонажа:^n^n");
for(new i=0; i<g_iCount[iTeam];i++)
{
bAccess = (VSGetVipFlags(id) & g_szClassAccess[iTeam][i]);
if(bAccess || g_szClassAccess[iTeam][i] == VIP_FLAG_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, "\r%d. \w%s\y[VIP]^n", i+1, get_class_info(iTeam, i, CLASS_NAME));
}
}
show_menu(id, bitKeys, szItem, -1, "ClassMenu");
return PLUGIN_HANDLED;
}
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));
set_user_info(id, MODEL, g_szPlayerModel[id]);
g_ModelKey[id] = key;
g_bChanged[id] = true;
return PLUGIN_HANDLED;
}
public plugin_natives ()
{
register_native("get_model", "native_get_model", 1)
}
public native_get_model(id)
{
return g_ModelKey[id];
}
public client_infochanged(id)
{
if (is_user_connected(id) && is_user_alive(id))
{
format(g_szPlayerModel[id], 127, "%s", get_class_info(g_iUserTeam[id], g_ModelKey[id], CLASS_TAG));
set_user_info(id, MODEL, g_szPlayerModel[id]);
}
return PLUGIN_HANDLED;
}
public SetClientKeyValue(id, szInfoBuffer[], szKey[], szValue[])
{
if(equal(szKey, MODEL) && is_user_connected(id))
{
g_iUserTeam[id] = tsmc_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;
}
public Message_ClCorpse()
{
new id = get_msg_arg_int(12);
set_msg_arg_string(1, g_szPlayerModel[id]);
}
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;
}
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, TSMC_TEAM_T);
return PLUGIN_HANDLED;
}
else if(get_msg_arg_int(1) == 27)
{
create_classes_menu(id, TSMC_TEAM_CT);
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
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);
}
stock get_class_info(iTeam, iClass, iData)
{
new szReturn[64];
if(iTeam == TSMC_TEAM_T)
szReturn = g_szClassesT[iClass][iData];
else if(iTeam == TSMC_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] != VIP_FLAG_ALL && !(VSGetVipFlags(id) & g_szClassAccess[iTeam][iRandomClassNum]))
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(tsmc_get_user_team(id) == TSMC_TEAM_CT)
iNumCT--;
else if(tsmc_get_user_team(id) == TSMC_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;
}
Помогите исправить, пожалуйста.
Отредактировал: fitamin4ik, - 8.8.2014, 10:47