Для начала, мы сделаем небольшую регистрацию, чтобы все наше дело сохранялось:
Добавляем ко всем инклудам:
#include <mxINI>
Если у кого то его нет, качать тут (сорри за депосит)
Затем создадим парочку дефайнов, для урощения работы:
#define registerdialog 1 #define logindialog 2 #define dcmd(%1,%2,%3) if (!strcmp((%3)[1], #%1, true, (%2)) && ((((%3)[(%2) + 1] == '\0') && (dcmd_%1(playerid, ""))) || (((%3)[(%2) + 1] == ' ') && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1
Теперь создаем массив для хранения данных игрока. У нас это деньги, очки, уровень админки и вип игрок или нет.
enum pInfo { pMoney, pScore, pAdmin, pVip };
И под массивом глоб. переменную:
new Player[MAX_PLAYERS][pInfo];
Так, далее мы обозначим диалоговые окна в public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]):
if(dialogid == registerdialog) { if(!strlen(inputtext)) return ShowPlayerDialog(playerid, registerdialog, DIALOG_STYLE_INPUT, "Регистрация", "Вы должны зарегистрироваться! \nВведите ваш пароль:", "Ок", ""); if(response) { new PlayerName[MAX_PLAYER_NAME]; GetPlayerName(playerid,PlayerName,sizeof(PlayerName)); new account[128]; format(account,sizeof(account),"users/%s.ini",PlayerName); if(fexist(account)) return ShowPlayerDialog(playerid,logindialog,DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "LOGIN", ""); new iniFile = ini_createFile(account); if(iniFile < 0) ini_openFile (account); { ini_setString(iniFile,"Пароль",inputtext); ini_setInteger(iniFile, "Money", 500000); ini_setInteger(iniFile, "Admin", 0); ini_setInteger(iniFile, "Vip", 0); ini_setInteger(iniFile, "Score", 0); ini_closeFile(iniFile); SetPVarInt(playerid, "Logged", 0); ShowPlayerDialog(playerid,logindialog,DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "LOGIN", ""); } } else { ShowPlayerDialog(playerid, registerdialog, DIALOG_STYLE_INPUT, "Регистрация", "Вы должны зарегистрироваться! \nВведите ваш пароль:", "Ок", ""); } } if(dialogid == logindialog) { if(!strlen(inputtext)) return ShowPlayerDialog(playerid,logindialog,DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "LOGIN", ""); if(response) { new PlayerName[MAX_PLAYER_NAME], password[64]; GetPlayerName(playerid,PlayerName,sizeof(PlayerName)); new account[128]; format(account,sizeof(account),"users/%s.ini",PlayerName); if(IsPlayerNPC(playerid))return 1; new iniFile = ini_openFile(account); ini_getString(iniFile, "Пароль",password); if(!strcmp(inputtext, password, true)) { ini_getInteger(iniFile, "Money", Player[playerid][pMoney]); GivePlayerMoney(playerid, Player[playerid][pMoney]); ini_getInteger(iniFile, "Score", Player[playerid][pScore]); SetPlayerScore(playerid, Player[playerid][pScore]); ini_getInteger(iniFile, "Admin", Player[playerid][pAdmin]); ini_getInteger(iniFile, "Vip", Player[playerid][pVip]); ini_closeFile(iniFile); OnPlayerSpawn(playerid); return 1; } else { SendClientMessage(playerid, COLOR_SYSTEM, "Cервер: Неверный пароль! Повторите попытку!"); ShowPlayerDialog(playerid, logindialog, DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "Ок", ""); return 1; } } else { ShowPlayerDialog(playerid, logindialog, DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "Ок", ""); } }
Затем, мы делаем так, чтобы при подключении зарегестрированного игрока вышел диалог логина. И наоборот:
В public OnPlayerConnect(playerid)
new PlayerName[MAX_PLAYER_NAME]; GetPlayerName(playerid,PlayerName,sizeof(PlayerName)); new account[128]; format(account,sizeof(account),"users/%s.ini",PlayerName); if(!fexist(account)) { ShowPlayerDialog(playerid,registerdialog,DIALOG_STYLE_INPUT, "Регистрация", "Вы должны зарегистрироваться! \nВведите ваш пароль:", "REGISTER", ""); //...Показываем игроку диалог реги } else { ShowPlayerDialog(playerid,logindialog,DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "LOGIN", ""); //если он есть, то авторизуем его }
И парочку очерков, для сохранения аккаунта после дисконекта, и сток для сохранения в самой игре:
В public OnPlayerDisconnect(playerid, reason)
SaveAccount(playerid);
В конец вставляем это:
public SaveAccounts() { for(new f; f < GetMaxPlayers(); f++) { if(!IsPlayerConnected(f))continue; SaveAccount(f); } } stock SaveAccount(playerid) { new PlayerName[MAX_PLAYER_NAME], account[128]; GetPlayerName(playerid,PlayerName,sizeof(PlayerName)); format(account,sizeof(account), "users/%s.ini", PlayerName); new iniFile = ini_openFile(account); ini_setInteger(iniFile, "Money", GetPlayerMoney(playerid)); ini_setInteger(iniFile, "Score", GetPlayerScore(playerid)); ini_setInteger(iniFile,"Admin",Player[playerid][pAdmin]); ini_setInteger(iniFile,"Vip",Player[playerid][pVip]); ini_closeFile(iniFile); return 1; }
Последний штрих:
В public OnPlayerDeath(playerid, killerid, reason)
if(killerid != INVALID_PLAYER_ID) SetPlayerScore(killerid, GetPlayerScore(killerid) + 1); GivePlayerMoney(killerid, 3000); GivePlayerMoney(playerid, -500);
Этим, мы даем убийце 1 очко и 3000р а убитому отнимаем 500р.
____________________________________________________________________________________________________________________
Приступаем к созданию самой админки и випки:
Рассуждая логически наши массивы для А и В это pVip и pAdmin. Значит, если у игрока Вип =1, значит он является вип игроком.(Кэп) С админкой так же, но можно сделать подразделы на 1,2,3,4 уровень. Начнем:
Сделаем простую команду для админа и для випа:
p.s не удивляйтесь виду команды, это dcmd. Подробнее о ней узнайте Тут.
В любое место:
dcmd_weap(playerid,params[]) { new pleer,weap; pleer = strval(params[0]); weap = strval(params[1]); if(IsPlayerConnected(pleer)) { if(Player[playerid][pAdmin] >= 1) { GivePlayerWeapon(pleer,weap,9999999); } } return 1; }
В public OnPlayerCommandText(playerid, cmdtext[])
dcmd(weap,4,cmdtext);
Строка if(Player[playerid][pAdmin] >= 1) и есть проверка на нашу админку. Поясняю: >= 1 это с какого уровня доступна команда. Значит, оружка доступен нам с первого уровня админки. А если же команда выглядит так:
dcmd_weap(playerid,params[]) { new pleer,weap; pleer = strval(params[0]); weap = strval(params[1]); if(IsPlayerConnected(pleer)) { if(Player[playerid][pAdmin] == 1) { GivePlayerWeapon(pleer,weap,9999999); } } return 1; }
То это значит, что она доступна ТОЛЬКО! 1 уровню администратора.
Операторы:
== логическое равно(ТОЛЬКО) >= Больше либо равно <=Меньше либо равно != Не равно > Больше < Меньше
Это был пример команды для админа. Чтобы дать игроку админку, нужно войти в папку scriptfiles затем в папку users открыть аккаунт игрока, и в графе Admin поставить число(уровень админки).
Дальше мы сделаем команду, по которой мы можем посмотреть онлайн администратором и их уровень:
dcmd_admins(playerid,params[]) { #pragma unused params new sendername[MAX_PLAYER_NAME], string[128]; if(IsPlayerConnected(playerid)) {SendClientMessage(playerid, COLOR_YELLOW, "ServeR | Администрация онлайн:"); for(new i = 0; i < MAX_PLAYERS; i++) {if(IsPlayerConnected(i)){ if(Player[i][pAdmin] >= 1){ GetPlayerName(i, sendername, sizeof(sendername)); format(string, 256, "* Администратор %s | Уровень %d", sendername, Player[i][pAdmin]); SendClientMessage(playerid, 0xFFFF00AA, string);}}}} return 1;}
Вот. Теперь после команды /admins нам покажут админов онлайн.
Теперь сделаем команду для випов.
Принцип тот же, но вместо
if(Player[playerid][pAdmin] == 1)
Мы делаем
if(Player[playerid][pVip] == 1)
И делаем команду:
dcmd_skin(playerid,params[]) { new skin; skin = strval(params[0]); if(IsPlayerConnected(playerid)) { if(Player[playerid][pVip] == 1) { SetPlayerSkin(playerid,skin); } } return 1; }
Это всовывали в любое место мода, а это в public OnPlayerCommandText(playerid, cmdtext[])
dcmd(skin,4,cmdtext);
Чтобы дать игроку випку, нужно войти в папку scriptfiles затем в папку users открыть аккаунт игрока, и в графе Vip поставить число 1 дать випку и 0 забрать.
И по традиции:
dcmd_vips(playerid,params[]) { #pragma unused params new sendername[MAX_PLAYER_NAME], string[128]; if(IsPlayerConnected(playerid)) {SendClientMessage(playerid, COLOR_YELLOW, "ServeR | VIP онлайн:"); for(new i = 0; i < MAX_PLAYERS; i++) {if(IsPlayerConnected(i)){ if(Player[i][pVip] == 1){ GetPlayerName(i, sendername, sizeof(sendername)); format(string, 256, "* Vip %s", sendername); SendClientMessage(playerid, 0xFFFF00AA, string);}}}} return 1;}
Вот и все. Теперь можете делать команды на дкмд по уроку
The End
Автор материала: Jord
Сообщение отредактировал Jord: 14 февраля 2012 - 00:28