Skocz do zawartości
m0re

Szukam Pluginu blokującego dołączanie graczy powyżej pewnej wartości

Rekomendowane odpowiedzi

Witam!

Poszukuję Pluginu, który będzie wyrzucał nowych graczy (którzy wbijają na serwer) z serwera przy określonej liczbie osób z danym powodem. Nie chodzi mi o Plugin na rezerwację slota.

Przez MAGNET,

Nazwa "Szukam pluginu" nie sugeruje zbyt wiele. Pamiętaj, aby choć w minimalnym stopniu wyróżniała się i mówiła czego potrzebujesz. Poprawiłem temat

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Podobnego czyli miało by tak działać jak ten + wyświetlać komunikat jakiś  ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
1 minutę temu, zorix napisał:

Podobnego czyli miało by tak działać jak ten + wyświetlać komunikat jakiś  ?

Dokładnie tak.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Przecież ten plugin ma komunikat.

Spoiler

public Action OnTimedKickForReject(Handle timer, any userid)
{
	int client = GetClientOfUserId(userid);
	
	if (!client || !IsClientInGame(client))
	{
		return Plugin_Handled;
	}

	char sPlayername[50], sPlayerid[50];
	GetClientName(client, sPlayername, 49);
	GetClientAuthId(client, AuthId_Steam2, sPlayerid, 49);
	int iClientsingame = GetClientCount(false);
	int iLimit = GetMaxHumanPlayers();
	
	LogMessage("kicking rejected player %s<%s> - [%d/%d] players", sPlayername, sPlayerid, iClientsingame, iLimit);
	KickClient(client, "Serwer jest pełny");
	return Plugin_Handled;
}

 

 

Chyba że chodzi ci o coś takiego:

Spoiler

public Action OnTimedKickForReject(Handle timer, any userid)
{
	int client = GetClientOfUserId(userid);
	
	if (!client || !IsClientInGame(client))
	{
		return Plugin_Handled;
	}

	char sPlayername[50], sPlayerid[50];
	GetClientName(client, sPlayername, 49);
	GetClientAuthId(client, AuthId_Steam2, sPlayerid, 49);
	int iClientsingame = GetClientCount(false);
	int iLimit = GetMaxHumanPlayers();
	
	LogMessage("kicking rejected player %s<%s> - [%d/%d] players", sPlayername, sPlayerid, iClientsingame, iLimit);
	PrintToChatAll("Gracz %N został wyrzucony z serwera, serwer jest pełny!", client);
	KickClient(client, "Serwer jest pełny");
	return Plugin_Handled;
}

 

 

To masz cały kod:

 

Spoiler

#pragma semicolon 1
#include <sourcemod>
#include <adt_array>

Handle sm_admin_slots;

Handle Arr_SteamIDs = INVALID_HANDLE;
Handle fSteamIDList = INVALID_HANDLE;
char steamIDlist[PLATFORM_MAX_PATH];

public Plugin myinfo =
{
    name = "Client limiter",
    author = "Wilk",
    description = "Don't allow clients to connect if the server is full (supporting reserved slots)",
    version = "0.6.1",
    url = "http://hejk.pl"
};

public OnPluginStart()
{
	sm_admin_slots = CreateConVar("sm_admin_slots", "0", "number of reserved slots", FCVAR_NOTIFY, true, 0.0);
	
	BuildPath(Path_SM, steamIDlist, sizeof(steamIDlist), "configs/admin_slots.txt");
	LoadSteamIDList();
}

public OnClientPostAdminCheck(client)
{	
	//Temporary flags for non-admin users found in the admin_slots.txt file
	char auth[32];
	GetClientAuthId(client, AuthId_Steam2, auth, sizeof(auth));
	
	if (FindStringInArray(Arr_SteamIDs, auth) != -1)
	{
		SetUserFlagBits(client, ADMFLAG_RESERVATION);
	}
	
	//Reserved slots mechanism
	int limit = GetMaxHumanPlayers();
	
	if (GetClientCount(false) > (limit - GetConVarInt(sm_admin_slots)))
	{
		if (hasReservedSlotAccess(GetUserFlagBits(client)))
		{
			char playername[50];
			GetClientName(client, playername, 49);
			LogMessage("player %s connected to a reserved slot", playername);
			
			if (GetClientCount(false) > limit)
			{
				CreateTimer(0.1, OnTimedKickForReject, GetClientUserId(client));
			}
		}
		else {
			CreateTimer(0.1, OnTimedKickForReject, GetClientUserId(client));
		}
	}
}

public Action OnTimedKickForReject(Handle timer, any userid)
{
	int client = GetClientOfUserId(userid);
	
	if (!client || !IsClientInGame(client))
	{
		return Plugin_Handled;
	}

	char sPlayername[50], sPlayerid[50];
	GetClientName(client, sPlayername, 49);
	GetClientAuthId(client, AuthId_Steam2, sPlayerid, 49);
	int iClientsingame = GetClientCount(false);
	int iLimit = GetMaxHumanPlayers();
	
	LogMessage("kicking rejected player %s<%s> - [%d/%d] players", sPlayername, sPlayerid, iClientsingame, iLimit);
	PrintToChatAll("Gracz %N został wyrzucony z serwera, serwer jest pełny!", client);
	KickClient(client, "Serwer jest pełny");
	return Plugin_Handled;
}

// return true if this user is allowed to connect to a reserved slot  
bool hasReservedSlotAccess(const userFlags) {
	
	// admin flag based 
	if (userFlags & ADMFLAG_ROOT || userFlags & ADMFLAG_RESERVATION) {
		return true;
	}
	else {
		return false;
	}
}

LoadSteamIDList()
{
	if (FileExists(steamIDlist, false)) {
		fSteamIDList = OpenFile(steamIDlist, "rt");
	}
	else {
		fSteamIDList = OpenFile(steamIDlist, "at+");
		LogMessage("Created a config file at the file path: %s", steamIDlist);
	}

	if (fSteamIDList == INVALID_HANDLE)
		LogMessage("Error - unable to load or create file: %s", steamIDlist);

	Arr_SteamIDs = CreateArray(256);

	char sReadBuffer[256];
	
	int len;
	while (!IsEndOfFile(fSteamIDList) && ReadFileLine(fSteamIDList, sReadBuffer, sizeof(sReadBuffer)))
	{
		if(sReadBuffer[0] == '/' || IsCharSpace(sReadBuffer[0]))
			continue;
		
		ReplaceString(sReadBuffer, sizeof(sReadBuffer), "\n", "");
		ReplaceString(sReadBuffer, sizeof(sReadBuffer), "\r", "");
		ReplaceString(sReadBuffer, sizeof(sReadBuffer), "\t", "");
		ReplaceString(sReadBuffer, sizeof(sReadBuffer), " ", "");
		
		// Support for comments on end of line
		len = strlen(sReadBuffer);
		for(new i; i < len; i++)
		{
			if(sReadBuffer[i] == ' ' || sReadBuffer[i] == '/')
			{
				sReadBuffer[i] = '\0';
				
				break;
			}
		}
		
		//LogMessage("Pushing %s to Arr_SteamIDs", sReadBuffer);
		
		PushArrayString(Arr_SteamIDs, sReadBuffer);
	}
	
	//LogMessage("Reached EOF on %s", steamIDlist);
	
	CloseHandle(fSteamIDList);
} 

 

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tutaj nie ma na coś takiego ConVara bądź takiej opcji bo plugin pobiera wszystkie sloty serwera dostępne i jeżeli są pełne to nie pozwala graczowi wbić ewentualnie możesz zamiast GetMaxHumanPlayers zmienić na ilość slotów twojego serwera, bądź mniejszą liczbę i ogarnąć coś, nigdy nie pisałem takiego pluginu więc nie wiem, ale jest on prosty do edycji ?.

 

Tak off topic: plugin nawet spoko ? 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Przed chwilą, Mesharsky napisał:

Tutaj nie ma na coś takiego ConVara ewentualnie możesz zamiast GetMaxHumanPlayers zmienić na ilość slotów twojego serwera, bądź mniejszą liczbę i ogarnąć coś, nigdy nie pisałem takiego pluginu więc nie wiem, ale jest on prosty do edycji ?.

 

Tak off topic: plugin nawet spoko ? 

Przecież są: 

sv_visiblemaxplayers

sm_admin_slots

 

Cytat

If I set 
sm_admin_slots 2
sv_visiblemaxplayers 20

There will be 2 hidden slots for admins? Do I need to change the actually amount of players in the server gamemodes_server.txt to 22? Or 20?

_______________________________________________________________________________________________________________________________________________________

Yes, there will be 2 hidden slots. Value of "maxplayers" parameter in gamemodes_server.cfg should represent the overall number of available slots - in your case it should be 22.

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
1 minutę temu, zorix napisał:

Przecież są: 

sv_visiblemaxplayers

sm_admin_slots

 

 

No to w takim razie w taki sposób, nie czytałem tematu ani nic na szybko patrzyłem tylko to KickClient ?.

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W skrócie @m0re musisz skompilować ten kod co dał @Mesharsky wgrać na serwer do plugins plik .smx i ustawić te cvary :sv_visiblemaxplayers,sm_admin_slots pod swoje potrzeby, jak dobrze zrozumiałem to pierwszy cvar odpowiada za liczbę widzianych slotów a drugi pod rezerwacje.  

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
3 minuty temu, zorix napisał:

W skrócie @m0re musisz skompilować ten kod co dał @Mesharsky wgrać na serwer do plugins plik .smx i ustawić te cvary :sv_visiblemaxplayers,sm_admin_slots pod swoje potrzeby, jak dobrze zrozumiałem to pierwszy cvar odpowiada za liczbę widzianych slotów a drugi pod rezerwacje.  

 

19 minut temu, Mesharsky napisał:

Przecież ten plugin ma komunikat.

 
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! Odkryj ukrytą treść


public Action OnTimedKickForReject(Handle timer, any userid)
{
	int client = GetClientOfUserId(userid);
	
	if (!client || !IsClientInGame(client))
	{
		return Plugin_Handled;
	}

	char sPlayername[50], sPlayerid[50];
	GetClientName(client, sPlayername, 49);
	GetClientAuthId(client, AuthId_Steam2, sPlayerid, 49);
	int iClientsingame = GetClientCount(false);
	int iLimit = GetMaxHumanPlayers();
	
	LogMessage("kicking rejected player %s<%s> - [%d/%d] players", sPlayername, sPlayerid, iClientsingame, iLimit);
	KickClient(client, "Serwer jest pełny");
	return Plugin_Handled;
}

 

 

Chyba że chodzi ci o coś takiego:

 
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! Odkryj ukrytą treść


public Action OnTimedKickForReject(Handle timer, any userid)
{
	int client = GetClientOfUserId(userid);
	
	if (!client || !IsClientInGame(client))
	{
		return Plugin_Handled;
	}

	char sPlayername[50], sPlayerid[50];
	GetClientName(client, sPlayername, 49);
	GetClientAuthId(client, AuthId_Steam2, sPlayerid, 49);
	int iClientsingame = GetClientCount(false);
	int iLimit = GetMaxHumanPlayers();
	
	LogMessage("kicking rejected player %s<%s> - [%d/%d] players", sPlayername, sPlayerid, iClientsingame, iLimit);
	PrintToChatAll("Gracz %N został wyrzucony z serwera, serwer jest pełny!", client);
	KickClient(client, "Serwer jest pełny");
	return Plugin_Handled;
}

 

 

To masz cały kod:

 

 
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! Odkryj ukrytą treść


#pragma semicolon 1
#include <sourcemod>
#include <adt_array>

Handle sm_admin_slots;

Handle Arr_SteamIDs = INVALID_HANDLE;
Handle fSteamIDList = INVALID_HANDLE;
char steamIDlist[PLATFORM_MAX_PATH];

public Plugin myinfo =
{
    name = "Client limiter",
    author = "Wilk",
    description = "Don't allow clients to connect if the server is full (supporting reserved slots)",
    version = "0.6.1",
    url = "http://hejk.pl"
};

public OnPluginStart()
{
	sm_admin_slots = CreateConVar("sm_admin_slots", "0", "number of reserved slots", FCVAR_NOTIFY, true, 0.0);
	
	BuildPath(Path_SM, steamIDlist, sizeof(steamIDlist), "configs/admin_slots.txt");
	LoadSteamIDList();
}

public OnClientPostAdminCheck(client)
{	
	//Temporary flags for non-admin users found in the admin_slots.txt file
	char auth[32];
	GetClientAuthId(client, AuthId_Steam2, auth, sizeof(auth));
	
	if (FindStringInArray(Arr_SteamIDs, auth) != -1)
	{
		SetUserFlagBits(client, ADMFLAG_RESERVATION);
	}
	
	//Reserved slots mechanism
	int limit = GetMaxHumanPlayers();
	
	if (GetClientCount(false) > (limit - GetConVarInt(sm_admin_slots)))
	{
		if (hasReservedSlotAccess(GetUserFlagBits(client)))
		{
			char playername[50];
			GetClientName(client, playername, 49);
			LogMessage("player %s connected to a reserved slot", playername);
			
			if (GetClientCount(false) > limit)
			{
				CreateTimer(0.1, OnTimedKickForReject, GetClientUserId(client));
			}
		}
		else {
			CreateTimer(0.1, OnTimedKickForReject, GetClientUserId(client));
		}
	}
}

public Action OnTimedKickForReject(Handle timer, any userid)
{
	int client = GetClientOfUserId(userid);
	
	if (!client || !IsClientInGame(client))
	{
		return Plugin_Handled;
	}

	char sPlayername[50], sPlayerid[50];
	GetClientName(client, sPlayername, 49);
	GetClientAuthId(client, AuthId_Steam2, sPlayerid, 49);
	int iClientsingame = GetClientCount(false);
	int iLimit = GetMaxHumanPlayers();
	
	LogMessage("kicking rejected player %s<%s> - [%d/%d] players", sPlayername, sPlayerid, iClientsingame, iLimit);
	PrintToChatAll("Gracz %N został wyrzucony z serwera, serwer jest pełny!", client);
	KickClient(client, "Serwer jest pełny");
	return Plugin_Handled;
}

// return true if this user is allowed to connect to a reserved slot  
bool hasReservedSlotAccess(const userFlags) {
	
	// admin flag based 
	if (userFlags & ADMFLAG_ROOT || userFlags & ADMFLAG_RESERVATION) {
		return true;
	}
	else {
		return false;
	}
}

LoadSteamIDList()
{
	if (FileExists(steamIDlist, false)) {
		fSteamIDList = OpenFile(steamIDlist, "rt");
	}
	else {
		fSteamIDList = OpenFile(steamIDlist, "at+");
		LogMessage("Created a config file at the file path: %s", steamIDlist);
	}

	if (fSteamIDList == INVALID_HANDLE)
		LogMessage("Error - unable to load or create file: %s", steamIDlist);

	Arr_SteamIDs = CreateArray(256);

	char sReadBuffer[256];
	
	int len;
	while (!IsEndOfFile(fSteamIDList) && ReadFileLine(fSteamIDList, sReadBuffer, sizeof(sReadBuffer)))
	{
		if(sReadBuffer[0] == '/' || IsCharSpace(sReadBuffer[0]))
			continue;
		
		ReplaceString(sReadBuffer, sizeof(sReadBuffer), "\n", "");
		ReplaceString(sReadBuffer, sizeof(sReadBuffer), "\r", "");
		ReplaceString(sReadBuffer, sizeof(sReadBuffer), "\t", "");
		ReplaceString(sReadBuffer, sizeof(sReadBuffer), " ", "");
		
		// Support for comments on end of line
		len = strlen(sReadBuffer);
		for(new i; i < len; i++)
		{
			if(sReadBuffer[i] == ' ' || sReadBuffer[i] == '/')
			{
				sReadBuffer[i] = '\0';
				
				break;
			}
		}
		
		//LogMessage("Pushing %s to Arr_SteamIDs", sReadBuffer);
		
		PushArrayString(Arr_SteamIDs, sReadBuffer);
	}
	
	//LogMessage("Reached EOF on %s", steamIDlist);
	
	CloseHandle(fSteamIDList);
} 

 

 

Wielkie dzięki ? Po testuje i dam znać czy działa.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Co jak co ale ten plugin jest taki sobie na forum tu jest jego przerobiona wersja, jezeli dodasz admina do pliku od pluginu aby dać mu rezerwacje slota to mu nadpisze flagi ;p 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić obrazków. Dodaj lub załącz obrazki z adresu URL.


×
×
  • Dodaj nową pozycję...