View Single Post
xjonx
Member
Join Date: Nov 2016
Location: Builders League UnitedHQ
Old 11-16-2016 , 21:15   Re: [REQ/IDEA][TF2]Plugin requests (ideas?)
Reply With Quote #5

Quote:
Originally Posted by Chaosxk View Post
For 1, i wrote the plugin to give crits to the last man standing on red team as it is more efficient than executing another plugin to give crits.

Code:
#pragma semicolon 1

#define PLUGIN_AUTHOR "Tak (Chaosxk)"
#define PLUGIN_VERSION "1.0"

#include <sourcemod>
#include <tf2_stocks>

#pragma newdecls required

int g_iRedCounter;

public Plugin myinfo = 
{
	name = "[TF2] One man standing ~ Crits",
	author = PLUGIN_AUTHOR,
	description = "1 man on red = Crits",
	version = PLUGIN_VERSION,
	url = "https://forums.alliedmods.net/showthread.php?t=290409"
};

public void OnPluginStart()
{
	HookEvent("teamplay_round_start", Event_RoundStart);
	HookEvent("player_spawn", Event_PlayerSpawn);
	HookEvent("player_death", Event_PlayerDeath);
	
	//late-load execute
	g_iRedCounter = GetRedCount();
}

public Action Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
	//Resets the counter when new round starts
	g_iRedCounter = GetRedCount();
}

//Don't think this event is necessary unless map or admin respawns players
//Just a precaution i guess, so it doesn't bug out if you do respawn
public Action Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
	int client = GetClientOfUserId(event.GetInt("userid"));
	
	if (TF2_GetClientTeam(client) != TFTeam_Red)
		return Plugin_Continue;
	
	g_iRedCounter++;
	return Plugin_Continue;
}

public Action Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
	int client = GetClientOfUserId(event.GetInt("userid"));
	
	if (TF2_GetClientTeam(client) != TFTeam_Red)
		return Plugin_Continue;
	
	if (--g_iRedCounter == 1)
	{
		for (int i = 1; i <= MaxClients; i++)
		{
			if (!IsClientInGame(i) || !IsPlayerAlive(i) || TF2_GetClientTeam(i) != TFTeam_Red)
				continue;
			TF2_AddCondition(i, TFCond_Kritzkrieged, TFCondDuration_Infinite);
			//Break as we should only be getting 1 player alive on red
			break;
		}
	}
	return Plugin_Continue;
}

//GetClientCount of red team INCLUDING bots
int GetRedCount()
{
	int r;
	for (int i = 1; i <= MaxClients; i++)
	{
		if (!IsClientInGame(i) || TF2_GetClientTeam(i) != TFTeam_Red)
			continue;
		r++;
	}
	return r;
}
For 2, i edited the plugin you linked to only work for blue team.

Code:
/*
 * Double Jump
 *
 * Description:
 *  Allows players to double-jump
 *  Original idea: NcB_Sav
 *
 * Convars:
 *  sm_doublejump_enabled [bool] : Enables or disable double-jumping. Default: 1
 *  sm_doublejump_boost [amount] : Amount to boost the player. Default: 250
 *  sm_doublejump_max [jumps]    : Maximum number of re-jumps while airborne. Default: 1
 *
 * Changelog:
 *  v1.0.1
 *   Minor code optimization.
 *  v1.0.0
 *   Initial release.
 *
 * Known issues:
 *  Doesn't register all mouse-wheel triggered +jumps
 *
 * Todo:
 *  Employ upcoming OnClientCommand function to remove excess OnGameFrame-age.
 *
 * Contact:
 *  Paegus: [email protected]
 *  SourceMod: http://www.sourcemod.net
 *  Hidden:Source: http://www.hidden-source.com
 *  NcB_Sav: http://forums.alliedmods.net/showthread.php?t=99228
 */
#define PLUGIN_VERSION		"1.0.1"

#include <sdktools>


public Plugin:myinfo = {
	name		= "Double Jump",
	author		= "Paegus",
	description	= "Allows double-jumping.",
	version		= PLUGIN_VERSION,
	url			= ""
}

new
	Handle:g_cvJumpBoost	= INVALID_HANDLE,
	Handle:g_cvJumpEnable	= INVALID_HANDLE,
	Handle:g_cvJumpMax		= INVALID_HANDLE,
	Float:g_flBoost			= 250.0,
	bool:g_bDoubleJump		= true,
	g_fLastButtons[MAXPLAYERS+1],
	g_fLastFlags[MAXPLAYERS+1],
	g_iJumps[MAXPLAYERS+1],
	g_iJumpMax
	
public OnPluginStart() {
	CreateConVar(
		"sm_doublejump_version", PLUGIN_VERSION,
		"Double Jump Version",
		FCVAR_PLUGIN|FCVAR_NOTIFY
	)
	
	g_cvJumpEnable = CreateConVar(
		"sm_doublejump_enabled", "1",
		"Enables double-jumping.",
		FCVAR_PLUGIN|FCVAR_NOTIFY
	)
	
	g_cvJumpBoost = CreateConVar(
		"sm_doublejump_boost", "250.0",
		"The amount of vertical boost to apply to double jumps.",
		FCVAR_PLUGIN|FCVAR_NOTIFY
	)
	
	g_cvJumpMax = CreateConVar(
		"sm_doublejump_max", "1",
		"The maximum number of re-jumps allowed while already jumping.",
		FCVAR_PLUGIN|FCVAR_NOTIFY
	)
	
	HookConVarChange(g_cvJumpBoost,		convar_ChangeBoost)
	HookConVarChange(g_cvJumpEnable,	convar_ChangeEnable)
	HookConVarChange(g_cvJumpMax,		convar_ChangeMax)
	
	g_bDoubleJump	= GetConVarBool(g_cvJumpEnable)
	g_flBoost		= GetConVarFloat(g_cvJumpBoost)
	g_iJumpMax		= GetConVarInt(g_cvJumpMax)
}

public convar_ChangeBoost(Handle:convar, const String:oldVal[], const String:newVal[]) {
	g_flBoost = StringToFloat(newVal)
}

public convar_ChangeEnable(Handle:convar, const String:oldVal[], const String:newVal[]) {
	if (StringToInt(newVal) >= 1) {
		g_bDoubleJump = true
	} else {
		g_bDoubleJump = false
	}
}

public convar_ChangeMax(Handle:convar, const String:oldVal[], const String:newVal[]) {
	g_iJumpMax = StringToInt(newVal)
}

public OnGameFrame() {
	if (g_bDoubleJump) {							// double jump active
		for (new i = 1; i <= MaxClients; i++) {		// cycle through players
			if (
				IsClientInGame(i) &&				// is in the game
				IsPlayerAlive(i) &&					// is alive
				GetClientTeam(i) == 3				// is player on blue
			) {
				DoubleJump(i)						// Check for double jumping
			}
		}
	}
}

stock DoubleJump(const any:client) {
	new
		fCurFlags	= GetEntityFlags(client),		// current flags
		fCurButtons	= GetClientButtons(client)		// current buttons
	
	if (g_fLastFlags[client] & FL_ONGROUND) {		// was grounded last frame
		if (
			!(fCurFlags & FL_ONGROUND) &&			// becomes airbirne this frame
			!(g_fLastButtons[client] & IN_JUMP) &&	// was not jumping last frame
			fCurButtons & IN_JUMP					// started jumping this frame
		) {
			OriginalJump(client)					// process jump from the ground
		}
	} else if (										// was airborne last frame
		fCurFlags & FL_ONGROUND						// becomes grounded this frame
	) {
		Landed(client)								// process landing on the ground
	} else if (										// remains airborne this frame
		!(g_fLastButtons[client] & IN_JUMP) &&		// was not jumping last frame
		fCurButtons & IN_JUMP						// started jumping this frame
	) {
		ReJump(client)								// process attempt to double-jump
	}
	
	g_fLastFlags[client]	= fCurFlags				// update flag state for next frame
	g_fLastButtons[client]	= fCurButtons			// update button state for next frame
}

stock OriginalJump(const any:client) {
	g_iJumps[client]++	// increment jump count
}

stock Landed(const any:client) {
	g_iJumps[client] = 0	// reset jumps count
}

stock ReJump(const any:client) {
	if ( 1 <= g_iJumps[client] <= g_iJumpMax) {						// has jumped at least once but hasn't exceeded max re-jumps
		g_iJumps[client]++											// increment jump count
		decl Float:vVel[3]
		GetEntPropVector(client, Prop_Data, "m_vecVelocity", vVel)	// get current speeds
		
		vVel[2] = g_flBoost
		TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, vVel)		// boost player
	}
}
Both untested! So if any issues just reply back.
Sorry for the late reply, been busy lately.
Double jump works and only on blue team, which is good. I also get 4 warnings when compiling the plugin.
Compile Warnings


However, last red man standing crits does not work.
I think it has to do with one of my plugins that switches a random player to blue team there fore bypassing the red death counter in the script.
__________________
I'm sometimes slow at responding... just be patient.
My favorite quote: "...for I believe in an eye for an eye."
My Website: http://jon-xjonx-nat.jimdo.com/

Last edited by xjonx; 11-16-2016 at 21:19. Reason: Woops, less detailed. Added more detail :P
xjonx is offline
Send a message via Skype™ to xjonx