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

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

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

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

Урок Работа развозчик цемента | Цементовоз.

Статус
В этой теме нельзя размещать новые ответы.
Доброго времени суток всем гостям и пользователям pawno-info.
Сегодня я покажу как сделать простую, но интересную работы развозчика цемента. Постараюсь объяснить все очень подробно. Этот урок не только по добавлению работы, но и так же разбор стандартных функций.​

Объявим переменные, которые мы будем использовать в нашем коде:
PHP:
new CEM_Veh[2];
	CEMENT_Object[MAX_PLAYERS char];
	Cement_Check[MAX_PLAYERS char];
new bool: CEMMisson[MAX_PLAYERS char];
Теперь нам необходимо добавить транспорт, а именно сами цементовозы. Идем в public OnGameModeInit() и добавляем:
PHP:
CEM_Veh[0] = AddStaticVehicle(524,1264.9974,-1265.0490,14.2524,359.9430,65,31);
AddStaticVehicle(524,1259.9846,-1265.0490,14.3545,359.7379,61,27);
AddStaticVehicle(524,1255.0193,-1265.0490,14.3430,359.0296,62,61); 
AddStaticVehicle(524,1250.1464,-1265.0490,14.2768,0.4196,61,27); 
CEM_Veh[1] = AddStaticVehicle(524,1244.9406,-1265.0490,14.2671,1.6362,61,61);
В public OnPlayerConnect(playerid) и public OnPlayerDisconnect(playerid, reason) добавим следующий код:
PHP:
CEMMisson{playerid} = false;
Итак, переменные и машины добавлены, теперь делаем сами действия.
Идем в public OnPlayerStateChange(playerid, newstate, oldstate) и добавляем следующий код.
PHP:
new vehicleid = GetPlayerVehicleID(playerid);
if(vehicleid >= CEM_Veh[0] && vehicleid <= CEM_Veh[1])
{
	ShowPlayerDialog(playerid,1,
	DIALOG_STYLE_MSGBOX,
	!"{FFFFFF}Задание",
	!"{ECCA63}Необходимо отвезти раствор на стройку. Возьмешься?!",
	"Да",
	!"Нет"
	);

}
if(vehicleid >= CEM_Veh[0] || vehicleid <= CEM_Veh[1]) - Проверка на нахождение в нашем транспорте.
playerid - ID игрока которому будет показан диалог.
1 - ID диалогового окна.
DIALOG_STYLE_MSGBOX - Стиль диалогового окна.

Создадим действие нашего диалога. В public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
PHP:
case 1:
{
	if(response)
	{
		switch(random(2))
		{
			case 0:
			{
				CEMMisson{playerid} = true;
				Cement_Check{playerid} = 1;
				SetPlayerRaceCheckpoint(playerid, 2,2463.8667,1962.6731,10.8061,0,0,0,3.0);
			}
			case 1:
			{
				CEMMisson{playerid} = true;
				Cement_Check{playerid} = 3;
				SetPlayerRaceCheckpoint(playerid, 2,2718.5154,853.3401,10.8984,0,0,0,3.0);
			}
		}
	}
	else
	{
		RemovePlayerFromVehicle(playerid);
		SetVehicleToRespawn(GetPlayerVehicleID(playerid));
	}
}
if(response) - Если игрок нажал кнопку "Да"
switch(random(2)) - Оператор рандомного выбора. Т.к. у нас две точки, то добавляем (2).
CEMMisson - Переменная о начале нашей "миссии". Значение = 1.
Cement_Check{playerid} - Номер следующего чекпоинта, который будет показан игроку.
SetPlayerRaceCheckpoint - Отображение чекпоинта. Подробнее об этой функции найдете здесь.
else - Если игрок нажимает "Нет".
RemovePlayerFromVehicle - Высаживаем игрока из транспорта.
SetVehicleToRespawn - Устанавливаем машину на места его спавна.
Далее добавляем действие, если игрок выйдет из транспорта. Идем в public OnPlayerExitVehicle(playerid, vehicleid):
PHP:
if(vehicleid >= CEM_Veh[0] || vehicleid <= CEM_Veh[1])
{
	CEMMisson{playerid} = false;
	DisablePlayerRaceCheckpoint(playerid);
	RemovePlayerFromVehicle(playerid);
	SetVehicleToRespawn(GetPlayerVehicleID(playerid));
	Cement_Check{playerid} = 0;
}
if(vehicleid >= CEM_Veh[0] && vehicleid <= CEM_Veh[1]) - Проверка на нахождение в нашем транспорте.
CEMMisson{playerid} - Обнуляем наше задание (false).
DisablePlayerRaceCheckpoint - Удаляем наш чекпоинт.
Почему удаляем именно DisablePlayerRaceCheckpoint а не DisablePlayerCheckpoint?
На этот вопрос вы найдете ответ чуть позже. Дело в том, что при отправлении к месту где вы будете выгружать раствор, будет отмечен DisablePlayerRaceCheckpoint, а при DisablePlayerCheckpoint наш игрок будет заморожен, в связи с этим, выйти из транспорта игрок не сможет.
RemovePlayerFromVehicle - Это стандартная функция, которая выбрасывает/высаживает игрока из транспорта.
SetVehicleToRespawn - Это стандартная функция, которая устанавливает машину на его место спавна.
Cement_Check{playerid} - Переменная которая отвечает за показ порядка чекпоинта. Приравниваем к 0, чтобы его убрать.

Теперь нужно добавить чекпоинты. Мы используем два вида SetPlayerCheckpoint и SetPlayerRaceCheckpoint:
Для начала идем в public OnPlayerEnterRaceCheckpoint(playerid):
PHP:
if(Cement_Check{playerid} == 1)
{
	Cement_Check{playerid} = 2;
	DisablePlayerRaceCheckpoint(playerid);
	SetPlayerCheckpoint(playerid, 2413.4463,1919.9695,6.0156, 3.0);
	SendClientMessage(playerid,0x33AA33AA,!"Место выгрузки раствора отмечено на карте.");
}
else if(Cement_Check{playerid} == 3)
{
	Cement_Check{playerid} = 4;
	DisablePlayerRaceCheckpoint(playerid);
	SetPlayerCheckpoint(playerid, 2614.2490,834.4865,5.3158, 3.0);
	SendClientMessage(playerid,0x33AA33AA,!"Место выгрузки раствора отмечено на карте.");
}
if(Cement_Check{playerid} == 1 | 3) - Номер чекпоинта, на который наехал игрок.
Cement_Check{playerid} - Показываем следующий номер чекпоинта.
DisablePlayerRaceCheckpoint - Удаляем предыдущий чекпоинт.
SetPlayerCheckpoint - Показываем следующий чекпоинт. Об этой функции подробнее можно узнать здесь -
SendClientMessage - Отправляем сообщение игроку.

После этого, у вас появится обыкновенный чекпоинт, идем в public OnPlayerEnterCheckpoint(playerid):
PHP:
if(Cement_Check{playerid} == 2)
{
	SendClientMessage(playerid,0x33AA33AA,!"Дождись окончания выгрузки(1 минута).");
	SetTimerEx("Cementok", 60000, false, "i", playerid);
	CEMENT_Object{playerid} = CreateObject(18672, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
	AttachObjectToVehicle(CEMENT_Object{playerid}, GetPlayerVehicleID(playerid),2.6, -3.95, -0.5, -90.0, -90.0, 0.0);
	TogglePlayerControllable(playerid, 0);
}
else if(Cement_Check{playerid} == 4)
{
	SendClientMessage(playerid,0x33AA33AA,!"Дождись окончания выгрузки(1 минута).");
	SetTimerEx("Cementok", 60000, false, "i", playerid);
	CEMENT_Object{playerid} = CreateObject(18672, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
	AttachObjectToVehicle(CEMENT_Object{playerid}, GetPlayerVehicleID(playerid), 2.6, -3.95, -0.5, -90.0, -90.0, 0.0);
	TogglePlayerControllable(playerid, 0);
}
if(Cement_Check{playerid} == 2 | 4) - Номер чекпоинта, на который наехал игрок.
SendClientMessage - Отправляем сообщение игроку.
SetTimerEx - Запускаем таймер, для выполнения функции. Подробнее об этой функции можно узнать здесь -
CreateDynamicObject - Создаем объект с названием CEMENT_Object.
AttachDynamicObjectToVehicle - Прикрепляем объект к машине.
CEMENT_Object - Объект, который прикрепляем к транспорту.
GetPlayerVehicleID - ID транспорта, к которому прикрепляем объект.
2.6, -3.95, -0.5 - Смещение от транспорта X | Y | Z
-90.0, -90.0, 0.0 - Вращение по осям X | Y | Z
TogglePlayerControllable - Замораживаем камеру и действия игрока.

Осталось дело за последним, создать действие, при срабатывании таймера. Создаем public Cementok(playerid):
PHP:
@_Cementok(playerid);
@_Cementok(playerid)
{
	CEMMisson{playerid} = false;
        PlayerInfo[playerid][pMoney] += 3000;
	GameTextForPlayer(playerid,"+3000",5000,1);
	DisablePlayerCheckpoint(playerid);
	RemovePlayerFromVehicle(playerid);
	DestroyObject(CEMENT_Object[playerid]);
	TogglePlayerControllable(playerid, 1);
	SetVehicleToRespawn(GetPlayerVehicleID(playerid));
	Cement_Check{playerid} = 0;
	return 0;
}
CEMMisson - Обнуляем значение нашего задания.
PlayerInfo[playerid][pMoney] - Хранение ваших денег, прибавляем +3000$ (Меняйте на свое.)
GameTextForPlayer - Показываем игроку текст в течении 5 секунд.
DisablePlayerCheckpoint - Удаляем чекпоинт.
RemovePlayerFromVehicle - Высаживаем игрока из транспорта.
DestroyObject - Удаляем объект, который мы прикрепляли к транспорту.
TogglePlayerControllable - Размораживаем камеру и действие игрока.
SetVehicleToRespawn - Устанавливаем машину на место спавна.
Cement_Check - Задаем номер чекпоинта (удаляем) = 0.

Ну вот вроде бы и все. Скриншоты можно посмотреть здесь -
Урок окончен, спасибо всем за внимание!
Автор урока - Алексей.​
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу