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

Recommended Posts

Posted (edited)

Opis: Po X rundach losuje osobę, która dostanie darmowego vipa do końca mapy. Możemy ustawić od ilu graczy od której rundy. Możemy również dać większą szansę graczom, którzy posiadają daną nazwę w nicku (wszystko zmieniamy w cvarach). Możemy również dać daną flagę.

 

KOD:
 

Spoiler

#include <sdktools>

#pragma semicolon 1
#pragma newdecls required

ConVar gc_RandomVIP, gc_VIPFlag, gc_MinPlayers, gc_MOD_TAG;
ConVar gc_EnableWebsite, gc_Website;
char MOD_TAG[64], WEB[64];

int g_iRound;

ArrayList pula_graczy;

public Plugin myinfo = 
{
	name = "ADEPT --> Losowy VIP",
	description = "Autorski Plugin StudioADEPT.net", 
	author = "Brum Brum", 
	version = "1.0", 
	url = "http://www.StudioADEPT.net/forum", 
};

public void OnPluginStart()
{
	pula_graczy = new ArrayList();
	gc_RandomVIP = CreateConVar("sm_vip_random_round", "5", "Runda w której ma wylosować vipa (rozgrzewka nie jest brana pod uwagę)");
	gc_VIPFlag = CreateConVar("sm_vip_random_flag", "o", "Flaga którą ma otrzymać vip");
	gc_MinPlayers = CreateConVar("sm_vip_random_player", "2", "Minimalna ilość graczy do wylosowania vipa");
	gc_EnableWebsite = CreateConVar("sm_vip_random_website_enable", "1", "Zwiększa szanse graczom, który zawierają nazwe sieci w nicku(Wymagany cvar niżej)");
	gc_Website = CreateConVar("sm_vip_random_website_name", "StudioADEPT.net", "Nazwa sieci zwiększająca szanse na losowego vipa");
	gc_MOD_TAG = CreateConVar("sm_vip_random_tag", "ADEPT", "TAG pokazywany na czacie");
	gc_MOD_TAG.AddChangeHook(MOD_TAGNameChanged);
	gc_MOD_TAG.GetString(MOD_TAG, sizeof(MOD_TAG));
	gc_Website.AddChangeHook(WEBNameChanged);
	gc_Website.GetString(WEB, sizeof(WEB));
	HookEvent("round_start", Event_RoundStart);
	HookEvent("cs_win_panel_match", RestartRound);
	AutoExecConfig(true, "ADEPT_LosowyVIP");
}

public void MOD_TAGNameChanged(ConVar convar, const char[] oldValue, const char[] newValue)
{
	Format(MOD_TAG, sizeof(MOD_TAG), newValue);
}
public void WEBNameChanged(ConVar convar, const char[] oldValue, const char[] newValue)
{
	Format(WEB, sizeof(WEB), newValue);
}

public Action Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
	if (IsWarmup())return;
	
	int Runda = gc_RandomVIP.IntValue;
	int MinPlayers = gc_MinPlayers.IntValue;
	int Players = GetPlayerCount();
	
	g_iRound++;
	if (g_iRound == Runda) {	
		if (Players >= MinPlayers)GetRandomVIP();
		else PrintToChatAll("\x01\x0B★ \x07[%s -> Losowy VIP]\x04 Jest zbyt mało graczy aby wylosować VIPa!", MOD_TAG);
	}
}

public Action RestartRound(Event event, const char[] name, bool dontBroadcast)
{
	g_iRound = 0;
}

void GetRandomVIP()
{
	int Random = GetRandomPlayer();
	PrintToChatAll("\x01\x0B★ \x07[%s -> Losowy VIP]\x04 Trwa losowanie VIP'a...", MOD_TAG);
	PrintToChatAll("\x01\x0B★ \x07[%s -> Losowy VIP]\x04 Trwa losowanie VIP'a...", MOD_TAG);
	PrintToChatAll("\x01\x0B★ \x07[%s -> Losowy VIP]\x04 Trwa losowanie VIP'a...", MOD_TAG);
	if (Random)
	{
		PrintToChatAll("\x01\x0B★ \x07[%s -> Losowy VIP]\x04 Losowym VIP'em zostaje \x02%N\x04 Gratulujemy!", MOD_TAG, Random);
		SetUserFlagBits(Random, GetUserFlagBits(Random) | GetFlag());
	}
	else PrintToChatAll("\x01\x0B★ \x07[%s -> Losowy VIP]\x04 Nie można wylosować VIP`a ponieważ na serwerze są same VIPY!", MOD_TAG);
}

bool HaveFlag(int client)
{
	int flag = GetFlag();
	
	if (GetUserFlagBits(client) & flag)return true;
	else return false;
}

int GetRandomPlayer()
{
	
	pula_graczy.Clear();
	for (int i = 1; i < MaxClients; i++)
	{
		if (IsValidClient(i))
		{
			if (gc_EnableWebsite.BoolValue) {
				if (!HaveFlag(i) && HaveWebSite(i)) {
					pula_graczy.Push(i);
					pula_graczy.Push(i);
				}
				else if (!HaveFlag(i) && !HaveWebSite(i))pula_graczy.Push(i);
			}
			else
			{
				if (!HaveFlag(i))pula_graczy.Push(i);
			}
		}
	}
	if (pula_graczy.Length == 0)return 0;
	
	return pula_graczy.Get(GetRandomInt(0, pula_graczy.Length - 1));
}

bool HaveWebSite(int client)
{
	if (!IsValidClient(client))return false;
	
	char name[MAX_NAME_LENGTH];
	GetClientName(client, name, sizeof(name));
	
	if (StrContains(name, WEB, true) != -1)return true;
	else return false;
}

int GetPlayerCount()
{
	int count;
	for (int i = 1; i <= MaxClients; i++) {
		if (IsValidClient(i))count++;
	}
	
	return count;
}

int GetFlag()
{
	char flag[10];
	gc_VIPFlag.GetString(flag, sizeof(flag));
	
	return ReadFlagString(flag);
}

public bool IsValidClient(int client)
{
	if (!(1 <= client <= MaxClients) || !IsClientInGame(client) || !IsClientConnected(client) || IsFakeClient(client) || IsClientSourceTV(client))
		return false;
	
	return true;
}

bool IsWarmup()
{
	int warmup = GameRules_GetProp("m_bWarmupPeriod", 4, 0);
	if (warmup == 1)return true;
	else return false;
} 

 

 

W razie błędów standardowo napisz o tym w komentarzu. 

 

ADEPT_LosowyVIP.sp
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

Edited by Brum Brum
Zmiana sposobu sprawdzania flag.
  • Lubię to! 3
  • Dobry pomysł! 1
  • Kocham to! 1

Share this post


Link to post
Share on other sites
Posted (edited)

Lepszy sposób na sprawdzenie czy gracz posiada daną flagę.

 

int GetFlag()
{
	char flag[10];
	gc_VIPFlag.GetString(flag, sizeof(flag));
	
	return ReadFlagString(flag);
}

 

Edit: Również nie ma potrzeby deklarować dynamicznej tablicy globalnie, gdyż tylko niepotrzebnie zajmuje pamięć.

 

Dobrym nawykiem jest również.

 

bool IsWarmup()
{
	return (GameRules_GetProp("m_bWarmupPeriod") == 1);
}
bool IsValidClient(int iClient)
{
	return (1 <= iClient <= MaxClients && IsClientInGame(iClient) && IsClientConnected(iClient) && !IsFakeClient(iClient) && !IsClientSourceTV(iClient));
}
bool HaveWebSite(int client)
{
    if (!IsValidClient(client)) return false;

    char name[MAX_NAME_LENGTH];
    GetClientName(client, name, sizeof(name));

    return (StrContains(name, WEB) != -1);
}
bool HaveFlag(int client)
{
	int flag = GetFlag();
	
	return view_as<bool>(GetUserFlagBits(client) & flag);
}

 

Nierówność przy pętli przechodzącej przez wszystkich graczy ma być domknięta.

for (int i = 1; i <= MaxClients; i++)

 

 

Edited by Master
  • Lubię to! 1
  • Kocham 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...