Add custom automated messages (#233)

This commit is contained in:
shavitush 2016-10-03 11:56:54 +03:00
parent 900749b3d5
commit f9033989e8
No known key found for this signature in database
GPG Key ID: 0A298F154527B9A4
2 changed files with 108 additions and 7 deletions

View File

@ -0,0 +1,19 @@
// Configuration file for chat advertisements.
//
// Advertisements will cycle from the first one to the last one and will show up every time
//
// Possible color values are the ones from shavit-messages.cfg:
// {text} {warning} {variable} {variable2} {style}
//
// Extra:
// {name} - name of the player who receives the message.
//
// All messages will have the prefix that is defined inside configs/shavit-messages.cfg.
//
"Advertisements"
{
"0" "You may write {variable}!hide{text} to {variable2}hide{text} other players."
"1" "The command {variable}!r{text} will {variable2}restart your timer{text}."
"2" "{variable}!recent{text} can be used to see the latest world records set!"
"3" "{variable}!style{text} will open a menu with every {variable2}bhop style{text} the server has to offer."
}

View File

@ -22,6 +22,7 @@
#include <cstrike>
#include <sdktools>
#include <sdkhooks>
#include <dynamic>
#undef REQUIRE_EXTENSIONS
#include <dhooks>
@ -45,6 +46,8 @@ char gS_RadioCommands[][] = {"coverme", "takepoint", "holdpos", "regroup", "foll
bool gB_Hide[MAXPLAYERS+1];
bool gB_Late = false;
int gI_LastFlags[MAXPLAYERS+1];
ArrayList gA_Advertisements = null;
int gI_AdvertisementsCycle = 0;
// cvars
ConVar gCV_GodMode = null;
@ -66,6 +69,7 @@ ConVar gCV_WeaponCommands = null;
ConVar gCV_PlayerOpacity = null;
ConVar gCV_StaticPrestrafe = null;
ConVar gCV_NoclipMe = null;
ConVar gCV_AdvertisementInterval = null;
// cached cvars
int gI_GodMode = 3;
@ -87,6 +91,7 @@ int gI_WeaponCommands = 2;
int gI_PlayerOpacity = -1;
bool gB_StaticPrestrafe = true;
int gI_NoclipMe = true;
float gF_AdvertisementInterval = 600.0;
// dhooks
Handle gH_GetPlayerMaxSpeed = null;
@ -168,10 +173,6 @@ public void OnPluginStart()
AddCommandListener(Command_Radio, gS_RadioCommands[i]);
}
// crons
CreateTimer(1.0, Timer_Scoreboard, INVALID_HANDLE, TIMER_REPEAT);
CreateTimer(600.0, Timer_Message, INVALID_HANDLE, TIMER_REPEAT);
// hooks
HookEvent("player_spawn", Player_Spawn);
HookEvent("player_team", Player_Notifications, EventHookMode_Pre);
@ -181,6 +182,9 @@ public void OnPluginStart()
// phrases
LoadTranslations("common.phrases");
// advertisements
gA_Advertisements = new ArrayList(300);
// cvars and stuff
gCV_GodMode = CreateConVar("shavit_misc_godmode", "3", "Enable godmode for players?\n0 - Disabled\n1 - Only prevent fall/world damage.\n2 - Only prevent damage from other players.\n3 - Full godmode.", 0, true, 0.0, true, 3.0);
gCV_PreSpeed = CreateConVar("shavit_misc_prespeed", "3", "Stop prespeed in startzone?\n0 - Disabled\n1 - Limit 280 speed.\n2 - Block bhopping in startzone\n3 - Limit 280 speed and block bhopping in startzone.", 0, true, 0.0, true, 3.0);
@ -201,6 +205,7 @@ public void OnPluginStart()
gCV_PlayerOpacity = CreateConVar("shavit_misc_playeropacity", "-1", "Player opacity (alpha) to set on spawn.\n-1 - Disabled\nValue can go up to 255. 0 for invisibility.", 0, true, -1.0, true, 255.0);
gCV_StaticPrestrafe = CreateConVar("shavit_misc_staticprestrafe", "1", "Force prestrafe for every pistol.\n250 is the default value and some styles will have 260.\n0 - Disabled\n1 - Enabled", 0, true, 0.0, true, 1.0);
gCV_NoclipMe = CreateConVar("shavit_misc_noclipme", "1", "Allow +noclip, sm_p and all the noclip commands?\n0 - Disabled\n1 - Enabled\n2 - requires 'noclipme' override or ADMFLAG_CHEATS flag.", 0, true, 0.0, true, 1.0);
gCV_AdvertisementInterval = CreateConVar("shavit_misc_advertisementinterval", "600.0", "Interval between each chat advertisement.\nConfiguration file for those is configs/shavit-advertisements.\nSet to -1 to disable.", 0, true, -1.0);
gCV_GodMode.AddChangeHook(OnConVarChanged);
gCV_PreSpeed.AddChangeHook(OnConVarChanged);
@ -221,9 +226,13 @@ public void OnPluginStart()
gCV_PlayerOpacity.AddChangeHook(OnConVarChanged);
gCV_StaticPrestrafe.AddChangeHook(OnConVarChanged);
gCV_NoclipMe.AddChangeHook(OnConVarChanged);
gCV_AdvertisementInterval.AddChangeHook(OnConVarChanged);
AutoExecConfig();
// crons
CreateTimer(1.0, Timer_Scoreboard, 0, TIMER_REPEAT);
if(LibraryExists("dhooks"))
{
Handle hGameData = LoadGameConfigFile("shavit.games");
@ -279,6 +288,11 @@ public void Shavit_OnChatConfigLoaded()
{
Shavit_GetChatStrings(i, gS_ChatStrings[i], 128);
}
if(!LoadAdvertisementsConfig())
{
SetFailState("Cannot open \"configs/shavit-advertisements.cfg\". Make sure this file exists and that the server has read permissions to it.");
}
}
public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue)
@ -302,6 +316,7 @@ public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] n
gI_PlayerOpacity = gCV_PlayerOpacity.IntValue;
gB_StaticPrestrafe = gCV_StaticPrestrafe.BoolValue;
gI_NoclipMe = gCV_NoclipMe.IntValue;
gF_AdvertisementInterval = gCV_AdvertisementInterval.FloatValue;
}
public void OnMapStart()
@ -343,6 +358,51 @@ public void OnMapStart()
Shavit_OnStyleConfigLoaded(-1);
Shavit_OnChatConfigLoaded();
}
CreateTimer(gF_AdvertisementInterval, Timer_Advertisement, 0, TIMER_FLAG_NO_MAPCHANGE);
}
public bool LoadAdvertisementsConfig()
{
gA_Advertisements.Clear();
char[] sPath = new char[PLATFORM_MAX_PATH];
BuildPath(Path_SM, sPath, PLATFORM_MAX_PATH, "configs/shavit-advertisements.cfg");
Dynamic dAdvertisements = Dynamic();
if(!dAdvertisements.ReadKeyValues(sPath))
{
dAdvertisements.Dispose();
return false;
}
int iCount = dAdvertisements.MemberCount;
for(int i = 0; i < iCount; i++)
{
char[] sID = new char[4];
IntToString(i, sID, 4);
char[] sTempMessage = new char[300];
dAdvertisements.GetString(sID, sTempMessage, 300);
PrintToServer("%d %s %s", i, sID, sTempMessage);
// {text} {warning} {variable} {variable2} {style}
ReplaceString(sTempMessage, 300, "{text}", gS_ChatStrings[sMessageText]);
ReplaceString(sTempMessage, 300, "{warning}", gS_ChatStrings[sMessageWarning]);
ReplaceString(sTempMessage, 300, "{variable}", gS_ChatStrings[sMessageVariable]);
ReplaceString(sTempMessage, 300, "{variable2}", gS_ChatStrings[sMessageVariable2]);
ReplaceString(sTempMessage, 300, "{style}", gS_ChatStrings[sMessageStyle]);
gA_Advertisements.PushString(sTempMessage);
}
dAdvertisements.Dispose(true);
return true;
}
public void OnLibraryAdded(const char[] name)
@ -465,11 +525,33 @@ public Action Timer_Scoreboard(Handle Timer)
return Plugin_Continue;
}
public Action Timer_Message(Handle Timer)
public Action Timer_Advertisement(Handle Timer)
{
Shavit_PrintToChatAll("You may write %s!hide%s to %shide%s other players.", gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable2], gS_ChatStrings[sMessageText]);
if(gF_AdvertisementInterval < 0.0)
{
return Plugin_Stop;
}
return Plugin_Continue;
int iAdvertisement = (gI_AdvertisementsCycle++ % gA_Advertisements.Length);
for(int i = 1; i <= MaxClients; i++)
{
if(IsClientConnected(i) && IsClientInGame(i))
{
char[] sTempMessage = new char[300];
gA_Advertisements.GetString(iAdvertisement, sTempMessage, 300);
char[] sName = new char[MAX_NAME_LENGTH];
GetClientName(i, sName, MAX_NAME_LENGTH);
ReplaceString(sTempMessage, 300, "{name}", sName);
Shavit_PrintToChat(i, "%s", sTempMessage);
}
}
CreateTimer(gF_AdvertisementInterval, Timer_Advertisement);
return Plugin_Stop;
}
public void UpdateScoreboard(int client)