Для начала, мы сделаем небольшую регистрацию, чтобы все наше дело сохранялось:
Добавляем ко всем инклудам:
#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
Вход
Регистрация
Помощь















