Форум Pawn-Wiki.Ru — Воплоти мечту в реальность!: Пишем мод с 0 (Урок 1) — Форум Pawn-Wiki.Ru — Воплоти мечту в реальность!
- (14 Страниц)
- 1
- 2
- 3
- >
- Последняя »
- Вы не можете создать новую тему
- Вы не можете ответить в тему
Кратко о том что мы будем делать.
Данные уроки будут посвящены написанию игрового мода 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 .
Если сервер запустился, мы всё сделали правильно, настройка сервера закончена.
Действие второе. Удаление лишнего из мода:
Открываем наш мод. Первое что бросается нам в глаза, это
Вот это нам не нужно. Удаляем.
Находим паблик
В самом начале мода, мы можем видеть такую строку.
Если подумать головой, то можно понять что это подгрузка инклудов в мод. После него добавим наш инклуд:
Нажимаем F5, и компилируем мод, если всё прошло без ошибок, значит вы всё сделали правильно.
Эта строка, устанавливает название мода, которое будет видно в клиенте. Меняем его на своё.
Компилируем мод, и.. мы закончили с подготовкой мода. Теперь нас ждёт система регистрации.
Действие Третье. Сохранение аккаунта.
Переходим к созданию того, чем мы будет пользоваться постоянно. Это данные о аккаунте.
После строки с добавлением нашего инклуда, создаём масив, с информацией о игроке.
Теперь мы можем записать пароль, определённого игрока, чем мы сейчас и займёмся.
Опускаемся в самый конец мода, и создаём там, вот это:
Нажимаем F5, и мод компилируется. Если ошибок нет, то вы сделали всё правильно.
Теперь нам надо зайти в папку с сервером, открыть папку scriptfiles, и в ней добавить папку players.
Сохранение готово.
Действие Четвёртое. Создание регистрации и загрузки игрока.
Для создания регистрации, надо узнать, есть ли игрок с таким именем на сервере, для начала нужно после объявления нашего инклуда, вставить следующее:
Далее ищем паблик OnPlayerConnect. И в него добавляем:
Теперь ищем паблик, OnPlayerRequestClass, он покажет нам диалог с логином, или регистрацией, в него добавляем.
Диалоги мы показали, но теперь надо заставить его работать. Для этого нам надо сделать функцию загрузки и регистрации игрока.
Этим мы и займёмся. В конец мода, вставляем.
Функция которая зарегистрирует игрока, готова, теперь функция логина. В конец мода, добавляем.
Функция регистрации есть, логина есть, осталось заставить их работать, для этого находим паблик OnDialogResponse и вставляем в него:
Конец первой части.
Полезные ссылки:
— Include mxINI
— new.rar [1,84К]
Приношу свои извинения за ошибки в тексте.
Понравился урок? Пользуйся на здоровье.
Следующий урок, в ближайшие дни.
Автор урока: Vovan228
Источник статьи: http://pawn-wiki.ru/index.php?/topic/2385-pishem-mod-s-0-urok-1/
Пишем мод с 0 самостоятельно.
potemckin
Участник форума
Пишем мод с 0 самостоятельно.(Урок 1)
//——————————————————————————————————————\\
Здравствуйте, дорогие поситители и обитатели pawno-info.ru!
Это мой первый и я надеюсь не последний урок по созданию мода для samp.
Ну и ближе к теме.
Наш мод будет в так полюбившемся многим жанре Role Play.
Основной функционал будет на mxINI, потому что я в mySQL мало жу-жу.
//——————————————————————————————————————\\
Для начала нам надо скачать инклуд mxINI и официальный сервер samp.
Открываем папку с нашим сервером, открываем с помощью блакнота фаил server.сfg и правим в нем всё по примеру ниже
// This is a comment
// uncomment the line below if you want to write a filterscript
//#define FILTERSCRIPT
public OnFilterScriptExit()
<
return 1;
>
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;
>
Ладно, приступим, для начала удалим кое-что, потисачим из нашего мода что-нибудь!
НЕ партесь! Нам это ненужно, это для создания FS.
Теперь сделаем наш мод более «НАШИМ» тобишь вставим наши названия!
Источник статьи: http://pawno-info.ru/threads/pishem-mod-s-0-samostojatelno.143840/
Как с нуля написать мод самп с нуля
Сообщение #1 Layk » 17 марта 2015, 20:38
echo Executing Server Config .
lanmode 0 // Не меняем!
rcon_password changeme // Обязательно меняем, или сервер не запустится
maxplayers 50 // Меняем на свое значение ( максимальное кол-во игроков, до 500 )
port 7777 // Порт ( по умолчанию 7777 )
hostname SA — MP 0.3 Server // Название сервера
gamemode0 grandlarc 1 // Название мода, меняем на своё ( У нас это будет new.pwn, Значит меняем grandlarc на new )
filterscripts gl_actions gl_realtime gl_property gl_mapicon ls_mall attachments skinchanger vspawner // Удаляем: gl_actions gl_realtime gl_property gl_mapicon ls_mall attachments skinchanger vspawner
announce 0 // Не меняем
query 1 // Не меняем
chatlogging 0 // Не меняем
weburl www . sa — mp . com // Web-адресс сервера
onfoot_rate 40 // Не меняем
incar_rate 40 // Не меняем
weapon_rate 40 // Не меняем
stream_distance 300.0 // Не меняем
stream_rate 1000 // Не меняем
maxnpc 0 // Не меняем
logtimeformat [% H :% M :% S ] // Не меняем
Поменяли? Но это ещё не все, приписываем ко всему строку:
— Это плагины, объясню позже
У нас получиться что-то вроде этого:
echo Executing Server Config .
lanmode 0
rcon_password 12345
maxplayers 500
port 7777
hostname New RP | Client : 0.3x
gamemode0 new 1
filterscripts
announce 0
query 1
chatlogging 0
weburl www .
onfoot_rate 40
incar_rate 40
weapon_rate 40
stream_distance 300.0
stream_rate 1000
maxnpc 0
logtimeformat [% H :% M :% S ]
plugins streamer mysql
И так, если вы хотите чтобы ваш мод работал правильно, то вам следующие плагины:
Стример
1. Streamer.inc, который лежит в папке pawno/include закидываем к себе в папку pawno/include вашего сервера.
2. Streamer.dll, который лежит в папке plugins закидываем в папку plugins вашего сервера. Примечание: Если сервер находиться на оси Linux, то закидываем Streamer.so, в server.cfg все плагины должны быть написаны с расширением .so.
Например: Streamer.so
Ну все. Нам нужны только эти два файла.
MySQL R39-2 — Мы будем использовать плагин R39-2
1. a_mysql.inc закидываем к себе в папку pawno/include вашего сервера.
2. mysql.dll закидываем в папку plugins вашего сервера.
3. libmysql.dll обязательно кидаем в папку с сервером
Денвер — И самое главное, это Denwer (Denwer обеспечит нам Базу Данных MySQL PhpMyAdmin).
Устанавливаем Denwer. Думаю, вопросы по его установке не возникнут.
И так, установили Denwer, закинули плагины? Тогда поехали.
Для начала заходим в папку своего сервера, видим там другую папку «pawno«, заходим в неё. Далее заходим в саму программу pawno.exe Давайте начнем писать наш мод. Нажмем на самую первую иконку «New«. Мы создали новый мод, если мы сохраним его под названием «new» в папку «gamemodes» запустим сервер и зайдем на него ( для захода используйте IP: 127.0.0.1 ), то увидим всем знакомого негра CJ в районе Лас Вентураса, как мы видим это ещё не совсем Role Play мод, так давайте его уже наконец начнем делать! Идем в pawno и начинаем работу. Для начала давайте впишем наши инклуды таким образом:
После строки:
Для начала давайте удалим ненужные нам строки:
#if defined FILTERSCRIPT
public OnFilterScriptInit ()
<
print ( «\n—————————————» );
print ( » Blank Filterscript by your name here» );
print ( «—————————————\n» );
return 1 ;
>
public OnFilterScriptExit ()
<
return 1 ;
>
main ()
<
if ( mysql_errno ())
printf ( » Подключение к базе `%s` не успешно» , mysql_db );
else
printf ( » Подключение к базе `%s` успешно» , mysql_db );
>
Кстати немного о main().
Как вы видите функция print при запуске мода покажет нам текст в консоле который мы с вами ввели. Вы можете добавить ещё полей и написать в них что угодно. Так-же функция print служит для поиска багов в моде. Например у вас не работает функция, постепенно вставляйте print в код
Пример: (при проверке рекомендую использовать print)
stock Some_Function ( playerid )
<
print ( «Проверяем подключен ли игрок» );
if ( IsPlayerConnected ( playerid )) // Если игрок подключен,то
<
printr ( «Проверку прошли, ставим погоду» );
SetPlayerWeather ( playerid , 10 ); // Выводим ему погоду id 10
print ( «Паблик успешно выполнен» );
>
>
Немного истории.
При написании мода используются различные символы и переменные, разберем их.
Но вернемся к моду И так, удаляем строку:
Удалили? Отлично, перейдем к разборке самого мода.
Давайте для начала пропишем данные к базе MySQL, для этого отступаем одну строку после инклудов и пишем следующее:
#define mysql_host «localhost» // если запускаем сервер у себя на компьютере, то оставляем
#define mysql_db «samp» // имя базы данных mysql
#define mysql_user «root» // пользователь Mysql
#define mysql_pass «» // пароль от mysql
Далее давайте отступим ещё одну строчку и вставим следующую строку:
Также отступаем одну строку и вставляем:
enum pInfo
<
Key [ 128 ], //переменная пароля
Level //уровень игрока
>;
new PlayerInfo [ MAX_PLAYERS ][ pInfo ];
Далее идем чуть ниже,в public OnGameModeInit() и вставляем туда следующее:
mysql_variable = mysql_connect ( mysql_host , mysql_user , mysql_db , mysql_pass );
SetGameModeText ( «Register R39-2» );
В итоге у нас получится такой паблик (public):
public OnGameModeInit ()
<
mysql_variable = mysql_connect ( mysql_host , mysql_user , mysql_db , mysql_pass );
SetGameModeText ( «Register R39-2» );
AddPlayerClass ( 0 , 1958.3783 , 1343.1572 , 15.3746 , 269.1425 , 0 , 0 , 0 , 0 , 0 , 0 );
return 1 ;
>
Далее таким же образом вставляем следующее в public OnGameModeExit():
В public OnPlayerConnect(playerid):
static const
str [] = «SELECT `Name` FROM `Accounts` WHERE `Name` = ‘%s'» ;
const
size = sizeof ( str )- 2 + MAX_PLAYER_NAME ;
mysql_real_escape_string ( Name ( playerid ), Name ( playerid ));
format ( string , sizeof (string), str , Name ( playerid ));
mysql_function_query ( mysql_variable , string , true , «OnPlayerRegCheck» , «d» , playerid );
В public OnPlayerText(playerid, text[]):
if(! GetPVarInt ( playerid , «Logged» ))
return ! SendClientMessage ( playerid , — 1 , «Что бы писать в чат, нужно быть авторизированым.» );
В public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]):
switch( dialogid )
<
case 1 : //Регистрация
<
if ( inputtext [ 0 ] == ‘\0’ )
return ShowPlayerDialog ( playerid , 1 , DIALOG_STYLE_INPUT , «Регистрация» , «Добро пожаловать на сервер!\nВаш аккаунт не зарегистрирован!\n\nВведите пароль:» , «Далее» , «Отмена» );
OnPlayerRegister ( playerid , inputtext );
return 1 ;
>
case 2 : //Авторизация
<
if ( inputtext [ 0 ] == ‘\0’ )
return ShowPlayerDialog ( playerid , 2 , DIALOG_STYLE_PASSWORD , «Авторизация» , «Здравствуйте!\n\nВы зарегистрированы!\nВведите пароль:» , «Вход» , «Отмена» );
OnPlayerLogin ( playerid , inputtext );
return 1 ;
>
>
stock OnPlayerRegister ( p , password [])
<
static const
str [] = «INSERT INTO `Accounts` (`Name`, `Key`) VALUES (‘%s’, ‘%s’)» ;
const
size = sizeof ( str )- 2 + MAX_PLAYER_NAME — 2 + 128 ;
new
string [ size ];
format ( string , sizeof (string), str , Name ( p ), password );
mysql_function_query ( mysql_variable , string , false , «RegisterCallback» , «d» , p );
return 1 ;
>
public RegisterCallback ( playerid );
public RegisterCallback ( playerid )
<
SendClientMessage ( playerid , — 1 , «Вы успешно зарегистрировались!» );
SetPVarInt ( playerid , «Logged» , 1 );
SpawnPlayer ( playerid );
return 1 ;
>
SavePlayer ( p )
<
if ( GetPVarInt ( p , «Logged» ) > 0 )
<
static const
str0 [] = «UPDATE `Accounts` SET `Key`, `Level` = ‘%d'» ,
str1 [] = «%s WHERE `Name` = ‘%s'» ;
const
size0 = sizeof ( str0 )- 2 + 128 — 2 + 16 ,
size1 = sizeof ( str1 )- 2 + 128 — 2 + MAX_PLAYER_NAME ;
#if size0>size1
#define size size0
#else
#define size size1
#endif
new
string [ size ];
format ( string , sizeof (string), str0 , PlayerInfo [ p ][ Key ], PlayerInfo [ p ][ Level ]);
format ( string , sizeof (string), str1 , string , Name ( p ));
mysql_query ( mysql_variable , string , false );
>
return 1 ;
>
stock OnPlayerLogin ( i , password [])
<
static const
str [] = «SELECT * FROM `Accounts` WHERE `Name` = ‘%s’ AND `Key` = ‘%s'» ;
const
size = sizeof ( str )- 2 + MAX_PLAYER_NAME — 2 + 128 ;
new
string [ size ];
format ( string , sizeof (string), str , Name ( i ), password );
mysql_function_query ( mysql_variable , string , true , «LoginCallback» , «ds» , i , password );
return 1 ;
>
public LoginCallback ( i , password []);
public LoginCallback ( i , password [])
<
static const
str [] = «Вы ввели неверный пароль ( попыток: %i/ 3 )» ;
new
rows ,
fields ,
maximum [ 128 ],
string [ sizeof ( str )- 2 + 1 ];
cache_get_data ( rows , fields );
if (! rows )
<
if ( GetPVarInt ( i , «wrongPass» ) == 2 )
return SendClientMessage ( i , — 1 , «Вы ввели неверный пароль уже 3 раза. Вы кикнуты.» ), Kick ( i );
SetPVarInt ( i , «wrongPass» , GetPVarInt ( i , «wrongPass» ) + 1 );
format ( string , sizeof (string), str , 3 — GetPVarInt ( i , «wrongPass» ));
ShowPlayerDialog ( i , 2 , DIALOG_STYLE_PASSWORD , «Авторизация» , string , «Вход» , «Выход» );
return 1 ;
>
cache_get_field_content ( 0 , «Level» , maximum ), PlayerInfo [ i ][ Level ] = strval ( maximum );
SetPVarInt ( i , «Logged» , 1 );
SendClientMessage ( i , — 1 , «Вы успешно авторизовались!» );
SpawnPlayer ( i );
SavePlayer ( i );
return 1 ;
>
Этим этапом мы с вами сделали регистрацию, и авторизацию на сервере. Спасибо Jeff_Hardy за данные коды по регистрации и авторизации.
Но это ещё не все, давайте запустим наш Denwer, далее в адресной строке наберем следующую ссылку: http://localhost/Tools/phpMyAdmin/
Создадим нашу Базу Данных samp и зайдем в неё, зайдя в неё мы с вами увидим сверху вкладочку «SQL» или «Структура», жмем на неё.
В появившемся поле мы вставим следующий код:
CREATE TABLE IF NOT EXISTS ` Accounts `
(
` Name ` varchar ( 24 ) COLLATE cp1251_bin NOT NULL ,
` Key ` varchar ( 30 ) CHARACTER SET utf8 NOT NULL ,
` Level ` int ( 3 ) NOT NULL
)
ENGINE = MyISA
Все готово! Теперь мы можем скомпилировать мод (F5) и запустить его.
Автор: Pro-Pawn Team
Исходники: Мод
Источник статьи: http://sampawno.ru/viewtopic.php?t=8057