PDA

Просмотр полной версии : [Вопрос] Система админки.



Vincent_Alonso
02.06.2014, 19:26
Здраствуйте.Пишу я мод с нуля,написал систему администрации,в базе данных поставил себе лвл 10,захожу ничего,я не админ.
Я решил другим способом,прописать админ систему на ники,и я зашел,мой ник дал себе админку,
В Базе Данных я проверил поставил значение 10,а в игре прописал себе 0 лвл админки,захожу обновляю,и оно стало на 0.
И так пару раз проверял.
А когда назначаю там типо на 10... лвл или иначе..оно не записывает в таблицу число 10.
А когда на 0 прописываю,ставит число на 0.
И скажите ещё,я в мускуле на шарю так,как сделать на мускуле,чтобы в базе данных я прописал админку 10 уровня,и я был им,в максини я такое легко делаю,но на мускуле нет.

помогите.

Вот код.


CMD:makeadmin(playerid, params[])
{
new PlayerName[MAX_PLAYER_NAME],adminlvl,pleer,adminname[128],string[128],string2[128];
GetPlayerName(pleer,PlayerName,sizeof(PlayerName));
GetPlayerName(playerid,adminname,sizeof(adminname));
if(sscanf(params,"ud",pleer,adminlvl)) return SendClientMessage(playerid,COLOR_GRAD2,"**Используйте: /makeadmin [id] [уровень] **");
new redname[MAX_PLAYER_NAME];
GetPlayerName(playerid, redname, sizeof(redname));
if(!strcmp(redname, "Fernando_Capraso", true) || PlayerInfo[playerid][pAdmin] == 10)
{
if(adminlvl == 0)
{
new query[186];
PlayerInfo[playerid][pAdmin] = adminlvl;
format(string,sizeof(string),"Администратор %s снял с вас должность администратора",adminname);
format(string2,sizeof(string2),"Вы сняли с %s должность администратора",PlayerName);
SendClientMessage(playerid,COLOR_LIGHTBLUE,string);
SendClientMessage(playerid,COLOR_LIGHTBLUE,string2);
format(query,sizeof(query),"UPDATE `accounts` SET `Admin` = '0'",adminlvl);
mysql_query(query);
}
if(adminlvl >= 1 && adminlvl <= 10)
{
new query[386];
format(string,sizeof(string),"Администратор %s назначил Вас администртором %d уровня",adminname,adminlvl);
format(string2,sizeof(string2),"Вы назначили %s администратором %d уровня",PlayerName,adminlvl);
SendClientMessage(playerid,COLOR_LIGHTBLUE,string);
SendClientMessage(playerid,COLOR_LIGHTBLUE,string2);
format(query,sizeof(query),"SELECT * FROM `accounts` SET `Admin` = '%d'",adminlvl);
mysql_query(query);
}
if(adminlvl >10)
{
SendClientMessage(playerid,COLOR_GRAD2,"Максимальный уровень админки 10!"); // Можно и удалить,неважно.
}
}
return 1;
}

DeimoS
02.06.2014, 20:57
Очень много ошибок...
1) Нет проверки на онлайн. Могут случится проблемы, если некоторые функции вызывать для несуществующих игроков
2) Запрос... Такого запроса в природе не существует. Изучите повторно документацию к MySQL. Там не так уж и много видов запросов.
3) Зачем вы сразу делаете запись в БД, если при выходе всё равно уровень админки сохраняется?
4) Куча лишнего. Код нелогичен. Ужс, одним словом.
Вот. Не проверял:

CMD:makeadmin(playerid, params[])
{
if(sscanf(params, "ud", params[0], params[1])) return SendClientMessage(playerid, COLOR_GRAD2, "**Используйте: /makeadmin [id] [уровень] **");
if(!IsPlayerConnected(strval(params[0]))) return SendClientMessage(playerid, COLOR_GRAD2, "**Игрок не найден");
new PlayerName[MAX_PLAYER_NAME], string[54+MAX_PLAYER_NAME+3];
GetPlayerName(playerid, string, MAX_PLAYER_NAME);
GetPlayerName(strval(params[0]), PlayerName, MAX_PLAYER_NAME);
if(strcmp(PlayerName, "Fernando_Capraso", true) && PlayerInfo[playerid][pAdmin] != 10) return SendClientMessage(playerid, COLOR_GRAD2, "**Нет доступа");
switch(strval(params[1]))
{
case 0:
{
format(string,sizeof(string),"Администратор %s снял с вас должность администратора",string);
SendClientMessage(strval(params[0]), COLOR_LIGHTBLUE, string);
format(string,sizeof(string),"Вы сняли с %s должность администратора",PlayerName);
SendClientMessage(playerid,COLOR_LIGHTBLUE,string);
}
case 1..10:
{
format(string,sizeof(string),"Администратор %s назначил Вас администртором %d уровня", string, strval(params[1]));
SendClientMessage(strval(params[0]),COLOR_LIGHTBLUE,string);
format(string,sizeof(string),"Вы назначили %s администратором %d уровня", PlayerName, strval(params[1]));
SendClientMessage(playerid,COLOR_LIGHTBLUE,string);
}
default: return SendClientMessage(playerid,COLOR_GRAD2,"Максимальный уровень админки 10!");
}
PlayerInfo[playerid][pAdmin] = strval(params[1]);
return 1;
}

Vincent_Alonso
02.06.2014, 23:23
Скажите,что делать,чтобы в базе данных админ был привязан к игре,а из игры в базу данных.

DeimoS
03.06.2014, 00:28
Скажите,что делать,чтобы в базе данных админ был привязан к игре,а из игры в базу данных.
Эмм, то есть?
При входе грузите данные из таблицы (в том числе и уровень админки), а при выходе сохраняйте

Vincent_Alonso
03.06.2014, 00:46
Можете ли вы дать мне свой скайп ?

- - - Добавлено - - -

Либо добавить меня romkas3ua

- - - Добавлено - - -

Обычно в меня LoadAccount записано вот так format(query, sizeof(query), "SELECT * FROM `accounts` WHERE `Password` = '%s' AND `ID` = '%i'", sqlpass, playerVariable[playerid][aID]);

Когда добавляю после AND ещё одну данную,либо просто через запятую,оно при входе и вводе пароля пишет что неверный пароль.Вот так.

- - - Добавлено - - -

Добавьте меня в скайп romkas3ua

DeimoS
03.06.2014, 06:31
Скайп есть в моём профиле на форуме.
Что вы хотите добавить и зачем? По имени и паролю вы 100% отыщите нужный аккаунт. Не будет же у вас на сервере двух игроков с одинаковым именем и паролем.

Vincent_Alonso
03.06.2014, 20:46
Так я так и непонел,как сделать так чтобы я в базе данных мог прописать себе админку ? ато прописываю и нефига!

DeimoS
04.06.2014, 07:47
Так я так и непонел,как сделать так чтобы я в базе данных мог прописать себе админку ? ато прописываю и нефига!
Эмм, как и в случае с файлами, нужно перезаходить на сервер. При том, если вы уже на сервере, нужно сначала выйти, потом выдать себе админку и только потом зайти

Vincent_Alonso
04.06.2014, 14:46
Можно ли сделать так,чтобы вы посмотрели на мой мод,может там что-то не так ?

DeimoS
04.06.2014, 19:17
Можно ли сделать так,чтобы вы посмотрели на мой мод,может там что-то не так ?

Для начала попытайтесь определиться с тем, что там не так. А потом уже посмотрим

Vincent_Alonso
04.06.2014, 22:21
Незнаю,пока,я добавил в enum pInfo pAdmin,и в INSERT INTO столбцы,незнаю что ещё надо.

Nazarik
05.06.2014, 00:00
Незнаю,пока,я добавил в enum pInfo pAdmin,и в INSERT INTO столбцы,незнаю что ещё надо.

Мозги например...

DeimoS
05.06.2014, 10:40
Незнаю,пока,я добавил в enum pInfo pAdmin,и в INSERT INTO столбцы,незнаю что ещё надо.

Эмм, ну пишите функции, в которых используйте проверку на значение переменной. Чем я то вам помогу? За вас напишу?

Vincent_Alonso
05.06.2014, 15:03
Я просто всё уже пробывал,админка не прописывается.Обьясните что мне надо сделать.

underwoker
05.06.2014, 20:33
Я просто всё уже пробывал,админка не прописывается.Обьясните что мне надо сделать.
Объяснили постами выше, если до вас не дошли те объяснения. То уже не дойдет, ищите тех кто сможет вам это сделать готовым.

Vincent_Alonso
06.06.2014, 01:52
Не увидел.

DeimoS
06.06.2014, 06:18
Эмм, если вы прописываете админку через БД, вы должны в этот момент находиться ВНЕ сервера или же вообще сервер должен быть выключен. И если всё равно не срабатывает - покажите код сохранения/загрузки аккаунта.

Vincent_Alonso
06.06.2014, 20:42
Загрузка:


stock LoadAccount(playerid, password[]) {
new
query[128],
sqlpass[32],
result[5+24+64],
dialog[128];
// accounts[136];
mysql_real_escape_string(password, sqlpass);
format(query, sizeof(query), "SELECT * FROM `accounts` WHERE `Password` = '%s' AND `ID` = '%i'", sqlpass, playerVariable[playerid][aID]);
mysql_query(query);
mysql_store_result();
if(mysql_num_rows() == 1) {
mysql_fetch_row_format(result, "|");
sscanf(result, "p<|>is[24]s[32]",
playerVariable[playerid][aID],
PlayerInfo[playerid][pEmail],
PlayerInfo[playerid][pAdmin],
playerVariable[playerid][aName],
playerVariable[playerid][aPassword]);
playerVariable[playerid][aLogged] = true;
mysql_free_result();
return 1;
}
else {
if(playerVariable[playerid][aWrongPassword] == 4) {
SendClientMessage(playerid, COLOR_LIGHTRED, "Вы 3 раза ввели неверный пароль и были отключены от сервера.");
Kick(playerid);
return 1;
}
format(dialog, sizeof(dialog),
"Вы ввели неверный пароль.\n\
У Вас осталось %i/3 попыток ввода.", 3 - playerVariable[playerid][aWrongPassword]);
ShowPlayerDialog(playerid, DIALOG_WRONGPAS, DIALOG_STYLE_MSGBOX, "Ошибка.", dialog, "Повтор", "Отмена");
}
return 1;
}

Сохранения:


stock SaveAccount(playerid) {
if(playerVariable[playerid][aLogged] == true) {
CheckMySQLConnection();
new
query[186],
sqlname[MAX_PLAYER_NAME],
sqlpass[64];
mysql_real_escape_string(playerVariable[playerid][aName], sqlname);
mysql_real_escape_string(playerVariable[playerid][aPassword], sqlpass);
format(query, sizeof(query), "UPDATE `Accounts` SET `Nickname` = '%s', AND `Password` = '%s' WHERE `ID` = '%i'",
sqlname,
sqlpass,
playerVariable[playerid][aID],
PlayerInfo[playerid][pEmail],
PlayerInfo[playerid][pAdmin],
PlayerInfo[playerid][pLeader],
PlayerInfo[playerid][pMember],
PlayerInfo[playerid][pRank],
PlayerInfo[playerid][pSkin]);
mysql_query(query);
}
return 1;
}

- - - Добавлено - - -

Ну как-бы я розобрался уже,при назначении админки всё записывается в таблицу,вот только,всёравно с пропиской в бд проблемы,точнее админку может даже давать простой игрок,я незнаю что теперь делать. Вроде вот этот код у меня правильный :


if(PlayerInfo[playerid][pAdmin] < 6)

Вроде так в игре прописываю,данные сохраняются в таблицу,но из таблицы,мне нужно баг убрать что игрок обычный может дать себе админку.
Ну вот так выгледит:

Захожу с админкой на сервер,прописываю себе 0 для теста,прописываю ещё раз,пишет Нет Доступа!(всё ок) А вот перезахожу,и УЖе можно дать(есть доступ)(плохо)

DeimoS
07.06.2014, 07:03
Эмм, вы на запрос в сохранении посмотрите -_- А потом откройте любой мод на MySQL и посмотрите как сделано там. Желательно, несколько разных модов посмотреть

Vincent_Alonso
07.06.2014, 12:06
У меня проблема новая,когда захожу на сервер зарегаюсь пишу админку себе пишет недоступно потмоучто я админ 0 лвл,а перезайду даже не прописывать пишет что можно!