Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

баг в team select menu customizer

Статус пользователя fitamin4ik
сообщение 19.7.2014, 17:27
Сообщение #1
Стаж: 15 лет

Сообщений: 344
Благодарностей: 88
Полезность: < 0

Всем привет, помогите исправить баг в плагине.
Баг: допустим я поставил выбор нестандартных моделек, выбираю модельку (класс) в игре, всё ок. Потом, когда перевожу кого либо через админку за другую команду, то скин меняется на стандартный (командый)
Как исправить этот баг?

Скрытый текст
Код:
/*
Team Select Menu Customizer
Version 0.1beta
Copyright © 2013, Danakt Frost

Team Select Menu Customizer 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.

Team Select Menu Customizer 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 Team Select Menu Customizer. 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>

#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_pCvarAllowSpec, g_pCvarLimitTeams, g_pCvarTeamBalance;

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");

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] = ADMIN_ALL;

g_iCount[iTeam]++;
}
}

return PLUGIN_CONTINUE;
}

public NewRound()
{
for (new id=1; id<=g_iMaxPlayers; id++)
g_bChanged[id] = false;
}

public client_connect(id)
{
g_iUserTeam[id] = TSMC_UNASSIGNED;
g_bChanged[id] = false;
}

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");
}

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] = 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,"\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;
}

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;
}

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] != ADMIN_ALL && !(get_user_flags(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;
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
voed
сообщение 19.7.2014, 17:50
Сообщение #2
Стаж: 11 лет

Сообщений: 2593
Благодарностей: 1760
Полезность: 405

Попробуй сделать так:

Код:

public NewRound()
{
for (new id=1; id<=g_iMaxPlayers; id++)
g_bChanged[id] = false;
}


>>

Код:

public NewRound()
{
for (new id=1; id<=g_iMaxPlayers; id++)
{
g_bChanged[id] = false;
set_user_info(id, MODEL, g_szPlayerModel[id]);
}
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя fitamin4ik
сообщение 19.7.2014, 17:53
Сообщение #3
Стаж: 15 лет

Сообщений: 344
Благодарностей: 88
Полезность: < 0

Цитата(voed @ 19.7.2014, 17:50) *
Попробуй сделать так:

Код:

public NewRound()
{
for (new id=1; id<=g_iMaxPlayers; id++)
g_bChanged[id] = false;
}


>>

Код:

public NewRound()
{
for (new id=1; id<=g_iMaxPlayers; id++)
{
g_bChanged[id] = false;
set_user_info(id, MODEL, g_szPlayerModel[id]);
}
}


я так делал при спауне, отлавивал спаун игрока и присваивал модель, эффекта - 0.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя fitamin4ik
сообщение 20.7.2014, 9:16
Сообщение #4
Стаж: 15 лет

Сообщений: 344
Благодарностей: 88
Полезность: < 0

помогите пожалуйста.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя tyne
сообщение 20.7.2014, 9:41
Сообщение #5


Стаж: 13 лет

Сообщений: 544
Благодарностей: 137
Полезность: 91

Ну помогите вы ему, мне жалко его уже:с
Ябы сам помог,если бы шарил в этом, хД


Отредактировал: tyne, - 20.7.2014, 9:42
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Safety1st
сообщение 20.7.2014, 9:46
Сообщение #6
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Жёсткий плагин... Это не фиксится в 2 клика, нужно полностью менять алгоритм назначения моделей.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя fitamin4ik
сообщение 20.7.2014, 9:49
Сообщение #7
Стаж: 15 лет

Сообщений: 344
Благодарностей: 88
Полезность: < 0

блииин ranting_w.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
XyLiGaN
сообщение 20.7.2014, 9:50
Сообщение #8
Стаж: 13 лет
Город: Югорск

Сообщений: 11668
Благодарностей: 6450
Полезность: 1052

Меценат Меценат

Парень, заплати 50 рублей и тебе сразу же напишут...
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя fitamin4ik
сообщение 20.7.2014, 10:29
Сообщение #9
Стаж: 15 лет

Сообщений: 344
Благодарностей: 88
Полезность: < 0

Цитата(XyLiGaN @ 20.7.2014, 9:50) *
Парень, заплати 50 рублей и тебе сразу же напишут...

кому? подскажешь?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
XyLiGaN
сообщение 20.7.2014, 10:33
Сообщение #10
Стаж: 13 лет
Город: Югорск

Сообщений: 11668
Благодарностей: 6450
Полезность: 1052

Меценат Меценат

fitamin4ik,
Тут поищи)
Ну или вот
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя fitamin4ik
сообщение 20.7.2014, 12:45
Сообщение #11
Стаж: 15 лет

Сообщений: 344
Благодарностей: 88
Полезность: < 0

всё, сам поправил этот баг. Отловил спаун и присвоил модель.
Нашел еще 1 баг, когда я играю за террористов к примеру, против другого игрока 1х1. Потом жму М, жму перейти за КТ, выбираю класс, мне пишет, что сейчас нельзя перейти за КТ и модель меняется на стандартную (террорист).
Как это исправить?

наверное проблема в join_allow ??

Отредактировал: fitamin4ik, - 20.7.2014, 12:45
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: