Урок Пишем мод с 0 (Урок 1) - Форум - Воплоти

Урок Пишем мод с 0 (Урок 1) - Форум - Воплоти

Урок Пишем мод с 0 (Урок 1) - Форум - Воплоти

Урок Пишем мод с 0 (Урок 1) - Форум - Воплоти

Кратко о том что мы будем делать.
Данные уроки будут посвящены написанию игрового мода 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
Вот это нам не нужно. Удаляем.
Находим паблик
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(" Название вашего мода, у меня будет pawn-wiki"); print("----------------------------------\n"); }
В самом начале мода, мы можем видеть такую строку.
#include <a_samp>
Если подумать головой, то можно понять что это подгрузка инклудов в мод. После него добавим наш инклуд:
#include <mxINI>
Нажимаем F5, и компилируем мод, если всё прошло без ошибок, значит вы всё сделали правильно.
Находим строку
SetGameModeText("Blank Script");
Эта строка, устанавливает название мода, которое будет видно в клиенте. Меняем его на своё.
SetGameModeText("Pawn-wiki Mode");
Компилируем мод, и.. мы закончили с подготовкой мода. Теперь нас ждёт система регистрации.
Действие Третье. Сохранение аккаунта.
Переходим к созданию того, чем мы будет пользоваться постоянно. Это данные о аккаунте.
После строки с добавлением нашего инклуда, создаём масив, с информацией о игроке.
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Зарегистрируйтесь введя пароль в окошко","Ввод","");// Показываем диалог регистрации. } }
Конец первой части.
Полезные ссылки:

- Include mxINI
- new.rar [1,84К]
Приношу свои извинения за ошибки в тексте.
Понравился урок? Пользуйся на здоровье.
Следующий урок, в ближайшие дни.
Автор урока: Vovan228



Как сделать свой мод на самп 0.3.7 на

Как сделать свой мод на самп 0.3.7 на

Как сделать свой мод на самп 0.3.7 на

Как сделать свой мод на самп 0.3.7 на

Как сделать свой мод на самп 0.3.7 на

Как сделать свой мод на самп 0.3.7 на

Как сделать свой мод на самп 0.3.7 на

Как сделать свой мод на самп 0.3.7 на

Как сделать свой мод на самп 0.3.7 на

Как сделать свой мод на самп 0.3.7 на

Как сделать свой мод на самп 0.3.7 на

Как сделать свой мод на самп 0.3.7 на

Как сделать свой мод на самп 0.3.7 на

Как сделать свой мод на самп 0.3.7 на

Как сделать свой мод на самп 0.3.7 на

Как сделать свой мод на самп 0.3.7 на