#Denwer
Специалист
Доброго времени суток пользователи портала Pawno-Info.Ru
Давно я что то не выкладывал в этот раздел, по этому, хочу выложить свою работу автобусника.
Маршрут один, работа вполне оптимизирована.
Код:
Ко всем переменным [new]
Ко всем массивам / переменным [new]
Ко всем диалогам: public OnDialogResponse
К public OnPlayerEnterCheckPoint
В public OnPlayerStateChange
В public OnVehicleSpawn
В самый низ мода добавим коллбеки:
У кого нет pTemp:
В public OnPlayerConnect
В public OnGameModeInit
В public OnPlayerKeyStateChange
Чтобы изменить маршрут, нужно:
В массиве aBusPos изменить координаты чекпоинтов.
И изменить координаты остановок в коллбеках OnPlayerEnterRaceCheckPoint и bus_stop
Приятного Вам использования, возможно она кому либо понадобиться.
Данная работа была написана под мод Samp Game Life Role Play. [ SGL - RP ] [ В SGL работа уже есть! ].
Турникеты / Проездные билеты написаны - kissad21.
Основная разработка: #Denwer.
Нужные макросы:
Сток:
Давно я что то не выкладывал в этот раздел, по этому, хочу выложить свою работу автобусника.
Маршрут один, работа вполне оптимизирована.
Код:
Ко всем переменным [new]
PHP:
new busPos[MAX_PLAYERS char], aBusCar[2];
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)
};
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;
}
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);
}
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"}?","Арендовать","Отмена");
}
}
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];
PHP:
pTemp[playerid][bus_timer] = 0;
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);
}
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;
}
Последнее редактирование:
