A plugin that warns if player does not move a specific distance within a specific time.
Requires:
@Nukem's Server Addon v1.320 or higher
sv_config.ini entries:
Chat commands:
Thanks to @makavel for idea and testing
Source code:
Requires:
@Nukem's Server Addon v1.320 or higher
sv_config.ini entries:
Code:
[AntiCamp]
//Minimal distance
Distance=5
//Within this time
Time=4
//Message when someone is camping, use {0} for name, example: {0} stop camping!
Message=
//After how many warnings is the AdditionalAction executed
Warnings=2
//Additional action after too many warnings, kickClient, dropClient, tempBanClient, banClient
AdditionalAction=
//Plugin enabled, disabled
Enabled=1Chat commands:
Code:
//Enable plugin
!camp 1
//Disable plugin
!camp 0Thanks to @makavel for idea and testing
Source code:
Code:
using System;
using System.Collections.Generic;
using System.Text;
using Addon;
namespace AntiCamp
{
public class Class1 : CPlugin
{
bool PluginEnabled = true;
float distance = 5;
uint time = 4;
uint timer = 16;
byte warnings = 2;
string message = string.Empty;
string AdditionalAction = string.Empty;
// ClientNum, Origin
Dictionary<int, Vector> Players = new Dictionary<int, Vector>();
// ClientNum, Number of warnings
Dictionary<int, uint> WarningDic = new Dictionary<int, uint>();
// ClientNum, Ignores
Dictionary<int, uint> IgnoreList = new Dictionary<int, uint>();
public override void OnServerLoad()
{
ServerPrint("\n AntiCamp loaded \n Author: zxz0O0 \n Idea and testing: Makavel \n Thanks to Nukem, Jariz and Pozzuh\n");
ServerPrint(" youtube.com/zxz0O0 \n itsmods.com\n");
try
{
distance = float.Parse(GetServerCFG("AntiCamp", "Distance", "5"));
time = uint.Parse(GetServerCFG("AntiCamp", "Time", "4"));
timer = 4 * time;
message = GetServerCFG("AntiCamp", "Message", string.Empty);
AdditionalAction = GetServerCFG("AntiCamp", "AdditionalAction", string.Empty);
warnings = byte.Parse(GetServerCFG("AntiCamp", "Warnings", "2"));
if (GetServerCFG("AntiCamp", "Enabled", "1") == "0")
PluginEnabled = false;
}
catch (Exception e)
{
ServerPrint(e.ToString());
}
}
public override void OnPlayerChangeWeapon(ServerClient Client, int WeaponID)
{
if (WeaponID == GetWeapon("briefcase_bomb_mp"))
{
if(!IgnoreList.ContainsKey(Client.ClientNum))
IgnoreList.Add(Client.ClientNum, 1);
else if (IgnoreList[Client.ClientNum]<2)
IgnoreList[Client.ClientNum]++;
}
}
public override void OnPlayerUse(ServerClient Client)
{
if (!IgnoreList.ContainsKey(Client.ClientNum))
IgnoreList.Add(Client.ClientNum, 1);
else if (IgnoreList[Client.ClientNum] < 2)
IgnoreList[Client.ClientNum]++;
}
public override void OnPlayerSpawned(ServerClient Client)
{
if (!IgnoreList.ContainsKey(Client.ClientNum))
IgnoreList.Add(Client.ClientNum, 2);
else
IgnoreList[Client.ClientNum] = 2;
}
//4FPS
public override void OnAddonFrame()
{
if (PluginEnabled)
{
timer--;
if (timer == 0)
{
timer = 4 * time;
foreach (ServerClient c in GetClients())
{
if (c.Ping == 999)
continue;
if (c.Team == Teams.Spectator)
continue;
if (CheckContinue(c.ClientNum))
continue;
if (!Players.ContainsKey(c.ClientNum))
Players.Add(c.ClientNum, new Vector(c.OriginX, c.OriginY, c.OriginZ));
else if (CalculateDistance(c.ClientNum) < distance)
{
if (!string.IsNullOrEmpty(message))
ServerSay(string.Format(message, c.Name), true);
if (!string.IsNullOrEmpty(AdditionalAction))
{
if (!WarningDic.ContainsKey(c.ClientNum))
WarningDic.Add(c.ClientNum, 1);
else
WarningDic[c.ClientNum]++;
if (WarningDic[c.ClientNum] > warnings)
ServerCommand(AdditionalAction + " " + c.ClientNum);
}
}
}
}
}
}
public override ChatType OnSay(string Message, ServerClient Client)
{
if (Message == "!camp 1")
{
TellClient(Client.ClientNum, "AntiCamp enabled", true);
PluginEnabled = true;
return ChatType.ChatNone;
}
else if (Message == "!camp 0")
{
TellClient(Client.ClientNum, "AntiCamp disabled", true);
PluginEnabled = false;
Players.Clear();
WarningDic.Clear();
return ChatType.ChatNone;
}
return ChatType.ChatContinue;
}
private float CalculateDistance(int ClientNum)
{
try
{
ServerClient c = GetClient(ClientNum);
Vector PlayerVec = Players[ClientNum];
float x = PlayerVec.X - c.OriginX;
x *= x;
float y = PlayerVec.Y - c.OriginY;
y *= y;
float z = PlayerVec.Z - c.OriginZ;
z *= z;
Players[ClientNum] = new Vector(c.OriginX, c.OriginY, c.OriginZ);
return (float)Math.Sqrt(x + y + z);
}
catch (Exception e)
{
ServerPrint(e.ToString());
}
return 0;
}
private bool CheckContinue(int ClientNum)
{
if (IgnoreList.ContainsKey(ClientNum) && IgnoreList[ClientNum] > 0)
{
IgnoreList[ClientNum]--;
return true;
}
return false;
}
public override void OnPlayerDisconnect(ServerClient Client)
{
if (Players.ContainsKey(Client.ClientNum))
Players.Remove(Client.ClientNum);
if (WarningDic.ContainsKey(Client.ClientNum))
WarningDic.Remove(Client.ClientNum);
if (IgnoreList.ContainsKey(Client.ClientNum))
IgnoreList.Remove(Client.ClientNum);
}
}
}



Anticamp....
