Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!: Учимся делать админку и випку. - Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!

Перейти к содержимому

  • (3 Страниц) +
  • 1
  • 2
  • 3
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Урок ]
Учимся делать админку и випку.
Оценка: ***** 1 Голосов

#1
Пользователь офлайн   Rock & Roll 

  • ДИПЛОМИРОВАННЫЙ ИНЖЕНЕР
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Итак, один из пользователей форума попросил меня научить делать Админку и випку. Вот мой урок:

Для начала, мы сделаем небольшую регистрацию, чтобы все наше дело сохранялось:

Добавляем ко всем инклудам:
#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

17

Сказали спасибо 9:

#2
Пользователь офлайн   Erick 

  • Эксперт
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Братиш, спасибо дал :rolleyes:
0

#3
Пользователь офлайн   Cris_Pro 

  • Хочу создать серверок..
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
норм лови +
2

#4
Пользователь офлайн   Mike 

  • Администратор
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
неплохо, а автор кто?
0

#5
Пользователь офлайн   Rock & Roll 

  • ДИПЛОМИРОВАННЫЙ ИНЖЕНЕР
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Все писал я
1

#6
Пользователь офлайн   Nice_Exclusive 

  • Прохожий
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
От души) Лови +!
0

#7
Пользователь офлайн   TikTak 

  • Прохожий
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Спс, помог!
0

#8
Пользователь офлайн   Art_Krivitskiy 

  • Прохожий
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
А как сделать не dcmd комманды, а обычные?
0

#9
Пользователь офлайн   Ford 

  • Banned
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Норм сделал)

#10
Пользователь офлайн   Rock & Roll 

  • ДИПЛОМИРОВАННЫЙ ИНЖЕНЕР
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Обычные через strtock, но они дольше и длиннее
0

Поделиться темой:


  • (3 Страниц) +
  • 1
  • 2
  • 3
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей