Доступ к архиву

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Пишем мод с 0 самостоятельно.

Статус
В этой теме нельзя размещать новые ответы.

potemckin

Изучающий
Пользователь
Регистрация
11 Мар 2013
Сообщения
111
Лучшие ответы
0
Репутация
22
Пишем мод с 0 самостоятельно.(Урок 1)

Уроки по созданию мода с 0
//-----------------------------------------------------------------------------------------------------------------\\
Здравствуйте, дорогие поситители и обитатели pawno-info.ru!
Это мой первый и я надеюсь не последний урок по созданию мода для samp.
Ну и ближе к теме.
Наш мод будет в так полюбившемся многим жанре Role Play.
Основной функционал будет на mxINI, потому что я в mySQL мало жу-жу.
//-----------------------------------------------------------------------------------------------------------------\\

Ну начнём!

Для начала нам надо скачать инклуд mxINI и официальный сервер samp.

Скачали? Продолжаем!

Открываем папку с нашим сервером, открываем с помощью блакнота фаил server.сfg и правим в нем всё по примеру ниже
echo Executing Server Config...
lanmode 0
rcon_password changeme 123321
maxplayers 50
port 7777
hostname pawno-info.ru
gamemode0 new
filterscripts
announce 0
query 1
chatlogging 0
weburl pawno-info.ru
onfoot_rate 40
incar_rate 40
weapon_rate 40
stream_distance 300.0
stream_rate 1000
maxnpc 0
logtimeformat [%H:%M:%S]

Теперь в папке с нашим модом ищем папку "pawno", а в ней папку "include" кидаем наш инклуд mxINI туда.
Тепер в папку "pawno" открываем саму программу и тыкаем "File>New"
Это наш будующий мод, вы должны увидеть
// This is a comment
// uncomment the line below if you want to write a filterscript
//#define FILTERSCRIPT

#include <a_samp>

#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;
}

public OnGameModeExit()
{
return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
return 1;
}

public OnPlayerConnect(playerid)
{
return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
return 1;
}

public OnPlayerSpawn(playerid)
{
return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
return 1;
}

public OnVehicleSpawn(vehicleid)
{
return 1;
}

public OnVehicleDeath(vehicleid, killerid)
{
return 1;
}

public OnPlayerText(playerid, text[])
{
return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
if (strcmp("/mycommand", cmdtext, true, 10) == 0)
{
// Do something here
return 1;
}
return 0;
}

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
return 1;
}

public OnPlayerLeaveCheckpoint(playerid)
{
return 1;
}

public OnPlayerEnterRaceCheckpoint(playerid)
{
return 1;
}

public OnPlayerLeaveRaceCheckpoint(playerid)
{
return 1;
}

public OnRconCommand(cmd[])
{
return 1;
}

public OnPlayerRequestSpawn(playerid)
{
return 1;
}

public OnObjectMoved(objectid)
{
return 1;
}

public OnPlayerObjectMoved(playerid, objectid)
{
return 1;
}

public OnPlayerPickUpPickup(playerid, pickupid)
{
return 1;
}

public OnVehicleMod(playerid, vehicleid, componentid)
{
return 1;
}

public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
{
return 1;
}

public OnVehicleRespray(playerid, vehicleid, color1, color2)
{
return 1;
}

public OnPlayerSelectedMenuRow(playerid, row)
{
return 1;
}

public OnPlayerExitedMenu(playerid)
{
return 1;
}

public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
return 1;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
return 1;
}

public OnRconLoginAttempt(ip[], password[], success)
{
return 1;
}

public OnPlayerUpdate(playerid)
{
return 1;
}

public OnPlayerStreamIn(playerid, forplayerid)
{
return 1;
}

public OnPlayerStreamOut(playerid, forplayerid)
{
return 1;
}

public OnVehicleStreamIn(vehicleid, forplayerid)
{
return 1;
}

public OnVehicleStreamOut(vehicleid, forplayerid)
{
return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
return 1;
}

public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
return 1;
}

Ладно, приступим, для начала удалим кое-что, потисачим из нашего мода что-нибудь!

PHP:
#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
НЕ партесь! Нам это ненужно, это для создания FS.

Далее.

Теперь сделаем наш мод более "НАШИМ" тобишь вставим наши названия!

Ищем
PHP:
public OnGameModeInit()
, а в нем ищем
SetGameModeText("Blank Script");
Вместо "Blank Script" ставим наше название, это название нашего мода, у меня мод будет посвящен ушедшему, Стиву Джопсу
Поэтому у меня это будет выглядет так
PHP:
SetGameModeText("StiveJobsRP");
Далее.

Сделаем наш мод более "РП-шным" В
PHP:
public OnGameModeInit()
PHP:
 добавляем DisableInteriorEnterExits();///Уберёт жёлтые пикапы входа
EnableStuntBonusForAll(0); /// Убирёт Stunt бонусы, небуду объяснять что это.
Далее.

Перенесём спавн из LV в LS
ищем
PHP:
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
Вместо этого ставим
AddPlayerClass(3,1962.3774,-1183.7675,26.0280,269.0738,0,0,0,0,0,0);

Далее.

Теперь приступим к регистрации, ищем
PHP:
#include <a_samp>
После него пишем
PHP:
#include <mxINI>
Это объявление нашего инклуда mxINI.
Далее, после объявления нашего инклудо пишите это
PHP:
enum pInfo
{
        pPass[64],// Пароль
}
new Player[MAX_PLAYERS][pInfo];
Это информация об игроке, туда будем вставлять уровень админки, уровень и т.д.

А теперь в самый конец мода пишите это
PHP:
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);// Закрывает файл
}
Далее создадим сис-му регистрации.

НАм надо добавить
PHP:
new PAccount[MAX_PLAYERS];
После нашего инклуда mxINI это нужно для того чтобы узнать, есть ли аккаунт на сервере

Далее в паблик OnPlayerConnect добавляем:

PHP:
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 ((он преднозначен для показа диалогов)) добавляем:
PHP:
if(PAccount[playerid] == 1)//  аккаунт есть
        {
            ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Окно Входа","Здравствуйте\nВы зарегистрированы\nВведите свой пароль в окошко","Ввод","");// Диалог авторизации
        }
        else// или аккаунта нет
        {
            ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Окно Регистрации","Здравствуйте\nВы не зарегистрированы.\nЗарегистрируйтесь введя пароль в окошко","Ввод","");// диалог регистрации
        }
Теперь сис-ма которая сделает нам регистрацию и авторизацию, для этого пишем это в конец мода:
PHP:
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);
                if(iniFile < 0)
                {
                        iniFile = ini_openFile(string);
                }
                if(iniFile >= 0)
                {
                        strmid(Player[playerid][pPass],password,0,strlen(password),255);
                        ini_setString(iniFile,"Pass",Player[playerid][pPass]);
                        ini_closeFile(iniFile);
                        ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Окно Входа","Здравствуйте\nВы зарегистрированы\nВведите свой пароль в окошко","Ввод","");// Показываем диалог входа в игру.
                }
        }
        return 1;
}
PHP:
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,0x61ff0000,"Добро пожаловать на  сервер");
                SpawnPlayer(playerid);// Спавним
        }
        return 1;
}
Теперь есть функции авторизации и регистрации, сделаем так чтобы это всё работало!

Для этого в паблик OnDialogResponse вставляем:
PHP:
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
            {
                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
            {
            ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Окно Регистрации","Здравствуйте\nВы не зарегистрированы\nЗарегистрируйтесь введя пароль в окошко","Ввод","");
            }
        }
Ну я надеюсь, что помог, а модератор, не удоляйте тему, я очень долго писал всё это, если что не так, то исправте пожалуйста.
Новички, с любой проблемой пишите в этой теме! Я постараюсь помоч!
НЕ новички, оставляйте комментарии по уроку, пожалуйста!
Всем спасибо, пока!
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу