366 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			366 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
| #include <cstrike>
 | |
| #include <multicolors>
 | |
| #include <sourcemod>
 | |
| #include <zombiereloaded>
 | |
| 
 | |
| #include "TeamManager.inc"
 | |
| 
 | |
| #pragma semicolon 1
 | |
| #pragma newdecls required
 | |
| 
 | |
| public Plugin myinfo =
 | |
| {
 | |
| 	name 		= "SpecialSettings",
 | |
| 	author 		= "Neon",
 | |
| 	description = "Special Settings",
 | |
| 	version 	= "1.0",
 | |
| 	url 		= "https://steamcommunity.com/id/n3ontm"
 | |
| }
 | |
| 
 | |
| Handle g_VoteMenu = INVALID_HANDLE;
 | |
| Handle g_SettingsList = INVALID_HANDLE;
 | |
| 
 | |
| ConVar g_cvHlxBonus;
 | |
| ConVar g_cvBhop;
 | |
| ConVar g_cvAA;
 | |
| 
 | |
| bool g_bIsRevote = false;
 | |
| bool g_bEnabled = false;
 | |
| 
 | |
| char g_sCurrentSettings[128];
 | |
| 
 | |
| public void OnPluginStart()
 | |
| {
 | |
| 	RegAdminCmd("sm_special_settings", Command_ForceVote, ADMFLAG_VOTE);
 | |
| 	RegAdminCmd("sm_ss", Command_ForceVote, ADMFLAG_VOTE);
 | |
| 	RegConsoleCmd("sm_currentsettings", Command_CurrentSettings, "Shows the Mode being played currently");
 | |
| 
 | |
| 	g_cvHlxBonus = FindConVar("hlx_difficulty_humans");
 | |
| 	g_cvBhop = FindConVar("sv_enablebunnyhopping");
 | |
| 	g_cvAA = FindConVar("sv_airaccelerate");
 | |
| 	HookConVarChange(g_cvBhop, ConVarChanged_Bhop_AA);
 | |
| 	HookConVarChange(g_cvAA, ConVarChanged_Bhop_AA);
 | |
| }
 | |
| 
 | |
| public void OnMapStart()
 | |
| {
 | |
| 	g_bEnabled = false;
 | |
| 	g_sCurrentSettings = "";
 | |
| 
 | |
| 	GenerateArray();
 | |
| }
 | |
| 
 | |
| public void OnClientPutInServer(int client)
 | |
| {
 | |
| 	if (!g_bEnabled)
 | |
| 		return;
 | |
| 
 | |
| 	char sBuffer[512];
 | |
| 	Format(sBuffer, sizeof(sBuffer), "Current Settings: %s", g_sCurrentSettings);
 | |
| 
 | |
| 	Panel hNotifyPanel = new Panel(GetMenuStyleHandle(MenuStyle_Radio));
 | |
| 	hNotifyPanel.SetTitle("*** Special Settings have been enabled for this map! Check them below. ***");
 | |
| 	hNotifyPanel.DrawItem("", ITEMDRAW_SPACER);
 | |
| 	hNotifyPanel.DrawItem(sBuffer, ITEMDRAW_RAWLINE);
 | |
| 	hNotifyPanel.DrawItem("", ITEMDRAW_SPACER);
 | |
| 
 | |
| 	if (strcmp(g_sCurrentSettings, "Sonaki") == 0)
 | |
| 	{
 | |
| 		hNotifyPanel.DrawItem("Falldamage", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Pushnades instead of Firenades", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Pushnades cost 6k with Infinite Amount to Rebuy", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("No Rebuy for all other Weapons", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Less Ammo", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Jump Height 1.0", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Lower General Knockback", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Knifing Zombies deals a lot of Damage", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Higher Air Accelerate", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("No Bhop", ITEMDRAW_RAWLINE);
 | |
| 
 | |
| 	}
 | |
| 	else if (strcmp(g_sCurrentSettings, "I3D") == 0)
 | |
| 	{
 | |
| 		hNotifyPanel.DrawItem("Falldamage", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("No Rebuys at all", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Less Ammo", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Jump Height 1.0", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("No Burn-Time from Firenades", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Higher Nade Knockback", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Higher General Knockback", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Default Knife Knockback", ITEMDRAW_RAWLINE);
 | |
| 	}
 | |
| 	else if (strcmp(g_sCurrentSettings, "Hellz") == 0)
 | |
| 	{
 | |
|   		hNotifyPanel.DrawItem("Unlimited Ammo", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("No Kevlar and Nade Rebuy", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("All other Weapons for Free and Infinite Amount to Rebuy", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Humans have 1 Freezenade", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Jump Height 1.0", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("A lot Shorter Burn-Time from Firenades", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Very Low General Knockback", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Default Knife Knockback", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Way Stronger Zombies (more Speed, HP and HP Regen)", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("No Tossing", ITEMDRAW_RAWLINE);
 | |
| 	}
 | |
| 	else if (strcmp(g_sCurrentSettings, "Plaguefest") == 0)
 | |
| 	{
 | |
| 		hNotifyPanel.DrawItem("Falldamage", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("No Rebuys at all", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Less Ammo", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Jump Height 1.0", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Shorter Burn-Time from Firenades", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Slightly Higher General Knockback", ITEMDRAW_RAWLINE);
 | |
| 		hNotifyPanel.DrawItem("Default Knife Knockback", ITEMDRAW_RAWLINE);
 | |
| 	}
 | |
| 	else if (strcmp(g_sCurrentSettings, "GFLClan [default]") == 0)
 | |
| 	{
 | |
| 		hNotifyPanel.DrawItem("Normal GFL Settings", ITEMDRAW_RAWLINE);
 | |
| 	}
 | |
| 	hNotifyPanel.DrawItem("", ITEMDRAW_SPACER);
 | |
| 	hNotifyPanel.DrawItem("You can check these settings by typing: /currentsettings", ITEMDRAW_RAWLINE);
 | |
| 	hNotifyPanel.DrawItem("", ITEMDRAW_SPACER);
 | |
| 	hNotifyPanel.DrawItem("", ITEMDRAW_SPACER);
 | |
| 	hNotifyPanel.DrawItem("1. Got it!", ITEMDRAW_RAWLINE);
 | |
| 	hNotifyPanel.SetKeys(1023);
 | |
| 	hNotifyPanel.Send(client, MenuHandler_NotifyPanel, 0);
 | |
| 
 | |
| 	delete hNotifyPanel;
 | |
| }
 | |
| 
 | |
| public void ConVarChanged_Bhop_AA(ConVar convar, char[] oldValue, const char[] newValue)
 | |
| {
 | |
| 	if ((g_cvBhop.BoolValue) && (strcmp(g_sCurrentSettings, "Sonaki") == 0))
 | |
| 	{
 | |
| 		ServerCommand("sv_enablebunnyhopping 0");
 | |
| 	}
 | |
| 
 | |
| 	if ((g_cvAA.IntValue != 1337) && (strcmp(g_sCurrentSettings, "Sonaki") == 0))
 | |
| 	{
 | |
| 		ServerCommand("sv_airaccelerate 1337");
 | |
| 	}
 | |
| }
 | |
| 
 | |
| public Action Command_ForceVote(int client, int args)
 | |
| {
 | |
| 	if (g_bEnabled)
 | |
| 	{
 | |
| 		ReplyToCommand(client, "[Special Settings] Special Settings is already enabled for the duration of this map!");
 | |
| 		return Plugin_Handled;
 | |
| 	}
 | |
| 
 | |
| 	GenerateArray();
 | |
| 	CreateTimer(1.0, StartVote, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
 | |
| 	CreateTimer(0.1, DisableFunMode, INVALID_HANDLE, TIMER_FLAG_NO_MAPCHANGE);
 | |
| 
 | |
| 	ShowActivity2(client, "\x01[Special Settings] \x04", "\x01Initiated a Special Settings vote.");
 | |
| 	LogAction(client, -1, "\"%L\" initiated a Special Settings vote.", client);
 | |
| 
 | |
| 	return Plugin_Handled;
 | |
| }
 | |
| 
 | |
| public Action Command_CurrentSettings(int client, int args)
 | |
| {
 | |
| 	if (g_bEnabled)
 | |
| 	{
 | |
| 		OnClientPutInServer(client);
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		CPrintToChat(client, "{green}[Special Settings] {white}is currently not active!");
 | |
| 	}
 | |
| 	return Plugin_Handled;
 | |
| }
 | |
| 
 | |
| public Action DisableFunMode(Handle timer)
 | |
| {
 | |
| 	ServerCommand("sm plugins unload disabled/FunMode");
 | |
| }
 | |
| 
 | |
| public void GenerateArray()
 | |
| {
 | |
| 	int iBlockSize = ByteCountToCells(PLATFORM_MAX_PATH);
 | |
| 	g_SettingsList = CreateArray(iBlockSize);
 | |
| 
 | |
| 	PushArrayString(g_SettingsList, "Sonaki");
 | |
| 	PushArrayString(g_SettingsList, "I3D");
 | |
| 	PushArrayString(g_SettingsList, "Hellz");
 | |
| 	PushArrayString(g_SettingsList, "Plaguefest");
 | |
| 
 | |
| 	int iArraySize = GetArraySize(g_SettingsList);
 | |
| 
 | |
| 	for (int i = 0; i <= (iArraySize - 1); i++)
 | |
| 	{
 | |
| 		int iRandom = GetRandomInt(0, iArraySize - 1);
 | |
| 		char sTemp1[128];
 | |
| 		GetArrayString(g_SettingsList, iRandom, sTemp1, sizeof(sTemp1));
 | |
| 		char sTemp2[128];
 | |
| 		GetArrayString(g_SettingsList, i, sTemp2, sizeof(sTemp2));
 | |
| 		SetArrayString(g_SettingsList, i, sTemp1);
 | |
| 		SetArrayString(g_SettingsList, iRandom, sTemp2);
 | |
| 	}
 | |
| 	ShiftArrayUp(g_SettingsList, 0);
 | |
| 	SetArrayString(g_SettingsList, 0, "GFLClan [default]");
 | |
| }
 | |
| 
 | |
| public Action StartVote(Handle timer)
 | |
| {
 | |
| 	static int iCountDown = 5;
 | |
| 	PrintCenterTextAll("[Special Settings] Starting Vote in %ds", iCountDown);
 | |
| 
 | |
| 	if (iCountDown-- <= 0)
 | |
| 	{
 | |
| 		iCountDown = 5;
 | |
| 		InitiateVote();
 | |
| 		return Plugin_Stop;
 | |
| 	}
 | |
| 
 | |
| 	return Plugin_Continue;
 | |
| }
 | |
| 
 | |
| public void InitiateVote()
 | |
| {
 | |
| 	if(IsVoteInProgress())
 | |
| 	{
 | |
| 		CPrintToChatAll("{green}[Special Settings] {white}Another vote is currently in progress, retrying again in 5s.");
 | |
| 		CreateTimer(1.0, StartVote, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	Handle menuStyle = GetMenuStyleHandle(MenuStyle_Default);
 | |
| 	g_VoteMenu = CreateMenuEx(menuStyle, Handler_SettingsVoteMenu, MenuAction_End | MenuAction_Display | MenuAction_DisplayItem | MenuAction_VoteCancel);
 | |
| 
 | |
| 	int iArraySize = GetArraySize(g_SettingsList);
 | |
| 	for (int i = 0; i <= (iArraySize - 1); i++)
 | |
| 	{
 | |
| 		char sBuffer[128];
 | |
| 		GetArrayString(g_SettingsList, i, sBuffer, sizeof(sBuffer));
 | |
| 		AddMenuItem(g_VoteMenu, sBuffer, sBuffer);
 | |
| 	}
 | |
| 
 | |
| 	SetMenuOptionFlags(g_VoteMenu, MENUFLAG_BUTTON_NOVOTE);
 | |
| 	SetMenuTitle(g_VoteMenu, "Server Setings for the current Map?");
 | |
| 	SetVoteResultCallback(g_VoteMenu, Handler_SettingsVoteFinished);
 | |
| 	VoteMenuToAll(g_VoteMenu, 20);
 | |
| }
 | |
| 
 | |
| public int Handler_SettingsVoteMenu(Handle menu, MenuAction action, int param1, int param2)
 | |
| {
 | |
| 	switch(action)
 | |
| 	{
 | |
| 		case MenuAction_End:
 | |
| 			delete menu;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| public int MenuHandler_NotifyPanel(Handle menu, MenuAction action, int param1, int param2)
 | |
| {
 | |
| 	switch(action)
 | |
| 	{
 | |
| 		case MenuAction_Select, MenuAction_Cancel:
 | |
| 			delete menu;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| public void Handler_SettingsVoteFinished(Handle menu, int num_votes, int num_clients, const int[][] client_info, int num_items, const int[][] item_info)
 | |
| {
 | |
| 	int highest_votes = item_info[0][VOTEINFO_ITEM_VOTES];
 | |
| 	int required_percent = 60;
 | |
| 	int required_votes = RoundToCeil(float(num_votes) * float(required_percent) / 100);
 | |
| 
 | |
| 	if ((highest_votes < required_votes) && (!g_bIsRevote))
 | |
| 	{
 | |
| 		CPrintToChatAll("{green}[Special Settings] {white}A revote is needed!");
 | |
| 		char sFirst[128];
 | |
| 		char sSecond[128];
 | |
| 		GetMenuItem(menu, item_info[0][VOTEINFO_ITEM_INDEX], sFirst, sizeof(sFirst));
 | |
| 		GetMenuItem(menu, item_info[1][VOTEINFO_ITEM_INDEX], sSecond, sizeof(sSecond));
 | |
| 		ClearArray(g_SettingsList);
 | |
| 		PushArrayString(g_SettingsList, sFirst);
 | |
| 		PushArrayString(g_SettingsList, sSecond);
 | |
| 		g_bIsRevote = true;
 | |
| 		CreateTimer(1.0, StartVote, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
 | |
| 
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	// No revote needed, continue as normal.
 | |
| 	g_bIsRevote = false;
 | |
| 	Handler_VoteFinishedGeneric(menu, num_votes, num_clients, client_info, num_items, item_info);
 | |
| }
 | |
| 
 | |
| public void Handler_VoteFinishedGeneric(Handle menu, int num_votes, int num_clients, const int[][] client_info, int num_items, const int[][] item_info)
 | |
| {
 | |
| 	char sWinner[128];
 | |
| 	GetMenuItem(menu, item_info[0][VOTEINFO_ITEM_INDEX], sWinner, sizeof(sWinner));
 | |
| 	float fPercentage = float(item_info[0][VOTEINFO_ITEM_VOTES] * 100) / float(num_votes);
 | |
| 
 | |
| 	CPrintToChatAll("{green}[Special Settings] {white}Vote Finished! Winner: {red}%s{white} with %d%% of %d votes!", sWinner, RoundToFloor(fPercentage), num_votes);
 | |
| 
 | |
| 	bool bNeedRestart = false;
 | |
| 	if (strcmp(sWinner, "Sonaki") == 0)
 | |
| 	{
 | |
| 		ServerCommand("exec sonaki");
 | |
| 		bNeedRestart = true;
 | |
| 	}
 | |
| 	else if (strcmp(sWinner, "I3D") == 0)
 | |
| 	{
 | |
| 		ServerCommand("exec i3d");
 | |
| 		bNeedRestart = true;
 | |
| 	}
 | |
| 	else if (strcmp(sWinner, "Hellz") == 0)
 | |
| 	{
 | |
| 		ServerCommand("exec hellz");
 | |
| 		bNeedRestart = true;
 | |
| 	}
 | |
| 	else if (strcmp(sWinner, "Plaguefest") == 0)
 | |
| 	{
 | |
| 		ServerCommand("exec plaguefest");
 | |
| 		bNeedRestart = true;
 | |
| 	}
 | |
| 	else if ((strcmp(sWinner, "GFLClan [default]") == 0) && (strcmp(g_sCurrentSettings, "") != 0))
 | |
| 	{
 | |
| 		ServerCommand("exec gfl");
 | |
| 		bNeedRestart = true;
 | |
| 	}
 | |
| 
 | |
| 	float fDelay = 3.0;
 | |
| 	if (bNeedRestart)
 | |
| 	{
 | |
| 		CS_TerminateRound(fDelay, CSRoundEnd_GameStart, false);
 | |
| 		CreateTimer(fDelay, Timer_IncreaseKB, _, TIMER_FLAG_NO_MAPCHANGE);
 | |
| 	}
 | |
| 	CreateTimer(fDelay, Timer_FireOnClientPutInServer, _, TIMER_FLAG_NO_MAPCHANGE);
 | |
| 	g_sCurrentSettings = sWinner;
 | |
| 	g_bEnabled = true;
 | |
| }
 | |
| 
 | |
| public Action Timer_IncreaseKB(Handle timer)
 | |
| {
 | |
| 	if (g_cvHlxBonus.IntValue == 1)
 | |
| 	{
 | |
| 		ServerCommand("zr_class_set_multiplier zombies knockback 1.05");
 | |
| 	}
 | |
| 	else if (g_cvHlxBonus.IntValue == 2)
 | |
| 	{
 | |
| 		ServerCommand("zr_class_set_multiplier zombies knockback 1.1");
 | |
| 	}
 | |
| 	else if (g_cvHlxBonus.IntValue == 3)
 | |
| 	{
 | |
| 		ServerCommand("zr_class_set_multiplier zombies knockback 1.15");
 | |
| 	}
 | |
| 	return Plugin_Handled;
 | |
| }
 | |
| 
 | |
| public Action Timer_FireOnClientPutInServer(Handle hThis)
 | |
| {
 | |
| 	for (int i = 1; i <= MaxClients; i++)
 | |
| 	{
 | |
| 		if (!IsClientInGame(i) || IsFakeClient(i))
 | |
| 			continue;
 | |
| 
 | |
| 		OnClientPutInServer(i);
 | |
| 	}
 | |
| 
 | |
| 	return Plugin_Handled;
 | |
| }
 |