317 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			317 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
| #include <sourcemod>
 | |
| #include <colorvariables>
 | |
| #undef REQUIRE_PLUGIN
 | |
| #include <updater>
 | |
| #include "topcolors.sp"
 | |
| 
 | |
| #pragma newdecls required
 | |
| #pragma semicolon 1
 | |
| 
 | |
| #define PL_VERSION	"2.0.2"
 | |
| #define UPDATE_URL	"http://ErikMinekus.github.io/sm-advertisements/update.txt"
 | |
| 
 | |
| public Plugin myinfo =
 | |
| {
 | |
|     name        = "Advertisements",
 | |
|     author      = "Tsunami",
 | |
|     description = "Display advertisements",
 | |
|     version     = PL_VERSION,
 | |
|     url         = "http://www.tsunami-productions.nl"
 | |
| };
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * Globals
 | |
|  */
 | |
| KeyValues g_hAdvertisements;
 | |
| ConVar g_hEnabled;
 | |
| ConVar g_hFile;
 | |
| ConVar g_hInterval;
 | |
| Handle g_hTimer;
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * Plugin Forwards
 | |
|  */
 | |
| public void OnPluginStart()
 | |
| {
 | |
|     CreateConVar("sm_advertisements_version", PL_VERSION, "Display advertisements", FCVAR_NOTIFY);
 | |
|     g_hEnabled  = CreateConVar("sm_advertisements_enabled",  "1",                  "Enable/disable displaying advertisements.");
 | |
|     g_hFile     = CreateConVar("sm_advertisements_file",     "advertisements.txt", "File to read the advertisements from.");
 | |
|     g_hInterval = CreateConVar("sm_advertisements_interval", "30",                 "Amount of seconds between advertisements.");
 | |
| 
 | |
|     g_hFile.AddChangeHook(ConVarChange_File);
 | |
|     g_hInterval.AddChangeHook(ConVarChange_Interval);
 | |
| 
 | |
|     RegServerCmd("sm_advertisements_reload", Command_ReloadAds, "Reload the advertisements");
 | |
| 
 | |
|     AddTopColors();
 | |
| 
 | |
|     if (LibraryExists("updater")) {
 | |
|         Updater_AddPlugin(UPDATE_URL);
 | |
|     }
 | |
| }
 | |
| 
 | |
| public void OnMapStart()
 | |
| {
 | |
|     ParseAds();
 | |
| 
 | |
|     g_hTimer = CreateTimer(g_hInterval.IntValue * 1.0, Timer_DisplayAd, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
 | |
| }
 | |
| 
 | |
| public void OnLibraryAdded(const char[] name)
 | |
| {
 | |
|     if (StrEqual(name, "updater")) {
 | |
|         Updater_AddPlugin(UPDATE_URL);
 | |
|     }
 | |
| }
 | |
| 
 | |
| public void ConVarChange_File(ConVar convar, const char[] oldValue, const char[] newValue)
 | |
| {
 | |
|     ParseAds();
 | |
| }
 | |
| 
 | |
| public void ConVarChange_Interval(ConVar convar, const char[] oldValue, const char[] newValue)
 | |
| {
 | |
|     if (g_hTimer) {
 | |
|         KillTimer(g_hTimer);
 | |
|     }
 | |
| 
 | |
|     g_hTimer = CreateTimer(g_hInterval.IntValue * 1.0, Timer_DisplayAd, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
 | |
| }
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * Commands
 | |
|  */
 | |
| public Action Command_ReloadAds(int args)
 | |
| {
 | |
|     ParseAds();
 | |
|     return Plugin_Handled;
 | |
| }
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * Menu Handlers
 | |
|  */
 | |
| public int Handler_DoNothing(Menu menu, MenuAction action, int param1, int param2) {}
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * Timers
 | |
|  */
 | |
| public Action Timer_DisplayAd(Handle timer)
 | |
| {
 | |
|     if (!g_hEnabled.BoolValue) {
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     char sCenter[1024], sChat[1024], sHint[1024], sMenu[1024], sTop[1024], sFlags[16];
 | |
|     g_hAdvertisements.GetString("center", sCenter, sizeof(sCenter));
 | |
|     g_hAdvertisements.GetString("chat",   sChat,   sizeof(sChat));
 | |
|     g_hAdvertisements.GetString("hint",   sHint,   sizeof(sHint));
 | |
|     g_hAdvertisements.GetString("menu",   sMenu,   sizeof(sMenu));
 | |
|     g_hAdvertisements.GetString("top",    sTop,    sizeof(sTop));
 | |
|     g_hAdvertisements.GetString("flags",  sFlags,  sizeof(sFlags), "none");
 | |
|     int iFlags   = ReadFlagString(sFlags);
 | |
|     bool bAdmins = StrEqual(sFlags, ""),
 | |
|          bFlags  = !StrEqual(sFlags, "none");
 | |
| 
 | |
|     if (sCenter[0]) {
 | |
|         ProcessVariables(sCenter);
 | |
|         CRemoveColors(sCenter, sizeof(sCenter));
 | |
| 
 | |
|         for (int i = 1; i <= MaxClients; i++) {
 | |
|             if (IsClientInGame(i) && !IsFakeClient(i) &&
 | |
|                 ((!bAdmins && !(bFlags && (GetUserFlagBits(i) & (iFlags|ADMFLAG_ROOT)))) ||
 | |
|                  (bAdmins && (GetUserFlagBits(i) & (ADMFLAG_GENERIC|ADMFLAG_ROOT))))) {
 | |
|                 PrintCenterText(i, sCenter);
 | |
| 
 | |
|                 DataPack hCenterAd;
 | |
|                 CreateDataTimer(1.0, Timer_CenterAd, hCenterAd, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT);
 | |
|                 hCenterAd.WriteCell(i);
 | |
|                 hCenterAd.WriteString(sCenter);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     if (sHint[0]) {
 | |
|         ProcessVariables(sHint);
 | |
|         CRemoveColors(sHint, sizeof(sHint));
 | |
| 
 | |
|         for (int i = 1; i <= MaxClients; i++) {
 | |
|             if (IsClientInGame(i) && !IsFakeClient(i) &&
 | |
|                 ((!bAdmins && !(bFlags && (GetUserFlagBits(i) & (iFlags|ADMFLAG_ROOT)))) ||
 | |
|                  (bAdmins && (GetUserFlagBits(i) & (ADMFLAG_GENERIC|ADMFLAG_ROOT))))) {
 | |
|                 PrintHintText(i, sHint);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     if (sMenu[0]) {
 | |
|         ProcessVariables(sMenu);
 | |
|         CRemoveColors(sMenu, sizeof(sMenu));
 | |
| 
 | |
|         Panel hPl = new Panel();
 | |
|         hPl.DrawText(sMenu);
 | |
|         hPl.CurrentKey = 10;
 | |
| 
 | |
|         for (int i = 1; i <= MaxClients; i++) {
 | |
|             if (IsClientInGame(i) && !IsFakeClient(i) &&
 | |
|                 ((!bAdmins && !(bFlags && (GetUserFlagBits(i) & (iFlags|ADMFLAG_ROOT)))) ||
 | |
|                  (bAdmins && (GetUserFlagBits(i) & (ADMFLAG_GENERIC|ADMFLAG_ROOT))))) {
 | |
|                 hPl.Send(i, Handler_DoNothing, 10);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         delete hPl;
 | |
|     }
 | |
|     if (sChat[0]) {
 | |
|         bool bTeamColor = StrContains(sChat, "{teamcolor}", false) != -1;
 | |
| 
 | |
|         ProcessVariables(sChat);
 | |
|         CProcessVariables(sChat, sizeof(sChat));
 | |
|         CAddWhiteSpace(sChat, sizeof(sChat));
 | |
| 
 | |
|         for (int i = 1; i <= MaxClients; i++) {
 | |
|             if (IsClientInGame(i) && !IsFakeClient(i) &&
 | |
|                 ((!bAdmins && !(bFlags && (GetUserFlagBits(i) & (iFlags|ADMFLAG_ROOT)))) ||
 | |
|                  (bAdmins && (GetUserFlagBits(i) & (ADMFLAG_GENERIC|ADMFLAG_ROOT))))) {
 | |
|                 if (bTeamColor) {
 | |
|                     CSayText2(i, sChat, i);
 | |
|                 } else {
 | |
|                     PrintToChat(i, sChat);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     if (sTop[0]) {
 | |
|         int iStart    = 0,
 | |
|             aColor[4] = {255, 255, 255, 255};
 | |
| 
 | |
|         ParseTopColor(sTop, iStart, aColor);
 | |
|         ProcessVariables(sTop[iStart]);
 | |
| 
 | |
|         KeyValues hKv = new KeyValues("Stuff", "title", sTop[iStart]);
 | |
|         hKv.SetColor4("color", aColor);
 | |
|         hKv.SetNum("level",    1);
 | |
|         hKv.SetNum("time",     10);
 | |
| 
 | |
|         for (int i = 1; i <= MaxClients; i++) {
 | |
|             if (IsClientInGame(i) && !IsFakeClient(i) &&
 | |
|                 ((!bAdmins && !(bFlags && (GetUserFlagBits(i) & (iFlags|ADMFLAG_ROOT)))) ||
 | |
|                  (bAdmins && (GetUserFlagBits(i) & (ADMFLAG_GENERIC|ADMFLAG_ROOT))))) {
 | |
|                 CreateDialog(i, hKv, DialogType_Msg);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         delete hKv;
 | |
|     }
 | |
| 
 | |
|     if (!g_hAdvertisements.GotoNextKey()) {
 | |
|         g_hAdvertisements.Rewind();
 | |
|         g_hAdvertisements.GotoFirstSubKey();
 | |
|     }
 | |
| }
 | |
| 
 | |
| public Action Timer_CenterAd(Handle timer, DataPack pack)
 | |
| {
 | |
|     char sCenter[1024];
 | |
|     static int iCount = 0;
 | |
| 
 | |
|     pack.Reset();
 | |
|     int iClient = pack.ReadCell();
 | |
|     pack.ReadString(sCenter, sizeof(sCenter));
 | |
| 
 | |
|     if (!IsClientInGame(iClient) || ++iCount >= 5) {
 | |
|         iCount = 0;
 | |
|         return Plugin_Stop;
 | |
|     }
 | |
| 
 | |
|     PrintCenterText(iClient, sCenter);
 | |
|     return Plugin_Continue;
 | |
| }
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * Stocks
 | |
|  */
 | |
| void ParseAds()
 | |
| {
 | |
|     delete g_hAdvertisements;
 | |
|     g_hAdvertisements = CreateKeyValues("Advertisements");
 | |
| 
 | |
|     char sFile[64], sPath[PLATFORM_MAX_PATH];
 | |
|     g_hFile.GetString(sFile, sizeof(sFile));
 | |
|     BuildPath(Path_SM, sPath, sizeof(sPath), "configs/%s", sFile);
 | |
| 
 | |
|     if (!FileExists(sPath)) {
 | |
|         SetFailState("File Not Found: %s", sPath);
 | |
|     }
 | |
| 
 | |
|     g_hAdvertisements.ImportFromFile(sPath);
 | |
|     g_hAdvertisements.GotoFirstSubKey();
 | |
| }
 | |
| 
 | |
| void ProcessVariables(char sText[1024])
 | |
| {
 | |
|     char sBuffer[64];
 | |
|     if (StrContains(sText, "\\n") != -1) {
 | |
|         Format(sBuffer, sizeof(sBuffer), "%c", 13);
 | |
|         ReplaceString(sText, sizeof(sText), "\\n", sBuffer);
 | |
|     }
 | |
| 
 | |
|     if (StrContains(sText, "{currentmap}", false) != -1) {
 | |
|         GetCurrentMap(sBuffer, sizeof(sBuffer));
 | |
|         ReplaceString(sText, sizeof(sText), "{currentmap}", sBuffer, false);
 | |
|     }
 | |
| 
 | |
|     if (StrContains(sText, "{date}", false) != -1) {
 | |
|         FormatTime(sBuffer, sizeof(sBuffer), "%m/%d/%Y");
 | |
|         ReplaceString(sText, sizeof(sText), "{date}", sBuffer, false);
 | |
|     }
 | |
| 
 | |
|     if (StrContains(sText, "{time}", false) != -1) {
 | |
|         FormatTime(sBuffer, sizeof(sBuffer), "%I:%M:%S%p");
 | |
|         ReplaceString(sText, sizeof(sText), "{time}", sBuffer, false);
 | |
|     }
 | |
| 
 | |
|     if (StrContains(sText, "{time24}", false) != -1) {
 | |
|         FormatTime(sBuffer, sizeof(sBuffer), "%H:%M:%S");
 | |
|         ReplaceString(sText, sizeof(sText), "{time24}", sBuffer, false);
 | |
|     }
 | |
| 
 | |
|     if (StrContains(sText, "{timeleft}", false) != -1) {
 | |
|         int iMins, iSecs, iTimeLeft;
 | |
|         if (GetMapTimeLeft(iTimeLeft) && iTimeLeft > 0) {
 | |
|             iMins = iTimeLeft / 60;
 | |
|             iSecs = iTimeLeft % 60;
 | |
|         }
 | |
| 
 | |
|         Format(sBuffer, sizeof(sBuffer), "%d:%02d", iMins, iSecs);
 | |
|         ReplaceString(sText, sizeof(sText), "{timeleft}", sBuffer, false);
 | |
|     }
 | |
| 
 | |
|     ConVar hConVar;
 | |
|     char sConVar[64], sSearch[64], sReplace[64];
 | |
|     int iEnd = -1, iStart = StrContains(sText, "{"), iStart2;
 | |
|     while (iStart != -1) {
 | |
|         iEnd = StrContains(sText[iStart + 1], "}");
 | |
|         if (iEnd == -1) {
 | |
|             break;
 | |
|         }
 | |
| 
 | |
|         strcopy(sConVar, iEnd + 1, sText[iStart + 1]);
 | |
|         Format(sSearch, sizeof(sSearch), "{%s}", sConVar);
 | |
| 
 | |
|         if ((hConVar = FindConVar(sConVar))) {
 | |
|             hConVar.GetString(sReplace, sizeof(sReplace));
 | |
|             ReplaceString(sText, sizeof(sText), sSearch, sReplace, false);
 | |
|         }
 | |
| 
 | |
|         iStart2 = StrContains(sText[iStart + 1], "{");
 | |
|         if (iStart2 == -1) {
 | |
|             break;
 | |
|         }
 | |
| 
 | |
|         iStart += iStart2 + 1;
 | |
|     }
 | |
| } |