PHP Code:
#include <sourcemod>
bool g_bAdvertPlaying[MAXPLAYERS + 1];
public Plugin myinfo =
{
name = "Advert Example",
author = "SM9 (xCoderx)",
version = VERSION,
url = "http://www.fragdeluxe.com"
};
#define ADVERT_URL "https://motdgd.com/motd/?user=1337&gm=csgo"
public void OnPluginStart()
{
HookUserMessage(GetUserMessageId("VGUIMenu"), OnVGUIMenu, true);
}
public void OnClientDisconnect(int iClient)
{
g_bAdvertPlaying[iClient] = false;
}
public void QueryMotdCheck(QueryCookie qCookie, int iClient, ConVarQueryResult cqResult, char[] chCvarName, char[] chCvarValue, DataPack dPack)
{
if (cqResult != ConVarQuery_Okay) {
return;
}
int iValue = StringToInt(chCvarValue);
if (iValue > 0) {
KickClient(iClient, "You must set cl_disablehtmlmotd 0 to play here");
return;
}
Handle hKv = CreateKeyValues("data");
KvSetNum(hKv, "cmd", 5);
KvSetString(hKv, "msg", ADVERT_URL);
KvSetString(hKv, "title", "Advertisement");
KvSetNum(hKv, "type", MOTDPANEL_TYPE_URL);
ShowVGUIPanel(iClient, "info", hKv, true);
CloseHandle(hKv);
}
stock void PlayAdvert(int iClient)
{
if(g_bAdvertPlaying[iClient]) {
return;
}
QueryClientConVar(iClient, "cl_disablehtmlmotd", QueryMotdCheck);
}
// Some messy code, but this will stop people killing the advert.
public Action OnVGUIMenu(UserMsg msg_id, Handle hPb, const int[] players, int playersNum, bool reliable, bool init)
{
int iClient = players[0];
if(!IsValidClient(iClient)) {
return Plugin_Continue;
}
char chBuffer[64]; PbReadString(hPb, "name", chBuffer, sizeof(chBuffer));
if (StrEqual(chBuffer, "info", false)) {
int iCount = PbGetRepeatedFieldCount(hPb, "subkeys");
char chName[128]; char chWebsite[420];
for (int i = 0; i < iCount; i++) {
Handle hSubKey = PbReadRepeatedMessage(hPb, "subkeys", i);
PbReadString(hSubKey, "name", chName, 128);
if (StrEqual(chName, "msg", false)) {
PbReadString(hSubKey, "str", chWebsite, 420);
if (!StrEqual(chWebsite, ADVERT_URL, false)) {
if(g_bAdvertPlaying[iClient]) {
return Plugin_Handled;
}
} else {
g_bAdvertPlaying[iClient] = true;
// You can write a PHP script which the client is redirected to after motdgd finishes the advert, then send an rcon to server.
// I won't provide that example here, since its too long.
// But the advert should usually be finished before 60 seconds anyway.
CreateTimer(60.0, Timer_AdvertFinished, GetClientUserId(iClient), TIMER_FLAG_NO_MAPCHANGE);
}
}
}
}
return Plugin_Continue;
}
public Action Timer_AdvertFinished(Handle hTimer, int iUserId)
{
int iClient = GetClientOfUserId(iClient);
if(!IsValidClient(iClient)) {
return Plugin_Stop;
}
g_bAdvertPlaying[iClient] = false;
return Plugin_Stop;
}
stock bool IsValidClient(int iClient)
{
if (iClient <= 0 || iClient > MaxClients) {
return false;
}
return IsClientInGame(iClient);
}