Jump to content
  • Chmurka
  • Boróweczka
  • Jabłuszko
  • Limonka
  • Czekoladka
  • Węgielek
MAGNET

11. Kolorowy czat, prefix

Recommended Posts

Czyść @MAGNET

Chciałem dodać opcję gdy Gracz jest vipem. Nie wiem czy idę dobrym tropem \/

Spoiler

#include <sourcemod>

#include <multicolors>

#include <cstrike>


 

// char C_Tag[][] = {"{default}", "{darkred}", "{green}", "{lightgreen}", "{red}", "{blue}", "{olive}", "{lime}", "{lightred}", "{purple}", "{grey}", "{yellow}", "{orange}", "{bluegrey}", "{lightblue}", "{darkblue}", "{grey2}", "{orchid}", "{lightred2}"};


 

public void OnPluginStart() {

RegConsoleCmd("say", ProcessChat);

RegConsoleCmd("say_team", ProcessChat_Team);

}


 

// GDY GRACZ JEST ADMINEM --------------------------------------------------------------------------------------------------------------------------------------------------------------------


 

public Action ProcessChat(int client, int args) {

char buffer[512];

GetCmdArgString(buffer, sizeof(buffer));

StripQuotes(buffer); // usunięcie "" z czatu

if (strlen(buffer) == 0) return Plugin_Handled; // jeśli wiadomośc jest pusta, nic nie zostanie wyświetlone

if (buffer[0] == '/' || buffer[0] == '!' || buffer[0] == '@') return Plugin_Handled;

 

CPrintToChatAll("%s%s$N{lightgreen} %s", GraczJestAdminem(client) ? "{green}ADMIN " : "", GetClientTeam(client) == CS_TEAM_CT ? "{lightblue}" : "{red}", client, buffer);

 

return Plugin_Handled;

}

 

public Action ProcessChat_Team(int client, int args) {

char buffer[512];

GetCmdArgString(buffer, sizeof(buffer));

StripQuotes(buffer); // usunięcie "" z czatu

if (strlen(buffer) == 0) return Plugin_Handled; // jeśli wiadomośc jest pusta, nic nie zostanie wyświetlone

if (buffer[0] == '/' || buffer[0] == '!' || buffer[0] == '@') return Plugin_Handled;

 

for (int i = 1; i < MAXPLAYERS; i++) {

if (IsValidClient(i) && GetClientTeam(i) == GetClientTeam(client))

CPrintToChat(i, "{purple}(team say) %s%s$N{lightgreen} %s", GraczJestAdminem(client) ? "{green}ADMIN " : "", GetClientTeam(client) == CS_TEAM_T ? "{red}" : "{blue}", client, buffer);

return Plugin_Handled;

}


 

bool GraczJestAdminem(int client) {

if (GetUserFlagBits(client) & ADMFLAG_BAN) return true

 

return false;

}

 

public bool IsValidClient(int client) {

if (client >= 1 && client <= MaxClients && IsClientInGame(client))

return true;

 

return false;

}

 

// GRY GRACZ JEST VIPEM ----------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

public Action ProcessChat(int client, int args) {

char buffer[512];

GetCmdArgString(buffer, sizeof(buffer));

StripQuotes(buffer); // usunięcie "" z czatu

if (strlen(buffer) == 0) return Plugin_Handled; // jeśli wiadomośc jest pusta, nic nie zostanie wyświetlone

if (buffer[0] == '/' || buffer[0] == '!' || buffer[0] == '@') return Plugin_Handled;

 

CPrintToChatAll("%s%s$N{lightgreen} %s", GraczJestVipem(client) ? "{lightblue}VIP " : "", GetClientTeam(client) == CS_TEAM_CT ? "{orange}" : "{orange}", client, buffer);

 

return Plugin_Handled;

}

 

public Action ProcessChat_Team(int client, int args) {

char buffer[512];

GetCmdArgString(buffer, sizeof(buffer));

StripQuotes(buffer); // usunięcie "" z czatu

if (strlen(buffer) == 0) return Plugin_Handled; // jeśli wiadomośc jest pusta, nic nie zostanie wyświetlone

if (buffer[0] == '/' || buffer[0] == '!' || buffer[0] == '@') return Plugin_Handled;

 

for (int i = 1; i < MAXPLAYERS; i++) {

if (IsValidClient(i) && GetClientTeam(i) == GetClientTeam(client))

CPrintToChat(i, "{purple}(team say) %s%s$N{lightgreen} %s", GraczJestVipem(client) ? "{yellow}VIP " : "", GetClientTeam(client) == CS_TEAM_T ? "{orange}" : "{orange}", client, buffer);

}

 

return Plugin_Handled;

}



 

bool GraczJestVipem(int client) {

if (GetUserFlagBits(client) & ADMFLAG_CUSTOM1) return true;

 

return false;

}

 

public bool IsValidClient(int client) {

if (client >= 1 && client <= MaxClients && IsClientInGame(client))

return true;

 

return false;

}

 

Gdy chcę go skompilować wyskakują mi takie błędy:

Spoiler

// C:\Users\Zaku\Desktop\scripting\prefixy.sp(45) : error 017: undefined symbol "GraczJestAdminem"
// C:\Users\Zaku\Desktop\scripting\prefixy.sp(71) : error 017: undefined symbol "IsValidClient"
// C:\Users\Zaku\Desktop\scripting\prefixy.sp(73) : error 017: undefined symbol "GraczJestAdminem"
// C:\Users\Zaku\Desktop\scripting\prefixy.sp(82) : warning 219: local variable "GraczJestAdminem" shadows a variable at a preceding level
// C:\Users\Zaku\Desktop\scripting\prefixy.sp(82) : error 001: expected token: ";", but found "("
// C:\Users\Zaku\Desktop\scripting\prefixy.sp(82) : error 029: invalid expression, assumed zero
// C:\Users\Zaku\Desktop\scripting\prefixy.sp(82) : error 029: invalid expression, assumed zero
// C:\Users\Zaku\Desktop\scripting\prefixy.sp(82) : fatal error 190: too many error messages on one line
//
// Compilation aborted.
// 7 Errors.
//

 

  • Lubię to! 1

Share this post


Link to post
Share on other sites

@Zaku

 

Bardzo się cięszę, że podjąłeś się próby napisania prefixu dla VIPa 🙂 najważniejsze to zacząć, a wszystkiego nauczysz się z czasem. W Twoim kodzie istnieje jedna zasadnicza nieścisłość - nazwy funkcji muszą być unikatowe - oznacza to, że nie możesz w jednym pluginie mieć dwóch funkcji, które nazywają się ProcessChat. Muszą mieć one dwie różne nazwy. Ponadto, jeśli chciałbyś implementować prefix, który będzie istniał zarówno dla VIPa, jak i admina, to nie ma sensu rozbijać tego na dwie funkcje - wszystko można załatwić w jednej i tej samej 😉

 

Najprościej to zobrazować, biorąc pod lupę funkcję ProcessChat:

public Action ProcessChat(int client, int args) {
	char buffer[512];
	GetCmdArgString(buffer, sizeof(buffer));
	StripQuotes(buffer);
	if (strlen(buffer) == 0)	return Plugin_Handled;
	if (buffer[0] == '/' || buffer[0] == '!' || buffer[0] == '@')	return Plugin_Handled;

	CPrintToChatAll("%s%s%N{default}: %s", GraczJestAdminem(client) ? "{green}ADMIN " : "", GetClientTeam(client) == CS_TEAM_T ? "{lightred}" : "{lightblue}", client, buffer);

	return Plugin_Handled;
}

(Nawiasem mówiąc, zachęcam do korzystania ze znacznika do kodu:)

Bez tytułu.png

 

Zasadnicze pytanie brzmi: co, jeśli gracz jest zarówno adminem jak i VIPem? Czy wówczas maja być wyświetlane obydwa prefixy? Na tę chwilę założę, że tak, bo jest to prostsza wersja, ale gdybyś chciał trochę przykombinować daj mi znać 😉

 

Jak widzę w kodzie, słusznie zauważyłeś, że trzeba stworzyć funkcję do sprawdzania, czy gracz jest VIPem. Napisałeś ją w poprawny sposób i właśnie jej możemy teraz użyć. Po modyfikcji nasza funkcja będzie wyglądała następująco:

 

public Action ProcessChat(int client, int args) {
	char buffer[512];
	GetCmdArgString(buffer, sizeof(buffer));
	StripQuotes(buffer);
	if (strlen(buffer) == 0)	return Plugin_Handled;
	if (buffer[0] == '/' || buffer[0] == '!' || buffer[0] == '@')	return Plugin_Handled;

	CPrintToChatAll("%s%s%s%N{default}: %s", GraczJestAdminem(client) ? "{green}ADMIN " : "", GraczJestVipem(client) ? "{green}VIP " : "", GetClientTeam(client) == CS_TEAM_T ? "{lightred}" : "{lightblue}", client, buffer);

	return Plugin_Handled;
}

jak widzisz, prefix od vipa umieściłem w tym samym CPrintToChat'cie. Dobór kolorystyki pozostawiam Tobie. Teraz pozostaje zaimplementować to samo w ProcessChat_Team.

 

Mam nadzieję, że nie zrobiłem z tego zbyt długiego wywodu i wszystko z tego wywnioskowałeś. W razie czego - pisz śmiało. Dobra robota! 🙂

  • Lubię to! 1
  • Kocham to! 2

Share this post


Link to post
Share on other sites
Posted (edited)

@MAGNET

 

Dodałem dodatkowo na właściciela. Z normalnym czatem działa, ale jeśli zaczynam pisać na team sayu, to mam tak jak niżej na screenie...

blad.JPG.c3ac5f035334745f8550d5ca1716fc93.JPG

 

public Action ProcessChat_Team(int client, int args) {
    char buffer[512];
    GetCmdArgString(buffer, sizeof(buffer));
    StripQuotes(buffer); // usunięcie "" z czatu
        if (strlen(buffer) == 0) return Plugin_Handled; // jeśli wiadomośc jest pusta, nic nie zostanie wyświetlone
        if (buffer[0] == '/' || buffer[0] == '!' || buffer[0] == '@') return Plugin_Handled;
            for (int i = 1; i < MAXPLAYERS; i++) {
                if (IsValidClient(i) && GetClientTeam(i) == GetClientTeam(client))
                    CPrintToChat(i, "{purple}(team say) %s%s%s%s$N{lightgreen} %s", GraczJestAdminem(client) ? "{green}ADMIN " : "", GraczJestVipem(client) ? "{orange}VIP " : "", GraczJestWlascicielem(client) ? "{red}Wlasciciel " : "", GetClientTeam(client) == CS_TEAM_T ? "{lightred}" : "{lightblue}", client, buffer);
            }
            

return Plugin_Handled;

}

Szukam szukam i nie mogę znaleźć co jest nie tak 😕

 

@edit

 

a właśnie, jak ustawić sprawdzanie flagi "Z"? Można wgl tak ustawić bool'a?

 

@edit2

dobra znalazłem, użyłem $N zamiast %N ehh...

Edited by Zaku

Share this post


Link to post
Share on other sites
6 godzin temu, Zaku napisał:

a właśnie, jak ustawić sprawdzanie flagi "Z"?

if(GetUserFlagBits(client) & ADMFLAG_ROOT)
{
	// Kod
}

 

Share this post


Link to post
Share on other sites

Mała dygresja - flaga root powinna działać tak, że magicznie przyznaje wszystkie przywileje. Tyle tylko, że...to tak nie działa.

 

Posiadając flagę root oczywiście możesz korzystać z wszystkich możliwości admina, to fakt. Niestety, prawie żaden plugin napisany przez społeczność nie uwzględnia faktu, że root to flaga jak każda inna i nią też trzeba uwzględniać przy pisaniu kodu, aby stała się pełnoprawną flagą ROOT. Nie ma tutaj żadnej magii - to normalne pole jak każde inne

Share this post


Link to post
Share on other sites

Przygotowałem również rozwiązanie, które przydziela tylko po jednym prefixie

Całość jest konfigurowana z poziomu tych dwóch tablic:

char prefix[][] = {
	"{lightred}[Właściciel]",
	"{lightgreen}[Admin]",
	"{lime}[VIP]"
};

int flaga[] = {
	ADMFLAG_ROOT,
	ADMFLAG_BAN,
	ADMFLAG_CUSTOM1
}

 

Właściciel ma przyporządkowaną flagę ROOT, admin BAN i tak dalej...jeśli chcesz dodać jakieś swoje prefixy - zrób to właśnie tutaj, dodając kolejną pozycję w obydwu tablicach.

Zasada działania jest taka, że "Właściciel" ma przyporządkowany największy priorytet i jeśli okaże się, że dany gracz ma flagę ROOT, to kolejne pola w tych tablicach nie będą sprawdzane. Jeśli gracz ma wszystkie flagi (root, ban i custom), to wyświetlanym prefixem będzie właściciel, natomiast osoba z BAN i CUSTOM1 będzie miała "admin". Odpowiada za to ten kod:

char prefixBuffer[64];
Format(prefixBuffer, sizeof(prefixBuffer), "");

for (int i = 0; i < sizeof(prefix); i++) {
  if (GetUserFlagBits(client) & flaga[i]) {
    Format(prefixBuffer, sizeof(prefixBuffer), "%s", prefix[i]);
    break;
  }

}

Funkcja Format
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!
działa tak, jakbyś "pisał do stringa" - a więc to, co zazwyczaj wypisywaliśmy w PrintToChat może być użyte do zamieszczenia jakiejś informacji w stringu.

Może się okazać, że gracz nie będzie miał żadnej flagi i z tego powodu istnieje ta druga linijka - w razie czego, string jest ustawiany na pusty.

Następnie ecę tutaj pętlą od 0 do ilości prefixów (określonej przez rozmiar tablicy za pomocą sizeof) i sprawdzam po kolei flagi gracza. Jeśli trafię na taką, którą ma gracz - przypisuję prefix do stringa i zamykam pętlę. A później w Print'cie robię po prostu tak:

CPrintToChatAll("%s%s%N{default}: %s", prefixBuffer.......

 

Całość:

 

Spoiler

#include <sourcemod>
#include <multicolors>
#include <cstrike>

// CS_TEAM_T
// CS_TEAM_CT


//{"{default}", "{darkred}", "{green}", "{lightgreen}", "{red}", "{blue}", "{olive}", "{lime}", "{lightred}", "{purple}", "{grey}", "{yellow}", "{orange}", "{bluegrey}", "{lightblue}", "{darkblue}", "{grey2}", "{orchid}", "{lightred2}"};

char prefix[][] = {
	"{lightred}[Właściciel]",
	"{lightgreen}[Admin]",
	"{lime}[VIP]"
};

int flaga[] = {
	ADMFLAG_ROOT,
	ADMFLAG_BAN,
	ADMFLAG_CUSTOM1
}

public void OnPluginStart() {
	RegConsoleCmd("say", ProcessChat);
	RegConsoleCmd("say_team", ProcessChat_Team);
}

public Action ProcessChat(int client, int args) {
	char buffer[512];
	GetCmdArgString(buffer, sizeof(buffer));
	StripQuotes(buffer);
	if (strlen(buffer) == 0)	return Plugin_Handled;
	if (buffer[0] == '/' || buffer[0] == '!' || buffer[0] == '@')	return Plugin_Handled;

	char prefixBuffer[64];
	Format(prefixBuffer, sizeof(prefixBuffer), "");

	for (int i = 0; i < sizeof(prefix); i++) {
		if (GetUserFlagBits(client) & flaga[i]) {
			Format(prefixBuffer, sizeof(prefixBuffer), "%s", prefix[i]);
			break;
		}

	}

	CPrintToChatAll("%s%s%N{default}: %s", prefixBuffer, GetClientTeam(client) == CS_TEAM_T ? "{lightred}" : "{lightblue}", client, buffer);

	return Plugin_Handled;
}

public Action ProcessChat_Team(int client, int args) {
	char buffer[512];
	GetCmdArgString(buffer, sizeof(buffer));
	StripQuotes(buffer);
	if (strlen(buffer) == 0)	return Plugin_Handled;
	if (buffer[0] == '/' || buffer[0] == '!' || buffer[0] == '@')	return Plugin_Handled;

	for (int i = 1; i < MAXPLAYERS; i++) {
		if (IsValidClient(i) && GetClientTeam(i) == GetClientTeam(client))
			CPrintToChat(i, "{orchid}(team say) %s%s%N{default}: %s", GraczJestAdminem(client) ? "{green}ADMIN " : "", GetClientTeam(client) == CS_TEAM_T ? "{lightred}" : "{lightblue}", client, buffer);

	}

	return Plugin_Handled;
}

bool GraczJestAdminem(int client) {
	if (GetUserFlagBits(client) & ADMFLAG_BAN)	return true;

	return false;
}

public bool IsValidClient(int client) {
  if (client >= 1 && client <= MaxClients && IsClientInGame(client))
    return true;

  return false;
}

 

 

 

Zostawiłem Ci tylko drobne zadanie zaimplementowania tych prefixów w czat teamsay'owy. Powodzenia 🙂

  • Wow! 1
By MAGNET,

PS: i teraz funkcja GraczJestAdminem nie będzie potrzebna

Share this post


Link to post
Share on other sites
Posted (edited)

prefix.JPG.2d04d73d77df70de5728c9ea0e270001.JPG

 

Jest moc ^_^

 

 

@edit

@MAGNET - aż zamęczę Cię pytaniami 😄

 

Próbuję ogarnąć tag dla zwykłego gracza, takiego bez flag. Idę tropem if/else:

 

else (GetUserFlagBits(client) == 0)

Nie wiem czy aby na pewno dobrze, ale nie mam pomysłu, jak zrobić warunek, że gracz nie posiada flagi. Starałem się zrobić dodatkowy char graczBuffer[64]. Mógłbyś tylko nakierować w jaką stronę iść? Nie chcę gotowca, tylko wskazówki 😄

Edited by Zaku
  • Kocham to! 1

Share this post


Link to post
Share on other sites
11 godzin temu, Zaku napisał:

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

 

Jest moc ^_^

 

 

@edit

@MAGNET - aż zamęczę Cię pytaniami 😄

 

Próbuję ogarnąć tag dla zwykłego gracza, takiego bez flag. Idę tropem if/else:

 


else (GetUserFlagBits(client) == 0)

Nie wiem czy aby na pewno dobrze, ale nie mam pomysłu, jak zrobić warunek, że gracz nie posiada flagi. Starałem się zrobić dodatkowy char graczBuffer[64]. Mógłbyś tylko nakierować w jaką stronę iść? Nie chcę gotowca, tylko wskazówki 😄

Wystarczy Ci samo is valid client. 

Nie musisz definiować że grasz nie ma flagi bo domyślnie nie ma. 

 

Validacja klienta wystarczy 

Share this post


Link to post
Share on other sites

Jeżeli chcesz, aby każdy gracz miał domyślnie jakiś prefix, to wystarczy zrobić to tutaj:

char prefixBuffer[64];
Format(prefixBuffer, sizeof(prefixBuffer), "USTAW SOBIE PREFIX TUTAJ np. {orange}[gracz]");

 

  • 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.


  • 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...