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

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

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

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

Мануал Работа автобусника

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

#Denwer

Специалист
Доброго времени суток пользователи портала Pawno-Info.Ru
Давно я что то не выкладывал в этот раздел, по этому, хочу выложить свою работу автобусника.
Маршрут один, работа вполне оптимизирована.
Код:

Ко всем переменным [new]
PHP:
new busPos[MAX_PLAYERS char], aBusCar[2];
Ко всем массивам / переменным [new]
PHP:
static const Float: aBusPos [ 1 ] [ 41 ] [ 3 ] =
{
	{
		{1230.9524,-1827.1240,13.5426},
		{1198.3748,-1849.8652,13.5277},
		{1182.6826,-1753.5226,13.5318},
		{1065.2515,-1710.0510,13.5152},
		{1035.0924,-1771.6312,13.5151},
		{1048.0806,-1843.9089,13.5145},
		{1130.1753,-1854.3394,13.5149},
		{1265.3311,-1854.2454,13.5162},
		{1412.7979,-1874.3402,13.5138},
		{1599.4360,-1873.9989,13.5161},
		{1692.2527,-1823.7363,13.5162},
		{1771.7197,-1829.6602,13.5177},
		{1782.4772,-1854.4111,13.5290},
		{1713.8318,-1873.0873,13.5283},
		{1754.9462,-1890.6681,13.5283},
		{1818.5327,-1885.7406,13.5147},
		{1824.0723,-1762.3412,13.5162},
		{1824.2031,-1633.8693,13.5162},
		{1680.4413,-1589.9667,13.5183},
		{1471.4492,-1590.5436,13.5162},
		{1426.9979,-1674.7341,13.5164},
		{1386.9880,-1759.3724,13.5154},
		{1360.7561,-1864.0743,13.5248},
		{1314.5671,-1767.6848,13.5161},
		{1314.9146,-1573.3521,13.5162},
		{1354.4495,-1409.7529,13.4782},
		{1224.7792,-1397.6514,13.2871},
		{1209.0115,-1334.0208,13.5317},
		{1185.7659,-1279.4440,13.4524},
		{1056.2031,-1302.5181,13.6444},
		{1021.0138,-1394.4293,13.2086},
		{732.4651,-1391.8947,13.5967},
		{659.2169,-1393.1476,13.5829},
		{625.1596,-1478.6261,14.6099},
		{673.0801,-1588.9623,14.2108},
		{825.7580,-1606.7648,13.5172},
		{944.5028,-1573.8007,13.5155},
		{1035.0076,-1633.5833,13.5160},
		{1111.4270,-1714.4276,13.5162},
		{1171.9684,-1808.6864,13.5325},
		{1260.1619,-1854.9773,13.5155}
	}
};
static const Float: SellTicket[22][4] =
{
	{1814.4739990,-1699.5080566,13.5249996,0.0000000}, // (1)
	{1772.7149658,-1926.2719727,13.6230001,0.0000000}, // (2)
	{2050.6960449,-1944.5090332,13.6140003,90.0000000}, // (3)
	{2025.2130127,-1925.0639648,13.6029997,270.0000000}, // (4)
	{2125.5080566,-1770.5059814,13.6210003,180.0000000}, // (5)
	{2245.1931152,-1724.7939453,13.5810003,269.9945068}, // (6)
	{2258.6250000,-1739.3139648,13.6160002,89.9890137}, // (7)
	{2228.1188965,-2034.5059814,13.6020002,43.9890137}, // (8)
	{2230.2199707,-2016.9649658,13.6409998,223.9837646}, // (9)
	{1969.3449707,-2146.6960449,13.6190004,180.0000000}, // (10)
	{1166.8389893,-1760.4630127,13.6560001,359.9890137}, // (40)
	{1187.2110596,-1748.9639893,13.6300001,179.9890137}, // (41)
	{1397.1519775,-1813.2280273,13.5850000,179.9835205}, // (42)
	{1381.6469727,-1808.1120605,13.6429996,359.9835205}, // (43)
	{1421.6159668,-1677.4160156,13.5920000,359.9780273}, // (44)
	{1435.9770508,-1665.1009521,13.5889997,179.9780273}, // (45)
	{1535.9300537,-1652.4840088,13.5900002,179.9725342}, // (46)
	{1523.1209717,-1664.8780518,13.5880003,359.9725342}, // (47)
	{1772.7158203,-1914.7812500,13.6020002,0.0000000}, // (49)
	{1829.5040283,-1706.0600586,13.5839996,180.0000000}, // (50)
	{1953.6109619,-1773.3659668,13.5909996,0.0000000}, // (52)
	{1968.8139648,-1776.2209473,13.5860004,180.0000000} // (53)
};
Ко всем диалогам: public OnDialogResponse
PHP:
	case 1551:
		{
			if(!response) return RemovePlayerFromVehicle(playerid);
			ShowPlayerDialog(playerid,1552,2,"{FF6F00}Выбор маршрута [#1]","{FFFFFF}1. ЖДЛС - Автошкола ($4680 один круг)","Принять","Отмена");
			return 1;
		}
	case 1552:
		{
			if(!response) return RemovePlayerFromVehicle(playerid);
			new route = listitem;
			if(GetPlayerVehicleID(playerid) == INVALID_VEHICLE_ID || (GetVehicleModel(GetPlayerVehicleID(playerid)) != 431 && GetVehicleModel(GetPlayerVehicleID(playerid)) != 437)) return 1;
			PlayerInfo[playerid][pCash] -= 1000;
			new r_name [ 50 ];
			switch(listitem)
			{
			case 0: r_name = "{"#cGREEN"}ЖДЛС {FFFFFF}- {"#cGREEN"}Автошкола";
			}
			new msg [ 128 ] ;
			format( msg , sizeof msg , "%s\nДля проезда нужен: {FFFFFF}проездной билет", r_name);
			if(pTemp[playerid][bus_text] != Text3D:INVALID_3DTEXT_ID) pTemp[playerid][bus_text] = CreateDynamic3DTextLabel(msg,COLOR_WHITE,0.0,0.0,3.0,40.0,INVALID_PLAYER_ID,GetPlayerVehicleID(playerid));
			SetPVarInt(playerid, #busID, GetPlayerVehicleID(playerid));
			SetPVarInt(playerid, #busRoute, route);
			busPos{playerid} = 0;
			SetPlayerRaceCheckpoint(playerid,1,aBusPos[route][0][0],aBusPos[route][0][1],aBusPos[route][0][2],aBusPos[route][1][0],aBusPos[route][1][1],aBusPos[route][1][2],4.0);
			return 1;
		}
К public OnPlayerEnterCheckPoint
PHP:
		if(PlayerInfo[playerid][pJob] == 6 && GetPVarInt(playerid, #busID) == GetPlayerVehicleID(playerid))
		{
			new
				pos = busPos{playerid},
				route = GetPVarInt(playerid, #busRoute),
				money_ = GetPVarInt(playerid, #busMoney);
			
			if((route == 0 && (pos == 1-1 || pos == 14-1 || pos == 21-1 || pos == 28-1 || pos == 32-1 || pos == 34-1)))
			{
				new r_name [ 50 ];
				switch(route)
				{
				case 0: r_name = "ЖДЛС - Автошкола";
				}
				format(stringer,24+100,"Водитель: %s, Маршрут: %s, автобус отправляется через 10 секунд!",PlayerInfo[playerid][pNames], r_name);
				ProxDetector(30.0,playerid,stringer,0x44b2ffff,0x44b2ffff,0x44b2ffff,0x44b2ffff,0x44b2ffff);
				SetTimerEx("bus_stop",10000,false,"i",playerid);
				return 1;
			}
			
			if(pos == 39)
			{
				PlayerInfo[playerid][pCash] += money_;
				SCMF(playerid, COLOR_GREEN, "Вы проехали один рейс, Вы заработали: $%i", money_);
				busPos{playerid} = 0, SetPVarInt(playerid, #busMoney, 0);
			}
			else busPos{playerid}++, GivePVarInt(playerid, #busMoney, 120);
			
			new t_pos = busPos{playerid}, type_bus_race = 0;
			if((route == 0 && (t_pos == 1-1 || t_pos == 14-1 || t_pos == 21-1 || t_pos == 28-1 || t_pos == 32-1 || t_pos == 34-1))) type_bus_race = 1;
			SetPlayerRaceCheckpoint(playerid,type_bus_race,aBusPos[route][t_pos][0],aBusPos[route][t_pos][1],aBusPos[route][t_pos][2],aBusPos[route][t_pos+1][0],aBusPos[route][t_pos+1][1],aBusPos[route][t_pos+1][2],4.0);
		}
В public OnPlayerStateChange

PHP:
	if(newstate == PLAYER_STATE_PASSENGER)
	{
		if(GetPlayerVehicleID(playerid) >= aBusCar[0] && GetPlayerVehicleID(playerid) <= aBusCar[1])
		{
			if(GetPVarInt(playerid, #busTicket)) return MeAction(playerid,"приложил проездной талон к турникету");
			SCM(playerid, COLOR_REDD, "Вы прошли через турникет без талона, Вас могут арестовать!");
			SCM(playerid, -1, "• {FFC800}[Подсказка] {ffffff}Приобрести талон можно у специального аппарата, цена: 5000$");
		}
        }
if(oldstate == PLAYER_STATE_DRIVER && newstate == PLAYER_STATE_ONFOOT)
{
		if(PlayerInfo[playerid][pJob] == 6 && GetPVarInt(playerid, #busID) != 0)
		{
			DisablePlayerRaceCheckpoint(playerid), pTemp[playerid][bus_timer] = SetTimerEx("spawned_bus",15000,false,"i",playerid);
			SCM(playerid, COLOR_REDD, "Если Вы не вернетесь в автобус в течении 15-ти секунд, он будет отбуксирован!");
		}
}
if(newstate == PLAYER_STATE_DRIVER)
{
                new newcar = GetPlayerVehicleID(playerid);
		if(newcar >= aBusCar[0] && newcar <= aBusCar[1])
		{
			if(PlayerInfo[playerid][pJob] != 6) { SCM(playerid, -1, "• {AC0000}[Ошибка] {ffffff}Вы не работаете водителем автобуса."); RemoveFromVehicle(playerid); }
		}
		if(newcar >= aBusCar[0] && newcar <= aBusCar[1])
		{
			if(PlayerInfo[playerid][pJob] != 6) return SCM(playerid, -1, "• {AC0000}[Ошибка] {ffffff}Вы не водитель автобуса!"), RemovePlayerFromVehicle(playerid);
			if(GetPVarInt(playerid, #busID) == newcar)
			{
				if(pTemp[playerid][bus_timer]) KillTimer(pTemp[playerid][bus_timer]);
				new type_bus_race = 0, t_pos = busPos{playerid}, route = GetPVarInt(playerid, #busRoute);
				if((route == 0 && (t_pos == 1-1 || t_pos == 14-1 || t_pos == 21-1 || t_pos == 28-1 || t_pos == 32-1 || t_pos == 34-1))) type_bus_race = 1;
				SetPlayerRaceCheckpoint(playerid,type_bus_race,aBusPos[route][t_pos][0],aBusPos[route][t_pos][1],aBusPos[route][t_pos][2],aBusPos[route][t_pos+1][0],aBusPos[route][t_pos+1][1],aBusPos[route][t_pos+1][2],4.0);
				return 1;
			}
			foreach(new i: Player)
			{
				if(!IsPlayerConnected(i) || i == playerid) continue;
				if(GetPVarInt(i, #busID) == newcar) SCM(playerid, -1, "• {AC0000}[Ошибка] {ffffff}Данный автобус уже находится в аренде!"), RemovePlayerFromVehicle(playerid);
			}
			if(GetPVarInt(playerid, #busID) != newcar && GetPVarInt(playerid, #busID) != 0) return SCM(playerid, -1, "• {AC0000}[Ошибка] {ffffff}Вы уже арендуете автобус!"), RemovePlayerFromVehicle(playerid);
			if(PlayerInfo[playerid][pCash] < 1000) return SCM(playerid, -1, "• {AC0000}[Ошибка] {ffffff}У Вас не достаточно средств для аренды автобуса!"), RemovePlayerFromVehicle(playerid);
			ShowPlayerDialog(playerid,1551,0,"{FF6F00}Аренда автобуса","{"#cWHITE"}Вы хотите арендовать этот автобус за {FF6F00}$1000{"#cWHITE"}?","Арендовать","Отмена");
		}
}
В public OnVehicleSpawn
PHP:
foreach(new i: Player)
{
		if(GetPVarInt(i, #busID) == vehicleid)
		{
			DeletePVar(i, #busID);
			DeletePVar(i, #busRoute);
			DeletePVar(i, #busMoney);
			busPos{i} = 0;
			SCM(i, COLOR_GREY, "Ваше рабочее транспортое средство было отбуксировано!");
			break;
		}
}
В самый низ мода добавим коллбеки:
PHP:
forward bus_stop(playerid);
public bus_stop(playerid)
{
	new pos = busPos{playerid}, route = GetPVarInt(playerid, #busRoute), money_ = GetPVarInt(playerid, #busMoney);
	if(pos == 39)
	{
		PlayerInfo[playerid][pCash] += money_;
		SCMF(playerid, COLOR_GREEN, "Вы проехали один рейс, Вы заработали: $%i", money_);
		busPos{playerid} = 0, SetPVarInt(playerid, #busMoney, 0);
	}
	else busPos{playerid}++, GivePVarInt(playerid, #busMoney, 120);
	new t_pos = busPos{playerid}, type_bus_race = 0;
	if((route == 0 && (t_pos == 1-1 || t_pos == 14-1 || t_pos == 21-1 || t_pos == 28-1 || t_pos == 32-1 || t_pos == 34-1))) type_bus_race = 1;
	SetPlayerRaceCheckpoint(playerid,type_bus_race,aBusPos[route][t_pos][0],aBusPos[route][t_pos][1],aBusPos[route][t_pos][2],aBusPos[route][t_pos+1][0],aBusPos[route][t_pos+1][1],aBusPos[route][t_pos+1][2],4.0);
	return 1;
}
forward spawned_bus(playerid);
public spawned_bus(playerid)
{
	DisablePlayerRaceCheckpoint(playerid);
	SetVehicleToRespawn(GetPVarInt(playerid, #busID));
	DeletePVar(playerid, #busID);
	DeletePVar(playerid, #busRoute);
	PlayerInfo[playerid][pCash] += GetPVarInt(playerid, #busMoney);
	SCMF(playerid, COLOR_GREEN, "Вами было заработано: $%i", GetPVarInt(playerid, #busMoney));
	DeletePVar(playerid, #busMoney);
	busPos{playerid} = 0;
	if(pTemp[playerid][bus_text] != Text3D:INVALID_3DTEXT_ID) DestroyDynamic3DTextLabel(pTemp[playerid][bus_text]);
	pTemp[playerid][bus_text] = Text3D:INVALID_3DTEXT_ID;
	return 1;
}

У кого нет pTemp:
PHP:
enum tempik
{
	bus_timer,
Text3D:bus_text
}
new pTemp[MAX_PLAYERS][tempik];
В public OnPlayerConnect
PHP:
pTemp[playerid][bus_timer] = 0;
В public OnGameModeInit
PHP:
        aBusCar[0] = CreateVehicleEx(437,1278.1936,-1806.0310,13.4728,90.4374,1,1,CAR_SPAWN);
	CreateVehicleEx(437,1278.5215,-1816.3060,13.5169,90.3709,1,1,CAR_SPAWN);
	aBusCar[1] = CreateVehicleEx(437,1278.4976,-1826.7605,13.5181,89.8360,1,1,CAR_SPAWN);
	for(new i;i<sizeof(SellTicket);i++)
	{
		CreateDynamicObjectEx(962,SellTicket[i][0],SellTicket[i][1],SellTicket[i][2],90.0, 0.0,SellTicket[i][3],300.0);
		CreateDynamic3DTextLabel("{FFFFFF}Продажа проездного билета {"#cGREEN"}[$5000]{FFFFFF}\nНажмите 'H'",COLOR_WHITE,SellTicket[i][0],SellTicket[i][1],SellTicket[i][2],15.0);
	}
В public OnPlayerKeyStateChange
PHP:
	if(newkeys & KEY_CTRL_BACK)
	{
		for(new i;i<sizeof(SellTicket);i++)
		{
			if(IsPlayerInRangeOfPoint(playerid,2.0,SellTicket[i][0],SellTicket[i][1],SellTicket[i][2]) && !GetPVarInt(playerid, #busTicket)) { PlayerInfo[playerid][pCash] -= 5000; SetPVarInt(playerid, #busTicket, 1); SCM(playerid, COLOR_GREEN, "Вы успешно приобрели проездной билет!"); break; }
		}
	}

Чтобы изменить маршрут, нужно:
В массиве aBusPos изменить координаты чекпоинтов.
И изменить координаты остановок в коллбеках OnPlayerEnterRaceCheckPoint и bus_stop


Приятного Вам использования, возможно она кому либо понадобиться.
Данная работа была написана под мод Samp Game Life Role Play. [ SGL - RP ] [ В SGL работа уже есть! ].

Турникеты / Проездные билеты написаны - kissad21.
Основная разработка: #Denwer.

Нужные макросы:
PHP:
#define SCMF(%0,%1,%2,%3) format(format_string, 144, %2,%3) && SCM(%0, %1, format_string)
new format_string [144];
Сток:
PHP:
stock MeAction(playerid,action[],Float:distance = 13.0)
{
        new strings[64];
	if(GetPVarInt(playerid, "gag")) return	SCM(playerid, COLOR_LIGHTRED, "У Вас кляп, вы не можете говорить!");
	if(PlayerInfo[playerid][pMuted] > 0) return SCM(playerid,COLOR_WHITE,"У Вас бан чата");
	format(strings,64,"%s %s",PlayerInfo[playerid][pNames],action);
	ProxDetector(distance, playerid, strings, 0xDD90FFFF,0xDD90FFFF,0xDD90FFFF,0xDD90FFFF,0xDD90FFFF);
	return 1;
}
​
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу