Skip to content

Latest commit

 

History

History
98 lines (74 loc) · 2.55 KB

y_flooding.md

File metadata and controls

98 lines (74 loc) · 2.55 KB

y_flooding

Provides a number of ways of dealing with multiple connections from the same IP, including banning the IP, rejecting too many connections, and more.

YSI

For general YSI information, see the following links:

Documentation

Limit the number of connections on an IP:

#include <YSI_Server\y_flooding>

public OnScriptInit()
{
	// Allow unlimited connections per IP.
	SetMaxConnections(); // -1, default.

	// Only allow two connections per IP.
	SetMaxConnections(2);
}

The possible actions for too many players are;

  • e_FLOOD_ACTION_NOTHING - Do nothing, basically disable the system.
  • e_FLOOD_ACTION_BLOCK - Kick the latest player on this IP (default).
  • e_FLOOD_ACTION_KICK - Kick all players on this IP.
  • e_FLOOD_ACTION_BAN - Ban the IP and have players time out.
  • e_FLOOD_ACTION_FBAN - Ban the IP and kick all the players instantly.
  • e_FLOOD_ACTION_GHOST - Silently force all players on the IP to reconnect.
  • e_FLOOD_ACTION_OTHER - Call a callback (OnFloodLimitExceeded(ip[], count)).

To specify an action, pass an extra parameter:

#include <YSI_Server\y_flooding>

public OnScriptInit()
{
	// Only allow one connection per IP, and ban the IP when there are 2+.
	SetMaxConnections(1, e_FLOOD_ACTION_FBAN);
}

To perform a custom action when there are too many connections, use OnFloodLimitExceeded, which also has access to the FloodingPlayer iterator to loop over the IDs of all the players with the current IP:

#include <YSI_Server\y_flooding>
#include <YSI_Data\y_iterate>

public OnScriptInit()
{
	// Set to 1, but do a custom action.
	SetMaxConnections(1, e_FLOOD_ACTION_OTHER);
}

public OnFloodLimitExceeded(ip[], count)
{
	// Not called for `count == 1`, because the limit hasn't been exceeded yet.
	if (count == 2)
	{
		foreach (new i : FloodingPlayer)
		{
			SendClientMessage(i, COLOUR_WARN, "There are two of you on this IP, one more and you will be banned.");
		}
	}
	else
	{
		foreach (new i : FloodingPlayer)
		{
			BanEx(i, "There are three+ of you on this IP, I warned you you would be banned.");
		}
	}
}

Note that the FloodingPlayer iterator is only valid within the scope of OnFloodLimitExceeded.

You can get the current count and action with:

Flooding_GetMaxConnections();
e_FLOOD_ACTION:Flooding_GetConnectionAction();

External Links

These are links to external documentation and tutorials; both first- and third-party. Note that these may be incomplete, obsolete, or otherwise inaccurate.