Доброго времени суток всем. Сегодня пришёл к Вам с парой вопросов и, почитав темы на форуме, убедился, что люди тут знающие сидят.
Я работаю с Pawn не так уж и давно, знаю достаточно мало, но всё же стараюсь пополнять знания.
На этот раз скачал мод и работаю в нём уже пару недель, чтобы уже окончательно более-менее разобраться в Pawn языке. Плагины, установленные в моде до меня - <zcmd> и <sscanf2>. Ими и будем пользоваться.
Итак, предыстории достаточно, к делу.
Я переписывал систему администрирования в моде и вырезал стандартную авторизацию /alogin, дабы создать другую. На данный момент это последнее, что осталось сделать по админ. командам, но и самое сложное для меня.
В моих планах было сделать команду /duty [пароль] (всего паролей будет 7, под каждый уровень администрирования) и здесь-то я и просел.
Если написание стандартных команд /ban, /offban, /hpall, /a, /admins, /setmp и подобное я сделал, то тут сложнее получилось.
Я перечитал достаточно информации на форумах и понял, что придется юзать bool или static const для хранения паролей (но это не точно) и реализовывать каждый пароль для своего уровня админки через switch. Примерно, обзаведясь этими данными, подумал, что всё проще простого, но... нет.
Смотрим код, что я намудрил.
Ко всем new (прикладываю два варианта, что использовал)
PHP код:
static const AdminDuty [7] =
{
3117896,
3937140,
9945800,
5464133,
9856641,
9286298,
1269818
};
И
PHP код:
new AdminDuty[1][7]=
{
{3117896, 3937140, 9945800, 5464133, 9856641, 9286298, 1269818}
};
То бишь эти переменные и будут хранить наши пароли.
Теперь команды.
Первая версия была с использованием static const и запрашиванием этих паролей через params[0], приравнивая их к AdminDuty[]. Но забыл, что подобное провернуть будет невозможно (но это не точно). Смотрим код.
PHP код:
CMD:duty(playerid,params[])
{
if(gLogAcc[playerid] == false) return 1; // Буду пояснять на первый раз за каждую строку. В данном случае это обычная проверка на авторизацию на сервере
if(PlayerInfo[playerid][pAdmin] < 1) return 1; // Тут всё и без того ясно
if(sscanf(params, "d", params[0])) return 1; // Используем params[0] как /duty params[0] (пароль), а затем приравниваем его (ниже)
if(params[0] == AdminDuty[]) // Здесь и сел, ибо как мне кажется подобное нельзя провернуть (я про выбор нужного пароля AdminDuty из тех, что мы прописываем в /duty [пароль] (но это не точно)).
{
gAdminLogged[playerid] = true; // Админ авторизация
//Оповещение об авторизации администратора в админ чат
}
return 1;
}
Вторая версия.
Пробовал использовать stock'и (здесь я static const и new AdminDuty в глобальных new временно закомментировал).
Ко всем командам:
PHP код:
CMD:duty(playerid, params[])
{
if(gLogAcc[playerid] == false) return 1;
if(PlayerInfo[playerid][pAdmin] < 1) return 1;
if(sscanf(params, "d", params[0])) return 1;
AdminDuty(playerid);
return 1;
}
К stock'ам:
PHP код:
stock AdminDuty(playerid)
{
Send(playerid, C_WHITE, "Вы ввели команду"); // намеренно добавил это чтобы проверить, а работает ли вообще такая версия. В итоге текст мне выводило, но ни авторизации, ни оповещения в админ чат не было (проверял со второго аккаунта с админой).
new adminpass[6][7]= // Фактически вырезал из слитого мода Arizona RP (Не реклама), но там лажа в том, что подобная функция (ниже)
// if(!GetString(adminpass[Pass_num][PlayerInfo[playerid][pAdmin]], inputtextsave)) return 1;
// просто не работала. Что-то там про "GetString" на Wiki пишут, типа не рабочая больше, а как сделать иначе - не догнал.
{
{3117896, 3937140, 9945800, 5464133, 9856641, 9286298, 1269818},
{3117896, 3937140, 9945800, 5464133, 9856641, 9286298, 1269818},
{3117896, 3937140, 9945800, 5464133, 9856641, 9286298, 1269818},
{3117896, 3937140, 9945800, 5464133, 9856641, 9286298, 1269818},
{3117896, 3937140, 9945800, 5464133, 9856641, 9286298, 1269818},
{3117896, 3937140, 9945800, 5464133, 9856641, 9286298, 1269818}
};
if(inputtext == PlayerInfo[playerid][pDostup])
{
gAdminLogged[playerid] = true;
//Оповещение об авторизации администратора в админ чат
}
return 1;
}
Пробовал брать старую версию /alogin'a в моде, но там беда в том, что в самой команде через ShowPlayerDialog идёт обращение к case в OnDialogResponse. Так как я не использую ShowPlayerDialog, то мне и делать нечего в этом case'е.
Также пытался найти хоть какую-либо подобную систему (всегда так делаю, когда не знаю как самому написать), затем разобрать её, понять смысл работы и сделать своё, самому. Однако, увы, как я понял, всех всегда устраивала обычная авторизация схожая с авторизацией на SAMP RP (не реклама) через ShowPlayerDialog и case в OnDialogResponse или же другая версия, когда админ.авторизация проходит автоматически при вводе пароля от аккаунта (как на ARP, к примеру != Реклама).
Однако я всё же нашёл пару подобных моментов, прикладываю:
http://pawno-info.ru/showthread.php?t=257148&attempt=1 // здесь в комментариях люди отписывались, что нужно юзать switch, а не создавать по 20 команд /duty. Однако как реализовать это я не знаю.
http://pro-pawn.ru/showthread.php?12...BE%D0%BB%D1%8C // а вот здесь я брал за идею первую версию, но через данный способ можно сделать /duty лишь на один пароль, на один уровень админки. Я проверял, работает, но это не то, чего я добиваюсь.
Знаю, что сейчас могут вылезти особые личности кричащие мне "Мы должны за тебя всё сделать?" и т.д.
Однако поймите одно, что необязательно писать мне готовую команду. Мне нужна лишь та самая часть, отвечающая за проверку введенного пароля и авторизацию на нужный уровень через него или хотя бы просто порассуждать тут как я могу сам решить эту проблему с Вашей помощью.