Skocz do zawartości
MAGNET

24. Operacje bitowe

Rekomendowane odpowiedzi

// 0. Wstęp, co będziemy robić
// 1. Skierować do poradnika o bitach
// 2. Pokazać zmienną jako liczbę binarną i drobne przeliczenie
// 3. Flagi admina - jako abcdef.... i jako zmienna

#include <sourcemod>
#include <multicolors>


#define TAG "{purple}[Admin]{default}"

char flagNames[][] = {
    "[a] Rezerwacja slota",
    "[b] Flaga ogólna dla adminów",
    "[c] Kick",
    "[d] Ban",
    "[e] Unban",
    "[f] Slay",
    "[g] Zmiana mapy",
    "[h] ConVar",
    "[i] Config",
    "[j] Chat",
    "[k] Vote",
    "[l] Password",
    "[m] RCON",
    "[n] sv_cheats",
    "[z] root",
    "[o] ADMIN_CUSTOM1",
    "[p] ADMIN_CUSTOM2",
    "[q] ADMIN_CUSTOM3",
    "[r] ADMIN_CUSTOM4",
    "[s] ADMIN_CUSTOM5",
    "[t] ADMIN_CUSTOM6"
};

char flagCharacter[] = "abcdefghijklmnzopqrst";

int flagsToSet;
int playerToSet;

public void OnPluginStart() {
  RegConsoleCmd("sm_addadmin", AddAdminCmd);
}

public Action AddAdminCmd(int client, int args) {
  AddAdmin(client);
  flagsToSet = 0;
}
void AddAdmin(int client) {
  Menu menu = new Menu(AddAdmin_Handler);
  char buffer[512];
  char optionBuffer[8];

  menu.SetTitle("Wybierz gracza:");
  for (int i = 1; i < MAXPLAYERS; i++) {
    if (!IsClientInGame(i) || IsFakeClient(i) || IsClientSourceTV(i)) continue;
    Format(buffer, sizeof(buffer), "%N", i);
    Format(optionBuffer, sizeof(optionBuffer), "%d", GetClientUserId(i));
    menu.AddItem(optionBuffer, buffer);
  }
  menu.Display(client, MENU_TIME_FOREVER);
}

public int AddAdmin_Handler(Menu menu, MenuAction action, int client, int item) {
  if (action == MenuAction_Select) {
    char InfoBuffer[8];
    menu.GetItem(item, InfoBuffer, sizeof(InfoBuffer));
    playerToSet = StringToInt(InfoBuffer);
    if (!GetClientOfUserId(playerToSet)) {
      CPrintToChat(client, "%s Gracz wyszedł z gry...", TAG);
      AddAdmin(client);
      return 0;
    }
    ChooseFlags(client);
  } else if (action == MenuAction_End)
    delete menu;

  return 0;
}

void ChooseFlags(int client, int showAt = 0) {
  int target = GetClientOfUserId(playerToSet);
  if (!target) {
    CPrintToChat(client, "%s Gracz wyszedł z gry...", TAG);
    return;
  }

  Menu menu = new Menu(ChooseFlags_Handler);
  char buffer[1024];
  Format(buffer, sizeof(buffer), "Flagi, które mają zostać przydzielone graczowi: %N", target);
  menu.SetTitle(buffer);
  menu.AddItem("", "Zatwierdź", flagsToSet ? ITEMDRAW_DEFAULT : ITEMDRAW_DISABLED);
  for (int i = 0; i < sizeof(flagNames); i++) {
    Format(buffer, sizeof(buffer), "%s%s", (flagsToSet & (1 << i)) ? "[X]" : "", flagNames[i]);
    menu.AddItem("", buffer);
  }
  menu.DisplayAt(client, showAt, MENU_TIME_FOREVER);
}

public int ChooseFlags_Handler(Menu menu, MenuAction action, int client, int item) {
  if (action == MenuAction_Select) {
    if (item == 0) {
      WriteAdminToFile(client);
    } else {
      flagsToSet ^= (1 << (item - 1));
      ChooseFlags(client, menu.Selection);
    }
  } else if (action == MenuAction_End)
    delete menu;
}

void WriteAdminToFile(int client) {
  int target = GetClientOfUserId(playerToSet);
  if (!target) {
    CPrintToChat(client, "%s Gracz wyszedł z gry...", TAG);
    return;
  }

  SetUserFlagBits(target, GetUserFlagBits(target)|flagsToSet);

  char steamIdBuffer[64];
  GetClientAuthId(target, AuthId_Steam2, steamIdBuffer, sizeof(steamIdBuffer));

  char flagsBuffer[32];
  BuildFlagString(flagsToSet, flagsBuffer, sizeof(flagsBuffer));

  char buffer[1024];
  Format(buffer, sizeof(buffer), "\"%s\" \"%s\"", steamIdBuffer, flagsBuffer);

  char path[PLATFORM_MAX_PATH];
  BuildPath(Path_SM, path, PLATFORM_MAX_PATH, "configs/admins_simple.ini");
  File f = OpenFile(path, "a");
  f.WriteLine(buffer);
  delete f;
  CPrintToChat(client, "%s Użytkownik dodany prawidłowo", TAG);
}

void BuildFlagString(int flags, char[] buffer, int size) {
  Format(buffer, size, "");
  for (int i = 0; i < sizeof(flagCharacter); i++) {
    if (flags & (1 << i))
      Format(buffer, size, "%s%c", buffer, flagCharacter[i]);
  }
}

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić obrazków. Dodaj lub załącz obrazki z adresu URL.


×
×
  • Dodaj nową pozycję...