Настройка achievement сервера.

pihmih

Участник
Сообщения
512
Реакции
23
Здравствуйте. Как настроить сервер achievement? Какой режим сервера нужен?
 

Sam_Fisher

Участник
Сообщения
703
Реакции
203
Качаешь нужную карту и все. Никакие режимы прописывать не надо. Удаляешь не нужные конфиги и маплисты и радуешься)

Вот так у меня выглядит server.cfg
C-подобный:
//*************************************************************************\\
//*                                                                       *\\
//*                                                                       *\\
//*               SRCDS Team Fortress 2 SERVER CONFIGURATION              *\\
//*                              VERSION 1.0.0                            *\\
//*                          by cyber-hunters.ru                          *\\
//*                                                                       *\\
//*                                                                       *\\
//*************************************************************************\\

say "Loading |Cyber-Hunters.ru| TF2 Achievement Idle SERVER CONFIGURATION"

// Разное

// Определите название вашего сервера, это название будет отображаться во вкладке Интернет в игре.
// По умолчанию: Team Fortress 2 Server
hostname "|Cyber-Hunters.Ru| TF2 Achievement Idle"

// Теги
sv_tags "fastrespawn,moscow,cyber-hunters.ru,SourceBans,HLstats"

// Определите ваш RCon(Remote Console) пароль, часто эта настройка используется для ClanWar серверов.
// Мы рекомендуем не устанавливать здесь ничего, если вы не будете в дальнейшем использовать RCON пароль.
// Не ставьте здесь простые пароли! Используйте большие и малые буквы с цифрами!
// По умолчанию: Нет.
rcon_password ""

// Определите пароль для подключения к вашему серверу, только игроки знающие пароль смогут присоединиться к игре.
// По умолчанию: Нет.
sv_password ""

// Определите максимальный размер для скачиваемой карты (сюда включены звуки, материалы и модели) в мегабайтах.
// если ваша карта превышает предел этой настройки, то она НЕ будет загружаться с вашего сервера.
// Число определяяет максимальный размер файла в MB который сможет скачать клиент.
// По умолчанию: 16
net_maxfilesize "250"

// Определите адрес вашего веб-сайта для использования быстрой загрузки с сервера.
// По умолчанию: Нет.
sv_downloadurl ""


//*************************************************************************\\
//*                                                                       *\\
//*                                                                       *\\
//*                       ВЫПОЛНЕНИЕ КОНФИГОВ                             *\\
//*                        ЗАГРУЗКА СКРИПТОВ                              *\\
//*                                                                       *\\
//*                                                                       *\\
//*************************************************************************\\

// Выполнение и запись файлов содержащих баны.
// Закомментируйте если используете SourceBans.
//exec banned_user.cfg
//exec banned_ip.cfg
//writeid
//writeip

//*************************************************************************\\
//*                                                                       *\\
//*                                                                       *\\
//*                              Настройка                                *\\
//*                        дополнительных модулей                         *\\
//*                                                                       *\\
//*                                                                       *\\
//*************************************************************************\\

sm_fastrespawn_enabled 1
sm_fastrespawn_blu 1
sm_fastrespawn_red 1

sv_contact "cyber-hunters.ru"

sv_lan 0
sv_region -1

//*************************************************************************\\
//*                                                                       *\\
//*                                                                       *\\
//*                              Настройка                                *\\
//*                             HlstatsX:CE                               *\\
//*                                                                       *\\
//*                                                                       *\\
//*************************************************************************\\

//Hlstatsx:CE
log on
logaddress_add IP:PORT

//Hlstatsx:CE Superlogs
log on 
sv_logbans 1
sv_logfile 1
sv_logecho 1 
sv_log_onefile 0
mp_logdetail 3


mapcyclefile "mapcycle.txt"


//*************************************************************************\\
//*                                                                       *\\
//*                                                                       *\\
//*                     Расширенные настройки RCON                        *\\
//*                                                                       *\\
//*                                                                       *\\
//*************************************************************************\\

sv_rcon_banpenalty "0"
sv_rcon_log "1"
sv_rcon_maxfailures "5"
sv_rcon_minfailures "2"
sv_rcon_minfailuretime "30"


tf_flag_caps_per_round "0"
tf_playergib "1"
tf_stats_track "1"
tf_stats_verbose "0"
tf_gamemode_arena "0"
tf_gamemode_payload "0"
tf_weapon_criticals "1"
//
mp_allowNPCs "1"
mp_allowspectators "1"
mp_team_unbalance_limit 0
mp_autocrosshair "1"
mp_autoteambalance "1"
mp_bonusroundtime "15"
mp_chattime "5"
mp_clan_ready_signal "0"
mp_clan_readyrestart "0"
mp_decals "200"
mp_defaultteam "0"
mp_enableroundwaittime "1"
mp_fadetoblack "0"
mp_falldamage "0"
mp_flashlight "0"
mp_footsteps "1"
mp_forcecamera "1"
mp_forcerespawn "1"
mp_fraglimit "0"
mp_friendlyfire 0
mp_idledealmethod "1"
mp_idlemaxtime "3"
mp_maxrounds "1000"
mp_restartgame "0"
mp_restartround "1"
mp_showrespawntimes "1"
mp_stalemate_timelimit "240"
mp_teamlist "0"
mp_teamoverride "1"
mp_teams_unbalance_limit "1"
mp_time_between_capscoring "30"
mp_timelimit 0
mp_tournament 0
mp_waitingforplayers_cancel "0"
mp_waitingforplayers_restart "0"
mp_weaponstay "0"
mp_winlimit "0"
phys_pushscale 15
//
sv_alltalk "1"
sv_pausable "0"
sv_cheats "0"
sv_consistency "1"
sv_allowupload "1"
sv_allowdownload "1"
sv_enableoldqueries "1"
sv_pure "2"
sv_pure_kick_clients "1"
sv_allow_color_correction "1"
sv_allow_wait_command "1"
sv_alternateticks "0"
sv_bonus_challenge "0"
sv_cacheencodedents "1"
sv_clearhinthistory "cmd"
sv_filterban "1"
sv_forcepreload "0"
sv_logbans "1"
sv_logblocks "0"
sv_logdownloadlist "1"
sv_logflush "0"
sv_massreport "0"
sv_master_legacy_mode "1"
sv_master_share_game_socket "1"
sv_noclipaccelerate "5"
//sv_noclipduringpause "0"
sv_noclipspeed "5"
sv_npc_talker_maxdist "1024"
sv_parallel_packentities "1"
sv_parallel_sendsnapshot "1"
sv_specaccelerate "5"
sv_specnoclip "1"
sv_specspeed "3"
sv_stats "1"
sv_maxplayers "20"
sv_visiblemaxplayers "20"

//*************************************************************************\\
//*                                                                       *\\
//*                                                                       *\\
//*                    Пропускная способность канала                      *\\
//*                                                                       *\\
//*                                                                       *\\
//*************************************************************************\\

sv_minrate "13000"
sv_maxrate "30000"
sv_minupdaterate "30"
sv_maxupdaterate "67"
sv_mincmdrate "30"
sv_maxcmdrate "67"
sv_client_cmdrate_difference "30"
sv_client_interpolate "1"
sv_client_max_interp_ratio "1"
sv_client_min_interp_ratio "1"
sv_client_predict "1"
 

The Night Fury

Участник
Сообщения
1,300
Реакции
1,395
Sam_Fisher, ачивки есть на почти всех играх в стиме. Тут вопрос смысла, скорее.
 

TolikCorp

Участник
Сообщения
874
Реакции
334
Там же щас шмот падает. Вот и делают идл и ачивмент серверы.
 

The Night Fury

Участник
Сообщения
1,300
Реакции
1,395
golova209, да. Ящички с пушками, ещё что-то, если не ошибаюсь.
 

Konstantin

Участник
Сообщения
1,775
Реакции
759
Ящики с пушками и сами пушки, как правило хреновые, типа дробовиков.
 

pihmih

Участник
Сообщения
512
Реакции
23
А все таки, как его сделать? Вот к примеру 62.141.42.39:29005
 

TolikCorp

Участник
Сообщения
874
Реакции
334
Зайди к ним на серв, слей карту. Сделай, чтобы карта менялась раз в 600 мин, чтобы застоя не было. Никаких афк и прочих кикеров. Даже можно стандартные СМовские поубирать. Как вариант еще зайдя на тот серв пописать в консоли: sm plugins 11;sm plugins 22;sm plugins 33;sm plugins 44;sm plugins 55;

Добавлено через 1 минуту

Да да, там щас как в тф. Магазин сделали, ящики падают, модельки оружек и прочее.
 
Последнее редактирование:

pihmih

Участник
Сообщения
512
Реакции
23
] sm plugins 11
"SMAC Command Monitor" (0.8.4.0) by SMAC Development Team
"Basic Ban Commands" (1.5.0-dev+3877) by AlliedModders LLC
"Anti-Flood" (1.5.0-dev+3877) by AlliedModders LLC
"[CSGO] Team Limit Bypass" (1.1) by Zephyrus
"Bom Chicka Wah Wah" (1.2) by Zephyrus
"Sound Commands" (1.5.0-dev+3877) by AlliedModders LLC
"Admin Menu" (1.5.0-dev+3877) by AlliedModders LLC
"hideplayers.smx" hideplayers.smx
"quick_adverts.smx" quick_adverts.smx
"MOTDgd Adverts" (2.0.2) by Zephyrus (Modified by Ixel)
"infinite_buytime.smx" infinite_buytime.smx
To see more, type "sm plugins 22"
] sm plugins 22
"instant_respawn.smx" instant_respawn.smx
Таких плагинов нигде нет:
"instant_respawn.smx"
"hideplayers.smx"
"Bom Chicka Wah Wah"
 

deac

Участник
Сообщения
2
Реакции
5
Если не ошибаюсь, должен быть скрипт что типа этого:

#include <sourcemod>
#include <cstrike>
#include <sdktools>

new Handle:g_Timer_One;
new Float:g_cvarRoundTime;
new Float:ForTimer;

public Plugin:myinfo =
{
name = "CS:GO End round",
version = "1.0"
}

public OnPluginStart()
{
HookEvent("round_start", Event_RoundStart);
}

public OnMapStart()
{
g_cvarRoundTime = GetConVarFloat(FindConVar("mp_roundtime"));
ForTimer = (g_cvarRoundTime*60-0.1);
}

public Action:Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
ServerCommand("mp_warmup_end");
g_Timer_One = CreateTimer(ForTimer, Timer_RoundEnd);
}

public Action:Timer_RoundEnd(Handle:timer)
{
new winner = GetRandomInt(1, 2);
if(winner==1){
CS_SetTeamScore(CS_TEAM_CT, 15);
SetTeamScore(CS_TEAM_CT, 15);
CS_SetTeamScore(CS_TEAM_T, 16);
SetTeamScore(CS_TEAM_T, 16);
CS_TerminateRound(0.1, CSRoundEnd_TerroristWin);
} else
if(winner==2){
CS_SetTeamScore(CS_TEAM_CT, 16);
SetTeamScore(CS_TEAM_CT, 16);
CS_SetTeamScore(CS_TEAM_T, 15);
SetTeamScore(CS_TEAM_T, 15);
CS_TerminateRound(0.1, CSRoundEnd_CTWin);
}
KillTimer(g_Timer_One);
}
 
Сообщения
9
Реакции
0
Всем привет, кто знает команду или плагин для мгновенно респа на одном месте mp_respawn_on_death_t 1
mp_respawn_on_death_ct 1

С этими командами просто игроки респяца на респе, а нужно чтоб каждый игрок на одной точке респился.
 

TagerW

Участник
Сообщения
2
Реакции
0
] sm plugins 11
"SMAC Command Monitor" (0.8.4.0) by SMAC Development Team
"Basic Ban Commands" (1.5.0-dev+3877) by AlliedModders LLC
"Anti-Flood" (1.5.0-dev+3877) by AlliedModders LLC
"[CSGO] Team Limit Bypass" (1.1) by Zephyrus
"Bom Chicka Wah Wah" (1.2) by Zephyrus
"Sound Commands" (1.5.0-dev+3877) by AlliedModders LLC
"Admin Menu" (1.5.0-dev+3877) by AlliedModders LLC
"hideplayers.smx" hideplayers.smx
"quick_adverts.smx" quick_adverts.smx
"MOTDgd Adverts" (2.0.2) by Zephyrus (Modified by Ixel)
"infinite_buytime.smx" infinite_buytime.smx
To see more, type "sm plugins 22"
] sm plugins 22
"instant_respawn.smx" instant_respawn.smx
Таких плагинов нигде нет:
"instant_respawn.smx"
"hideplayers.smx"
"Bom Chicka Wah Wah"

Это откуда такой список
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
] sm plugins 11
"SMAC Command Monitor" (0.8.4.0) by SMAC Development Team
"Basic Ban Commands" (1.5.0-dev+3877) by AlliedModders LLC
"Anti-Flood" (1.5.0-dev+3877) by AlliedModders LLC
"[CSGO] Team Limit Bypass" (1.1) by Zephyrus
"Bom Chicka Wah Wah" (1.2) by Zephyrus
"Sound Commands" (1.5.0-dev+3877) by AlliedModders LLC
"Admin Menu" (1.5.0-dev+3877) by AlliedModders LLC
"hideplayers.smx" hideplayers.smx
"quick_adverts.smx" quick_adverts.smx
"MOTDgd Adverts" (2.0.2) by Zephyrus (Modified by Ixel)
"infinite_buytime.smx" infinite_buytime.smx
To see more, type "sm plugins 22"
] sm plugins 22
"instant_respawn.smx" instant_respawn.smx
Таких плагинов нигде нет:
"instant_respawn.smx"
"hideplayers.smx"
"Bom Chicka Wah Wah"

Возможно кому понадобиться.
Нашел один из плагинов
PHP:
#pragma semicolon 1
 
//////////////////////////////
//              DEFINITIONS                     //
//////////////////////////////
 
#define PLUGIN_NAME "Bom Chicka Wah Wah"
#define PLUGIN_AUTHOR "Zephyrus"
#define PLUGIN_DESCRIPTION ""
#define PLUGIN_VERSION "1.2"
#define PLUGIN_URL ""
 
#define MAX_AD_NETWORKS 64
 
#define SHOW_PANEL false
#define SPEC 1
#define RED     2
#define BLU     3
 
//////////////////////////////
//                      INCLUDES                //
//////////////////////////////
 
#include <sourcemod>
#include <sdktools>
#include <clientprefs>
 
#include <zephstocks>
 
//////////////////////////////
//                      ENUMS                   //
//////////////////////////////
 
enum AdNetwork
{
        String:szIdentifier[64],
        String:szURL[256],
        iDuration,
        iInterval,
        iOrder,
        iMax,
        bool:bHidden,
        Handle:hCookie,
}
 
//////////////////////////////////
//              GLOBAL VARIABLES                //
//////////////////////////////////
 
new String:g_szServerIP[32];
new String:g_szServerPort[8];
 
new g_cvarImmunityFlag = -1;
new g_cvarDeadOnly = -1;
 
new g_eNetworks[MAX_AD_NETWORKS][AdNetwork];
 
new g_iNetworks = 0;
new g_iNextAd[MAXPLAYERS+1][MAX_AD_NETWORKS];
new g_iAdNum[MAXPLAYERS+1][MAX_AD_NETWORKS];
new g_iSorted[MAX_AD_NETWORKS];
new g_iDelay[MAXPLAYERS+1];
 
new g_bInitialized[MAXPLAYERS+1]={0,...};
 
//////////////////////////////////
//              PLUGIN DEFINITION               //
//////////////////////////////////
 
public Plugin:myinfo =
{
        name = PLUGIN_NAME,
        author = PLUGIN_AUTHOR,
        description = PLUGIN_DESCRIPTION,
        version = PLUGIN_VERSION,
        url = PLUGIN_URL
};
 
//////////////////////////////
//              PLUGIN FORWARDS         //
//////////////////////////////
 
public OnPluginStart()
{
        // Supress warnings about unused variables.....
        if(g_bL4D || g_bL4D2 || g_bND) {}
 
        // Initialize our ConVars
        g_cvarDeadOnly = RegisterConVar("sm_adplugin_dead_only", "0", "Set this to 0 to show ads to alive players too", TYPE_INT);
        g_cvarImmunityFlag = RegisterConVar("sm_adplugin_immunity_flag", "p", "Players with this SourceMod flag set will be given ad viewing immunity.", TYPE_FLAG);
 
        AutoExecConfig();
 
        // Initialize our global variables
        new Handle:m_hHostIP = FindConVar("hostip");
        new Handle:m_hHostPort = FindConVar("hostport");
        if(m_hHostIP == INVALID_HANDLE || m_hHostPort == INVALID_HANDLE)
                SetFailState("Failed to determine server ip and port.");
 
        GetConVarString(m_hHostPort, STRING(g_szServerPort));
 
        new m_iServerIP = GetConVarInt(m_hHostIP);
        Format(STRING(g_szServerIP), "%d.%d.%d.%d", m_iServerIP >>> 24 & 255, m_iServerIP >>> 16 & 255, m_iServerIP >>> 8 & 255, m_iServerIP & 255);
 
        // Hook the events we may need
        HookEvent("player_spawn", Event_PlayerSpawn);
        HookEvent("player_team", Event_PlayerTeam);
 
        // Register our commnads
        RegServerCmd("sm_adplugin_add", Command_Add);
}
 
public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max)
{
        // Mark GetUserMessageType as an optional native
        MarkNativeAsOptional("GetUserMessageType");
 
        // Add compatibility with Friagram's stuff
        CreateNative("TrafficCash_DelayAd", Native_TrafficCash_DelayAd);
        RegPluginLibrary("trafficcashredux");
 
        return APLRes_Success;
}
 
public OnMapStart()
{
        // Reset networks (they reload on all map starts)
        g_iNetworks=0;
 
        // Start our timer to show ads
        CreateTimer(1.0, Timer_ShowAds, _, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT);
}
 
public OnAutoConfigsBuffered()
{
        // Make it work on reload
        LoopIngamePlayers(client)
        {
                OnClientConnected(client);
                if(AreClientCookiesCached(client))
                        OnClientCookiesCached(client);
                if(IsClientAuthorized(client))
                        OnClientPostAdminCheck(client);
        }
}
 
//////////////////////////////
//                      NATIVES                 //
//////////////////////////////
 
public Native_TrafficCash_DelayAd(Handle:plugin,numParams)
{
        g_iDelay[GetNativeCell(1)] = GetTime() + RoundFloat(Float:GetNativeCell(2));
}
 
//////////////////////////////
//              CLIENT FORWARDS         //
//////////////////////////////
 
public OnClientConnected(client)
{
        // Reset player ad times
        g_bInitialized[client]=0;
        if(!IsFakeClient(client))
                for(new i=0;i<MAX_AD_NETWORKS;++i)
                {
                        g_iNextAd[client][i]=-1;
                        g_iAdNum[client][i]=0;
                }
}
 
public OnClientCookiesCached(client)
{
        // Get the last ad times
        new String:m_szCookie[64];
        for(new i=0;i<g_iNetworks;++i)
        {
                GetClientCookie(client, g_eNetworks[i][hCookie], STRING(m_szCookie));
                g_iNextAd[client][i]=StringToInt(m_szCookie);
                m_szCookie[0]=0;
        }
 
        ++g_bInitialized[client];
}
 
public OnClientPostAdminCheck(client)
{
        if(g_eCvars[g_cvarImmunityFlag][aCache] != 0 && GetUserFlagBits(client) & g_eCvars[g_cvarImmunityFlag][aCache])
        {
                for(new i=0;i<MAX_AD_NETWORKS;++i)
                        g_iNextAd[client][i] =  2147483647;
        }
}
 
//////////////////////////////
//                      COMMANDS                //
//////////////////////////////
 
public Action:Command_Add(args)
{
        // Bail out if the parameter count doesn't match
        if(args != 6)
        {
                PrintToServer("Usage: sm_adplugin_add <identifier> <url> <interval> <duration> <max per session> <hidden>");
                return Plugin_Handled;
        }
 
        // Initialize variables
        new String:m_szIdentifier[64];
        new String:m_szURL[256];
        new String:m_szInterval[32];
        new String:m_szDuration[32];
        new String:m_szMax[32];
        new String:m_szHidden[8];
 
        // Get all parameters
        GetCmdArg(1, STRING(m_szIdentifier));
        GetCmdArg(2, STRING(m_szURL));
        GetCmdArg(3, STRING(m_szInterval));
        GetCmdArg(4, STRING(m_szDuration));
        GetCmdArg(5, STRING(m_szMax));
        GetCmdArg(6, STRING(m_szHidden));
 
        // Process the URL
        ReplaceString(STRING(m_szURL), "{serverip}", g_szServerIP, false);
        ReplaceString(STRING(m_szURL), "{port}", g_szServerPort, false);
 
        // Save the ad network to our internal cache
        new m_iInterval = StringToInt(m_szInterval);
        new m_iDuration = StringToInt(m_szDuration);
        new m_iMax = StringToInt(m_szMax);
        new m_iHidden = StringToInt(m_szHidden);
 
        g_eNetworks[g_iNetworks][hCookie] = RegClientCookie(m_szIdentifier, m_szIdentifier, CookieAccess_Private);
        strcopy(g_eNetworks[g_iNetworks][szIdentifier], sizeof(m_szIdentifier), m_szIdentifier);
        strcopy(g_eNetworks[g_iNetworks][szURL], sizeof(m_szURL), m_szURL);
        g_eNetworks[g_iNetworks][iInterval] = m_iInterval;
        g_eNetworks[g_iNetworks][iDuration] = m_iDuration;
        g_eNetworks[g_iNetworks][iOrder] = g_iNetworks;
        g_eNetworks[g_iNetworks][iMax] = m_iMax;
        g_eNetworks[g_iNetworks][bHidden] = (m_iHidden?true:false);
 
 
        ++g_iNetworks;
 
        // Sort the networks by interval
        for(new a=0;a<g_iNetworks;++a)
                for(new b=0;b<g_iNetworks;++b)
                        if(g_eNetworks[a][iInterval]>g_eNetworks[b][iInterval] && g_eNetworks[a][iOrder]>g_eNetworks[b][iOrder])
                        {
                                g_eNetworks[a][iOrder]+=g_eNetworks[b][iOrder];
                                g_eNetworks[b][iOrder]=g_eNetworks[a][iOrder]-g_eNetworks[b][iOrder];
                                g_eNetworks[b][iOrder]-=g_eNetworks[b][iOrder];
                        }
 
        for(new i=0;i<g_iNetworks;++i)
                g_iSorted[g_eNetworks[i][iOrder]]=i;
 
        return Plugin_Handled;
}
 
//////////////////////////////
//                      EVENTS                  //
//////////////////////////////
 
public Action:Event_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
{
        // Skip this if we want to show ads to alive players too
        if(!g_eCvars[g_cvarDeadOnly][aCache])
                return Plugin_Continue;
 
        // Get the client and make sure it's ingame and not a fake
        new client = GetClientOfUserId(GetEventInt(event, "userid"));
        if(!client || !IsClientInGame(client) || !IsPlayerAlive(client) || IsFakeClient(client))
                return Plugin_Continue;
 
 
        // Skip this if player is not yet initialized
        if(g_bInitialized[client]==2)
                return Plugin_Continue;
 
        // Reset the MOTD to stop all running ads
        new Handle:m_hKV = CreateKeyValues("data");
        KvSetString(m_hKV, "title", "blank");
        KvSetNum(m_hKV, "type", MOTDPANEL_TYPE_URL);
        KvSetString(m_hKV, "msg", "about:blank");
        ShowVGUIPanel(client, "info", m_hKV, false);
        CloseHandle(m_hKV);
 
        return Plugin_Continue;
}
 
public Action:Event_PlayerTeam(Handle:event, const String:name[], bool:dontBroadcast)
{
        // Get the client and make sure it's ingame and not a fake
        new client = GetClientOfUserId(GetEventInt(event, "userid"));
        if(!client || !IsClientInGame(client) || IsFakeClient(client) || g_bInitialized[client]==2)
                return Plugin_Continue;
 
        new team = GetEventInt(event, "team");
        if(team>0)
                ++g_bInitialized[client];
 
        return Plugin_Continue;
}
 
 
//////////////////////////////
//                      HOOKS                   //
//////////////////////////////
 
//////////////////////////////
//                      TIMERS                  //
//////////////////////////////
 
public Action:Timer_ShowAds(Handle:timer)
{
        new m_iTime = GetTime();
        new m_iTeam;
        new bool:m_bDisplay;
        new String:m_szCookie[64];
        new String:m_szURL[256];
        new String:m_szSteamID[64];
       
        LoopIngamePlayers(client)
        {
                if(g_bInitialized[client]!=2)
                        continue;
 
                // Check if the player should see an ad at all
                m_bDisplay=false;
                m_iTeam = GetClientTeam(client);
                if(m_iTeam != SPEC && m_iTeam != RED && m_iTeam != BLU)
                        continue;
                if(g_iDelay[client]<m_iTime && (m_iTeam == SPEC || !g_eCvars[g_cvarDeadOnly][aCache] || (g_eCvars[g_cvarDeadOnly][aCache] && !IsPlayerAlive(client))))
                        m_bDisplay=true;
                if(!m_bDisplay)
                        continue;
 
                // Get client SteamID
                GetClientAuthString(client, STRING(m_szSteamID));
               
                for(new i=0;i<g_iNetworks;++i)
                {
                        if(g_iNextAd[client][i] < m_iTime && (g_iAdNum[client][i] < g_eNetworks[i][iMax] || g_eNetworks[i][iMax] == 0))
                        {
                                if(m_iTeam != BLU && !g_eNetworks[i][bHidden])
                                        continue;
 
                                // Process URL
                                strcopy(STRING(m_szURL), g_eNetworks[i][szURL]);
                                ReplaceString(STRING(m_szURL), "{steamid}", m_szSteamID, false);
 
                                // Show that ad
                                new Handle:m_hKV = CreateKeyValues("data");
                                KvSetString(m_hKV, "title", "blank");
                                KvSetNum(m_hKV, "type", MOTDPANEL_TYPE_URL);
                                KvSetString(m_hKV, "msg", g_eNetworks[i][szURL]);
                                ShowVGUIPanel(client, "info", m_hKV, !g_eNetworks[i][bHidden]);
                                CloseHandle(m_hKV);
 
                                // Mute if it's pinion...
                                /*if(strcmp(g_eNetworks[i][szIdentifier], "pinion")==0)
                                {
                                        m_hKV = CreateKeyValues("data");
                                        KvSetString(m_hKV, "title", "blank");
                                        KvSetNum(m_hKV, "type", MOTDPANEL_TYPE_URL);
                                        KvSetString(m_hKV, "msg", "javascript:document.getElementById(\"videoElement\").volume=0.0");
                                        ShowVGUIPanel(client, "info", m_hKV, false);
                                        CloseHandle(m_hKV);
                                }*/
                               
                                // Make sure the ad won't be seen before it should be seen again
                                g_iDelay[client] = m_iTime + g_eNetworks[i][iDuration]+1;
                                g_iNextAd[client][i] = m_iTime + g_eNetworks[i][iInterval];
                                ++g_iAdNum[client][i];
 
                                // Save the last time to a cookie if it deserves to be saved at all (if timeout is higher than 5 mins)
                                if(g_eNetworks[i][iInterval] > 300)
                                {
                                        IntToString(g_iNextAd[client][i], STRING(m_szCookie));
                                        SetClientCookie(client, g_eNetworks[i][hCookie], m_szCookie);
                                }
 
                                CreateTimer(float(g_eNetworks[i][iDuration]), Timer_ResetPlayer, GetClientUserId(client));
 
                                // We have an ad to show already, skip the rest of the loop
                                break;
                        }
                }
        }
        return Plugin_Continue;
}
 
public Action:Timer_ResetPlayer(Handle:timer, any:userid)
{
        new client = GetClientOfUserId(userid);
        if(!client || !IsClientInGame(client))
                return Plugin_Stop;
        // Reset the MOTD to stop all running ads
        new Handle:m_hKV = CreateKeyValues("data");
        KvSetString(m_hKV, "title", "blank");
        KvSetNum(m_hKV, "type", MOTDPANEL_TYPE_URL);
        KvSetString(m_hKV, "msg", "about:blank");
        ShowVGUIPanel(client, "info", m_hKV, false);
        CloseHandle(m_hKV);
       
        return Plugin_Stop;
}
 
Сверху Снизу