config-loader/scripting/config_loader.sp
2023-03-06 17:09:27 +11:00

174 lines
4.6 KiB
SourcePawn

#include <sourcemod>
#include <tf2_stocks>
#include <morecolors>
// ^ tf2_stocks.inc itself includes sdktools.inc and tf2.inc
#pragma semicolon 1
#pragma newdecls required
#define PLUGIN_VERSION "1.0"
ConVar g_cvarConfigName;
bool g_bConfigLoaded = false;
Handle g_reminder_timer;
public Plugin myinfo =
{
name = "Config Reminder",
author = "Rhizome",
description = "Hassles users until they exec",
version = PLUGIN_VERSION,
url = "https://rhizome.tf"
};
public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{
// No need for the old GetGameFolderName setup.
EngineVersion g_engineversion = GetEngineVersion();
if (g_engineversion != Engine_TF2)
{
SetFailState("This plugin was made for use with Team Fortress 2 only.");
}
}
public void OnPluginStart()
{
/**
* @note For the love of god, please stop using FCVAR_PLUGIN.
* Console.inc even explains this above the entry for the FCVAR_PLUGIN define.
* "No logic using this flag ever existed in a released game. It only ever appeared in the first hl2sdk."
*/
CreateConVar("sm_pluginnamehere_version", PLUGIN_VERSION, "Standard plugin version ConVar. Please don't change me!", FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);
g_cvarConfigName = CreateConVar("sm_configloader_cfgname", "NULL", "User-friendly name of the current loaded config");
g_cvarConfigName.AddChangeHook(ConfigNameChangeCallback);
HookEvent("teamplay_restart_round", BlockStart, EventHookMode_Pre);
}
public void OnMapStart()
{
/**
* @note Precache your models, sounds, etc. here!
* Not in OnConfigsExecuted! Doing so leads to issues.
*/
g_reminder_timer = CreateTimer(15.0, PostReminder, 0, TIMER_REPEAT);
char config_name[64];
LoadConfig(config_name, sizeof(config_name));
if (StrEqual(config_name, "variable"))
{
g_bConfigLoaded = false;
PrintToServer("[AUTOCONFIG] Config Loaded FALSE");
PrintToServer("[AUTOCONFIG] Blocking Match Start");
}
else
{
ServerCommand("exec %s", config_name);
}
}
public void OnMapEnd()
{
KillTimer(g_reminder_timer);
g_bConfigLoaded = false;
g_cvarConfigName.SetString("NULL");
PrintToServer("[AUTOCONFIG] Config Loaded FALSE");
PrintToServer("[AUTOCONFIG] Blocking Match Start");
}
Action PostReminder(Handle timer, any data)
{
if (g_bConfigLoaded)
{
char config_name[64];
g_cvarConfigName.GetString(config_name, sizeof(config_name));
CPrintToChatAll("{green}Config loaded: %s", config_name);
return Plugin_Handled;
}
else
{
CPrintToChatAll("{red}No config is applied! Ensure config is applied before starting.");
return Plugin_Handled;
}
}
Action BlockStart(Event event, const char[] name, bool dontBroadcast)
{
if (g_bConfigLoaded)
{
KillTimer(g_reminder_timer);
return Plugin_Continue;
}
ServerCommand("mp_tournament_restart");
CPrintToChatAll("{yellow}Bad rollout! {default}(Did you forget to exec?)");
return Plugin_Handled;
}
bool LoadConfig(char[] config_name, int maxlength)
{
char current_map[64];
GetCurrentMap(current_map, sizeof(current_map));
char map_type[8];
if (SplitString(current_map, "_", map_type, sizeof(map_type)) == -1)
{
PrintToServer("[AUTOCONFIG] Couldn't find map prefix'");
return false;
}
KeyValues map_configs = CreateKeyValues("Map_Configs");
char config_file[256];
BuildPath(Path_SM, config_file, sizeof(config_file), "configs/config_loader.cfg");
map_configs.ImportFromFile(config_file);
if (!map_configs.JumpToKey(map_type))
{
PrintToServer("[AUTOCONFIG] Couldn't find table for '%s' maps'", map_type);
delete map_configs;
return false;
}
if (!map_configs.GotoFirstSubKey(false))
{
PrintToServer("[AUTOCONFIG] No maps listed for '%s' maps'", map_type);
delete map_configs;
return false;
}
while (true)
{
char current_key[64];
map_configs.GetSectionName(current_key, sizeof(current_key));
if (StrContains(current_map, current_key, false) != -1)
{
map_configs.GoBack();
map_configs.GetString(current_key, config_name, maxlength);
PrintToServer("[AUTOCONFIG] Found applicable config: %s", config_name);
delete map_configs;
return true;
}
if (!map_configs.GotoNextKey(false))
{
PrintToServer("[AUTOCONFIG] No match found for %s", current_map);
delete map_configs;
return false;
}
}
}
void ConfigNameChangeCallback(ConVar convar, const char[] oldValue, const char[] newValue)
{
if (!StrEqual(newValue, "NULL"))
{
g_bConfigLoaded = true;
PrintToServer("[AUTOCONFIG] Config Loaded TRUE");
PrintToServer("[AUTOCONFIG] Unblocking Match Start");
}
}