get_user_flags(id) & 524288 == 524288
Kto wymyślił taki bezsensowny i kompletnie nieczytelny zapis? Gdy przyjdzie to zmienić na inną flagę lub sprawdzić jaka flaga jest potrzebna, będziemy przeliczać wartość na binarną i liczyć który bit jest zaświecony, aby określić jaka to flaga? Dużo czytelniejszym zapisem jest:
get_user_flags(id) & ADMIN_LEVEL_H == ADMIN_LEVEL_H
Jeśli potrzebujemy sprawdzić kilka flag na raz, można to zrobić tak:
get_user_flags(id) & (ADMIN_LEVEL_H|ADMIN_LEVEL_C) == (ADMIN_LEVEL_H|ADMIN_LEVEL_C)
I od razu widać jaka to flaga... A na optymalności ABSOLUTNIE NIC nie tracimy, kod jest przeliczany na odpowiednią wartość na poziomie kompilacji (jeśli włączona jest optymalizacja, a domyślnie jest ona włączona) i w efekcie oba sposoby dają dokładnie taki sam efekt...
A co do kodu, wystarczy dodać warunek:
if(get_user_flags(id) & ADMIN_LEVEL_H != ADMIN_LEVEL_H) return PLUGIN_CONTINUE;
na początku PreThinka i funkcji wywoływanej przez task.