Felave Пользователь
Сообщения : 125 Город : Нижний Новгород Репутация : 44
| Тема: Пишем мод с 0.(урок 1) 2012-07-03, 08:00 | |
| Кратко о том что мы будем делать. Данные уроки будут посвящены написанию игрового мода sa-mp с new.pwn. Мод будет жанра РПГ, написан на файловой системе с использованием инклуда mxINI. Краткий план разработки на ближайшее время: Основа Мода. - Система Регистрации - Загрузка сохранения аккаунта. - Система Домов - Система Бизнесов - Система Транспорта - Система Банка. Это план на написание основы. После этого мод начнет заполнятся фракциями, работами и т.п. Данный урок, будет посвящен началу разработки, и написанию системы регистрации, и загрузки сохранения аккаунта. Пожалуй начнём. Действие Первое. Нужные файлы, и настройка сервера: Качаем последнюю версию сервера sa-mp с офф. сайта. ссылка Распаковываем сервер в любую удобную для вас папку. Открываем server.cfg, и меняем rcon_password changename, на свой пароль, из строки filterscripts, убираем все FS которые включены. Меняем gamemode, на new. Качаем последнюю версию инклуда mxINI. ссылка Открываем папку pawno, в папке с вашим сервером, папку include, и ложем инклуд mxINI, в эту папку. Заходи в папку gamemodes, и удаляем все моды которые там есть ( для удобства ). Заходим в папку pawno, и открываем программу pawno.exe. Слева, в углу, нажимаем на кнопку new. Пред вами то, что в ближайшее время, будет нашим модом. Нажимаем F5, и нам предлагают выбрать папку, и имя будущего мода. Выбираем папку gamemodes, в папке с вашим сервером, и имя файла задаём new . Пробуем запустить мод, зайдя в папку с сервером, и запустим файл samp-server.exe . Если сервер запустился, мы всё сделали правильно, настройка сервера закончена. Действие второе. Удаление лишнего из мода: Открываем наш мод. Первое что бросается нам в глаза, это - Код:
-
#if defined FILTERSCRIPT
public OnFilterScriptInit() { print("\n--------------------------------------"); print(" Blank Filterscript by your name here"); print("--------------------------------------\n"); return 1; }
public OnFilterScriptExit() { return 1; }
#else
main() { print("\n----------------------------------"); print(" Blank Gamemode by your name here"); print("----------------------------------\n"); }
#endif Это нам ненужно удаляем! Действие третье:Меняем название модаНаходим паблик OnGameModeInit() - Код:
-
public OnGameModeInit() { // Don't use these lines if it's a filterscript SetGameModeText("Blank Script"); AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0); return 1; } И после него, вставляем main() { print("\n----------------------------------"); print(" Название вашего мода PG"); print("----------------------------------\n"); } Действие четвертое:Вставка инклюдов и первое компелированиеВ самом начале мода, мы можем видеть такую строку. - Код:
-
#include <a_samp> Если подумать головой, то можно понять что это подгрузка инклудов в мод. После него добавим наш инклуд: - Код:
-
#include <mxINI> Нажимаем F5, и компилируем мод, если всё прошло без ошибок, значит вы всё сделали правильно. Находим строку - Код:
-
SetGameModeText("PG); Эта строка, устанавливает название мода, которое будет видно в клиенте. Меняем его на своё. Компилируем мод, и.. мы закончили с подготовкой мода. Теперь нас ждёт система регистрации. Действие Пятое. Сохранение аккаунта.Переходим к созданию того, чем мы будет пользоваться постоянно. Это данные о аккаунте. После строки с добавлением нашего инклуда, создаём масив, с информацией о игроке. - Код:
-
enum pInfo { pPass[64],// Масив с паролем } new Player[MAX_PLAYERS][pInfo]; Теперь мы можем записать пароль, определённого игрока, чем мы сейчас и займёмся. Опускаемся в самый конец мода, и создаём там, вот это: - Код:
-
stock SavePlayer(playerid) { new string[64];// Масив с путём для файла new playername[MAX_PLAYER_NAME];// Масив для получения имени игрока GetPlayerName(playerid, playername, sizeof(playername));// Получаем Имя игрока format(string, sizeof(string), "players/%s.ini", playername);// Добавляем имя игрока, в путь для сохранения iniFile = ini_openFile(string);// Открываем файл по тому пути который указали. ini_setString(iniFile,"Pass",Player[playerid][pPass]);// Записываем пароль игрока в файл ini_closeFile(iniFile);// Закрываем файл } Нажимаем F5, и мод компилируется. Если ошибок нет, то вы сделали всё правильно. Теперь нам надо зайти в папку с сервером, открыть папку scriptfiles, и в ней добавить папку players. Сохранение готово. Действие Шестое. Создание регистрации и загрузки игрока.Для создания регистрации, надо узнать, есть ли игрок с таким именем на сервере, для начала нужно после объявления нашего инклуда, вставить следующее: - Код:
-
new PAccount[MAX_PLAYERS];// Есть аккаунт, или нет Далее ищем паблик OnPlayerConnect. И в него добавляем: - Код:
-
new playername[MAX_PLAYER_NAME];// Масив для имени игрока new string[128];// Путь до папки с именем игрока GetPlayerName(playerid,playername,sizeof(playername));// Узнаём имя игрока format(string,sizeof(string),"players/%s.ini", playername);// Путь к файлу с аккаунтом if(fexist(string))// Проверка на файл, если он есть то выполняется следующее действие. { PAccount[playerid] = 1;// Аккаунт есть } else// Если файла с именем нет, то выполняется это действие. { PAccount[playerid] = 0;// Аккаунта нет } Теперь ищем паблик, OnPlayerRequestClass, он покажет нам диалог с логином, или регистрацией, в него добавляем. - Код:
-
if(PAccount[playerid] == 1)// Если аккаунт есть { ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Окно Входа","Здравствуйте\nВаш аккаунт есть на сервере\nВведите свой пароль в окошко","Ввод","");// Показываем диалог входа в игру. Стиль диалога выставляем на ввод текста. } else// Если аккаунта нет { ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Окно Регистрации","Здравствуйте\nВаш аккаунт не найден.\nЗарегистрируйтесь введя пароль в окошко","Ввод","");// Показываем диалог регистрации. Стиль диалога выставляем на ввод текста. } Диалоги мы показали, но теперь надо заставить его работать. Для этого нам надо сделать функцию загрузки и регистрации игрока. Этим мы и займёмся. В конец мода, вставляем. - Код:
-
forward OnPlayerRegister(playerid, password[]); public OnPlayerRegister(playerid, password[])// Паблик регистрации { if(IsPlayerConnected(playerid)) { new string[64];// Масив с путём для файла new playername[MAX_PLAYER_NAME];// Масив для получения имени игрока GetPlayerName(playerid, playername, sizeof(playername));// Получаем Имя игрока format(string,sizeof(string), "players/%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_closeFile(iniFile);// Закрываем файл ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Окно Входа","Здравствуйте\nВаш аккаунт есть на сервере\nВведите свой пароль в окошко","Ввод","");// Показываем диалог входа в игру. } } return 1; } Функция которая зарегистрирует игрока, готова, теперь функция логина. В конец мода, добавляем. - Код:
-
forward OnPlayerLogin(playerid,password[]); 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), "players/%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_closeFile(iniFile);// Закрываем файл } else// Если пароль не верен.. { ini_closeFile(iniFile);// Закрываем файл ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Окно Входа","Здравствуйте\nВаш аккаунт есть на сервере\nВведите свой пароль в окошко","Ввод","");// Показываем диалог входа в игру. return 1; } SendClientMessage(playerid,0xFF00000,"Добро пожаловать на наш сервер");// Выводим игрок сообщение SpawnPlayer(playerid);// Спавним игрока } return 1; } Функция регистрации есть, логина есть, осталось заставить их работать, для этого находим паблик OnDialogResponse и вставляем в него: - Код:
-
if(dialogid == 1)// Ид диалога Для Логина { if(response)// Если игрок нажал первую кнопку входа { if(!strlen(inputtext))// Если окно ввода пустое, выводим диалог снова { ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Окно Входа","Здравствуйте\nВаш аккаунт есть на сервере\nВведите свой пароль в окошко","Ввод","");// Показываем диалог входа в игру. return 1; } new pass[64];// Масив с паролем strmid(pass,inputtext,0,strlen(inputtext),64);// Считываем текст с диалога OnPlayerLogin(playerid,pass);// Запускаем паблик входа } else// Если игрок нажал Esc, вернём ему диалог { ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Окно Входа","Здравствуйте\nВаш аккаунт есть на сервере\nВведите свой пароль в окошко","Ввод","");// Показываем диалог входа в игру. } } if(dialogid == 2)// Ид диалога для регистрации { if(response)// Если игрок нажал первую кнопку { if(!strlen(inputtext))// Если окно ввода пустое, выводим диалог снова { ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Окно Регистрации","Здравствуйте\nВаш аккаунт не найден.\nЗарегистрируйтесь введя пароль в окошко","Ввод","");// Показываем диалог регистрации. return 1; } new pass[64];// Масив с паролем strmid(pass,inputtext,0,strlen(inputtext),64);// Считываем текст с диалога OnPlayerRegister(playerid,pass);// Запускаем паблик регистрации } else// Если игрок нажал Esc, вернём ему диалог { ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Окно Регистрации","Здравствуйте\nВаш аккаунт не найден.\nЗарегистрируйтесь введя пароль в окошко","Ввод","");// Показываем диалог регистрации. } } Конец первой части. Автор урока: Vovan228 Редактор и оформитель:Felave mxINIЧто должно получиться(new.pwn) |
|