СКРИПТЫ ОТКЛЮЧЕНЫ

Дальнейшая работа данной страницы будет остановлена

[урок] Создание мода с нуля - урок №2

Глубокое изучение Pawn
Аватара пользователя
danilasar
Сообщения: 244
Зарегистрирован: 11 июл 2016, 17:13

[урок] Создание мода с нуля - урок №2

Сообщение danilasar » 23 июл 2016, 15:34

Доброго времени суток! В серии уроков "Создание мода с нуля" я расскажу вам о том, как создать мод с нуля.
Обратите внимание!
Если вы не читали мой первый урок - обязательно прочтите!

В прошлом уроке мы создали мод и работали над скинами и спавном пользователей. В этом уроке я более подробно расскажу о пользователях.
Вход и регистрация
Пользователи будут на mxINI. Качаем инклуд mxINI.
В нашем моде находим:

Код: Выделить всё

#include <a_samp>
После этого пишем:

Код: Выделить всё

#include <mxINI>   forward OnPlayerRegister(playerid, password[]); forward OnPlayerLogin(playerid,password[]); enum pInfo {     pPass[64],     pAdmin, }; new Player[MAX_PLAYERS][pInfo]; new PAccount[MAX_PLAYERS];
Далее в public OnPlayerConnect:

Код: Выделить всё

new playername[MAX_PLAYER_NAME];// Массив для имени игрока new string[128];// Путь до папки с именем игрока GetPlayerName(playerid,playername,sizeof(playername));// Узнаём имя игрока format(string,sizeof(string),"users/%s.ini", playername);// Путь к файлу с аккаунтом if(fexist(string))// Проверка на файл, если он есть то выполняется следующее действие. {     PAccount[playerid] = 1;// Аккаунт есть } else// Если файла с именем нет, то выполняется это действие. {     PAccount[playerid] = 0;// Аккаунта нет } if(PAccount[playerid] == 1) // аккаунт есть {     ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// показываем диалог } else // если нет аккаунта в папке {     ShowPlayerDialog(playerid,3,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// Показываем диалог регистрации. }
В public OnPlayerDisconnect:

Код: Выделить всё

SavePlayer(playerid);
В public OnDialogResponse:

Код: Выделить всё

if(dialogid == 2)// Ид диалога Для Логина {     if(response)// Если игрок нажал первую кнопку входа     {         if(!strlen(inputtext))// Если окно ввода пустое, выводим диалог снова         {             ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// показываем диалог             return 1;         }         new pass[64];// Массив с паролем         strmid(pass,inputtext,0,strlen(inputtext),64);// считывание текста с диалога         OnPlayerLogin(playerid,pass);// Паблик входа     }     else// Если игрок нажал Escape,то покажем ему диалог     {         ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// показываем диалог     } } if(dialogid == 3)// Ид диалога для регистрации {     if(response)// Если игрок нажал первую кнопку     {         if(!strlen(inputtext))// Если игрок не написал ничего,то выводим диалог снова         {             ShowPlayerDialog(playerid,3,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// Показываем диалог регистрации             return 1;         }         new pass[64];// Массив с паролем         strmid(pass,inputtext,0,strlen(inputtext),64);// Считываем текст с диалога         OnPlayerRegister(playerid,pass);// Запускаем паблик регистрации     }     else// Если игрок нажал Escape     {         ShowPlayerDialog(playerid,3,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// Показываем диалог регистрации     } }
В конец мода:

Код: Выделить всё

public OnPlayerRegister(playerid, password[])// Паблик регистрации {     if(IsPlayerConnected(playerid))     {         new string[64];// Массив с путём для файла         new playername[MAX_PLAYER_NAME];// Массив для получения имени игрока         GetPlayerName(playerid, playername, sizeof(playername));// Получаем Имя игрока         format(string,sizeof(string), "users/%s.ini", playername);// Добавляем имя игрока, в путь для сохранения         new iniFile = ini_createFile(string);// Создаём файл с именем игрока в папке players         if(iniFile < 0)// Если Файла нет         {             iniFile = ini_openFile(string);// Открываем         }         if(iniFile >= 0)// Если файл есть         {             strmid(Player[playerid][pPass],password,0,strlen(password),255);// Присваиваем массиву pPass, значение password[]             ini_setString(iniFile,"Pass",Player[playerid][pPass]);// Записываем пароль игрока в файл             ini_setInteger(iniFile, "Admin", 0); // Это не Администратор             ini_closeFile(iniFile);// Закрываем файл             ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// показываем диалог         }     }     return 1; } stock SavePlayer(playerid) {     new string[64];// Массив с путём для файла     new playername[MAX_PLAYER_NAME];// Массив для получения имени игрока     GetPlayerName(playerid, playername, sizeof(playername));// Получаем Имя игрока     format(string, sizeof(string), "users/%s.ini", playername);// Добавляем имя игрока, в путь для сохранения     new iniFile = ini_openFile(string);// Открываем файл по тому пути который указали.     ini_setString(iniFile,"Pass",Player[playerid][pPass]);// Записываем пароль игрока в файл     ini_setInteger(iniFile, "Admin",Player[playerid][pAdmin]); // Сохраняем админ/не админ     ini_closeFile(iniFile);// Закрываем файл } public OnPlayerLogin(playerid,password[]) {     if(IsPlayerConnected(playerid))// Проверка на подключение игрока     {         new string[64];// Массив с путём для файла         new pass[64];// Массив с паролем         new playername[MAX_PLAYER_NAME];// Массив для получения имени игрока         GetPlayerName(playerid, playername, sizeof(playername));// Получаем Имя игрока         format(string,sizeof(string), "users/%s.ini", playername);// Добавляем имя игрока, в путь для загрузки         new iniFile = ini_openFile(string);// Открываем файл         ini_getString(iniFile,"Pass",pass,64);// Загружаем пароль         if(strcmp(pass,password,true) == 0)// Если введённый пароль, соответствует паролю при регистрации, то загружаем акк         {             ini_getString(iniFile,"Pass",Player[playerid][pPass],64);// Загружаем пароль             ini_getInteger(iniFile, "Admin", Player[playerid][pAdmin]); // Проверяем на Администратора             ini_closeFile(iniFile);// Закрываем файл         }         else// Если пароль не верен..         {             ini_closeFile(iniFile);// Закрываем файл             ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// показываем диалог             return 1;         }         SendClientMessage(playerid,green,"Добро пожаловать на наш сервер");// Выводим игроку сообщение     }     return 1; }
Это сохранит админку и пароль. Если хорошо подумать, надо сделать сохранение денег, score, киллов, оружия и т.п.
В enum pInfo:

Код: Выделить всё

pKills, pCash, pScore,
В public OnPlayerRegister (после строки ini_setInteger(iniFile, "Admin", 0); // Это не админитсратор):

Код: Выделить всё

            ini_setInteger(iniFile, "Score", 0);             ini_setInteger(iniFile, "Kills", 0);             ini_setInteger(iniFile, "Cash", 500);
В stock SavePlayer (после строки ini_setInteger(iniFile, "Admin", Player[playerid][pAdmin]); // Сохраняем админку):
В public OnPlayerLogin (после строки ini_setInteger(iniFile, "Admin", Player[playerid][pAdmin]); // Провераяем на Администратора):

Код: Выделить всё

ini_getInteger(iniFile,"Score",Player[playerid][pScore]); ini_getInteger(iniFile,"Kills",Player[playerid][pKills]); ini_getInteger(iniFile, "Cash",Player[playerid][pCash]);
Ну вот, теперь у нас есть пользователи. Теперь приступим к Админ-Центру.
P.S. Для создания этой части урока пользовался мануалом с другого форума.
Администраторский раздел
Теперь нам нужен администраторский раздел. Сделаем его через TAB. В начало мода:

Код: Выделить всё

#define SPEC_TYPE_NONE 0
В enum pInfo:

Код: Выделить всё

Muted, Jailed, SpecID[MAX_PLAYERS], SpecType[MAX_PLAYERS], Freeze, Zhertva, Spawned,
В public OnPlayerCommandText:

Код: Выделить всё

if(strcmp(cmdtext,"/spec-off",true) == 0) {     TogglePlayerSpectating(playerid, 0);     Player[playerid][SpecID] = INVALID_PLAYER_ID;     Player[playerid][SpecType] = SPEC_TYPE_NONE;     SendClientMessage(playerid,0x33AAFFAA,"Слежка отключена");     return 1; }
В public OnPlayerClickPlayer:

Код: Выделить всё

if(Player[playerid][pAdmin] == 1) {     ShowPlayerDialog(playerid,1,DIALOG_STYLE_LIST,"Администраторский раздел","Пнуть\nУбить\nВзорвать\nЗаткнуть\nKикнуть\nЗабанить\nТП к игроку\nТП игрока к себе\nПосадить\nСледить\nЗамарозить\n","Применить","Отмена");     Player[playerid][Zhertva] = clickedplayerid; }
В public OnDialogResponse:

Код: Выделить всё

if(dialogid == 4) {     if(response)     {         new zherid = Player[playerid][Zhertva];         new Float:X,Float:Y,Float:Z,pname[40],gname[40],string[256];         GetPlayerName(playerid,pname,sizeof(pname));         GetPlayerName(zherid,gname,sizeof(gname));         if(listitem == 0)         {             if(!IsPlayerSpawned(zherid))             {                 SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");                 return 1;             }             GetPlayerPos(zherid,X,Y,Z);             SetPlayerPos(zherid,X,Y,Z+10);             format(string,sizeof(string),"Aдминистратор %s пнул игрока %s",pname,playerid,gname,zherid);             SendClientMessageToAll(0x099DE0F6,string);         }         if(listitem == 1)         {             if(!IsPlayerSpawned(zherid))             {                 SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");                 return 1;             }             SetPlayerHealth(zherid,0.0);             format(string,sizeof(string),"Aдминистратор %s убил игрока %s",pname,playerid,gname,zherid);             SendClientMessageToAll(0x099DE0F6,string);         }         if(listitem == 2)         {             if(!IsPlayerSpawned(zherid))             {                 SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");                 return 1;             }             GetPlayerPos(zherid,X,Y,Z);             CreateExplosion(X,Y,Z,10,0);             CreateExplosion(X,Y,Z,10,0);             CreateExplosion(X,Y,Z,10,0);             format(string,sizeof(string),"Aдминистратор %s убил игрока %s",pname,playerid,gname,zherid);             SendClientMessageToAll(0x099DE0F6,string);         }         if(listitem == 3)         {             if(Player[zherid][Muted] == 0)             {                 Player[zherid][Muted] = 1;                 format(string,sizeof(string),"Aдминистратор %s заткнул игрока %s",pname,gname);                 SendClientMessageToAll(0x099DE0F6,string);             }             else             {                 Player[zherid][Muted] = 0;                 format(string,sizeof(string),"Aдминистратор %s разрешил писать в чат игроку %s",pname,gname);                 SendClientMessageToAll(0x099DE0F6,string);             }         }         if(listitem == 4)         {             format(string,sizeof(string),"Aдминистратор %s кинул игрока %s",pname,gname);             SendClientMessageToAll(0x099DE0F6,string);             Kick(zherid);         }         if(listitem == 5)         {             format(string,sizeof(string),"Aдминистратор %s забанил игрока %s",pname,gname);             SendClientMessageToAll(0x099DE0F6,string);             Ban(zherid);         }         if(listitem == 6)         {             if(playerid != zherid)             {                 if(!IsPlayerSpawned(zherid))                 {                     SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");                     return 1;                 }                 GetPlayerPos(zherid,X,Y,Z);                 if(IsPlayerInAnyVehicle(playerid))                 {                     SetVehiclePos(GetPlayerVehicleID(playerid),X+1,Y,Z);                 }                 else                 {                     SetPlayerPos(playerid,X+1,Y,Z);                 }                 SetPlayerInterior(playerid,GetPlayerInterior(zherid));                 format(string,sizeof(string),"Вы телепортировались к игроку %s",gname);                 SendClientMessage(playerid,0x099DE0F6,string);                 format(string,sizeof(string),"Aдминистратор %s куда-то телепортировался... (к вам)",pname);                 SendClientMessage(zherid,0x099DE0F6,string);             }             else             {                 SendClientMessage(playerid,0xB30400EF,"Вы телепортировали к cебе игрока Админ");                 SendClientMessage(playerid,0xB30400EF,"Aдминистратор %s телепортировал вас к себе");             }         }         if(listitem == 7)         {             if(playerid != zherid)             {                 if(!IsPlayerSpawned(zherid))                 {                     SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");                     return 1;                 }                 GetPlayerPos(playerid,X,Y,Z);                 if(IsPlayerInAnyVehicle(zherid))                 {                     SetVehiclePos(GetPlayerVehicleID(zherid),X+1,Y,Z);                 }                 else                 {                     SetPlayerPos(zherid,X+1,Y,Z);                 }                 SetPlayerInterior(zherid,GetPlayerInterior(playerid));                 format(string,sizeof(string),"Вы телепортировали к cебе игрока %s",gname);                 SendClientMessage(playerid,0x099DE0F6,string);                 format(string,sizeof(string),"Aдминистратор %s телепортировал вас к себе",pname);                 SendClientMessage(zherid,0x099DE0F6,string);             }             else             {                 SendClientMessage(playerid,0xB30400EF,"Вы не можете телепортировать себя");             }         }         if(listitem == 8)         {             if(playerid != zherid)             {                 if(!IsPlayerSpawned(zherid))                 {                     SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");                     return 1;                 }                 if(Player[zherid][Jailed] == 0)                 {                     Player[zherid][Jailed] = 1;                     SetPlayerInterior(zherid,3);                     SetPlayerPos(zherid,2574.1096,-2413.3933,21.5356);                     format(string,sizeof(string),"Aдминистратор %s посадил %s в тюрьму...",pname,gname);                     SendClientMessageToAll(0x099DE0F6,string);                 }                 else                 {                     Player[zherid][Jailed] = 0;                     SetPlayerInterior(zherid,0);                     SpawnPlayer(zherid);                     format(string,sizeof(string),"Aдминистратор %s освободил игрока %s",pname,gname);                     SendClientMessageToAll(0x099DE0F6,string);                 }             }             else             {                 SendClientMessage(playerid,0xB30400EF,"Вы не можете сажать себя в тюрьму");             }         }         if(listitem == 9)         {             if(playerid != zherid)             {                 if(!IsPlayerSpawned(zherid))                 {                     SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");                     return 1;                 }                    TogglePlayerSpectating(playerid,1);                 PlayerSpectatePlayer(playerid,zherid);                 SetPlayerInterior(playerid,GetPlayerInterior(zherid));                 Player[playerid][SpecID] = zherid;                 Player[playerid][SpecType] = 1;                 format(string,sizeof(string),"Bы следите за %s.",gname);                 SendClientMessage(playerid,0x099DE0F6,string);                 SendClientMessage(playerid,0x099DE0F6,"Чтобы отключить слежку, введите: \"/spec-off\"");             }         }         if(listitem == 10)         {             if(playerid != zherid)             {                 if(!IsPlayerSpawned(zherid))                 {                     SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");                     return 1;                 }                 if(Player[zherid][Freeze] == 0)                 {                     TogglePlayerControllable(zherid,0);                     format(string,sizeof(string),"Aдминистратор %s заморозил игрока %s",pname,gname);                     SendClientMessageToAll(0x099DE0F6,string);                     Player[zherid][Freeze] = 1;                 }                 else                 {                     TogglePlayerControllable(zherid,1);                     format(string,sizeof(string),"Aдминистратор %s разморозил игрока %s",pname,gname);                     SendClientMessageToAll(0x099DE0F6,string);                     Player[zherid][Freeze] = 0;                 }             }         }     }     else     {     } }
На сегодня всё.
Итог работы:
  • Создана регистрация
  • Создан вход
  • Создано сохранение игроков
  • Создан Администраторский раздел
В нашем моде уже есть:
  • Название мода
  • Спавн игроков
  • Скины при входе
  • Регистрация
  • Вход
  • Сохранение игроков
В следующем уроке ждите:
  • Меню сервера
  • Пользовательские команды
Автор: danilasar
Помог? Не стоит благодарности.

Аватара пользователя
danilasar
Сообщения: 244
Зарегистрирован: 11 июл 2016, 17:13

[урок] Создание мода с нуля - урок №2

Сообщение danilasar » 23 июл 2016, 15:47

Скоро будет 3-й урок...
Помог? Не стоит благодарности.

AndrewWhite
Сообщения: 1
Зарегистрирован: 10 июл 2017, 13:56

[урок] Создание мода с нуля - урок №2

Сообщение AndrewWhite » 10 июл 2017, 13:57

Что можно сделать,чтобы при выходе игрока,другого не спавнило?

Аватара пользователя
danilasar
Сообщения: 244
Зарегистрирован: 11 июл 2016, 17:13

[урок] Создание мода с нуля - урок №2

Сообщение danilasar » 12 июл 2017, 13:35

Что можно сделать,чтобы при выходе игрока,другого не спавнило?
Объясни, пожалуйста.
Правильно я понял?
Какой-то игрок зашёл, поиграл, вышел. Пришел другой, его не заспавнило. Так?
Помог? Не стоит благодарности.


Вернуться в «Изучаем язык Pawn»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость

cron