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

Привет всем "обитателям" форума 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 пользователей онлайн

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

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

    • Dev_Persona
      От Dev_Persona
      Приветствую всех, у меня возник такой вопрос:
       
      - хочу изменить базовую регистрацию в админке в крмп, на Болле сложную то-есть, сейчас изначально пароль от админки может быть только из цифр, хотелось бы узнать как можно было бы сделать что бы можно было использовать и цифры и буквы, вот код:
       
      case DIALOG_ADMIN_REG:
         {
          if(!response) return FixKick(playerid);
       
          if(strval(inputtext) < 100000 || strval(inputtext) > 999999) return ShowPlayerDialog(playerid, DIALOG_ADMIN_REG, DIALOG_STYLE_INPUT, "{FF6347}"PROJECT_NAME" {ffffff}| Придумайте пароль", "{FFFFFF}Для того, чтобы продолжить дальше - придумайте и введите\n{FFFFFF}пароль от панели администратора в диалоговое поле ниже.\n\n{FFFFFF}Пароль должен быть из 6 цифр.\n", "Готово", "");
                   SetPlayerData(playerid, P_APASS, strval(inputtext));
       
                   UpdatePlayerDatabaseInt(playerid, "AdminPassword", GetPlayerData(playerid, P_APASS));
       
                   AdminAuthorization(playerid);
         }
    • MetaLife Online
      От MetaLife Online
      Приветствую! Код мода не отпровляет данные на БД все правильно подключенно и написанно(копировал с phpmyadmin) но данные не отпровляет. но с БД на сервер приходит сообщение 
       
      new MySQL:dbHandle; new MySQL:dbHandle; #define Host "127.0.0.1" #define User "root" #define DataBase "metalife" #define Password_SQL "" dbHandle = mysql_connect(Host,User,Password_SQL, DataBase);     if(mysql_errno())     {         printf("Подключение к базе данных %s не удалось.",DataBase); // %s означает строку. То есть будет выводить название базы данных которое указано в #define DataBase     }     else     {         printf("Подключение к базе данных %s успешно",DataBase);     }     format(query, sizeof(query), "INSERT INTO `Users`(`Nick`, `Password`, `Gender`, `Skin`) VALUES ('%s','%s','%d','%d')",player_name, player_info[playerid][P_PASS], player_info[playerid][P_GENDER], player_info[playerid][P_SKIN]);     mysql_tquery(dbHandle, query); SA-MP Dedicated Server ---------------------- v0.3.7-R2, (C)2005-2015 SA-MP Team [15:34:54] weburl = "www.sa-mp.com"  (string) [15:34:54]  [15:34:54] Server Plugins [15:34:54] -------------- [15:34:54]  Loading plugin: mysql [15:34:55]  >> plugin.mysql: R41-4 successfully loaded. [15:34:55]   Loaded. [15:34:55]  Loaded 1 plugins. [15:34:55]  [15:34:55] Filterscripts [15:34:55] --------------- [15:34:55]   Loaded 0 filterscripts. [15:34:55] Подключение к базе данных metalife успешно [15:34:55]  ---------------------------------- [15:34:55]  MetaLife Online [15:34:55] ---------------------------------- [15:34:55] Number of vehicle models: 1 При Регестрации не опровляються данные (фото)
      Но если записать рукой данные (фото 2)  
      выполняеться эта эта функция(фото 3(чат) и код )
      forward CheckAccountFromMySql(playerid); public CheckAccountFromMySql(playerid) {     new str[256];     if(cache_num_rows() == 0)     {         new player_name[MAX_PLAYER_NAME + 1];         GetPlayerName(playerid, player_name, MAX_PLAYER_NAME);         format(str, sizeof(str), " {ffffff}Добро пожаловать!\n Аккаунта с таким ником %s нет\nДля Регестрации придумайте и введите пароль в поле ниже!", player_name);         SPD(playerid, DLG_REG, DSP, "Регестрация", str, "Войти", "Выйти");     }     else     {         SCM(playerid, color_green, "Вы  зарегестрырованы!");     }     return 1; } // выполняеться else  ошибу и варнинги mysql
      [15:47:39] [WARNING] mysql_connect: no password specified (C:\Project\Metalife\gamemodes\MetaLife.pwn:92) dbHandle = mysql_connect(Host,User,Password_SQL, DataBase); // 92 строка   



    • MetaLife Online
      От MetaLife Online
      Привествую! писал код. проверил работу, в БД отправилось информация криво 
      потом добавил к P_NICK[MAX_PLAYER_NAME] для того чтобы все было окей. Но после этого данные вообще не отпровляються и не показываеться %s. пару раз удалял и не помогло не чего 
      enum PLAYER_INFO {     P_ID,     P_NICK[MAX_PLAYER_NAME],     P_PASS,     P_GENDER,     P_SKIN,     P_LVL, };  

    • Danny_Marcelo
      От Danny_Marcelo
      Всех приветствую. Сегодня я решил обновить систему мероприятий, т.к. на самом проекте Advance RP уже давно видоизменили систему, добавили нового функционала. Мы не должны стоять на месте и я решил тоже свою систему доработать. Вы можете использовать данную систему как аналог Advance RP или же доработать для своего проекта. Все в ваших руках как говорится.
       
      Что нового?
       
      Итак приступим:
      Находим свои переменные и вставляем:
       
      new settp = 0; // Флаг включения/выключения телепортации new Float:TeleportFloat[3]; // Координаты точки телепортации new TeleportInfo[2]; // Интерьер и виртуальный мир new Float:PlayerLastPos[MAX_PLAYERS][3]; // Последние координаты игрока new PlayerLastInt[MAX_PLAYERS]; // Последний интерьер игрока new PlayerLastVW[MAX_PLAYERS]; // Последний виртуальный мир игрока new PlayerWeapons[MAX_PLAYERS][13][2]; // Оружие игрока (слот и патроны) new PlayerUsedTP[MAX_PLAYERS]; // Флаг для отслеживания использования /tp  
      Далее идём в команды, мой случай на Pawn.CMD, но +/- везде одинаково, разве что меняется шапка
       
      CMD:settp(playerid, params[]) {     if (PlayerInfo[playerid][pAdmin] < 4) return 1;     new string[95];     if (settp == 0)     {         GetPlayerPos(playerid, TeleportFloat[0], TeleportFloat[1], TeleportFloat[2]);         TeleportInfo[0] = GetPlayerInterior(playerid);         TeleportInfo[1] = GetPlayerVirtualWorld(playerid);         settp = 1;         format(string, sizeof(string), "[A] %s[%d] установил точку телепорта для игроков. {00CC00}ТП включен.", PlayerInfo[playerid][pName], playerid);         SendAdminMessage(0x52B2B5FF, string);     }     else     {         format(string, sizeof(string), "[A] %s[%d] удалил точку телепорта для игроков. {FF6600}ТП отключен.", PlayerInfo[playerid][pName], playerid);         SendAdminMessage(0x52B2B5FF, string);         settp = 0;     }     return 1; } CMD:tp(playerid, params[]) {     if (settp == 0) return SendClientMessage(playerid, 0xCECECEFF, !"Функция отключена администратором.");     if (PlayerInfo[playerid][pJailed] >= 1) return SendClientMessage(playerid, 0xCECECEFF, !"Арестованным не разрешено покидать камеру.");     if (PlayerInfo[playerid][pRabota] != 0) return SendClientMessage(playerid, 0xCECECEFF, !"Необходимо завершить все начатые работы и активные действия.");     if (bolkam[playerid] == true) return SendClientMessage(playerid, 0xCECECEFF, !"Необходимо завершить все начатые работы и активные действия.");     GetPlayerPos(playerid, PlayerLastPos[playerid][0], PlayerLastPos[playerid][1], PlayerLastPos[playerid][2]);     PlayerLastInt[playerid] = GetPlayerInterior(playerid);     PlayerLastVW[playerid] = GetPlayerVirtualWorld(playerid);     for (new i = 0; i < 13; i++)     {         GetPlayerWeaponData(playerid, i, PlayerWeapons[playerid][i][0], PlayerWeapons[playerid][i][1]);     }     PlayerUsedTP[playerid] = 1;     ShowPlayerDialog(playerid, 22, DIALOG_STYLE_MSGBOX, !"{6699FF}Телепортация",         !"{FFFFFF}Вы уверены, что хотите попасть на место проведения мероприятия?\n{FFCD00}Ваше оружие будет изъято для хранения и возвращено позже.", !"Да", !"Нет");     return 1; }  
       
      CMD:back(playerid, params[]) {     if (!PlayerUsedTP[playerid])     {         return SendClientMessage(playerid, 0xCECECEFF, !"Эту функцию можно использовать после {FF9933}/tp, /go {CECECE}или по окончании {FF9933}мероприятий");     }     SetPlayerPos(playerid, PlayerLastPos[playerid][0], PlayerLastPos[playerid][1], PlayerLastPos[playerid][2]);     SetPlayerInterior(playerid, PlayerLastInt[playerid]);     SetPlayerVirtualWorld(playerid, PlayerLastVW[playerid]);     ResetPlayerWeapons(playerid);     for (new i = 0; i < 13; i++)     {         if (PlayerWeapons[playerid][i][0] != 0)         {             GivePlayerWeapon(playerid, PlayerWeapons[playerid][i][0], PlayerWeapons[playerid][i][1]);         }     }     PlayerUsedTP[playerid] = 0;     SendClientMessage(playerid, 0x3399FFFF, !"Вы вернулись туда, где были до телепортации");     return 1; } Ну и в OnDialogResponse:
      case 22: // Не забудьте проверить и при надобности изменить id диалога на вашу цифру или ID_NAME         {             if (response)             {                 SetPlayerPos(playerid, TeleportFloat[0], TeleportFloat[1], TeleportFloat[2]);                 SetPlayerInterior(playerid, TeleportInfo[0]);                 SetPlayerVirtualWorld(playerid, TeleportInfo[1]);                 ResetPlayerWeapons(playerid);                 SendClientMessage(playerid, 0x66CCFFFF, "Вы были доставлены на место проведения мероприятия");                 SendClientMessage(playerid, 0x66CCFFFF, "Чтобы вернуться обратно, введите {FF9900}/back");             }         } Скриншоты:
       
      Если игрок сидит в КПЗ и вводит /tp:

       
      При включенном /tp:

       
      При выключенном /tp:

       
      Сообщение администраторам:

       
      Если работаешь или лечишься в больнице:

       
      Текст после телепортации:

       
      При вводе /back 1 и более раз:

       
      P.S. Команду /tp на Advance можно нажимать бесконечно, по этому я не стал сюда пихать аналогичную проверку как в /back.
      Если что, не сложно будет добавить 1 строчку проверки. Просто имейте ввиду, что это не баг. Просто нужно же соответствовать названию темы "На 100% КОПИЯ"))
       
      Автор: Danny_Marcelo
      Размещая на другие порталы, обязательно указать автора