Русское сообщество по скриптингу

В mapchooser добавить вывод время  [Решено]

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Re: В mapchooser добавить вывод время

Сообщение Andrey777 » 12 апр 2017, 17:32

Papito, А это не то? код скидывали, но как его использовать хз.
в евенте хлтв:
Код: Выделить всё
   new timeleft = get_timeleft();
   if(timeleft <= 360 && timeleft >= 240)
   {
      ..
   }

Аватара пользователя
Andrey777
 
Сообщения: 147
Зарегистрирован: 09 янв 2012, 03:38
Благодарил (а): 35 раз.
Поблагодарили: 8 раз.

Re: В mapchooser добавить вывод время  [Решено]

Сообщение Papito » 12 апр 2017, 17:43

я хотел через сет таск сделать, допустим карта идет 30мин = 1800 сек, а показать сообщение через 1500 сек. Тоесть 5 минут останется до голосование и будет оповещение.

Добавлено спустя 7 минут 37 секунд:
применил твой метод, не знаю что получится, тесть:
Код: Выделить всё
#include <amxmodx>

/* Настройки */
#define BLOCK_MAPS     5    // Количество последних сыгранных карт
#define VOTE_TIME    15    // Время голосования
#define MAP_ON_VOTE    7    // Карт в меню голосования

#define ROCK_THE_VOTE        // Функция rtv 
#define RTV_DELAY    180    // Задержка о начала карты для использования rtv функции (в секундах)
#define RTV_PERCENTS    60    // Процент голосов

#define NOMINATE        // Функция номинаций
#define NOM_MAX        7    // Максимум карт для номинации
#define NOM_PLAYER    2    // Максимум карт для номинации одним игроком
#define SAY_MAPS        // Команда /maps
#define NOM_WITH_PREFIXES    // Номинация карты без префиксов(de_dust2 можно номинировать как dust2)

#define MAX_EXTENDS    8    // Количество продлений
#define EXTEND_TIME    30    // Время одного продления

//#define SHOW_TIMELEFT        // Показывать в чате в начале раунда, сколько осталось до конца карты

#define ADMIN_ROCK_THE_VOTE    // Досрочное голосование у админов
#define ADMIN_RTV_TIME    1    
    // Сколько времени нужно играть на карте, чтобы можно было вызвать досрочное для админов
    // Команда в консоль сервера и админы с флагом ADMIN_RCON("l") имеют иммунитет к данной настройке
    // Закомментируйте, чтобы было доступно всегда

#define SHOW_MENU_WITH_PERCENTS // Показывать результаты с процентами голосов после выбора карты при голосовании

#define ADMIN_DUAL_VOTE    // Голос админа(ADMIN_MAP) и VIP(ADMIN_LEVEL_H) имеют вес двух голосов 
//#define ONLY_GAME_PLAYERS    // Считать только реальных игроков. Спектров не учитывать.
//#define BLOCK_CHATS        // Блокировать VOICE и TEXT чаты на время голосования

#define VSEM_SPS_SOUND      "misc/Realboys/vsem_sps.wav" 
    // Звук в 3 сек перед сменой карты. 
    // Закомментируйте или удалите строку, если не требуется

// #define NO_ROUND_SUPPORT    // Режим работы в realtime. Для серверов CSDM

// #define NIGHTMODE
    // Ночной список карт. НЕ работает блокировка карт, сортировка по онлайну и номинации
    // Map List addons/amxmodx/configs/nmaps.ini | Просто список карт и все | ФАЙЛ НУЖНО СОЗДАТЬ САМОМУ!!!
#define BLOCK_CMDS        // Блокировать команды
#define NIGHT_START    1    // Начало ночного режима
#define NIGHT_END    10    // Окончание ночного режима

// ˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅ PLEASE, NOT EDIT IT'S CODE ˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅ 
// ˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅
#if !defined NIGHTMODE && defined BLOCK_CMDS
    #undef BLOCK_CMDS
#endif
#if !defined NOMINATE && defined NOM_WITH_PREFIXES
    #undef NOM_WITH_PREFIXES
#endif
// ˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄
// ˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄ PLEASE, NOT EDIT IT'S CODE ˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄

#if defined BLOCK_CMDS
    
new g_szBlockCMDs[][] = { "amx_map""amx_votemap""amx_votemapmenu" };
    
// Команды для блокировки во время ночного режима
    // Чтобы работала блокировка команд, нужно прописывать mapchooser  в plugins.ini выше плагина который выполняет эту команду!
#endif
#if defined NOM_WITH_PREFIXES
    
new const g_szMapPrefixes[][] = { "de_""cs_""as_" };
    
// Префиксы карт, используемые для быстрой номинации
#endif
new g_iColors[3] = { 5025550 };  // R G B цвет для HUD отсчета
new Float:g_fPos[2] = { -1.00.6 }; // X и Y координаты в HUD отсчета

/* Словарь плагина */
#define MSG_NOMINATE_BLOCKED         "^1[^4RB|18+|^1] ^4Карта была ^3недавно ^4сыграна!"
#define MSG_NOMINATE_DISABLE         "^1[^4RB|18+|^1] ^3Номинация ^4недоступна. ^3Последний ^4Раунд!"
#define MSG_NOMINATE_MAX_MAP_PL     "^1[^4RB|18+|^1] ^4Вы уже номинировали ^3максимум ^4карт ^3[^4%d^3]"
#define MSG_NOMINATE_MAX_MAP_ALL     "^1[^4RB|18+|^1] ^4Уже номинировано ^3максимум ^4карт ^3[^4%d^3]"
#define MSG_NOMINATE_MAP_NOMINATED    "^1[^4RB|18+|^1] ^4Данная ^3карта ^4номинирована!"
#define MSG_NOMINATE_PL_NOMINATEMAP    "^1[^4RB|18+|^1] ^3%s ^4номинировал карту ^3%s"
#define MSG_RTV_BLOCKED0        "^1[^4RB|18+|^1] ^4Смена ^3карты ^4будет доступна менее, чем через ^3минуту^4!"
#define MSG_RTV_BLOCKED            "^1[^4RB|18+|^1] ^4Смена ^3карты ^4будет доступна через ^3%d ^4мин!"
#define MSG_RTV_PL_VOTED        "^1[^4RB|18+|^1] ^4Вы уже голосовали! Осталось ^3%d ^4голосов"
#define MSG_RTV_PL_VOTE            "^1[^4RB|18+|^1] ^3%s ^4проголосовал за смену ^3карты. ^4Осталось ^3%d ^4голосов"
#define MSG_RTV_VOTE_START        "^1[^4RB|18+|^1] ^4Все голоса за ^3досрочную смену карты ^4набраны. ^3Последний ^4Раунд!"
#define MSG_ADMIN_RTV            "^1[^4RB|18+|^1] ^4Администратор ^3%s ^4запустил смену карты. ^3Последний ^4Раунд!"

#define MSG_CMD_FFIRE            "^1[^4RB|18+|^1] ^4На сервере ^3огонь ^4по своим  ^3%s"
#define MSG_CMD_THETIME            "^1[^4RB|18+|^1] ^4Текущее время ^3%s"
#define MSG_CMD_NEXTMAP            "^1[^4RB|18+|^1] ^4Следующая карта еще ^3не определена ^1:("
#define MSG_CMD_TIMELEFT0        "^1[^4RB|18+|^1] ^4Карта ^3не ограничена ^4по времени"
#define MSG_CMD_TIMELEFT        "^1[^4RB|18+|^1] ^4До конца ^3карты ^4осталось ^3%d ^4мин ^3%02d ^4сек"

#define MSG_TIMELEFT_ON_ROUNDSTART    "^1[^4RB|18+|^1] ^4До конца ^3карты ^4осталось ^3%d ^4мин ^3%02d ^4сек%s"
#define MSG_NOTIMELIMIT_ON_ROUNDSTART    "^1[^4RB|18+|^1] ^4Карта ^3не ограничена ^4по времени"
#define MSG_TIMELEFT_ADD_LASTRND    "^3последний ^4Раунд!"
#define MSG_CMD_TIMELEFT_LAST_RND    "^1[^4RB|18+|^1] ^4Карта окончена. ^3Последний ^4Раунд!"

#define MSG_TIME_TO_VOTE        "До голосования осталось %d сек!"

#define MSG_VOTEMAP_PL_EXT        "^1[^4RB|18+|^1] ^4Игрок ^3%s ^4выбрал ^3продление карты"
#define MSG_VOTEMAP_PL_MAP        "^1[^4RB|18+|^1] ^4Игрок ^3%s ^4выбрал карту ^3%s"

#define MSG_VOTE_END_NOVOTES        "^1[^4RB|18+|^1] ^4Никто ^3не проголосовал! ^4Cлучайная карта ^3%s"
#define MSG_VOTE_END_EXTENDED        "^1[^4RB|18+|^1] ^4Голосование ^3завершено! ^4Карта продлена на ^3%d ^4минут!"
#define MSG_VOTE_END_NEXTMAP        "^1[^4RB|18+|^1] ^4Голосование ^3завершено! ^4Cледующая карта ^3%s"

#define MSG_NIGHT_BLOCK_CMD        "^1[^4RB|18+|^1] ^4Данная команда ^3заблокирована ^4в ^1ночном ^4режиме!"


/* Размерности массивов */
#define MAP_LENGTH  32
#define NAME_LENGTH 32

enum _:aMAPS
{
    
map[MAP_LENGTH],
    
minpl,
    
maxpl
}

new 
Trie:g_tBlockMaps;
#if defined NOMINATE
    
new Trie:g_tAllowMaps;
    
#if defined SAY_MAPS
        
new g_iMapsMenu;
    
#endif
#else
    #if defined SAY_MAPS
        #undef SAY_MAPS
    #endif    
#endif
new Array:g_arrAllowMaps;
#if defined NIGHTMODE
    
new Array:g_arrNightMaps;
    new 
g_iNumNightMaps;
#endif
new g_szCurrentMap[MAP_LENGTH];

new 
g_iMapSortedByOnline = -1;
new 
g_iNumLoadMaps;

new 
g_iVoteItems;
new 
g_iMenuItemId[MAP_ON_VOTE+1];
new 
g_iSelectedItem[MAP_ON_VOTE+2];
new 
g_szMenuMapName[MAP_ON_VOTE+2][MAP_LENGTH];
#if defined ROCK_THE_VOTE || (defined ADMIN_ROCK_THE_VOTE && defined ADMIN_RTV_TIME)
    
new g_iStartMap;
#endif
#if defined ROCK_THE_VOTE
    
new g_iRtvVotes;
#endif
#if defined NOMINATE
    
new g_iNominated[NOM_MAX+1];
    new 
g_iNominateNum;
    new 
g_iNominate[33];
#endif
#if defined SHOW_MENU_WITH_PERCENTS
    
new g_iVotes;
    new 
g_iTimeOst;
    new 
bool:g_bIsVoted[33];
    new 
g_szPercentMenu[512];
#endif
#if defined BLOCK_CHATS
    
new g_FM_SetClientListening;
#endif
/* cVar pointer's */
new g_pFreezeTimeg_pRoundTimeg_pTimeLimitg_pC4timerg_pChatTime;

/* cVar's data */
new g_iOldFreezeTime;
new 
Float:g_fOldTimeLimitg_iTempTimelimitg_iMapLimit;

/* Bit's */
enum _:st 

    
preVote 1,
    
beInVote,
    
voteStarted,
#if defined NIGHTMODE    
    
nMode,
#endif    
    
blockExt
}
enum _:DATA 
{
#if defined ROCK_THE_VOTE
    
status,
    
rtVoted
#else
    
status    
#endif
}
new 
g_bitData[DATA];
#define    GetBit(%1,%2)    (%1 & (1 << (%2 & 31)))
#define    SetBit(%1,%2)    %1 |= (1 << (%2 & 31))
#define    ResetBit(%1,%2)    %1 &= ~(1 << (%2 & 31))
#define CheckValidMap(%0,%1,%2) (g_iMapSortedByOnline != 1 || szArrayData[%1] <= %0 <= szArrayData[%2])

const TASK_SHOW_PERCENTS 100;

new 
g_szSounds[][] =
{
    
"",
    
"fvox/one",
    
"fvox/two",
    
"fvox/three"
};
#if defined NO_ROUND_SUPPORT || defined BLOCK_CHATS
    #include <fakemeta>
#endif
#if AMXX_VERSION_NUM < 183
    #include <colorchat>
    #define client_disconnected client_disconnect
#endif    
#if defined VSEM_SPS_SOUND
public plugin_precache()
    
precache_sound(VSEM_SPS_SOUND);
#endif
public plugin_init()
{
    
register_plugin("Advanced MapChooser""0.9.1""neygomon");
#if defined NOMINATE || defined BLOCK_CHATS
    
register_clcmd("say",         "ClcmdHookSay");
    
register_clcmd("say_team",     "ClcmdHookSay");
#endif
#if defined SAY_MAPS
    
register_clcmd("say /maps",     "ClcmdSayMaps");
    
register_clcmd("say_team /maps","ClcmdSayMaps");
    
register_clcmd("say maps",     "ClcmdSayMaps");
    
register_clcmd("say_team maps","ClcmdSayMaps");
#endif
#if defined BLOCK_CMDS
    
for(new isizeof g_szBlockCMDsi++)
        
register_clcmd(g_szBlockCMDs[i], "ClcmdBlock");
#endif
#if defined ROCK_THE_VOTE    
    
register_clcmd("say /rtv",     "ClcmdRockTheVote");
    
register_clcmd("say rtv",      "ClcmdRockTheVote");
#endif
#if defined ADMIN_ROCK_THE_VOTE
    
register_concmd("amx_rtv",    "ConCmdAdminRockTheVote"ADMIN_MAP);
#endif
    
register_clcmd("say ff",     "ClcmdFF");
    
register_clcmd("say nextmap",     "ClcmdNextMap");
    
register_clcmd("say timeleft",     "ClcmdTimeLeft");
    
register_clcmd("say thetime",     "ClcmdTheTime");
    
register_clcmd("say /nextmap",     "ClcmdNextMap");
    
register_clcmd("say /timeleft""ClcmdTimeLeft");
    
register_clcmd("say /thetime",     "ClcmdTheTime");
    
register_clcmd("votemap",     "ClcmdVotemap");
#if !defined NO_ROUND_SUPPORT    
    
register_event("HLTV""eventHLTV""a""1=0""2=0");
#else
    #if defined SHOW_TIMELEFT
        #undef SHOW_TIMELEFT
    #endif
    
set_task(60.0"eventHLTV", .flags="b");
#endif    
    
g_pFreezeTimeget_cvar_pointer("mp_freezetime");
    
g_pRoundTime get_cvar_pointer("mp_roundtime");
    
g_pTimeLimit get_cvar_pointer("mp_timelimit");
    
g_pC4timer   get_cvar_pointer("mp_c4timer");
    
g_pChatTime  get_cvar_pointer("mp_chattime");

    
register_menucmd(register_menuid("Map Chooser"), (-1^(-1<<(MAP_ON_VOTE+2))), "mapchooser_handler");
#if defined ROCK_THE_VOTE    
    
g_iStartMap get_systime();
#endif    
}

public 
plugin_cfg()
{
    
g_tBlockMaps TrieCreate();
#if defined NOMINATE    
    
g_tAllowMaps TrieCreate();
#endif    
    
g_arrAllowMaps ArrayCreate(aMAPS);
#if defined NIGHTMODE
    
g_arrNightMaps ArrayCreate(aMAPS);
#endif
    
get_mapname(g_szCurrentMapcharsmax(g_szCurrentMap));

    
LoadBlockMaps();
    
LoadAllowMaps();
}

public 
plugin_end()
{
    if(
g_iOldFreezeTime)
        
set_pcvar_num(g_pFreezeTimeg_iOldFreezeTime);
    if(
g_fOldTimeLimit 0.0)
        
set_pcvar_float(g_pTimeLimitg_fOldTimeLimit);
    
    
TrieDestroy(g_tBlockMaps);
#if defined NOMINATE    
    
TrieDestroy(g_tAllowMaps);
#endif    
    
ArrayDestroy(g_arrAllowMaps);
#if defined NIGHTMODE
    
ArrayDestroy(g_arrNightMaps);
#endif    
}

public 
client_disconnected(id)
{
#if defined ROCK_THE_VOTE    
    
if(GetBit(g_bitData[rtVoted], id))
    {
        
g_iRtvVotes--;
        
ResetBit(g_bitData[rtVoted], id);
    }
#endif    
#if defined NOMINATE    
    
g_iNominate[id] = 0;
#endif    
}
#if defined BLOCK_CHATS
public FM_SetClientListening_Pre(iRecviSenderlisten)
{
    if(
iRecv == iSender)
        return 
FMRES_IGNORED;
    
    
engfunc(EngFunc_SetClientListeningiRecviSenderfalse);
    
forward_return(FMV_CELLfalse);
    return 
FMRES_SUPERCEDE;
}
#endif
#if defined NOMINATE || defined BLOCK_CHATS
public ClcmdHookSay(id)
{
#if defined BLOCK_CHATS
    
if(GetBit(g_bitData[status], preVote) || GetBit(g_bitData[status], beInVote))
        return 
PLUGIN_HANDLED;
#endif        
#if defined NOMINATE
    #if defined NIGHTMODE
    
if(GetBit(g_bitData[status], nMode))
        return 
PLUGIN_CONTINUE;
    
#endif
    
static szMessage[MAP_LENGTH+5];
    
read_args(szMessagecharsmax(szMessage));
    
remove_quotes(szMessage);
    
#if defined NOM_WITH_PREFIXES
    
if(!fnNominateMap(idszMessage))
    {
        for(new 
iszMapName[32]; sizeof g_szMapPrefixesi++)
        {
            
formatex(szMapNamecharsmax(szMapName), "%s%s"g_szMapPrefixes[i], szMessage);
            if(
fnNominateMap(idszMapName))
                return 
PLUGIN_HANDLED;
        }
    }
    return 
PLUGIN_CONTINUE;
    
#else
    
return fnNominateMap(idszMessage);
    
#endif
#else
    
return PLUGIN_CONTINUE;    
#endif
}
#endif
#if defined SAY_MAPS
public ClcmdSayMaps(id)
{
#if defined NIGHTMODE
    
if(GetBit(g_bitData[status], nMode))
        return 
PLUGIN_HANDLED;
#endif
    
menu_display(idg_iMapsMenu0);
    return 
PLUGIN_HANDLED;
}        

public 
mapsnominate_handler(idmenuitem)
{
    if(
item != MENU_EXIT)
    {
        new 
_accesscallbackmapp[32];
        
menu_item_getinfo(menuitem_accessmappcharsmax(mapp), .callback callback);
        
fnNominateMap(idmapp);
    }
    return 
PLUGIN_HANDLED;
}

public 
mapsnominate_callback(idmenuitem)
{
    new 
_accesscallbackmapp[32];
    
menu_item_getinfo(menuitem_accessmappcharsmax(mapp), .callback callback);
    new 
aPosTrieGetCell(g_tAllowMapsmappaPos);
    new 
map_nominate[64];
    
formatex(map_nominatecharsmax(map_nominate), "%s \w[\rНоминирована\w]"mapp);
    if (
nominated_map(aPos)) menu_item_setname(menuaPosmap_nominate);
    else 
menu_item_setname(menuaPosmapp);
    return 
nominated_map(aPos) ? ITEM_DISABLED ITEM_ENABLED;
}
#endif
#if defined NOMINATE
fnNominateMap(idmapp[])
{
    static 
aPos;
    if(
TrieKeyExists(g_tBlockMapsmapp))
        return 
client_print_color(idprint_team_defaultMSG_NOMINATE_BLOCKED);
    else if(!
TrieGetCell(g_tAllowMapsmappaPos))
        return 
PLUGIN_CONTINUE;
    else if(
GetBit(g_bitData[status], voteStarted) || GetBit(g_bitData[status], beInVote))
        return 
client_print_color(idprint_team_defaultMSG_NOMINATE_DISABLE);
    else if(
g_iNominate[id] == NOM_PLAYER)
        return 
client_print_color(idprint_team_defaultMSG_NOMINATE_MAX_MAP_PLNOM_PLAYER);
    else if(
g_iNominateNum == NOM_MAX)
        return 
client_print_color(idprint_team_defaultMSG_NOMINATE_MAX_MAP_ALLNOM_MAX); 
    else if(
nominated_map(aPos))
        return 
client_print_color(idprint_team_defaultMSG_NOMINATE_MAP_NOMINATED);
    
    
g_iNominated[g_iNominateNum] = aPos;
    
g_iNominate[id]++;
    
g_iNominateNum++;

    new 
szName[NAME_LENGTH]; get_user_name(idszNamecharsmax(szName));
    return 
client_print_color(0print_team_defaultMSG_NOMINATE_PL_NOMINATEMAPszNamemapp);
}
#endif
#if defined BLOCK_CMDS
public ClcmdBlock(id)
    return 
GetBit(g_bitData[status], nMode) ? client_print_color(0print_team_defaultMSG_NIGHT_BLOCK_CMD) : PLUGIN_CONTINUE;
#endif
#if defined ROCK_THE_VOTE
public ClcmdRockTheVote(id)
{
    if(
GetBit(g_bitData[status], voteStarted) || GetBit(g_bitData[status], beInVote) || !valid_rtv(id))
        return 
PLUGIN_HANDLED;

    if(
GetBit(g_bitData[rtVoted], id))
        
client_print_color(idprint_team_defaultMSG_RTV_PL_VOTEDfloatround(get_playersnum() * RTV_PERCENTS 100.0) - g_iRtvVotes);
    else
    {
        
SetBit(g_bitData[rtVoted], id);
        
g_iRtvVotes++;
        new 
vote floatround(get_playersnum() * RTV_PERCENTS 100.0) - g_iRtvVotes;
        
        if(
vote 0)
        {
            static 
szName[NAME_LENGTH]; get_user_name(idszNamecharsmax(szName));
            
client_print_color(0print_team_defaultMSG_RTV_PL_VOTEszNamevote);
            
log_amx("%s проголосовал за смену карты. Осталось %d голосов"szNamevote);
        }
        else
        {
            
SetBit(g_bitData[status], voteStarted);
            
SetBit(g_bitData[status], blockExt);
    
            
client_print_color(0print_team_defaultMSG_RTV_VOTE_START);
            
log_amx("Досрочное голосование запущено");
        }
    }    
    return 
PLUGIN_HANDLED;
}
#endif
#if defined ADMIN_ROCK_THE_VOTE
public ConCmdAdminRockTheVote(idbitAccess)
{
    if(
GetBit(g_bitData[status], voteStarted) || GetBit(g_bitData[status], preVote) || GetBit(g_bitData[status], beInVote))
        return 
PLUGIN_HANDLED;
#if defined ADMIN_RTV_TIME
    
if(id)
    {
        new 
flags get_user_flags(id);
        if(~
flags ADMIN_RCON)
        {
            if(~
flags bitAccess)
                return 
PLUGIN_HANDLED;

            new 
time = (get_systime() - g_iStartMap) / 60;
            if(
ADMIN_RTV_TIME time)
            {
                
client_print_color(idprint_team_default"^1[^4RB|18+|^1] ^3Досрочное голосование ^4будет доступно через ^3%d ^4мин"ADMIN_RTV_TIME time);
                return 
PLUGIN_HANDLED;
            }
        }
    }
#endif    
    
SetBit(g_bitData[status], voteStarted);
    
SetBit(g_bitData[status], blockExt);

    new 
szName[32]; get_user_name(idszNamecharsmax(szName));
    
client_print_color(0print_team_defaultMSG_ADMIN_RTVszName);
    
log_amx("Администратор %s запустил досрочную смену карты"szName);
    return 
PLUGIN_HANDLED;
}                
#endif
public ClcmdFF(id)
    return 
client_print_color(idprint_team_defaultMSG_CMD_FFIREget_cvar_num("mp_friendlyfire") ? "разрешен" "запрещен");

public 
ClcmdTheTime(id)
{
    new 
time[64]; get_time ("%H:%M:%S | %d.%m.%Y"timecharsmax(time));
    return 
client_print_color(idprint_team_defaultMSG_CMD_THETIMEtime);
}

public 
ClcmdNextMap(id)
    return 
client_print_color(idprint_team_defaultMSG_CMD_NEXTMAP);

public 
ClcmdTimeLeft(id)
{
    if(
GetBit(g_bitData[status], voteStarted))
    {
        return 
client_print_color(idprint_team_defaultMSG_CMD_TIMELEFT_LAST_RND);
    }

    new 
get_timeleft();
    if(
0) return client_print_color(idprint_team_defaultMSG_CMD_TIMELEFT, (60), (60));
    return 
client_print_color(idprint_team_defaultMSG_CMD_TIMELEFT0);
}

public 
ClcmdVotemap()
    return 
PLUGIN_HANDLED;

public 
eventHLTV()
{
    if(
GetBit(g_bitData[status], voteStarted))
    {
        
ResetBit(g_bitData[status], voteStarted);
        
StartVote();
        return;
    }    
#if defined NIGHTMODE    
    
if(g_iNumNightMaps)
    {
        new 
iHourtime(iHour);
        if(
NIGHT_START NIGHT_END && (iHour >= NIGHT_START || iHour NIGHT_END)) // thx radius_r16
            
SetBit(g_bitData[status], nMode);
        else if(
NIGHT_START <= iHour NIGHT_END)
            
SetBit(g_bitData[status], nMode);
        else    
ResetBit(g_bitData[status], nMode);
    }
#endif
    
new Float:fTimeLimit get_pcvar_float(g_pTimeLimit);
    new 
Float:fRoundTime get_pcvar_float(g_pRoundTime);

    new 
get_timeleft();
    if((
fRoundTime 60 VOTE_TIME 2) > float(a) && fTimeLimit)
    {
        
g_iTempTimelimit floatround(fTimeLimit);
        if(
g_fOldTimeLimit == 0.0)
        {
            
g_fOldTimeLimit fTimeLimit;
            
g_iMapLimit g_iTempTimelimit MAX_EXTENDS EXTEND_TIME;
        }
        if(
g_iTempTimelimit >= g_iMapLimit)
        {
            if(!
GetBit(g_bitData[status], blockExt))
                
SetBit(g_bitData[status], blockExt);
        }
        
        
SetBit(g_bitData[status], voteStarted);

        new 
Float:fAddTime = (fRoundTime 60 get_pcvar_float(g_pC4timer) + get_pcvar_float(g_pChatTime) + VOTE_TIME 60) / 60;
        
set_pcvar_float(g_pTimeLimitfTimeLimit fAddTime);
    }
    
    if(
<= 360 && >= 240)
    {
        
client_print_color(0print_team_defaultMSG_CMD_TIMELEFT, (60), (60));
    }
    
#if defined SHOW_TIMELEFT
    
if(0)
    {
        
client_print_color(0print_team_defaultMSG_TIMELEFT_ON_ROUNDSTART
            (
60), (60), GetBit(g_bitData[status], voteStarted) ? MSG_TIMELEFT_ADD_LASTRND "");
    }        
    else    
client_print_color(0print_team_defaultMSG_NOTIMELIMIT_ON_ROUNDSTART);
#endif    
}

public 
StartVote()
{
    if(!
g_iOldFreezeTime
        
g_iOldFreezeTime get_pcvar_num(g_pFreezeTime);

    
SetBit(g_bitData[status], preVote);
    
//ScreenFade(1);
    
FrozenUsers(1);
    
    
set_task(1.0"ShowTimer", .flags "a", .repeat 4);
}

public 
ShowTimer()
{
    static 
timer 3;
    switch(
timer)
    {
        case 
0:
        {
            
timer 3;
            
ShowVoteMenu();
        }    
        default:
        {
            
set_hudmessage(g_iColors[0], g_iColors[1], g_iColors[2], g_fPos[0], g_fPos[1], 00.01.00.00.04);
            
show_hudmessage(0MSG_TIME_TO_VOTEtimer);
            
client_cmd(0"spk %s"g_szSounds[timer--]);
        }
    }
}

public 
ShowVoteMenu()
{
    
g_iVoteItems 0;
#if defined SHOW_MENU_WITH_PERCENTS    
    
g_iVotes 0;
    
arrayset(g_bIsVotedfalsesizeof g_bIsVoted);
#endif    
    
ResetBit(g_bitData[status], preVote);
    
SetBit(g_bitData[status], beInVote);
#if defined NIGHTMODE
    
new maxMaps GetBit(g_bitData[status], nMode) ? g_iNumNightMaps g_iNumLoadMaps;
#else
    
new maxMaps g_iNumLoadMaps;
#endif
    
new maxVoteMap = (MAP_ON_VOTE maxMaps) ? maxMaps MAP_ON_VOTE;
    new 
szMenu[512], szArrayData[aMAPS];
    new 
iKeysiLen;
    new 
item;
    new 
plrsnum;    
#if defined ONLY_GAME_PLAYERS    
    
new pl[32], pnum;
    
get_players(plpnum"e""TERRORIST"); plrsnum pnum;
    
get_players(plpnum"e""CT");      plrsnum += pnum;
#else
    
plrsnum get_playersnum();
#endif
    
iLen formatex(szMenucharsmax(szMenu), "\d[\rГолосование|18+|\d] \yВыберите карту^n^n");
#if defined NOMINATE
    #if defined NIGHTMODE
    
if(!GetBit(g_bitData[status], nMode) && g_iNominateNum)
    
#else
    
if(g_iNominateNum)
    
#endif
    
{
        for(new 
ig_iNominateNumi++)
        {
            
ArrayGetArray(g_arrAllowMapsg_iNominated[i], szArrayData);
            if(!
CheckValidMap(plrsnumminplmaxpl))
                continue;
            
            
g_iMenuItemId[g_iVoteItems] = g_iNominated[i];
            
copy(g_szMenuMapName[g_iVoteItems], charsmax(g_szMenuMapName[]), szArrayData[map]);
            
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen"\r%d. \w%s^n"g_iVoteItems+1g_szMenuMapName[g_iVoteItems]);
            
iKeys |= (<< g_iVoteItems++);
        }
    }
#endif
    
while(maxVoteMap g_iVoteItems)
    {
        do 
item random(maxMaps);
        while(
item_in_menu(item));
        
        
g_iMenuItemId[g_iVoteItems] = item;
    
#if defined NIGHTMODE
        
if(GetBit(g_bitData[status], nMode))
        {
            
ArrayGetArray(g_arrNightMapsitemszArrayData);
            
copy(g_szMenuMapName[g_iVoteItems], charsmax(g_szMenuMapName[]), szArrayData[map]);
            
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen"\r%d. \w%s^n"g_iVoteItems+1g_szMenuMapName[g_iVoteItems]);
            
iKeys |= (<< g_iVoteItems++);
        }
        else
        {
            
ArrayGetArray(g_arrAllowMapsitemszArrayData);
            if(!
CheckValidMap(plrsnumminplmaxpl))
                continue;
            
            
copy(g_szMenuMapName[g_iVoteItems], charsmax(g_szMenuMapName[]), szArrayData[map]);
            
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen"\r%d. \w%s^n"g_iVoteItems+1g_szMenuMapName[g_iVoteItems]);
            
iKeys |= (<< g_iVoteItems++);
        }
    
#else
        
ArrayGetArray(g_arrAllowMapsitemszArrayData);
        if(!
CheckValidMap(plrsnumminplmaxpl))
            continue;
            
        
copy(g_szMenuMapName[g_iVoteItems], charsmax(g_szMenuMapName[]), szArrayData[map]);
        
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen"\r%d. \w%s^n"g_iVoteItems+1g_szMenuMapName[g_iVoteItems]);
        
iKeys |= (<< g_iVoteItems++);
    
#endif
    
}
    if(!
GetBit(g_bitData[status], blockExt))
    {
        
formatex(szMenu[iLen], charsmax(szMenu) - iLen"^n\r%d. \w%s \d[\rПродлить\d]"g_iVoteItems+1g_szCurrentMap);
        
iKeys |= (<< g_iVoteItems);
    }
    
    
show_menu(0iKeysszMenuVOTE_TIME"Map Chooser");
    
    
client_cmd(0"spk Gman/Gman_Choose2");
    
log_amx("[Start VoteMap] Голосование началось...");
#if defined SHOW_MENU_WITH_PERCENTS
    
g_iTimeOst VOTE_TIME;
    
set_task(1.0"ShowCacheMenu"TASK_SHOW_PERCENTS, .flags "a", .repeat VOTE_TIME);
#else
    
set_task(float(VOTE_TIME), "GoToCheckVotes");
#endif
}

public 
mapchooser_handler(idiKey)
{
    static 
szName[NAME_LENGTH]; 
    
get_user_name(idszNamecharsmax(szName));

    if(
iKey == g_iVoteItems)
        
client_print_color(0idMSG_VOTEMAP_PL_EXTszName);
    else     
client_print_color(0idMSG_VOTEMAP_PL_MAPszNameg_szMenuMapName[iKey]);
#if defined ADMIN_DUAL_VOTE
    
if(get_user_flags(id) & (ADMIN_MAP|ADMIN_LEVEL_H))
    {
        
g_iSelectedItem[iKey] += 2;
        
#if defined SHOW_MENU_WITH_PERCENTS
        
g_iVotes += 2;
        
#endif
    
}
    else
    {
        
g_iSelectedItem[iKey]++;
        
#if defined SHOW_MENU_WITH_PERCENTS
        
g_iVotes++;
        
#endif
    
}
#else
    
g_iSelectedItem[iKey]++;
#endif
#if defined SHOW_MENU_WITH_PERCENTS
    
g_bIsVoted[id] = true;
    
#if !defined ADMIN_DUAL_VOTE
    
g_iVotes++;
    
#endif
    
ShowCacheMenu(id);
#endif
    
return PLUGIN_HANDLED;
}
#if defined SHOW_MENU_WITH_PERCENTS
public ShowCacheMenu(id)
{
    if(
id == TASK_SHOW_PERCENTS)
    {
        
g_iTimeOst--;
        if(!
g_iTimeOst)
        {
            
show_menu(00"^n"1);
            
GoToCheckVotes();
        }
        else
        {
            new 
len formatex(
                
g_szPercentMenucharsmax(g_szPercentMenu), 
                
"\d[\rГолосование|18+|\d] \yВы уже проголосовали^n\wДо конца голосования осталось \r%d \wсек!^n^n",
                
g_iTimeOst
            
);

            for(new 
ig_iVoteItemsi++)
            {
                
len += formatex(
                    
g_szPercentMenu[len], charsmax(g_szPercentMenu) - len
                    
"\r%d. \w%s \d[\y%d%%\d]^n"
                        
i+1g_szMenuMapName[i], g_iVotes floatround(g_iSelectedItem[i] * 100.0 g_iVotes) : 0
                
);
            }
            
            if(!
GetBit(g_bitData[status], blockExt))
            {
                
len += formatex(
                    
g_szPercentMenu[len], charsmax(g_szPercentMenu) - len
                    
"^n\r%d. \w%s \d[\rПродлить\d][\y%d%%\d]"
                        
g_iVoteItems+1g_szCurrentMapg_iVotes floatround(g_iSelectedItem[g_iVoteItems] * 100.0 g_iVotes) : 0
                
);
            }
#define KEY (1 << 10)
        #if AMXX_VERSION_NUM < 183
            
static MaxClients; if(!MaxClientsMaxClients get_maxplayers();
        
#endif
            
for(new id 1id <= MaxClientsid++)
            {
                if(!
g_bIsVoted[id])
                    continue;
                if(!
is_user_connected(id))
                {
                    
g_bIsVoted[id] = false;
                    continue;
                }
                
                
show_menu(idKEYg_szPercentMenu, -1"ShowPercentMenu");
            }
        }
    }
    else    
show_menu(idKEYg_szPercentMenu, -1"ShowPercentMenu");
}
#endif
public GoToCheckVotes()
{
    new 
x;
    for(new 
iMAP_ON_VOTE+1i++)
        if(
g_iSelectedItem[x] < g_iSelectedItem[i])
            
i;

    if(!
g_iSelectedItem[x])
    {
        new 
mp random(g_iVoteItems);
        
client_print_color(0print_team_defaultMSG_VOTE_END_NOVOTESg_szMenuMapName[mp]);
        
log_amx("[End VoteMap] Никто не голосовал. Случайная карта %s"g_szMenuMapName[mp]);
        
ChangeLevel(g_szMenuMapName[mp]);

    }
    else if(
g_iSelectedItem[x] == g_iSelectedItem[g_iVoteItems])
    {
        
client_print_color(0print_team_defaultMSG_VOTE_END_EXTENDEDEXTEND_TIME);
        
log_amx("[End VoteMap] Голосование завершено. Карта %s была продлена на %d минут"g_szCurrentMapEXTEND_TIME);
#if defined NOMINATE
        
g_iNominateNum 0;
        
arrayset(g_iNominate0sizeof g_iNominate);
        
arrayset(g_iNominated0sizeof g_iNominated);
#endif        
        
arrayset(g_iSelectedItem0sizeof g_iSelectedItem);
        
ResetBit(g_bitData[status], beInVote);
        
ResetBit(g_bitData[status], blockExt);
        
        
set_pcvar_float(g_pTimeLimitfloat(g_iTempTimelimit EXTEND_TIME));
        
//ScreenFade(0);
    
}
    else
    {
        
client_print_color(0print_team_defaultMSG_VOTE_END_NEXTMAPg_szMenuMapName[x]);
        
log_amx("[End VoteMap] Голосование завершено %s"g_szMenuMapName[x]);
        
ChangeLevel(g_szMenuMapName[x]);
    }
    
FrozenUsers(0);
}

LoadBlockMaps()
{
    new 
szPath[75];
    
get_localinfo("amxx_datadir"szPathcharsmax(szPath));
    
add(szPathcharsmax(szPath), "/block_maps.ini");

    new 
fp fopen(szPath"rt");
    new 
1;
    new 
szBuffer[BLOCK_MAPS+1][MAP_LENGTH];
    
    
TrieSetCell(g_tBlockMapsg_szCurrentMap0);
    if(
fp)
    {
        while(!
feof(fp) && BLOCK_MAPS i)
        {
            
fgets(fpszBuffer[i], charsmax(szBuffer[])), trim(szBuffer[i]);
            if(
szBuffer[i][0] && szBuffer[i][0] != ';')
                
TrieSetCell(g_tBlockMapsszBuffer[i], i), i++;
        }
        
fclose(fp);
        
unlink(szPath);
    }
    if(
write_file(szPath"; File generated by Advanced MapChooser!"))
    {
        
copy(szBuffer[0], charsmax(szBuffer[]), g_szCurrentMap);
        for(new 
xix++) write_file(szPathszBuffer[x]);
    }
}

LoadAllowMaps()
{
    new 
szPath[64], szFile[75];
    
get_localinfo("amxx_configsdir"szPathcharsmax(szPath));
    
formatex(szFilecharsmax(szFile), "%s/map_list.ini"szPath);

    new 
fp fopen(szFile"rt");
    if(!
fp)
    {
        new 
fmt[128]; formatex(fmtcharsmax(fmt), "Файл %s не найден, либо невозможно открыть!"szFile);
        
set_fail_state(fmt);
    }

    new 
szBuffer[MAP_LENGTH 10], szMinpl[3], szMaxpl[3];
    new 
szArrayData[aMAPS];
    new 
iNumParams;
#if defined NOMINATE    
    
new i;
#endif
#if defined SAY_MAPS
    
g_iMapsMenu menu_create("\d[\rНоминации \yRB|18+|\d]^n\wВыберите карту\r""mapsnominate_handler");
    new 
callback menu_makecallback("mapsnominate_callback");
    
menu_setprop(g_iMapsMenuMPROP_EXITNAME"Выход");
    
menu_setprop(g_iMapsMenuMPROP_NEXTNAME"Вперед");
    
menu_setprop(g_iMapsMenuMPROP_BACKNAME"Назад");
#endif
    
while(!feof(fp))
    {
        
fgets(fpszBuffercharsmax(szBuffer));
        if(!
szBuffer[0] || szBuffer[0] == ';')
            continue;

        
iNumParams parse(
            
szBuffer
            
szArrayData[map], charsmax(szArrayData[map]), 
            
szMinplcharsmax(szMinpl), 
            
szMaxplcharsmax(szMaxpl)
        );

        if(!
iNumParams)
            continue;
        if(!
valid_map(szArrayData[map]))
            continue;

        switch(
iNumParams)
        {
            case 
1:
            {

                if(
g_iMapSortedByOnline == 1)
                    continue;

                
ArrayPushArray(g_arrAllowMapsszArrayData);
                
g_iMapSortedByOnline 0;
#if defined NOMINATE                
                
TrieSetCell(g_tAllowMapsszArrayData[map], i); i++;
#endif    
#if defined SAY_MAPS
                
menu_additem(g_iMapsMenuszArrayData[map], szArrayData[map], 0callback);
#endif                
            
}
            case 
3:
            {
                if(
g_iMapSortedByOnline == 0)
                    continue;

                
szArrayData[minpl] = str_to_num(szMinpl);
                
szArrayData[maxpl] = str_to_num(szMaxpl);
                
ArrayPushArray(g_arrAllowMapsszArrayData);
                
g_iMapSortedByOnline 1;
#if defined NOMINATE                
                
TrieSetCell(g_tAllowMapsszArrayData[map], i); i++;
#endif
#if defined SAY_MAPS
                
menu_additem(g_iMapsMenuszArrayData[map], szArrayData[map], 0callback);
#endif    
            
}
        }
    }
    
fclose(fp);

    
g_iNumLoadMaps ArraySize(g_arrAllowMaps);
    
    
log_amx("Загружено %d карт из %s"g_iNumLoadMapsszFile);
    
log_amx("Режим сортировки карт по онлайну %s!"g_iMapSortedByOnline "включен" "выключен");
#if defined NIGHTMODE
    
formatex(szFilecharsmax(szFile), "%s/nmaps.ini"szPath);
    
fp fopen(szFile"rt");
    if(
fp)
    {
        while(!
feof(fp))
        {
            
fgets(fpszBuffercharsmax(szBuffer));
            if(!
szBuffer[0] || szBuffer[0] == ';')
                continue;
            
            
parse(szBufferszArrayData[map], charsmax(szArrayData[map]));
            
ArrayPushArray(g_arrNightMapsszArrayData);
        }
        
fclose(fp);

        
g_iNumNightMaps ArraySize(g_arrNightMaps);
        
log_amx("Загружено %d карт для NightMode[%d - %d] из %s"g_iNumNightMapsNIGHT_STARTNIGHT_ENDszFile);
    }    
#endif
}

public 
ScreenFade(fade)
{
    new 
flags;
    new 
time = (<= fade <= 1) ? 4096 1;
    new 
hold = (<= fade <= 1) ? 1024 1;
    static 
mScreenFade; if(!mScreenFademScreenFade get_user_msgid("ScreenFade");
    
    switch(
fade)
    {
        case 
0:
        {
            
flags 2;
            
set_msg_block(mScreenFadeBLOCK_NOT);
        }
        case 
1:
        {
            
flags 1;
            
set_task(1.0"ScreenFade"2);
        }
        case 
2:
        {
            
flags 4;
            
set_msg_block(mScreenFadeBLOCK_SET);
        }
    }
    
    
message_begin(MSG_ALLmScreenFade);
    
write_short(time);
    
write_short(hold);
    
write_short(flags);
    
write_byte(0);
    
write_byte(0);
    
write_byte(0);
    
write_byte(255);
    
message_end();
}

FrozenUsers(frozen)
{
#if defined NO_ROUND_SUPPORT
    
new players[32], pnum;
    
get_players(playerspnum);
#endif
    
if(frozen)
    {
    
#if defined NO_ROUND_SUPPORT
        
for(new ipnumi++)
            
set_pev(players[i], pev_flagspev(players[i], pev_flags) | FL_FROZEN);
    
#else
        
set_pcvar_num(g_pFreezeTimeVOTE_TIME 5);
    
#endif
    #if defined BLOCK_CHATS
        
g_FM_SetClientListening register_forward(FM_Voice_SetClientListening"FM_SetClientListening_Pre"false);
    
#endif
    
}
    else
    {
    
#if defined NO_ROUND_SUPPORT
        
for(new ipnumi++)
            
set_pev(players[i], pev_flagspev(players[i], pev_flags) & ~FL_FROZEN);
    
#else
        
set_pcvar_num(g_pFreezeTimeg_iOldFreezeTime);
    
#endif
    #if defined BLOCK_CHATS    
        
unregister_forward(FM_Voice_SetClientListeningg_FM_SetClientListeningfalse);
    
#endif
    
}
}

ChangeLevel(mp[])
{
#if defined VSEM_SPS_SOUND
    
client_cmd(0"spk %s"VSEM_SPS_SOUND);
#endif
    
emessage_begin(MSG_ALLSVC_INTERMISSION);
    
emessage_end();

    
set_task(3.0"SendCmd", .parameter mp, .len strlen(mp) + 1);
}

public 
SendCmd(mp[])
    
server_cmd("changelevel %s"mp);
    
stock bool:valid_map(mp[])
{
    if(!
is_map_valid(mp))
        return 
false;
    if(
TrieKeyExists(g_tBlockMapsmp))
        return 
false;

    return 
true;
}
stock bool:item_in_menu(mapid)
{
    for(new 
ig_iVoteItemsi++)
        if(
g_iMenuItemId[i] == mapid)
            return 
true;
    return 
false;
}
stock bool:nominated_map(mapid)
{
    for(new 
ig_iNominateNumi++)
        if(
g_iNominated[i] == mapid)
            return 
true;
    return 
false;        
}
stock bool:valid_rtv(id)
{
    new 
iEstTime get_systime() - g_iStartMap;
    if(
iEstTime RTV_DELAY)
        return 
true;

    new 
frmt[190]; 
    new 
temp = (RTV_DELAY iEstTime) / 60;

    if(
temp 1)     formatex(frmtcharsmax(frmt), MSG_RTV_BLOCKED0);
    else         
formatex(frmtcharsmax(frmt), MSG_RTV_BLOCKEDtemp);

    
client_print_color(idprint_team_defaultfrmt);
    return 
false;
Аватара пользователя
Papito
 
Сообщения: 545
Зарегистрирован: 09 ноя 2012, 16:28
Откуда: Montana
Благодарил (а): 44 раз.
Поблагодарили: 121 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter Strike 1.6
SAMP

Re: В mapchooser добавить вывод время

Сообщение Andrey777 » 12 апр 2017, 19:37

Papito, Ну можно и так. Сделайте так, карта идет да 30 мин.

Добавлено спустя 37 секунд:
Хорошо щас попробую.

Добавлено спустя 1 час 52 минуты 7 секунд:
Papito, Да спасибо, все нормально.
Аватара пользователя
Andrey777
 
Сообщения: 147
Зарегистрирован: 09 янв 2012, 03:38
Благодарил (а): 35 раз.
Поблагодарили: 8 раз.

Re: В mapchooser добавить вывод время

Сообщение MayroN » 17 июл 2017, 02:40

Кстати,может для кого-то будет полезная инфа.

Если Вы хотите что-бы показывало больше карт при голосовании ( не 5 а например 9 ) измините етот параметер :

Код: Выделить всё
#define SELECTMAPS  5   


где "5" - ето количество карт.

МультиМод CS
Аватара пользователя
MayroN
 
Сообщения: 673
Зарегистрирован: 10 окт 2010, 18:23
Откуда: Украина, г. Белая Церковь
Благодарил (а): 149 раз.
Поблагодарили: 86 раз.
Опыт программирования: Около года
Языки программирования: На которых говорю...

Пред.

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 11