#include #include #include // ^ tf2_stocks.inc itself includes sdktools.inc and tf2.inc #pragma semicolon 1 #pragma newdecls required #define PLUGIN_VERSION "1.1" 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(60.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); PrintToServer("[AUTOCONFIG] Match started, going silent."); return Plugin_Continue; } ServerCommand("mp_tournament_restart"); CPrintToChatAll("{yellow}Bad rollout! {default}(Did you forget to exec?)"); PrintToServer("[AUTOCONFIG] Match start blocked due to no config"); 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"); } }