Доступ к архиву

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Frac vehicles system ( /lmenu ) как на GameWorld 99%

Статус
В этой теме нельзя размещать новые ответы.

Dima_Neo

Умник
Здравствуйте,уважаемые пользователи P-I.Хочу представить вашему вниманию систему фракционных машин как на GameWorld на базе Musql .

Frac vehicles system.
Автор:MacMailler. Доработка кода Salvador_Golovorez (Dima_Neo)

Код кривоват извините
:dr:

Ссылка на файлы dialog и BD

Commands:
/addfc [fracid] - Добавление транспорта.
/delfc - Удалить транспорт.
/editmode - Включения режима редактирования для администраторв 1338 уровня.
/showmodel [fracid] - Просмотр списка доступных моделей
/lmenu - Меню через которое лидер может редактировать параметры фракционных машин
- Смена ранга доступности

Установка:
- Установить плагин MySQL R5
- Установить плагин sscanf
- Указать свои данные к Базе данных.
- Залить таблицы в Базу данных.
- Залить папку dialog в scriptfiles

Ко всем #include

PHP:
#include <sscanf2>
ко всем define

PHP:
#define FC::					FC_
#define bd::					mysql_
#define FC_MAX				  (100)
#define FC_DEF_NUMBER		   "V 123 FC"

#define Send				    SendClientMessage
#define SPD				     ShowPlayerDialog

#define D_IDX		           (8000)
#define D_LMENU	             (10000 + D_IDX)
#define D_ADD_FC				(10100 + D_IDX)
#define D_DEL_FC				(10200 + D_IDX)
#define D_ADD_MODEL	         (10300 + D_IDX)
#define D_SHOW_MODEL			(10400 + D_IDX)
#define D_EDIT_MODEL			(10500 + D_IDX)

#define scf(%0,%1,%2)			format(%1,sizeof(%1),%2), strcat(%0,%1)
#define clear(%0)				%0[ 0 ] = '\0'
Ко всем enum

PHP:
enum FC::ENUM
{
	FC::ID[2],				// id траспорта
	FC::MODEL,                      // модель
	FC::FRAC,                        // фракция
	FC::RANK,                       // доступность по рангу
	FC::COLOR[2],		      // 1 цвет, 2 цвет
	FC::NUMBER[10],           // номерной знак
	Float: FC::R_POS[4],	// 0 - x. 1 - y. 2 - z. 3 - позиция
}
Ко всем new
PHP:
new query[1024], dialog[1024], FC::TOTAL;
new bool: FC::EDIT_MODE = false;
new FC::INFO[ FC::MAX ][ FC::ENUM ];
В конец мода

PHP:
stock FC::Load( )
{
	new colors[10], resp_pos[64], time = GetTickCount();
	format(query, sizeof(query), "SELECT * FROM `frac_vehicles` ORDER BY `frac_vehicles`.`ID` ASC");
	if( bd::query(query) && bd::store_result() )
	{
		new rows = bd::num_rows();
		if( rows )
		{
			if( rows > FC::MAX ) rows = FC::MAX;
			
			for( new i; i < rows; i++ )
			{
				bd::fetch_row( query );
				sscanf
				(
					query, "p<|>iiiis[10]s[10]s[64]",
					FC::INFO[ i ][ FC::ID ][ 0 ],
					FC::INFO[ i ][ FC::MODEL ],
					FC::INFO[ i ][ FC::FRAC ],
					FC::INFO[ i ][ FC::RANK ],
					colors,
					FC::INFO[ i ][ FC::NUMBER ],
					resp_pos
				);
				
				sscanf(colors, 		"p<,>a<i>[2]", FC::INFO[ i ][ FC::COLOR ]);
				sscanf(resp_pos,	"p<,>a<f>[4]", FC::INFO[ i ][ FC::R_POS ]);
				
				FC::INFO[ i ][ FC::ID ][ 1 ] =
				CreateVehicle
				(
					FC::INFO[ i ][ FC::MODEL ],
					FC::INFO[ i ][ FC::R_POS ][ 0 ],
					FC::INFO[ i ][ FC::R_POS ][ 1 ],
					FC::INFO[ i ][ FC::R_POS ][ 2 ],
					FC::INFO[ i ][ FC::R_POS ][ 3 ],
					FC::INFO[ i ][ FC::COLOR ][ 0 ],
					FC::INFO[ i ][ FC::COLOR ][ 1 ],
					1200
				);
				
				if( !strlen( FC::INFO[ i ][ FC::NUMBER ] ) )
					strmid(FC::INFO[ i ][ FC::NUMBER ], FC::DEF_NUMBER, 0, strlen(FC::DEF_NUMBER), 255);
				SetVehicleNumberPlate(FC::INFO[ i ][ FC::ID ][ 1 ], FC::INFO[ i ][ FC::NUMBER ]);
					
				FC::TOTAL ++;
			}
			
			bd::free_result();
			
			printf("FC::Load() : vehicle loaded %i; (Time: %i ticks)", FC::TOTAL, GetTickCount()-time);
		}
		else printf("FC::Load() : returned rows %i; (Time: %i ticks)", rows, GetTickCount()-time);
	}
	else printf("FC::Load() : table not found! (Time: %i; ticks)", GetTickCount()-time);
	
	return;
}

/** обновляет данные в бд */
stock FC::Update( idx )
{
	if( idx >= 0 && idx < sizeof(FC::INFO) )
	{
		new handle[64]; clear( query );
		scf( query, handle, "UPDATE `frac_vehicles` SET ");
		scf( query, handle, "`model` = '%i',", FC::INFO[ idx ][ FC::MODEL ]);
		scf( query, handle, "`frac` = '%i',", FC::INFO[ idx ][ FC::FRAC ]);
		scf( query, handle, "`colors` = '%i,%i',", FC::INFO[ idx ][ FC::COLOR ][ 0 ], FC::INFO[ idx ][ FC::COLOR ][ 1 ]);
		scf( query, handle, "`number` = '%s',", FC::INFO[ idx ][ FC::NUMBER ]);
		scf( query, handle, "`resp_pos` = '%.3f,%.3f,%.3f,%.3f' ",\
		FC::INFO[ idx ][ FC::R_POS ][ 0 ], FC::INFO[ idx ][ FC::R_POS ][ 1 ], FC::INFO[ idx ][ FC::R_POS ][ 2 ], FC::INFO[ idx ][ FC::R_POS ][ 3 ]);
		scf( query, handle, "WHERE `ID` = '%i'", FC::INFO[ idx ][ FC::ID ][ 0 ]);
		
		if( bd::query(query) ) return 1;
	}
	
	return 0;
}

/** пересоздает машину*/
stock FC::RecreateVehicle( idx )
{
	if( idx >= 0 && idx < sizeof(FC::INFO) )
	{
		DestroyVehicle( FC::INFO[ idx ][ FC::ID ][ 1 ] );
		FC::INFO[ idx ][ FC::ID ][ 1 ] =
		CreateVehicle
		(
			FC::INFO[ idx ][ FC::MODEL ],
			FC::INFO[ idx ][ FC::R_POS ][ 0 ],
			FC::INFO[ idx ][ FC::R_POS ][ 1 ],
			FC::INFO[ idx ][ FC::R_POS ][ 2 ],
			FC::INFO[ idx ][ FC::R_POS ][ 3 ],
			FC::INFO[ idx ][ FC::COLOR ][ 0 ],
			FC::INFO[ idx ][ FC::COLOR ][ 1 ],
			1200
		);
		return 1;
	}
	return 0;
}

/** удаляет машину из бд */
stock FC::Delete( idx )
{
	if( idx >= 0 && idx < sizeof(FC::INFO) )
	{
		format(query, sizeof(query), "DELETE FROM `frac_vehicles` WHERE `ID` = '%i'", FC::INFO[ idx ][ FC::ID ][ 0 ]);
		if( bd::query(query) && bd::free_result() ) return 1;
	}
	return 0;
}

/** показывает список доступных моделей ТС */
stock FC::ShowModel( playerid, fracid, dialogid )
{
	format(query, sizeof(query), "SELECT `model_id` FROM `frac_models` WHERE `frac_id` = '%i'", fracid);
	if( bd::query(query) && bd::store_result() )
	{
		new rows = bd::num_rows();
		if( rows )
		{
			new model_id;
			clear( dialog );
			for( new i; i < rows; i++)
			{
				bd::fetch_row( query );
				sscanf( query, "i", model_id );
				scf( dialog, query, "%s\n", PlayerVehicle[ model_id-400 ], model_id );
			}
			if( PlayerInfo[playerid][pAdmin] >= 1338 && dialogid != D_ADD_FC && dialogid != D_LMENU+7 ) strcat( dialog, "Äîáàâèòü");
			SPD( playerid, dialogid, DIALOG_STYLE_LIST, "Frac Models", dialog, "Enter", "Cancle");
		}
		else
		{
			if( PlayerInfo[playerid][pAdmin] >= 1338 && dialogid != D_ADD_FC && dialogid != D_LMENU+7 )
				SPD( playerid, dialogid, 2, "Frac Models", "Добавить", "Enter", "Cancle");
			else
				SPD( playerid, dialogid, 0, "Frac Models", "Нет моделей для выбора!", "ok", "");
		}
		SetPVarInt( playerid, "SelectFrac", fracid );
	}
	return;
}

stock FC::GetInfo(vehicleid, &fc_frac = 0, &fc_rank = 0, &fc_idx = 0)
{
	for(new i; i < FC::TOTAL; i++)
	{
		if( FC::INFO[ i ][ FC::ID ][ 1 ] == vehicleid )
		{
			fc_idx = i;
			fc_frac = FC::INFO[ i ][ FC::FRAC ];
			fc_rank = FC::INFO[ i ][ FC::RANK ];
			
			return 1;
		}
	}
	return 0;
}

stock FC::IsEditMode( playerid )
{
	if( PlayerInfo[playerid][pAdmin] >= 1338 && FC::EDIT_MODE) return true;
	return false;
}

stock FC::IsThereModel( frac_id, model_id )
{
	format(query, sizeof(query), "SELECT * FROM `frac_models` WHERE `frac_id` = '%i' AND `model_id` = '%i'", frac_id, model_id);
	if( bd::query(query) && bd::store_result() ) if( bd::num_rows() ) return 1;
	return 0;
}

SSCANF:vehicle(string[])
{
	// This function is VERY basic, needs VASTLY improving to detect variations.
	if ('0' <= string[0] <= '9')
	{
		new ret = strval(string);
		if (400 <= ret <= 611) return ret;
	}
	else
	{
		for(new i; i < sizeof(PlayerVehicle); i++)
		if( !strcmp(string, PlayerVehicle[i], true) ) return (i + 400);
	}
	
	return -1;
}
В public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])

PHP:
	switch( dialogid )
	{
		case D_LMENU :
		{
			if( response )
			{
				switch( listitem )
				{
					case 0 : SPD(playerid, D_LMENU+1, 0, "L-Menu: Смена цвета", "Какой цвет хотите поменять?", "[-1-]", "[-2-]");

					case 1 : SPD(playerid, D_LMENU+4, 1, "L-Menu: Смена ранга", "Введите ранг с которого будет доступно машина.", "Enter", "Back");
					
					case 2 : SPD(playerid, D_LMENU+5, 1, "L-Menu: Смена номера", "Введите новый номер(макс 8 символов)", "Enter", "Back");
					
					case 3 : SPD(playerid, D_LMENU+6, 0, "L-Menu: смена места спавна", "Смените места спавно этого авто?", "Enter", "Back");
					
					case 4 :
					{
						if( FC::IsEditMode( playerid ) )
						{
							new idx, v_frac, v_rank, carid = GetPlayerVehicleID(playerid);
							if( FC::GetInfo( carid, v_frac, v_rank, idx ) ) FC::ShowModel( playerid, v_frac, D_LMENU+7 );
						}
						else FC::ShowModel( playerid, GetFracID( playerid ), D_LMENU+7 );
					}
				}
			}
			return 1;
		}
		
		case D_LMENU+1 :
		{
			if( response )
			{
				LoadText("dialog/lmenu/colors.lst", dialog);
				SPD(playerid, D_LMENU+2, 1, "L-Menu: Смена цвета", dialog, "Enter", "Cancel");
			}
			else
			{
				LoadText("dialog/lmenu/colors.lst", dialog);
				SPD(playerid, D_LMENU+3, 1, "L-Menu: Смена цвета", dialog, "Enter", "Cancel");
			}
			return 1;
		}
		
		case D_LMENU+2 :
		{
			if( response )
			{
				if( sscanf(inputtext, "i", inputtext[0]) )
				{
					Send(playerid, COLOR_GREY, "* Вы оставили поле ввода пустым!");
					LoadText("dialog/lmenu/colors.lst", dialog);
					SPD(playerid, D_LMENU+2, 1, "L-Menu: Смена цвета", dialog, "Enter", "Cancel");
				}
				else if( inputtext[0] < 0 || inputtext[0] > 126 )
				{
					Send(playerid, COLOR_GREY, "* Вы ввели не правильный ID цвета!");
					LoadText("dialog/lmenu/colors.lst", dialog);
					SPD(playerid, D_LMENU+2, 1, "L-Menu: Смена цвета", dialog, "Enter", "Cancel");
				}
				else
				{
					new idx, v_frac, v_rank, carid = GetPlayerVehicleID(playerid);
					if( FC::GetInfo( carid, v_frac, v_rank, idx ) )
					{
						if( v_frac == PlayerInfo[playerid][pLeader] && !FC::IsEditMode( playerid ) )
						{
							new Float: posx, Float: posy, Float: posz, Float: posa;
							GetVehiclePos(carid, posx, posy, posz); GetVehicleZAngle(carid, posa);
							
							FC::INFO[ idx ][ FC::COLOR ][ 0 ] = inputtext[0];
							FC::RecreateVehicle( idx ); FC::Update( idx );
							
							SetVehiclePos(FC::INFO[ idx ][ FC::ID ][ 1 ], posx, posy, posz); SetVehicleZAngle(carid, posa);
							SetVehicleNumberPlate(FC::INFO[ idx ][ FC::ID ][ 1 ], FC::INFO[ idx ][ FC::NUMBER ]);
							PutPlayerInVehicle(playerid, FC::INFO[ idx ][ FC::ID ][ 1 ], 0);
							
							format(string, sizeof(string),"* Цвет машины был изменен: %d", inputtext[0]);
							Send(playerid, COLOR_WHITE, string);
						}
						else Send(playerid, -1, "* Вы не лидер!");
					}
				}
			}
			
			return 1;
		}
		
		case D_LMENU+3 :
		{
			if( response )
			{
				if( sscanf(inputtext, "i", inputtext[0]) )
				{
					Send(playerid, COLOR_GREY, "* Вы оставили поле ввода пустым!");
					LoadText("dialog/lmenu/colors.lst", dialog);
					SPD(playerid, D_LMENU+3, 1, "L-Menu: Смена цвета", dialog, "Enter", "Cancel");
				}
				else if( inputtext[0] < 0 || inputtext[0] > 126 )
				{
					Send(playerid, COLOR_GREY, "* Вы ввели не правильный ID цвета!");
					LoadText("dialog/lmenu/colors.lst", dialog);
					SPD(playerid, D_LMENU+3, 1, "L-Menu: Смена цвета", dialog, "Enter", "Cancel");
				}
				else
				{
					new idx, v_frac, v_rank, carid = GetPlayerVehicleID(playerid);
					if( FC::GetInfo( carid,v_frac, v_rank, idx ) )
					{
						if( v_frac == PlayerInfo[playerid][pLeader] && !FC::IsEditMode( playerid ) )
						{
							new Float: posx, Float: posy, Float: posz, Float: posa;
							GetVehiclePos(carid, posx, posy, posz); GetVehicleZAngle(carid, posa);
							
							FC::INFO[ idx ][ FC::COLOR ][ 1 ] = inputtext[0];
							FC::RecreateVehicle( idx ); FC::Update( idx );
							
							SetVehiclePos(FC::INFO[ idx ][ FC::ID ][ 1 ], posx, posy, posz); SetVehicleZAngle(carid, posa);
							SetVehicleNumberPlate(FC::INFO[ idx ][ FC::ID ][ 1 ], FC::INFO[ idx ][ FC::NUMBER ]);
							PutPlayerInVehicle(playerid, FC::INFO[ idx ][ FC::ID ][ 1 ], 0);
							
							format(string, sizeof(string),"* Цвет машины был изменен: %d", inputtext[0]);
							Send(playerid, COLOR_WHITE, string);
						}
						else Send(playerid, -1, "* Вы не лидер!");
					}
				}
			}
			
			return 1;
		}
		
		case D_LMENU+4 :
		{
			if( response )
			{
				if( sscanf(inputtext, "i", inputtext[0]) )
				{
					SPD(playerid, D_LMENU+4, DIALOG_STYLE_INPUT, "L-Menu: Смена ранга", "Введите ранг с которого будет доступна машина.", "Enter", "Back");
				}
				else
				{
					new idx, v_frac, v_rank, carid = GetPlayerVehicleID(playerid);
					if( FC::GetInfo( carid, v_frac, v_rank, idx ) )
					{
						if( v_frac == PlayerInfo[playerid][pLeader] && !FC::IsEditMode( playerid ) )
						{
							FC::INFO[ idx ][ FC::RANK ] = inputtext[0]; FC::Update( idx );
							format(string, sizeof(string),"* Теперь машина доступна с %d-го ранга!", inputtext[0]);
							Send(playerid, COLOR_WHITE, string); 
						}
						else Send(playerid, -1, "* Вы не лидер!");
					}
				}
			}
			else
			{
				LoadText("dialog/lmenu/main.lst", dialog);
				SPD(playerid, D_LMENU, 2, "L-Menu:  Что хотите изменить?", dialog, "Выбор", "отмена");
			}
			
			return 1;
		}
		
		case D_LMENU+5 :
		{
			if( response )
			{
				new number[10];
				if( sscanf(inputtext, "s[10]", number) ) return SPD(playerid, D_LMENU+5, 1, "L-Menu: Смена номера", "Введите новый номер(макс 8 символов) ", "Enter", "Back");
				if( strlen(number) < 1 || strlen(number) > 8 ) return SPD(playerid, D_LMENU+5, 1, "L-Menu: Смена номера", "Введите новый номер(макс 8 символов) ", "Enter", "Back");
				if( str_check( number ) ) return SPD(playerid, D_LMENU+5, 1, "L-Menu: Смена номера", "Введите новый номер(макс 8 символов)", "Enter", "Back");
				new idx, v_frac, v_rank, carid = GetPlayerVehicleID(playerid);
				if( FC::GetInfo( carid, v_frac, v_rank, idx ) )
				{
					if( v_frac == PlayerInfo[playerid][pLeader] && !FC::IsEditMode( playerid ) )
					{
						format(FC::INFO[ idx ][ FC::NUMBER ], 10, "%s", number);
						new Float: posx, Float: posy, Float: posz, Float: posa;
						GetVehiclePos(carid, posx, posy, posz); GetVehicleZAngle(carid, posa);
						
						FC::RecreateVehicle( idx ); FC::Update( idx );
						
						SetVehiclePos(FC::INFO[ idx ][ FC::ID ][ 1 ], posx, posy, posz); SetVehicleZAngle(carid, posa);
						SetVehicleNumberPlate(FC::INFO[ idx ][ FC::ID ][ 1 ], FC::INFO[ idx ][ FC::NUMBER ]);
						PutPlayerInVehicle(playerid, FC::INFO[ idx ][ FC::ID ][ 1 ], 0);
						Send(playerid, COLOR_WHITE, "* Номер был изменен!");
					}
					else Send(playerid, -1, "* Вы не лидер!");
				}
			}
			else
			{
				LoadText("dialog/lmenu/main.lst", dialog);
				SPD(playerid, D_LMENU, 2, "L-Menu:  Что хотите изменить?", dialog, "Выбор", "Отмена");
			}
			return 1;
		}
		
		case D_LMENU+6 :
		{
			if( response )
			{
				new idx, v_frac, v_rank, carid = GetPlayerVehicleID(playerid);
				if( FC::GetInfo( carid, v_frac, v_rank, idx ) )
				{
					if( v_frac == PlayerInfo[playerid][pLeader] && !FC::IsEditMode( playerid ) )
					{
						GetVehiclePos(carid, FC::INFO[ idx ][ FC::R_POS ][ 0 ], FC::INFO[ idx ][ FC::R_POS ][ 1 ], FC::INFO[ idx ][ FC::R_POS ][ 2 ]);
						GetVehicleZAngle(carid, FC::INFO[ idx ][ FC::R_POS ][ 3 ]);	
						FC::RecreateVehicle( idx ); FC::Update( idx );
						SetVehicleNumberPlate(FC::INFO[ idx ][ FC::ID ][ 1 ], FC::INFO[ idx ][ FC::NUMBER ]);
						PutPlayerInVehicle(playerid, FC::INFO[ idx ][ FC::ID ][ 1 ], 0);
						Send(playerid, COLOR_WHITE, "* Место спавна было изменено!");
					}
					else Send(playerid, -1, "* Вы не лидер!");
				}
			}
			else
			{
				LoadText("dialog/lmenu/main.lst", dialog);
				SPD(playerid, D_LMENU, 2, "L-Menu:  Что хотите изменить?", dialog, "Выбор", "Отмена");
			}
			
			return 1;
		}
		
		case D_LMENU+7 :
		{
			if( response )
			{
				new model_id, mname[30]; strcat( mname, inputtext );
				insert( mname, "\\" ); sscanf( mname, "k<vehicle>", model_id);
				if( model_id < 400 || model_id > 611 ) return Send(playerid, COLOR_GREY, "* Unknown model id!");
				new idx, v_frac, v_rank, carid = GetPlayerVehicleID(playerid);
				if( FC::GetInfo( carid, v_frac, v_rank, idx ) )
				{
					if( v_frac == PlayerInfo[playerid][pLeader] && !FC::IsEditMode( playerid ) )
					{
						new Float: posx, Float: posy, Float: posz, Float: posa;
						GetVehiclePos(carid, posx, posy, posz); GetVehicleZAngle(carid, posa);
						
						FC::INFO[ idx ][ FC::MODEL ] = model_id;
						FC::RecreateVehicle( idx ); FC::Update( idx );
						
						SetVehiclePos(FC::INFO[ idx ][ FC::ID ][ 1 ], posx, posy, posz); SetVehicleZAngle(carid, posa);
						SetVehicleNumberPlate(FC::INFO[ idx ][ FC::ID ][ 1 ], FC::INFO[ idx ][ FC::NUMBER ]);
						PutPlayerInVehicle(playerid, FC::INFO[ idx ][ FC::ID ][ 1 ], 0);
						Send(playerid, COLOR_WHITE, "* Модель была изменена!");
					}
					else Send(playerid, -1, "* Вы не лидер!");
				}
			}
			else
			{
				LoadText("dialog/lmenu/main.lst", dialog);
				SPD(playerid, D_LMENU, 2, "L-Menu:  Что хотите изменить?", dialog, "Выбор", "Отмена");
			}
		}
		
		case D_ADD_FC :
		{
			if( response )
			{
				new model_id, mname[30]; strcat( mname, inputtext );
				insert( mname, "\\" ); sscanf( mname, "k<vehicle>", model_id);
				new frac_id = GetPVarInt( playerid, "SelectFrac");
				if( model_id < 400 || model_id> 611 ) return Send(playerid, COLOR_GREY, "* Unknown model id!");
				new Float: r_pos[4]; GetPlayerPos( playerid, r_pos[0], r_pos[1], r_pos[2]); GetPlayerFacingAngle(playerid, r_pos[3]);
				format(query, sizeof(query), "INSERT INTO `frac_vehicles` (`model`,`frac`,`resp_pos`) VALUES ('%i','%i','%.3f,%.3f,%.3f,%.3f')",
				model_id, frac_id, r_pos[0], r_pos[1], r_pos[2], r_pos[3]);
				
				if( bd::query(query) && bd::free_result() )
				{
					new id = FC::TOTAL; FC::TOTAL++;
					
					FC::INFO[ id ][ FC::ID ][ 0 ] 		= bd::insert_id();
					FC::INFO[ id ][ FC::MODEL ] 		= model_id;
					FC::INFO[ id ][ FC::FRAC ]			= frac_id;
					FC::INFO[ id ][ FC::COLOR ][ 0 ] 	= -1;
					FC::INFO[ id ][ FC::COLOR ][ 1 ] 	= -1;
					FC::INFO[ id ][ FC::R_POS ][ 0 ]	= r_pos[0];
					FC::INFO[ id ][ FC::R_POS ][ 1 ]	= r_pos[1];
					FC::INFO[ id ][ FC::R_POS ][ 2 ]	= r_pos[2];
					FC::INFO[ id ][ FC::R_POS ][ 3 ]	= r_pos[3];
					
					strmid(FC::INFO[ id ][ FC::NUMBER ], FC::DEF_NUMBER, 0, strlen(FC::DEF_NUMBER), 255);
					
					FC::INFO[ id ][ FC::ID ][ 1 ] =
					CreateVehicle
					(
						FC::INFO[ id ][ FC::MODEL ],
						FC::INFO[ id ][ FC::R_POS ][ 0 ],
						FC::INFO[ id ][ FC::R_POS ][ 1 ],
						FC::INFO[ id ][ FC::R_POS ][ 2 ],
						FC::INFO[ id ][ FC::R_POS ][ 3 ],
						FC::INFO[ id ][ FC::COLOR ][ 0 ],
						FC::INFO[ id ][ FC::COLOR ][ 1 ],
						1200
					);
					
					SetVehicleNumberPlate(FC::INFO[ id ][ FC::ID ][ 1 ], FC::INFO[ id ][ FC::NUMBER ]);
					PutPlayerInVehicle(playerid, FC::INFO[ id ][ FC::ID ][ 1 ], 0); FC::Update( id );
					
					Send( playerid, COLOR_YELLOW, "* Машина добавлена!");
				}
			}
			
			return 1;
		}
		
		case D_SHOW_MODEL :
		{
			if( response )
			{
				if( !strcmp(inputtext, "Добавить", true) )
				{
					LoadText("dialog/lmenu/addmodel.lst", dialog);
					SPD( playerid, D_ADD_MODEL, 1, "Добавить", dialog, "Ok", "Cancel");
				}
				else
				{
					new model_id, mname[30]; strcat( mname, inputtext );
					insert( mname, "\\" ); sscanf( mname, "k<vehicle>", model_id);
					if( model_id < 400 || model_id > 611 ) return Send(playerid, COLOR_GREY, "* Unknown model id!");
					SetPVarInt( playerid, "SelectModel", model_id);
					SPD( playerid, D_EDIT_MODEL, 2, "Options", "Изменить\nУдалить", "Ok", "Cancel");
				}
			}
			
			return 1;
		}
		
		case D_EDIT_MODEL :
		{
			new frac_id = GetPVarInt( playerid, "SelectFrac" );
			if( response )
			{
				switch( listitem )
				{
					case 0 :
					{
						SPD( playerid, D_EDIT_MODEL+1, 1, "Edit model", "Введите новый ID или название модели.\n\
						Пример: 400 или Landstalker", "Ok", "Cancel");
					}
					case 1 :
					{
						new model_id = GetPVarInt( playerid, "SelectModel" );
						format(query, sizeof(query), "DELETE FROM `frac_models` WHERE `frac_id` = '%i' AND `model_id` = '%i'",
						frac_id, model_id);
						
						if( bd::query(query) && bd::free_result() )
							Send( playerid, COLOR_WHITE, " Эта модель была из списка доступных!");
					}
				}
			}
			else FC::ShowModel( playerid, frac_id, D_SHOW_MODEL );
			
			return 1;
		}
		
		case D_EDIT_MODEL+1 :
		{
			if( response )
			{
				new newmodel, mname[30];
				strcat( mname, inputtext ); insert( mname, "\\" );
				if( sscanf( mname, "k<vehicle>", newmodel ) )
				{
					SPD( playerid, D_EDIT_MODEL+1, 1, "Edit model", "Введите новый ID или название модели.\n\
					Пример: 400 или Landstalker", "Ok", "Cancel");
				}
				else
				{
					if( newmodel < 400 || newmodel > 611 ) return Send(playerid, COLOR_GREY, "* Unknown model id!");
					new frac_id = GetPVarInt( playerid, "SelectFrac" );
					new model_id = GetPVarInt( playerid, "SelectModel" );
					format(query, sizeof(query), "UPDATE `frac_models` SET `model_id` = '%i' WHERE `frac_id` = '%i' AND `model_id` = '%i'",
					newmodel, frac_id, model_id);
					
					if( bd::query(query) && bd::free_result() )
						Send( playerid, COLOR_WHITE, " Модель была изменена!");
				}
			}
			
			return 1;
		}
		
		case D_ADD_MODEL :
		{
			if( response )
			{
				new model_id, mname[30];
				strcat( mname, inputtext ); insert( mname, "\\" );
				if( sscanf( mname, "k<vehicle>", model_id ) )
				{
					LoadText("dialog/lmenu/addmodel.lst", dialog);
					SPD( playerid, D_ADD_MODEL, 1, "Äîáàâèòü", dialog, "Ok", "Cancel");
				}
				else
				{
					new frac_id = GetPVarInt( playerid, "SelectFrac" );
					if( model_id < 400 || model_id > 611 ) return Send(playerid, COLOR_GREY, "* Unknown model id!");
					if( FC::IsThereModel( frac_id, model_id ) ) return Send(playerid, COLOR_RED, "* Эта модель уже есть в списке!");
					format(query, sizeof(query), "INSERT INTO `frac_models` (`frac_id`, `model_id`) VALUES ('%i','%i')", frac_id, model_id);
					if( bd::query(query) && bd::free_result() )
					{
						format(string, sizeof(string), " Модель добавлена! Model_id: %i; Model_name: %s", model_id, PlayerVehicle[model_id-400]);
						Send(playerid, COLOR_WHITE, string);
					}
				}
			}
			return 1;
		}
	}
Далее в public OnPlayerStateChange добавим

PHP:
		new fc_frac, fc_rank;
		if(FC::GetInfo(newcar, fc_frac, fc_rank))
		{
			if( !FC::IsEditMode( playerid ) )
			{
				if(fc_frac == GetFracID(playerid))
				{
					if(PlayerInfo[playerid][pRank] < fc_rank && !PlayerInfo[playerid][pLeader])
					{
						format(string, sizeof(string), "* Траспорт досутпен только с %d-го ранга!", fc_rank);
						Send(playerid, COLOR_GREY, string);
						return RemovePlayerFromVehicle(playerid);
					}
				}
				else
				{
					Send(playerid, COLOR_WHITE, "* Транспорт зарезервирован!");
					return RemovePlayerFromVehicle(playerid);
				}
			}
		}
В public OnGameModeInit()

PHP:
if( sqlConnect() )
{
    FC::Load( );
}
В public OnPlayerCommandText(playerid, cmdtext[])

PHP:
sscanf(cmdtext, "s[32]s[128]", cmd, xxx);
	
	if( !strcmp(cmd, "/lmenu", true) )
	{
		if( !PlayerInfo[playerid][pLeader] ) return Send(playerid, COLOR_GREY, "* Недостаточно прав!");
		if( !IsPlayerInAnyVehicle(playerid) ) return Send(playerid, COLOR_GREY, "* Нужно быть в машине!");
		if( !FC::GetInfo(idcar) ) return Send(playerid, COLOR_GREY, "* Это не фракционная машина!");
		LoadText("dialog/lmenu/main.lst", dialog);
		SPD(playerid, D_LMENU, 2, "L-Menu:  Что хотите изменить?", dialog, "Выбор", "Отмена");
	}
	
	if( !strcmp(cmd, "/editmode", true) )
	{
		if( PlayerInfo[playerid][pAdmin] < 1338 ) return Send(playerid, COLOR_GREY, "* Недостаточно прав!");
		if( !FC::EDIT_MODE )
		{
			FC::EDIT_MODE = true;
			Send(playerid, COLOR_RED, "Edit mode activated!");
		}
		else
		{
			FC::EDIT_MODE = false;
			Send(playerid, COLOR_RED, "Edit mode deactivated!");
		}
		return 1;
	}
	
	if( !strcmp(cmd, "/addfc", true) )
	{
		if( PlayerInfo[playerid][pAdmin] < 1338 ) return Send(playerid, COLOR_GREY, "* Недостаточно прав!");
		if( sscanf(xxx, "i", xxx[0]) ) return Send(playerid, COLOR_GREY, "Use: /addfc [fracid]");
		if( xxx[0] < 1 || xxx[0] > 21 ) return Send(playerid, COLOR_GREY, "* Неверный ID фракции!");
		if( FC::TOTAL >= FC::MAX ) return Send(playerid, COLOR_GREY, "* Создано макс. кол-во транспорта!");
		FC::ShowModel( playerid, xxx[0], D_ADD_FC );
		return 1;
	}
	
	if( !strcmp(cmd, "/delfc", true) )
	{
		if( PlayerInfo[playerid][pAdmin] < 1338 ) return Send(playerid, COLOR_RED, "* Недостаточно прав!");
		if( !IsPlayerInAnyVehicle(playerid) ) return Send(playerid, COLOR_GREY, "* Нужно быть в автомобиле!");
		if( !FC::GetInfo(idcar, xxx[0], xxx[0], idx ) ) return Send(playerid, COLOR_GREY, "* Это не фракционная машина!");
		if( FC::Delete( idx ) )
		{
			DestroyVehicle( FC::INFO[ idx ][ FC::ID ][ 1 ] ); FC::TOTAL --;
			
			FC::INFO[ idx ][ FC::ID ][ 0 ] = FC::INFO[ FC::TOTAL ][ FC::ID ][ 0 ];
			FC::INFO[ idx ][ FC::ID ][ 1 ] = FC::INFO[ FC::TOTAL ][ FC::ID ][ 1 ];
			
			FC::INFO[ idx ][ FC::MODEL ] = FC::INFO[ FC::TOTAL ][ FC::MODEL ];
			FC::INFO[ idx ][ FC::FRAC ] = FC::INFO[ FC::TOTAL ][ FC::FRAC ];
			
			FC::INFO[ idx ][ FC::COLOR ][ 0 ] = FC::INFO[ FC::TOTAL ][ FC::COLOR ][ 0 ];
			FC::INFO[ idx ][ FC::COLOR ][ 1 ] = FC::INFO[ FC::TOTAL ][ FC::COLOR ][ 1 ];
			
			strmid(FC::INFO[ idx ][ FC::NUMBER ], FC::INFO[ FC::TOTAL ][ FC::NUMBER ], 0, strlen(FC::INFO[ FC::TOTAL ][ FC::NUMBER ]), 255);
			
			FC::INFO[ idx ][ FC::R_POS ][ 0 ] = FC::INFO[ FC::TOTAL ][ FC::R_POS ][ 0 ];
			FC::INFO[ idx ][ FC::R_POS ][ 1 ] = FC::INFO[ FC::TOTAL ][ FC::R_POS ][ 1 ];
			FC::INFO[ idx ][ FC::R_POS ][ 2 ] = FC::INFO[ FC::TOTAL ][ FC::R_POS ][ 2 ];
			FC::INFO[ idx ][ FC::R_POS ][ 3 ] = FC::INFO[ FC::TOTAL ][ FC::R_POS ][ 3 ];
			
			Send(playerid, COLOR_YELLOW, "* Машина была удалена!");
		}
		
		return 1;
	}
	
	if( !strcmp(cmd, "/showmodel", true) )
	{
                if( PlayerInfo[playerid][pAdmin] < 6 ) return Send(playerid, COLOR_RED, "* Недостаточно прав!");
		if( sscanf(xxx, "i", xxx[0]) ) return Send(playerid, COLOR_RED, "Use: /showmodel [fracid]");
		if( xxx[0] < 1 || xxx[0] > 21 ) return Send(playerid, COLOR_RED, "* Неверный ID фракции!");
		FC::ShowModel( playerid, xxx[0], D_SHOW_MODEL );
		return 1;
	}
На этом все,если что то забыл допишу
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу