В теме 6 сообщений

Привет всем "обитателям" форума pawno-rus.ru

В этом уроке я покажу как создать желаемую фракцию в pawno

В этом уроке будет:

[1] Создание самой фракции;

[2] Создание фракционных машин(с проверкой, состоит ли игрок в данной организации или нет);

[3] Создание пикапов входа и выхода в интерьер;

[4] Создание команды /makeleader и /warehouse;

[5] Сохранение всего в базе данных MySQL (R41);

Все нужные инклуды и плагины:

(текст кликабелен)

Pawn.CMD

sscanf

#include <a_samp>
#include <a_mysql>
#include <Pawn.CMD>
#include <sscanf2>

Начнем на примере будет организация LSPD! Если вы найдете какие-то баги, недоработки и т.д. и т.п. то пишите сюда или мне в личку ВК: vk.com/martun_mkrt

 

Для начала вставьте это в начало вашего мода(где хранятся все дефайны)

#define GN(%0)      	player_name[%0]
#define SCM         	SendClientMessage
#define SPD         	ShowPlayerDialog
#define DSI				DIALOG_STYLE_INPUT
#define DSL				DIALOG_STYLE_LIST
#define DSM             DIALOG_STYLE_MSGBOX
#define DSTH            DIALOG_STYLE_TABLIST_HEADERS
#define DSP             DIALOG_STYLE_PASSWORD
#define SCMTA           SendClientMessageToAll
//
#if !defined isnull
#define isnull(%0)      ((!(%0[0])) || (((%0[0]) == '\1') && (!(%0[1]))))
#endif
//
new
  	connect_mysql, // подключение к базе данных
	lspd_pick[7], //Кол-во пикапов
	lspd_car[27], //Кол-во машин

	Float: pos_pick[3][MAX_PLAYERS],
	bool: anti_flood_pick[MAX_PLAYERS char],
	leaders_info[1][4+1] = {	//При создании нововй фракции то учитывайте название (не более 4 символов)
	"LSPD"
};

Затем рядом со всеми енумами создаем новый:

enum mInfo
{
	mLSPD,
}

Затем в enum dInfo и pInfo -  вставляем следущий код(если нету enum dInfo то создаем):

enum pInfo // если у вас уже есть этот енум и все эти значения то заменяйте их на свои
{
	pID,
	pName[MAX_PLAYER_NAME],
	pPass[65],
	pSkin,
	pLeader,
	pModel,
	pMember,
	pRank,
}
new PlayerInfo[MAX_PLAYERS][pInfo];

enum dInfo
{
	DLG_LSPD,
}

Создаем паблик с телом:

public OnPlayerStateChange(playerid, newstate, oldstate)
{
	new
	    carid = GetPlayerVehicleID(playerid);

	if(newstate == PLAYER_STATE_DRIVER)
	{
	    if(carid >= lspd_car[0] && carid <= lspd_car[26])
	    {
	        if(PlayerInfo[playerid][pMember] == 1) { }// PlayerInfo - меняем на свое
	        else
	        {
	            RemovePlayerFromVehicle(playerid);
	            SCM(playerid, COLOR_GREY, !"Транспорт принадлежит Депортаменту г. Лос-Сантос!");
	        }
	    }
	}
	return true;
}

Потом находим паблик OnDialogOnDialogResponse, и в тело кидаем этот код:

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
	switch(dialogid)
	{
		case 19:
		{
		    if(response)
		    {
				switch(listitem)
				{
				    case 0:
				    {
				        static const
						    fmt_str[] = "%s взял Deagle со склада";
						new
						    string[sizeof(fmt_str)+MAX_PLAYER_NAME-1];

						format(string, sizeof(string), fmt_str, GN(playerid));
						ProxDetector(5.0, playerid, string, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE);
						GivePlayerWeapon(playerid, 24, 35);
				    }
				    case 1:
				    {
				        static const
						    fmt_str[] = "%s взял ShotGun со склада";
						new
						    string[sizeof(fmt_str)+MAX_PLAYER_NAME-1];

						format(string, sizeof(string), fmt_str, GN(playerid));
						ProxDetector(5.0, playerid, string, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE);
				        GivePlayerWeapon(playerid, 25, 20);
				    }
				    case 2:
				    {
				        static const
						    fmt_str[] = "%s взял MP5 со склада";
						new
						    string[sizeof(fmt_str)+MAX_PLAYER_NAME-1];

						format(string, sizeof(string), fmt_str, GN(playerid));
						ProxDetector(5.0, playerid, string, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE);
				        GivePlayerWeapon(playerid, 29, 60);
				    }
				    case 3:
				    {
				        static const
						    fmt_str[] = "%s взял дубинку со склада";
						new
						    string[sizeof(fmt_str)+MAX_PLAYER_NAME-1];

						format(string, sizeof(string), fmt_str, GN(playerid));
						ProxDetector(5.0, playerid, string, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE);
				        GivePlayerWeapon(playerid, 3, 1);
				    }
				    case 4:
				    {
				        static const
						    fmt_str[] = "%s взял сухпаёк со склада";
						new
						    string[sizeof(fmt_str)+MAX_PLAYER_NAME-1];

						format(string, sizeof(string), fmt_str, GN(playerid));
						ProxDetector(5.0, playerid, string, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE);
				        SetPlayerHealth(playerid, 100.0);
				    }
				    case 5:
				    {
				        static const
						    fmt_str[] = "%s взял бронежилет со склада";
						new
						    string[sizeof(fmt_str)+MAX_PLAYER_NAME-1];

						format(string, sizeof(string), fmt_str, GN(playerid));
						ProxDetector(5.0, playerid, string, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE);
				        SetPlayerArmour(playerid, 100.0);
				    }
				}
				DialogGunLSPD(playerid);
		    }
		}
	}
	return true;
}

Потом в конце мода создаем сток:

stock DialogGunLSPD(playerid)
{
	SPD(playerid, 19, DSTH, "Оружейный склад",
	!"\
		{FFFFFF}Имя:\t\tПатроны:\
		\n1) Deagle\t\t35\
		\n2) ShotGun\t\t20\
		\n3) MP5\t\t60\
		\n4) Дубинка\
		\n5) Сухпаёк\
		\n6) Бронежилет", "Выбрать", "Отмена\
	");
}
stock 

Потом в паблик OnPlayerPickUp кидаем это:

public OnPlayerPickUpDynamicPickup(playerid, pickupid)
{
	if(anti_flood_pick{playerid} == true)
	    return true;
	else
	{
	    anti_flood_pick{playerid} = true;
	    GetPlayerPos(playerid, pos_pick[0][playerid], pos_pick[1][playerid], pos_pick[2][playerid]);
	}
	if(pickupid == lspd_pick[0])
	{
	    SetPlayerPos(playerid, 246.5715,65.2846,1003.6406); // Значения меняем на свои!
		SetPlayerFacingAngle(playerid, 2.3383);
		SetPlayerVirtualWorld(playerid, 1);
		SetPlayerInterior(playerid, 6);
		SetCameraBehindPlayer(playerid);
	}
	if(pickupid == lspd_pick[1])
	{
	    SetPlayerPos(playerid, 246.7730,84.8201,1003.6406); // Значения меняем на свои!
		SetPlayerFacingAngle(playerid, 179.3500);
		SetPlayerVirtualWorld(playerid, 1);
		SetPlayerInterior(playerid, 6);
		SetCameraBehindPlayer(playerid);
	}
	if(pickupid == lspd_pick[2])
	{
	    SetPlayerPos(playerid, 1552.6343,-1675.7346,16.1953); // Значения меняем на свои!
		SetPlayerFacingAngle(playerid, 86.4747);
		SetPlayerVirtualWorld(playerid, 0);
		SetPlayerInterior(playerid, 0);
		SetCameraBehindPlayer(playerid);
	}
	if(pickupid == lspd_pick[3])
	{
	    SetPlayerPos(playerid, 1568.7280,-1693.8474,5.8906); // Значения меняем на свои!
		SetPlayerFacingAngle(playerid, 180.4991);
		SetPlayerVirtualWorld(playerid, 0);
		SetPlayerInterior(playerid, 0);
		SetCameraBehindPlayer(playerid);
	}
	if(pickupid == lspd_pick[4])
	{
	    SetPlayerPos(playerid, 316.5714,-167.7457,999.5938); // Значения меняем на свои!
		SetPlayerFacingAngle(playerid, 359.0539);
		SetPlayerVirtualWorld(playerid, 1);
		SetPlayerInterior(playerid, 6);
		SetCameraBehindPlayer(playerid);
	}
	if(pickupid == lspd_pick[5])
	{
	    SetPlayerPos(playerid, 1527.6619,-1677.7692,5.8906); // Значения меняем на свои!
		SetPlayerFacingAngle(playerid, 269.1499);
		SetPlayerVirtualWorld(playerid, 0);
		SetPlayerInterior(playerid, 0);
		SetCameraBehindPlayer(playerid);
	}
	if(pickupid == lspd_pick[6])
	{
		if(PlayerInfo[playerid][pMember] != 1)
			return SCM(playerid, COLOR_GREY, !"Вы не состоите в LSPD");
			
		DialogGunLSPD(playerid);
	}
	return true;
}

Потом перед ранее созданым стоком "stock DialogGunLspd" создаем еще два стока:

stock Pickups()
{
	// LSPD
	lspd_pick[0] = CreateDynamicPickup(1318, 23, 1555.5059,-1675.7415,16.1953); // дверь улица 
	lspd_pick[1] = CreateDynamicPickup(1318, 23, 1568.6741,-1689.9702,6.2188); // дверь гаража улицы
	lspd_pick[2] = CreateDynamicPickup(1318, 23, 246.8043,62.3237,1003.6406, 1, 6); // дверь в участке
	lspd_pick[3] = CreateDynamicPickup(1318, 23, 246.4056,88.0078,1003.6406, 1, 6); // дверь в гараж
	lspd_pick[4] = CreateDynamicPickup(1318, 23, 1524.4835,-1677.8490,6.2188); // дверь в оружейную
	lspd_pick[5] = CreateDynamicPickup(1318, 23, 316.3202,-170.2966,999.5938); // дверь из оружейной
	lspd_pick[6] = CreateDynamicPickup(2061, 23, 312.1859,-168.7103,999.5938); // Боеприпасы
}
stock Cars()
{
	// LSPD
    lspd_car[0] = AddStaticVehicleEx(596, 1602.4960, -1683.9705, 5.6106, 89.9966, 0, 1, 600); // координаты изменяем по своему усмотрению
	lspd_car[1] = AddStaticVehicleEx(596, 1602.4961, -1688.1863, 5.6106, 89.9944, 0, 1, 600);
	lspd_car[2] = AddStaticVehicleEx(596, 1602.4960, -1692.1858, 5.6106, 89.9963, 0, 1, 600);
	lspd_car[3] = AddStaticVehicleEx(596, 1602.4961, -1696.4399, 5.6106, 89.9965, 0, 1, 600);
	lspd_car[4] = AddStaticVehicleEx(596, 1602.4961, -1700.4475, 5.6105, 89.9928, 0, 1, 600);
	lspd_car[5] = AddStaticVehicleEx(596, 1602.4973, -1704.7720, 5.6111, 89.9599, 0, 1, 600);
	lspd_car[6] = AddStaticVehicleEx(596, 1591.1188, -1710.8458, 5.6106, 359.9953, 0, 1, 600);
	lspd_car[7] = AddStaticVehicleEx(596, 1587.0615, -1710.8457, 5.6106, 359.9914, 0, 1, 600);
	lspd_car[8] = AddStaticVehicleEx(596, 1582.9340, -1710.8418, 5.6106, 359.9973, 0, 1, 600);
	lspd_car[9] = AddStaticVehicleEx(596, 1578.0387, -1710.8459, 5.6106, 359.9960, 0, 1, 600);
	lspd_car[10] = AddStaticVehicleEx(596, 1574.0431, -1710.8464, 5.6115, 359.9565, 0, 1, 600);
	lspd_car[11] = AddStaticVehicleEx(596, 1569.6342, -1710.8481, 5.5788, 359.9579, 0, 1, 600);
	lspd_car[12] = AddStaticVehicleEx(596, 1558.3914, -1710.8352, 5.6231, 359.9962, 0, 1, 600);
	lspd_car[13] = AddStaticVehicleEx(596, 1584.5720, -1672.3798, 5.6135, 269.9952, 0, 1, 600);
	lspd_car[14] = AddStaticVehicleEx(596, 1584.5693, -1668.1559, 5.6123, 269.9404, 0, 1, 600);
	lspd_car[15] = AddStaticVehicleEx(523, 1545.6881, -1684.3760, 5.4628, 89.8548, 0, 1, 600);
	lspd_car[16] = AddStaticVehicleEx(523, 1545.6832, -1680.3370, 5.4628, 90.0000, 0, 1, 600);
	lspd_car[17] = AddStaticVehicleEx(523, 1545.6796, -1676.2489, 5.4715, 90.0000, 0, 1, 600);
	lspd_car[18] = AddStaticVehicleEx(523, 1545.6934, -1672.1342, 5.4719, 90.0000, 0, 1, 600);
	lspd_car[19] = AddStaticVehicleEx(523, 1545.7043, -1667.6414, 5.4657, 89.5909, 0, 1, 600);
	lspd_car[20] = AddStaticVehicleEx(523, 1545.6930, -1663.1404, 5.4719, 90.0000, 0, 1, 600);
	lspd_car[21] = AddStaticVehicleEx(601, 1545.4475, -1659.0334, 5.6477, 89.9272, 0, 1, 600);
	lspd_car[22] = AddStaticVehicleEx(601, 1545.4456, -1655.0054, 5.6652, 89.9993, 0, 1, 600);
	lspd_car[23] = AddStaticVehicleEx(427, 1538.1487, -1644.9996, 6.0336, 180.0003, 0, 1, 600);
	lspd_car[24] = AddStaticVehicleEx(427, 1534.1730, -1644.9996, 6.0335, 180.0002, 0, 1, 600);
	lspd_car[25] = AddStaticVehicleEx(427, 1529.9532, -1644.9991, 6.0335, 180.0003, 0, 1, 600);
	lspd_car[26] = AddStaticVehicleEx(497, 1559.2762,-1644.1458,28.5774,90.9602, 0, 1, 600);
}

Потом после стока  "DialogGunLSPD" создаем еще два стока:

stock LoadMaterials()
{
	mysql_query(connect_mysql, "SELECT * FROM `materials`");
	materials[mlspd] = cache_get_field_content_int(0, "LSPD");
}
stock SaveMaterials()
{
    static const
	    fmt_str[] = "UPDATE `materials` SET `LSPD` = '%d'";
	new
	    string[sizeof(fmt_str)+5];

	format(string, sizeof(string), fmt_str, materials[mLSPD]);
	mysql_tquery(connect_mysql, string, false, "", "");
}

ВНИМАНИЕ: НЕ ЗАБУДТЕ СОЗДАТЬ В БАЗЕ ДАННЫХ НОВУЮ ТАБЛИЦУ "materials" и внести туда столбец LSPD со значением INT 

 

В конце мода создаем команду для проверки материалов:

CMD:warehouse(playerid)
{
	if(PlayerInfo[playerid][pMember] == 0)
	    return SCM(playerid, COLOR_GREY, !"Вы не уполномочены использовать данную команду!");
	    
	switch(PlayerInfo[playerid][pMember])
	{
	    case 1:
	    {
	        static const
			    fmt_str[] = "Склад LSPD: %d/100000";
			new
			    string[sizeof(fmt_str)+5];

			format(string, sizeof(string), fmt_str, materials[mLSPD]);
			SCM(playerid, COLOR_BLUE, string);
	    }
	}
	return true;
}

И в начало мода создаем дефайны цветов чтобы не было ошибок:

#define COLOR_WHITE 	0xFFFFFFFF
#define COLOR_LIGHTRED 	0xFF463CFF
#define COLOR_GREY      0xA6A69FFF
#define COLOR_GREY_2 	0xC8C8C8C8
#define COLOR_GREY_3 	0xAAAAAAAA
#define COLOR_GREY_4 	0x8C8C8C8C
#define COLOR_RED       0xFF0000FF
#define COLOR_ORANGE    0xDF8600FF
#define COLOR_GREEN     0x2CB816FF
#define COLOR_YELLOW    0xFFFF00FF
#define COLOR_BLUE      0x00BFFFFF
#define COLOR_PURPLE 	0xC2A2DAAA

И последнее! 

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

GetPlayerName(playerid, player_name[playerid], MAX_PLAYER_NAME);
 	static
	    fmt_str[] = "SELECT `ID` FROM `accounts` WHERE `Name` = '%s' LIMIT 1";
	new
	    string[sizeof(fmt_str)+MAX_PLAYER_NAME-1];

А в паблик OnPlayerDisconnect добавляем:

	static
	    fmt_str[] = "UPDATE `ID` FROM `accounts` WHERE `Name` = '%s' LIMIT 1";
	new
	    string[sizeof(fmt_str)+MAX_PLAYER_NAME-1];

НЕ ЗАБУДЬТЕ СОЗДАТЬ В БАЗЕ ДАННЫХ ТАБЛИЦУ "accounts" и добавить туда столбцы из enum pInfo, только без первой буквы "p".

 

Если будут ошибки/проблемы обращайтесь!

 

VK: wk.com/martun.mkrt

Отредактировано пользователем daltwb

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно было тогда и название фракции хранить в базе и ранги.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@SCRIPTMANЗачем? Если это уже все прописано в моде

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@daltwb ну раз система фракций на MySQL, тогда бы и фракции стали динамическими(названия рангов и т. д. в игре можно было бы менять)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@SCRIPTMAN Хорошо, вот сток с рангами:

stock RankName(playerid)
{
	new atext[64];
	switch(PlayerInfo[playerid][pMember])
	{
	case 0:
		{
			switch(PlayerInfo[playerid][pRank])
			{
			case 0: atext = "Áåçðàáîòíûé";
			}
		}
	case 1:
		{
			switch(PlayerInfo[playerid][pRank])
			{
			case 10: atext = "Шериф";
			case 9: atext = ".....";
			case 8: atext = ".....";
			case 7: atext = ".....";
			case 6: atext = ".....";
			case 5: atext = ".....";
			case 4: atext = ".....";
			case 3: atext = ".....";
			case 2: atext = "Сержант";
			case 1: atext = "Рядовой";
			}
		}
	}
	return atext;
}

А вот сохранение фракций:

stock SaveFrac(playerid, const field_name[], const set[], const type[])
{
	new
	    string[128+1];

	if(!strcmp(type, "d", true))
	{
	    mysql_format(connect_mysql, string, sizeof(string), "UPDATE `fractions` SET `%s` = '%d' WHERE `id` = '%d' LIMIT 1",
		field_name, set, PlayerInfo[playerid][pID]);
	}
    mysql_tquery(connect_mysql, string, "", "");
}

Нужно создать таблицу "fractions" добавить туда: id фракции

 

Изменение названий рангов в игре это уже должен быть другой урок, если кто-то захочет - сделаю.

Отредактировано пользователем daltwb

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Советую доработать урок и сделать со всеми рангами динамично из базы данных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • gooding
      От gooding


      Скачать файл PAR RP | Доработанный мод Cruela RP | Без багов
      Всем здравствуйте, уважаемые читатели. Я много времени потратил на доработку данного игрового мода, чтобы его выставить на форум.
      Лог доработок можно посмотреть внизу, а скриншоты игрового мода внизу и верху.
      Основа данного мода: Cruela RP
       
       

      Добавил gooding Добавлено 20.11.2024 Категория Моды Автор GOODING (Я)  
    • gooding
      От gooding
      Всем здравствуйте, уважаемые читатели. Я много времени потратил на доработку данного игрового мода, чтобы его выставить на форум.
      Лог доработок можно посмотреть внизу, а скриншоты игрового мода внизу и верху.
      Основа данного мода: Cruela RP
       
       

    • Max Luilchack
      От Max Luilchack
      Нужен человек который сможет сделать примерную карту Украины для сервера crmp mobile. Если есть желающие пишите в дс: lamarlml
    • Yashich
      От Yashich
      Возникла проблема, не работает команда /giverank Что здесь может работать не так? Заранее спасибо за ответ)
      Вот строки кода связанные с этой командой (мод Аризона)
       
      CMD:giverank(playerid, params[]) {     if(PI[playerid][pMember]<=0)return 0;     if(PI[playerid][pRank] < 9 && PI[playerid][pLeader] == 0) return SCM(playerid, COLOR_RED, !"Отказано в доступе!");     if(sscanf(params,"ud",params[0],params[1])) return SCM(playerid, COLOR_RED, !"Используйте: /giverank [id] [rank]");     if(!ProxDetectorS(8.0, playerid, params[0])) return SCM(playerid, COLOR_GREY, !"Вы должны находиться рядом с игроком!");     if(PI[params[0]][pLeader] > 0 ) return SCM(playerid, COLOR_RED, !"Вы не можете изменять ранг лидеру");     if(params[1] < 1) return SCM(playerid, COLOR_GREY, !"Нельзя повысить до этого ранга");     if(Clother[params[0]]!=-1)return 0;     if(GetPlayerVirtualWorld(playerid)!=GetPlayerVirtualWorld(params[0]))return 0;     if(!IsPlayerConnected(params[0])) return SCM(playerid, COLOR_GREY, !"Игрок не найден");     if(PI[playerid][pRank] <= PI[params[0]][pRank]) return SCM(playerid, COLOR_GREY, !"Вы не можете повысить/понизить этого игрока");     if(PI[playerid][pRank] == 9 && params[1] > 8) return SCM(playerid, COLOR_RED, !"Нельзя выдать ранг больше 8");     if(params[1] > 9) return SCM(playerid, COLOR_GREY, !"Нельзя повысить до этого ранга");     if(PI[params[0]][pMember] != PI[playerid][pMember]) return SCM(playerid, COLOR_GREY, !"Игрок находиться в другой организации!");     str_1[0] = EOS;     f(str_1,100,"Лидер %s %s до %i ранга",PN(playerid),PI[params[0]][pRank] > params[1] ? ("понизил"):("повысил"),params[1]);     SCM(params[0],COLOR_LIGHTBLUE,str_1);     f(str_1,100,"Вы %sи игрока %s до %i ранга",PI[params[0]][pRank] > params[1] ? ("понизил"):("повысил"),PN(params[0]),params[1]);     SCM(playerid,COLOR_LIGHTBLUE,str_1);     PI[params[0]][pRank] = params[1];     UpdatePlayerDataInt(params[0], "Rank", params[1]);     if(PI[params[0]][pSex] == 2) if(TeamDuty{params[0]}) SetPlayerSkinEx(params[0],GOrgSkins[GetTeamID(params[0])][params[1]]), TogglePlayerControllable(params[0],true);     else if(TeamDuty{params[0]}) SetPlayerSkinEx(params[0],MOrgSkins[GetTeamID(params[0])][params[1]]), TogglePlayerControllable(params[0],true);     return 1; }