Код:
//==========================================================
// Advanced Vehicle System version 1.0 by MadeMan
//==========================================================
#define FILTERSCRIPT
#include <a_samp>
//=========================SETTINGS=========================
#undef MAX_PLAYERS
#define MAX_PLAYERS 100
#define MAX_DVEHICLES 200
#define MAX_DEALERSHIPS 10
#define MAX_FUEL_STATIONS 10
#define VEHICLE_FILE_PATH "AVS/Vehicles/"
#define DEALERSHIP_FILE_PATH "AVS/Dealerships/"
#define FUEL_STATION_FILE_PATH "AVS/FuelStations/"
#define MAX_PLAYER_VEHICLES 3
#define FUEL_PRICE 5
#define GAS_CAN_PRICE 500
#define ALARM_TIME 10000 // alarm duration in milliseconds (1 second = 1000 milliseconds)
#define DEFAULT_NUMBER_PLATE "123 ABC"
//==========================================================
#define COLOR_BLACK 0x000000FF
#define COLOR_RED 0xEE0000FF
#define COLOR_GREEN 0x00CC00FF
#define COLOR_BLUE 0x0000FFFF
#define COLOR_ORANGE 0xFF6600FF
#define COLOR_YELLOW 0xFFFF00FF
#define COLOR_LIGHTBLUE 0x00FFFFFF
#define COLOR_PURPLE 0xC2A2DAFF
#define COLOR_GREY 0xC0C0C0FF
#define COLOR_WHITE 0xFFFFFFFF
#define VEHICLE_DEALERSHIP 1
#define VEHICLE_PLAYER 2
#define CMD:%1(%2) \
forward cmd_%1(%2); \
public cmd_%1(%2)
#define ShowErrorDialog(%1,%2) ShowPlayerDialog(%1, DIALOG_ERROR, DIALOG_STYLE_MSGBOX, "ERROR", %2, "OK", "")
enum
{
DIALOG_NONE=12345,
DIALOG_ERROR=12346,
DIALOG_VEHICLE=500,
DIALOG_VEHICLE_BUY,
DIALOG_VEHICLE_SELL,
DIALOG_FINDVEHICLE,
DIALOG_TRUNK,
DIALOG_TRUNK_ACTION,
DIALOG_VEHICLE_PLATE,
DIALOG_FUEL,
DIALOG_EDITVEHICLE
};
new maintimer;
new speedotimer;
new savetimer;
new SaveVehicleIndex;
new RefuelTime[MAX_PLAYERS];
new TrackCar[MAX_PLAYERS];
new DialogReturn[MAX_PLAYERS];
//new Text:SpeedoBox;
new Text:SpeedoText[MAX_PLAYERS];
new Float:Fuel[MAX_VEHICLES] = {100.0, ...};
new VehicleSecurity[MAX_VEHICLES];
new VehicleCreated[MAX_DVEHICLES];
new VehicleID[MAX_DVEHICLES];
new VehicleModel[MAX_DVEHICLES];
new Float:VehiclePos[MAX_DVEHICLES][4];
new VehicleColor[MAX_DVEHICLES][2];
new VehicleInterior[MAX_DVEHICLES];
new VehicleWorld[MAX_DVEHICLES];
new VehicleOwner[MAX_DVEHICLES][MAX_PLAYER_NAME];
new VehicleNumberPlate[MAX_DVEHICLES][16];
new VehicleValue[MAX_DVEHICLES];
new VehicleLock[MAX_DVEHICLES];
new VehicleAlarm[MAX_DVEHICLES];
new VehicleTrunk[MAX_DVEHICLES][5][2];
new VehicleMods[MAX_DVEHICLES][14];
new VehiclePaintjob[MAX_DVEHICLES] = {255, ...};
new Text3D:VehicleLabel[MAX_DVEHICLES];
new DealershipCreated[MAX_DEALERSHIPS];
new Float:DealershipPos[MAX_DEALERSHIPS][3];
new Text3D:DealershipLabel[MAX_DEALERSHIPS];
new FuelStationCreated[MAX_FUEL_STATIONS];
new Float:FuelStationPos[MAX_FUEL_STATIONS][3];
new Text3D:FuelStationLabel[MAX_FUEL_STATIONS];
new VehicleNames[][] = {
"Landstalker","Bravura","Buffalo","Linerunner","Perennial","Sentinel","Dumper","Firetruck","Trashmaster","Stretch","Manana","Infernus",
"Voodoo","Pony","Mule","Cheetah","Ambulance","Leviathan","Moonbeam","Esperanto","Taxi","Washington","Bobcat","Mr Whoopee","BF Injection",
"Hunter","Premier","Enforcer","Securicar","Banshee","Predator","Bus","Rhino","Barracks","Hotknife","Trailer","Previon","Coach","Cabbie",
"Stallion","Rumpo","RC Bandit","Romero","Packer","Monster","Admiral","Squalo","Seasparrow","Pizzaboy","Tram","Trailer","Turismo","Speeder",
"Reefer","Tropic","Flatbed","Yankee","Caddy","Solair","Berkley's RC Van","Skimmer","PCJ-600","Faggio","Freeway","RC Baron","RC Raider",
"Glendale","Oceanic","Sanchez","Sparrow","Patriot","Quad","Coastguard","Dinghy","Hermes","Sabre","Rustler","ZR3 50","Walton","Regina",
"Comet","BMX","Burrito","Camper","Marquis","Baggage","Dozer","Maverick","News Chopper","Rancher","FBI Rancher","Virgo","Greenwood",
"Jetmax","Hotring","Sandking","Blista Compact","Police Maverick","Boxville","Benson","Mesa","RC Goblin","Hotring Racer A","Hotring Racer B",
"Bloodring Banger","Rancher","Super GT","Elegant","Journey","Bike","Mountain Bike","Beagle","Cropdust","Stunt","Tanker","RoadTrain",
"Nebula","Majestic","Buccaneer","Shamal","Hydra","FCR-900","NRG-500","HPV1000","Cement Truck","Tow Truck","Fortune","Cadrona","FBI Truck",
"Willard","Forklift","Tractor","Combine","Feltzer","Remington","Slamvan","Blade","Freight","Streak","Vortex","Vincent","Bullet","Clover",
"Sadler","Firetruck","Hustler","Intruder","Primo","Cargobob","Tampa","Sunrise","Merit","Utility","Nevada","Yosemite","Windsor","Monster A",
"Monster B","Uranus","Jester","Sultan","Stratum","Elegy","Raindance","RC Tiger","Flash","Tahoma","Savanna","Bandito","Freight","Trailer",
"Kart","Mower","Duneride","Sweeper","Broadway","Tornado","AT-400","DFT-30","Huntley","Stafford","BF-400","Newsvan","Tug","Trailer A","Emperor",
"Wayfarer","Euros","Hotdog","Club","Trailer B","Trailer C","Andromada","Dodo","RC Cam","Launch","Police Car (LSPD)","Police Car (SFPD)",
"Police Car (LVPD)","Police Ranger","Picador","S.W.A.T. Van","Alpha","Phoenix","Glendale","Sadler","Luggage Trailer A","Luggage Trailer B",
"Stair Trailer","Boxville","Farm Plow","Utility Trailer"
};
enum MainZone
{
Zone_Name[28],
Float:Zone_Area[6]
}
static const SanAndreasZones[][MainZone] = {
{"The Big Ear", {-410.00,1403.30,-3.00,-137.90,1681.20,200.00}},
{"Aldea Malvada", {-1372.10,2498.50,0.00,-1277.50,2615.30,200.00}},
{"Angel Pine", {-2324.90,-2584.20,-6.10,-1964.20,-2212.10,200.00}},
{"Arco del Oeste", {-901.10,2221.80,0.00,-592.00,2571.90,200.00}},
{"Avispa Country Club", {-2646.40,-355.40,0.00,-2270.00,-222.50,200.00}},
{"Avispa Country Club", {-2831.80,-430.20,-6.10,-2646.40,-222.50,200.00}},
{"Avispa Country Club", {-2361.50,-417.10,0.00,-2270.00,-355.40,200.00}},
{"Avispa Country Club", {-2667.80,-302.10,-28.80,-2646.40,-262.30,71.10}},
{"Avispa Country Club", {-2470.00,-355.40,0.00,-2270.00,-318.40,46.10}},
{"Avispa Country Club", {-2550.00,-355.40,0.00,-2470.00,-318.40,39.70}},
{"Back o Beyond", {-1166.90,-2641.10,0.00,-321.70,-1856.00,200.00}},
{"Battery Point", {-2741.00,1268.40,-4.50,-2533.00,1490.40,200.00}},
{"Bayside", {-2741.00,2175.10,0.00,-2353.10,2722.70,200.00}},
{"Bayside Marina", {-2353.10,2275.70,0.00,-2153.10,2475.70,200.00}},
{"Beacon Hill", {-399.60,-1075.50,-1.40,-319.00,-977.50,198.50}},
{"Blackfield", {964.30,1203.20,-89.00,1197.30,1403.20,110.90}},
{"Blackfield", {964.30,1403.20,-89.00,1197.30,1726.20,110.90}},
{"Blackfield Chapel", {1375.60,596.30,-89.00,1558.00,823.20,110.90}},
{"Blackfield Chapel", {1325.60,596.30,-89.00,1375.60,795.00,110.90}},
{"Blackfield Intersection", {1197.30,1044.60,-89.00,1277.00,1163.30,110.90}},
{"Blackfield Intersection", {1166.50,795.00,-89.00,1375.60,1044.60,110.90}},
{"Blackfield Intersection", {1277.00,1044.60,-89.00,1315.30,1087.60,110.90}},
{"Blackfield Intersection", {1375.60,823.20,-89.00,1457.30,919.40,110.90}},
{"Blueberry", {104.50,-220.10,2.30,349.60,152.20,200.00}},
{"Blueberry", {19.60,-404.10,3.80,349.60,-220.10,200.00}},
{"Blueberry Acres", {-319.60,-220.10,0.00,104.50,293.30,200.00}},
{"Caligula's Palace", {2087.30,1543.20,-89.00,2437.30,1703.20,110.90}},
{"Caligula's Palace", {2137.40,1703.20,-89.00,2437.30,1783.20,110.90}},
{"Calton Heights", {-2274.10,744.10,-6.10,-1982.30,1358.90,200.00}},
{"Chinatown", {-2274.10,578.30,-7.60,-2078.60,744.10,200.00}},
{"City Hall", {-2867.80,277.40,-9.10,-2593.40,458.40,200.00}},
{"Come-A-Lot", {2087.30,943.20,-89.00,2623.10,1203.20,110.90}},
{"Commerce", {1323.90,-1842.20,-89.00,1701.90,-1722.20,110.90}},
{"Commerce", {1323.90,-1722.20,-89.00,1440.90,-1577.50,110.90}},
{"Commerce", {1370.80,-1577.50,-89.00,1463.90,-1384.90,110.90}},
{"Commerce", {1463.90,-1577.50,-89.00,1667.90,-1430.80,110.90}},
{"Commerce", {1583.50,-1722.20,-89.00,1758.90,-1577.50,110.90}},
{"Commerce", {1667.90,-1577.50,-89.00,1812.60,-1430.80,110.90}},
{"Conference Center", {1046.10,-1804.20,-89.00,1323.90,-1722.20,110.90}},
{"Conference Center", {1073.20,-1842.20,-89.00,1323.90,-1804.20,110.90}},
{"Cranberry Station", {-2007.80,56.30,0.00,-1922.00,224.70,100.00}},
{"Creek", {2749.90,1937.20,-89.00,2921.60,2669.70,110.90}},
{"Dillimore", {580.70,-674.80,-9.50,861.00,-404.70,200.00}},
{"Doherty", {-2270.00,-324.10,-0.00,-1794.90,-222.50,200.00}},
{"Doherty", {-2173.00,-222.50,-0.00,-1794.90,265.20,200.00}},
{"Downtown", {-1982.30,744.10,-6.10,-1871.70,1274.20,200.00}},
{"Downtown", {-1871.70,1176.40,-4.50,-1620.30,1274.20,200.00}},
{"Downtown", {-1700.00,744.20,-6.10,-1580.00,1176.50,200.00}},
{"Downtown", {-1580.00,744.20,-6.10,-1499.80,1025.90,200.00}},
{"Downtown", {-2078.60,578.30,-7.60,-1499.80,744.20,200.00}},
{"Downtown", {-1993.20,265.20,-9.10,-1794.90,578.30,200.00}},
{"Downtown Los Santos", {1463.90,-1430.80,-89.00,1724.70,-1290.80,110.90}},
{"Downtown Los Santos", {1724.70,-1430.80,-89.00,1812.60,-1250.90,110.90}},
{"Downtown Los Santos", {1463.90,-1290.80,-89.00,1724.70,-1150.80,110.90}},
{"Downtown Los Santos", {1370.80,-1384.90,-89.00,1463.90,-1170.80,110.90}},
{"Downtown Los Santos", {1724.70,-1250.90,-89.00,1812.60,-1150.80,110.90}},
{"Downtown Los Santos", {1370.80,-1170.80,-89.00,1463.90,-1130.80,110.90}},
{"Downtown Los Santos", {1378.30,-1130.80,-89.00,1463.90,-1026.30,110.90}},
{"Downtown Los Santos", {1391.00,-1026.30,-89.00,1463.90,-926.90,110.90}},
{"Downtown Los Santos", {1507.50,-1385.20,110.90,1582.50,-1325.30,335.90}},
{"East Beach", {2632.80,-1852.80,-89.00,2959.30,-1668.10,110.90}},
{"East Beach", {2632.80,-1668.10,-89.00,2747.70,-1393.40,110.90}},
{"East Beach", {2747.70,-1668.10,-89.00,2959.30,-1498.60,110.90}},
{"East Beach", {2747.70,-1498.60,-89.00,2959.30,-1120.00,110.90}},
{"East Los Santos", {2421.00,-1628.50,-89.00,2632.80,-1454.30,110.90}},
{"East Los Santos", {2222.50,-1628.50,-89.00,2421.00,-1494.00,110.90}},
{"East Los Santos", {2266.20,-1494.00,-89.00,2381.60,-1372.00,110.90}},
{"East Los Santos", {2381.60,-1494.00,-89.00,2421.00,-1454.30,110.90}},
{"East Los Santos", {2281.40,-1372.00,-89.00,2381.60,-1135.00,110.90}},
{"East Los Santos", {2381.60,-1454.30,-89.00,2462.10,-1135.00,110.90}},
{"East Los Santos", {2462.10,-1454.30,-89.00,2581.70,-1135.00,110.90}},
{"Easter Basin", {-1794.90,249.90,-9.10,-1242.90,578.30,200.00}},
{"Easter Basin", {-1794.90,-50.00,-0.00,-1499.80,249.90,200.00}},
{"Easter Bay Airport", {-1499.80,-50.00,-0.00,-1242.90,249.90,200.00}},
{"Easter Bay Airport", {-1794.90,-730.10,-3.00,-1213.90,-50.00,200.00}},
{"Easter Bay Airport", {-1213.90,-730.10,0.00,-1132.80,-50.00,200.00}},
{"Easter Bay Airport", {-1242.90,-50.00,0.00,-1213.90,578.30,200.00}},
{"Easter Bay Airport", {-1213.90,-50.00,-4.50,-947.90,578.30,200.00}},
{"Easter Bay Airport", {-1315.40,-405.30,15.40,-1264.40,-209.50,25.40}},
{"Easter Bay Airport", {-1354.30,-287.30,15.40,-1315.40,-209.50,25.40}},
{"Easter Bay Airport", {-1490.30,-209.50,15.40,-1264.40,-148.30,25.40}},
{"Easter Bay Chemicals", {-1132.80,-768.00,0.00,-956.40,-578.10,200.00}},
{"Easter Bay Chemicals", {-1132.80,-787.30,0.00,-956.40,-768.00,200.00}},
{"El Castillo del Diablo", {-464.50,2217.60,0.00,-208.50,2580.30,200.00}},
{"El Castillo del Diablo", {-208.50,2123.00,-7.60,114.00,2337.10,200.00}},
{"El Castillo del Diablo", {-208.50,2337.10,0.00,8.40,2487.10,200.00}},
{"El Corona", {1812.60,-2179.20,-89.00,1970.60,-1852.80,110.90}},
{"El Corona", {1692.60,-2179.20,-89.00,1812.60,-1842.20,110.90}},
{"El Quebrados", {-1645.20,2498.50,0.00,-1372.10,2777.80,200.00}},
{"Esplanade East", {-1620.30,1176.50,-4.50,-1580.00,1274.20,200.00}},
{"Esplanade East", {-1580.00,1025.90,-6.10,-1499.80,1274.20,200.00}},
{"Esplanade East", {-1499.80,578.30,-79.60,-1339.80,1274.20,20.30}},
{"Esplanade North", {-2533.00,1358.90,-4.50,-1996.60,1501.20,200.00}},
{"Esplanade North", {-1996.60,1358.90,-4.50,-1524.20,1592.50,200.00}},
{"Esplanade North", {-1982.30,1274.20,-4.50,-1524.20,1358.90,200.00}},
{"Fallen Tree", {-792.20,-698.50,-5.30,-452.40,-380.00,200.00}},
{"Fallow Bridge", {434.30,366.50,0.00,603.00,555.60,200.00}},
{"Fern Ridge", {508.10,-139.20,0.00,1306.60,119.50,200.00}},
{"Financial", {-1871.70,744.10,-6.10,-1701.30,1176.40,300.00}},
{"Fisher's Lagoon", {1916.90,-233.30,-100.00,2131.70,13.80,200.00}},
{"Flint Intersection", {-187.70,-1596.70,-89.00,17.00,-1276.60,110.90}},
{"Flint Range", {-594.10,-1648.50,0.00,-187.70,-1276.60,200.00}},
{"Fort Carson", {-376.20,826.30,-3.00,123.70,1220.40,200.00}},
{"Foster Valley", {-2270.00,-430.20,-0.00,-2178.60,-324.10,200.00}},
{"Foster Valley", {-2178.60,-599.80,-0.00,-1794.90,-324.10,200.00}},
{"Foster Valley", {-2178.60,-1115.50,0.00,-1794.90,-599.80,200.00}},
{"Foster Valley", {-2178.60,-1250.90,0.00,-1794.90,-1115.50,200.00}},
{"Frederick Bridge", {2759.20,296.50,0.00,2774.20,594.70,200.00}},
{"Gant Bridge", {-2741.40,1659.60,-6.10,-2616.40,2175.10,200.00}},
{"Gant Bridge", {-2741.00,1490.40,-6.10,-2616.40,1659.60,200.00}},
{"Ganton", {2222.50,-1852.80,-89.00,2632.80,-1722.30,110.90}},
{"Ganton", {2222.50,-1722.30,-89.00,2632.80,-1628.50,110.90}},
{"Garcia", {-2411.20,-222.50,-0.00,-2173.00,265.20,200.00}},
{"Garcia", {-2395.10,-222.50,-5.30,-2354.00,-204.70,200.00}},
{"Garver Bridge", {-1339.80,828.10,-89.00,-1213.90,1057.00,110.90}},
{"Garver Bridge", {-1213.90,950.00,-89.00,-1087.90,1178.90,110.90}},
{"Garver Bridge", {-1499.80,696.40,-179.60,-1339.80,925.30,20.30}},
{"Glen Park", {1812.60,-1449.60,-89.00,1996.90,-1350.70,110.90}},
{"Glen Park", {1812.60,-1100.80,-89.00,1994.30,-973.30,110.90}},
{"Glen Park", {1812.60,-1350.70,-89.00,2056.80,-1100.80,110.90}},
{"Green Palms", {176.50,1305.40,-3.00,338.60,1520.70,200.00}},
{"Greenglass College", {964.30,1044.60,-89.00,1197.30,1203.20,110.90}},
{"Greenglass College", {964.30,930.80,-89.00,1166.50,1044.60,110.90}},
{"Hampton Barns", {603.00,264.30,0.00,761.90,366.50,200.00}},
{"Hankypanky Point", {2576.90,62.10,0.00,2759.20,385.50,200.00}},
{"Harry Gold Parkway", {1777.30,863.20,-89.00,1817.30,2342.80,110.90}},
{"Hashbury", {-2593.40,-222.50,-0.00,-2411.20,54.70,200.00}},
{"Hilltop Farm", {967.30,-450.30,-3.00,1176.70,-217.90,200.00}},
{"Hunter Quarry", {337.20,710.80,-115.20,860.50,1031.70,203.70}},
{"Idlewood", {1812.60,-1852.80,-89.00,1971.60,-1742.30,110.90}},
{"Idlewood", {1812.60,-1742.30,-89.00,1951.60,-1602.30,110.90}},
{"Idlewood", {1951.60,-1742.30,-89.00,2124.60,-1602.30,110.90}},
{"Idlewood", {1812.60,-1602.30,-89.00,2124.60,-1449.60,110.90}},
{"Idlewood", {2124.60,-1742.30,-89.00,2222.50,-1494.00,110.90}},
{"Idlewood", {1971.60,-1852.80,-89.00,2222.50,-1742.30,110.90}},
{"Jefferson", {1996.90,-1449.60,-89.00,2056.80,-1350.70,110.90}},
{"Jefferson", {2124.60,-1494.00,-89.00,2266.20,-1449.60,110.90}},
{"Jefferson", {2056.80,-1372.00,-89.00,2281.40,-1210.70,110.90}},
{"Jefferson", {2056.80,-1210.70,-89.00,2185.30,-1126.30,110.90}},
{"Jefferson", {2185.30,-1210.70,-89.00,2281.40,-1154.50,110.90}},
{"Jefferson", {2056.80,-1449.60,-89.00,2266.20,-1372.00,110.90}},
{"Julius Thruway East", {2623.10,943.20,-89.00,2749.90,1055.90,110.90}},
{"Julius Thruway East", {2685.10,1055.90,-89.00,2749.90,2626.50,110.90}},
{"Julius Thruway East", {2536.40,2442.50,-89.00,2685.10,2542.50,110.90}},
{"Julius Thruway East", {2625.10,2202.70,-89.00,2685.10,2442.50,110.90}},
{"Julius Thruway North", {2498.20,2542.50,-89.00,2685.10,2626.50,110.90}},
{"Julius Thruway North", {2237.40,2542.50,-89.00,2498.20,2663.10,110.90}},
{"Julius Thruway North", {2121.40,2508.20,-89.00,2237.40,2663.10,110.90}},
{"Julius Thruway North", {1938.80,2508.20,-89.00,2121.40,2624.20,110.90}},
{"Julius Thruway North", {1534.50,2433.20,-89.00,1848.40,2583.20,110.90}},
{"Julius Thruway North", {1848.40,2478.40,-89.00,1938.80,2553.40,110.90}},
{"Julius Thruway North", {1704.50,2342.80,-89.00,1848.40,2433.20,110.90}},
{"Julius Thruway North", {1377.30,2433.20,-89.00,1534.50,2507.20,110.90}},
{"Julius Thruway South", {1457.30,823.20,-89.00,2377.30,863.20,110.90}},
{"Julius Thruway South", {2377.30,788.80,-89.00,2537.30,897.90,110.90}},
{"Julius Thruway West", {1197.30,1163.30,-89.00,1236.60,2243.20,110.90}},
{"Julius Thruway West", {1236.60,2142.80,-89.00,1297.40,2243.20,110.90}},
{"Juniper Hill", {-2533.00,578.30,-7.60,-2274.10,968.30,200.00}},
{"Juniper Hollow", {-2533.00,968.30,-6.10,-2274.10,1358.90,200.00}},
{"K.A.C.C. Military Fuels", {2498.20,2626.50,-89.00,2749.90,2861.50,110.90}},
{"Kincaid Bridge", {-1339.80,599.20,-89.00,-1213.90,828.10,110.90}},
{"Kincaid Bridge", {-1213.90,721.10,-89.00,-1087.90,950.00,110.90}},
{"Kincaid Bridge", {-1087.90,855.30,-89.00,-961.90,986.20,110.90}},
{"King's", {-2329.30,458.40,-7.60,-1993.20,578.30,200.00}},
{"King's", {-2411.20,265.20,-9.10,-1993.20,373.50,200.00}},
{"King's", {-2253.50,373.50,-9.10,-1993.20,458.40,200.00}},
{"LVA Freight Depot", {1457.30,863.20,-89.00,1777.40,1143.20,110.90}},
{"LVA Freight Depot", {1375.60,919.40,-89.00,1457.30,1203.20,110.90}},
{"LVA Freight Depot", {1277.00,1087.60,-89.00,1375.60,1203.20,110.90}},
{"LVA Freight Depot", {1315.30,1044.60,-89.00,1375.60,1087.60,110.90}},
{"LVA Freight Depot", {1236.60,1163.40,-89.00,1277.00,1203.20,110.90}},
{"Las Barrancas", {-926.10,1398.70,-3.00,-719.20,1634.60,200.00}},
{"Las Brujas", {-365.10,2123.00,-3.00,-208.50,2217.60,200.00}},
{"Las Colinas", {1994.30,-1100.80,-89.00,2056.80,-920.80,110.90}},
{"Las Colinas", {2056.80,-1126.30,-89.00,2126.80,-920.80,110.90}},
{"Las Colinas", {2185.30,-1154.50,-89.00,2281.40,-934.40,110.90}},
{"Las Colinas", {2126.80,-1126.30,-89.00,2185.30,-934.40,110.90}},
{"Las Colinas", {2747.70,-1120.00,-89.00,2959.30,-945.00,110.90}},
{"Las Colinas", {2632.70,-1135.00,-89.00,2747.70,-945.00,110.90}},
{"Las Colinas", {2281.40,-1135.00,-89.00,2632.70,-945.00,110.90}},
{"Las Payasadas", {-354.30,2580.30,2.00,-133.60,2816.80,200.00}},
{"Las Venturas Airport", {1236.60,1203.20,-89.00,1457.30,1883.10,110.90}},
{"Las Venturas Airport", {1457.30,1203.20,-89.00,1777.30,1883.10,110.90}},
{"Las Venturas Airport", {1457.30,1143.20,-89.00,1777.40,1203.20,110.90}},
{"Las Venturas Airport", {1515.80,1586.40,-12.50,1729.90,1714.50,87.50}},
{"Last Dime Motel", {1823.00,596.30,-89.00,1997.20,823.20,110.90}},
{"Leafy Hollow", {-1166.90,-1856.00,0.00,-815.60,-1602.00,200.00}},
{"Liberty City", {-1000.00,400.00,1300.00,-700.00,600.00,1400.00}},
{"Lil' Probe Inn", {-90.20,1286.80,-3.00,153.80,1554.10,200.00}},
{"Linden Side", {2749.90,943.20,-89.00,2923.30,1198.90,110.90}},
{"Linden Station", {2749.90,1198.90,-89.00,2923.30,1548.90,110.90}},
{"Linden Station", {2811.20,1229.50,-39.50,2861.20,1407.50,60.40}},
{"Little Mexico", {1701.90,-1842.20,-89.00,1812.60,-1722.20,110.90}},
{"Little Mexico", {1758.90,-1722.20,-89.00,1812.60,-1577.50,110.90}},
{"Los Flores", {2581.70,-1454.30,-89.00,2632.80,-1393.40,110.90}},
{"Los Flores", {2581.70,-1393.40,-89.00,2747.70,-1135.00,110.90}},
{"Los Santos International", {1249.60,-2394.30,-89.00,1852.00,-2179.20,110.90}},
{"Los Santos International", {1852.00,-2394.30,-89.00,2089.00,-2179.20,110.90}},
{"Los Santos International", {1382.70,-2730.80,-89.00,2201.80,-2394.30,110.90}},
{"Los Santos International", {1974.60,-2394.30,-39.00,2089.00,-2256.50,60.90}},
{"Los Santos International", {1400.90,-2669.20,-39.00,2189.80,-2597.20,60.90}},
{"Los Santos International", {2051.60,-2597.20,-39.00,2152.40,-2394.30,60.90}},
{"Marina", {647.70,-1804.20,-89.00,851.40,-1577.50,110.90}},
{"Marina", {647.70,-1577.50,-89.00,807.90,-1416.20,110.90}},
{"Marina", {807.90,-1577.50,-89.00,926.90,-1416.20,110.90}},
{"Market", {787.40,-1416.20,-89.00,1072.60,-1310.20,110.90}},
{"Market", {952.60,-1310.20,-89.00,1072.60,-1130.80,110.90}},
{"Market", {1072.60,-1416.20,-89.00,1370.80,-1130.80,110.90}},
{"Market", {926.90,-1577.50,-89.00,1370.80,-1416.20,110.90}},
{"Market Station", {787.40,-1410.90,-34.10,866.00,-1310.20,65.80}},
{"Martin Bridge", {-222.10,293.30,0.00,-122.10,476.40,200.00}},
{"Missionary Hill", {-2994.40,-811.20,0.00,-2178.60,-430.20,200.00}},
{"Montgomery", {1119.50,119.50,-3.00,1451.40,493.30,200.00}},
{"Montgomery", {1451.40,347.40,-6.10,1582.40,420.80,200.00}},
{"Montgomery Intersection", {1546.60,208.10,0.00,1745.80,347.40,200.00}},
{"Montgomery Intersection", {1582.40,347.40,0.00,1664.60,401.70,200.00}},
{"Mulholland", {1414.00,-768.00,-89.00,1667.60,-452.40,110.90}},
{"Mulholland", {1281.10,-452.40,-89.00,1641.10,-290.90,110.90}},
{"Mulholland", {1269.10,-768.00,-89.00,1414.00,-452.40,110.90}},
{"Mulholland", {1357.00,-926.90,-89.00,1463.90,-768.00,110.90}},
{"Mulholland", {1318.10,-910.10,-89.00,1357.00,-768.00,110.90}},
{"Mulholland", {1169.10,-910.10,-89.00,1318.10,-768.00,110.90}},
{"Mulholland", {768.60,-954.60,-89.00,952.60,-860.60,110.90}},
{"Mulholland", {687.80,-860.60,-89.00,911.80,-768.00,110.90}},
{"Mulholland", {737.50,-768.00,-89.00,1142.20,-674.80,110.90}},
{"Mulholland", {1096.40,-910.10,-89.00,1169.10,-768.00,110.90}},
{"Mulholland", {952.60,-937.10,-89.00,1096.40,-860.60,110.90}},
{"Mulholland", {911.80,-860.60,-89.00,1096.40,-768.00,110.90}},
{"Mulholland", {861.00,-674.80,-89.00,1156.50,-600.80,110.90}},
{"Mulholland Intersection", {1463.90,-1150.80,-89.00,1812.60,-768.00,110.90}},
{"North Rock", {2285.30,-768.00,0.00,2770.50,-269.70,200.00}},
{"Ocean Docks", {2373.70,-2697.00,-89.00,2809.20,-2330.40,110.90}},
{"Ocean Docks", {2201.80,-2418.30,-89.00,2324.00,-2095.00,110.90}},
{"Ocean Docks", {2324.00,-2302.30,-89.00,2703.50,-2145.10,110.90}},
{"Ocean Docks", {2089.00,-2394.30,-89.00,2201.80,-2235.80,110.90}},
{"Ocean Docks", {2201.80,-2730.80,-89.00,2324.00,-2418.30,110.90}},
{"Ocean Docks", {2703.50,-2302.30,-89.00,2959.30,-2126.90,110.90}},
{"Ocean Docks", {2324.00,-2145.10,-89.00,2703.50,-2059.20,110.90}},
{"Ocean Flats", {-2994.40,277.40,-9.10,-2867.80,458.40,200.00}},
{"Ocean Flats", {-2994.40,-222.50,-0.00,-2593.40,277.40,200.00}},
{"Ocean Flats", {-2994.40,-430.20,-0.00,-2831.80,-222.50,200.00}},
{"Octane Springs", {338.60,1228.50,0.00,664.30,1655.00,200.00}},
{"Old Venturas Strip", {2162.30,2012.10,-89.00,2685.10,2202.70,110.90}},
{"Palisades", {-2994.40,458.40,-6.10,-2741.00,1339.60,200.00}},
{"Palomino Creek", {2160.20,-149.00,0.00,2576.90,228.30,200.00}},
{"Paradiso", {-2741.00,793.40,-6.10,-2533.00,1268.40,200.00}},
{"Pershing Square", {1440.90,-1722.20,-89.00,1583.50,-1577.50,110.90}},
{"Pilgrim", {2437.30,1383.20,-89.00,2624.40,1783.20,110.90}},
{"Pilgrim", {2624.40,1383.20,-89.00,2685.10,1783.20,110.90}},
{"Pilson Intersection", {1098.30,2243.20,-89.00,1377.30,2507.20,110.90}},
{"Pirates in Men's Pants", {1817.30,1469.20,-89.00,2027.40,1703.20,110.90}},
{"Playa del Seville", {2703.50,-2126.90,-89.00,2959.30,-1852.80,110.90}},
{"Prickle Pine", {1534.50,2583.20,-89.00,1848.40,2863.20,110.90}},
{"Prickle Pine", {1117.40,2507.20,-89.00,1534.50,2723.20,110.90}},
{"Prickle Pine", {1848.40,2553.40,-89.00,1938.80,2863.20,110.90}},
{"Prickle Pine", {1938.80,2624.20,-89.00,2121.40,2861.50,110.90}},
{"Queens", {-2533.00,458.40,0.00,-2329.30,578.30,200.00}},
{"Queens", {-2593.40,54.70,0.00,-2411.20,458.40,200.00}},
{"Queens", {-2411.20,373.50,0.00,-2253.50,458.40,200.00}},
{"Randolph Industrial", {1558.00,596.30,-89.00,1823.00,823.20,110.90}},
{"Redsands East", {1817.30,2011.80,-89.00,2106.70,2202.70,110.90}},
{"Redsands East", {1817.30,2202.70,-89.00,2011.90,2342.80,110.90}},
{"Redsands East", {1848.40,2342.80,-89.00,2011.90,2478.40,110.90}},
{"Redsands West", {1236.60,1883.10,-89.00,1777.30,2142.80,110.90}},
{"Redsands West", {1297.40,2142.80,-89.00,1777.30,2243.20,110.90}},
{"Redsands West", {1377.30,2243.20,-89.00,1704.50,2433.20,110.90}},
{"Redsands West", {1704.50,2243.20,-89.00,1777.30,2342.80,110.90}},
{"Regular Tom", {-405.70,1712.80,-3.00,-276.70,1892.70,200.00}},
{"Richman", {647.50,-1118.20,-89.00,787.40,-954.60,110.90}},
{"Richman", {647.50,-954.60,-89.00,768.60,-860.60,110.90}},
{"Richman", {225.10,-1369.60,-89.00,334.50,-1292.00,110.90}},
{"Richman", {225.10,-1292.00,-89.00,466.20,-1235.00,110.90}},
{"Richman", {72.60,-1404.90,-89.00,225.10,-1235.00,110.90}},
{"Richman", {72.60,-1235.00,-89.00,321.30,-1008.10,110.90}},
{"Richman", {321.30,-1235.00,-89.00,647.50,-1044.00,110.90}},
{"Richman", {321.30,-1044.00,-89.00,647.50,-860.60,110.90}},
{"Richman", {321.30,-860.60,-89.00,687.80,-768.00,110.90}},
{"Richman", {321.30,-768.00,-89.00,700.70,-674.80,110.90}},
{"Robada Intersection", {-1119.00,1178.90,-89.00,-862.00,1351.40,110.90}},
{"Roca Escalante", {2237.40,2202.70,-89.00,2536.40,2542.50,110.90}},
{"Roca Escalante", {2536.40,2202.70,-89.00,2625.10,2442.50,110.90}},
{"Rockshore East", {2537.30,676.50,-89.00,2902.30,943.20,110.90}},
{"Rockshore West", {1997.20,596.30,-89.00,2377.30,823.20,110.90}},
{"Rockshore West", {2377.30,596.30,-89.00,2537.30,788.80,110.90}},
{"Rodeo", {72.60,-1684.60,-89.00,225.10,-1544.10,110.90}},
{"Rodeo", {72.60,-1544.10,-89.00,225.10,-1404.90,110.90}},
{"Rodeo", {225.10,-1684.60,-89.00,312.80,-1501.90,110.90}},
{"Rodeo", {225.10,-1501.90,-89.00,334.50,-1369.60,110.90}},
{"Rodeo", {334.50,-1501.90,-89.00,422.60,-1406.00,110.90}},
{"Rodeo", {312.80,-1684.60,-89.00,422.60,-1501.90,110.90}},
{"Rodeo", {422.60,-1684.60,-89.00,558.00,-1570.20,110.90}},
{"Rodeo", {558.00,-1684.60,-89.00,647.50,-1384.90,110.90}},
{"Rodeo", {466.20,-1570.20,-89.00,558.00,-1385.00,110.90}},
{"Rodeo", {422.60,-1570.20,-89.00,466.20,-1406.00,110.90}},
{"Rodeo", {466.20,-1385.00,-89.00,647.50,-1235.00,110.90}},
{"Rodeo", {334.50,-1406.00,-89.00,466.20,-1292.00,110.90}},
{"Royal Casino", {2087.30,1383.20,-89.00,2437.30,1543.20,110.90}},
{"San Andreas Sound", {2450.30,385.50,-100.00,2759.20,562.30,200.00}},
{"Santa Flora", {-2741.00,458.40,-7.60,-2533.00,793.40,200.00}},
{"Santa Maria Beach", {342.60,-2173.20,-89.00,647.70,-1684.60,110.90}},
{"Santa Maria Beach", {72.60,-2173.20,-89.00,342.60,-1684.60,110.90}},
{"Shady Cabin", {-1632.80,-2263.40,-3.00,-1601.30,-2231.70,200.00}},
{"Shady Creeks", {-1820.60,-2643.60,-8.00,-1226.70,-1771.60,200.00}},
{"Shady Creeks", {-2030.10,-2174.80,-6.10,-1820.60,-1771.60,200.00}},
{"Sobell Rail Yards", {2749.90,1548.90,-89.00,2923.30,1937.20,110.90}},
{"Spinybed", {2121.40,2663.10,-89.00,2498.20,2861.50,110.90}},
{"Starfish Casino", {2437.30,1783.20,-89.00,2685.10,2012.10,110.90}},
{"Starfish Casino", {2437.30,1858.10,-39.00,2495.00,1970.80,60.90}},
{"Starfish Casino", {2162.30,1883.20,-89.00,2437.30,2012.10,110.90}},
{"Temple", {1252.30,-1130.80,-89.00,1378.30,-1026.30,110.90}},
{"Temple", {1252.30,-1026.30,-89.00,1391.00,-926.90,110.90}},
{"Temple", {1252.30,-926.90,-89.00,1357.00,-910.10,110.90}},
{"Temple", {952.60,-1130.80,-89.00,1096.40,-937.10,110.90}},
{"Temple", {1096.40,-1130.80,-89.00,1252.30,-1026.30,110.90}},
{"Temple", {1096.40,-1026.30,-89.00,1252.30,-910.10,110.90}},
{"The Camel's Toe", {2087.30,1203.20,-89.00,2640.40,1383.20,110.90}},
{"The Clown's Pocket", {2162.30,1783.20,-89.00,2437.30,1883.20,110.90}},
{"The Emerald Isle", {2011.90,2202.70,-89.00,2237.40,2508.20,110.90}},
{"The Farm", {-1209.60,-1317.10,114.90,-908.10,-787.30,251.90}},
{"Four Dragons Casino", {1817.30,863.20,-89.00,2027.30,1083.20,110.90}},
{"The High Roller", {1817.30,1283.20,-89.00,2027.30,1469.20,110.90}},
{"The Mako Span", {1664.60,401.70,0.00,1785.10,567.20,200.00}},
{"The Panopticon", {-947.90,-304.30,-1.10,-319.60,327.00,200.00}},
{"The Pink Swan", {1817.30,1083.20,-89.00,2027.30,1283.20,110.90}},
{"The Sherman Dam", {-968.70,1929.40,-3.00,-481.10,2155.20,200.00}},
{"The Strip", {2027.40,863.20,-89.00,2087.30,1703.20,110.90}},
{"The Strip", {2106.70,1863.20,-89.00,2162.30,2202.70,110.90}},
{"The Strip", {2027.40,1783.20,-89.00,2162.30,1863.20,110.90}},
{"The Strip", {2027.40,1703.20,-89.00,2137.40,1783.20,110.90}},
{"The Visage", {1817.30,1863.20,-89.00,2106.70,2011.80,110.90}},
{"The Visage", {1817.30,1703.20,-89.00,2027.40,1863.20,110.90}},
{"Unity Station", {1692.60,-1971.80,-20.40,1812.60,-1932.80,79.50}},
{"Valle Ocultado", {-936.60,2611.40,2.00,-715.90,2847.90,200.00}},
{"Verdant Bluffs", {930.20,-2488.40,-89.00,1249.60,-2006.70,110.90}},
{"Verdant Bluffs", {1073.20,-2006.70,-89.00,1249.60,-1842.20,110.90}},
{"Verdant Bluffs", {1249.60,-2179.20,-89.00,1692.60,-1842.20,110.90}},
{"Verdant Meadows", {37.00,2337.10,-3.00,435.90,2677.90,200.00}},
{"Verona Beach", {647.70,-2173.20,-89.00,930.20,-1804.20,110.90}},
{"Verona Beach", {930.20,-2006.70,-89.00,1073.20,-1804.20,110.90}},
{"Verona Beach", {851.40,-1804.20,-89.00,1046.10,-1577.50,110.90}},
{"Verona Beach", {1161.50,-1722.20,-89.00,1323.90,-1577.50,110.90}},
{"Verona Beach", {1046.10,-1722.20,-89.00,1161.50,-1577.50,110.90}},
{"Vinewood", {787.40,-1310.20,-89.00,952.60,-1130.80,110.90}},
{"Vinewood", {787.40,-1130.80,-89.00,952.60,-954.60,110.90}},
{"Vinewood", {647.50,-1227.20,-89.00,787.40,-1118.20,110.90}},
{"Vinewood", {647.70,-1416.20,-89.00,787.40,-1227.20,110.90}},
{"Whitewood Estates", {883.30,1726.20,-89.00,1098.30,2507.20,110.90}},
{"Whitewood Estates", {1098.30,1726.20,-89.00,1197.30,2243.20,110.90}},
{"Willowfield", {1970.60,-2179.20,-89.00,2089.00,-1852.80,110.90}},
{"Willowfield", {2089.00,-2235.80,-89.00,2201.80,-1989.90,110.90}},
{"Willowfield", {2089.00,-1989.90,-89.00,2324.00,-1852.80,110.90}},
{"Willowfield", {2201.80,-2095.00,-89.00,2324.00,-1989.90,110.90}},
{"Willowfield", {2541.70,-1941.40,-89.00,2703.50,-1852.80,110.90}},
{"Willowfield", {2324.00,-2059.20,-89.00,2541.70,-1852.80,110.90}},
{"Willowfield", {2541.70,-2059.20,-89.00,2703.50,-1941.40,110.90}},
{"Yellow Bell Station", {1377.40,2600.40,-21.90,1492.40,2687.30,78.00}},
// Citys Zones
{"Los Santos", {44.60,-2892.90,-242.90,2997.00,-768.00,900.00}},
{"Las Venturas", {869.40,596.30,-242.90,2997.00,2993.80,900.00}},
{"Bone County", {-480.50,596.30,-242.90,869.40,2993.80,900.00}},
{"Tierra Robada", {-2997.40,1659.60,-242.90,-480.50,2993.80,900.00}},
{"Tierra Robada", {-1213.90,596.30,-242.90,-480.50,1659.60,900.00}},
{"San Fierro", {-2997.40,-1115.50,-242.90,-1213.90,1659.60,900.00}},
{"Red County", {-1213.90,-768.00,-242.90,2997.00,596.30,900.00}},
{"Flint County", {-1213.90,-2892.90,-242.90,44.60,-768.00,900.00}},
{"Whetstone", {-2997.40,-2892.90,-242.90,-1213.90,-1115.50,900.00}}
};
forward MainTimer();
forward Speedometer();
forward SaveTimer();
forward StopAlarm(vehicleid);
stock PlayerName(playerid)
{
new pName[MAX_PLAYER_NAME];
GetPlayerName(playerid, pName, MAX_PLAYER_NAME);
return pName;
}
stock IsPlayerSpawned(playerid)
{
switch(GetPlayerState(playerid))
{
case 1,2,3: return 1;
}
return 0;
}
stock IsMeleeWeapon(weaponid)
{
switch(weaponid)
{
case 2 .. 15, 40, 44 .. 46: return 1;
}
return 0;
}
stock RemovePlayerWeapon(playerid, weaponid)
{
new WeaponData[12][2];
for(new i=1; i < sizeof(WeaponData); i++)
{
GetPlayerWeaponData(playerid, i, WeaponData[i][0], WeaponData[i][1]);
}
ResetPlayerWeapons(playerid);
for(new i=1; i < sizeof(WeaponData); i++)
{
if(WeaponData[i][0] != weaponid)
{
GivePlayerWeapon(playerid, WeaponData[i][0], WeaponData[i][1]);
}
}
}
stock IsBicycle(vehicleid)
{
switch(GetVehicleModel(vehicleid))
{
case 481,509,510: return 1;
}
return 0;
}
stock PlayerToPlayer(playerid, targetid, Float:dist)
{
new Float:pos[3];
GetPlayerPos(targetid, pos[0], pos[1], pos[2]);
return IsPlayerInRangeOfPoint(playerid, dist, pos[0], pos[1], pos[2]);
}
stock PlayerToVehicle(playerid, vehicleid, Float:dist)
{
new Float:pos[3];
GetVehiclePos(vehicleid, pos[0], pos[1], pos[2]);
return IsPlayerInRangeOfPoint(playerid, dist, pos[0], pos[1], pos[2]);
}
stock GetClosestVehicle(playerid)
{
new Float:x, Float:y, Float:z;
new Float:dist, Float:closedist=9999, closeveh;
for(new i=1; i < MAX_VEHICLES; i++)
{
if(GetVehiclePos(i, x, y, z))
{
dist = GetPlayerDistanceFromPoint(playerid, x, y, z);
if(dist < closedist)
{
closedist = dist;
closeveh = i;
}
}
}
return closeveh;
}
stock ToggleEngine(vehicleid, toggle)
{
new engine, lights, alarm, doors, bonnet, boot, objective;
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
SetVehicleParamsEx(vehicleid, toggle, lights, alarm, doors, bonnet, boot, objective);
}
stock ToggleAlarm(vehicleid, toggle)
{
new engine, lights, alarm, doors, bonnet, boot, objective;
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
SetVehicleParamsEx(vehicleid, engine, lights, toggle, doors, bonnet, boot, objective);
}
stock ToggleDoors(vehicleid, toggle)
{
new engine, lights, alarm, doors, bonnet, boot, objective;
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
SetVehicleParamsEx(vehicleid, engine, lights, alarm, toggle, bonnet, boot, objective);
}
stock ToggleBoot(vehicleid, toggle)
{
new engine, lights, alarm, doors, bonnet, boot, objective;
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
SetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, toggle, objective);
}
stock StripNL(str[]) // credits to ****** for y_utils.inc
{
new
i = strlen(str);
while (i-- && str[i] <= ' ') str[i] = '\0';
}
stock IsNumeric(const string[])
{
for(new i=0; string[i]; i++)
{
if(string[i] < '0' || string[i] > '9') return 0;
}
return 1;
}
stock GetVehicleModelIDFromName(const vname[])
{
for(new i=0; i < sizeof(VehicleNames); i++)
{
if(strfind(VehicleNames[i], vname, true) != -1) return i + 400;
}
return -1;
}
stock GetPlayer2DZone(playerid)
{
new zone[32] = "San Andreas";
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y, z);
for(new i = 0; i < sizeof(SanAndreasZones); i++)
{
if(x >= SanAndreasZones[i][Zone_Area][0] && x <= SanAndreasZones[i][Zone_Area][3]
&& y >= SanAndreasZones[i][Zone_Area][1] && y <= SanAndreasZones[i][Zone_Area][4])
{
strmid(zone, SanAndreasZones[i][Zone_Name], 0, 28);
return zone;
}
}
return zone;
}
stock GetPlayer3DZone(playerid)
{
new zone[32] = "San Andreas";
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y, z);
for(new i = 0; i < sizeof(SanAndreasZones); i++)
{
if(x >= SanAndreasZones[i][Zone_Area][0] && x <= SanAndreasZones[i][Zone_Area][3]
&& y >= SanAndreasZones[i][Zone_Area][1] && y <= SanAndreasZones[i][Zone_Area][4]
&& z >= SanAndreasZones[i][Zone_Area][2] && z <= SanAndreasZones[i][Zone_Area][5])
{
strmid(zone, SanAndreasZones[i][Zone_Name], 0, 28);
return zone;
}
}
return zone;
}
stock GetPlayerSpeed(playerid, bool:kmh = true)
{
new
Float:xx,
Float:yy,
Float:zz,
Float:pSpeed;
if(IsPlayerInAnyVehicle(playerid))
{
GetVehicleVelocity(GetPlayerVehicleID(playerid),xx,yy,zz);
}
else
{
GetPlayerVelocity(playerid,xx,yy,zz);
}
pSpeed = floatsqroot((xx * xx) + (yy * yy) + (zz * zz));
return kmh ? floatround((pSpeed * 165.12)) : floatround((pSpeed * 103.9));
}
/*SafeGivePlayerMoney(playerid, money)
{
return CallRemoteFunction("SafeGivePlayerMoney","dd",playerid, money);
}
#define GivePlayerMoney SafeGivePlayerMoney
SafeGetPlayerMoney(playerid)
{
return CallRemoteFunction("SafeGetPlayerMoney","d",playerid);
}
#define GetPlayerMoney SafeGetPlayerMoney*/
IsAdmin(playerid, level)
{
if(IsPlayerAdmin(playerid)) return 1;
if(CallRemoteFunction("GetPlayerAVSAdmin", "d", playerid) >= level) return 1;
return 0;
}
LoadVehicles()
{
new string[64];
new File:handle, count;
new filename[64], line[256], s, key[64];
for(new i=1; i < MAX_DVEHICLES; i++)
{
format(filename, sizeof(filename), VEHICLE_FILE_PATH "v%d.ini", i);
if(!fexist(filename)) continue;
handle = fopen(filename, io_read);
while(fread(handle, line))
{
StripNL(line);
s = strfind(line, "=");
if(!line[0] || s < 1) continue;
strmid(key, line, 0, s++);
if(strcmp(key, "Created") == 0) VehicleCreated[i] = strval(line[s]);
else if(strcmp(key, "Model") == 0) VehicleModel[i] = strval(line[s]);
else if(strcmp(key, "Pos") == 0) sscanf(line[s], "p,ffff", VehiclePos[i][0], VehiclePos[i][1],
VehiclePos[i][2], VehiclePos[i][3]);
else if(strcmp(key, "Colors") == 0) sscanf(line[s], "p,dd", VehicleColor[i][0], VehicleColor[i][1]);
else if(strcmp(key, "Interior") == 0) VehicleInterior[i] = strval(line[s]);
else if(strcmp(key, "VirtualWorld") == 0) VehicleWorld[i] = strval(line[s]);
else if(strcmp(key, "Owner") == 0) strmid(VehicleOwner[i], line, s, sizeof(line));
else if(strcmp(key, "NumberPlate") == 0) strmid(VehicleNumberPlate[i], line, s, sizeof(line));
else if(strcmp(key, "Value") == 0) VehicleValue[i] = strval(line[s]);
else if(strcmp(key, "Lock") == 0) VehicleLock[i] = strval(line[s]);
else if(strcmp(key, "Alarm") == 0) VehicleAlarm[i] = strval(line[s]);
else if(strcmp(key, "Paintjob") == 0) VehiclePaintjob[i] = strval(line[s]);
else
{
for(new t=0; t < sizeof(VehicleTrunk[]); t++)
{
format(string, sizeof(string), "Trunk%d", t+1);
if(strcmp(key, string) == 0) sscanf(line[s], "p,dd", VehicleTrunk[i][t][0], VehicleTrunk[i][t][1]);
}
for(new m=0; m < sizeof(VehicleMods[]); m++)
{
format(string, sizeof(string), "Mod%d", m);
if(strcmp(key, string) == 0) VehicleMods[i][m] = strval(line[s]);
}
}
}
fclose(handle);
if(VehicleCreated[i]) count++;
}
printf(" Loaded %d vehicles", count);
}
SaveVehicle(vehicleid)
{
new filename[64], line[256];
format(filename, sizeof(filename), VEHICLE_FILE_PATH "v%d.ini", vehicleid);
new File:handle = fopen(filename, io_write);
format(line, sizeof(line), "Created=%d\r\n", VehicleCreated[vehicleid]); fwrite(handle, line);
format(line, sizeof(line), "Model=%d\r\n", VehicleModel[vehicleid]); fwrite(handle, line);
format(line, sizeof(line), "Pos=%.3f,%.3f,%.3f,%.3f\r\n", VehiclePos[vehicleid][0], VehiclePos[vehicleid][1],
VehiclePos[vehicleid][2], VehiclePos[vehicleid][3]);
fwrite(handle, line);
format(line, sizeof(line), "Colors=%d,%d\r\n", VehicleColor[vehicleid][0], VehicleColor[vehicleid][1]); fwrite(handle, line);
format(line, sizeof(line), "Interior=%d\r\n", VehicleInterior[vehicleid]); fwrite(handle, line);
format(line, sizeof(line), "VirtualWorld=%d\r\n", VehicleWorld[vehicleid]); fwrite(handle, line);
format(line, sizeof(line), "Owner=%s\r\n", VehicleOwner[vehicleid]); fwrite(handle, line);
format(line, sizeof(line), "NumberPlate=%s\r\n", VehicleNumberPlate[vehicleid]); fwrite(handle, line);
format(line, sizeof(line), "Value=%d\r\n", VehicleValue[vehicleid]); fwrite(handle, line);
format(line, sizeof(line), "Lock=%d\r\n", VehicleLock[vehicleid]); fwrite(handle, line);
format(line, sizeof(line), "Alarm=%d\r\n", VehicleAlarm[vehicleid]); fwrite(handle, line);
format(line, sizeof(line), "Paintjob=%d\r\n", VehiclePaintjob[vehicleid]); fwrite(handle, line);
for(new t=0; t < sizeof(VehicleTrunk[]); t++)
{
format(line, sizeof(line), "Trunk%d=%d,%d\r\n", t+1, VehicleTrunk[vehicleid][t][0], VehicleTrunk[vehicleid][t][1]);
fwrite(handle, line);
}
for(new m=0; m < sizeof(VehicleMods[]); m++)
{
format(line, sizeof(line), "Mod%d=%d\r\n", m, VehicleMods[vehicleid][m]);
fwrite(handle, line);
}
fclose(handle);
}
UpdateVehicle(vehicleid, removeold)
{
if(VehicleCreated[vehicleid])
{
if(removeold)
{
new Float:health;
GetVehicleHealth(VehicleID[vehicleid], health);
new engine, lights, alarm, doors, bonnet, boot, objective;
GetVehicleParamsEx(VehicleID[vehicleid], engine, lights, alarm, doors, bonnet, boot, objective);
//new panels, doorsd, lightsd, tires;
//GetVehicleDamageStatus(VehicleID[vehicleid], panels, doorsd, lightsd, tires);
DestroyVehicle(VehicleID[vehicleid]);
VehicleID[vehicleid] = CreateVehicle(VehicleModel[vehicleid], VehiclePos[vehicleid][0], VehiclePos[vehicleid][1],
VehiclePos[vehicleid][2], VehiclePos[vehicleid][3], VehicleColor[vehicleid][0], VehicleColor[vehicleid][1], 3600);
SetVehicleHealth(VehicleID[vehicleid], health);
SetVehicleParamsEx(VehicleID[vehicleid], engine, lights, alarm, doors, bonnet, boot, objective);
//UpdateVehicleDamageStatus(VehicleID[vehicleid], panels, doorsd, lightsd, tires);
}
else
{
VehicleID[vehicleid] = CreateVehicle(VehicleModel[vehicleid], VehiclePos[vehicleid][0], VehiclePos[vehicleid][1],
VehiclePos[vehicleid][2], VehiclePos[vehicleid][3], VehicleColor[vehicleid][0], VehicleColor[vehicleid][1], 3600);
}
LinkVehicleToInterior(VehicleID[vehicleid], VehicleInterior[vehicleid]);
SetVehicleVirtualWorld(VehicleID[vehicleid], VehicleWorld[vehicleid]);
SetVehicleNumberPlate(VehicleID[vehicleid], VehicleNumberPlate[vehicleid]);
for(new i=0; i < sizeof(VehicleMods[]); i++)
{
AddVehicleComponent(VehicleID[vehicleid], VehicleMods[vehicleid][i]);
}
ChangeVehiclePaintjob(VehicleID[vehicleid], VehiclePaintjob[vehicleid]);
if(VehicleLock[vehicleid]) ToggleDoors(VehicleID[vehicleid], VEHICLE_PARAMS_ON);
if(VehicleAlarm[vehicleid]) VehicleSecurity[VehicleID[vehicleid]] = 1;
UpdateVehicleLabel(vehicleid, removeold);
}
}
UpdateVehicleLabel(vehicleid, removeold)
{
if(VehicleCreated[vehicleid] == VEHICLE_DEALERSHIP)
{
if(removeold)
{
Delete3DTextLabel(VehicleLabel[vehicleid]);
}
new labeltext[128];
format(labeltext, sizeof(labeltext), "%s\nID: %d\nDealership: %s\nPrice: $%d", VehicleNames[VehicleModel[vehicleid]-400],
vehicleid, VehicleOwner[vehicleid], VehicleValue[vehicleid]);
VehicleLabel[vehicleid] = Create3DTextLabel(labeltext, 0xBB7700DD, 0, 0, 0, 10.0, 0);
Attach3DTextLabelToVehicle(VehicleLabel[vehicleid], VehicleID[vehicleid], 0, 0, 0);
}
}
IsValidVehicle(vehicleid)
{
if(vehicleid < 1 || vehicleid >= MAX_DVEHICLES) return 0;
if(VehicleCreated[vehicleid]) return 1;
return 0;
}
GetFreeVehicleID()
{
for(new i=1; i < MAX_DVEHICLES; i++)
{
if(!VehicleCreated[i]) return i;
}
return 0;
}
GetVehicleID(vehicleid)
{
for(new i=1; i < MAX_DVEHICLES; i++)
{
if(VehicleCreated[i] && VehicleID[i] == vehicleid) return i;
}
return 0;
}
GetPlayerVehicles(playerid)
{
new playername[24];
GetPlayerName(playerid, playername, sizeof(playername));
new count;
for(new i=1; i < MAX_DVEHICLES; i++)
{
if(VehicleCreated[i] == VEHICLE_PLAYER && strcmp(VehicleOwner[i], playername) == 0)
{
count++;
}
}
return count;
}
GetPlayerVehicleAccess(playerid, vehicleid)
{
if(IsValidVehicle(vehicleid))
{
if(VehicleCreated[vehicleid] == VEHICLE_DEALERSHIP)
{
if(IsAdmin(playerid, 1))
{
return 1;
}
}
else if(VehicleCreated[vehicleid] == VEHICLE_PLAYER)
{
if(strcmp(VehicleOwner[vehicleid], PlayerName(playerid)) == 0)
{
return 2;
}
else if(GetPVarInt(playerid, "CarKeys") == vehicleid)
{
return 1;
}
}
}
else
{
return 1;
}
return 0;
}
LoadDealerships()
{
new File:handle, count;
new filename[64], line[256], s, key[64];
for(new i=1; i < MAX_DEALERSHIPS; i++)
{
format(filename, sizeof(filename), DEALERSHIP_FILE_PATH "d%d.ini", i);
if(!fexist(filename)) continue;
handle = fopen(filename, io_read);
while(fread(handle, line))
{
StripNL(line);
s = strfind(line, "=");
if(!line[0] || s < 1) continue;
strmid(key, line, 0, s++);
if(strcmp(key, "Created") == 0) DealershipCreated[i] = strval(line[s]);
else if(strcmp(key, "Pos") == 0) sscanf(line[s], "p,fff", DealershipPos[i][0],
DealershipPos[i][1], DealershipPos[i][2]);
}
fclose(handle);
if(DealershipCreated[i]) count++;
}
printf(" Loaded %d dealerships", count);
}
SaveDealership(dealerid)
{
new filename[64], line[256];
format(filename, sizeof(filename), DEALERSHIP_FILE_PATH "d%d.ini", dealerid);
new File:handle = fopen(filename, io_write);
format(line, sizeof(line), "Created=%d\r\n", DealershipCreated[dealerid]); fwrite(handle, line);
format(line, sizeof(line), "Pos=%.3f,%.3f,%.3f\r\n", DealershipPos[dealerid][0],
DealershipPos[dealerid][1], DealershipPos[dealerid][2]);
fwrite(handle, line);
fclose(handle);
}
UpdateDealership(dealerid, removeold)
{
if(DealershipCreated[dealerid])
{
if(removeold)
{
Delete3DTextLabel(DealershipLabel[dealerid]);
}
new labeltext[32];
format(labeltext, sizeof(labeltext), "Vehicle Dealership\nID: %d", dealerid);
DealershipLabel[dealerid] = Create3DTextLabel(labeltext, 0x00BB00DD, DealershipPos[dealerid][0],
DealershipPos[dealerid][1], DealershipPos[dealerid][2]+0.5, 20.0, 0);
}
}
IsValidDealership(dealerid)
{
if(dealerid < 1 || dealerid >= MAX_DEALERSHIPS) return 0;
if(DealershipCreated[dealerid]) return 1;
return 0;
}
LoadFuelStations()
{
new File:handle, count;
new filename[64], line[256], s, key[64];
for(new i=1; i < MAX_FUEL_STATIONS; i++)
{
format(filename, sizeof(filename), FUEL_STATION_FILE_PATH "f%d.ini", i);
if(!fexist(filename)) continue;
handle = fopen(filename, io_read);
while(fread(handle, line))
{
StripNL(line);
s = strfind(line, "=");
if(!line[0] || s < 1) continue;
strmid(key, line, 0, s++);
if(strcmp(key, "Created") == 0) FuelStationCreated[i] = strval(line[s]);
else if(strcmp(key, "Pos") == 0) sscanf(line[s], "p,fff", FuelStationPos[i][0],
FuelStationPos[i][1], FuelStationPos[i][2]);
}
fclose(handle);
if(FuelStationCreated[i]) count++;
}
printf(" Loaded %d fuel stations", count);
}
SaveFuelStation(stationid)
{
new filename[64], line[256];
format(filename, sizeof(filename), FUEL_STATION_FILE_PATH "f%d.ini", stationid);
new File:handle = fopen(filename, io_write);
format(line, sizeof(line), "Created=%d\r\n", FuelStationCreated[stationid]); fwrite(handle, line);
format(line, sizeof(line), "Pos=%.3f,%.3f,%.3f\r\n", FuelStationPos[stationid][0],
FuelStationPos[stationid][1], FuelStationPos[stationid][2]);
fwrite(handle, line);
fclose(handle);
}
UpdateFuelStation(stationid, removeold)
{
if(FuelStationCreated[stationid])
{
if(removeold)
{
Delete3DTextLabel(FuelStationLabel[stationid]);
}
new labeltext[32];
format(labeltext, sizeof(labeltext), "Fuel Station\nID: %d\n/fuel", stationid);
FuelStationLabel[stationid] = Create3DTextLabel(labeltext, 0x00BBFFDD, FuelStationPos[stationid][0],
FuelStationPos[stationid][1], FuelStationPos[stationid][2]+0.5, 20.0, 0);
}
}
IsValidFuelStation(stationid)
{
if(stationid < 1 || stationid >= MAX_FUEL_STATIONS) return 0;
if(FuelStationCreated[stationid]) return 1;
return 0;
}
public MainTimer()
{
new string[128];
new Float:x, Float:y, Float:z;
for(new i=0; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
if(GetPlayerState(i) == PLAYER_STATE_DRIVER)
{
new vehicleid = GetPlayerVehicleID(i);
if(!IsBicycle(vehicleid) && Fuel[vehicleid] > 0)
{
Fuel[vehicleid] -= GetPlayerSpeed(i)/1000.0;
if(Fuel[vehicleid] <= 0)
{
ToggleEngine(vehicleid, VEHICLE_PARAMS_OFF);
GameTextForPlayer(i, "~r~out of fuel", 3000, 3);
SendClientMessage(i, COLOR_RED, "This vehicle is out of fuel!");
}
}
}
if(RefuelTime[i] > 0 && GetPVarInt(i, "FuelStation"))
{
new vehicleid = GetPlayerVehicleID(i);
Fuel[vehicleid] += 2.0;
RefuelTime[i]--;
if(RefuelTime[i] == 0)
{
if(Fuel[vehicleid] >= 100.0) Fuel[vehicleid] = 100.0;
new stationid = GetPVarInt(i, "FuelStation");
new cost = floatround(Fuel[vehicleid]-GetPVarFloat(i, "Fuel"))*FUEL_PRICE;
if(GetPlayerState(i) != PLAYER_STATE_DRIVER || Fuel[vehicleid] >= 100.0 || GetPlayerMoney(i) < cost
|| !IsPlayerInRangeOfPoint(i, 10.0, FuelStationPos[stationid][0], FuelStationPos[stationid][1], FuelStationPos[stationid][2]))
{
if(GetPlayerMoney(i) < cost) cost = GetPlayerMoney(i);
GivePlayerMoney(i, -cost);
format(string, sizeof(string), "~r~-$%d", cost);
GameTextForPlayer(i, string, 2000, 3);
format(string, sizeof(string), "You pay $%d for fuel", cost);
SendClientMessage(i, COLOR_WHITE, string);
SetPVarInt(i, "FuelStation", 0);
SetPVarFloat(i, "Fuel", 0.0);
}
else
{
RefuelTime[i] = 5;
format(string, sizeof(string), "~w~refueling...~n~~r~-$%d", cost);
GameTextForPlayer(i, string, 2000, 3);
}
}
}
if(TrackCar[i])
{
GetVehiclePos(TrackCar[i], x, y, z);
SetPlayerCheckpoint(i, x, y, z, 3);
}
}
}
}
public Speedometer()
{
new vehicleid, Float:health;
new engine, lights, alarm, doors, bonnet, boot, objective;
new fstring[32], string[512];
for(new i=0; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) && IsPlayerInAnyVehicle(i))
{
vehicleid = GetPlayerVehicleID(i);
GetVehicleHealth(vehicleid, health);
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
string = "~b~~h~vehicle: ~w~";
strcat(string, VehicleNames[GetVehicleModel(vehicleid)-400], sizeof(string));
strcat(string, "~n~~b~~h~gps: ~w~", sizeof(string));
strcat(string, GetPlayer3DZone(i), sizeof(string));
strcat(string, "~n~~b~~h~health: ~g~", sizeof(string));
fstring = "iiiiiiiiii";
if(health > 1000.0) strins(fstring, "~r~", 10, sizeof(fstring));
else if(health < 0.0) strins(fstring, "~r~", 0, sizeof(fstring));
else strins(fstring, "~r~", floatround(health/100.0), sizeof(fstring));
strcat(string, fstring, sizeof(string));
strcat(string, " ~b~~h~fuel: ~g~", sizeof(string));
fstring = "iiiiiiiiii";
if(Fuel[vehicleid] > 100.0) strins(fstring, "~r~", 10, sizeof(fstring));
else if(Fuel[vehicleid] < 0.0) strins(fstring, "~r~", 0, sizeof(fstring));
else strins(fstring, "~r~", floatround(Fuel[vehicleid]/10.0), sizeof(fstring));
strcat(string, fstring, sizeof(string));
strcat(string, " ~b~~h~", sizeof(string));
if(GetPVarInt(i, "Speedo")) format(fstring,sizeof(fstring),"mph: ~w~%d", GetPlayerSpeed(i, false));
else format(fstring,sizeof(fstring),"kph: ~w~%d", GetPlayerSpeed(i, true));
strcat(string, fstring, sizeof(string));
strcat(string, "~n~~b~~h~engine: ", sizeof(string));
if(engine == 1) strcat(string, "~g~on", sizeof(string));
else strcat(string, "~r~off", sizeof(string));
strcat(string, " ~b~~h~alarm: ", sizeof(string));
if(VehicleSecurity[vehicleid] == 1) strcat(string, "~g~on", sizeof(string));
else strcat(string, "~r~off", sizeof(string));
strcat(string, " ~b~~h~doors: ", sizeof(string));
if(doors == 1) strcat(string, "~r~locked", sizeof(string));
else strcat(string, "~g~unlocked", sizeof(string));
TextDrawSetString(SpeedoText[i], string);
}
}
}
public SaveTimer()
{
SaveVehicleIndex++;
if(SaveVehicleIndex >= MAX_DVEHICLES) SaveVehicleIndex = 1;
if(IsValidVehicle(SaveVehicleIndex)) SaveVehicle(SaveVehicleIndex);
}
public StopAlarm(vehicleid)
{
ToggleAlarm(vehicleid, VEHICLE_PARAMS_OFF);
}
/*forward GetVehicleIDFromPlate(Plate[]);
public GetVehicleIDFromPlate(Plate[])
{
for(new i=1; i < MAX_DVEHICLES; i++)
{
if(VehicleCreated[i] == VEHICLE_PLAYER && strcmp(VehicleNumberPlate[i], Plate) == 0)
{
return i;
}
}
return 0;
}*/
public OnFilterScriptInit()
{
print("\n------------------------------------------------");
print(" Advanced Vehicle System 1.0 by MadeMan");
print("------------------------------------------------");
LoadVehicles();
LoadDealerships();
LoadFuelStations();
/*SpeedoBox = TextDrawCreate(345.000, 363.000, "~n~~n~~n~~n~");
TextDrawAlignment(SpeedoBox, 2);
TextDrawLetterSize(SpeedoBox, 0.500, 1.400);
TextDrawUseBox(SpeedoBox, 1);
TextDrawBoxColor(SpeedoBox, 153);
TextDrawTextSize(SpeedoBox, 0.000, 340.000);*/
for(new i=0; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
OnPlayerConnect(i);
}
}
for(new i=1; i < MAX_DVEHICLES; i++)
{
UpdateVehicle(i, 0);
}
for(new i=1; i < MAX_DEALERSHIPS; i++)
{
UpdateDealership(i, 0);
}
for(new i=1; i < MAX_FUEL_STATIONS; i++)
{
UpdateFuelStation(i, 0);
}
maintimer = SetTimer("MainTimer", 1000, true);
speedotimer = SetTimer("Speedometer", 555, true);
savetimer = SetTimer("SaveTimer", 2222, true);
print("------------------------------------------------\n");
return 1;
}
public OnFilterScriptExit()
{
KillTimer(maintimer);
KillTimer(speedotimer);
KillTimer(savetimer);
//TextDrawDestroy(SpeedoBox);
for(new i=0; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
OnPlayerDisconnect(i, 1);
}
}
for(new i=1; i < MAX_DVEHICLES; i++)
{
if(VehicleCreated[i])
{
DestroyVehicle(VehicleID[i]);
if(VehicleCreated[i] == VEHICLE_DEALERSHIP)
{
Delete3DTextLabel(VehicleLabel[i]);
}
}
}
for(new i=1; i < MAX_DEALERSHIPS; i++)
{
if(DealershipCreated[i])
{
Delete3DTextLabel(DealershipLabel[i]);
}
}
for(new i=1; i < MAX_FUEL_STATIONS; i++)
{
if(FuelStationCreated[i])
{
Delete3DTextLabel(FuelStationLabel[i]);
}
}
print("\n------------------------------------------------");
print(" Advanced Vehicle System 1.0 Unloaded");
print("------------------------------------------------\n");
return 1;
}
public OnPlayerConnect(playerid)
{
RefuelTime[playerid] = 0;
TrackCar[playerid] = 0;
SpeedoText[playerid] = TextDrawCreate(180.000, 362.000," ");
TextDrawAlignment(SpeedoText[playerid], 1);
TextDrawFont(SpeedoText[playerid],2);
TextDrawLetterSize(SpeedoText[playerid], 0.310, 1.400);
TextDrawSetShadow(SpeedoText[playerid],0);
TextDrawUseBox(SpeedoText[playerid], 1);
TextDrawBoxColor(SpeedoText[playerid], 0x99);
TextDrawTextSize(SpeedoText[playerid], 520.000, 0.000);
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
TextDrawDestroy(SpeedoText[playerid]);
return 1;
}
public OnVehicleSpawn(vehicleid)
{
VehicleSecurity[vehicleid] = 0;
new id = GetVehicleID(vehicleid);
if(IsValidVehicle(id))
{
if(VehicleColor[id][0] >= 0 && VehicleColor[id][1] >= 0)
ChangeVehicleColor(vehicleid, VehicleColor[id][0], VehicleColor[id][1]);
LinkVehicleToInterior(vehicleid, VehicleInterior[id]);
SetVehicleVirtualWorld(vehicleid, VehicleWorld[id]);
for(new i=0; i < sizeof(VehicleMods[]); i++)
{
AddVehicleComponent(vehicleid, VehicleMods[id][i]);
}
ChangeVehiclePaintjob(vehicleid, VehiclePaintjob[id]);
if(VehicleLock[id]) ToggleDoors(vehicleid, VEHICLE_PARAMS_ON);
if(VehicleAlarm[id]) VehicleSecurity[vehicleid] = 1;
}
return 1;
}
CMD:avshelp(playerid, params[])
{
new info[512];
strcat(info, "/v /eject /ejectall\n", sizeof(info));
strcat(info, "/vlock /valarm /fuel /trunk /kph /mph /clearmods /trackcar\n", sizeof(info));
if(IsAdmin(playerid, 1))
{
strcat(info, "/addv /editv /setfuel /rac (respawnallcars) /rtc (respawnthiscar)\n", sizeof(info));
strcat(info, "/adddealership /deletedealership /movedealership /gotodealership\n", sizeof(info));
strcat(info, "/addfuelstation /deletefuelstation /movefuelstation /gotofuelstation", sizeof(info));
}
ShowPlayerDialog(playerid, DIALOG_NONE, DIALOG_STYLE_MSGBOX, "Advanced Vehicle System Help", info, "OK", "");
return 1;
}
CMD:kph(playerid, params[])
{
SetPVarInt(playerid, "Speedo", 0);
SendClientMessage(playerid, COLOR_WHITE, "Speedometer units set to KPH");
return 1;
}
CMD:mph(playerid, params[])
{
SetPVarInt(playerid, "Speedo", 1);
SendClientMessage(playerid, COLOR_WHITE, "Speedometer units set to MPH");
return 1;
}
CMD:eject(playerid, params[])
{
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return SendClientMessage(playerid, COLOR_RED, "You are not driving a vehicle!");
new pid, msg[128];
if(sscanf(params, "u", pid)) return SendClientMessage(playerid, COLOR_GREY, "USAGE: /eject [player]");
if(!IsPlayerConnected(pid)) return SendClientMessage(playerid, COLOR_RED, "Invalid player!");
new vehicleid = GetPlayerVehicleID(playerid);
if(!IsPlayerInVehicle(pid, vehicleid)) return SendClientMessage(playerid, COLOR_RED, "Player is not in your vehicle!");
RemovePlayerFromVehicle(pid);
format(msg, sizeof(msg), "Vehicle driver %s (%d) has ejected you", PlayerName(playerid), playerid);
SendClientMessage(pid, COLOR_WHITE, msg);
format(msg, sizeof(msg), "You have ejected %s (%d) from your vehicle", PlayerName(pid), pid);
SendClientMessage(playerid, COLOR_WHITE, msg);
return 1;
}
CMD:ejectall(playerid, params[])
{
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return SendClientMessage(playerid, COLOR_RED, "You are not driving a vehicle!");
new vehicleid = GetPlayerVehicleID(playerid);
new msg[128];
format(msg, sizeof(msg), "Vehicle driver %s (%d) has ejected you", PlayerName(playerid), playerid);
for(new i=0; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) && i != playerid && IsPlayerInVehicle(i, vehicleid))
{
RemovePlayerFromVehicle(i);
SendClientMessage(i, COLOR_WHITE, msg);
}
}
SendClientMessage(playerid, COLOR_WHITE, "You have ejected all passengers");
return 1;
}
CMD:clearmods(playerid, params[])
{
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return SendClientMessage(playerid, COLOR_RED, "You are not driving a vehicle!");
new vehicleid = GetPlayerVehicleID(playerid);
new id = GetVehicleID(vehicleid);
if(GetPlayerVehicleAccess(playerid, id) < 2)
return SendClientMessage(playerid, COLOR_RED, "This is not your vehicle!");
for(new i=0; i < sizeof(VehicleMods[]); i++)
{
RemoveVehicleComponent(VehicleID[id], GetVehicleComponentInSlot(VehicleID[id], i));
VehicleMods[id][i] = 0;
}
VehiclePaintjob[id] = 255;
ChangeVehiclePaintjob(VehicleID[id], 255);
SaveVehicle(id);
SendClientMessage(playerid, COLOR_WHITE, "You have removed all modifications from your vehicle");
return 1;
}
CMD:trackcar(playerid, params[])
{
if(TrackCar[playerid])
{
TrackCar[playerid] = 0;
DisablePlayerCheckpoint(playerid);
SendClientMessage(playerid, COLOR_WHITE, "You are not tracking your vehicle anymore");
return 1;
}
new playername[24];
GetPlayerName(playerid, playername, sizeof(playername));
new info[256], bool:found;
for(new i=1; i < MAX_DVEHICLES; i++)
{
if(VehicleCreated[i] == VEHICLE_PLAYER && strcmp(VehicleOwner[i], playername) == 0)
{
found = true;
format(info, sizeof(info), "%sID: %d Name: %s\n", info, i, VehicleNames[VehicleModel[i]-400]);
}
}
if(!found) return SendClientMessage(playerid, COLOR_RED, "You don't have any vehicles!");
ShowPlayerDialog(playerid, DIALOG_FINDVEHICLE, DIALOG_STYLE_LIST, "Find Your Vehicle", info, "Find", "Cancel");
return 1;
}
CMD:v(playerid, params[])
{
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return SendClientMessage(playerid, COLOR_RED, "You are not driving a vehicle!");
new vehicleid = GetPlayerVehicleID(playerid);
if(IsBicycle(vehicleid)) return SendClientMessage(playerid, COLOR_RED, "You are not driving a vehicle!");
new id = GetVehicleID(vehicleid);
if(GetPlayerVehicleAccess(playerid, id) < 1)
return SendClientMessage(playerid, COLOR_RED, "You don't have the keys for this vehicle!");
SetPVarInt(playerid, "DialogValue1", id);
ShowDialog(playerid, DIALOG_VEHICLE);
return 1;
}
CMD:sellv(playerid, params[])
{
new pid, id, price, msg[128];
if(sscanf(params, "udd", pid, id, price)) return SendClientMessage(playerid, COLOR_GREY, "USAGE: /sellv [player] [vehicleid] [price]");
if(!IsPlayerConnected(pid)) return SendClientMessage(playerid, COLOR_RED, "Invalid player!");
if(GetPlayerVehicleAccess(playerid, id) < 2)
return SendClientMessage(playerid, COLOR_RED, "You are not the owner of this vehicle!");
if(price < 1) return SendClientMessage(playerid, COLOR_RED, "Invalid price!");
if(!PlayerToPlayer(playerid, pid, 10.0)) return SendClientMessage(playerid, COLOR_RED, "Player is too far!");
SetPVarInt(pid, "DialogValue1", playerid);
SetPVarInt(pid, "DialogValue2", id);
SetPVarInt(pid, "DialogValue3", price);
ShowDialog(pid, DIALOG_VEHICLE_SELL);
format(msg, sizeof(msg), "You have offered %s (%d) to buy your vehicle for $%d", PlayerName(pid), pid, price);
SendClientMessage(playerid, COLOR_WHITE, msg);
return 1;
}
CMD:vlock(playerid, params[])
{
new vehicleid;
if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
{
vehicleid = GetPlayerVehicleID(playerid);
}
else
{
vehicleid = GetClosestVehicle(playerid);
if(!PlayerToVehicle(playerid, vehicleid, 5.0)) vehicleid = 0;
}
if(!vehicleid) return SendClientMessage(playerid, COLOR_RED, "You are not close to a vehicle!");
new id = GetVehicleID(vehicleid);
if(!IsValidVehicle(id)) return SendClientMessage(playerid, COLOR_RED, "You don't have the keys for this vehicle!");
if(GetPlayerVehicleAccess(playerid, id) < 2)
return SendClientMessage(playerid, COLOR_RED, "You don't have the keys for this vehicle!");
new engine, lights, alarm, doors, bonnet, boot, objective;
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
if(doors == 1)
{
doors = 0;
VehicleLock[id] = 0;
GameTextForPlayer(playerid, "~g~doors unlocked", 3000, 6);
}
else
{
doors = 1;
VehicleLock[id] = 1;
GameTextForPlayer(playerid, "~r~doors locked", 3000, 6);
}
SetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
SaveVehicle(id);
return 1;
}
CMD:valarm(playerid, params[])
{
new vehicleid;
if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
{
vehicleid = GetPlayerVehicleID(playerid);
}
else
{
vehicleid = GetClosestVehicle(playerid);
if(!PlayerToVehicle(playerid, vehicleid, 5.0)) vehicleid = 0;
}
if(!vehicleid) return SendClientMessage(playerid, COLOR_RED, "You are not close to a vehicle!");
new id = GetVehicleID(vehicleid);
if(!IsValidVehicle(id)) return SendClientMessage(playerid, COLOR_RED, "You don't have the keys for this vehicle!");
if(GetPlayerVehicleAccess(playerid, id) < 2)
return SendClientMessage(playerid, COLOR_RED, "You don't have the keys for this vehicle!");
if(VehicleSecurity[vehicleid] == 0)
{
VehicleSecurity[vehicleid] = 1;
VehicleAlarm[id] = 1;
GameTextForPlayer(playerid, "~g~alarm on", 3000, 6);
}
else
{
ToggleAlarm(vehicleid, VEHICLE_PARAMS_OFF);
VehicleSecurity[vehicleid] = 0;
VehicleAlarm[id] = 0;
GameTextForPlayer(playerid, "~r~alarm off", 3000, 6);
}
SaveVehicle(id);
return 1;
}
CMD:trunk(playerid, params[])
{
new vehicleid = GetClosestVehicle(playerid);
if(!PlayerToVehicle(playerid, vehicleid, 5.0)) vehicleid = 0;
if(!vehicleid || IsBicycle(vehicleid) || IsPlayerInAnyVehicle(playerid))
return SendClientMessage(playerid, COLOR_RED, "You are not close to a vehicle!");
new id = GetVehicleID(vehicleid);
if(!IsValidVehicle(id)) return SendClientMessage(playerid, COLOR_RED, "You don't have the keys for this vehicle!");
if(GetPlayerVehicleAccess(playerid, id) < 2)
return SendClientMessage(playerid, COLOR_RED, "You don't have the keys for this vehicle!");
ToggleBoot(vehicleid, VEHICLE_PARAMS_ON);
SetPVarInt(playerid, "DialogValue1", id);
ShowDialog(playerid, DIALOG_TRUNK);
return 1;
}
CMD:fuel(playerid, params[])
{
for(new i=1; i < MAX_FUEL_STATIONS; i++)
{
if(FuelStationCreated[i])
{
if(IsPlayerInRangeOfPoint(playerid, 15.0, FuelStationPos[i][0], FuelStationPos[i][1], FuelStationPos[i][2]))
{
SetPVarInt(playerid, "FuelStation", i);
ShowDialog(playerid, DIALOG_FUEL);
return 1;
}
}
}
SendClientMessage(playerid, COLOR_RED, "You are not in a fuel station!");
return 1;
}
CMD:setfuel(playerid, params[])
{
if(!IsAdmin(playerid, 1)) return SendClientMessage(playerid, COLOR_RED, "You are not admin!");
if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_RED, "You are not in a vehicle!");
new amount, msg[128];
if(sscanf(params, "d", amount)) return SendClientMessage(playerid, COLOR_GREY, "USAGE: /setfuel [amount]");
if(amount < 0 || amount > 100) return SendClientMessage(playerid, COLOR_RED, "Invalid amount! (0-100)");
Fuel[GetPlayerVehicleID(playerid)] = amount;
format(msg, sizeof(msg), "You have set your vehicle fuel to %d", amount);
SendClientMessage(playerid, COLOR_WHITE, msg);
return 1;
}
CMD:addv(playerid, params[])
{
if(!IsAdmin(playerid, 1)) return SendClientMessage(playerid, COLOR_RED, "You are not admin!");
if(!IsPlayerSpawned(playerid)) return SendClientMessage(playerid, COLOR_RED, "You can't use this command now!");
new model[32], modelid, dealerid, color1, color2, price;
if(sscanf(params, "dsddd", dealerid, model, color1, color2, price))
return SendClientMessage(playerid, COLOR_GREY, "USAGE: /addv [dealerid] [model] [color1] [color2] [price]");
if(!IsValidDealership(dealerid)) return SendClientMessage(playerid, COLOR_RED, "Invalid dealerid!");
if(IsNumeric(model)) modelid = strval(model);
else modelid = GetVehicleModelIDFromName(model);
if(modelid < 400 || modelid > 611) return SendClientMessage(playerid, COLOR_RED, "Invalid model ID!");
if(color1 < 0 || color2 < 0) return SendClientMessage(playerid, COLOR_RED, "Invalid color!");
if(price < 0) return SendClientMessage(playerid, COLOR_RED, "Invalid price!");
new Float:X, Float:Y, Float:Z, Float:angle;
GetPlayerPos(playerid, X, Y, Z);
GetPlayerFacingAngle(playerid, angle);
X += floatmul(floatsin(-angle, degrees), 4.0);
Y += floatmul(floatcos(-angle, degrees), 4.0);
for(new i=1; i < MAX_DVEHICLES; i++)
{
if(!VehicleCreated[i])
{
new msg[128];
VehicleCreated[i] = VEHICLE_DEALERSHIP;
VehicleModel[i] = modelid;
VehiclePos[i][0] = X;
VehiclePos[i][1] = Y;
VehiclePos[i][2] = Z;
VehiclePos[i][3] = angle+90.0;
VehicleColor[i][0] = color1;
VehicleColor[i][1] = color2;
VehicleInterior[i] = GetPlayerInterior(playerid);
VehicleWorld[i] = GetPlayerVirtualWorld(playerid);
VehicleValue[i] = price;
valstr(VehicleOwner[i], dealerid);
VehicleNumberPlate[i] = DEFAULT_NUMBER_PLATE;
for(new d=0; d < sizeof(VehicleTrunk[]); d++)
{
VehicleTrunk[i][d][0] = 0;
VehicleTrunk[i][d][1] = 0;
}
for(new d=0; d < sizeof(VehicleMods[]); d++)
{
VehicleMods[i][d] = 0;
}
VehiclePaintjob[i] = 255;
VehicleLock[i] = 0;
VehicleAlarm[i] = 0;
UpdateVehicle(i, 0);
SaveVehicle(i);
format(msg, sizeof(msg), "Added vehicle id %d to dealerid %d", i, dealerid);
SendClientMessage(playerid, COLOR_WHITE, msg);
return 1;
}
}
SendClientMessage(playerid, COLOR_RED, "Can't add any more vehicles!");
return 1;
}
CMD:editv(playerid, params[])
{
if(!IsAdmin(playerid, 1)) return SendClientMessage(playerid, COLOR_RED, "You are not admin!");
if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
{
new id = GetVehicleID(GetPlayerVehicleID(playerid));
if(!IsValidVehicle(id)) return SendClientMessage(playerid, COLOR_RED, "This is not a dynamic vehicle!");
SetPVarInt(playerid, "DialogValue1", id);
ShowDialog(playerid, DIALOG_EDITVEHICLE);
return 1;
}
new vehicleid;
if(sscanf(params, "d", vehicleid)) return SendClientMessage(playerid, COLOR_GREY, "USAGE: /editv [vehicleid]");
if(!IsValidVehicle(vehicleid)) return SendClientMessage(playerid, COLOR_RED, "Invalid vehicleid!");
SetPVarInt(playerid, "DialogValue1", vehicleid);
ShowDialog(playerid, DIALOG_EDITVEHICLE);
return 1;
}
CMD:adddealership(playerid, params[])
{
if(!IsAdmin(playerid, 1)) return SendClientMessage(playerid, COLOR_RED, "You are not admin!");
if(!IsPlayerSpawned(playerid)) return SendClientMessage(playerid, COLOR_RED, "You can't use this command now!");
for(new i=1; i < MAX_DEALERSHIPS; i++)
{
if(!DealershipCreated[i])
{
new msg[128];
DealershipCreated[i] = 1;
GetPlayerPos(playerid, DealershipPos[i][0], DealershipPos[i][1], DealershipPos[i][2]);
UpdateDealership(i, 0);
SaveDealership(i);
format(msg, sizeof(msg), "Added dealership id %d", i);
SendClientMessage(playerid, COLOR_WHITE, msg);
return 1;
}
}
SendClientMessage(playerid, COLOR_RED, "Can't add any more dealerships!");
return 1;
}
CMD:deletedealership(playerid, params[])
{
if(!IsAdmin(playerid, 1)) return SendClientMessage(playerid, COLOR_RED, "You are not admin!");
new dealerid, msg[128];
if(sscanf(params, "d", dealerid)) return SendClientMessage(playerid, COLOR_GREY, "USAGE: /deletedealership [dealerid]");
if(!IsValidDealership(dealerid)) return SendClientMessage(playerid, COLOR_RED, "Invalid dealerid!");
for(new i=1; i < MAX_DVEHICLES; i++)
{
if(VehicleCreated[i] == VEHICLE_DEALERSHIP && strval(VehicleOwner[i]) == dealerid)
{
DestroyVehicle(VehicleID[i]);
Delete3DTextLabel(VehicleLabel[i]);
VehicleCreated[i] = 0;
}
}
DealershipCreated[dealerid] = 0;
Delete3DTextLabel(DealershipLabel[dealerid]);
SaveDealership(dealerid);
format(msg, sizeof(msg), "Deleted dealership id %d", dealerid);
SendClientMessage(playerid, COLOR_WHITE, msg);
return 1;
}
CMD:movedealership(playerid, params[])
{
if(!IsAdmin(playerid, 1)) return SendClientMessage(playerid, COLOR_RED, "You are not admin!");
new dealerid, msg[128];
if(sscanf(params, "d", dealerid)) return SendClientMessage(playerid, COLOR_GREY, "USAGE: /movedealership [dealerid]");
if(!IsValidDealership(dealerid)) return SendClientMessage(playerid, COLOR_RED, "Invalid dealerid!");
GetPlayerPos(playerid, DealershipPos[dealerid][0], DealershipPos[dealerid][1], DealershipPos[dealerid][2]);
UpdateDealership(dealerid, 1);
SaveDealership(dealerid);
format(msg, sizeof(msg), "Moved dealership id %d here", dealerid);
SendClientMessage(playerid, COLOR_WHITE, msg);
return 1;
}
CMD:gotodealership(playerid, params[])
{
if(!IsAdmin(playerid, 1)) return SendClientMessage(playerid, COLOR_RED, "You are not admin!");
new dealerid, msg[128];
if(sscanf(params, "d", dealerid)) return SendClientMessage(playerid, COLOR_GREY, "USAGE: /gotodealership [dealerid]");
if(!IsValidDealership(dealerid)) return SendClientMessage(playerid, COLOR_RED, "Invalid dealerid!");
SetPlayerPos(playerid, DealershipPos[dealerid][0], DealershipPos[dealerid][1], DealershipPos[dealerid][2]);
format(msg, sizeof(msg), "Teleported to dealership id %d", dealerid);
SendClientMessage(playerid, COLOR_WHITE, msg);
return 1;
}
CMD:addfuelstation(playerid, params[])
{
if(!IsAdmin(playerid, 1)) return SendClientMessage(playerid, COLOR_RED, "You are not admin!");
if(!IsPlayerSpawned(playerid)) return SendClientMessage(playerid, COLOR_RED, "You can't use this command now!");
for(new i=1; i < MAX_FUEL_STATIONS; i++)
{
if(!FuelStationCreated[i])
{
new msg[128];
FuelStationCreated[i] = 1;
GetPlayerPos(playerid, FuelStationPos[i][0], FuelStationPos[i][1], FuelStationPos[i][2]);
UpdateFuelStation(i, 0);
SaveFuelStation(i);
format(msg, sizeof(msg), "Added fuel station id %d", i);
SendClientMessage(playerid, COLOR_WHITE, msg);
return 1;
}
}
SendClientMessage(playerid, COLOR_RED, "Can't add any more fuel stations!");
return 1;
}
CMD:deletefuelstation(playerid, params[])
{
if(!IsAdmin(playerid, 1)) return SendClientMessage(playerid, COLOR_RED, "You are not admin!");
new stationid, msg[128];
if(sscanf(params, "d", stationid)) return SendClientMessage(playerid, COLOR_GREY, "USAGE: /deletefuelstation [stationid]");
if(!IsValidFuelStation(stationid)) return SendClientMessage(playerid, COLOR_RED, "Invalid stationid!");
FuelStationCreated[stationid] = 0;
Delete3DTextLabel(FuelStationLabel[stationid]);
SaveFuelStation(stationid);
format(msg, sizeof(msg), "Deleted fuel station id %d", stationid);
SendClientMessage(playerid, COLOR_WHITE, msg);
return 1;
}
CMD:movefuelstation(playerid, params[])
{
if(!IsAdmin(playerid, 1)) return SendClientMessage(playerid, COLOR_RED, "You are not admin!");
new stationid, msg[128];
if(sscanf(params, "d", stationid)) return SendClientMessage(playerid, COLOR_GREY, "USAGE: /movefuelstation [stationid]");
if(!IsValidFuelStation(stationid)) return SendClientMessage(playerid, COLOR_RED, "Invalid stationid!");
GetPlayerPos(playerid, FuelStationPos[stationid][0], FuelStationPos[stationid][1], FuelStationPos[stationid][2]);
UpdateFuelStation(stationid, 1);
SaveFuelStation(stationid);
format(msg, sizeof(msg), "Moved fuel station id %d here", stationid);
SendClientMessage(playerid, COLOR_WHITE, msg);
return 1;
}
CMD:gotofuelstation(playerid, params[])
{
if(!IsAdmin(playerid, 1)) return SendClientMessage(playerid, COLOR_RED, "You are not admin!");
new stationid, msg[128];
if(sscanf(params, "d", stationid)) return SendClientMessage(playerid, COLOR_GREY, "USAGE: /gotofuelstation [stationid]");
if(!IsValidFuelStation(stationid)) return SendClientMessage(playerid, COLOR_RED, "Invalid stationid!");
SetPlayerPos(playerid, FuelStationPos[stationid][0], FuelStationPos[stationid][1], FuelStationPos[stationid][2]);
format(msg, sizeof(msg), "Teleported to fuel station id %d", stationid);
SendClientMessage(playerid, COLOR_WHITE, msg);
return 1;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
new pos, funcname[32];
while(cmdtext[++pos] > ' ')
{
funcname[pos-1] = tolower(cmdtext[pos]);
}
strins(funcname, "cmd_", 0, sizeof(funcname));
while (cmdtext[pos] == ' ') pos++;
if(!cmdtext[pos])
{
return CallLocalFunction(funcname, "is", playerid, "\1");
}
return CallLocalFunction(funcname, "is", playerid, cmdtext[pos]);
}
public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
if(!ispassenger)
{
new id = GetVehicleID(vehicleid);
if(IsValidVehicle(id) && VehicleCreated[id] == VEHICLE_PLAYER)
{
new msg[128];
format(msg, sizeof(msg), "This vehicle belongs to %s", VehicleOwner[id]);
SendClientMessage(playerid, COLOR_GREY, msg);
}
}
return 1;
}
public OnPlayerStateChange(playerid, newstate, oldstate)
{
if(IsPlayerInAnyVehicle(playerid) && !IsBicycle(GetPlayerVehicleID(playerid)))
{
//TextDrawShowForPlayer(playerid, SpeedoBox);
TextDrawShowForPlayer(playerid, SpeedoText[playerid]);
new vehicleid = GetPlayerVehicleID(playerid);
if(VehicleSecurity[vehicleid] == 1)
{
ToggleAlarm(vehicleid, VEHICLE_PARAMS_ON);
SetTimerEx("StopAlarm", ALARM_TIME, false, "d", vehicleid);
}
}
else
{
//TextDrawHideForPlayer(playerid, SpeedoBox);
TextDrawHideForPlayer(playerid, SpeedoText[playerid]);
}
if(newstate == PLAYER_STATE_DRIVER)
{
new vehicleid = GetPlayerVehicleID(playerid);
new id = GetVehicleID(vehicleid);
if(IsValidVehicle(id))
{
if(VehicleCreated[id] == VEHICLE_DEALERSHIP)
{
SetPVarInt(playerid, "DialogValue1", id);
ShowDialog(playerid, DIALOG_VEHICLE_BUY);
return 1;
}
}
if(IsBicycle(vehicleid))
{
ToggleEngine(vehicleid, VEHICLE_PARAMS_ON);
}
if(Fuel[vehicleid] <= 0)
{
ToggleEngine(vehicleid, VEHICLE_PARAMS_OFF);
}
}
return 1;
}
public OnVehicleMod(playerid, vehicleid, componentid)
{
new id = GetVehicleID(vehicleid);
if(IsValidVehicle(id))
{
VehicleMods[id][GetVehicleComponentType(componentid)] = componentid;
SaveVehicle(id);
}
return 1;
}
public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
{
new id = GetVehicleID(vehicleid);
if(IsValidVehicle(id))
{
VehiclePaintjob[id] = paintjobid;
SaveVehicle(id);
}
return 1;
}
public OnVehicleRespray(playerid, vehicleid, color1, color2)
{
new id = GetVehicleID(vehicleid);
if(IsValidVehicle(id))
{
VehicleColor[id][0] = color1;
VehicleColor[id][1] = color2;
SaveVehicle(id);
}
return 1;
}
ShowDialog(playerid, dialogid)
{
switch(dialogid)
{
case DIALOG_VEHICLE:
{
new vehicleid = GetPVarInt(playerid, "DialogValue1");
new caption[32], info[256];
format(caption, sizeof(caption), "Vehicle ID %d", vehicleid);
strcat(info, "Engine\nLights\nHood\nTrunk", sizeof(info));
strcat(info, "\nFill Tank", sizeof(info));
if(GetPlayerVehicleAccess(playerid, vehicleid) >= 2)
{
new value = VehicleValue[vehicleid]/2;
format(info, sizeof(info), "%s\nSell Vehicle ($%d)\nPark Vehicle\nEdit License Plate", info, value);
}
ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_LIST, caption, info, "Select", "Cancel");
}
case DIALOG_VEHICLE_BUY:
{
new vehicleid = GetPVarInt(playerid, "DialogValue1");
new caption[32], info[256];
format(caption, sizeof(caption), "Vehicle ID %d", vehicleid);
format(info, sizeof(info), "This vehicle is for sale ($%d)\nWould you like to buy it?", VehicleValue[vehicleid]);
ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_MSGBOX, caption, info, "Yes", "No");
}
case DIALOG_VEHICLE_SELL:
{
new targetid = GetPVarInt(playerid, "DialogValue1");
new id = GetPVarInt(playerid, "DialogValue2");
new price = GetPVarInt(playerid, "DialogValue3");
new info[256];
format(info, sizeof(info), "%s (%d) wants to sell you a %s for $%d.", PlayerName(targetid), targetid,
VehicleNames[VehicleModel[id]-400], price);
strcat(info, "\n\nWould you like to buy?", sizeof(info));
ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_MSGBOX, "Buy Vehicle", info, "Yes", "No");
}
case DIALOG_TRUNK:
{
new vehicleid = GetPVarInt(playerid, "DialogValue1");
new name[32], info[256];
for(new i=0; i < sizeof(VehicleTrunk[]); i++)
{
if(VehicleTrunk[vehicleid][i][1] > 0)
{
GetWeaponName(VehicleTrunk[vehicleid][i][0], name, sizeof(name));
format(info, sizeof(info), "%s%d. %s (%d)\n", info, i+1, name, VehicleTrunk[vehicleid][i][1]);
}
else
{
format(info, sizeof(info), "%s%d. Empty\n", info, i+1);
}
}
ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_LIST, "Trunk", info, "Select", "Cancel");
}
case DIALOG_TRUNK_ACTION:
{
new info[128];
strcat(info, "Put Into Trunk\nTake From Trunk", sizeof(info));
ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_LIST, "Trunk", info, "Select", "Cancel");
}
case DIALOG_VEHICLE_PLATE:
{
ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, "Edit License Plate", "Enter new license plate:", "Change", "Back");
}
case DIALOG_FUEL:
{
new info[128];
strcat(info, "Refuel Vehicle ($" #FUEL_PRICE ")\nBuy Gas Can ($" #GAS_CAN_PRICE ")", sizeof(info));
ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_LIST, "Fuel Station", info, "OK", "Cancel");
}
case DIALOG_EDITVEHICLE:
{
new vehicleid = GetPVarInt(playerid, "DialogValue1");
new caption[32], info[256];
format(caption, sizeof(caption), "Edit Vehicle ID %d", vehicleid);
format(info, sizeof(info), "1. Value: [$%d]\n2. Model: [%d (%s)]\n3. Colors: [%d] [%d]\n4. License Plate: [%s]",
VehicleValue[vehicleid], VehicleModel[vehicleid], VehicleNames[VehicleModel[vehicleid]-400],
VehicleColor[vehicleid][0], VehicleColor[vehicleid][1], VehicleNumberPlate[vehicleid]);
strcat(info, "\n5. Delete Vehicle\n6. Park Vehicle\n7. Go To Vehicle", sizeof(info));
strcat(info, "\n\nEnter: [nr] [value1] [value2]", sizeof(info));
ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, caption, info, "OK", "Cancel");
}
}
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == DIALOG_ERROR)
{
ShowDialog(playerid, DialogReturn[playerid]);
return 1;
}
DialogReturn[playerid] = dialogid;
if(dialogid == DIALOG_VEHICLE)
{
if(response)
{
switch(listitem)
{
case 0:
{
new vehicleid = GetPlayerVehicleID(playerid);
new engine, lights, alarm, doors, bonnet, boot, objective;
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
if(engine == 0 && Fuel[vehicleid] <= 0)
{
ShowErrorDialog(playerid, "This vehicle is out of fuel!");
return 1;
}
if(engine == 1) { engine = 0; lights = 0; }
else { engine = 1; lights = 1; }
SetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
}
case 1:
{
new vehicleid = GetPlayerVehicleID(playerid);
new engine, lights, alarm, doors, bonnet, boot, objective;
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
if(lights == 1) lights = 0; else lights = 1;
SetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
}
case 2:
{
new vehicleid = GetPlayerVehicleID(playerid);
new engine, lights, alarm, doors, bonnet, boot, objective;
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
if(bonnet == 1) bonnet = 0; else bonnet = 1;
SetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
}
case 3:
{
new vehicleid = GetPlayerVehicleID(playerid);
new engine, lights, alarm, doors, bonnet, boot, objective;
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
if(boot == 1) boot = 0; else boot = 1;
SetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
}
case 4:
{
if(!GetPVarInt(playerid, "GasCan"))
{
ShowErrorDialog(playerid, "You don't have a gas can!");
return 1;
}
new vehicleid = GetPlayerVehicleID(playerid);
if(Fuel[vehicleid] < 80.0) Fuel[vehicleid] += 20.0;
else Fuel[vehicleid] = 100.0;
SetPVarInt(playerid, "GasCan", 0);
SendClientMessage(playerid, COLOR_WHITE, "You have filled the fuel tank with 20 fuel");
}
case 5:
{
new id = GetPVarInt(playerid, "DialogValue1");
if(GetPlayerVehicleAccess(playerid, id) < 2)
{
ShowErrorDialog(playerid, "You are not the owner of this vehicle!");
return 1;
}
new msg[128];
VehicleCreated[id] = 0;
new money = VehicleValue[id]/2;
GivePlayerMoney(playerid, money);
format(msg, sizeof(msg), "You have sold your vehicle for $%d", money);
SendClientMessage(playerid, COLOR_WHITE, msg);
RemovePlayerFromVehicle(playerid);
DestroyVehicle(VehicleID[id]);
SaveVehicle(id);
}
case 6:
{
new vehicleid = GetPVarInt(playerid, "DialogValue1");
if(GetPlayerVehicleAccess(playerid, vehicleid) < 2)
{
ShowErrorDialog(playerid, "You are not the owner of this vehicle!");
return 1;
}
GetVehiclePos(VehicleID[vehicleid], VehiclePos[vehicleid][0], VehiclePos[vehicleid][1], VehiclePos[vehicleid][2]);
GetVehicleZAngle(VehicleID[vehicleid], VehiclePos[vehicleid][3]);
VehicleInterior[vehicleid] = GetPlayerInterior(playerid);
VehicleWorld[vehicleid] = GetPlayerVirtualWorld(playerid);
SendClientMessage(playerid, COLOR_WHITE, "You have parked this vehicle here");
UpdateVehicle(vehicleid, 1);
PutPlayerInVehicle(playerid, VehicleID[vehicleid], 0);
SaveVehicle(vehicleid);
}
case 7:
{
ShowDialog(playerid, DIALOG_VEHICLE_PLATE);
}
}
}
return 1;
}
if(dialogid == DIALOG_VEHICLE_BUY)
{
if(response)
{
if(GetPlayerVehicles(playerid) >= MAX_PLAYER_VEHICLES)
{
ShowErrorDialog(playerid, "You can't buy any more vehicles! Max: " #MAX_PLAYER_VEHICLES );
return 1;
}
new id = GetPVarInt(playerid, "DialogValue1");
if(GetPlayerMoney(playerid) < VehicleValue[id])
{
ShowErrorDialog(playerid, "You don't have enough money to buy this vehicle!");
return 1;
}
new freeid = GetFreeVehicleID();
if(!freeid)
{
ShowErrorDialog(playerid, "Vehicle dealership is out of stock!");
return 1;
}
GivePlayerMoney(playerid, -VehicleValue[id]);
new dealerid = strval(VehicleOwner[id]);
VehicleCreated[freeid] = VEHICLE_PLAYER;
VehicleModel[freeid] = VehicleModel[id];
VehiclePos[freeid] = DealershipPos[dealerid];
VehicleColor[freeid] = VehicleColor[id];
VehicleInterior[freeid] = VehicleInterior[id];
VehicleWorld[freeid] = VehicleWorld[id];
VehicleValue[freeid] = VehicleValue[id];
GetPlayerName(playerid, VehicleOwner[freeid], sizeof(VehicleOwner[]));
VehicleNumberPlate[freeid] = DEFAULT_NUMBER_PLATE;
for(new d=0; d < sizeof(VehicleTrunk[]); d++)
{
VehicleTrunk[freeid][d][0] = 0;
VehicleTrunk[freeid][d][1] = 0;
}
for(new d=0; d < sizeof(VehicleMods[]); d++)
{
VehicleMods[freeid][d] = 0;
}
VehiclePaintjob[freeid] = 255;
VehicleLock[freeid] = 0;
VehicleAlarm[freeid] = 0;
UpdateVehicle(freeid, 0);
SaveVehicle(freeid);
new msg[128];
format(msg, sizeof(msg), "You have bought this vehicle for $%d", VehicleValue[id]);
SendClientMessage(playerid, COLOR_WHITE, msg);
}
else
{
new id = GetPVarInt(playerid, "DialogValue1");
if(GetPlayerVehicleAccess(playerid, id) < 1)
{
RemovePlayerFromVehicle(playerid);
}
}
return 1;
}
if(dialogid == DIALOG_VEHICLE_SELL)
{
if(response)
{
if(GetPlayerVehicles(playerid) >= MAX_PLAYER_VEHICLES)
{
ShowErrorDialog(playerid, "You can't buy any more vehicles! Max: " #MAX_PLAYER_VEHICLES );
return 1;
}
new targetid = GetPVarInt(playerid, "DialogValue1");
new id = GetPVarInt(playerid, "DialogValue2");
new price = GetPVarInt(playerid, "DialogValue3");
if(GetPlayerMoney(playerid) < price)
{
ShowErrorDialog(playerid, "You don't have enough money to buy this vehicle!");
return 1;
}
new msg[128];
GetPlayerName(playerid, VehicleOwner[id], sizeof(VehicleOwner[]));
GivePlayerMoney(playerid, -price);
GivePlayerMoney(targetid, price);
SaveVehicle(id);
format(msg, sizeof(msg), "You have bought this vehicle for $%d", price);
SendClientMessage(playerid, COLOR_WHITE, msg);
format(msg, sizeof(msg), "%s (%d) has accepted your offer and bought the vehicle", PlayerName(playerid), playerid);
SendClientMessage(targetid, COLOR_WHITE, msg);
}
else
{
new targetid = GetPVarInt(playerid, "DialogValue1");
new msg[128];
format(msg, sizeof(msg), "%s (%d) refused your offer", PlayerName(playerid), playerid);
SendClientMessage(targetid, COLOR_WHITE, msg);
}
return 1;
}
if(dialogid == DIALOG_FINDVEHICLE)
{
if(response)
{
new id;
sscanf(inputtext[4], "d", id);
if(IsValidVehicle(id))
{
TrackCar[playerid] = VehicleID[id];
SendClientMessage(playerid, COLOR_WHITE, "Your vehicle's location is shown on your minimap");
}
}
return 1;
}
if(dialogid == DIALOG_TRUNK)
{
if(response)
{
SetPVarInt(playerid, "DialogValue2", listitem);
ShowDialog(playerid, DIALOG_TRUNK_ACTION);
}
else
{
new id = GetPVarInt(playerid, "DialogValue1");
ToggleBoot(VehicleID[id], VEHICLE_PARAMS_OFF);
}
return 1;
}
if(dialogid == DIALOG_TRUNK_ACTION)
{
if(response)
{
new id = GetPVarInt(playerid, "DialogValue1");
new slot = GetPVarInt(playerid, "DialogValue2");
switch(listitem)
{
case 0:
{
new weaponid = GetPlayerWeapon(playerid);
if(weaponid == 0)
{
ShowErrorDialog(playerid, "You don't have a weapon in your hands!");
return 1;
}
VehicleTrunk[id][slot][0] = weaponid;
if(IsMeleeWeapon(weaponid)) VehicleTrunk[id][slot][1] = 1;
else VehicleTrunk[id][slot][1] = GetPlayerAmmo(playerid);
RemovePlayerWeapon(playerid, weaponid);
SaveVehicle(id);
}
case 1:
{
if(VehicleTrunk[id][slot][1] <= 0)
{
ShowErrorDialog(playerid, "This slot is empty!");
return 1;
}
GivePlayerWeapon(playerid, VehicleTrunk[id][slot][0], VehicleTrunk[id][slot][1]);
VehicleTrunk[id][slot][0] = 0;
VehicleTrunk[id][slot][1] = 0;
SaveVehicle(id);
}
}
}
ShowDialog(playerid, DIALOG_TRUNK);
return 1;
}
if(dialogid == DIALOG_VEHICLE_PLATE)
{
if(response)
{
if(strlen(inputtext) < 1 || strlen(inputtext) >= sizeof(VehicleNumberPlate[]))
{
ShowErrorDialog(playerid, "Invalid length!");
return 1;
}
new id = GetPVarInt(playerid, "DialogValue1");
new vehicleid = VehicleID[id];
strmid(VehicleNumberPlate[id], inputtext, 0, sizeof(VehicleNumberPlate[]));
SaveVehicle(id);
SetVehicleNumberPlate(vehicleid, inputtext);
SetVehicleToRespawn(vehicleid);
new msg[128];
format(msg, sizeof(msg), "You have changed vehicle number plate to %s", inputtext);
SendClientMessage(playerid, COLOR_WHITE, msg);
}
else ShowDialog(playerid, DIALOG_VEHICLE);
return 1;
}
if(dialogid == DIALOG_FUEL)
{
if(response)
{
switch(listitem)
{
case 0:
{
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
{
ShowErrorDialog(playerid, "You are not driving a vehicle!");
return 1;
}
new vehicleid = GetPlayerVehicleID(playerid);
if(IsBicycle(vehicleid))
{
ShowErrorDialog(playerid, "Your vehicle doesn't have a fuel tank!");
return 1;
}
if(Fuel[vehicleid] >= 100.0)
{
ShowErrorDialog(playerid, "Your vehicle fuel tank is full!");
return 1;
}
if(GetPlayerMoney(playerid) < FUEL_PRICE)
{
ShowErrorDialog(playerid, "You don't have enough money!");
return 1;
}
RefuelTime[playerid] = 5;
SetPVarFloat(playerid, "Fuel", Fuel[vehicleid]);
GameTextForPlayer(playerid, "~w~refueling...", 2000, 3);
}
case 1:
{
if(GetPVarInt(playerid, "GasCan"))
{
ShowErrorDialog(playerid, "You already have a gas can!");
return 1;
}
if(GetPlayerMoney(playerid) < GAS_CAN_PRICE)
{
ShowErrorDialog(playerid, "You don't have enough money!");
return 1;
}
GivePlayerMoney(playerid, -GAS_CAN_PRICE);
SetPVarInt(playerid, "GasCan", 1);
SendClientMessage(playerid, COLOR_WHITE, "You have bought a gas can for $" #GAS_CAN_PRICE );
}
}
}
return 1;
}
if(dialogid == DIALOG_EDITVEHICLE)
{
if(response)
{
new id = GetPVarInt(playerid, "DialogValue1");
new nr, params[128];
sscanf(inputtext, "ds", nr, params);
switch(nr)
{
case 1:
{
new value = strval(params);
if(value < 0) value = 0;
VehicleValue[id] = value;
UpdateVehicleLabel(id, 1);
SaveVehicle(id);
ShowDialog(playerid, DIALOG_EDITVEHICLE);
}
case 2:
{
new value;
if(IsNumeric(params)) value = strval(params);
else value = GetVehicleModelIDFromName(params);
if(value < 400 || value > 611)
{
ShowErrorDialog(playerid, "Invalid vehicle model!");
return 1;
}
VehicleModel[id] = value;
for(new i=0; i < sizeof(VehicleMods[]); i++)
{
VehicleMods[id][i] = 0;
}
VehiclePaintjob[id] = 255;
UpdateVehicle(id, 1);
SaveVehicle(id);
ShowDialog(playerid, DIALOG_EDITVEHICLE);
}
case 3:
{
new color1, color2;
sscanf(params, "dd", color1, color2);
VehicleColor[id][0] = color1;
VehicleColor[id][1] = color2;
SaveVehicle(id);
ChangeVehicleColor(VehicleID[id], color1, color2);
ShowDialog(playerid, DIALOG_EDITVEHICLE);
}
case 4:
{
if(strlen(params) < 1 || strlen(params) > 8)
{
ShowErrorDialog(playerid, "Invalid length!");
return 1;
}
strmid(VehicleNumberPlate[id], params, 0, sizeof(params));
SaveVehicle(id);
SetVehicleNumberPlate(VehicleID[id], params);
SetVehicleToRespawn(VehicleID[id]);
ShowDialog(playerid, DIALOG_EDITVEHICLE);
}
case 5:
{
DestroyVehicle(VehicleID[id]);
if(VehicleCreated[id] == VEHICLE_DEALERSHIP)
{
Delete3DTextLabel(VehicleLabel[id]);
}
VehicleCreated[id] = 0;
SaveVehicle(id);
new msg[128];
format(msg, sizeof(msg), "You have deleted vehicle id %d", id);
SendClientMessage(playerid, COLOR_WHITE, msg);
}
case 6:
{
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
{
ShowErrorDialog(playerid, "You are not driving the vehicle!");
return 1;
}
GetVehiclePos(VehicleID[id], VehiclePos[id][0], VehiclePos[id][1], VehiclePos[id][2]);
GetVehicleZAngle(VehicleID[id], VehiclePos[id][3]);
VehicleInterior[id] = GetPlayerInterior(playerid);
VehicleWorld[id] = GetPlayerVirtualWorld(playerid);
SendClientMessage(playerid, COLOR_WHITE, "You have parked this vehicle here");
UpdateVehicle(id, 1);
PutPlayerInVehicle(playerid, VehicleID[id], 0);
SaveVehicle(id);
ShowDialog(playerid, DIALOG_EDITVEHICLE);
}
case 7:
{
new Float:x, Float:y, Float:z;
GetVehiclePos(VehicleID[id], x, y, z);
SetPlayerPos(playerid, x, y, z+1);
new msg[128];
format(msg, sizeof(msg), "You have teleported to vehicle id %d", id);
SendClientMessage(playerid, COLOR_WHITE, msg);
}
}
}
return 1;
}
return 0;
}
stock sscanf(string[], format[], {Float,_}:...)
{
#if defined isnull
if (isnull(string))
#else
if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
#endif
{
return format[0];
}
new
formatPos = 0,
stringPos = 0,
paramPos = 2,
paramCount = numargs(),
delim = ' ';
while (string[stringPos] && string[stringPos] <= ' ')
{
stringPos++;
}
while (paramPos < paramCount && string[stringPos])
{
switch (format[formatPos++])
{
case '\0':
{
return 0;
}
case 'i', 'd':
{
new
neg = 1,
num = 0,
ch = string[stringPos];
if (ch == '-')
{
neg = -1;
ch = string[++stringPos];
}
do
{
stringPos++;
if ('0' <= ch <= '9')
{
num = (num * 10) + (ch - '0');
}
else
{
return -1;
}
}
while ((ch = string[stringPos]) > ' ' && ch != delim);
setarg(paramPos, 0, num * neg);
}
case 'h', 'x':
{
new
num = 0,
ch = string[stringPos];
do
{
stringPos++;
switch (ch)
{
case 'x', 'X':
{
num = 0;
continue;
}
case '0' .. '9':
{
num = (num << 4) | (ch - '0');
}
case 'a' .. 'f':
{
num = (num << 4) | (ch - ('a' - 10));
}
case 'A' .. 'F':
{
num = (num << 4) | (ch - ('A' - 10));
}
default:
{
return -1;
}
}
}
while ((ch = string[stringPos]) > ' ' && ch != delim);
setarg(paramPos, 0, num);
}
case 'c':
{
setarg(paramPos, 0, string[stringPos++]);
}
case 'f':
{
new
end = stringPos - 1,
ch;
while ((ch = string[++end]) && ch != delim) {}
string[end] = '\0';
setarg(paramPos,0,_:floatstr(string[stringPos]));
string[end] = ch;
stringPos = end;
}
case 'p':
{
delim = format[formatPos++];
continue;
}
case '\'':
{
new
end = formatPos - 1,
ch;
while ((ch = format[++end]) && ch != '\'') {}
if (!ch)
{
return -1;
}
format[end] = '\0';
if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1)
{
if (format[end + 1])
{
return -1;
}
return 0;
}
format[end] = '\'';
stringPos = ch + (end - formatPos);
formatPos = end + 1;
}
case 'u':
{
new
end = stringPos - 1,
id = 0,
bool:num = true,
ch;
while ((ch = string[++end]) && ch != delim)
{
if (num)
{
if ('0' <= ch <= '9')
{
id = (id * 10) + (ch - '0');
}
else
{
num = false;
}
}
}
if (num && IsPlayerConnected(id))
{
setarg(paramPos, 0, id);
}
else
{
#if !defined foreach
#define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
#define __SSCANF_FOREACH__
#endif
string[end] = '\0';
num = false;
new
name[MAX_PLAYER_NAME];
id = end - stringPos;
foreach (Player, playerid)
{
GetPlayerName(playerid, name, sizeof (name));
if (!strcmp(name, string[stringPos], true, id))
{
setarg(paramPos, 0, playerid);
num = true;
break;
}
}
if (!num)
{
setarg(paramPos, 0, INVALID_PLAYER_ID);
}
string[end] = ch;
#if defined __SSCANF_FOREACH__
#undef foreach
#undef __SSCANF_FOREACH__
#endif
}
stringPos = end;
}
case 's', 'z':
{
new
i = 0,
ch;
if (format[formatPos])
{
while ((ch = string[stringPos++]) && ch != delim)
{
setarg(paramPos, i++, ch);
}
if (!i)
{
return -1;
}
}
else
{
while ((ch = string[stringPos++]))
{
setarg(paramPos, i++, ch);
}
}
stringPos--;
setarg(paramPos, i, '\0');
}
default:
{
continue;
}
}
while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ')
{
stringPos++;
}
while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' '))
{
stringPos++;
}
paramPos++;
}
do
{
if ((delim = format[formatPos++]) > ' ')
{
if (delim == '\'')
{
while ((delim = format[formatPos++]) && delim != '\'') {}
}
else if (delim != 'z')
{
return delim;
}
}
}
while (delim > ' ');
return 0;
}