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

daltwb
Освоившийся

Привет всем "обитателям" форума 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
Великий Гуру

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

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


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

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

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


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

@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

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


Ссылка на сообщение
Поделиться на другие сайты
WW.INC
Новичок

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

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


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

КЛасс, а подскажите как отделы сдлелать для организации?

 

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


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

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

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

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

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


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

Войти

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


Войти

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

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

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

    • Андрей Лазарев
      От Андрей Лазарев
      ROSTOV-HOST.RU - Современный Хостинг Игровых Серверов по невероятно низким ценам и удобной панелью управления 

      — Защита от DDoS-атак 
      — Бесплатная техническая поддержка 
      — Доступ в панель управления и личный кабинет 
      — Переустановка игрового сервера в любое время суток 
      — Редактирование конфигурационных файлов игрового сервера 
      — FTP доступ к файлам игрового сервера 
      — Мониторинг процессов 
      — Изменение количества слотов игрового сервера 
      — Система управления счетами и оплаты услуг 
      — Локальная MySQL база данных 
      — Автоустановка модов
      — Смена (версии / игры) сразу в панели управления


      Цены: с помесячной оплатой
      — GTA: SAMP              - 1слот / 0.40копп.
      — GTA: CRMP              - 1слот / 0.40копп.
      — GTA: MTA                 - 1слот / 0.80копп.
      — GTA: United MP       - 1слот / 0.80копп.
      — MineCraft: PE           - 1слот / 3.00копп.
      — MineCraft                  - 1слот / 5.00копп.
      — Counter Strike 1.6    - 1слот / 4.00копп.
       
      Цены: плати один раз пользуйся до скончания веков
      — 1 200 руб / SA:MP 0.3е/ CR:MP 0.3е/ МТА /    500 слотов
      — 1 800 руб / SA:MP 0.3.7/ CR:MP 0.3.7/ МТА /    1000 слотов
       

      Сайт: https://rostov-host.ru
      Группа в VK: https://vk.com/rostov_host
       
       
    • FanVan
      От FanVan

       
      Дешевый хостинг серверов SAMP, CRMP, Minecraft: Java & Bedrock Edition
       
      Помогаем запуститься начинающим проектам без больших вложений.
      Сделаем так, чтобы твои затраты на хостинг уменьшились без потери качества.
       
      Размещаем серверы в Хельсинках, Финляндия на процессоре частотой до 4.8 ГГц и NVMe диске.
      У нас нет красивого сайта, покупка услуг производится через бота в ЛС группы, а управление сервером -- посредством панели Pterodactyl.
      Мы не ограничиваем тебя слотами: все тарифы -- это маленькие компьютеры, ты волен сам устанавливать максимальное количество игроков, без повышения стоимости.
       
      К нам обращаются, когда хостинг начинает съедать большую часть бюджета из-за того, что хостер захотел выпендриться и добавил бесполезный функционал. Но лучше обратиться еще в начале, чтобы уменьшить затраты на хостинг и вложить как можно больше в рекламу.
       
      Никто не идеален, ничто не идеально: мы не можем помочь
      если у тебя высоконагруженный проект если тебе требуется защита от DDOS если тебе нужен пинг -1 если тебе важна автоустановка модов  
      Но ты можешь написать нам в тех. поддержку и, возможно, мы подберем более мощный тариф на отдельном сервере персонально для тебя по цене ниже, чем у других.
       
      Мы стремимся сделать создание сервера доступным каждому. Если остались вопросы или хочешь протестировать оборудование, напиши нам в ЛС группы.
    • 9at0z
      От 9at0z
      Flatgame.ru - Хостинг игровых серверов. Gta SAMP: 0.50коп/слот Gta СRMP: 0.50коп/слот MTA: 0.50коп/слот Minecraft: 5руб/слот Counter Stire 1.6: 7руб/слот Все сервера с автоусновкой модов, которые есть доступны. Обширная панель управления сервером. Тестовый периуд 3 дня. И очень много чего интересного!