diff --git a/scripting/l4d2_mapfinalenext.sp b/scripting/l4d2_mapfinalenext.sp index 8f769dc..3033c39 100644 --- a/scripting/l4d2_mapfinalenext.sp +++ b/scripting/l4d2_mapfinalenext.sp @@ -7,228 +7,385 @@ * */ #pragma semicolon 1 +#pragma newdecls required #include +#tryinclude /* l4d2_changelevel https://forums.alliedmods.net/showthread.php?p=2669850 */ -#define HX_FIXES_LUX 1 +#define PLUGIN_VERSION "1.7" +#define CVAR_FLAGS FCVAR_NOTIFY -#if HX_FIXES_LUX -#include +#if defined _l4d2_changelevel_included +bool bLateload = false, bChangeLevelLib = false; #endif -#pragma newdecls required +char sg_l4d2Map[48], sg_mode[24]; +ConVar g_hCvarEnable, g_hCvarCountdown, g_hCvarRoundsLimit; +bool bHooked = false, bg_coop = false; +int iRoundsLimit = 0, ig_rs = 0; +float fCointdown = 0.0; -char sg_l4d2Map[48]; -char sg_mode[24]; -int iPluginS; -int ig_coop; -int ig_rs; +public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) +{ + if(GetEngineVersion() != Engine_Left4Dead2) + { + strcopy(error, err_max, "Plugin only supports Left 4 Dead 2 game."); + return APLRes_SilentFailure; + } + #if defined _l4d2_changelevel_included + bLateload = late; + #endif + + return APLRes_Success; +} public Plugin myinfo = { name = "[L4D2] mapfinalenext", - author = "MAKS", + author = "MAKS(Edit. by BloodyBlade)", description = "L4D2 Coop Map Finale Next", - version = "1.7", + version = PLUGIN_VERSION, url = "forums.alliedmods.net/showthread.php?p=2436146" }; public void OnPluginStart() { - ig_rs = 0; - iPluginS = 1; + CreateConVar("l4d2_mapfinalenext_version", PLUGIN_VERSION, "[L4D2] mapfinalenext plugin version", CVAR_FLAGS|FCVAR_DONTRECORD); + g_hCvarEnable = CreateConVar("l4d2_mapfinalenext_enable", "1", "Enable/Disable the plugin (1 - Enable, 0 - Disable)", CVAR_FLAGS, true, 0.0, true, 1.0); + g_hCvarCountdown = CreateConVar("l4d2_mapfinalenext_countdown", "8", "How many seconds before the map will be changed?", CVAR_FLAGS, true, 0.0, true, 60.0); + g_hCvarRoundsLimit = CreateConVar("l4d2_mapfinalenext_rounds_limit", "5", "How many rounds lost before the map will be changed?", CVAR_FLAGS, true, 0.0, true, 10.0); + AutoExecConfig(true, "l4d2_mapfinalenext"); + g_hCvarEnable.AddChangeHook(ConVarPluginOnChanged); + g_hCvarCountdown.AddChangeHook(ConVarsChanged); + g_hCvarRoundsLimit.AddChangeHook(ConVarsChanged); + + #if defined _l4d2_changelevel_included + if(bLateload) + { + bChangeLevelLib = LibraryExists("l4d2_changelevel"); + } + #endif +} + +#if defined _l4d2_changelevel_included +public void OnLibraryAdded(const char[] name) +{ + if(strcmp(name, "l4d2_changelevel") == 0) + { + bChangeLevelLib = true; + } +} - HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy); - HookEvent("finale_win", Event_FinalWin, EventHookMode_PostNoCopy); +public void OnLibraryRemoved(const char[] name) +{ + if(strcmp(name, "l4d2_changelevel") == 0) + { + bChangeLevelLib = false; + } } +#endif public void OnMapStart() { - ig_coop = 0; + ig_rs = 0; GetCurrentMap(sg_l4d2Map, sizeof(sg_l4d2Map)-1); if (sg_l4d2Map[0] == 'C') // fix { sg_l4d2Map[0] = 'c'; } - GetConVarString(FindConVar("mp_gamemode"), sg_mode, sizeof(sg_mode)-1); + FindConVar("mp_gamemode").GetString(sg_mode, sizeof(sg_mode)-1); - if (!strcmp(sg_mode, "coop", true)) + if (!strcmp(sg_mode, "coop", true) || !strcmp(sg_mode, "realism", true)) { - ig_coop = 1; + bg_coop = true; } - if (!strcmp(sg_mode, "realism", true)) + else { - ig_coop = 1; + bg_coop = false; } +} - ig_rs = 0; - if (iPluginS) +public void OnConfigsExecuted() +{ + IsAllowed(); +} + +void ConVarPluginOnChanged(ConVar hVariable, const char[] strOldValue, const char[] strNewValue) +{ + IsAllowed(); +} + +void ConVarsChanged(ConVar hVariable, const char[] strOldValue, const char[] strNewValue) +{ + fCointdown = g_hCvarCountdown.FloatValue; + iRoundsLimit = g_hCvarRoundsLimit.IntValue; +} + +void IsAllowed() +{ + bool bPluginOn = g_hCvarEnable.BoolValue; + if(!bHooked && bPluginOn) { - ig_rs = 3; - iPluginS = 0; + bHooked = true; + HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy); + HookEvent("finale_win", Event_FinalWin, EventHookMode_PostNoCopy); + } + else if(bHooked && !bPluginOn) + { + bHooked = false; + UnhookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy); + UnhookEvent("finale_win", Event_FinalWin, EventHookMode_PostNoCopy); } } -public Action HxTimerNextMap(Handle timer) +void Event_RoundStart(Event event, const char [] name, bool dontBroadcast) { - ig_rs = 0; + if (bg_coop) + { + ig_rs++; + if (ig_rs == iRoundsLimit) + { + PrintToChatAll("\x05Change Level"); + CreateTimer(fCointdown, HxTimerNextMap, _, TIMER_FLAG_NO_MAPCHANGE); + } + } +} + +void Event_FinalWin(Event event, const char [] name, bool dontBroadcast) +{ + if (bg_coop) + { + CreateTimer(fCointdown, HxTimerNextMap, _, TIMER_FLAG_NO_MAPCHANGE); + } +} + +Action HxTimerNextMap(Handle timer) +{ + if(!bHooked) return Plugin_Stop; + if (StrContains(sg_l4d2Map, "c1m", true) != -1) { - #if HX_FIXES_LUX - L4D2_ChangeLevel("c6m1_riverbank"); - #else + #if defined _l4d2_changelevel_included + if(bChangeLevelLib) + { + L4D2_ChangeLevel("c6m1_riverbank"); + } + else + { + ServerCommand("changelevel c6m1_riverbank"); + } + #else ServerCommand("changelevel c6m1_riverbank"); - #endif + #endif return Plugin_Stop; } - if (StrContains(sg_l4d2Map, "c6m", true) != -1) + else if (StrContains(sg_l4d2Map, "c6m", true) != -1) { - #if HX_FIXES_LUX - L4D2_ChangeLevel("c2m1_highway"); - #else + #if defined _l4d2_changelevel_included + if(bChangeLevelLib) + { + L4D2_ChangeLevel("c2m1_highway"); + } + else + { + ServerCommand("changelevel c2m1_highway"); + } + #else ServerCommand("changelevel c2m1_highway"); - #endif + #endif return Plugin_Stop; } - if (StrContains(sg_l4d2Map, "c2m", true) != -1) + else if (StrContains(sg_l4d2Map, "c2m", true) != -1) { - #if HX_FIXES_LUX - L4D2_ChangeLevel("c3m1_plankcountry"); - #else + #if defined _l4d2_changelevel_included + if(bChangeLevelLib) + { + L4D2_ChangeLevel("c3m1_plankcountry"); + } + else + { + ServerCommand("changelevel c3m1_plankcountry"); + } + #else ServerCommand("changelevel c3m1_plankcountry"); - #endif + #endif return Plugin_Stop; } - if (StrContains(sg_l4d2Map, "c3m", true) != -1) + else if (StrContains(sg_l4d2Map, "c3m", true) != -1) { - #if HX_FIXES_LUX - L4D2_ChangeLevel("c4m1_milltown_a"); - #else + #if defined _l4d2_changelevel_included + if(bChangeLevelLib) + { + L4D2_ChangeLevel("c4m1_milltown_a"); + } + else + { + ServerCommand("changelevel c4m1_milltown_a"); + } + #else ServerCommand("changelevel c4m1_milltown_a"); - #endif + #endif return Plugin_Stop; } - if (StrContains(sg_l4d2Map, "c4m", true) != -1) + else if (StrContains(sg_l4d2Map, "c4m", true) != -1) { - #if HX_FIXES_LUX - L4D2_ChangeLevel("c5m1_waterfront"); - #else + #if defined _l4d2_changelevel_included + if(bChangeLevelLib) + { + L4D2_ChangeLevel("c5m1_waterfront"); + } + else + { + ServerCommand("changelevel c5m1_waterfront"); + } + #else ServerCommand("changelevel c5m1_waterfront"); - #endif + #endif return Plugin_Stop; } - if (StrContains(sg_l4d2Map, "c5m", true) != -1) + else if (StrContains(sg_l4d2Map, "c5m", true) != -1) { - #if HX_FIXES_LUX - L4D2_ChangeLevel("c13m1_alpinecreek"); - #else + #if defined _l4d2_changelevel_included + if(bChangeLevelLib) + { + L4D2_ChangeLevel("c13m1_alpinecreek"); + } + else + { + ServerCommand("changelevel c13m1_alpinecreek"); + } + #else ServerCommand("changelevel c13m1_alpinecreek"); - #endif + #endif return Plugin_Stop; } - if (StrContains(sg_l4d2Map, "c13m", true) != -1) + else if (StrContains(sg_l4d2Map, "c13m", true) != -1) { - #if HX_FIXES_LUX - L4D2_ChangeLevel("c8m1_apartment"); - #else + #if defined _l4d2_changelevel_included + if(bChangeLevelLib) + { + L4D2_ChangeLevel("c8m1_apartment"); + } + else + { + ServerCommand("changelevel c8m1_apartment"); + } + #else ServerCommand("changelevel c8m1_apartment"); - #endif + #endif return Plugin_Stop; } - if (StrContains(sg_l4d2Map, "c8m", true) != -1) + else if (StrContains(sg_l4d2Map, "c8m", true) != -1) { - #if HX_FIXES_LUX - L4D2_ChangeLevel("c9m1_alleys"); - #else + #if defined _l4d2_changelevel_included + if(bChangeLevelLib) + { + L4D2_ChangeLevel("c9m1_alleys"); + } + else + { + ServerCommand("changelevel c9m1_alleys"); + } + #else ServerCommand("changelevel c9m1_alleys"); - #endif + #endif return Plugin_Stop; } - if (StrContains(sg_l4d2Map, "c9m", true) != -1) + else if (StrContains(sg_l4d2Map, "c9m", true) != -1) { - #if HX_FIXES_LUX - L4D2_ChangeLevel("c10m1_caves"); - #else + #if defined _l4d2_changelevel_included + if(bChangeLevelLib) + { + L4D2_ChangeLevel("c10m1_caves"); + } + else + { + ServerCommand("changelevel c10m1_caves"); + } + #else ServerCommand("changelevel c10m1_caves"); - #endif + #endif return Plugin_Stop; } - if (StrContains(sg_l4d2Map, "c10m", true) != -1) + else if (StrContains(sg_l4d2Map, "c10m", true) != -1) { - #if HX_FIXES_LUX - L4D2_ChangeLevel("c11m1_greenhouse"); - #else + #if defined _l4d2_changelevel_included + if(bChangeLevelLib) + { + L4D2_ChangeLevel("c11m1_greenhouse"); + } + else + { + ServerCommand("changelevel c11m1_greenhouse"); + } + #else ServerCommand("changelevel c11m1_greenhouse"); - #endif + #endif return Plugin_Stop; } - if (StrContains(sg_l4d2Map, "c11m", true) != -1) + else if (StrContains(sg_l4d2Map, "c11m", true) != -1) { - #if HX_FIXES_LUX - L4D2_ChangeLevel("c12m1_hilltop"); - #else + #if defined _l4d2_changelevel_included + if(bChangeLevelLib) + { + L4D2_ChangeLevel("c12m1_hilltop"); + } + else + { + ServerCommand("changelevel c12m1_hilltop"); + } + #else ServerCommand("changelevel c12m1_hilltop"); - #endif + #endif return Plugin_Stop; } - if (StrContains(sg_l4d2Map, "c12m", true) != -1) + else if (StrContains(sg_l4d2Map, "c12m", true) != -1) { - #if HX_FIXES_LUX - L4D2_ChangeLevel("c7m1_docks"); - #else + #if defined _l4d2_changelevel_included + if(bChangeLevelLib) + { + L4D2_ChangeLevel("c7m1_docks"); + } + else + { + ServerCommand("changelevel c7m1_docks"); + } + #else ServerCommand("changelevel c7m1_docks"); - #endif + #endif return Plugin_Stop; } - if (StrContains(sg_l4d2Map, "c7m", true) != -1) + else if (StrContains(sg_l4d2Map, "c7m", true) != -1) { - #if HX_FIXES_LUX - L4D2_ChangeLevel("c14m1_junkyard"); - #else + #if defined _l4d2_changelevel_included + if(bChangeLevelLib) + { + L4D2_ChangeLevel("c14m1_junkyard"); + } + else + { + ServerCommand("changelevel c14m1_junkyard"); + } + #else ServerCommand("changelevel c14m1_junkyard"); - #endif + #endif return Plugin_Stop; } - -#if HX_FIXES_LUX - L4D2_ChangeLevel("c1m1_hotel"); -#else - ServerCommand("changelevel c1m1_hotel"); -#endif - return Plugin_Stop; -} - -public void Event_RoundStart(Event event, const char [] name, bool dontBroadcast) -{ - if (ig_coop) + else { - ig_rs += 1; - if (ig_rs > 4) + #if defined _l4d2_changelevel_included + if(bChangeLevelLib) { - int i = 1; - while (i <= MaxClients) - { - if (IsClientInGame(i)) - { - PrintToChat(i, "\x05Change Level"); - } - i += 1; - } - CreateTimer(8.0, HxTimerNextMap, _, TIMER_FLAG_NO_MAPCHANGE); + L4D2_ChangeLevel("c1m1_hotel"); } + else + { + ServerCommand("changelevel c1m1_hotel"); + } + #else + ServerCommand("changelevel c1m1_hotel"); + #endif + return Plugin_Stop; } } - -public void Event_FinalWin(Event event, const char [] name, bool dontBroadcast) -{ - if (ig_coop) - { - CreateTimer(7.0, HxTimerNextMap, _, TIMER_FLAG_NO_MAPCHANGE); - } -} - -public void OnMapEnd() -{ - ig_rs = 0; -}