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.
__________________