Для начала я думаю нам понадобиться сделать регистрацию игроков, чтобы при повторном входе на сервер, загружались данные такие как: пароль, админка, деньги, фраги.
Цель мода указана на wikipedia и наш мод будет называться Red Deathmatch.
Скачиваем чистый сервер на официальном сайте версии SA-MP 0.3z Windows Server или SA-MP 0.3z Linux Server (x86)
Создаем где удобно папку с сервером, с вашим название, допустим у меня будет назваться папка SERVER на диске C по пути C:\SERVER и извлекаем всё с архива в вашу папку.
Открываем файл server.cfg текстовым редактором, ищем rcon_password и меняем пароль вместо слова changeme, ищем filterscripts и убираем справа от него все строки, ищем gamemode0 grandlarc 1 и переделываем на gamemode0 RDM 1 сохраняем файл.
Удаляем всё с папки gamemodes чтобы не мешалось, заходим в папку pawno и открываем компилятор pawno.exe.
Нажимаем комбинацию клавиш Ctrl+N, создался new.pwn, убираем всё до строки #include <a_samp> и начиная от #if defined FILTERSCRIPT убрать до #else и найти #endif и тоже убрать, чтобы убрать функции filterscripts.
Скачаем инклуд: https://pawn.wiki/in...ic/12399-mxini/
Подключаем инклуд mxINI после #include <a_samp> добавить
#include <mxINI>
new PAccount[MAX_PLAYERS];
enum pInfo
{
pPass[64],
pAdmin,
pMoney,
pScore
}
new PlayerInfo[MAX_PLAYERS][pInfo];
В public OnPlayerConnect
PlayerInfo[playerid][pAdmin] = 0;
new playername[MAX_PLAYER_NAME];// Массив для имени игрока
new string[128];// Путь до папки с именем игрока
GetPlayerName(playerid,playername,sizeof(playername));// Узнаём имя игрока
format(string,sizeof(string),"Gamers/%s.ini", playername);// Путь к файлу с аккаунтом
if(fexist(string))// Проверка на файл, если он есть то выполняется следующее действие.
{
PAccount[playerid] = 1;// Аккаунт есть
}
else// Если файла с именем нет, то выполняется это действие.
{
PAccount[playerid] = 0;// Аккаунта нет
}
if(PAccount[playerid] == 1)// Если аккаунт есть
{
ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Login - Red Deathmatch","Здравствуйте\nВаш аккаунт есть на сервере\nВведите свой пароль в окошко","Ввод","");// Показываем диалог входа в игру. Стиль диалога выставляем на ввод текста.
}
else// Если аккаунта нет
{
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Register - Red Deathmatch","Здравствуйте\nВаш аккаунт не найден.\nЗарегистрируйтесь введя пароль в окошко","Ввод","");// Показываем диалог регистрации. Стиль диалога выставляем на ввод текста.
}
В public OnPlayerDisconnect
SavePlayer(playerid);// Сохраняем игрока
В public 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Зарегистрируйтесь введя пароль в окошко","Ввод","");// Показываем диалог регистрации.
}
}
В самый конец мода
stock SavePlayer(playerid)
{
new string[64];// Массив с путём для файла
new playername[MAX_PLAYER_NAME];// Массив для получения имени игрока
GetPlayerName(playerid, playername, sizeof(playername));// Получаем Имя игрока
format(string, sizeof(string), "Gamers/%s.ini", playername);// Добавляем имя игрока, в путь для сохранения
new iniFile = ini_openFile(string);// Открываем файл по тому пути который указали.
ini_setString(iniFile,"Pass",PlayerInfo[playerid][pPass]);// Записываем пароль игрока в файл
ini_setInteger(iniFile,"Admin",PlayerInfo[playerid][pAdmin]);// Записываем уровень админа
ini_setInteger(iniFile,"Money",PlayerInfo[playerid][pMoney]);// Записываем сколько денег
ini_setInteger(iniFile,"Score",PlayerInfo[playerid][pScore]);// Записываем очки игрока
ini_closeFile(iniFile);// Закрываем файл
}
stock OnPlayerRegister(playerid, password[])// Паблик регистрации
{
if(IsPlayerConnected(playerid))// Проверка на подключение игрока
{
new string[64];// Массив с путём для файла
new playername[MAX_PLAYER_NAME];// Массив для получения имени игрока
GetPlayerName(playerid, playername, sizeof(playername));// Получаем Имя игрока
format(string,sizeof(string), "Gamers/%s.ini", playername);// Добавляем имя игрока, в путь для сохранения
new iniFile = ini_createFile(string);// Создаём файл с именем игрока в папке players
if(iniFile < 0)// Если Файла нет
{
iniFile = ini_openFile(string);// Открываем
}
if(iniFile >= 0)// Если файл есть
{
strmid(PlayerInfo[playerid][pPass],password,0,strlen(password),255);// Присваиваем массиву pPass, значение password[]
ini_setString(iniFile,"Pass",PlayerInfo[playerid][pPass]);// Записываем пароль игрока в файл
ini_closeFile(iniFile);// Закрываем файл
ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Окно Входа","Здравствуйте\nВаш аккаунт есть на сервере\nВведите свой пароль в окошко","Ввод","");// Показываем диалог входа в игру.
}
}
return 1;
}
stock 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), "Gamers/%s.ini", playername);// Добавляем имя игрока, в путь для загрузки
new iniFile = ini_openFile(string);// Открываем файл
ini_getString(iniFile,"Pass",pass,64);// Загружаем пароль
if(strcmp(pass,password,true) == 0)// Если введёный пароль, соответсвует паролю при регистрации, то загружаем акк
{
ini_getString(iniFile,"Pass",PlayerInfo[playerid][pPass],64);// Загружаем пароль
ini_getInteger(iniFile,"Admin",PlayerInfo[playerid][pAdmin]);// Загружаем уровень админа
ini_getInteger(iniFile,"Money",PlayerInfo[playerid][pMoney]);// Загружаем деньги
ini_getInteger(iniFile,"Score",PlayerInfo[playerid][pScore]);// Загружаем очки игрока
ini_closeFile(iniFile);// Закрываем файл
}
else// Если пароль не верен..
{
ini_closeFile(iniFile);// Закрываем файл
ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Окно Входа","Здравствуйте\nВаш аккаунт есть на сервере\nВведите свой пароль в окошко","Ввод","");// Показываем диалог входа в игру.
return 1;
}
SendClientMessage(playerid,0xFF00000,"Добро пожаловать на Red Deathmatch");// Выводим игрок сообщение
SpawnPlayer(playerid);// Спавним игрока
}
return 1;
}
Заменим public OnPlayerRequestSpawn на
public OnPlayerRequestSpawn(playerid) return false;
Чтобы стрелочки и кнопка spawn не работали, пока не авторизуешься.
Давайте еще добавим стандартных машин в мод из мода grandlarc
Ко всем #include
#include "../include/gl_common.inc"
В конец public OnGameModeInit
// SPECIAL
LoadStaticVehiclesFromFile("vehicles/trains.txt");
LoadStaticVehiclesFromFile("vehicles/pilots.txt");
// LAS VENTURAS
LoadStaticVehiclesFromFile("vehicles/lv_law.txt");
LoadStaticVehiclesFromFile("vehicles/lv_airport.txt");
LoadStaticVehiclesFromFile("vehicles/lv_gen.txt");
// SAN FIERRO
LoadStaticVehiclesFromFile("vehicles/sf_law.txt");
LoadStaticVehiclesFromFile("vehicles/sf_airport.txt");
LoadStaticVehiclesFromFile("vehicles/sf_gen.txt");
// LOS SANTOS
LoadStaticVehiclesFromFile("vehicles/ls_law.txt");
LoadStaticVehiclesFromFile("vehicles/ls_airport.txt");
LoadStaticVehiclesFromFile("vehicles/ls_gen_inner.txt");
LoadStaticVehiclesFromFile("vehicles/ls_gen_outer.txt");
// OTHER AREAS
LoadStaticVehiclesFromFile("vehicles/whetstone.txt");
LoadStaticVehiclesFromFile("vehicles/bone.txt");
LoadStaticVehiclesFromFile("vehicles/flint.txt");
LoadStaticVehiclesFromFile("vehicles/tierra.txt");
LoadStaticVehiclesFromFile("vehicles/red_county.txt");
В public OnPlayerUpdate
GivePlayerMoney(playerid,PlayerInfo[playerid][pMoney]);//Выводит количество денег SetPlayerScore(playerid,PlayerInfo[playerid][pScore]);//Выводит количество очков (фрагов)
В public OnPlayerDeath
SetPlayerScore(killerid,PlayerInfo[playerid][pScore]+1); SetPlayerScore(playerid,PlayerInfo[playerid][pScore]-1); SendDeathMessage(killerid, playerid, reason);
[ВАЖНО]Создать папку Gamers в папке scriptfiles
Пишите в эту тему что сделать в следующем уроке.
Скачать мод с Яндекс Диска
Вход
Регистрация
Помощь













