Jump to content
  • Chmurka
  • Boróweczka
  • Jabłuszko
  • Limonka
  • Czekoladka
  • Węgielek
Sign in to follow this  
m0re

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

Recommended Posts

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.

By 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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
1 minutę temu, zorix napisał:

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

Dokładnie tak.

Share this post


Link to post
Share on other sites

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);
} 

 

 

  • Dobry pomysł! 2

Share this post


Link to post
Share on other sites

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 ? 

Share this post


Link to post
Share on other sites
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.

 

  • Lubię to! 1

Share this post


Link to post
Share on other sites
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 ?.

 

Share this post


Link to post
Share on other sites

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.  

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

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 

  • Lubię to! 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

Nasza historia

Na początku byliśmy małą grupą internetowych znajomych, którzy stwierdzili, że potrzebne jest solidne forum, na którym znajdą się ludzie z dużą wiedzą programistyczną ukierunkowaną na CS:GO. Pomysł powstał na początku 2018 roku, a parę miesięcy później, 19 kwietnia, powstała ta strona internetowa. Jako alternatywna odpowiedź na inne tego typu miejsca, poważnie podeszliśmy do tematu, najpierw tłumacząc angielską dokumentację SourceMod'a na język polski, a potem pisząc rozległe poradniki i wypełniając forum najpotrzebniejszymi rzeczami dla właścicieli serwerów i programistów. Cała nasza Ekipa jest dumna z pracy jaką w to włożyliśmy i cieszymy się że zbierają się wokół nas zarówno ludzie znający tematy sourcepawn'a i konfiguracji, jak i również nowe twarze w tym "biznesie", którym z chęcią niesiemy wiedzę oraz pomoc w rozwiązywaniu problemów.

Największe modyfikacje serwerowe

×
×
  • Create New...