Skocz do zawartości
[Brak rozwiązania] Dodawanie vipa przez menu
Przestarzałe tematy

Rekomendowane odpowiedzi

Cześć,

Tworzę plugin, dzięki któremu admin, czy właściciel po wpisaniu /addvip, tudzież /av dostanie menu z wszystkimi graczami na serwerze, a po wybraniu gracza- temu graczowi zostanie dodany vip. Chciałem to zrobić na tablicach dynamicznych- jak to było w pluginie z historią, ale minus jest taki, że przy każdym połączeniu klienta tworzy się nowe pole w menu i jeśli dany gracz się połączy 5 razy z rzędu, to nie będzie to menu ukazujące wszystkich graczy, tylko ostatnie połączenia jakie były. Nie wiem jak zrobić "unikalne" pole do ArrayListy. Może ma ktoś jakiś pomysł? To plugin:

#include <sourcemod
 
public void OnPluginStart()
{
    RegConsoleCmd("sm_addvip", AddingNewVip);
    RegConsoleCmd("sm_av", AddingNewVip);
}
 
public Action AddingNewVip(int client, int args)
{
    if(!IsAdmin(client) && !IsOwner(client))      return;
 
    char nameBuffer[MAX_NAME_LENGTH];
    char steamIdBuffer[64];
    char buffer[512];
 
    Menu av = new Menu(av_Handler);
    av.SetTitle("ALL PLAYERS CONNECTED NOW:");
    for(int i=1; i<MAXPLAYERS; i++)
    {
        if(IsValidClient(i))
        {
            GetClientName(i, nameBuffer, sizeof(nameBuffer));
            GetClientAuthId(i, AuthId_Steam2, steamIdBuffer, sizeof(steamIdBuffer));
            Format(buffer, sizeof(buffer), "%s >>> %s", nameBuffer, steamIdBuffer);
            av.AddItem("", buffer);
        }
        else    continue;
    }
    av.Display(client, MENU_TIME_FOREVER);
}
 
public int av_Handler(Menu av, MenuAction action, int client, int position)
{
    if(action == MenuAction_End)    delete av;
    else if(action == MenuAction_Select)
    {
        // tak jak było w odcinku z tworzenia historii, ale chodzi o to, żeby flagi admina dodawały się graczowi, który jest pod danym indeksem menu, np.:
        // AddUserFlags(position, Admin_Custom1);
        // PrintToChat(client, "Gracz: %N dostał VIPa!", position);
    }
}
 
//////////////////////////////////// BOOLS ////////////////////////////////////
public bool IsValidClient(int client)
{
    if(client >=1 && client <=MAXPLAYERS && IsClientInGame(client))
        return true;
 
    return false;
}
 
bool IsVip(int client)
{
    if(GetUserFlagBits(client) & ADMFLAG_CUSTOM1)     return true;
    
    return false;
}
 
bool IsAdmin(int client)
{
    if(GetUserFlagBits(client) & ADMFLAG_CUSTOM2)   return true;
 
    return false;
}
 
bool IsOwner(int client)
{
    if(GetUserFlagBits(client) & ADMFLAG_CUSTOM3)   return true;
 
    return false;
}
Odnośnik do odpowiedzi
Udostępnij na innych stronach

Możesz pobrać SteamID gracza z menu i dodać je do tablicy, po wejściu sprawdzać czy to jego steamid, jeżeli tak to nadaj flagi 

Sygnatura użytkownika

__________________________________________________________________________________________________________________________________________________________________________
【 Deathrun    |    Deathrun Sklep    |    Deathrun VIP    |    Deathrun AutoRespawn    |    Jackpot    |    Losowy VIP    |    Modele  |   NoScope Detector    |    C4 Timer 
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mógłbyś spojrzeć na to? 

public Action AddingNewVip(int client, int args)
{
    if(!IsAdmin(client) && !IsOwner(client))    return;
 
    char nameBuffer[MAX_NAME_LENGTH];
    char steamIdBuffer[64];
    char buffer[512];
 
    Menu av = new Menu(av_Handler);
    av.SetTitle("ALL PLAYERS CONNECTED NOW:");
    for(int i=1; i<MAXPLAYERS; i++)
    {
        if(IsValidClient(i))
        {
            GetClientName(i, nameBuffer, sizeof(nameBuffer));
            GetClientAuthId(i, AuthId_Steam2, steamIdBuffer, sizeof(steamIdBuffer));
            playerNick.PushString(nameBuffer);
            playerSID.PushString(steamIdBuffer);
            Format(buffer, sizeof(buffer), "%s >>> %s", nameBuffer, steamIdBuffer);
            av.AddItem("", buffer);
        }
        else    continue;
    }
    av.Display(client, MENU_TIME_FOREVER);
}
 
public int av_Handler(Menu av, MenuAction action, int client, int position)
{
    if(action == MenuAction_End)    delete av;
    else if(action == MenuAction_Select)
    {
        char nickBuffer[MAX_NAME_LENGTH];
        char sidBuffer[64];
        playerNick.GetString(position, nickBuffer, sizeof(nickBuffer));
        playerSID.GetString(position, sidBuffer, sizeof(sidBuffer));
 
        for(int i=0; i<10; i++)
        {
            PrintToConsole(client, "[TEST CZY DZIALA] %s >>> %s", nickBuffer, sidBuffer);
        }
        AddUserFlags(/*CLIENT KTOREMU MA ZOSTAC DODANA FLAGA*/, Admin_Custom1);
 
    }
}

nie mam pojęcia komu dać flagi przy AddUserFlags, jeśli w ogóle dobrze myślę

Odnośnik do odpowiedzi
Udostępnij na innych stronach
#include <sourcemod>

#define vip_flag Admin_Custom1

char commands[][] = {
	"sm_addvip", "sm_av"
} 

public OnPluginStart()
{
	for (int i = 0; i < sizeof(commands); i++)
		RegAdminCmd(commands[i], cmd_add_vip, ADMFLAG_BAN);
}

public Action cmd_add_vip(int client, int args)
{
	Menu menu = new Menu(m_handler);
	menu.SetTitle("online:");
	for (int i = 1; i <= MaxClients; i++)
	{
		if (IsClientConnected(i))
		{
			char client_id[64];
			char item_text[MAX_NAME_LENGTH];
			Format(item_text, sizeof(item_text), "%N", i);
			IntToString(i, client_id, sizeof(client_id));
			menu.AddItem(client_id, item_text);
		}
	}
	menu.Display(client, MENU_TIME_FOREVER);
	return Plugin_Handled;
}

public int m_handler(Menu menu, MenuAction action, int client, int param)
{
	if (action == MenuAction_Select) 
	{
		char buff[64];
		menu.GetItem(param, buff, sizeof(buff));
		AddUserFlags(StringToInt(buff), vip_flag);
		PrintToChat(client, "vip dany dla: %N", StringToInt(buff));
	}
	return 0;
}

nie wiem czy o to ci dokladnie chodzilo

Edytowane przez ogbudowa
  • Dziękuję
Odnośnik do odpowiedzi
Udostępnij na innych stronach
  • Moderator poziom 2

Jasne opiszę ci to w kilku krokach:

  1. Stwórz zmienną globalną typu boolean (np. g_bHasVip[MAXPLAYERS+1];)
  2. W OnClientPutInServer ustaw wartość tej zmiennej na false;
  3. W OnMapStart stwórz timer, który będzie wykonywał się co 60 sekund.
  4. W callbacku timera zrób pętlę po wszystkich graczach i sprawdzaj czy wartość booleana jest na true. Jeżeli tak to dodawaj im flagi.
  5. Oczywiście w handlerze dodawania vipa ustaw wartość boola na true dla wybranego gracza.

Sygnatura użytkownika

» Steam: https://steamcommunity.com/id/pawelsteam/\

» Discord: Paweł#8244

» PluginyCS: https://pluginycs.pl/profile/Pawel

» Przyjmuję zlecenia na paczki oraz pluginy.  «

Odnośnik do odpowiedzi
Udostępnij na innych stronach

W sumie jest lepiej, ale nadal spora luka. Nadal, przy zmianie mapy flaga się usuwa, tak jakby timer nie działał. Oto fragment kodu z OnMapStart i OnClientPutInServer:

#include <sourcemod
 
bool gPlayerIsVip[MAXPLAYERS+1];
 
public void OnMapStart()
{
    CreateTimer(60.0, CheckingVip, _, TIMER_REPEAT);
}
 
public void OnClientPutInServer(int client)
{
    gPlayerIsVip[client] = false;
}
 
public Action CheckingVip(Handle timer, int client)
{
    for(int i=1; i<=MaxClients; i++)
    {
        if(IsValidClient(i))
        {
            if(gPlayerIsVip)   
            {  
                AddUserFlags(i, Admin_Custom1);
                PrintToChat(i, "FLAGA DODANA DLA: %N", i);       //dla testu, nie wyswietla sie
            }
        }
    }
}
Edytowane przez kox1906
Odnośnik do odpowiedzi
Udostępnij na innych stronach
  • 4 tygodnie później...
  • Moderator poziom 2

Wiadomość wygenerowana automatycznie

 

Brak rozwiązania problemu

Jeżeli się z tym nie zgadzasz, raportuj ten post

Sygnatura użytkownika

» Steam: https://steamcommunity.com/id/pawelsteam/\

» Discord: Paweł#8244

» PluginyCS: https://pluginycs.pl/profile/Pawel

» Przyjmuję zlecenia na paczki oraz pluginy.  «

Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ostatnio przeglądający ten temat (5 użytkowników)

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
×
×
  • Dodaj nową pozycję...