mirror of
https://github.com/Jackzmc/sourcemod-plugins.git
synced 2025-05-06 00:43:20 +00:00
Add l4d2_tkstopper
This commit is contained in:
parent
3ab5838a63
commit
b030fa8277
3 changed files with 131 additions and 1 deletions
17
README.md
17
README.md
|
@ -30,6 +30,7 @@ Useful things:
|
||||||
* [globalbans](#globalbans)
|
* [globalbans](#globalbans)
|
||||||
* [l4d2_rollback](#l4d2_rollback)
|
* [l4d2_rollback](#l4d2_rollback)
|
||||||
* [l4d2_autorestart](#l4d2_autorestart)
|
* [l4d2_autorestart](#l4d2_autorestart)
|
||||||
|
* [l4d2_TKStopper](#l4d2_TKStopper)
|
||||||
|
|
||||||
### Modified Others
|
### Modified Others
|
||||||
* [200IQBots_FlyYouFools](#200IQBots_FlyYouFools)
|
* [200IQBots_FlyYouFools](#200IQBots_FlyYouFools)
|
||||||
|
@ -270,4 +271,18 @@ Currently auto triggers:
|
||||||
|
|
||||||
### l4d2_autorestart
|
### l4d2_autorestart
|
||||||
Plugin that automatically restarts server when the server is NOT hibernating, with bots around and no players.
|
Plugin that automatically restarts server when the server is NOT hibernating, with bots around and no players.
|
||||||
This fixes an issue with (shitty) custom maps that force sb_all_bot_game to 1 and disable hibernation
|
This fixes an issue with (shitty) custom maps that force sb_all_bot_game to 1 and disable hibernation
|
||||||
|
|
||||||
|
### l4d2_TKStopper
|
||||||
|
Plugin that prevents team killers by checking multiple criterias. Default system is as:
|
||||||
|
Any survivor that attacks another non-bot, idle or not idle player:
|
||||||
|
1. If done within first 2 minutes of joining OR during finale vehicle arrival is cancelled
|
||||||
|
2. If they do over threshold (default 70 HP), they are banned for 60 minutes
|
||||||
|
3. Lastly, if its just normal friendly fire and they are not an admin, its reversed to them at full damage, and to victim at 1/2
|
||||||
|
Friendly fire counts are forgotten on map changes and after 30 seconds of last FF.
|
||||||
|
|
||||||
|
* **Cvars:**
|
||||||
|
* `l4d2_tk_forgiveness_time <#>` - The minimum amount of seconds to pass (in seconds) where a player's previous accumulated FF is forgive. Default is 30s
|
||||||
|
* `l4d2_tk_bantime` - How long in minutes should a player be banned for? 0 for permanently. Default is 60
|
||||||
|
* `l4d2_tk_ban_ff_threshold` - How much damage does a player need to do before being instantly banned. Default 70 HP
|
||||||
|
* `4d2_tk_ban_join_time` - Upto how many minutes should any new player's FF be ignored. Default is 2 Minutes
|
BIN
plugins/l4d2_TKStopper.smx
Normal file
BIN
plugins/l4d2_TKStopper.smx
Normal file
Binary file not shown.
115
scripting/l4d2_TKStopper.sp
Normal file
115
scripting/l4d2_TKStopper.sp
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
#pragma semicolon 1
|
||||||
|
#pragma newdecls required
|
||||||
|
|
||||||
|
//#define DEBUG
|
||||||
|
|
||||||
|
#define PLUGIN_VERSION "1.0"
|
||||||
|
#define FF_BAN_THRESHOLD 100.0
|
||||||
|
#define FF_BAN_JOIN_MINUTES_THRESHOLD 2
|
||||||
|
#define FF_BAN_MINUTES 60
|
||||||
|
|
||||||
|
#include <sourcemod>
|
||||||
|
#include <sdktools>
|
||||||
|
#include <sdkhooks>
|
||||||
|
#include <jutils>
|
||||||
|
|
||||||
|
/*TODO: Implement if player joins (non-admin) and instantly does over 50 HP of damage, STOP all damage, temp ban
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool lateLoaded, IsFinaleEnding;
|
||||||
|
int iJoinTime[MAXPLAYERS+1];
|
||||||
|
float playerTotalDamageFF[MAXPLAYERS+1];
|
||||||
|
int lastFF[MAXPLAYERS+1];
|
||||||
|
|
||||||
|
ConVar hForgivenessTime, hBanTime, hThreshold, hJoinTime;
|
||||||
|
|
||||||
|
public Plugin myinfo =
|
||||||
|
{
|
||||||
|
name = "__templateName__",
|
||||||
|
author = "jackzmc",
|
||||||
|
description = "",
|
||||||
|
version = PLUGIN_VERSION,
|
||||||
|
url = ""
|
||||||
|
};
|
||||||
|
|
||||||
|
public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) {
|
||||||
|
if(late) {
|
||||||
|
lateLoaded = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnPluginStart()
|
||||||
|
{
|
||||||
|
EngineVersion g_Game = GetEngineVersion();
|
||||||
|
if(g_Game != Engine_Left4Dead && g_Game != Engine_Left4Dead2)
|
||||||
|
{
|
||||||
|
SetFailState("This plugin is for L4D/L4D2 only.");
|
||||||
|
}
|
||||||
|
|
||||||
|
hForgivenessTime = CreateConVar("l4d2_tk_forgiveness_time", "30", "The minimum amount of time to pass (in seconds) where a player's previous accumulated FF is forgiven");
|
||||||
|
hBanTime = CreateConVar("l4d2_tk_bantime", "60", "How long in minutes should a player be banned for? 0 for permanently");
|
||||||
|
hThreshold = CreateConVar("l4d2_tk_ban_ff_threshold", "70.0", "How much damage does a player need to do before being instantly banned");
|
||||||
|
hJoinTime = CreateConVar("l4d2_tk_ban_join_time", "2", "Upto how many minutes should any new player be subjected to instant bans on any FF");
|
||||||
|
|
||||||
|
AutoExecConfig(true, "l4d2_tkstopper");
|
||||||
|
|
||||||
|
HookEvent("finale_vehicle_ready", Event_FinaleVehicleReady);
|
||||||
|
|
||||||
|
if(lateLoaded) {
|
||||||
|
for(int i = 1; i <= MaxClients; i++) {
|
||||||
|
if(IsClientConnected(i) && IsClientInGame(i) && GetClientTeam(i) == 2) {
|
||||||
|
SDKHook(i, SDKHook_OnTakeDamage, Event_OnTakeDamage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Event_FinaleVehicleReady(Event event, const char[] name, bool dontBroadcast) {
|
||||||
|
IsFinaleEnding = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnMapEnd() {
|
||||||
|
IsFinaleEnding = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnClientPutInServer(int client) {
|
||||||
|
iJoinTime[client] = GetTime();
|
||||||
|
SDKHook(client, SDKHook_OnTakeDamage, Event_OnTakeDamage);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnClientDisconnect(int client) {
|
||||||
|
playerTotalDamageFF[client] = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Action Event_OnTakeDamage(int victim, int& attacker, int& inflictor, float& damage, int& damagetype, int& weapon, float damageForce[3], float damagePosition[3]) {
|
||||||
|
if(damage > 0.0 && damagetype & (DMG_BLAST|DMG_BURN|DMG_BLAST_SURFACE) == 0 && GetClientTeam(victim) == 2 && GetClientTeam(attacker) == 2 && attacker != victim) {
|
||||||
|
//Allow friendly firing BOTS that aren't idle players:
|
||||||
|
if(IsFakeClient(victim) && GetEntProp(attacker, Prop_Send, "m_humanSpectatorUserID") == 0) {
|
||||||
|
return Plugin_Continue;
|
||||||
|
}
|
||||||
|
int time = GetTime();
|
||||||
|
if(time - lastFF[attacker] > hForgivenessTime.IntValue) {
|
||||||
|
playerTotalDamageFF[attacker] = 0.0;
|
||||||
|
}
|
||||||
|
playerTotalDamageFF[attacker] += damage;
|
||||||
|
lastFF[attacker] = time;
|
||||||
|
if(GetUserAdmin(attacker) == INVALID_ADMIN_ID) {
|
||||||
|
if(playerTotalDamageFF[attacker] > hThreshold.IntValue) {
|
||||||
|
LogMessage("[NOTICE] Banning %N for excessive FF (%f HP) for %d minutes.", attacker, playerTotalDamageFF[attacker], hBanTime.IntValue);
|
||||||
|
NotifyAllAdmins("[Notice] Banning %N for excessive FF (%f HP) for %d minutes.", attacker, playerTotalDamageFF[attacker], hBanTime.IntValue);
|
||||||
|
BanClient(attacker, hBanTime.IntValue, BANFLAG_AUTO | BANFLAG_AUTHID, "Excessive FF", "Excessive Friendly Fire", "TKStopper");
|
||||||
|
return Plugin_Stop;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(IsFinaleEnding || GetTime() - iJoinTime[attacker] <= hJoinTime.IntValue / 60000) {
|
||||||
|
return Plugin_Stop;
|
||||||
|
}else{
|
||||||
|
SDKHooks_TakeDamage(attacker, attacker, attacker, damage / 3.0);
|
||||||
|
damage /= 2.0;
|
||||||
|
}
|
||||||
|
return Plugin_Stop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Plugin_Continue;
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue