Raised This Month: $51 Target: $400
 12% 

[TF2]SetClass


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
Michael Westen
Junior Member
Join Date: May 2015
Old 06-30-2015 , 15:40   [TF2]SetClass
Reply With Quote #1

Hi, I found a plugin that enables players to change their class at will, even during an mvm wave. It works perfectly however I wanted to add a quick menu of the classes so that if players just type !class, they can select one rather than have to type out the class name. I'm having trouble setting up lines 153-162 so that it actually selects a class for them rather than just displays a menu. Any help would be appreciated and I'm sorry for always asking for help. I know I'm quite new at sourcepwn if I can't even code a simple menu

Here's the plugin. What I added in is in red:
Code:
#pragma semicolon 1;

#include <sourcemod>
#include <tf2>
#include <tf2_stocks>

#define PLUGIN_VERSION "1.2.3"
 
public Plugin:myinfo =
{
	name = "TF2 Set Class",
	author = "Tylerst, small modification by avi9526",
	description = "Set the target(s) class",
	version = PLUGIN_VERSION,
};

new Handle:hChat = INVALID_HANDLE;
new Handle:hLog = INVALID_HANDLE;

public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max)
{
	new String:Game[32];
	GetGameFolderName(Game, sizeof(Game));
	if(!StrEqual(Game, "tf"))
	{
		Format(error, err_max, "This plugin only works for Team Fortress 2");
		return APLRes_Failure;
	}
	return APLRes_Success;
}

public OnPluginStart()
{	
	LoadTranslations("common.phrases");
	CreateConVar("sm_setclass_version", PLUGIN_VERSION, "Set the target(s) class, Usage: sm_setclass \"target\" \"class\"", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);
	hChat = CreateConVar("sm_setclass_chat", "1", "Enable/Disable(1/0) Showing setclass changes in chat", FCVAR_PLUGIN|FCVAR_NOTIFY);
	hLog = CreateConVar("sm_setclass_log", "1", "Enable/Disable(1/0) Logging of setclass changes", FCVAR_PLUGIN|FCVAR_NOTIFY);	
	RegAdminCmd("sm_setclass", Command_Setclass, ADMFLAG_SLAY, "Usage: sm_setclass \"target\" \"class\"");	
	// Change My Class command - usefull in MvM mode
	RegConsoleCmd("sm_class", Command_SetMyClass, "Usage: sm_class \"class\"");
}

public Action:Command_Setclass(client, args)
{
	if(args != 2)
	{
		ReplyToCommand(client, "[SM] Usage: sm_setclass \"target\" \"class\"");
	}
	else
	{
		new String:setclasstarget[MAX_NAME_LENGTH], String:strclass[10], TFClassType:class, String:target_name[MAX_TARGET_LENGTH], target_list[MAXPLAYERS], target_count, bool:tn_is_ml, random = false;
		GetCmdArg(1, setclasstarget, sizeof(setclasstarget));
		GetCmdArg(2, strclass, sizeof(strclass));
		if(StrEqual(strclass, "scout", false))
		{
			class = TFClass_Scout;
			Format(strclass, sizeof(strclass), "Scout");	
		}
		else if(StrEqual(strclass, "soldier", false))
		{
			class = TFClass_Soldier;
			Format(strclass, sizeof(strclass), "Soldier");	
		}
		else if(StrEqual(strclass, "pyro", false))
		{
			class = TFClass_Pyro;
			Format(strclass, sizeof(strclass), "Pyro");	
		}
		else if(StrEqual(strclass, "demoman", false))
		{
			class = TFClass_DemoMan;
			Format(strclass, sizeof(strclass), "Demoman");	
		}
		else if(StrEqual(strclass, "heavy", false))
		{
			class = TFClass_Heavy;
			Format(strclass, sizeof(strclass), "Heavy");	
		}
		else if(StrEqual(strclass, "engineer", false))
		{
			class = TFClass_Engineer;
			Format(strclass, sizeof(strclass), "Engineer");	
		}
		else if(StrEqual(strclass, "medic", false))
		{
			class = TFClass_Medic;
			Format(strclass, sizeof(strclass), "Medic");	
		}
		else if(StrEqual(strclass, "sniper", false))
		{
			class = TFClass_Sniper;
			Format(strclass, sizeof(strclass), "Sniper");	
		}
		else if(StrEqual(strclass, "spy", false))
		{
			class = TFClass_Spy;
			Format(strclass, sizeof(strclass), "Spy");	
		}
		else if(StrEqual(strclass, "random", false))
		{
			random = true;
			Format(strclass, sizeof(strclass), "Random");	
		}
		else
		{
			ReplyToCommand(client, "[SM] Invalid Class (\"%s\")", strclass);
			return Plugin_Handled;
		}
		if((target_count = ProcessTargetString(
				setclasstarget,
				client,
				target_list,
				MAXPLAYERS,
				COMMAND_FILTER_CONNECTED,
				target_name,
				sizeof(target_name),
				tn_is_ml)) <= 0)
		{
			ReplyToTargetError(client, target_count);
			return Plugin_Handled;
		}
		for(new i = 0; i < target_count; i++)
		{
			if(random) class = TFClassType:GetRandomInt(1, 9);
			if(IsValidEntity(target_list[i]))
			{
				TF2_SetPlayerClass(target_list[i], class);
				if(IsPlayerAlive(target_list[i]))
				{
					SetEntityHealth(target_list[i], 25);
					TF2_RegeneratePlayer(target_list[i]);
					new weapon = GetPlayerWeaponSlot(target_list[i], TFWeaponSlot_Primary);
					if(IsValidEntity(weapon))
					{
						SetEntPropEnt(target_list[i], Prop_Send, "m_hActiveWeapon", weapon);
					}
				}

			}
			if(GetConVarBool(hLog))
			{
				LogAction(client, target_list[i], "\"%L\" set class of  \"%L\" to (class %s)", client, target_list[i], strclass);	
			}
		}
		if(GetConVarBool(hChat))
		{
			ShowActivity2(client, "[SM] ","Set class of %s to %s", target_name, strclass);
		}	
	}
	return Plugin_Handled;	
}

public ClassMenuCallback(Handle:menu, MenuAction:action, client, param2)
{
	if(action == MenuAction_End) CloseHandle(menu);

	if(action == MenuAction_Select)
	{
		decl String:info[12];
		GetMenuItem(menu, info, sizeof(info));
		strclass(client = StringToInt(info));
	}
}

public Action:Command_SetMyClass(client, args)
{
	if(args != 1)
	{
		new Handle:cm = CreateMenu(ClassMenuCallback);
		SetMenuTitle(cm, "Choose Your Class!");
		AddMenuItem(cm, "0", "Scout");
		AddMenuItem(cm, "1", "Soldier");
		AddMenuItem(cm, "2", "Pyro");
		AddMenuItem(cm, "3", "Demoman");
		AddMenuItem(cm, "4", "Heavy");
		AddMenuItem(cm, "5", "Engineer");
		AddMenuItem(cm, "6", "Medic");
		AddMenuItem(cm, "7", "Sniper");
		AddMenuItem(cm, "8", "Spy");
		AddMenuItem(cm, "9", "Random");
		DisplayMenu(cm, client, MENU_TIME_FOREVER);
		//ReplyToCommand(client, "[SM] Usage: sm_class \"class\"");
	}
	else
	{
		new String:strclass[10], TFClassType:class, random = false;
		GetCmdArg(1, strclass, sizeof(strclass));
		if(StrEqual(strclass, "scout", false))
		{
			class = TFClass_Scout;
			Format(strclass, sizeof(strclass), "Scout");	
		}
		else if(StrEqual(strclass, "soldier", false))
		{
			class = TFClass_Soldier;
			Format(strclass, sizeof(strclass), "Soldier");	
		}
		else if(StrEqual(strclass, "pyro", false))
		{
			class = TFClass_Pyro;
			Format(strclass, sizeof(strclass), "Pyro");	
		}
		else if(StrEqual(strclass, "demoman", false))
		{
			class = TFClass_DemoMan;
			Format(strclass, sizeof(strclass), "Demoman");	
		}
		else if(StrEqual(strclass, "heavy", false))
		{
			class = TFClass_Heavy;
			Format(strclass, sizeof(strclass), "Heavy");	
		}
		else if(StrEqual(strclass, "engineer", false))
		{
			class = TFClass_Engineer;
			Format(strclass, sizeof(strclass), "Engineer");	
		}
		else if(StrEqual(strclass, "medic", false))
		{
			class = TFClass_Medic;
			Format(strclass, sizeof(strclass), "Medic");	
		}
		else if(StrEqual(strclass, "sniper", false))
		{
			class = TFClass_Sniper;
			Format(strclass, sizeof(strclass), "Sniper");	
		}
		else if(StrEqual(strclass, "spy", false))
		{
			class = TFClass_Spy;
			Format(strclass, sizeof(strclass), "Spy");	
		}
		else if(StrEqual(strclass, "random", false))
		{
			random = true;
			Format(strclass, sizeof(strclass), "Random");	
		}
		else
		{
			ReplyToCommand(client, "[SM] Invalid Class (\"%s\")", strclass);
			return Plugin_Handled;
		}
		if(random) class = TFClassType:GetRandomInt(1, 9);
		if(IsValidEntity(client))
		{
			TF2_SetPlayerClass(client, class);
			if(IsPlayerAlive(client))
			{
				SetEntityHealth(client, 25);
				TF2_RegeneratePlayer(client);
				new weapon = GetPlayerWeaponSlot(client, TFWeaponSlot_Primary);
				if(IsValidEntity(weapon))
				{
					SetEntPropEnt(client, Prop_Send, "m_hActiveWeapon", weapon);
				}
			}

		}
		if(GetConVarBool(hLog))
		{
			LogAction(client, client, "\"%L\" set class to (class %s)", client, strclass);	
		}
		if(GetConVarBool(hChat))
		{
			PrintToChat(client, "[SM] ","You set your class to %s", strclass);
		}	
	}
	return Plugin_Handled;	
}
Original Plugins Thread:
Michael Westen is offline
Michael Westen
Junior Member
Join Date: May 2015
Old 06-30-2015 , 19:25   Re: [TF2]SetClass
Reply With Quote #2

I got it to work by doing this, but I get one warning: Line 346: warning tag mismatch.

Code:
#pragma semicolon 1;

#include <sourcemod>
#include <tf2>
#include <tf2_stocks>

#define PLUGIN_VERSION "1.2.3"
 
public Plugin:myinfo =
{
	name = "TF2 Set Class",
	author = "Tylerst, small modification by avi9526",
	description = "Set the target(s) class",
	version = PLUGIN_VERSION,
};

new Handle:hChat = INVALID_HANDLE;
new Handle:hLog = INVALID_HANDLE;

public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max)
{
	new String:Game[32];
	GetGameFolderName(Game, sizeof(Game));
	if(!StrEqual(Game, "tf"))
	{
		Format(error, err_max, "This plugin only works for Team Fortress 2");
		return APLRes_Failure;
	}
	return APLRes_Success;
}

public OnPluginStart()
{	
	LoadTranslations("common.phrases");
	CreateConVar("sm_setclass_version", PLUGIN_VERSION, "Set the target(s) class, Usage: sm_setclass \"target\" \"class\"", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);
	hChat = CreateConVar("sm_setclass_chat", "1", "Enable/Disable(1/0) Showing setclass changes in chat", FCVAR_PLUGIN|FCVAR_NOTIFY);
	hLog = CreateConVar("sm_setclass_log", "1", "Enable/Disable(1/0) Logging of setclass changes", FCVAR_PLUGIN|FCVAR_NOTIFY);	
	RegAdminCmd("sm_setclass", Command_Setclass, ADMFLAG_SLAY, "Usage: sm_setclass \"target\" \"class\"");	
	// Change My Class command - usefull in MvM mode
	RegConsoleCmd("sm_class", Command_SetMyClass, "Usage: sm_class \"class\"");
}

public Action:Command_Setclass(client, args)
{
	if(args != 2)
	{
		ReplyToCommand(client, "[SM] Usage: sm_setclass \"target\" \"class\"");
	}
	else
	{
		new String:setclasstarget[MAX_NAME_LENGTH], String:strclass[10], TFClassType:class, String:target_name[MAX_TARGET_LENGTH], target_list[MAXPLAYERS], target_count, bool:tn_is_ml, random = false;
		GetCmdArg(1, setclasstarget, sizeof(setclasstarget));
		GetCmdArg(2, strclass, sizeof(strclass));
		if(StrEqual(strclass, "scout", false))
		{
			class = TFClass_Scout;
			Format(strclass, sizeof(strclass), "Scout");	
		}
		else if(StrEqual(strclass, "soldier", false))
		{
			class = TFClass_Soldier;
			Format(strclass, sizeof(strclass), "Soldier");	
		}
		else if(StrEqual(strclass, "pyro", false))
		{
			class = TFClass_Pyro;
			Format(strclass, sizeof(strclass), "Pyro");	
		}
		else if(StrEqual(strclass, "demoman", false))
		{
			class = TFClass_DemoMan;
			Format(strclass, sizeof(strclass), "Demoman");	
		}
		else if(StrEqual(strclass, "heavy", false))
		{
			class = TFClass_Heavy;
			Format(strclass, sizeof(strclass), "Heavy");	
		}
		else if(StrEqual(strclass, "engineer", false))
		{
			class = TFClass_Engineer;
			Format(strclass, sizeof(strclass), "Engineer");	
		}
		else if(StrEqual(strclass, "medic", false))
		{
			class = TFClass_Medic;
			Format(strclass, sizeof(strclass), "Medic");	
		}
		else if(StrEqual(strclass, "sniper", false))
		{
			class = TFClass_Sniper;
			Format(strclass, sizeof(strclass), "Sniper");	
		}
		else if(StrEqual(strclass, "spy", false))
		{
			class = TFClass_Spy;
			Format(strclass, sizeof(strclass), "Spy");	
		}
		else if(StrEqual(strclass, "random", false))
		{
			random = true;
			Format(strclass, sizeof(strclass), "Random");	
		}
		else
		{
			ReplyToCommand(client, "[SM] Invalid Class (\"%s\")", strclass);
			return Plugin_Handled;
		}
		if((target_count = ProcessTargetString(
				setclasstarget,
				client,
				target_list,
				MAXPLAYERS,
				COMMAND_FILTER_CONNECTED,
				target_name,
				sizeof(target_name),
				tn_is_ml)) <= 0)
		{
			ReplyToTargetError(client, target_count);
			return Plugin_Handled;
		}
		for(new i = 0; i < target_count; i++)
		{
			if(random) class = TFClassType:GetRandomInt(1, 9);
			if(IsValidEntity(target_list[i]))
			{
				TF2_SetPlayerClass(target_list[i], class);
				if(IsPlayerAlive(target_list[i]))
				{
					SetEntityHealth(target_list[i], 25);
					TF2_RegeneratePlayer(target_list[i]);
					new weapon = GetPlayerWeaponSlot(target_list[i], TFWeaponSlot_Primary);
					if(IsValidEntity(weapon))
					{
						SetEntPropEnt(target_list[i], Prop_Send, "m_hActiveWeapon", weapon);
					}
				}

			}
			if(GetConVarBool(hLog))
			{
				LogAction(client, target_list[i], "\"%L\" set class of  \"%L\" to (class %s)", client, target_list[i], strclass);	
			}
		}
		if(GetConVarBool(hChat))
		{
			ShowActivity2(client, "[SM] ","Set class of %s to %s", target_name, strclass);
		}	
	}
	return Plugin_Handled;	
}

public Action:Command_SetMyClass(client, args)
{
	if(args != 1)
	{
		new Handle:cm = CreateMenu(ClassMenuCallback);
		SetMenuTitle(cm, "Choose Your Class:");
		AddMenuItem(cm, "1", "Scout");
		AddMenuItem(cm, "2", "Soldier");
		AddMenuItem(cm, "pyro", "Pyro");
		AddMenuItem(cm, "demoman", "Demoman");
		AddMenuItem(cm, "heavy", "Heavy");
		AddMenuItem(cm, "engineer", "Engineer");
		AddMenuItem(cm, "medic", "Medic");
		AddMenuItem(cm, "sniper", "Sniper");
		AddMenuItem(cm, "spy", "Spy");
		AddMenuItem(cm, "random", "Random");
		DisplayMenu(cm, client, 60);
		//ReplyToCommand(client, "[SM] Usage: sm_class \"class\"");
	}
	else
	{
		new String:strclass[10], TFClassType:class, random = false;
		GetCmdArg(1, strclass, sizeof(strclass));
		if(StrEqual(strclass, "scout", false))
		{
			class = TFClass_Scout;
			Format(strclass, sizeof(strclass), "Scout");	
		}
		else if(StrEqual(strclass, "soldier", false))
		{
			class = TFClass_Soldier;
			Format(strclass, sizeof(strclass), "Soldier");	
		}
		else if(StrEqual(strclass, "pyro", false))
		{
			class = TFClass_Pyro;
			Format(strclass, sizeof(strclass), "Pyro");	
		}
		else if(StrEqual(strclass, "demoman", false))
		{
			class = TFClass_DemoMan;
			Format(strclass, sizeof(strclass), "Demoman");	
		}
		else if(StrEqual(strclass, "heavy", false))
		{
			class = TFClass_Heavy;
			Format(strclass, sizeof(strclass), "Heavy");	
		}
		else if(StrEqual(strclass, "engineer", false))
		{
			class = TFClass_Engineer;
			Format(strclass, sizeof(strclass), "Engineer");	
		}
		else if(StrEqual(strclass, "medic", false))
		{
			class = TFClass_Medic;
			Format(strclass, sizeof(strclass), "Medic");	
		}
		else if(StrEqual(strclass, "sniper", false))
		{
			class = TFClass_Sniper;
			Format(strclass, sizeof(strclass), "Sniper");	
		}
		else if(StrEqual(strclass, "spy", false))
		{
			class = TFClass_Spy;
			Format(strclass, sizeof(strclass), "Spy");	
		}
		else if(StrEqual(strclass, "random", false))
		{
			random = true;
			Format(strclass, sizeof(strclass), "Random");	
		}
		else
		{
			ReplyToCommand(client, "[SM] Invalid Class (\"%s\")", strclass);
			return Plugin_Handled;
		}
		if(random) class = TFClassType:GetRandomInt(1, 9);
		if(IsValidEntity(client))
		{ 
			TF2_SetPlayerClass(client, class);
			if(IsPlayerAlive(client))
			{
				SetEntityHealth(client, 25);
				TF2_RegeneratePlayer(client);
				new weapon = GetPlayerWeaponSlot(client, TFWeaponSlot_Primary);
				if(IsValidEntity(weapon))
				{
					SetEntPropEnt(client, Prop_Send, "m_hActiveWeapon", weapon);
				}
			}

		}
		if(GetConVarBool(hLog))
		{
			LogAction(client, client, "\"%L\" set class to (class %s)", client, strclass);	
		}
		if(GetConVarBool(hChat))
		{
			PrintToChat(client, "[SM] Your class was set to %s", strclass);
		}	
	}
	return Plugin_Handled;	
}

public ClassMenuCallback(Handle:menu, MenuAction:action, client, param2)
{
	if(action == MenuAction_End) CloseHandle(menu);

	if(action == MenuAction_Select)
	{
		decl String:info[12];
		GetMenuItem(menu, param2, info, sizeof(info));
		
		new String:strclass[10], TFClassType:class, random = false;
		GetCmdArg(1, strclass, sizeof(strclass));
		if(StrEqual(strclass, "1", false))
		{
			class = TFClass_Scout;
			Format(strclass, sizeof(strclass), "Scout");	
		}
		else if(StrEqual(strclass, "2", false))
		{
			class = TFClass_Soldier;
			Format(strclass, sizeof(strclass), "Soldier");	
		}
		else if(StrEqual(strclass, "3", false))
		{
			class = TFClass_Pyro;
			Format(strclass, sizeof(strclass), "Pyro");	
		}
		else if(StrEqual(strclass, "4", false))
		{
			class = TFClass_DemoMan;
			Format(strclass, sizeof(strclass), "Demoman");	
		}
		else if(StrEqual(strclass, "5", false))
		{
			class = TFClass_Heavy;
			Format(strclass, sizeof(strclass), "Heavy");	
		}
		else if(StrEqual(strclass, "6", false))
		{
			class = TFClass_Engineer;
			Format(strclass, sizeof(strclass), "Engineer");	
		}
		else if(StrEqual(strclass, "7", false))
		{
			class = TFClass_Medic;
			Format(strclass, sizeof(strclass), "Medic");	
		}
		else if(StrEqual(strclass, "8", false))
		{
			class = TFClass_Sniper;
			Format(strclass, sizeof(strclass), "Sniper");	
		}
		else if(StrEqual(strclass, "9", false))
		{
			class = TFClass_Spy;
			Format(strclass, sizeof(strclass), "Spy");	
		}
		else if(StrEqual(strclass, "10", false))
		{
			random = true;
			Format(strclass, sizeof(strclass), "Random");	
		}
		if(random) class = TFClassType:GetRandomInt(1, 9);
		if(IsValidEntity(client))
		{
			TF2_SetPlayerClass(client, class);
			if(IsPlayerAlive(client))
			{
				SetEntityHealth(client, 25);
				TF2_RegeneratePlayer(client);
				new weapon = GetPlayerWeaponSlot(client, TFWeaponSlot_Primary);
				if(IsValidEntity(weapon))
				{
					SetEntPropEnt(client, Prop_Send, "m_hActiveWeapon", weapon);
				}
			}

		}
		if(GetConVarBool(hLog))
		{
			LogAction(client, client, "\"%L\" set class to (class %s)", client, strclass);	
		}
		if(GetConVarBool(hChat))
		{
			PrintToChat(client, "[SM] Your class was set to %s", strclass);
		}
		
	}
	return Plugin_Handled;	
}
Michael Westen is offline
Potato Uno
Veteran Member
Join Date: Jan 2014
Location: Atlanta, Georgia
Old 06-30-2015 , 19:29   Re: [TF2]SetClass
Reply With Quote #3

Remove the "return Plugin_Handled" under "ClassMenuCallback".

You only return that if the function is tagged as an Action (like you did for Action:Command_SetMyClass).
Potato Uno is offline
Michael Westen
Junior Member
Join Date: May 2015
Old 06-30-2015 , 19:40   Re: [TF2]SetClass
Reply With Quote #4

Perfect thank you Potato Uno. It works perfectly. Here it is if anyone wants it.
Attached Files
File Type: sp Get Plugin or Get Source (setclass.sp - 447 views - 9.5 KB)
Michael Westen is offline
Michael Westen
Junior Member
Join Date: May 2015
Old 07-03-2015 , 11:06   Re: [TF2]SetClass
Reply With Quote #5

Ok I thought it was ok and working well, but I ran into one problem. The first selection of classes works fine when you type !class and the menu opens, but when you go to the next menu page to select the other classes it still acts like it is on the first page and you cannot properly choose them. Idk why it's doing that and any help would be appreciated
Michael Westen is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 03:15.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode