Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!: Пишем мод с 0 (Урок 1) - Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!

Перейти к содержимому

  • (10 Страниц) +
  • 1
  • 2
  • 3
  • Последняя »
  • Вы не можете создать новую тему
  • Тема закрыта

[ Урок ]
Пишем мод с 0 (Урок 1)
Оценка: -----

#1
Пользователь офлайн   Mike 

  • Администратор
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Кратко о том что мы будем делать.
Данные уроки будут посвящены написанию игрового мода 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
22

#2
Пользователь офлайн   DeM 

  • Пользователь
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Аккаунт не будет сохранять :16:
Добавляем ко всем forward
forward SavePlayers(playerid);


и добавляем паблик
public SavePlayers(playerid)
{
    for(new i; i < GetMaxPlayers(); i++)
    {
        if(!IsPlayerConnected(i))continue;
        SavePlayer(i);
    }
}


А так же в public OnPlayerDisconnect
Добавляем
SavePlayers(playerid);//автосохранение при выходе


И радуемся :16:

Сообщение отредактировал DeM: 31 Январь 2012 - 01:16

5

Сказали спасибо 6:

#3
Пользователь офлайн   Пашка 

  • Знаток
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
C:\Users\Павел\Desktop\рп с 0\gamemodes\new.pwn(223) : error 001: expected token: "#endif", but found "-end of file-"
А такой строки нету, может я лишнего удалил?
0

#4
Пользователь офлайн   Erick 

  • Эксперт
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Relium, удали
#endif

1

Сказали спасибо 1:

#5
Пользователь офлайн   Пашка 

  • Знаток
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Спасибо исправил =)
0

#6
Пользователь офлайн   Пашка 

  • Знаток
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Жду недождусь 2 урока =)
0

#7
Пользователь офлайн   slava_kazakov 

  • Прохожий
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\
gamemodes\Untitled.pwn(41) : error 010: invalid function or declaration
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\gamemodes\Untitled.
pwn(45) : error 010: invalid function or declaration
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\gamemodes\Untitled.
pwn(56) : error 021: symbol already defined: "GetPlayerName"
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\gamemodes\Untitled.
pwn(58) : error 010: invalid function or declaration
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\gamemodes\Untitled.
pwn(62) : error 010: invalid function or declaration
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\gamemodes\Untitled.
pwn(243) : warning 217: loose indentation
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\gamemodes\Untitled.
pwn(252) : warning 217: loose indentation
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\gamemodes\Untitled.
pwn(259) : warning 217: loose indentation
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\gamemodes\Untitled.
pwn(270) : warning 217: loose indentation
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\gamemodes\Untitled.
pwn(294) : warning 219: local variable "string" shadows a variable at a preceding level
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\gamemodes\Untitled.
pwn(295) : warning 217: loose indentation
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\gamemodes\Untitled.
pwn(295) : warning 219: local variable "playername" shadows a variable at a preceding level
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\gamemodes\Untitled.
pwn(319) : warning 219: local variable "string" shadows a variable at a preceding level
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\gamemodes\Untitled.
pwn(321) : warning 217: loose indentation
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\gamemodes\Untitled.
pwn(321) : warning 219: local variable "playername" shadows a variable at a preceding level
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\gamemodes\Untitled.
pwn(326) : warning 217: loose indentation
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\gamemodes\Untitled.
pwn(334) : warning 217: loose indentation
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\gamemodes\Untitled.
pwn(337) : warning 217: loose indentation
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\gamemodes\Untitled.
pwn(342) : warning 203: symbol is never used: "PAccount"
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\gamemodes\Untitled.
pwn(342) : warning 203: symbol is never used: "playername"
C:\Users\slava-(k(@)ratelь)\Downloads\samp03dsvr_R2_win32\gamemodes\Untitled.
pwn(342) : warning 203: symbol is never used: "string"
Pawn compiler 3.2.3664	 	 	Copyright (c) 1997-2006, ITB CompuPhase


5 Errors.


Вообще всё получилось (всё после "Действие Четвёртое. Создание регистрации и загрузки игрока." у меня так получилось :( (Я нуб в этой проге))
0

#8
Пользователь офлайн   Lwf 

  • Эксперт
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Делай всё сразу а не по частям
0

#9
Пользователь офлайн   slava_kazakov 

  • Прохожий
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Pawn compiler 3.2.3664	 	 	Copyright (c) 1997-2006, ITB CompuPhase


во всё получилось :)
0

Сказали спасибо 1:

#10
Пользователь офлайн   Пашка 

  • Знаток
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Я всё сделал, но когда запускаю сервак, это окошко появляется и пропадает сразу, почему так? хотя в конфиге всё прописанно!
0

Сказали спасибо 1:

Поделиться темой:


  • (10 Страниц) +
  • 1
  • 2
  • 3
  • Последняя »
  • Вы не можете создать новую тему
  • Тема закрыта

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей