Skocz do zawartości
kox1906

[Brak rozwiązania] Dodawanie vipa przez menu

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

Udostępnij tę odpowiedź


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 

Udostępnij tę odpowiedź


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ę

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
  • Dziękuje 1
Napisano (edytowane)
#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

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

o to chodziło i to jest dobry plugin, tylko jest ogromna luka. Przy refreshu adminów, czy rozłączeniu z serwerem dana flaga się usuwa. Dałoby się zrobić, żeby zostawała?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

możesz połączyć z bazą danych a przy connectcie sprawdzać czy jest w bazie danych

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Napisano (edytowane)

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

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Napisano (edytowane)

Cookies ☺️ Pomysł logicznie, skoro nigdzie nie zapisujesz vipa to jak plugin ma go wczytać po zmianie mapy xd 

Edytowane przez daffyy

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie da sie pomslec o czyms o czego istnieniu sie nie wie :DD

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wiadomość wygenerowana automatycznie

 

Brak rozwiązania problemu

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

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.

×
×
  • Dodaj nową pozycję...