Доступ к готовым решениям

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

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

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

Мануал Система личного транспорта (copy Arizona)

AndreY.eXe

Эксперт
Пользователь
Регистрация
16 Сен 2017
Сообщения
1,327
Лучшие ответы
0
Репутация
241
Привет!

Краткое описание:

Наверняка, многие знают Arizon'у. Ведь её мод сейчас отлично форсят, конечно не оригинальный, но есть мододелы, которые делают что-то похожее). Так вот, Вы так же знаете, что там осталась старая система личного транспорта, а именно покупка. В кратце объясню, какая сейчас там система: вы приходите на нужный Вам авторынок, где стоят разные модели транспорта, которые Вы можете купить, Вы садитесь в транспорт и вы можете купить, после чего туда спавнится новая машина, если она есть) Вот я реализовал данную систему. По мне, так она самая легкая =). Так же, в качество авторынка я буду использовать свой мапп, который сейчас находится в общем доступе *клац*



Добавь:
PHP:
stock acc_int_strcat(query[], len, name[], number) // Для Save
{
	new string[100];
    f("`%s` = '%d',",name, number);
    strcat(query, string, len);
    return true;
}
stock acc_str_strcat(query[], len, name[], str[])  // Для Save
{
	new string[256];
    f("`%s` = '%s',",name, str);
    strcat(query, string, len);
    return true;
}
stock acc_float_strcat(query[], len, name[], Float:number)  // Для Save
{
	new string[100];
    f("`%s` = '%f',", name, number);
    strcat(query, string, len);
    return true;
}

stock SetString(param_1[], param_2[], size = 300)
{
    return strmid(param_1, param_2, 0, strlen(param_2), size);
}
stock GetString(param1[],param2[])
{
	return !strcmp(param1, param2, false);
}
Измени:
PHP:
SP - Массив игрока
pMoney - Переменная денег игрока
mysql - Переменная базы данных

Приступим:

Для начала создадим саму систему личного транспорта, как на Arizon'е) (взято со слитого мода ARIZONA RP)

В начало мода:
PHP:
#define MAX_CARS 100
enum cInfo
{
	cID,
	cModel,
Float: cPosX,
Float: cPosY,
Float: cPosZ,
Float: cPosA,
	cColor1,
	cColor2,
	cOwner[MAX_PLAYER_NAME],
	cCost
};
new CarInfo[MAX_CARS][cInfo]; // Массив нашего транспорта
new PCar[MAX_CARS]; // Переменная кара, который создаем
new OWNABLECAR; // Сколько всего загружено каров
В OnGameModeInit:
PHP:
	LoadCarInfo();
В конец мода:
PHP:
stock LoadCarInfo() // Загрузка транспорта
{
    new Cache: result = mysql_query(mysql, "select * from `cars`");
	OWNABLECAR = cache_get_row_count(mysql);
	for(new i; i < OWNABLECAR; i ++)
	{
	    CarInfo[i][cID] = cache_get_row_int(i, 0, mysql);
	    CarInfo[i][cModel] = cache_get_row_int(i, 1, mysql);
	    CarInfo[i][cPosX] = cache_get_row_float(i, 2, mysql);
	    CarInfo[i][cPosY] = cache_get_row_float(i, 3, mysql);
	    CarInfo[i][cPosZ] = cache_get_row_float(i, 4, mysql);
	    CarInfo[i][cPosA] = cache_get_row_float(i, 5, mysql);
	    CarInfo[i][cColor1] = cache_get_row_int(i, 6, mysql);
	    CarInfo[i][cColor2] = cache_get_row_int(i, 7, mysql);
	    cache_get_row(i, 8, CarInfo[i][cOwner], mysql, 24);
	    CarInfo[i][cCost] = cache_get_row_int(i, 10, mysql);
	    
	    PCar[i] = AddStaticVehicleEx(CarInfo[i][cModel], CarInfo[i][cPosX], CarInfo[i][cPosY], CarInfo[i][cPosZ], CarInfo[i][cPosA], CarInfo[i][cColor1], CarInfo[i][cColor2], -1);
		SetVehicleToRespawn(PCar[i]);
	}
	cache_delete(result, mysql);
}
stock SaveCar(i) // Сохранение транспорта
{
    new query[3000];
	query = "update `cars` set ";
	acc_int_strcat(query, sizeof(query), "Model", CarInfo[i][cModel]);
	acc_float_strcat(query, sizeof(query), "PosX", CarInfo[i][cPosX]);
	acc_float_strcat(query, sizeof(query), "PosY", CarInfo[i][cPosY]);
	acc_float_strcat(query, sizeof(query), "PosZ", CarInfo[i][cPosZ]);
	acc_float_strcat(query, sizeof(query), "PosA", CarInfo[i][cPosA]);
	acc_int_strcat(query, sizeof(query), "Color1", CarInfo[i][cColor1]);
	acc_int_strcat(query, sizeof(query), "Color2", CarInfo[i][cColor2]);
	acc_str_strcat(query, sizeof(query), "Owner", CarInfo[i][cOwner]);
	acc_int_strcat(query, sizeof(query), "Cost", CarInfo[i][cCost]);
	strdel(query, strlen(query)-1, strlen(query));
	format(query,sizeof(query),"%s where `ID` = '%d'", query, CarInfo[i][cID]);
	mysql_tquery(mysql, query);
}
Вот и все, загрука и сохранение есть! Теперь нам нужны команды и все нужные стоки:

В конец мода:
PHP:
cmd:park(playerid)
{
	new carid = GetPlayerVehicleID(playerid);
	if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)return SendClientMessage(playerid, -1, "Вы должны быть за рулем своего транспорта!");
	if(!IsPlayerHaveCar(playerid, carid))return SendClientMessage(playerid, -1, "Это не Ваш транспорт!");
	new panels, doors_, lights_, tires, Float: vhealth;
	GetVehicleDamageStatus(carid, panels, doors_, lights_, tires);
	new number = GetVehicleID(carid);
	GetVehiclePos(carid, CarInfo[number][cPosX], CarInfo[number][cPosY], CarInfo[number][cPosZ]);
	GetVehicleZAngle(carid, CarInfo[number][cPosA]);
	GetVehicleHealth(carid, vhealth);
    DestroyVehicle(carid);
	PCar[number] = AddStaticVehicleEx(CarInfo[number][cModel], CarInfo[number][cPosX], CarInfo[number][cPosY], CarInfo[number][cPosZ], CarInfo[number][cPosA], CarInfo[number][cColor1], CarInfo[number][cColor2], -1);
	SetVehicleToRespawn(PCar[number]);
	PutPlayerInVehicle(playerid, PCar[number], 0);
	SetVehicleHealth(PCar[number], vhealth);
	UpdateVehicleDamageStatus(PCar[number], panels, doors_, lights_, tires);
	SetVehicleNumberPlate(PCar[number], CarInfo[number][cNumber]);
	SaveCar(number);
	return true;
}
stock IsPlayerHaveCar(playerid, vehicleid) // Проверка, игрока ли кар
{
	if(IsPlayerCar(vehicleid))
	{
	    new number = GetVehicleID(vehicleid);
		if(GetString(CarInfo[number][cOwner], Name(playerid)))return true;
	}
	return false;
}
stock IsPlayerCar(carid) // Проверка, принадлежит ли кар какому-то игроку
{
    new div;
	if(OWNABLECAR > 0) div = (PCar[0] <= carid <= PCar[OWNABLECAR-1]);
	return div;
}
stock GetVehicleID(carid) // Находит ИД кара в загрузке
{
	return carid - PCar[0];
}
Теперь перейдем к самой систему покупке транспорта: (моя система)

В начало мода:
PHP:
new bool: Sell_Vehicles[MAX_VEHICLES]; // Проверка, стоит ли транспорт на продаже
new Text3D: Text_Sell_Vehicles[MAX_VEHICLES]; // 3D Text
new Sell_Vehicle_Player_Cost[MAX_PLAYERS]; // Цена транспорта
#define SELL_VEHICLE    1000 // Диалог ИД
В OnGameModeInit:
PHP:
	LoadAutoShow();
В конец мода:
PHP:
stock LoadAutoShow_Test()
{
    new string[300], model, total, Float: p_x, Float: p_y, Float: p_z, Float: p_a, cost;
	new Cache: result = mysql_query(mysql, "select * from `auto_show`");
	new vehs = cache_get_row_count(mysql);
	if(vehs == 0)return print("Ошибка загрузки машин на продажу. Найдено 0 моделей!");
	
	for(new i; i < vehs; i ++)
	{
	    model = cache_get_row_int(i, 0, mysql);
		total = cache_get_row_int(i, 1, mysql);
		cost = cache_get_row_int(i, 2, mysql);
		p_x = cache_get_row_float(i, 3, mysql);
		p_y = cache_get_row_float(i, 4, mysql);
		p_z = cache_get_row_float(i, 5, mysql);
		p_a = cache_get_row_float(i, 6, mysql);
		
		new carid = AddStaticVehicleEx(model, p_x, p_y, p_z, p_a, 1, 1, -1);
		format(string, sizeof(string), "\
		** Транспорт продается **\n\n\
		{ffffff}Модель: {FF9900}%s (%d)\n\
		{ffffff}Стоимость: {FF9900}%d$\n\
		{ffffff}Осталось моделей: {FF9900}%d штук\n\n\
		{afafaf}Чтобы купить сядьте в транспорт", VehicleName[model-400], model, cost, total);
		Text_Sell_Vehicles[carid] = Create3DTextLabel(string, 0x9CABDDAA, p_x, p_y, p_z, 10.0, 0, 0);
		Sell_Vehicles[carid] = true;
	}
	printf("Загружено: %d моделей машин на продажу", vehs);
	cache_delete(result, mysql);
	return true;
}
stock SellingCar(playerid, carid)
{
	new model = GetVehicleModel(carid), cost, total;
	new string[135];
	format(string, sizeof(string), "select `Total_car`, `Cost_car` from `auto_show` where `Model_car` = %d", model);
	new Cache: result = mysql_query(mysql, string);
	new vehs = cache_get_row_count(mysql);
	if(vehs == 0)return RemovePlayerFromVehicle(playerid);
	
	total = cache_get_row_int(0, 0, mysql);
	cost = cache_get_row_int(0, 1, mysql);
	Sell_Vehicle_Player_Cost[playerid] = cost;
	SetPVarInt(playerid, "total_car_for_selling_car", total);
	
	format(string, sizeof(string), "\
	{9CABDD}Вы действительно хотите приобрести данный транспорт?\n\n\
	{ffffff}Модель: {FF9900}%s (%d)\n\
	{ffffff}Стоимость: {FF9900}%d$\n\n", VehicleName[model-400], model, cost);
	ShowPlayerDialog(playerid, SELL_VEHICLE, 0, "Покупка транспорта", string, "Да", "Отмена");
	cache_delete(result, mysql);
	return true;
}
В OnPlayerStateChange
PHP:
	if(newstate == PLAYER_STATE_DRIVER)
	{
	    if(Sell_Vehicles[carid]) SellingCar(playerid, carid);
	}
В OnDialogResponse:
PHP:
		case SELL_VEHICLE:
		{
		    if(!response)return RemovePlayerFromVehicle(playerid);
		    if(SP[playerid][pMoney] < Sell_Vehicle_Player_Cost[playerid])return SendClientMessage(playerid, 0xFF6347AA, "У Вас не хватает денег!");
		    new carid = GetPlayerVehicleID(playerid);
		    new model = GetVehicleModel(carid);
		    new Float: p_x, Float: p_y, Float: p_z, Float: p_a; GetVehiclePos(carid, p_x, p_y, p_z);
		    GetVehicleZAngle(carid, p_a);
		    SetVehiclePos(carid, p_x, p_y+6, p_z);
		    SendClientMessage(playerid, -1, "Поздравляем с покупкой своего транспорта! Не забудьте припарковать его где-нибудь.");
		    SP[playerid][pMoney] -= Sell_Vehicle_Player_Cost[playerid];
		    Sell_Vehicles[carid] = false;
		    Delete3DTextLabel(Text_Sell_Vehicles[carid]);
		    
		    CarInfo[OWNABLECAR][cID] = OWNABLECAR;
		    CarInfo[OWNABLECAR][cModel] = model;
		    CarInfo[OWNABLECAR][cColor1] = 1;
		    CarInfo[OWNABLECAR][cColor2] = 1;
		    SetString(CarInfo[OWNABLECAR][cOwner], Name(playerid));
		    CarInfo[OWNABLECAR][cCost] = Sell_Vehicle_Player_Cost[playerid];
		    Sell_Vehicle_Player_Cost[playerid] = 0;
		    CarInfo[OWNABLECAR][cPosX] = p_x;
		    CarInfo[OWNABLECAR][cPosY] = p_y;
		    CarInfo[OWNABLECAR][cPosZ] = p_z;
		    CarInfo[OWNABLECAR][cPosA] = p_a;
		    
		    format(string, sizeof(string), "insert into `vehicles` (`ID`, `Model`, `PosX`, `PosY`, `PosZ`, `PosA`, `Owner`, `Cost`) values (%d, %d, %.2f, %.2f, %.2f, %.2f, %s, %d)",
			OWNABLECAR, CarInfo[OWNABLECAR][cModel], CarInfo[OWNABLECAR][cPosX], CarInfo[OWNABLECAR][cPosY], CarInfo[OWNABLECAR][cPosZ], CarInfo[OWNABLECAR][cPosA], CarInfo[OWNABLECAR][cOwner], CarInfo[OWNABLECAR][cCost]);
		    
		    format(string, sizeof(string), "update `auto_show` set `Total_car` = `Total_car` - 1 where `Model_car` = %d", model);
		    mysql_tquery(mysql, string);
		    
		    carid = AddStaticVehicleEx(model, p_x, p_y, p_z, p_a, 1, 1, -1);
			format(string, sizeof(string), "\
			** Транспорт продается **\n\n\
			{ffffff}Модель: {FF9900}%s (%d)\n\
			{ffffff}Стоимость: {FF9900}%d$\n\
			{ffffff}Осталось моделей: {FF9900}%d штук\n\n\
			{afafaf}Чтобы купить сядьте в транспорт", VehicleName[model-400], model, Sell_Vehicle_Player_Cost[playerid], GetPVarInt(playerid, "total_car_for_selling_car")-1);
			Text_Sell_Vehicles[carid] = Create3DTextLabel(string, 0x9CABDDAA, p_x, p_y, p_z, 10.0, 0, 0);
			Sell_Vehicles[carid] = true;
		    OWNABLECAR++;
		}
Ну вот и все! Вот все данный из БД:
PHP:
create table cars (ID INT(11) NOT NULL, Model INT(11) NOT NULL, PosX FLOAT NOT NULL, PosY FLOAT NOT NULL, PosZ FLOAT NOT NULL, PosA FLOAT NOT NULL, Color1 INT(11) NOT NULL, Color2 INT(11) NOT NULL, Owner VARCHAR(24) NOT NULL, Cost INT(11) NOT NULL); // Создании таблицы транспорта

create table auto_show (Model INT(11) NOT NULL, Total INT(11) NOT NULL, Cost INT(11) NOT NULL, PosX FLOAT NOT NULL, PosY FLOAT NOT NULL, PosZ FLOAT NOT NULL, PosA FLOAT NOT NULL); // Таблица транспорт с продажи
(p/s: если что-то не так в коде или системе, то отпишитесь, ибо сами видите во сколько выложена данная тема =))


---------- Сообщение добавлено в 01:21 ---------- Предыдущее сообщение добавлено в 01:19 ----------

Предвещаю такие комментарии по типу: "Можно оставить эту машину на месте и создать другую, после посадить игрока в неё, и не удалять 3D текст и при спавне машина не будет спавнится на машину", да можно, но я сделал так, кому надо - тот изменит!
 
Последнее редактирование:
Сверху Снизу