All pastes #386041 Raw Edit

S:Utils

public text v1 · immutable
·published 2007-03-08 09:27 UTC
rendered paste body
/*
 * S:Utils
 * 1
 * By Sacky
 * Credits:
 	SA:MP Devs
 	mabako
 	Betamaster
 	Simon
 	Denver
 	DracoBlue
 	Spark
 	dryaXon
 	Comphuphase
 	Slick
 	Allan
 	El Presy
 	kool
 	yom
 */

#if defined _samp_included
	#endinput
#else
	#define _samp_included
#endif

#if defined _sutils_included_
	#endinput
#else
	#define _sutils_included_
#endif

#pragma library sutils

#include <core>
#include <float>
#include <string>
#include <file>
#include <time>
#include <datagram>

#define DEBUG false

#define CORE false

// --------------------------------------------------
// Defines
// --------------------------------------------------

#define UNKNOWN									-1

#define MAX_PLAYER_NAME							24
#define MAX_WORLDBOUNDS							2000.0
#define MAX_CHATLINES							10

#if !defined MAX_PLAYERS
	#define MAX_PLAYERS 						100
#endif

#define MAX_GTASAVEHICLES   					212
#define MAX_MODELS								50
#define MAX_VEHICLES							254
#define INVALID_PLAYER_ID						255
#define NO_TEAM									255
#define MAX_CLASS 								300

#define TYPE_INVALID 							0
#define TYPE_BIKE 								1
#define TYPE_BICYCLE 							2
#define TYPE_BOAT 								3
#define TYPE_CAR 								4
#define TYPE_HELI 								5
#define TYPE_MONSTER 							6
#define TYPE_PLANE 								7
#define TYPE_QUAD 								8
#define TYPE_HEAVY 								9

#define PLAYER_STATE_NONE						0
#define PLAYER_STATE_ONFOOT						1
#define PLAYER_STATE_DRIVER						2
#define PLAYER_STATE_PASSENGER					3
#define PLAYER_STATE_EXIT_VEHICLE				4
#define PLAYER_STATE_ENTER_VEHICLE_DRIVER		5
#define PLAYER_STATE_ENTER_VEHICLE_PASSENGER	6
#define PLAYER_STATE_WASTED						7
#define PLAYER_STATE_SPAWNED					8

#define WEAPON_GOLFCLUB							2
#define WEAPON_NITESTICK						3
#define WEAPON_KNIFE							4
#define WEAPON_BAT								5
#define WEAPON_SHOVEL							6
#define WEAPON_POOLSTICK						7
#define WEAPON_KATANA							8
#define WEAPON_CHAINSAW							9
#define WEAPON_DILDO							10
#define WEAPON_DILDO2							11
#define WEAPON_VIBRATOR							12
#define WEAPON_VIBRATOR2						13
#define WEAPON_FLOWER							14
#define WEAPON_CANE								15
#define WEAPON_GRENADE							16
#define WEAPON_TEARGAS							17
#define WEAPON_MOLTOV							18
#define WEAPON_COLT45							22
#define WEAPON_SILENCED							23
#define WEAPON_DEAGLE							24
#define WEAPON_SHOTGUN							25
#define WEAPON_SAWEDOFF							26
#define WEAPON_SHOTGSPA							27
#define WEAPON_UZI								28
#define WEAPON_MP5								29
#define WEAPON_AK47								30
#define WEAPON_M4								31
#define WEAPON_TEC9								32
#define WEAPON_RIFLE							33
#define WEAPON_SNIPER							34
#define WEAPON_ROCKETLAUNCHER					35
#define WEAPON_HEATSEEKER						36
#define WEAPON_FLAMETHROWER						37
#define WEAPON_MINIGUN							38
#define WEAPON_SATCHEL							39
#define WEAPON_BOMB								40
#define WEAPON_SPRAYCAN							41
#define WEAPON_FIREEXTINGUISHER					42
#define WEAPON_CAMERA							43
#define WEAPON_PARACHUTE						46
#define WEAPON_VEHICLE							49
#define WEAPON_DROWN							53
#define WEAPON_COLLISION						54

#define PICKUP_BRASS_KNUCKLES					331
#define PICKUP_GOLFCLUB 						333
#define PICKUP_NITESTICK 						334
#define PICKUP_KNIFE 							335
#define PICKUP_BAT 								336
#define PICKUP_SHOVEL 							337
#define PICKUP_POOLSTICK 						338
#define PICKUP_KATANA 							339
#define PICKUP_CHAINSAW 						341
#define PICKUP_DILDO 							321
#define PICKUP_DILDO2 							322
#define PICKUP_VIBRATOR1 						323
#define PICKUP_VIBRATOR2 						324
#define PICKUP_FLOWER 							325
#define PICKUP_CANE 							326
#define PICKUP_GRENADE							342
#define PICKUP_TEARGAS 							343
#define PICKUP_MOLTOV 							344
#define PICKUP_MISSILE 							345
#define PICKUP_COLT45 							346
#define PICKUP_SILENCED 						347
#define PICKUP_DEAGLE 							348
#define PICKUP_SHOTGUN 							349
#define PICKUP_SAWEDOFF 						350
#define PICKUP_SHOTGSPA 						351
#define PICKUP_UZI 								352
#define PICKUP_MP5 								353
#define PICKUP_HYDRAFLARE 						354
#define PICKUP_AK47 							355
#define PICKUP_TEC9 							372
#define PICKUP_RIFLE 							357
#define PICKUP_SNIPER 							358
#define PICKUP_ROCKETLAUNCHER 					359
#define PICKUP_HEATSEEKER 						360
#define PICKUP_FLAMETHROWER 					361
#define PICKUP_MINIGUN 							362
#define PICKUP_SACHEL 							363
#define PICKUP_BOMB 							364
#define PICKUP_SPRAYCAN 						365
#define PICKUP_FIREEXTINGUISHER 				366
#define PICKUP_CAMERA 							367
#define PICKUP_NIGHTVISION_GOGGLES 				368
#define PICKUP_THERMAL_GOGGLES 					369
#define PICKUP_JETPACK 							370
#define PICKUP_PARACHUTE 						371
#define PICKUP_CARDOOR							374
#define PICKUP_BUMPER							375
#define PICKUP_SIDEPANEL						376
#define PICKUP_BONNET							377
#define PICKUP_BOOT								378
#define PICKUP_WHEEL							379
#define PICKUP_ARMOR 							1242

#define COLOR_GREY								0xAFAFAFAA
#define COLOR_GREEN         				 	0x33AA33AA
#define COLOR_RED          					    0xAA3333AA
#define COLOR_YELLOW      	 				    0xFFFF00AA
#define COLOR_WHITE       					    0xFFFFFFAA
#define COLOR_BLUE        					    0x0000BBAA
#define COLOR_LIGHTBLUE      					0x33CCFFAA
#define COLOR_ORANGE          					0xFF9900AA
#define COLOR_TAXIYELLOW      					0xF0E68CAA
#define COLOR_POLICEBLUE      					0x3F63CCAA
#define COLOR_LIGHTBLUE							0x33CCFFAA
#define COLOR_LIME								0x10F441AA
#define COLOR_MAGENTA							0xFF00FFFF
#define COLOR_NAVY								0x000080AA
#define COLOR_AQUA								0xF0F8FFAA
#define COLOR_CRIMSON							0xDC143CAA
#define COLOR_FLBLUE							0x6495EDAA
#define COLOR_BISQUE							0xFFE4C4AA
#define COLOR_BLACK								0x000000AA
#define COLOR_CHARTREUSE						0x7FFF00AA
#define COLOR_BROWN								0xA52A2AAA
#define COLOR_CORAL								0xFF7F50AA
#define COLOR_GOLD								0xB8860BAA
#define COLOR_GREENYELLOW						0xADFF2FAA
#define COLOR_INDIGO							0x4B00B0AA
#define COLOR_IVORY								0xFFFF82AA
#define COLOR_LAWNGREEN							0x7CFC00AA
#define COLOR_SEAGREEN							0x20B2AAAA
#define COLOR_LIMEGREEN							0x32CD32AA
#define COLOR_MIDNIGHTBLUE						0x191970AA
#define COLOR_MAROON							0x800000AA
#define COLOR_ORANGERED							0xFF4500AA
#define COLOR_PINK								0xFFC0CBAA
#define COLOR_SEAGREEN2							0x2E8B57AA
#define COLOR_SPRINGGREEN						0x00FF7FAA
#define COLOR_TOMATO							0xFF6347AA
#define COLOR_YELLOWGREEN						0x9ACD32AA
#define COLOR_MEDIUMAQUA						0x83BFBFAA
#define COLOR_MEDIUMMAGENTA						0x8B008BAA
#define COLOR_VIOLET							0xEE82EEFF
#define COLOR_GRAY								0x808080AA

#define SOUND_WEAKHIT							1002
#define SOUND_CRASH								1009
#define SOUND_MACHINERY1						1020
#define SOUND_MACHINERY2						1021
#define SOUND_MOTORSTOP							1022
#define SOUND_WEAKHIT2							1027
#define SOUND_GARAGEDOOR						1035
#define SOUND_BLIP3								1052
#define SOUND_BLIP4								1053
#define SOUND_BLIP1                  			1056
#define SOUND_BLIP2                 			1057
#define SOUND_CHECKPOINT             			1058
#define SOUND_MUSIC1							1062
#define SOUND_MUSIC2							1068
#define SOUND_MUSIC3							1076
#define SOUND_MAPPLACE							1083
#define SOUND_MAPREMOVE							1084
#define SOUND_BLIP5								1085
#define SOUND_LOUDHIT							1095
#define SOUND_MUSIC_RACERECORD       			1097
#define SOUND_RATTLE1							1100
#define SOUND_RATTLE2							1101
#define SOUND_PUNCH1							1130
#define SOUND_CAMERA							1132
#define SOUND_MACHINERY3						1133
#define SOUND_SPRAY								1134
#define SOUND_HIT								1135
#define SOUND_PUNCH2							1136
#define SOUND_BLIP6								1137
#define SOUND_CRASH1							1140
#define SOUND_CRASH2							1141
#define SOUND_CROWD								1142
#define SOUND_SPLASH							1144
#define SOUND_HORN								1147
#define SOUND_CRASH3							1148
#define SOUND_PURCHASE               			1149
#define SOUND_SELECTION							1150
#define SOUND_ALARM3							1155
#define SOUND_EXPLOSION              			1159
#define SOUND_STOMP								1163
#define SOUND_MUSIC_RACEFINISH     				1183
#define SOUND_OFF                    			1184
#define SOUND_MUSIC_MISSIONCOMPLETE  			1185
#define SOUND_MUSIC_CLASSSELECT   			    1187
#define SOUND_SLAP								1190
#define SOUND_ALARM4							9200
#define SOUND_ALARM1							41800
#define SOUND_ALARM2							42801

#define GAMETEXT_LOWERLEFT						1
#define GAMETEXT_CENTEROLD						2
#define GAMETEXT_CENTER1						3
#define GAMETEXT_UPPER1							4
#define GAMETEXT_CENTER2						5
#define GAMETEXT_UPPER2							6

#define GTNEW_LINE 								"~n~"
#define GTRED									"~r~"
#define GTGREEN									"~g~"
#define GTBLUE									"~b~"
#define GTWHITE									"~w~"
#define GTYELLOW								"~y~"
#define GTPINK									"~p~"
#define GTDOWN									"~d~"
#define GTLIGHT									"~h~"
#define GTBLACK									"~l~"
#define GTUP									"~u~"
#define GTRAND									"~~~"
#define GTSTAR									"]"
#define GTLEFT									"~<~"
#define GTRIGHT									"~>~"
#define GTKEY									"~k~"

#define PI 										3.14159265

#define MAX_PARS 								8
#define MAX_TIMERS 								32

#define WTYPE_MELEE 							1
#define WTYPE_PROJECTILE 						2
#define WTYPE_PISTOL 							3
#define WTYPE_SHOTGUN 							4
#define WTYPE_MACHINEGUN 						5
#define WTYPE_ASSAULT 							6
#define WTYPE_RIFLE 							7
#define WTYPE_HEAVY 							8
#define WTYPE_SPECIAL 							9

#define V_LANDSTAL         				        400
#define V_BRAVURA         				        401
#define V_LINERUN      				            403
#define V_PEREN                   				404
#define V_SENTINEL                				405
#define V_DUMPER                  				406
#define V_FIRETRUCK               				407
#define V_TRASH                   				408
#define V_STRETCH                 				409
#define V_MANANA                  				410
#define V_INFERNUS                				411
#define V_VOODOO                  				412
#define V_PONY                    				413
#define V_MULE                    				414
#define V_CHEETAH                 				415
#define V_AMBULAN                 				416
#define V_LEVIATHN                				417
#define V_MOONBEAM                				418
#define V_ESPERANT                				419
#define V_TAXI                    				420
#define V_WASHING                 				421
#define V_BOBCAT                  				422
#define V_MRWHOOP                 				423
#define V_BFINJECT                				424
#define V_HUNTER                  				425
#define V_PREMIUR                 				426
#define V_ENFORCER                				427
#define V_SECURICA                				428
#define V_BANSHEE                 				429
#define V_PREDATOR                				430
#define V_BUS                     				431
#define V_RHINO                   				432
#define V_BARRACKS                				433
#define V_HOTKNIFE                				434
#define V_ARTICT1                 				435
#define V_PREVION                 				436
#define V_COACH                   				437
#define V_CABBIE                  				438
#define V_STALLION               				439
#define V_RUMPO                   				440
#define V_RCBANDIT                				441
#define V_ROMERO                  				442
#define V_PACKER                  				443
#define V_MONSTER                 				444
#define V_ADMIRAL                 				445
#define V_SQUALO                  				446
#define V_SEASPAR                 				447
#define V_PIZZABOY                				448
#define V_TRAM                    				449
#define V_ARTICT2                 				450
#define V_TURISMO                 				451
#define V_SPEEDER                 				452
#define V_REEFER                  				453
#define V_TROPIC                  				454
#define V_FLATBED                 				455
#define V_YANKEE                  				456
#define V_CADDY                   				457
#define V_SOLAIR                  				458
#define V_TOPFUN                  				459
#define V_SKIMMER                 				460
#define V_PCJ600                  				461
#define V_FAGGIO                  				462
#define V_FREEWAY                 				463
#define V_RCBARON                 				464
#define V_RCRAIDER                				465
#define V_GLENDALE                				466
#define V_OCEANIC                 				467
#define V_SANCHEZ                 				468
#define V_SPARROW                 				469
#define V_PATRIOT                 				470
#define V_QUAD                    				471
#define V_COASTG                  				472
#define V_DINGHY                  				473
#define V_HERMES                  				474
#define V_SABRE                   				475
#define V_RUSTLER                 				476
#define V_ZR350                   				477
#define V_WALTON                  				478
#define V_REGINA                  				479
#define V_COMET                   				480
#define V_BMX                     				481
#define V_BURRITO                 				482
#define V_CAMPER                  				483
#define V_MARQUIS                 				484
#define V_BAGGAGE                 				485
#define V_DOZER                   				486
#define V_MAVERICK                				487
#define V_VCNMAV                  				488
#define V_RANCHER                 				489
#define V_FBIRANCH                				490
#define V_VIRGO                   				491
#define V_GREENWOO                				492
#define V_JETMAX                  				493
#define V_HOTRING                 				494
#define V_SANDKING                				495
#define V_BLISTAC                 				496
#define V_POLMAV                  				497
#define V_BOXVILLE                				498
#define V_BENSON                  				499
#define V_MESA                    				500
#define V_RCGOBLIN                				501
#define V_HOTRINA                 				502
#define V_HOTRINB                 				503
#define V_BLOODRA                 				504
#define V_RNCHLURE                				505
#define V_SUPERGT                 				506
#define V_ELEGANT                 				507
#define V_JOURNEY                 				508
#define V_BIKE                    				509
#define V_MTBIKE                  				510
#define V_BEAGLE                  				511
#define V_CROPDUST                				512
#define V_STUNT                   				513
#define V_PETRO                   				514
#define V_RDTRAIN                 				515
#define V_NEBULA                  				516
#define V_MAJESTIC                				517
#define V_BUCCANEE                				518
#define V_SHAMAL                  				519
#define V_HYDRA                   				520
#define V_FCR500                  				521
#define V_NRG500                  				522
#define V_COPBIKE                 				523
#define V_CEMENT                  				524
#define V_TOWTRUCK                				525
#define V_FORTUNE                 				526
#define V_CADRONA                 				527
#define V_FBITRUCK                				528
#define V_WILLARD                 				529
#define V_FORKLIFT                				530
#define V_TRACTOR                 				531
#define V_COMBINE                 				532
#define V_FELTZER                 				533
#define V_REMINGTN                				534
#define V_SLAMVAN                 				535
#define V_BLADE                   				536
#define V_FREIGHT                 				537
#define V_STREAK                  				538
#define V_VORTEX                  				539
#define V_VINCENT                 				540
#define V_BULLET                  				541
#define V_CLOVER                  				542
#define V_SADLER                  				543
#define V_FIRELA                 				544
#define V_HUSTLER                 				545
#define V_INTRUDER                				546
#define V_PRIMO                   				547
#define V_CARGOBOB                				548
#define V_TAMPA                   				549
#define V_SUNRISE                 				550
#define V_MERIT                   				551
#define V_UTILITY                 				552
#define V_NEVADA                  				553
#define V_YOSEMITE                				554
#define V_WINDSOR                 				555
#define V_MONSTERA                				556
#define V_MONSTERB                				557
#define V_URANUS                  				558
#define V_JESTER                  				559
#define V_SULTAN                  				560
#define V_STRATUM                 				561
#define V_ELEGY                   				562
#define V_RAINDANC                				563
#define V_RCTIGER                 				564
#define V_FLASH                   				565
#define V_TAHOMA                  				566
#define V_SAVANNA                 				567
#define V_BANDITO                 				568
#define V_FREIFLAT                				569
#define V_STREAKC                 				570
#define V_KART                    				571
#define V_MOWER                   				572
#define V_DUNERID                 				573
#define V_SWEEPER                 				574
#define V_BROADWAY                				575
#define V_TORNADO                 				576
#define V_AT400                   				577
#define V_DFT30                   				578
#define V_HUNTLEY                 				579
#define V_STAFFORD                				580
#define V_BF400                   				581
#define V_NEWSVAN                 				582
#define V_TUG                     				583
#define V_PETROTR                 				584
#define V_EMPEROR                 				585
#define V_WAYFARER                				586
#define V_EUROS                   				587
#define V_HOTDOG                  				588
#define V_CLUB                    				589
#define V_FREIBOX                 				590
#define V_ARTICT3                 				591
#define V_ANDROM                  				592
#define V_DODO                    				593
#define V_RCCAM                   				594
#define V_LAUNCH                  				595
#define V_COPCARLA                				596
#define V_COPCARSF                				597
#define V_COPCARVG                				598
#define V_COPCARRU                				599
#define V_PICADOR                 				600
#define V_SWATVAN                 				601
#define V_ALPHA                   				602
#define V_PHOENIX                 				603
#define V_GLENSHIT                				604
#define V_SADLSHIT                				605
#define V_BAGBOXA                 				606
#define V_BAGBOXB                 				607
#define V_TUGSTAIR                				608
#define V_BOXBURG                 				609
#define V_FARMTR1                 				610
#define V_UTILTR1                 				611

// --------------------------------------------------
// Global Variables
// --------------------------------------------------

enum MAPZONE_MAIN {
	MAPZONE_NAME[28],
	Float:MAPZONE_AREA[6]
}

new zones[][MAPZONE_MAIN] = {
//	NAME                            AREA (Xmin,Ymin,Zmin,Xmax,Ymax,Zmax)
	{"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 Estate",  {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}},
	{"The 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}},
	// Main 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}}
};
#pragma unused zones

enum INTERIOR_INFO{
	INTERIOR_ID,
	Float:INTERIOD_SX,
	Float:INTERIOR_MINX,
	Float:INTERIOR_MAXX,
	Float:INTERIOR_SY,
	Float:INTERIOR_MINY,
	Float:INTERIOR_MAXY,
	Float:INTERIOR_SZ,
	Float:INTERIOR_MINZ,
	Float:INTERIOR_MAXZ,
	Float:INTERIOR_SA,
	INTERIOR_NAME[64]
}

new interiors[][INTERIOR_INFO] = {
	{0,			0.0,0.0,0.0,					0.0,0.0,0.0,						0.0,0.0,0.0,						0.0,		""},
	//247's
	{17, 	 -25.884499,-35.0952,-3.3979, 	 	 -185.868988,-188.7431,-167.9059, 	 1003.549988,1002.5469,1008.7656, 	 0.000,		"24/7"},
	{10, 	 6.091180,-13.1705,10.8973, 		 -29.271898,-32.5796,-73.7699,	 	 1003.549988,1002.5494,1008.8979, 	 0.000,		"24/7"},
	{18, 	 -30.946699,-39.2296,-12.9542, 		 -89.609596,-92.6993,-73.7699,	 	 1003.549988,1002.5469,1008.9487, 	 0.000,		"24/7"},
	{16, 	 -25.132599,-39.1961,-14.0429, 	     -139.066986,-142.2416,-122.4566, 	 1003.549988,1002.5469,1008.3311, 	 0.000,		"24/7"},
	{4, 	 -27.312300,-36.9258,-25.8106, 		 -29.277599,-32.1881,-1.8185,	 	 1003.549988,1002.5573,1009.0845, 	 0.000,		"24/7"},
	{6, 	 -26.691599,-37.4347,-16.2656, 		 -55.714897,-58.9940,-48.4956,	 	 1003.549988,1002.5469,1008.7020, 	 0.000,		"24/7"},
	//Airport's/Aeroplanes
	{14, 	 -1827.147338,-2002.2133,-1718.3214, 7.207418,-65.7420,114.2523,	 	 1061.143554,1055.1436,1066.1436,	 0.000,		"Francis International Airport"},
	{1, 	 2.384830,-1.4275,4.0257, 			 33.103397,21.5928,35.7774,	 		 1199.849976,1198.5938,1204.0946,	 0.000,		"A Shamal"},
	{9, 	 315.856170,310.4739,321.0128, 		 1024.496459,971.1845,1039.4181, 	 1949.797363,1942.8815,1966.1064,	 0.000,		"A Andromeda"},
	//Ammunations
	{1, 	 286.148987,283.0005,301.2157, 		 -40.644398,-42.6472,-1.4354, 		 1001.569946,1000.5156,1006.5156,	 315.000,	"Ammunation"},
	{4, 	 286.800995,282.8332,332.1738, 		 -82.547600,-91.2557,-55.4272, 		 1001.539978,1000.5156,1006.9922,	 315.000,	"Ammunation"},
	{6, 	 296.919983,283.0418,299.4285, 		 -108.071999,-116.2635,-101.6424, 	 1001.569946,1000.5156,1006.5078,	 90.000,	"Ammunation"},
	{7, 	 314.820984,267.7444,318.3778, 		 -141.431992,-145.6805,-124.8552, 	 999.661987,998.6083,1008.8906,		 45.000,	"Ammunation"},
	{6, 	 316.524994,269.9506,320.3639, 		 -167.706985,-171.2541,-157.4279, 	 999.661987,998.5938,1005.0609,		 45.000,	"Ammunation"},
	//Burglary Houses
	{3, 	 235.508994,218.4460,246.8138, 		 1189.169897,1185.7623,1213.8395, 	 1080.339966,1079.2578,1089.7813,	 0.000,		"A House"},
	{2, 	 225.756989,216.5522,235.7148, 		 1240.000000,1237.0811,1255.2098, 	 1082.149902,1081.1406,1086.6406,	 90.000,	"A House"},
	{1, 	 223.043991,215.3478,234.8832, 		 1289.259888,1282.2054,1294.9760, 	 1082.199951,1081.1406,1086.1406,	 0.000,		"A House"},
	{7, 	 225.630997,222.8882,255.9689, 		 1022.479980,1016.5048,1052.1018, 	 1084.069946,1082.8125,1092.3047,	 0.000,		"A House"},
	{15, 	 295.138977,282.9257,307.5086, 		 1474.469971,1470.0725,1491.2295, 	 1080.519897,1079.2578,1084.8047,	 0.000,		"A House"},
	{15, 	 328.493988,318.4674,337.6630, 		 1480.589966,1469.8763,1492.8041, 	 1084.449951,1083.4375,1088.4379,	 0.000,		"A House"},
	{15, 	 385.803986,369.8986,391.1570, 		 1471.769897,1450.6768,1473.9808, 	 1080.209961,1079.1875,1084.3984,	 90.000,	"A House"},
	{15, 	 375.971985,354.5016,381.1810, 		 1417.269897,1407.1798,1433.9547, 	 1081.409912,1080.3281,1085.2738,	 90.000,	"A House"},
	{2, 	 490.810974,474.3922,502.8857, 		 1401.489990,1397.5024,1424.8313, 	 1080.339966,1079.2645,1089.7813,	 0.000,		"A House"},
	{2, 	 447.734985,434.3427,460.3860, 		 1400.439941,1393.1072,1421.1198, 	 1084.339966,1083.3120,1089.2966,	 0.000,		"A House"},
	{5, 	 227.722992,224.2079,250.7603, 		 1114.389893,1104.4031,1122.6886, 	 1081.189941,1079.9922,1089.0071,	 270.000,	"A House"},
	{4, 	 260.983978,248.2458,269.4295, 		 1286.549927,1280.3994,1297.1023, 	 1080.299927,1079.2578,1084.2578,	 0.000,		"A House"},
	{4, 	 221.666992,216.5254,230.3692, 		 1143.389893,1139.0764,1161.1541, 	 1082.679932,1081.6094,1086.5781,	 0.000,		"A House"},
	{10, 	 27.132700,17.0703,37.3015, 		 1341.149902,1334.6843,1354.1284, 	 1084.449951,1083.3750,1093.8750,	 0.000,		"A House"},
	{4, 	 -262.601990,-281.3279,-255.0091, 	 1456.619995,1445.6505,1464.0410, 	 1084.449951,1083.3672,1091.8750,	 90.000,	"A House"},
	{5, 	 22.778299,13.9406,34.6132, 		 1404.959961,1395.5353,1420.3214, 	 1084.449951,1083.4297,1089.4297,	 0.000,		"A House"},
	{5, 	 140.278000,133.3888,155.1858, 		 1368.979980,1364.83196,1388.4816, 	 1083.969971,1082.8646,1093.3672,	 0.000,		"A House"},
	{6, 	 234.045990,218.2290,249.8347, 		 1064.879883,1062.5000,1088.6488, 	 1084.309937,1083.2106,1091.6094,	 0.000,		"A House"},
	{6, 	 -68.294098,-73.5360,-55.0049, 		 1353.469971,1345.4100,1368.8204, 	 1080.279907,1079.2109,1085.2109,	 0.000,		"A House"},
	{15, 	 -285.548981,-302.5614,-277.7969, 	 1470.979980,1468.1730,1482.1398, 	 1084.449951,1083.3750,1093.8750,	 0.000,		"A House"},
	{8, 	 -42.581997,-53.8233,-33.4177, 		 1408.109985,1389.9181,1414.0795, 	 1084.449951,1083.4297,1089.4297,	 0.000,		"A House"},
	{9, 	 83.345093,73.920,97.4875, 			 1324.439941,1314.4618,1347.3900, 	 1083.889893,1082.8594,1093.3672,	 0.000,		"A House"},
	{9, 	 260.941986,250.8725,266.8128, 		 1238.509888,1233.7965,1257.9093, 	 1084.259888,1083.2578,1088.2734,	 0.000,		"A House"},
	//Business's
	{3, 	 1038.509888,1037.3038,1041.8345,	 -0.663752,1.0347,11.2171, 	 		 1001.089966,1000.2845,1006.2845,	 0.000,		"Blastin' Fools Records"},
	{12, 	 446.622986,442.4903,458.4054,		 509.318970,505.6406,517.0414, 	 	 1001.419983,1000.4195,1006.4195,	 0.000,		"The Budget Inn Motel"},
	{15, 	 2216.339844,2178.7632,2255.6553,	 -1150.509888,-1202.9016,-1136.2014, 1025.799927,1024.7969,1038.6178,	 0.000,		"The Jefferson Motel"},
	{3, 	 833.818970,818.0212,834.9809,		 7.418000,-1.5486,13.3580,			 1004.179993,1003.1870,1010.4828,	 90.000,	"The Off track Betting"},
	{3, 	 -100.325996,-117.9237,-97.8847,	 -22.816500,-29.8268,-6.3720,		 1000.741943,999.7188,1005.7188,	 45.000,	"The Sex Shop"},
	{1, 	 964.376953,931.3280,966.7448,		 2157.329834,2094.7502,2179.0835,	 1011.019958,1010.0303,1020.0259,	 180.000,	"The Sindacco Meat Processing Plant"},
	{6, 	 -2239.569824,-2242.0911,-2217.3230, 130.020996,126.5612,139.0298,		 1035.419922,1034.4141,1040.3204,	 90.000,	"Zero's RC Shop"},
	//Car Mod Shops
	{1, 	 614.581420,602.3553,637.2819,		 -23.066856,-28.5506,10.2388,		 1004.781250,994.8694,1014.7771,	 0.000,		"Transfenders"},
	{2, 	 620.420410,608.1679,625.8292,		 -72.015701,-83.6601,-68.8194,		 997.992187,993.5744,1002.9953,		 180.000,	"Loco Low Co."},
	{3, 	 612.508605,608.0199,625.3347,		 -129.236114,-132.7094,-117.6847,	 997.992187,993.3466,1002.9953,		 315.000,	"Wheel's Arch Angels"},
	{1, 	 -2048.605957,-2057.7175,-2038.8625, 162.093444,150.0913,182.0321,		 28.835937,27.8359,33.8359,			 0.000,		"CJ's Garage"},
	//Casino's
	{10, 	 2015.4500,1924.1576,2020.0708,		 1017.0900,967.2367,1068.4240,		 996.8750,991.4688,997.8741,		 90.000,	"The Four Dragons"},
	{1, 	 2233.9099,2134.8252,2292.7944,		 1710.7300,1556.5646,1714.9104,		 1011.2987,1005.1860,1013.2435,		 180.000,	"Calligula's"},
	//Casino Oditties
	{10, 	 1889.975,1886.0958,1900.8591,		 1018.055,1010.7878,1027.1942,		 31.88281,30.8828,36.8828,			 270.000,	"The Janitors Office"},
	{1, 	 -2158.719971,-2173.0259,-2156.4658, 641.287964,633.6885,648.6263,		 1052.369995,1051.3817,1062.6328,	 90.000,	"Woozie's Office"},
	{12, 	 1133.069946,1116.3666,1144.5529, 	 -9.573059,-17.0111,14.3073,		 1000.750000,999.6797,1007.4844,	 0.000,		"Redsands West Casino"},
	//Clothing Stores
	{15, 	 207.737991,198.4293,219.9531,	 	 -109.019997,-115.1267,-93.4263,	 1005.269958,1004.1328,1010.0625,	 0.000,		"Binco"},
	{14, 	 204.332993,194.9293,218.6813,	 	 -166.694992,-172.8813,-149.9782,	 1000.578979,999.5234,1005.9531,	 0.000,		"Didier Sachs"},
	{3, 	 207.054993,194.5785,217.7405,	 	 -138.804993,-144.9519,-117.3412,	 1003.519958,1001.8672,1008.9063,	 0.000,		"ProLaps"},
	{1, 	 203.778000,194.774,217.3534,	 	 -48.492397,-54.0761,-30.7443,		 1001.799988,1000.8047,1009.1484,	 0.000,		"SubUrban"},
	{5, 	 226.293991,198.4532,243.0808,	 	 -7.431530,-14.1564,5.4119,			 1002.259949,1000.2109,1010.2041,	 90.000,	"Victim"},
	{18, 	 161.391006,138.4255,184.3445,	 	 -93.159156,-101.6389,-68.2857,		 1001.804687,1000.8047,1006.8047,	 0.000,		"Zip"},
	//Bars and Clubs
	{17, 	 493.390991,472.5995,508.7181,	 	 -22.722799,-30.7876,1.0150,		 1000.686951,999.6797,1008.4766,	 0.000,		"The Dance Club"},
	{11, 	 501.980988,481.7581,513.3429,	 	 -69.150200,-90.4746,-63.5646,		 998.834961,997.7578,1004.0396,	 	180.000,	"Shithole Bar"},
	{18, 	 -227.028000,-234.1513,-215.6965, 	 1401.229980,1392.4974,1413.4426,	 27.769798,26.7656,31.7664,	 		315.000,	"Lil' Probe Inn"},
	//Eateries
	{4, 	 460.099976,432.5477,461.3923,	 	 -88.428497,-93.2540,-77.9551,	 	 999.621948,998.5547,1001.3094,	 	90.000,		"Jay's Diner"},
	{1, 	 452.489990,421.2953,462.4027,	 	 -18.179699,-24.0791,-2.8813,	 	 1001.179993,998.5547,1005.7344, 	45.000,		"World of Coq"},
	{1, 	 681.474976,648.5388,696.2054,	 	 -451.150970,-479.4601,-447.5847,	 -25.616798,-26.6172,-20.5000, 		180.000,	"The Pump Truck Stop Diner"},
	//Fast Food
	{10, 	 366.923980,360.0641,384.3123,	 	 -72.929359,-79.3703,-54.7400,		 1001.507812,1000.5078,1006.5078,	315.000,	"Burger Shot"},
	{9, 	 365.672974,357.4411,382.6818,	 	 -10.713200,-16.0313,-1.1104,		 1001.869995,1000.8516,1006.7109,	315.000,	"Cluckin' Bell"},
	{5, 	 372.351990,361.2697,382.0142,	 	 -131.650986,-139.1448,-110.8535,	 1001.449951,1000.4922,1006.3750,	0.000,		"Well Stacked Pizza"},
	{17, 	 377.098999,371.0922,383.7513,	 	 -192.439987,-197.2665,-176.7235,	 1000.643982,999.6328,1005.9063,	0.000,		"Rusty Brown's Donuts"},
	//Girlfriends
	{1, 	 244.411987,242.6040,250.9420,	 	 305.032990,299.1326,308.5615,	 	 999.231995,998.1484,1004.1484,		235.000,	"Denise Robinson's Bedroom"},
	{2, 	 271.884979,260.7130,275.1632,	 	 306.631989,301.2459,314.6459,	 	 999.325989,998.1484,1004.1484,		90.000,		"Katie Zhan's Bedroom"},
	{3, 	 291.282990,273.4854,294.9203,	 	 310.031982,303.1938,311.9318,	 	 999.154968,998.1484,1008.1707,		90.000,		"Helena Wankstein's Bedroom"},
	{4, 	 302.181000,290.5057,312.3436,	 	 300.722992,299.3310,315.7108,	 	 999.231995,998.1484,1010.3047,		0.000,		"Michelle Cannes's Bedroom"},
	{5, 	 322.197998,315.3055,329.5608,	 	 302.497986,300.6566,319.1491,	 	 999.231995,998.1484,1004.1484,		0.000,		"Barbara Schternvart Bedroom"},
	{6, 	 346.870025,337.3706,350.82888,	 	 309.259033,293.5629,312.0173,	 	 999.155700,998.1557,1004.6484,		180.000,	"Millie Perkins's Bedroom"},
	//Government
	{17, 	 -959.873962,-963.0861,-937.1068, 	 1952.000000,1845.0483,1955.3293, 	 9.044310,4.0000,11.1285,			180.000,	"The Sherman Dam"},
	{3, 	 388.871979,317.4452,393.2694, 		 173.804993,143.0736,218.9381,	 	 1008.389954,1007.3828,1030.7865,	90.000,		"The Planning Department"},
	//Gyms
	{5, 	 772.112000,754.4421,775.7951, 		 -3.898650,-10.5017,17.2873,	 	 1000.687988,999.7142,1006.1831,	0.000,		"The Ganton Gym"},
	{6, 	 774.213989,752.4792,778.8328, 		 -48.924297,-51.4411,-15.6279,	 	 1000.687988,999.6865,1005.6865,	0.000,		"The Cobra Gym"},
	{7, 	 773.579956,755.9409,777.9979, 		 -77.096695,-84.0618,-56.7409,	 	 1000.687988,999.6550,1006.6035,	0.000,		"Below The Belt Gym"},
	{5, 	 1234.144409,1223.2540,1307.4205,	 -764.087158,-840.5399,-751.1873,	 1084.007202,1083.0112,1098.9777,	0.000,		"Madd Dogg's Mansion"},
	//Homies
	{3, 	 1527.229980,1520.1871,1533.7594,	 -11.574499,-22.5846,0.9635,		 1002.269958,1001.0971,1007.0971,	0.000,		"B-Dups Apartment"},
	{2, 	 1523.509888,1514.2607,1529.2543,	 -47.821198,-57.1333,-39.9799,		 1002.269958,1001.1310,1007.1310,	0.000,		"B-Dups Crack Pad"},
	{3, 	 2496.049805,2484.0408,2507.7002,	 -1693.929932,-1723.0533,-1681.0842, 1014.750000,1013.7422,1023.0469,	180.000,	"Carl's Mums House"},
	{3, 	 516.650,509.0578,522.8345,			 -18.611898,-21.6408,-1.4064,		 1001.459961,1000.5653,1006.5653,	0.000,		"OG Loc's"},
	{2, 	 2464.109863,2445.9775,2499.0967,	 -1698.659912,-1707.8545,-1683.5922, 1013.509949,1012.5078,1018.0781,	90.000,		"Ryder's House"},
	{1, 	 2526.459961,2523.0020,2544.5212,	 -1679.089966,-1700.5044,-1665.8083, 1015.500000,1014.4986,1020.2162,	270.000,	"Sweet's House"},
	{2, 	 2543.659912,2512.0249,2584.8528,	 -1303.629883,-1309.0903,-1252.9098, 1025.069946,1024.0703,1072.4879,	180.000,	"Big Smokes Crack Palace"},
	//Ill
	{3, 	 1212.019897,1198.2898,1218.5905,	 -28.663099,-52.8367,-20.5241,		 1001.089966,999.9531,1004.8786,	180.000,	"The Big Spread Ranch"},
	{6, 	 744.542969,723.2429,768.1766,		 1437.669922,1432.5469,1445.0240,	 1102.739990,1101.7031,1108.9531,	290.000,	"Fanny Batter's Whore House"},
	{2, 	 1204.809937,1194.8103,1226.1428,	 -11.586800,-18.0913,30.6912,		 1001.089966,999.9219,1005.6573,	0.000,		"The World Class Topless Girls Stripclub"},
	{3, 	 940.921997,929.9674,976.1741,		 -17.007000,-19.9913,9.3195,		 1001.179993,1000.1484,1006.1484,	0.000,		"The Unnamed Brothel"},
	{3, 	 964.106995,940.3059,973.8075,		 -53.205498,-64.5014,-41.2514,		 1001.179993,1000.1246,1005.6172,	90.000,		"The Tiger Skin Rug Brothel"},
	{3, 	 -2637.449951,-2697.5955,-2629.8840, 1404.629883,1387.2095,1440.4742,	 906.457947,905.2734,929.2964,		90.000,		"Jizzy's Pleasure Dome"},
	//Liberty City
	{1, 	 -735.5619504,-950.1764,-687.3923, 	 484.351318,407.1057,570.3076,	 	 1371.952270,1345.8750,1382.6106,	40.000,		"Liberty City"},
	//Misc
	{5, 	 2350.339844,2317.3586,2363.4382, 	 -1181.649902,-1190.5747,-1166.1172, 1028.000000,1026.9766,1036.5497,	90.000,		"Los Vagos Gang House"},
	{8, 	 2807.619873,2802.5732,2830.6768, 	 -1171.899902,-1178.5010,-1155.1534, 1025.579956,1024.5703,1033.8438,	0.000,		"Colonel Furburgher's House"},
	{5, 	 318.564972,296.9617,340.9560, 		 1118.209961,1110.0925,1138.4672, 	 1083.979980,1082.8828,1088.1328,	0.000,		"The Crack Den"},
	{1, 	 1412.639893,1357.7148,1420.5383,	 -1.787510,-49.7140,8.5148,		 	 1000.931946,999.9090,1008.8919,	135.000,	"A Warehouse"},
	{18, 	 1302.519897,1247.7485,1310.9150,	 -1.787510,-69.8208,8.3288,		 	 1000.931946,1000.0156,1009.3984,	135.000,	"A Warehouse"},
	{12, 	 2324.419922,2306.6470,2342.1313,	 -1147.539917,-1153.7253,-1133.4342, 1050.719971,1049.7101,1058.3047,	0.000,		"A Safehouse"},
	{10, 	 -972.4957,-1138.3977,-966.8146,	 1060.983,1017.8578,1101.4760,		 1345.669,1342.0522,1359.9141,		90.000,		"The RC Battlefield"},
	//Personal Grooming
	{2, 	 411.625977,405.8927,421.6737,		 -21.433298,-32.3224,-7.9695,		 1001.799988,1000.8047,1007.0781,	315.000,	"Old Reece's Hair and Facial Studio"},
	{3, 	 418.652985,415.0480,425.6317,		 -82.639793,-92.8154,-72.3608,		 1001.959961,1000.8047,1007.5787,	0.000,		"Gay Gordo's Barber Shop"},
	{12, 	 412.021973,402.0862,417.4446,		 -52.649899,-58.2201,-46.4752,		 1001.959961,1000.8984,1007.0547,	270.000,	"Mascila's Unisex Hair Salon"},
	{16, 	 -204.439987,-211.5356,-198.4321,	 -26.453999,-38.5390,-13.2776,		 1002.299988,1001.2734,1006.4949,	315.000,	"A Tattoo Parlour"},
	{17, 	 -204.439987,-210.7206,-194.0416,	 -8.469600,-30.7664,-2.5236,		 1002.299988,1001.2734,1006.4949,	315.000,	"Hemlock's Tattoo Parlour"},
	{3, 	 -204.439987,-211.3637,-193.4146,	 -43.652496,-53.1130,-37.8452,		 1002.299988,1001.2734,1006.4949,	315.000,	"A Tattoo Parlour"},
	//Police Departments
	{6, 	 246.783997,207.5004,277.7479,		 63.900200,61.7018,93.1880,			 1003.639954,1000.0391,1009.7142,	0.000,		"The Los Santos Police Department"},
	{10, 	 246.375992,212.2758,284.0999,		 109.245995,97.0497,130.4608,		 1003.279968,998.0156,1015.2188,	0.000,		"The San Fierro Police Department"},
	{3, 	 288.745972,186.4745,308.3648,		 169.350998,132.3377,204.9915,		 1007.179993,1002.0234,1013.1874,	0.000,		"The Las Venturas Police Department"},
	//Schools
	{3, 	 1494.429932,1487.0275,1503.6758,	 1305.629883,1279.1096,1315.6984,	 1093.289917,1092.2899,1098.2899,	90.000,		"Cycle School"},
	{3, 	 -2029.719971,-2037.1293,-2020.4810, -115.067993,-139.5002,-98.2041,	 1035.169922,1034.1719,1039.7968,	90.000,		"Automobile School"},
	{10, 	 420.484985,400.9158,460.9158,		 2535.589844,2533.2849,2547.9688,	 10.020289,9.0000,14.9063,			45.000,		"Plane School"}
};
#pragma unused interiors

enum VEHICLE_INFO{
	VNAME[32],
	VPRICE,
	VSPEED,
	VTYPE
}

new vehicles[212][VEHICLE_INFO] = {
	{"Landstalker",3000,160,4},
	{"Bravura",2000,160,4},
	{"Buffalo",1500,200,4},
	{"Linerunner",2000,120,4},
	{"Pereniel",500,150,4},
	{"Sentinel",1000,165,4},
	{"Dumper",5000,110,6},
	{"Firetruck",0,170,4},
	{"Trashmaster",0,110,9},
	{"Stretch",6000,180,4},
	{"Manana",5000,160,4},
	{"Infernus",6000,240,4},
	{"Voodoo",3000,160,4},
	{"Pony",1500,160,4},
	{"Mule",500,140,9},
	{"Cheetah",5000,230,4},
	{"Ambulance",0,155,4},
	{"Leviathan",8000,200,5},
	{"Moonbeam",1500,150,4},
	{"Esperanto",2000,160,4},
	{"Taxi",0,180,4},
	{"Washington",2000,180,4},
	{"Bobcat",1500,165,4},
	{"Mr Whoopee",500,145,4},
	{"BF Injection",2500,170,4},
	{"Hunter",0,200,5},
	{"Premier",1500,200,4},
	{"Enforcer",2000,170,4},
	{"Securicar",2000,170,4},
	{"Banshee",1500,200,4},
	{"Predator",2000,190,3},
	{"Bus",0,130,4},
	{"Rhino",0,80,9},
	{"Barracks",0,180,9},
	{"Hotknife",1500,200,4},
	{"Trailer",0,120,0},
	{"Previon",2000,160,4},
	{"Coach",0,160,9},
	{"Cabbie",0,160,4},
	{"Stallion",2000,160,4},
	{"Rumpo",1500,160,4},
	{"RC Bandit",0,75,4},
	{"Romero",1500,150,4},
	{"Packer",1500,150,9},
	{"Monster",4000,110,6},
	{"Admiral",2000,165,4},
	{"Squalo",1500,280,3},
	{"Seasparrow",4000,200,5},
	{"Pizzaboy",0,190,1},
	{"Tram",0,150,0},
	{"Trailer",0,120,0},
	{"Turismo",5000,240,4},
	{"Speeder",0,190,3},
	{"Reefer",0,190,3},
	{"Tropic",0,190,3},
	{"Flatbed",3500,140,4},
	{"Yankee",2000,160,4},
	{"Caddy",1500,160,4},
	{"Solair",2000,165,4},
	{"Berkley's RC Van",0,160,4},
	{"Skimmer",1500,200,7},
	{"PCJ-600",2000,190,1},
	{"Faggio",250,190,1},
	{"Freeway",2500,190,1},
	{"RC Baron",0,75,7},
	{"RC Raider",0,75,5},
	{"Glendale",2500,160,4},
	{"Oceanic",2500,160,4},
	{"Sanchez",1500,190,1},
	{"Sparrow",2500,200,5},
	{"Patriot",3500,170,9},
	{"Quad",1250,160,8},
	{"Coastguard",5000,190,3},
	{"Dinghy",0,190,3},
	{"Hermes",2000,160,4},
	{"Sabre",2500,160,4},
	{"Rustler",4000,200,7},
	{"ZR3 50",3000,200,4},
	{"Walton",1000,150,4},
	{"Regina",1500,165,4},
	{"Comet",2500,200,4},
	{"BMX",50,120,2},
	{"Burrito",250,150,4},
	{"Camper",300,120,4},
	{"Marquis",1000,190,3},
	{"Baggage",900,160,4},
	{"Dozer",1500,100,4},
	{"Maverick",2000,200,5},
	{"News Chopper",2250,200,5},
	{"Rancher",2000,170,4},
	{"FBI Rancher",0,170,4},
	{"Virgo",2000,160,4},
	{"Greenwood",1500,160,4},
	{"Jetmax",0,190,3},
	{"Hotring",3500,220,4},
	{"Sandking",1500,170,4},
	{"Blista Compact",1000,200,4},
	{"Police Maverick",0,200,5},
	{"Boxville",1000,140,4},
	{"Benson",1500,140,4},
	{"Mesa",2000,160,4},
	{"RC Goblin",0,75,5},
	{"Hotring Racer",3500,220,4},
	{"Hotring Racer",3500,220,4},
	{"Bloodring Banger",4000,160,4},
	{"Rancher",3000,170,4},
	{"Super GT",5000,230,4},
	{"Elegant",2000,165,4},
	{"Journey",1500,140,4},
	{"Bike",20,120,2},
	{"Mountain Bike",60,140,2},
	{"Beagle",1000,200,7},
	{"Cropdust",1500,200,7},
	{"Stunt",3000,200,7},
	{"Tanker",4000,120,4},
	{"RoadTrain",4500,120,4},
	{"Nebula",1000,165,4},
	{"Majestic",1500,165,4},
	{"Buccaneer",2000,160,4},
	{"Shamal",3000,330,7},
	{"Hydra",9000,330,7},
	{"FCR-900",3000,190,1},
	{"NRG-500",3500,190,1},
	{"HPV1000",1500,190,1},
	{"Cement Truck",2000,110,4},
	{"Tow Truck",2000,160,9},
	{"Fortune",2000,160,4},
	{"Cadrona",2000,160,4},
	{"FBI Truck",0,170,4},
	{"Willard",1500,160,4},
	{"Forklift",750,60,4},
	{"Tractor",500,70,9},
	{"Combine",1500,140,9},
	{"Feltzer",2000,200,4},
	{"Remington",2500,160,4},
	{"Slamvan",2500,160,4},
	{"Blade",2000,160,4},
	{"Freight",2500,110,0},
	{"Streak",2000,110,0},
	{"Vortex",2000,150,7},
	{"Vincent",1000,160,4},
	{"Bullet",4000,230,4},
	{"Clover",2500,160,4},
	{"Sadler",1500,165,4},
	{"Firetruck",0,170,4},
	{"Hustler",1500,160,4},
	{"Intruder",2000,160,4},
	{"Primo",1500,160,4},
	{"Cargobob",4000,200,5},
	{"Tampa",2000,160,4},
	{"Sunrise",1500,160,4},
	{"Merit",2000,165,4},
	{"Utility",500,160,4},
	{"Nevada",1500,200,7},
	{"Yosemite",2000,170,4},
	{"Windsor",1500,180,4},
	{"Monster",5000,110,6},
	{"Monster",5000,110,6},
	{"Uranus",2000,200,4},
	{"Jester",3000,200,4},
	{"Sultan",4000,200,4},
	{"Stratum",2000,200,4},
	{"Elegy",1500,200,4},
	{"Raindance",4500,200,5},
	{"RC Tiger",0,75,4},
	{"Flash",1500,200,4},
	{"Tahoma",2000,160,4},
	{"Savanna",2500,160,4},
	{"Bandito",1500,170,4},
	{"Freight",0,110,0},
	{"Trailer",0,110,0},
	{"Kart",250,90,4},
	{"Mower",100,60,4},
	{"Duneride",750,110,6},
	{"Sweeper",150,60,4},
	{"Broadway",1000,160,4},
	{"Tornado",1500,160,4},
	{"AT-400",2000,200,7},
	{"DFT-30",2500,110,4},
	{"Huntley",1500,160,4},
	{"Stafford",2000,165,4},
	{"BF-400",1000,190,1},
	{"Newsvan",1500,160,4},
	{"Tug",0,170,4},
	{"Trailer",0,120,0},
	{"Emperor",2000,165,4},
	{"Wayfarer",2500,190,1},
	{"Euros",1000,200,4},
	{"Hotdog",1000,140,9},
	{"Club",1000,200,4},
	{"Trailer",0,110,0},
	{"Trailer",0,120,0},
	{"Andromada",10000,200,7},
	{"Dodo",4000,200,7},
	{"RC Cam",0,60,4},
	{"Launch",0,190,3},
	{"Police Car (LSPD)",0,200,4},
	{"Police Car (SFPD)",0,200,4},
	{"Police Car (LVPD)",0,200,4},
	{"Police Ranger",0,160,4},
	{"Picador",3000,165,4},
	{"S.W.A.T. Van",0,110,4},
	{"Alpha",2000,200,4},
	{"Phoenix",2500,200,4},
	{"Glendale",2500,160,4},
	{"Sadler",2000,165,4},
	{"Luggage Trailer",0,160,0},
	{"Luggage Trailer",0,160,0},
	{"Stair Trailer",0,160,0},
	{"Boxville",1000,140,4},
	{"Farm Plow",0,160,0},
	{"Utility Trailer",0,160,0}
};
#pragma unused vehicles

enum WEAPON_INFO{
	WEAPON_PRICE,
	WEAPON_SCORE,
	Float:WEAPON_RANGE,
	WEAPON_PICKUP,
	bool:WEAPON_SYNCED,
	bool:WEAPON_AMMU,
	WEAPON_AMMU_COST
}

new weapons[55][WEAPON_INFO] = {
	{0,0,1.6,0,true,false,0},
	{0,0,1.6,0,false,false,0},
	{1,0,1.6,PICKUP_GOLFCLUB,true,false,0},
	{2,0,1.6,PICKUP_NITESTICK,true,false,0},
	{2,0,1.6,PICKUP_KNIFE,true,false,0},
	{3,0,1.6,PICKUP_BAT,true,false,0},
	{4,0,1.6,PICKUP_SHOVEL,true,false,0},
	{5,0,1.6,PICKUP_POOLSTICK,true,false,0},
	{0,0,1.6,0,true,false,0},
	{10,25,1.6,PICKUP_CHAINSAW,true,false,0},
	{1,0,1.6,PICKUP_DILDO,true,false,0},
	{2,0,1.6,PICKUP_VIBRATOR1,true,false,0},
	{2,0,1.6,0,true,false,0},
	{2,0,1.6,0,true,false,0},
	{1,0,1.6,PICKUP_FLOWER,false,false,0},
	{3,0,1.6,PICKUP_CANE,true,false,0},
	{0,0,40.0,0,false,false,0},
	{0,0,40.0,0,false,false,0},
	{0,0,40.0,0,false,false,0},
	{0,0,40.0,0,false,false,0},
	{0,0,40.0,0,false,false,0},
	{0,0,40.0,0,false,false,0},
	{5,0,35.0,PICKUP_COLT45,true,true,200},
	{7,0,35.0,PICKUP_SILENCED,true,true,600},
	{9,50,35.0,PICKUP_DEAGLE,true,true,1200},
	{7,0,40.0,PICKUP_SHOTGUN,true,true,600},
	{9,0,35.0,PICKUP_SAWEDOFF,true,true,800},
	{11,75,40.0,PICKUP_SHOTGSPA,true,true,1200},
	{9,0,35.0,PICKUP_UZI,true,true,0},
	{9,0,35.0,PICKUP_MP5,true,true,1200},
	{11,0,70.0,PICKUP_AK47,true,true,3500},
	{13,125,90.0,PICKUP_TEC9,true,true,0},
	{11,100,35.0,PICKUP_RIFLE,true,false,0},
	{11,150,100.0,0,true,true,4500},
	{0,0,100.0,0,false,false,0},
	{0,0,55.0,0,false,false,0},
	{0,0,55.0,0,false,false,0},
	{13,0,5.1,PICKUP_FLAMETHROWER,true,false,0},
	{15,175,75.0,PICKUP_MINIGUN,true,false,0},
	{0,0,40.0,0,false,false,0},
	{0,0,25.0,0,false,false,0},
	{15,0,6.1,PICKUP_SPRAYCAN,true,false,0},
	{17,200,10.1,PICKUP_FIREEXTINGUISHER,true,false,0},
	{0,0,100.0,0,false,false,0},
	{0,0,100.0,0,false,false,0},
	{0,0,100.0,0,false,false,0},
	{0,0,1.6,0,false,false,0},
	{0,0,0.0,0,false,false,0},
	{0,0,0.0,0,false,false,0},
	{0,0,0.0,0,true,false,0},
	{0,0,0.0,0,false,false,0},
	{0,0,0.0,0,false,false,0},
	{0,0,0.0,0,false,false,0},
	{0,0,0.0,0,false,false,0},
	{0,0,0.0,0,true,false,0}
};
#pragma unused weapons

enum GARAGE_MAIN {
	Float:GARAGE_AREA[6],
	Float:GARAGE_VEHICLE_SPAWN[4],
	GARAGE_DOOR,
	GARAGE_TYPE
}

new garages[][GARAGE_MAIN] = {
//	AREA (Xmin,Ymin,Zmin,Xmax,Ymax,Zmax)                     VEHICLE SPAWN (x,y,z,angle)          DOOR  TYPE

	// Las Venturas
	{{2602.6,1438.84,9.8337,2616.4,1462.11,15.4891},         {2609.5,1450.475,9.8337,180.0},      1,    1},
	{{2389.6,1483.26,9.81843,2398.11,1497.84,15.6841},       {2393.855,1490.55,9.81843,180.0},    5,    5},
	{{2382.28,1044,9.8337,2391.14,1059.73,13.9338},          {2386.71,1051.865,9.8337,180.0},     1,    1},
	{{2449.5,695.018,10.4742,2458.31,700.227,12.9155},       {2453.905,697.6225,10.4742,270.0},   1,    18},
	{{2218.06,2448.06,-8.43807,2234.47,2467.56,-1.5463},     {2226.265,2457.81,-8.43807,90.0},    5,    35},
	{{1550.98,1155.36,8.97329,1621.82,1224.03,29.8005},      {1586.4,1189.695,8.97329,0.0},       4,    44},
	{{2002.96,2303.72,9.61706,2010.36,2317.59,13.9914},      {2006.66,2310.655,9.61706,180.0},    1,    2},
	{{1968.23,2157.88,9.59696,1983.32,2167.03,16.2367},      {1975.775,2162.455,9.59696,270.0},   1,    5},
	{{1408.65,1899.52,10.115,1417.55,1904.91,13.1693},       {1413.1,1902.215,10.115,270.0},      1,    30},
	{{1269.2,2525.14,9.80013,1278.72,2534.49,12.9784},       {1273.96,2529.815,9.80013,90.0},     1,    27},
	{{929.554,2008.59,10.115,938.452,2013.99,13.1693},       {934.003,2011.29,10.115,270.0},      1,    28},

	// San Fierro
	{{-1694.78,1033.15,44.1937,-1681.59,1038.16,47.941},     {-1688.185,1035.655,44.1937,270.0},  1,    2},
	{{-1794.15,1429.69,4.37321,-1787.18,1441.37,14.3732},    {-1790.665,1435.53,4.37321,180.0},   1,    1},
	{{-2171.43,649.416,49.8742,-2161.79,661.778,58.1902},    {-2166.61,655.597,49.8742,90.0},     3,    1},
	{{-1790.97,1209.71,23.763,-1782.58,1221.46,28.963},      {-1786.775,1215.585,23.763,180.0},   1,    1},
	{{-2108.92,886.553,75.566,-2101.36,896.807,80.166},      {-2105.14,891.68,75.566,0.0},        7,    39},
	{{-1652.78,647.502,0.713446,-1617.92,671.973,-6.04924},  {-1635.35,659.7375,0.713446,0.0},    4,    34},
	{{-2728.53,212.295,3.45112,-2716.36,222.669,8.68705},    {-2722.445,217.482,3.45112,90.0},    1,    5},
	{{-2735.46,60.7331,3.07005,-2725.82,72.8828,7.92155},    {-2730.64,66.80795,3.07005,0.0},     1,    1},
	{{-2454.02,-131.556,25.0886,-2442.38,-113.935,29.8006},  {-2448.2,-122.7455,25.0886,270.0},   1,    42},
	{{-1930.66,239.541,33.4274,-1941.04,251.714,38.6634},    {-1935.85,245.6275,33.4274,180.0},   1,    1},
	{{-1908.93,277.989,40.0413,-1900.11,292.353,45.539},     {-1904.52,285.171,40.0413,180.0},    1,    5},
	{{-2112.48,-21.214,34.303,-2102.48,-11.214,40.303},      {-2107.48,-16.214,34.303,90.0},      1,    1},
	{{-2043.1,118.609,27.821,-2021.91,129.609,32.821},       {-2032.505,124.109,27.821,0.0},      1,    41},
	{{-2057.35,150.803,27.8286,-2038.91,182.876,33.2286},    {-2048.13,166.8395,27.8286,90.0},    1,    1},
	{{-2430.13,1013.71,49.3413,-2421.2,1027.76,55.3413},     {-2425.665,1020.735,49.3413,0.0},    1,    5},
	{{-2699.12,821.489,49.0042,-2692.9,831.208,53.653},      {-2696.01,826.3485,49.0042,180.0},   1,    40},

	// Los Santos
	{{2502.31,-1699.36,12.4323,2508.61,-1691.01,16.5666},    {2505.46,-1695.185,12.4323,0.0},     1,    16},
	{{2056.6,-1835.9,12.5443,2071.3,-1826.97,18.5443},       {2063.95,-1831.435,12.5443,90.0},    1,    5},
	{{1352.58,-636.657,108.135,1359.02,-627.962,113.135},    {1355.8,-632.3095,108.135,18.0},     1,    32},
	{{1640.37,-1520.07,12.5118,1647.6,-1512.45,18.1245},     {1643.985,-1516.26,12.5118,180.0},   5,    1},
	{{1523.92,-1653.23,4.72837,1556.92,-1633.23,12.2284},    {1540.42,-1643.23,4.72837,180.0},    5,    33},
	{{2738.4,-2012.55,12.5759,2743.78,-2004.41,17.8299},     {2741.09,-2008.48,12.5759,0.0},      1,    1},
	{{2640.78,-2049.99,12.543,2648.96,-2039.55,16.206},      {2644.87,-2044.77,12.543,0.0},       1,    1},
	{{1873.97,-2096.55,12.487,1880.88,-2087.62,15.7681},     {1877.425,-2092.085,12.487,180.0},   5,    1},
	{{1843.91,-1858.8,12.3645,1857.1,-1853.79,16.1118},      {1850.505,-1856.295,12.3645,270.0},  1,    2},
	{{1798.82,-2150.67,12.4283,1809.46,-2142.75,16.4347},    {1804.14,-2146.71,12.4283,270.0},    1,    1},
	{{1694.8,-2088.7,12.3636,1703,-2077.48,16.2236},         {1698.9,-2083.09,12.3636,180.0},     5,    31},
	{{491.103,-1747.55,9.45516,492.717,-1746.3,17.565},      {491.91,-1746.925,9.45516,0.0},      1,    5},
	{{319.326,-1768.93,3.35686,325.625,-1759.57,7.49114},    {322.4755,-1764.25,3.35686,180.0},   1,    17},
	{{1038.24,-1025.67,31.1027,1068.35,-995.044,39.1027},    {1053.295,-1010.357,31.1027,180.0},  1,    1},
	{{1021.81,-1029.53,30.9081,1027.93,-1018.71,36.9081},    {1024.87,-1024.12,30.9081,180.0},    1,    5},

	// Country
	{{-103.636,1112.42,18.7017,-96.3613,1125.79,24.5489},    {-99.99865,1119.105,18.7017,180.0},  1,    5},
	{{-364.439,1194.37,18.597,-356.214,1202.97,22.3812},     {-360.3265,1198.67,18.597,180.0},    1,    24},
	{{430.059,2542.31,15.166,442.896,2550.75,19.5951},       {436.4775,2546.53,15.166,270.0},     1,    25},
	{{-397.297,2223.17,41.3824,-389.058,2229.07,44.6359},    {-393.1775,2226.12,41.3824,285.1},   1,    1},
	{{383.843,2433.28,15.166,426.012,2476.13,24.6886},       {404.9275,2454.705,15.166,0.0},      4,    45},
	{{715.806,-462.403,14.9635,724.293,-447.29,21.4398},     {720.0495,-454.8465,14.9635,180.0},  1,    5},
	{{2227.6,168.649,26.4635,2234.93,176.333,29.4635},       {2231.265,172.491,26.4635,180.0},    1,    29},
	{{783.155,-492.75,16.3361,789.029,-485.118,19.3361},     {786.092,-488.934,16.3361,180.0},    1,    26},
	{{-1424.11,2576.61,54.8156,-1416.85,2590.84,60.8747},    {-1420.48,2583.725,54.8156,0.0},     1,    5},
	{{-2114.42,-2462.27,29.4809,-2109.36,-2458.88,32.3474},  {-2110.38,-2462.86,29.4809,48.1},    1,    1}
};
#pragma unused garages

new Float:oysters[50][3] = {
	//X      Y         Z
	{979.0, -2210.0, -3.0},
	{2750.0, -2584.0, -5.0},
	{1279.0, -806.0, 85.0},
	{2945.1299, -2051.9299, -3.0},
	{67.0, -1018.0, -5.0},
	{2327.0, -2662.0, -5.0},
	{2621.0, -2506.0, -5.0},
	{1249.0, -2687.0, -1.0},
	{725.0, -1849.0, -5.0},
	{723.0, -1586.0, -3.0},
	{155.0, -1975.0, -8.0},
	{1968.0, -1203.0, 17.0},
	{-2657.0, 1564.0, -6.0},
	{-1252.0, 501.0, -8.0},
	{-1625.0, 4.0, -10.0},
	{-1484.0, 1489.0, -10.0},
	{-2505.4058, 1543.7236, -22.5553},
	{-2727.0, -469.0, -5.0},
	{-1266.0, 966.0, -10.0},
	{-1013.0, 478.0, -7.0},
	{-1364.0, 390.0, -5.0},
	{2578.0, 2382.0, 16.0},
	{2090.0, 1898.0, 8.0},
	{2130.0, 1152.0, 7.0},
	{2013.0, 1670.0, 7.0},
	{2531.0, 1569.0, 9.0},
	{2998.0, 2998.0, -10.0},
	{-832.0, 925.0, -2.0},
	{486.0, -253.0, -4.0},
	{-90.0, -910.0, -5.0},
	{26.43, -1320.9399, -10.04},
	{-207.0, -1682.0, -8.0},
	{-1672.0, -1641.0, -2.0},
	{-1175.0, -2639.0, -2.5},
	{-1097.0, -2858.0, -8.0},
	{-2889.0, -1042.0, -9.0},
	{-659.0, 874.0, -2.0},
	{-955.0, 2628.0, 35.0},
	{-1066.0, 2197.0, 32.0},
	{40.0, -531.0, -8.0},
	{-765.0, 247.0, -8.0},
	{2098.0, -108.0, -2.0},
	{2767.0, 470.0, -8.0},
	{-783.0, 2116.0, 35.0},
	{-821.0, 1374.0, -8.0},
	{-2110.5, 2329.72, -7.5},
	{-1538.0, 1708.0, -3.27},
	{-2685.0, 2153.0, -5.0},
	{796.0, 2939.0, -5.0},
	{2179.0, 235.0, -5.0}
};
#pragma unused oysters

new Float:horseshoes[50][3] = {
	//X      Y         Z
	{1224.0, 2617.0, 11.0},
	{2323.0, 1284.0, 97.0},
	{2035.0, 2305.0, 18.0},
	{2491.0, 2263.0, 15.0},
	{1433.0, 2796.0, 20.0},
	{2071.0, 712.0, 11.0},
	{2239.0, 1839.0, 18.0},
	{2583.0, 2387.0, 16.0},
	{2864.0, 857.0, 13.0},
	{2612.0, 2200.0, -1.0},
	{2274.0, 1507.0, 24.0},
	{2184.0, 2529.0, 11.0},
	{1863.0, 2314.0, 15.0},
	{2054.0, 2434.0, 166.0},
	{1603.0, 1435.0, 11.0},
	{1362.92, 1015.24, 11.0},
	{2058.7, 2159.1001, 16.0},
	{2003.0, 1672.0, 12.0},
	{2238.0, 1135.0, 49.0},
	{1934.0601, 988.79, 22.0},
	{1768.0, 2847.0, 9.0},
	{1084.0, 1076.0, 11.0},
	{2879.0, 2522.0, 11.0},
	{2371.0, 2009.0, 15.0},
	{1521.0, 1690.0, 10.6},
	{2417.0, 1281.0, 21.0},
	{1376.0, 2304.0, 15.0},
	{1393.0, 1832.0, 12.34},
	{984.0, 2563.0, 12.0},
	{1767.0, 601.0, 13.0},
	{2108.0, 1003.0, 46.0},
	{2705.98, 1862.52, 24.41},
	{2493.0, 922.0, 16.0},
	{1881.0, 2846.0, 11.0},
	{2020.0, 2352.0, 11.0},
	{1680.3, 2226.8601, 16.11},
	{1462.0, 936.0, 10.0},
	{2125.5, 789.23, 11.45},
	{2588.0, 1902.0, 15.0},
	{919.0, 2070.0, 11.0},
	{2173.0, 2465.0, 11.0},
	{2031.25, 2207.3301, 11.0},
	{2509.0, 1144.0, 19.0},
	{2215.0, 1968.0, 11.0},
	{2626.0, 2841.0, 11.0},
	{2440.0801, 2161.0701, 20.0},
	{1582.0, 2401.0, 19.0},
	{2077.0, 1912.0, 14.0},
	{970.0, 1787.0, 11.0}
};
#pragma unused horseshoes

// --------------------------------------------------
// Functions
// --------------------------------------------------

// Integers

/*
 * TwoWayRand
 * minrand
 * RandomEx
 * IsNumberEven
 */

stock TwoWayRand(value) return random(value * 2 + 1) - value;

stock minrand(min,max) return random(max - min) + min;

stock RandomEx(max,...){
	new gen,bool:tainted = false,j = numargs(),enough = 0;
	while(true){
		tainted = false;
		enough++;
		if(enough == 20000) break;
		gen = random(max);
		for(new i=1;i<j;i++){
			if(getarg(i) == gen){
				tainted = true;
				break;
			}
		}
		if(tainted == false) return gen;
	}
	return UNKNOWN;
}

stock IsNumberOdd(number) return number % 2;

// Arguments

/*
 * GetArgString
 * GetArgType
 */

#define GetArgString(%1,%2) for(new x=0;getarg(%1,x)!='\0';x++) %2[x] = getarg(%1,x)

#define GetArgType(%1,%2) if(getarg(%1,0) > 32 && getarg(%1,0) < 127) %2 = TYPE_STR; else if(Float:getarg(%1) == floatstr(strfloat(Float:getarg(%1)))) %2 = TYPE_FLO; else %2 = TYPE_INT

// Strings

/*
 * format
 * strfloat
 * RetStr
 * sprintf
 * left
 * right
 * ConvertSeconds
 * GameTextCheck
 * strpart
 * concat
 * RandomString
 * ranString
 * Words
 * IntToHex
 * strrest
 * join
 * IsStringIP
 * charpos
 * Chr
 */

native format(output[], len, const format[], {Float,_}:...);

stock strfloat(Float:value){
	new str[64];
	format(str,sizeof(str),"%f",value);
	return str;
}

stock RetStr(val){
	new str[11];
	valstr(str,val);
	return str;
}

stock sprintf(const format[],{Float,_}:...){
	new retstr[256],currarg = 1;
	for(new i=0,j=strlen(format)-2;i<=j;i+=2){
		new tmpchar[5];
		strmid(tmpchar,format,i,i+2);
		if(strcmp(tmpchar,"%d",true)==0){
			strcat(retstr,RetStr(getarg(currarg)));
			currarg++;
		}
		else if(strcmp(tmpchar,"%f",true)==0){
			strcat(retstr,strfloat(Float:getarg(currarg)));
			currarg++;
		}
		else if(strcmp(tmpchar,"%s",true)==0){
			new tmpstr[256];
			GetArgString(currarg,tmpstr);
			strcat(retstr,tmpstr);
			currarg++;
		}
		else strcat(retstr,tmpchar);
	}
	return retstr;
}

stock left(source[],len){
	new retstr[256];
	strmid(retstr,source,0,len);
	return retstr;
}

stock right(source[], len){
	new retstr[256],srclen = strlen(source);
	strmid(retstr,source,srclen - len,srclen);
	return retstr;
}

stock ConvertSeconds(time){
	new string[64];
	if(time < 60) format(string,sizeof(string),"%d seconds",time);
	else if (time == 60) format(string,sizeof(string),"1 minute");
	else if(time > 60 && time < 3600) format(string,sizeof(string),"%d minutes and %d seconds",time / 60, time % 60);
	else if(time == 3600) format(string,sizeof(string),"1 hour");
	else if(time > 3600) format(string,sizeof(string),"%d hours, %d minutes and %d seconds",time / 3600, (time % 3600) / 60, (time % 3600) % 60);
	return string;
}

stock GameTextCheck(const string[]){
	for(new i=0,j=strlen(string);i<j;i++){
		if ((string[i] == 126) && (string[i-1] == 126)
		|| (string[i] == ' ') && (string[i-1] == '~') && (string[i-2] == ' ')
		|| (string[i] == '~') && (string[i+2] != '~') && (string[i-2] != '~')
		|| (string[i] == '~') && (string[i+2] == '~') && (string[i-2] == '~')) return true;
	}
	return false;
}

stock strpart(string[],start,end){
	new retstr[256];
	strmid(retstr,string,start,end);
	return retstr;
}

stock concat({Float,_}:...){
	new retstr[256];
	for(new i=0,j=numargs();i<j;i++){
		new semistr[64];
		GetArgString(i,semistr);
		strcat(retstr,semistr);
	}
	return retstr;
}

stock RandomString(len,bool:lenrand = true){
	new retstr[256];
	if(len < sizeof(retstr)){
		if(lenrand == true) for(new i=0,j=random(len);i<j;i++) retstr[i] = minrand(32,127);
		else for(new i=0;i<len;i++) retstr[i] = minrand(32,127);
	}
	return retstr;
}

stock ranString(length){
	new retstr[256];
	for(new i=0;i<length;i++){
		switch(random(3)){
			case 0: retstr[i] = minrand(65,91);
			case 1: retstr[i] = minrand(96,123);
			case 2: retstr[i] = minrand(48,58);
		}
	}
	return retstr;
}

stock Words(string[]){
	new idx,words;
	while(strlen(strtok(string,idx))) words++;
	return words;
}

stock IntToHex(val){
	new nibble,str[9];
	for(new i=24,j=0;i>=0;i-=4,j++){
		nibble = (val >> i) & 0x0F;
		str[j] = (nibble < 10) ? (nibble + 0x30) : (nibble + 0x37);
	}
	str[8] = 0;
	return str;
}

stock strrest(const string[], index){
	new length = strlen(string),offset = index,result[256];
	while ((index < length) && ((index - offset) < (sizeof(result) - 1)) && (string[index] > '\r')){
		result[index - offset] = string[index];
		index++;
	}
	result[index - offset] = EOS;
	return result;
}

stock join(string1[],string2[]){
	new tmp[256];
	format(tmp,sizeof(tmp),"%s%s",string1,string2);
	return tmp;
}

stock IsStringIP(string[]){
	new icnt,port;
	for(new i=0,j=strlen(string);i<j;i++){
		if(string[i] == '.') icnt++;
		else if(string[i] ==':') port++;
	}
	if(icnt == 3){
		if(port == 1) return 2;
		else if(port == 0) return 1;
	}
	return 0;
}

stock charpos(const string[],character,index){
	for(new i=index,j=strlen(string);i<j;i++){
		if(string[i] == character) return i;
	}
	return -1;
}

stock Chr(val){
	new string[3];
	string[0] = val;
	return string;
}

// Hashing/Encryption

/*
 * encrypt
 * checksum
 * RMB1
 * MD5
 * SHA1
 */

stock encrypt(string[],key[] = "Ba$I*k5&\\0jC\'P[7t> Nv)\%i{-M)^m17H=9&nf#(@*)!X(2@D{_qJ?gZ#)\"N4P<n18ks$\'uel]@+)_6")
{
	new size = strlen(key) - 1,retval[256],j = strlen(string),k = ((j >> 4) + 1) << 4,sum = j,tmp[] = {0,0};
	for(new i=0;i<k;i++){
		if(i<j) tmp[0] = string[i];
		else tmp[0] = ' ';
		sum = ((sum + strfind(key,tmp) + 1) % size);
		retval[i] = key[sum];
	}
	return retval;
}

stock checksum(buffer[],mod = 65521){
	new a = 0,b = 1,c = 2,d = 3;
    for(new i=0,j=strlen(buffer);i<j;i++){
        a = ((a + buffer[i]) % mod);
        b = ((a + b)	     % mod);
        c = ((a + b + c)     % mod);
        d = ((a + b + c + d) % mod);
    }
    return ((d << 16) + (a + b + c));
}

stock RMB1(buf[]){
	new length=strlen(buf);
	new a;
	new s1 = 2;
	new s2 = 3;
   	new s3 = 5;
   	new s4 = 7;
   	new s5 = 9;
   	new s6 = 11;
   	new s7 = 13;
   	new s8 = 17;
   	new s9 = 7919;
   	new s10 = 7907;
   	new s11 = 7901;
   	new s12 = 7883;
   	new s13 = 7879;
   	new s14 = 7877;
   	new s15 = 7873;
   	new s16 = 7867;
   	for (a=0; a<length; a++){
        s1 = (s1 + buf[a]) * 65521;
        s2 = (s2 / s1 + buf[a]) * 65521;
        s3 = (s3 * s2 / s1 + buf[a]) * 65521;
        s4 = (s4 + s3 - s2 * s1 / buf[a]) * 65521;
        s5 = (s5 / s4 + s3 - s2 * s1 / buf[a]) * 65521;
        s6 = (s6 * s5 / s4 + s3 - s2 * s1 / buf[a]) * 65521;
        s7 = (s7 - s6 * s5 / s4 + s3 - s2 * s1 / buf[a]) * 65521;
        s8 = (s8 + s7 - s6 * s5 / s4 + s3 - s2 * s1 / buf[a]) * 65521;
        s9 = (s9 / s8 + s7 - s6 * s5 / s4 + s3 - s2 * s1 / buf[a]) * 65521;
        s10 = (s10 * s9 / s8 + s7 - s6 * s5 / s4 + s3 - s2 * s1 / buf[a]) * 65521;
        s11 = (s11 - s10 * s9 / s8 + s7 - s6 * s5 / s4 + s3 - s2 * s1 / buf[a]) * 65521;
        s12 = (s12 + s11 - s10 * s9 / s8 + s7 - s6 * s5 / s4 + s3 - s2 * s1 / buf[a]) * 65521;
        s13 = (s13 / s12 + s11 - s10 * s9 / s8 + s7 - s6 * s5 / s4 + s3 - s2 * s1 / buf[a]) * 65521;
        s14 = (s14 * s13 / s12 + s11 - s10 * s9 / s8 + s7 - s6 * s5 / s4 + s3 - s2 * s1 / buf[a]) * 65521;
        s15 = (s15 - s14 * s13 / s12 + s11 - s10 * s9 / s8 + s7 - s6 * s5 / s4 + s3 - s2 * s1 / buf[a]) * 65521;
        s16 = (s16 + s15 - s14 * s13 / s12 + s11 - s10 * s9 / s8 + s7 - s6 * s5 / s4 + s3 - s2 * s1 / buf[a]) * 65521;
    }
    return (s16 << 128) * s1 * s2 * s3 * s4 * s5 * s6 * s7 + s8 + s9 + s10 + s11 + s12 + s13 + s14 + s15 + s16;
}

stock SHA1(const string[]){
	new hashtmp[256],len = strlen(string),digest[256];
	format(hashtmp,sizeof(hashtmp),"%s",string);
	hashtmp[len >> 5] |= 0x80 << (24 - len % 32);
	hashtmp[((len + 64 >> 9) << 4) + 15] = len;
	new w[80], a =  1732584193, b = -271733879, c = -1732584194, d =  271733878, e = -1009589776;
	for(new i=0;i<len;i+=16){
		new olda = a, oldb = b, oldc = c, oldd = d, olde = e;
		for(new j=0;j<80;j++){
			if(j < 16) w[j] = hashtmp[i+j];
			else w[j] = Roll(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
			new t = Add(Add(Roll(a, 5), SHA1FT(j, b, c, d)),Add(Add(e, w[j]), SHA1KT(j)));
			e = d;
			d = c;
			c = Roll(b, 30);
			b = a;
			a = t;
		}
		a = Add(a, olda);
   		b = Add(b, oldb);
   		c = Add(c, oldc);
    	d = Add(d, oldd);
    	e = Add(e, olde);
	}
	format(digest,sizeof(digest),"%s%s%s%s%s",IntToHex(a),IntToHex(b),IntToHex(c),IntToHex(d),IntToHex(e));
	return digest;
}

stock Roll(num,cnt) return (num << cnt) | (num >>> (32-cnt));

stock Add(x,y){
	new lsw = (x & 0xFFFF) + (y & 0xFFFF);
	new msw = (x >> 16) + (y >> 16) + (lsw >> 16);
	return (msw << 16) | (lsw & 0xFFFF);
}

stock SHA1FT(t,b,c,d){
	if(t < 20) return (b & c) | ((~b) & d);
	if(t < 40) return b ^ c ^ d;
	if(t < 60) return (b & c) | (b & d) | (c & d);
	return b ^ c ^ d;
}

stock SHA1KT(t) return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : (t < 60) ? -1894007588 : -899497514;

stock MD5(const string[]){
	new len = strlen(string);
	new x[256];
	format(x,sizeof(x),"%s",string);
	x[len >> 5] |= 0x80 << (len % 32);
	x[((len + 64 >> 9) << 4) + 14] = len;
	new a =  1732584193;
	new b = -271733879;
	new c = -1732584194;
	new d =  271733878;
	for(new i=0;i<len;i+=16){
		new olda = a;
		new oldb = b;
		new oldc = c;
		new oldd = d;
		a = MD5FF(a, b, c, d, x[i+ 0], 7 , -680876936);
		d = MD5FF(d, a, b, c, x[i+ 1], 12, -389564586);
  		c = MD5FF(c, d, a, b, x[i+ 2], 17,  606105819);
    	b = MD5FF(b, c, d, a, x[i+ 3], 22, -1044525330);
    	a = MD5FF(a, b, c, d, x[i+ 4], 7 , -176418897);
    	d = MD5FF(d, a, b, c, x[i+ 5], 12,  1200080426);
    	c = MD5FF(c, d, a, b, x[i+ 6], 17, -1473231341);
    	b = MD5FF(b, c, d, a, x[i+ 7], 22, -45705983);
    	a = MD5FF(a, b, c, d, x[i+ 8], 7 ,  1770035416);
    	d = MD5FF(d, a, b, c, x[i+ 9], 12, -1958414417);
    	c = MD5FF(c, d, a, b, x[i+10], 17, -42063);
    	b = MD5FF(b, c, d, a, x[i+11], 22, -1990404162);
    	a = MD5FF(a, b, c, d, x[i+12], 7 ,  1804603682);
    	d = MD5FF(d, a, b, c, x[i+13], 12, -40341101);
    	c = MD5FF(c, d, a, b, x[i+14], 17, -1502002290);
    	b = MD5FF(b, c, d, a, x[i+15], 22,  1236535329);
    	a = MD5GG(a, b, c, d, x[i+ 1], 5 , -165796510);
    	d = MD5GG(d, a, b, c, x[i+ 6], 9 , -1069501632);
    	c = MD5GG(c, d, a, b, x[i+11], 14,  643717713);
    	b = MD5GG(b, c, d, a, x[i+ 0], 20, -373897302);
    	a = MD5GG(a, b, c, d, x[i+ 5], 5 , -701558691);
    	d = MD5GG(d, a, b, c, x[i+10], 9 ,  38016083);
    	c = MD5GG(c, d, a, b, x[i+15], 14, -660478335);
    	b = MD5GG(b, c, d, a, x[i+ 4], 20, -405537848);
   		a = MD5GG(a, b, c, d, x[i+ 9], 5 ,  568446438);
    	d = MD5GG(d, a, b, c, x[i+14], 9 , -1019803690);
    	c = MD5GG(c, d, a, b, x[i+ 3], 14, -187363961);
    	b = MD5GG(b, c, d, a, x[i+ 8], 20,  1163531501);
    	a = MD5GG(a, b, c, d, x[i+13], 5 , -1444681467);
    	d = MD5GG(d, a, b, c, x[i+ 2], 9 , -51403784);
    	c = MD5GG(c, d, a, b, x[i+ 7], 14,  1735328473);
    	b = MD5GG(b, c, d, a, x[i+12], 20, -1926607734);
    	a = MD5HH(a, b, c, d, x[i+ 5], 4 , -378558);
    	d = MD5HH(d, a, b, c, x[i+ 8], 11, -2022574463);
    	c = MD5HH(c, d, a, b, x[i+11], 16,  1839030562);
    	b = MD5HH(b, c, d, a, x[i+14], 23, -35309556);
    	a = MD5HH(a, b, c, d, x[i+ 1], 4 , -1530992060);
    	d = MD5HH(d, a, b, c, x[i+ 4], 11,  1272893353);
    	c = MD5HH(c, d, a, b, x[i+ 7], 16, -155497632);
    	b = MD5HH(b, c, d, a, x[i+10], 23, -1094730640);
    	a = MD5HH(a, b, c, d, x[i+13], 4 ,  681279174);
    	d = MD5HH(d, a, b, c, x[i+ 0], 11, -358537222);
    	c = MD5HH(c, d, a, b, x[i+ 3], 16, -722521979);
   		b = MD5HH(b, c, d, a, x[i+ 6], 23,  76029189);
    	a = MD5HH(a, b, c, d, x[i+ 9], 4 , -640364487);
    	d = MD5HH(d, a, b, c, x[i+12], 11, -421815835);
    	c = MD5HH(c, d, a, b, x[i+15], 16,  530742520);
    	b = MD5HH(b, c, d, a, x[i+ 2], 23, -995338651);
    	a = MD5II(a, b, c, d, x[i+ 0], 6 , -198630844);
    	d = MD5II(d, a, b, c, x[i+ 7], 10,  1126891415);
    	c = MD5II(c, d, a, b, x[i+14], 15, -1416354905);
    	b = MD5II(b, c, d, a, x[i+ 5], 21, -57434055);
    	a = MD5II(a, b, c, d, x[i+12], 6 ,  1700485571);
    	d = MD5II(d, a, b, c, x[i+ 3], 10, -1894986606);
    	c = MD5II(c, d, a, b, x[i+10], 15, -1051523);
    	b = MD5II(b, c, d, a, x[i+ 1], 21, -2054922799);
    	a = MD5II(a, b, c, d, x[i+ 8], 6 ,  1873313359);
    	d = MD5II(d, a, b, c, x[i+15], 10, -30611744);
    	c = MD5II(c, d, a, b, x[i+ 6], 15, -1560198380);
    	b = MD5II(b, c, d, a, x[i+13], 21,  1309151649);
    	a = MD5II(a, b, c, d, x[i+ 4], 6 , -145523070);
    	d = MD5II(d, a, b, c, x[i+11], 10, -1120210379);
    	c = MD5II(c, d, a, b, x[i+ 2], 15,  718787259);
    	b = MD5II(b, c, d, a, x[i+ 9], 21, -343485551);
    	a = Add(a, olda);
    	b = Add(b, oldb);
    	c = Add(c, oldc);
    	d = Add(d, oldd);
    }
    new digest[256];
    format(digest,sizeof(digest),"%s%s%s%s",IntToHex(a),IntToHex(b),IntToHex(c),IntToHex(d));
    return digest;
}

stock MD5FF(a,b,c,d,x,s,t) return MD5CMN((b & c) | ((~b) & d),a,b,x,s,t);

stock MD5CMN(q,a,b,x,s,t) return Add(Roll(Add(Add(a,q),Add(x,t)),s),b);

stock MD5GG(a,b,c,d,x,s,t) return MD5CMN((b & d) | (c & (~d)),a,b,x,s,t);

stock MD5HH(a,b,c,d,x,s,t) return MD5CMN(b^c^d,a,b,x,s,t);

stock MD5II(a, b, c, d, x, s, t) return MD5CMN(c ^ (b | (~d)), a, b, x, s, t);

// Properties

/*
 * PropertySet
 * PropertyIntSet
 * PropertyFloatSet
 * PropertyBoolSet
 * PropertyAdd
 * PropertyGet
 * PropertyInt
 * PropertyFloat
 * PropertyBool
 * PropertyExists
 * PropertyDelete
 */

#if !defined _dprop_included
	stock PropertySet(string[],const value[]) return setproperty(0,"",checksum(string),value);
#endif

stock PropertyIntSet(string[],val) return PropertySet(string,RetStr(val));

stock PropertyFloatSet(string[],Float:val) return PropertySet(string,strfloat(val));

stock PropertyBoolSet(string[],bool:val){
	new input;
	if(val == false) input = 0;
	else input = 1;
	return PropertySet(string,RetStr(input));
}

stock PropertyAdd(string[],val = 1) return PropertySet(string,RetStr(val+PropertyInt(string)));

#if !defined _dprop_included
	stock PropertyGet(string[]){
		new retstr[256];
		if(existproperty(0,"",checksum(string))) return retstr;
		getproperty(0,"",checksum(string),retstr);
		strunpack(retstr,retstr);
		return retstr;
	}
#endif

stock PropertyInt(string[]) return strval(PropertyGet(string));

stock Float:PropertyFloat(string[]) return floatstr(PropertyGet(string));

stock bool:PropertyBool(string[]) return bool:strval(PropertyGet(string));

#if !defined _dprop_included
	stock PropertyExists(string[]) return existproperty(0,"",checksum(string));
#endif

stock PropertyDelete(string[]){
	if(!PropertyExists(string)) return false;
	return deleteproperty(0,"",checksum(string));
}

// Server

/*
 * printf
 * print
 * GetMaxPlayers
 * SetGameModeText
 * GetGameModeText
 * SetTeamCount
 * ShowNameTags
 * ShowPlayerMarkers
 * GameModeExit
 * IsWindows
 * IsLinux
 * Frame
 */

native printf(const format[], {Float,_}:...);
native print(const string[]);
native S_GetMaxPlayers() = GetMaxPlayers;
native S_SetGameModeText(const string[]) = SetGameModeText;
native S_SetTeamCount(count) = SetTeamCount;
native S_ShowNameTags(show) = ShowNameTags;
native S_ShowPlayerMarkers(show) = ShowPlayerMarkers;
native S_GameModeExit() = GameModeExit;

stock GetMaxPlayers(){
	#if DEBUG == true
		printf("GetMaxPlayers()");
	#endif
	S_GetMaxPlayers();
}

stock SetGameModeText(const string[]){
	#if DEBUG == true
		printf("SetGameModeText(%s)",string);
	#endif
	S_SetGameModeText(string);
	PropertySet("Gamemodetxt",string);
}

stock GetGameModeText() return PropertyGet("Gamemodetxt");

stock SetTeamCount(count){
	#if DEBUG == true
		printf("SetTeamCount(%d)",count);
	#endif
	S_SetTeamCount(count);
}

stock ShowNameTags(show){
	#if DEBUG == true
		printf("ShowNameTags(%d)",show);
	#endif
	S_ShowNameTags(show);
}

stock ShowPlayerMarkers(show){
	#if DEBUG == true
		printf("ShowPlayerMarkers(%d)",show);
	#endif
	S_ShowPlayerMarkers(show);
}

stock GameModeExit(){
	#if DEBUG == true
		printf("GameModeExit()");
	#endif
	S_GameModeExit();
}

stock IsWindows(){
	if(!GetTickCount()) return false;
	return true;
}

stock IsLinux(){
	if(GetTickCount()) return false;
	return true;
}

#define line(%1,%2) for(new i=0; i<86; i++) msg[i] = ' '; msg[2] = %1; msg[xmax] = %2; for(new i=3; i<xmax; i++) msg[i] = 196; print(msg)
#define Frame(%1)   xmax = strlen(%1)+3; line(218,191); msg = %1; strins(msg,"   ",0); msg[2] = 179; msg[xmax] = 179; print(msg); line(192,217)

// Interiors

/*
 * SetPlayerInterior
 * GetPlayerInterior
 * IsPlayerInInterior
 * IsPlayerInAnyInterior
 * GetPlayerInteriorID
 * IsPlayerInInteriorID
 * GetInteriorName
 * SetPlayerInteriorID
 */

native S_SetPlayerInterior(playerid,interiorid) = SetPlayerInterior;

stock SetPlayerInterior(playerid,interiorid){
	#if DEBUG == true
		printf("SetPlayerInterior(%d,%d)",playerid,interiorid);
	#endif
	S_SetPlayerInterior(playerid,interiorid);
}

stock GetPlayerInterior(playerid) return interiors[GetPlayerInteriorID(playerid)][INTERIOR_ID];

stock IsPlayerInInterior(playerid,interiorid){
	if(GetPlayerInterior(playerid) != interiorid) return false;
	return true;
}

stock IsPlayerInAnyInterior(playerid){
	if(!GetPlayerInterior(playerid)) return false;
	return true;
}

stock GetPlayerInteriorID(playerid){
	new Float:pos[3];
	GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
	for(new i=1;i<sizeof(interiors);i++){
		if(pos[0] > interiors[i][INTERIOR_MINX] && pos[0] < interiors[i][INTERIOR_MAXX] && pos[1] > interiors[i][INTERIOR_MINY] && pos[1] < interiors[i][INTERIOR_MAXY] && pos[2] > interiors[i][INTERIOR_MINZ] && pos[2] < interiors[i][INTERIOR_MAXZ]) return i;
	}
	return false;
}

stock IsPlayerInInteriorID(playerid,interiorid){
	if(GetPlayerInteriorID(playerid) != interiorid) return false;
	return true;
}

stock GetInteriorName(interiorid) return interiors[interiorid][INTERIOR_NAME];

stock SetPlayerInteriorID(playerid,interiorid) SetPlayerPos(playerid,interiors[interiorid][INTERIOR_SX],interiors[interiorid][INTERIOR_SY],interiors[interiorid][INTERIOR_SZ],interiors[interiorid][INTERIOR_SA],interiors[interiorid][INTERIOR_ID]);

// Players

/*
 * SendClientMessage
 * SendClientMessageToAll
 * SendDeathMessage
 * GameTextForAll
 * GameTextForPlayer
 * SpawnPlayer
 * SetPlayerScore
 * GetPlayerScore
 * GetPlayerPos
 * SetPlayerPos
 * GetPlayerHealth
 * SetPlayerHealth
 * GetPlayerName
 * TogglePlayerControllable
 * IsPlayerFrozen
 * GivePlayerMoney
 * SetPlayerFacingAngle
 * GetPlayerFacingAngle
 * GetPlayerMoney
 * ResetPlayerMoney
 * IsPlayerConnected
 * GetPlayerState
 * GetPlayerId
 * GetDistanceBetweenPlayers
 * GetPlayerDistanceToPoint
 * GetClosestPlayer
 * ReturnPlayerName
 * GetPlayerDistanceToVehicle
 * GetClosestVehicle
 * wiper
 * IsPlayerInArea
 * IsPlayerInCube
 * GetPlayers
 * IsPlayerInRange
 * IsPlayerInCircle
 * IsPlayerInSphere
 * TakePlayerMoney
 * SendClientMessageToAllOthers
 * GameTextForAllOthers
 * Eraser
 * GetXYBehindPlayer
 * GetXYBehindPoint
 * ToggleBlipVisibility
 * AddPlayerHealth
 * IsPlayerSpawned
 * IsPlayerPassenger
 * IsPlayerDriver
 * IsPlayerOnFoot
 * IsPlayerOnBike
 * IsPlayerOnBicycle
 * IsPlayerOnBoat
 * IsPlayerInCar
 * IsPlayerInHelicopter
 * IsPlayerInPlane
 * IsPlayerInQuad
 * IsPlayerInMonsterTruck
 * IsPlayerInAreaEx
 * GetPlayerClan
 */

native S_SendClientMessage(playerid, color, const message[]) = SendClientMessage;
native S_SendDeathMessage(killer,killee,weapon) = SendDeathMessage;
native S_GameTextForPlayer(playerid,const string[],time,style) = GameTextForPlayer;
native S_SpawnPlayer(playerid) = SpawnPlayer;
native S_SetPlayerScore(playerid,score) = SetPlayerScore;
native S_GetPlayerScore(playerid) = GetPlayerScore;
native S_GetPlayerPos(playerid, &Float:x, &Float:y, &Float:z) = GetPlayerPos;
native S_SetPlayerPos(playerid, Float:x, Float:y, Float:z) = SetPlayerPos;
native S_GetPlayerHealth(playerid, &Float:health) = GetPlayerHealth;
native S_SetPlayerHealth(playerid, Float:health) = SetPlayerHealth;
native S_GetPlayerName(playerid, const name[], len) = GetPlayerName;
native S_TogglePlayerControllable(playerid, toggle) = TogglePlayerControllable;
native S_GivePlayerMoney(playerid,money) = GivePlayerMoney;
native S_SetPlayerFacingAngle(playerid,Float:ang) = SetPlayerFacingAngle;
native S_GetPlayerFacingAngle(playerid,&Float:ang) = GetPlayerFacingAngle;
native S_GetPlayerMoney(playerid) = GetPlayerMoney;
native S_ResetPlayerMoney(playerid) = ResetPlayerMoney;
native S_IsPlayerConnected(playerid) = IsPlayerConnected;
native S_GetPlayerState(playerid) = GetPlayerState;

stock SendClientMessage(playerid,color,const message[]){
	#if DEBUG == true
		printf("SendClientMessage(%d,%x,%s)",playerid,color,message);
	#endif
	S_SendClientMessage(playerid,color,message);
}

stock SendClientMessageToAll(color, const message[]) for(new i=0;i<MAX_PLAYERS;i++) if(IsPlayerConnected(i)) SendClientMessage(i,color,message);

stock SendDeathMessage(killer,killee,weapon){
	#if DEBUG == true
		printf("SendDeathMessage(%d,%d,%d)",killer,killee,weapon);
	#endif
	S_SendDeathMessage(killer,killee,weapon);
}

stock GameTextForAll(const string[],time,style) for(new i=0;i<MAX_PLAYERS;i++) if(IsPlayerConnected(i)) GameTextForPlayer(i,string,time,style);

stock GameTextForPlayer(playerid,const string[],time,style){
	#if DEBUG == true
		printf("GameTextForPlayer(%d,%s,%d,%d)",playerid,string,time,style);
	#endif
	if(GameTextCheck(string)) S_GameTextForPlayer(playerid,string,time,style);
	else print(" Warning: Your GameText was not in a sanitary condition (would've crashed players)");
}

stock SpawnPlayer(playerid){
	#if DEBUG == true
		printf("SpawnPlayer(%d)",playerid);
	#endif
	PropertyBoolSet(sprintf("P:%d ForcedS",playerid),true);
	S_SpawnPlayer(playerid);
}

stock SetPlayerScore(playerid,score){
	#if DEBUG == true
		printf("SetPlayerScore(%d,%d)",playerid,score);
	#endif
	S_SetPlayerScore(playerid,score);
	PropertyAdd(sprintf("P:%d Score",playerid),score);
}

stock GetPlayerScore(playerid){
	#if DEBUG == true
		printf("GetPlayerScore(%d)",playerid);
	#endif
	return S_GetPlayerScore(playerid);
}

stock GetPlayerPos(playerid, &Float:x, &Float:y, &Float:z){
	#if DEBUG == true
		printf("GetPlayerPos(%d)",playerid);
	#endif
	S_GetPlayerPos(playerid,x,y,z);
}

stock SetPlayerPos(playerid, Float:x, Float:y, Float:z,Float:Ang = -1.0,Int = -1, bool:vehiclex = false){
	#if DEBUG == true
		printf("SetPlayerPos(%d,%f,%f,%f)",playerid,x,y,z);
	#endif
	if(Int != -1) SetPlayerInterior(playerid,Int);
	if(vehiclex == true && IsPlayerInAnyVehicle(playerid) && IsPlayerDriver(playerid)){
		SetVehiclePos(GetPlayerVehicleID(playerid),x,y,z);
		if(Ang != -1.0) SetVehicleZAngle(GetPlayerVehicleID(playerid),Ang);
	}
	else{
		S_SetPlayerPos(playerid,x,y,z);
		if(Ang != -1.0) SetPlayerFacingAngle(playerid,Ang);
	}
}

stock GetPlayerHealth(playerid, &Float:health){
	#if DEBUG == true
		printf("GetPlayerHealth(%d)",playerid);
	#endif
	S_GetPlayerHealth(playerid,health);
}

stock SetPlayerHealth(playerid, Float:health){
	#if DEBUG == true
		printf("SetPlayerHealth(%d,%f)",playerid,health);
	#endif
	S_SetPlayerHealth(playerid,health);
}

stock GetPlayerName(playerid,const name[],len = sizeof(name)){
	#if DEBUG == true
		printf("GetPlayerName(%d)",playerid);
	#endif
	S_GetPlayerName(playerid,name,len);
}

stock TogglePlayerControllable(playerid,toggle){
	#if DEBUG == true
		printf("TogglePlayerControllable(%d,%d)",playerid,toggle);
	#endif
	S_TogglePlayerControllable(playerid,toggle);
	PropertyIntSet(sprintf("P:%d Frozen",playerid),toggle);
}

stock IsPlayerFrozen(playerid) return PropertyBool(sprintf("P:%d Frozen",playerid));

stock GivePlayerMoney(playerid,moneys){
	#if DEBUG == true
		printf("GivePlayerMoney(%d,%d)",playerid,moneys);
	#endif
	S_GivePlayerMoney(playerid,moneys);
	PropertyAdd(sprintf("P:%d Money",playerid),moneys);
}

stock SetPlayerFacingAngle(playerid,Float:ang){
	#if DEBUG == true
		printf("SetPlayerFacingAngle(%d,%f)",playerid,ang);
	#endif
	S_SetPlayerFacingAngle(playerid,ang);
	PropertyBoolSet(sprintf("P:%d Setting",playerid),true);
}

stock GetPlayerFacingAngle(playerid,&Float:ang){
	#if DEBUG == true
		printf("GetPlayerFacingAngle(%d)",playerid);
	#endif
	S_GetPlayerFacingAngle(playerid,ang);
}

stock GetPlayerMoney(playerid){
	#if DEBUG == true
		printf("GetPlayerMoney(%d)",playerid);
	#endif
	return S_GetPlayerMoney(playerid);
}

stock ResetPlayerMoney(playerid){
	#if DEBUG == true
		printf("ResetPlayerMoney(%d)",playerid);
	#endif
	S_ResetPlayerMoney(playerid);
	PropertyIntSet(sprintf("P:%d Money",playerid),0);
}

stock IsPlayerConnected(playerid){
	#if DEBUG == true
		printf("IsPlayerConnected(%d)",playerid);
	#endif
	return S_IsPlayerConnected(playerid);
}

stock GetPlayerState(playerid){
	#if DEBUG == true
		printf("GetPlayerState(%d)",playerid);
	#endif
	return S_GetPlayerState(playerid);
}

stock GetPlayerId(playername[]){
	new playername2[MAX_PLAYER_NAME];
	for(new i=0;i<MAX_PLAYERS;i++){
		if(IsPlayerConnected(i)){
			GetPlayerName(i,playername2,sizeof(playername2));
			if(equal(playername,playername2,false)) return i;
		}
	}
	return INVALID_PLAYER_ID;
}

stock Float:GetDistanceBetweenPlayers(playerid,playerid2){
	new Float:pos[3];
	GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
	return GetPlayerDistanceToPoint(playerid2,pos[0],pos[1],pos[2]);
}

forward Float:GetPlayerDistanceToPoint(playerid,{Float,_}:...);

stock Float:GetPlayerDistanceToPoint(playerid,{Float,_}:...){
	new num = numargs(),Float:pos[3];
	GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
	if(num == 3) return floatsqroot(floatpower(floatabs(floatsub(pos[0],Float:getarg(1))),2)+floatpower(floatabs(floatsub(pos[1],Float:getarg(2))),2));
	else if(num == 4) return floatsqroot(floatpower(floatabs(floatsub(pos[0],Float:getarg(1))),2)+floatpower(floatabs(floatsub(pos[1],Float:getarg(2))),2)+floatpower(floatabs(floatsub(pos[2],Float:getarg(3))),2));
	return -1.0;
}

stock GetClosestPlayer(playerid){
	new player = INVALID_PLAYER_ID,Float:dis = MAX_WORLDBOUNDS;
	for(new i=0;i<MAX_PLAYERS;i++){
		if(IsPlayerConnected(i) && i != playerid){
			new Float:dis2 = GetDistanceBetweenPlayers(playerid,i);
			if(dis2 > dis){
				dis = dis2;
				player = i;
			}
		}
	}
	return player;
}

stock ReturnPlayerName(playerid){
	new playername[MAX_PLAYER_NAME];
	GetPlayerName(playerid,playername,sizeof(playername));
	return playername;
}

stock Float:GetPlayerDistanceToVehicle(playerid,vehicleid){
	new Float:pos[3];
	GetVehiclePos(vehicleid,pos[0],pos[1],pos[2]);
	return GetPlayerDistanceToPoint(playerid,pos[0],pos[1],pos[2]);
}

stock GetCloestVehicle(playerid){
	new vehicle = UNKNOWN,Float:dis = MAX_WORLDBOUNDS;
	for(new i=0;i<MAX_VEHICLES;i++){
		new Float:dis2 = GetPlayerDistanceToVehicle(playerid,i);
		if(dis2 > dis){
			dis = dis2;
			vehicle = i;
		}
	}
	return vehicle;
}

stock wiper(playerid) for(new i=0;i<=MAX_CHATLINES;i++) SendClientMessage(playerid,COLOR_WHITE,"\n");

stock IsPlayerInArea(playerid,Float:minx,Float:maxx,Float:miny,Float:maxy){
	new Float:pos[3];
	GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
	if(pos[0] > minx && pos[0] < maxx && pos[1] > miny && pos[1] < maxy) return true;
	return false;
}

stock IsPlayerInCube(playerid,Float:minx,Float:maxx,Float:miny,Float:maxy,Float:zmin,Float:zmax){
	new Float:pos[3];
	GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
	if(pos[0] > xmin && pos[1] > ymin && pos[2] > zmin && pos[0] < xmax && pos[1] < ymax && pos[2] < zmax) return true;
	return false;
}

stock GetPlayers(){
	new players;
	for(new i=0;i<MAX_PLAYERS;i++) if(IsPlayerConnected(i)) players++;
	return players;
}

stock IsPlayerInRange(playerid,Float:Range,Float:Z_Range,Float:x,Float:y,Float:z){
	new Float:pos[3];
	GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
	if(pos[0] - x <= Range && pos[0] - x >= 0.0 - Range && pos[1] - y <= Range && y >= 0.0 - Range && pos[2] - z <= Z_Range && z - pos[2] >= 0.0 - Z_Range) return true;
	return false;
}

stock IsPlayerInCircle(playerid,Float:x,Float:y,radius){
	if(GetPlayerDistanceToPoint(playerid,x,y) < radius) return true;
	return false;
}

stock IsPlayerInSphere(playerid,Float:x,Float:y,Float:z,radius){
	if(GetPlayerDistanceToPoint(playerid,x,y,z) < radius) return true;
	return false;
}

stock TakePlayerMoney(playerid,moneyz) GivePlayerMoney(playerid,0-moneyz);

stock SendClientMessageToAllOthers(playerid,color, const message[]) for(new i=0;i<MAX_PLAYERS;i++) if(IsPlayerConnected(i) && i != playerid) SendClientMessage(i,color,message);

stock Eraser(playerid,lines) for(new a=1;a<=lines;a++) SendClientMessage(playerid,COLOR_WHITE, "\n");

stock GetXYBehindPlayer(playerid,&Float:x,&Float:y,Float:distance){
	new Float:a;
	GetPlayerPos(playerid,x,y,a);
	GetPlayerFacingAngle(playerid,a);
	GetXYBehindPoint(x,y,x,y,distance,a);
}

stock GetXYBehindPoint(Float:x,Float:y,&Float:x2,&Float:y2,Float:distance,Float:angle){
	x2 = x;
	y2 = y;
	x2 -= distance * floatsin(-angle,degrees);
	y2 -= distance * floatcos(-angle,degrees);
}

stock ToggleBlipVisibility(playerid,bool:visible){
	new tmpcolour = GetPlayerColor(playerid);
	if(visible == true) tmpcolour &= 0xFFFFFF00;
	else tmpcolour |= 0x000000FF;
	SetPlayerColor(playerid,tmpcolour);
}

stock AddPlayerHealth(playerid,Float:health){
	new Float:health2;
	GetPlayerHealth(playerid,health2);
	SetPlayerHealth(playerid,health+health2);
}

stock IsPlayerSpawned(playerid){
	new statex = GetPlayerState(playerid);
	if(statex != PLAYER_STATE_NONE && statex != PLAYER_STATE_WASTED && statex != PLAYER_STATE_SPAWNED) return true;
	return false;
}

stock IsPlayerPassenger(playerid){
	if(GetPlayerState(playerid) == PLAYER_STATE_PASSENGER) return true;
	return false;
}

stock IsPlayerDriver(playerid){
	if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER) return true;
	return false;
}

stock IsPlayerOnFoot(playerid){
	if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT) return true;
	return false;
}

stock IsPlayerOnBike(playerid){
	if(!IsPlayerInAnyVehicle(playerid)) return false;
	if(GetVehicleType(GetPlayerVehicleID(playerid)) == TYPE_BIKE) return true;
	return false;
}

stock IsPlayerOnBicycle(playerid){
	if(!IsPlayerInAnyVehicle(playerid)) return false;
	if(GetVehicleType(GetPlayerVehicleID(playerid)) == TYPE_BICYCLE) return true;
	return false;
}

stock IsPlayerInBoat(playerid){
	if(!IsPlayerInAnyVehicle(playerid)) return false;
	if(GetVehicleType(GetPlayerVehicleID(playerid)) == TYPE_BOAT) return true;
	return false;
}

stock IsPlayerInHelicopter(playerid){
	if(!IsPlayerInAnyVehicle(playerid)) return false;
	if(GetVehicleType(GetPlayerVehicleID(playerid)) == TYPE_HELI) return true;
	return false;
}

stock IsPlayerInMonsterTruck(playerid){
	if(!IsPlayerInAnyVehicle(playerid)) return false;
	if(GetVehicleType(GetPlayerVehicleID(playerid)) == TYPE_MONSTER) return true;
	return false;
}

stock IsPlayerInPlane(playerid){
	if(!IsPlayerInAnyVehicle(playerid)) return false;
	if(GetVehicleType(GetPlayerVehicleID(playerid)) == TYPE_PLANE) return true;
	return false;
}

stock IsPlayerInQuad(playerid){
	if(!IsPlayerInAnyVehicle(playerid)) return false;
	if(GetVehicleType(GetPlayerVehicleID(playerid)) == TYPE_QUAD) return true;
	return false;
}

stock IsPlayerInCar(playerid){
	if(!IsPlayerInAnyVehicle(playerid)) return false;
	if(GetVehicleType(GetPlayerVehicleID(playerid)) == TYPE_CAR) return true;
	return false;
}

stock IsPlayerInAreaEx(playerid,Float:...){
	new num = numargs(),Float:xa[255],Float:ya[255],j;
	for(new i=1;i<num;i+=2){
		xa[j] = Float:getarg(i);
		ya[j] = Float:getarg(i+1);
		j++;
	}
	xa[j] = xa[0];
	ya[j] = ya[0];
	new lin,Float:xcut,Float:x,Float:y,Float:z;
	for(new i=0;i<j;i++){
		xcut = xa[i] + ((y-ya[i])*(xa[i+1]-xa[i])/(ya[i+1]-ya[i]));
		if(((y >= ya[i] && y <= ya[i+1]) || (y >= ya[i+1] && y <= ya[i+1])0 && xcut < x) lin++;
	}
	if(lin % 2 == 1) return true;
	return false;
}

stock GetPlayerClan(playerid){
	new name[MAX_PLAYER_NAME],clan[MAX_PLAYER_NAME];
	GetPlayerName(playerid,playername,sizeof(playername));
	new mrk1 = -1,mrk1char,mrk2 = -1,mrk2char;
	for(new i=0,j=strlen(name)-1;i<j;i++){
		if(mrk1 == -1){
			if(name[i] == '[') mrk1 = i;
			else if(name[i] == '(') mrk1 = i;
			else if(name[i] == '{') mrk1 = i;
			else if(name[i] == '<'){
				if(name[i+1] == '<') mrk1 = i+1;
				else mrk1 = i;
			}
			else if(name[i] == ':'){
				if(name[i+1] == ':') mrk1 = i+1;
				else mrk1 = i;
			}
			else if(name[i] == '=') mrk1 = i;
			else if(name[i] == '>') mrk1 = i;
			else if(name[i] == '|') mrk1 = i;
			if(mrk1 >= i){
				i = mrk1;
				mrk1char = name[mrk1];
			}
		}
		else{
			if(name[mrk1] == '[' && name[i] == ']') mrk2 = i;
			else if(name[mrk1] == '(' && name[i] == ')') mrk2 = i;
			else if(name[mrk1] == '{' && name[i] == '}') mrk2 = i;
			else if(name[mrk1] == '<' && name[i] == '>') mrk2 = i;
			else if(name[mrk1] == ':' && name[i] == ':') mrk2 = i;
			else if(name[mrk1] == '=' && name[i] == '=') mrk2 = i;
			else if(name[mrk1] == '>' && name[i] == '<') mrk2 = i;
			else if(name[mrk1] == '|' && name[i] == '|') mrk2 = i;
			if(mrk2 == i){
				mrk2char = name[i];
				break;
			}
		}
	}
	if(mrk1 != -1){
		if(mrk2 != -1) strmid(clan,name,mrk1+1,mrk2-1);
		else if(mrk1char == ':') strmid(clan,name,0,mrk1-1);
	}
	return clan;
}

//stock GetPlayerSpeed(playerid) return PropertyInt(sprintf("P:%d Speed",playerid));

//stock GetPlayerAccelaration(playerid) return PropertyInt(sprintf("P:%d Acceleration",playerid));

// Skins/Classes/Teams

/*
 * AddPlayerClass
 * AddPlayerClassEx
 * SetSpawnInfo
 * IsSkinValid
 * SetPlayerSkin
 * SetPlayerTeam
 * GetPlayerTeam
 * GameTextForTeam
 * SendClientMessageToTeam
 * SetTeamPos
 * IsTeamInArea
 * KickTeam
 * BanTeam
 * SetTeamScore
 * GiveTeamMoney
 * GetPlayersInTeam
 */

native S_AddPlayerClass(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:z_angle, weapon1, weapon1_ammo, weapon2, weapon2_ammo, weapon3, weapon3_ammo) = AddPlayerClass;
native S_AddPlayerClassEx(teamid, modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:z_angle, weapon1, weapon1_ammo, weapon2, weapon2_ammo, weapon3, weapon3_ammo) = AddPlayerClassEx;
native S_SetSpawnInfo(playerid, team, skin, Float:x, Float:y, Float:z, Float:rotation, weapon1, weapon1_ammo, weapon2, weapon2_ammo, weapon3, weapon3_ammo) = SetSpawnInfo;
native S_SetPlayerSkin(playerid, skinid) = SetPlayerSkin;
native S_SetPlayerTeam(playerid,teamid) = SetPlayerTeam;
native S_GetPlayerTeam(playerid) = GetPlayerTeam;

stock AddPlayerClass(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:z_angle, weapon1, weapon1_ammo, weapon2, weapon2_ammo, weapon3, weapon3_ammo){
	if(IsSkinValid(modelid)){
		new CC = PropertyInt("TClass");
		PropertyIntSet(sprintf("C:%d Model",CC),modelid);
		PropertyIntSet(sprintf("C:%d Teamid",CC),NO_TEAM);
		PropertyFloatSet(sprintf("C:%d X",CC),spawn_x);
		PropertyFloatSet(sprintf("C:%d Y",CC),spawn_y);
		PropertyFloatSet(sprintf("C:%d Z",CC),spawn_z);
		PropertyFloatSet(sprintf("C:%d A",CC),z_angle);
		PropertyIntSet(sprintf("C:%d W1",CC),weapon1);
		PropertyIntSet(sprintf("C:%d W1A",CC),weapon1_ammo);
		PropertyIntSet(sprintf("C:%d W2",CC),weapon2);
		PropertyIntSet(sprintf("C:%d W2A",CC),weapon2_ammo);
		PropertyIntSet(sprintf("C:%d W3",CC),weapon3);
		PropertyIntSet(sprintf("C:%d W3A",CC),weapon3_ammo);
		PropertyAdd("TClass");
		#if DEBUG == true
			printf("AddPlayerClass(%d,%f,%f,%f,%f,%d,%d,%d,%d,%d,%d)",modelid,spawn_x,spawn_y,spawn_z,z_angle,weapon1,weapon1_ammo,weapon2,weapon2_ammo,weapon3,weapon3_ammo);
		#endif
		#if CORE == false
			S_AddPlayerClass(modelid,spawn_x,spawn_y,spawn_z,z_angle,weapon1,weapon1_ammo,weapon2,weapon2_ammo,weapon3,weapon3_ammo);
		#endif
	}
	else printf("Error: Invalid Model Skin in AddPlayerClass (%d)",modelid);
}

stock AddPlayerClassEx(modelid, teamid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:z_angle, weapon1, weapon1_ammo, weapon2, weapon2_ammo, weapon3, weapon3_ammo){
	if(IsSkinValid(modelid)){
		new CC = PropertyInt("TClass");
		PropertyIntSet(sprintf("C:%d Model",CC),modelid);
		PropertyIntSet(sprintf("C:%d Teamid",CC),teamid);
		PropertyFloatSet(sprintf("C:%d X",CC),spawn_x);
		PropertyFloatSet(sprintf("C:%d Y",CC),spawn_y);
		PropertyFloatSet(sprintf("C:%d Z",CC),spawn_z);
		PropertyFloatSet(sprintf("C:%d A",CC),Z_angle);
		PropertyIntSet(sprintf("C:%d W1",CC),weapon1);
		PropertyIntSet(sprintf("C:%d W1A",CC),weapon1_ammo);
		PropertyIntSet(sprintf("C:%d W2",CC),weapon2);
		PropertyIntSet(sprintf("C:%d W2A",CC),weapon2_ammo);
		PropertyIntSet(sprintf("C:%d W3",CC),weapon3);
		PropertyIntSet(sprintf("C:%d W3A",CC),weapon3_ammo);
		PropertyAdd("TClass");
		#if DEBUG == true
			printf("AddPlayerClassEx(%d,%f,%f,%f,%f,%d,%d,%d,%d,%d,%d)",modelid,teamid,spawn_x,spawn_y,spawn_z,z_angle,weapon1,weapon1_ammo,weapon2,weapon2_ammo,weapon3,weapon3_ammo);
		#endif
		#if CORE == false
			S_AddPlayerClassEx(modelid,teamid,spawn_x,spawn_y,spawn_z,z_angle,weapon1,weapon1_ammo,weapon2,weapon2_ammo,weapon3,weapon3_ammo);
		#endif
	}
	else printf("Error: Invalid Model Skin in AddPlayerClassEx (%d)",modelid);
}

stock SetSpawnInfo(playerid, team, skin, Float:x, Float:y, Float:z, Float:rotation, weapon1, weapon1_ammo, weapon2, weapon2_ammo, weapon3, weapon3_ammo){
	if(IsSkinValid(skin)){
		PropertyIntSet(sprintf("P:%d STeam",playerid),team);
		PropertyIntSet(sprintf("P:%d SSkin",playerid),skin);
		PropertyFloatSet(sprintf("P:%d SX",playerid),x);
		PropertyFloatSet(sprintf("P:%d SY",playerid),y);
		PropertyFloatSet(sprintf("P:%d SZ",playerid),z);
		PropertyFloatSet(sprintf("P:%d SA",playerid),rotation);
		PropertyIntSet(sprintf("P:%d W1",playerid),weapon1);
		PropertyIntSet(sprintf("P:%d W1A",playerid),weapon1_ammo);
		PropertyIntSet(sprintf("P:%d W2",playerid),weapon2);
		PropertyIntSet(sprintf("P:%d W2A",playerid),weapon2_ammo);
		PropertyIntSet(sprintf("P:%d W3",playerid),weapon3);
		PropertyIntSet(sprintf("P:%d W3A",playerid),weapon3_ammo);
		#if DEBUG == true
			printf("SetSpawnInfo(%d,%d,%d,%f,%f,%f,%f,%d,%d,%d,%d,%d,%d)",playerid,team,skin,x,y,z,rotation,weapon1,weapon1_ammo,weapon2,weapon2_ammo,weapon3,weapon3_ammo);
		#endif
		S_SetSpawnInfo(playerid, team, skin, x, y, z, rotation, weapon1, weapon1_ammo, weapon2, weapon2_ammo, weapon3, weapon3_ammo);
	}
	else printf("Error: Invalid Model Skin in SetSpawnInfo (%d)",playerid);
}

stock GetSpawnInfo(playerid,&team,&skin,&Float:x,&Float:y,&Float:rotation,&weapon1,&weapon1_ammo,&weapon2,&weapon2_ammo,&weapon3,&weapon3_ammo){
	team = PropertyInt(sprintf("P:%d STeam",playerid));
	skin = PropertyInt(sprintf("P:%d SSkin",playerid));
	x = PropertyFloat(sprintf("P:%d SX",playerid));
	y = PropertyFloat(sprintf("P:%d SY",playerid));
	z = PropertyFloat(sprintf("P:%d SZ",playerid));
	a = PropertyFloat(sprintf("P:%d SA",playerid));
	weapon1 = PropertyInt(sprintf("P:%d W1",playerid));
	weapon1_ammo = PropertyInt(sprintf("P:%d W1A",playerid));
	weapon2 = PropertyInt(sprintf("P:%d W2",playerid));
	weapon2_ammo = PropertyInt(sprintf("P:%d W2A",playerid));
	weapon3 = PropertyInt(sprintf("P:%d W3",playerid));
	weapon3_ammo = PropertyInt(sprintf("P:%d W3A",playerid));
}

stock IsSkinValid(skinid){
	new invalidskins[23] = {3, 4, 5, 6, 7, 8, 42, 65, 74, 86, 119, 149, 208, 265, 266, 267, 268, 269, 270, 271, 272, 273, 289};
	if(skinid < 0 || skinid > 300) return false;
	for(new i=0;i<sizeof(invalidskins);i++) if(skinid == invalidskins[i]) return false;
	return true;
}

stock SetPlayerSkin(playerid,skinid){
	#if DEBUG == true
		printf("SetPlayerSkin(%d,%d)",playerid,skinid);
	#endif
	print("Error: SetPlayerSkin can cause clients to crash");
	#pragma unused playerid
	#pragma unused skinid
}

stock SetPlayerTeam(playerid,teamid){
	#if DEBUG == true
		printf("SetPlayerTeam(%d,%d)",playerid,teamid);
	#endif
	S_SetPlayerTeam(playerid,teamid);
}

stock GetPlayerTeam(playerid){
	#if DEBUG == true
		printf("GetPlayerTeam(%d)",playerid);
	#endif
	return S_GetPlayerTeam(playerid);
}

stock GameTextForTeam(team, text[], time, style) for(new i=0;i<MAX_PLAYERS;i++) if(IsPlayerConnected(i) && GetPlayerTeam(i) == team) GameTextForPlayer(i, text, time, style);

stock SendClientMessageToTeam(teamid,colour,const message[]) for(new i=0;i<MAX_PLAYERS;i++) if(IsPlayerConnected(i) && GetPlayerTeam(i) == teamid) SendClientMessage(i,colour,message);

stock SetTeamPos(teamid,Float:x,Float:y,Float:z) for(new i=0;i<MAX_PLAYERS;i++) if(IsPlayerConnected(i) && GetPlayerTeam(i) == teamid) SetPlayerPos(i,x,y,z);

stock IsTeamInArea(teamid,Float:minx, Float:maxx, Float:miny, Float:maxy){
	for(new i=0;i<MAX_PLAYERS;i++){
		if(IsPlayerConnected(i) && GetPlayerTeam(i) == teamid){
			if(!IsPlayerInArea(i,minx,maxx,miny,maxy)) return false;
		}
	}
	return true;
}

stock KickTeam(teamid) for(new i=0;i<MAX_PLAYERS;i++) if(IsPlayerConnected(i) && GetPlayerTeam(i) == teamid) Kick(i);

stock BanTeam(teamid) for(new i=0;i<MAX_PLAYERS;i++) if(IsPlayerConnected(i) && GetPlayerTeam(i) == teamid) Ban(i);

stock SetTeamScore(teamid,score) for(new i=0;i<MAX_PLAYERS;i++) if(IsPlayerConnected(i) && GetPlayerTeam(i) == teamid) SetPlayerScore(i,score);

stock GiveTeamMoney(teamid,moneya) for(new i=0;i<MAX_PLAYERS;i++) if(IsPlayerConnected(i) && GetPlayerTeam(i) == teamid) GivePlayerMoney(i,moneya);

stock GetPlayersInTeam(teamid){
	new players;
	for(new i=0;i<MAX_PLAYERS;i++) if(IsPlayerConnected(i) && GetPlayerTeam(i) == teamid) players++;
	return players;
}

stock GetPlayerSkin(playerid) return PropertyInt(sprintf("P:%d Skin",playerid));

// Bounds

/*
 * SetPlayerWorldBounds
 * GetPlayerWorldBounds
 * ResetPlayerWorldBounds
 */

native S_SetPlayerWorldBounds(playerid,Float:x_max,Float:x_min,Float:y_max,Float:y_min) = SetPlayerWorldBounds;

stock SetPlayerWorldBounds(playerid,Float:...){
	new num = numargs();
	#if DEBUG == true
		if(num == 5) printf("SetPlayerWorldBounds(%d,%f,%f,%f,%f)",playerid,Float:getarg(1),Float:getarg(2),Float:getarg(3),Float:getarg(4));
		else if(num == 7) printf("SetPlayerWorldBounds(%d,%f,%f,%f,%f,%f,%f)",playerid,Float:getarg(1),Float:getarg(2),Float:getarg(3),Float:getarg(4),Float:getarg(5),Float:getarg(6));
	#endif
	if(num == 5){
		S_SetPlayerWorldBounds(playerid,Float:getarg(1),Float:getarg(2),Float:getarg(3),Float:getarg(4));
		PropertyFloatSet(sprintf("P:%d WB_X1",playerid),Float:getarg(1));
		PropertyFloatSet(sprintf("P:%d WB_X2",playerid),Float:getarg(2));
		PropertyFloatSet(sprintf("P:%d WB_Y1",playerid),Float:getarg(3));
		PropertyFloatSet(sprintf("P:%d WB_Y2",playerid),Float:getarg(4));
		PropertyFloatSet(sprintf("P:%d WB_Z1",playerid),MAX_WORLDBOUNDS);
		PropertyFloatSet(sprintf("P:%d WB_Z2",playerid),-MAX_WORLDBOUNDS);
	}
	else if(num == 7){
		S_SetPlayerWorldBounds(playerid,Float:getarg(1),Float:getarg(2),Float:getarg(3),Float:getarg(4));
		PropertyFloatSet(sprintf("P:%d WB_X1",playerid),Float:getarg(1));
		PropertyFloatSet(sprintf("P:%d WB_X2",playerid),Float:getarg(2));
		PropertyFloatSet(sprintf("P:%d WB_Y1",playerid),Float:getarg(3));
		PropertyFloatSet(sprintf("P:%d WB_Y2",playerid),Float:getarg(4));
		PropertyFloatSet(sprintf("P:%d WB_Z1",playerid),Float:getarg(5));
		PropertyFloatSet(sprintf("P:%d WB_Z2",playerid),Float:getarg(6));
	}
}

stock GetPlayerWorldBounds(playerid,&Float:x_max,&Float:x_min,&Float:y_max,&Float:y_min){
	x_max = PropertyFloat(sprintf("P:%d WB_X1",playerid));
	x_min = PropertyFloat(sprintf("P:%d WB_X2",playerid));
	y_max = PropertyFloat(sprintf("P:%d WB_Y1",playerid));
	y_min = PropertyFloat(sprintf("P:%d WB_Y2",playerid));
}

stock ResetPlayerWorldBounds(playerid) SetPlayerWorldBounds(playerid,MAX_WORLDBOUNDS,-MAX_WORLDBOUNDS,MAX_WORLDBOUNDS,-MAX_WORLDBOUNDS);

// Vehicles

/*
 * AddStaticVehicle
 * AddStaticVehicleEx
 * IsPlayerInAnyVehicle
 * GetPlayerVehicleID
 * PutPlayerInVehicle
 * RemovePlayerFromVehicle
 * IsPlayerInVehicle
 * CreateVehicle
 * GetVehiclePos
 * SetVehiclePos
 * SetVehicleZAngle
 * SetVehicleParamsForPlayer
 * SetVehicleToRespawn
 * AddVehicleComponent
 * ChangeVehicleColor
 * ChangeVehiclePaintJob
 * GetVehicleModel
 * GetVehicles
 * GetModelType
 * GetVehicleType
 * GetVehicleDriver
 * GetVehicleName
 * IsVehicleConnected
 * IsVehicleInUse
 * GetVehicleSpawnPos
 */

native S_AddStaticVehicle(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:z_angle, color1, color2) = AddStaticVehicle;
native S_AddStaticVehicleEx(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:z_angle, color1, color2, respawn_delay) = AddStaticVehicleEx;
native S_IsPlayerInAnyVehicle(playerid) = IsPlayerInAnyVehicle;
native S_GetPlayerVehicleID(playerid) = GetPlayerVehicleID;
native S_PutPlayerInVehicle(playerid, vehicleid, seatid) = PutPlayerInVehicle;
native S_RemovePlayerFromVehicle(playerid) = RemovePlayerFromVehicle;
native S_IsPlayerInVehicle(playerid, vehicleid) = IsPlayerInVehicle;
native S_CreateVehicle(vehicletype, Float:x, Float:y, Float:z, Float:rotation, color1, color2, respawn_delay) = CreateVehicle;
native S_GetVehiclePos(vehicleid, &Float:x, &Float:y, &Float:z) = GetVehiclePos;
native S_SetVehiclePos(vehicleid, Float:x, Float:y, Float:z) = SetVehiclePos;
native S_SetVehicleZAngle(vehicleid, Float:z_angle) = SetVehicleZAngle;
native S_SetVehicleParamsForPlayer(vehicleid,playerid,objective,doorslocked) = SetVehicleParamsForPlayer;
native S_SetVehicleToRespawn(vehicleid) = SetVehicleToRespawn;
native S_AddVehicleComponent(vehicleid, componentid) = AddVehicleComponent;
native S_ChangeVehicleColor(vehicleid, color1, color2) = ChangeVehicleColor;
native S_ChangeVehiclePaintjob(vehicleid, paintjobid) = ChangeVehiclePaintJob;

stock AddStaticVehicle(modelid,Float:spawn_x,Float:spawn_y,Float:spawn_z,Float:z_angle,color1 = -1,color2 = -1){
	new VC = PropertyInt("TVehicles");
	if(VC < MAX_VEHICLES && PropertyInt("TModels") < MAX_MODELS){
		new MC;
		for(new i=0;i<VC;i++) if(PropertyInt(sprintf("V:%d Model",i)) != modelid) MC++;
		if(MC == VC) PropertyAdd("TVehicles");
		PropertyIntSet(sprintf("V:%d Model",VC),modelid);
		PropertyFloatSet(sprintf("V:%d X",VC),spawn_x);
		PropertyFloatSet(sprintf("V:%d Y",VC),spawn_y);
		PropertyFloatSet(sprintf("V:%d Z",VC),spawn_z);
		PropertyFloatSet(sprintf("V:%d A",VC),z_angle);
		PropertyIntSet(sprintf("V:%d C1",VC),color1);
		PropertyIntSet(sprintf("V:%d C2",VC),color2);
		PropertyIntSet(sprintf("V:%d RS",VC),120);
		PropertyAdd("TVehicles");
		#if CORE == false
			S_AddStaticVehicle(modelid,spawn_x,spawn_y,spawn_z,z_angle,color1,color2);
		#endif
	}
	else print("Error: More vehicles added than can be allowed");
	#if DEBUG == true
		printf("AddStaticVehicleEx(%d,%f,%f,%f,%f,%d,%d)",modelid,spawn_x,spawn_y,spawn_z,z_angle,color1,color2);
	#endif
}

stock AddStaticVehicleEx(modelid,Float:spawn_x,Float:spawn_y,Float:spawn_z,Float:z_angle,color1 = -1,color2 = -1,respawn_delay = 120){
	new VC = PropertyInt("TVehicles");
	if(VC < MAX_VEHICLES && PropertyInt("TModels") < MAX_MODELS){
		new MC;
		for(new i=0;i<VC;i++) if(PropertyInt(sprintf("V:%d Model",i)) != modelid) MC++;
		if(MC == VC) PropertyAdd("TVehicles");
		PropertyIntSet(sprintf("V:%d Model",VC),modelid);
		PropertyFloatSet(sprintf("V:%d X",VC),spawn_x);
		PropertyFloatSet(sprintf("V:%d Y",VC),spawn_y);
		PropertyFloatSet(sprintf("V:%d Z",VC),spawn_z);
		PropertyFloatSet(sprintf("V:%d A",VC),z_angle);
		PropertyIntSet(sprintf("V:%d C1",VC),color1);
		PropertyIntSet(sprintf("V:%d C2",VC),color2);
		PropertyIntSet(sprintf("V:%d RS",VC),respawn_delay);
		PropertyAdd("TVehicles");
		#if CORE == false
			S_AddStaticVehicleEx(modelid,spawn_x,spawn_y,spawn_z,z_angle,color1,color2,respawn_delay);
		#endif
	}
	else print("Error: More vehicles/models added than can be allowed");
	#if DEBUG == true
		printf("AddStaticVehicleEx(%d,%f,%f,%f,%f,%d,%d,%d)",modelid,spawn_x,spawn_y,spawn_z,z_angle,color1,color2,respawn_delay);
	#endif
}

stock IsPlayerInAnyVehicle(playerid){
	#if DEBUG == true
		printf("IsPlayerInAnyVehicle(%d)",playerid);
	#endif
	return S_IsPlayerInAnyVehicle(playerid);
}

stock GetPlayerVehicleID(playerid){
	#if DEBUG == true
		printf("GetPlayerVehicleID(%d)",playerid);
	#endif
	return S_GetPlayerVehicleID(playerid);
}

stock PutPlayerInVehicle(playerid,vehicleid,seatid){
	#if DEBUG == true
		printf("PutPlayerInVehicle(%d,%d,%d)",playerid,vehicleid,seatid);
	#endif
	for(new i=0;i<10;i++) S_PutPlayerInVehicle(playerid,vehicleid,seatid);
}

stock RemovePlayerFromVehicle(playerid){
	#if DEBUG == true
		printf("RemovePlayerFromVehicle(%d)",playerid);
	#endif
	S_RemovePlayerFromVehicle(playerid);
}

stock IsPlayerInVehicle(playerid,vehicleid){
	#if DEBUG == true
		printf("IsPlayerInVehicle(%d,%d)",playerid,vehicleid);
	#endif
	if(!IsPlayerInAnyVehicle(playerid)) return false;
	return S_IsPlayerInVehicle(playerid,vehicleid);
}

stock CreateVehicle(vehicletype, Float:x, Float:y, Float:z, Float:rotation, color1 = -1, color2 = -1, respawn_delay = 120){
	new VC = PropertyInt("TVehicles");
	if(VC < MAX_VEHICLES && PropertyInt("TModels") < MAX_MODELS){
		new MC;
		for(new i=0;i<VC;i++) if(PropertyInt(sprintf("V:%d Model",i)) != vehicletype) MC++;
		if(MC == VC) PropertyAdd("TVehicles");
		PropertyIntSet(sprintf("V:%d Model",VC),vehicletype);
		PropertyFloatSet(sprintf("V:%d X",VC),x);
		PropertyFloatSet(sprintf("V:%d Y",VC),y);
		PropertyFloatSet(sprintf("V:%d Z",VC),z);
		PropertyFloatSet(sprintf("V:%d A",VC),rotation);
		PropertyIntSet(sprintf("V:%d C1",VC),color1);
		PropertyIntSet(sprintf("V:%d C2",VC),color2);
		PropertyIntSet(sprintf("V:%d RS",VC),respawn_delay);
		PropertyAdd("TVehicles");
		S_CreateVehicle(vehicletype, x, y, z, rotation, color1, color2, respawn_delay);
	}
	else print("Error: More vehicles/models added than can be allowed");
	#if DEBUG == true
		printf("CreateVehicle(%d,%f,%f,%f,%f,%d,%d,%d)",playerid,x,y,z,rotation,color1,color2,respawn_delay);
	#endif
}

stock GetVehiclePos(vehicleid, &Float:x, &Float:y, &Float:z){
	#if DEBUG == true
		printf("GetVehiclePos(%d)",vehicleid);
	#endif
	new bool:inuse;
	for(new i=0;i<MAX_PLAYERS;i++){
		if(IsPlayerConnected(i) && IsPlayerInAnyVehicle(i) && IsPlayerInVehicle(i,vehicleid)){
			GetPlayerPos(i,x,y,z);
			inuse = true;
		}
	}
	if(inuse == false) S_GetVehiclePos(vehicleid, x, y, z);
}

stock SetVehiclePos(vehicleid, Float:x, Float:y, Float:z){
	#if DEBUG == true
		printf("SetVehiclePos(%d,%f,%f,%f)",vehicleid,x,y,z);
	#endif
	if(GetModelType(GetVehicleModel(vehicleid)) == TYPE_BIKE || GetModelType(GetVehicleModel(vehicleid)) == TYPE_BICYCLE){
		for(new i=0;i<MAX_PLAYERS;i++){
			if(IsPlayerConnected(i) && IsPlayerInAnyVehicle(i) && IsPlayerDriver(i) && IsPlayerInVehicle(i,vehicleid)){
				SetPlayerWorldBounds(i,5000.0,5000.0,5000.0,5000.0);
				S_SetVehiclePos(vehicleid,x,y,z);
				PropertyBoolSet(sprintf("P:%d vtele",i),true);
				SetTimer("ClearTele",30,false);
			}
		}
	}
	else S_SetVehiclePos(vehicleid,x,y,z);
}

forward ClearTele();

public ClearTele(){
	for(new i=0;i<MAX_PLAYERS;i++){
		if(IsPlayerConnected(i) && PropertyBool(sprintf("P:%d vtele",i)) == true){
			ResetPlayerWorldBounds(i);
			PropertyBoolSet(sprintf("P:%d vtele",i),false);
		}
	}
}

stock SetVehicleZAngle(vehicleid, Float:z_angle){
	#if DEBUG == true
		printf("SetVehicleZAngle(%d,%f)",vehicleid,z_angle);
	#endif
	S_SetVehicleZAngle(vehicleid,z_angle);
}

stock SetVehicleParamsForPlayer(vehicleid,playerid,objective,doorslocked){
	#if DEBUG == true
		printf("SetVehicleParamsForPlayer(%d,%d,%d,%d)",vehicleid,playerid,objective,doorslocked);
	#endif
	S_SetVehicleParamsForPlayer(vehicleid,playerid,objective,doorslocked);
	PropertyIntSet(sprintf("P:%d Locked %d",playerid,vehicleid),doorslocked);
}

stock SetVehicleToRespawn(vehicleid){
	#if DEBUG == true
		printf("SetVehicleToRespawn(%d)",vehicleid);
	#endif
	S_SetVehicleToRespawn(vehicleid);
}

stock AddVehicleComponent(vehicleid,componentid){
	#if DEBUG == true
		printf("AddVehicleComponent(%d,%d)",vehicleid,componentid);
	#endif
	S_AddVehicleComponent(vehicleid, componentid);
}

stock ChangeVehicleColor(vehicleid,color1,color2){
	#if DEBUG == true
		printf("ChangeVehicleColor(%d,%d,%d)",vehicleid,color1,color2);
	#endif
	S_ChangeVehicleColor(vehicleid,color1,color2);
}

stock ChangeVehiclePaintJob(vehicleid,paintjobid){
	#if DEBUG == true
		printf("ChangeVehiclePaintJob(%d,%d)",vehicleid,paintjobid);
	#endif
	S_ChangeVehiclePaintJob(vehicleid,paintjobid);
}

stock GetVehicleModel(vehicleid) return PropertyInt(sprintf("V:%d Model",vehicleid));

stock GetVehicles() return PropertyInt("TVehicles");

stock GetModelType(model) return vehicles[model][VTYPE];

stock GetVehicleType(vehicleid) return GetModelType(GetVehicleModel(vehicleid));

stock GetVehicleDriver(vehicleid){
	for(new i=0;i<MAX_PLAYERS;i++) if(IsPlayerConnected(i) && IsPlayerInAnyVehicle(i) && GetPlayerVehicleID(i) == vehicleid && IsPlayerDriver(i)) return i;
	return INVALID_PLAYER_ID;
}

stock GetVehicleName(vehicleid) return vehicles[GetVehicleModel(vehicleid)-400][VEHICLE_NAME];

stock IsVehicleConnected(vehicleid){
	if(vehicleid > GetVehicles()) return false;
	return true;
}

stock IsVehicleInUse(vehicleid){
	for(new i=0;i<MAX_PLAYERS;i++) if(IsPlayerInAnyVehicle(i) && IsPlayerInVehicle(i,vehicleid)) return true;
	return false;
}

stock GetVehicleSpawnPos(vehicleid, &Float:x, &Float:y, &Float:z) S_GetVehiclePos(vehicleid, x, y, z);

// Pickups

/*
 * AddStaticPickup
 * IsPickupConnected
 * GetPickups
 */

native S_AddStaticPickup(model,type,Float:X,Float:Y,Float:Z) = AddStaticPickup;

stock AddStaticPickup(model,type,Float:X,Float:Y,Float:Z){
	#if DEBUG == true
		printf("AddStaticPickup(%d,%d,%f,%f,%f)",model,type,X,Y,Z);
	#endif
	new TP = PropertyInt("TPickups");
	PropertyIntSet(sprintf("PK:%d Model",TP),model);
	PropertyIntSet(sprintf("PK:%d Type",TP),type);
	PropertyFloatSet(sprintf("PK:%d X",TP),X);
	PropertyFloatSet(sprintf("PK:%d Y",TP),Y);
	PropertyFloatSet(sprintf("PK:%d Z",TP),Z);
	PropertyAdd("TPickups");
	S_AddStaticPickup(model,type,X,Y,Z);
}

stock IsPickupConnected(pickupid){
	if(pickupid > GetPickups()) return false;
	return true;
}

stock GetPickups() return PropertyInt("TPickups");

stock GetPickupPos(pickupid,&Float:x,&Float:y,&Float:z){
	x = PropertyFloat(sprintf("PK:%d X",pickupid));
	y = PropertyFloat(sprintf("PK:%d Y",pickupid));
	z = PropertyFloat(sprintf("PK:%d Z",pickupid));
}

// Weapons

/*
 * GetWeaponName
 * ResetPlayerWeapons
 * GivePlayerWeapon
 * GetWeaponType
 * ReturnWeaponName
 */

native S_GetWeaponName(weaponid, const weapon[], len) = GetWeaponName;
native S_ResetPlayerWeapons(playerid) = ResetPlayerWeapons;
native S_GivePlayerWeapon(playerid, weaponid, ammo) = GivePlayerWeapon;

stock GetWeaponName(weaponid, const weapon[], len){
	#if DEBUG == true
		printf("GetWeaponName(%d,%s,%d)",weaponid,weapon,len);
	#endif
	S_GetWeaponName(weaponid,weapon,len);
}

stock ResetPlayerWeapons(playerid){
	#if DEBUG == true
		printf("ResetPlayerWeapons(%d)",playerid);
	#endif
	S_ResetPlayerWeapons(playerid);
}

stock GivePlayerWeapon(playerid, ...){
	#if DEBUG == true
		printf("GivePlayerWeapon(%d,%d,%d)",playerid,weaponid,ammo);
	#endif
	for(new i=1,j=numargs();i<j;i+=2){
		new weaponid = getarg(i);
		new ammo = getarg(i+1);
		if((weaponid > 15 && weaponid < 22) || (weaponid > 32 && weaponid < 37) || (weaponid > 38 && weaponid < 41) || (weaponid > 42 && weaponid != 46)){
			printf(" Error: You used GivePlayerWeapon with an unsynced weapon (%d)",weaponid);
			weaponid = 0;
		}
		S_GivePlayerWeapon(playerid,weaponid,ammo);
	}
}

stock GetWeaponType(weaponid){
	new type;
	switch(weaponid){
		case 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15:type = WTYPE_MELEE;
		case 16,17,18,19,20,21:type = WTYPE_PROJECTILE;
		case 22,23,24:type = WTYPE_PISTOL;
		case 25,26,27:type = WTYPE_SHOTGUN;
		case 28,32:type = WTYPE_MACHINEGUN;
		case 29,30,31:type = WTYPE_ASSAULT;
		case 33,34:type = WTYPE_RIFLE;
		case 35,36,37,38,39,40:type = WTYPE_HEAVY;
		case 41,42,43,44,45,46,47:type = WTYPE_SPECIAL;
	}
	return type;
}

stock ReturnWeaponName(weaponid){
	new weapon[24];
	GetWeaponName(weaponid,weapon,sizeof(weapon));
	return weapon;
}

// Admin

/*
 * IsPlayerAdmin
 * Kick
 * Ban
 * SendClientMessageToAdmins
 * GameTextForAdmins
 */

native S_IsPlayerAdmin(playerid) = IsPlayerAdmin;
native S_Kick(playerid) = Kick;
native S_Ban(playerid) = Ban;

stock IsPlayerAdmin(playerid){
	#if DEBUG == true
		printf("IsPlayerAdmin(%d)",playerid);
	#endif
	return S_IsPlayerAdmin(playerid);
}

stock Kick(playerid){
	#if DEBUG == true
		printf("Kick(%d)",playerid);
	#endif
	SetTimerEx("S_Kick",500,0,playerid);
}

stock Ban(playerid){
	#if DEBUG == true
		printf("Ban(%d)",playerid);
	#endif
	SetTimerEx("S_Ban",500,0,playerid);
}

stock SendClientMessageToAdmins(color,const message[]) for(new i=0;i<MAX_PLAYERS;i++) if(IsPlayerConnected(i) && IsPlayerAdmin(i)) SendClientMessage(i,color,message);

stock GameTextForAdmins(const string[],time,style) for(new i=0;i<MAX_PLAYERS;i++) if(IsPlayerConnected(i) && IsPlayerAdmin(i)) GameTextForPlayer(i,string,time,style);

// Colours

/*
 * SetPlayerColor
 * GetPlayerColor
 * SetPlayerColourAlpha
 * RGBAToHex
 * HexToRGBA
 * SetAllColour
 * RandomColour
 */

native S_SetPlayerColor(playerid,color)  = SetPlayerColor;
native S_GetPlayerColor(playerid) = GetPlayerColor;

stock SetPlayerColor(playerid,color){
	#if DEBUG == true
		printf("SetPlayerColor(%d,%x)",playerid,color);
	#endif
	S_SetPlayerColor(playerid,color);
}

stock GetPlayerColor(playerid){
	#if DEBUG == true
		printf("GetPlayerColor(%d)",playerid);
	#endif
	return S_GetPlayerColor(playerid);
}

stock SetPlayerColourAlpha(playerid,alpha){
	new r,g,b,a;
	HexToRGBA(GetPlayerColor(playerid),r,g,b,a);
	SetPlayerColor(playerid,RGBAToHex(r,g,b,alpha));
}

stock RGBAToHex(r, g, b, a) return (r<<24 | g<<16 | b<<8 | a);

stock HexToRGBA(colour,&r,&g,&b,&a){
	r = (colour >> 24) & 0xFF;
	g = (colour >> 16) & 0xFF;
	b = (colour >> 8) & 0xFF;
	a = colour & 0xFF;
}

stock SetAllColour(colour) for(new i=0;i<MAX_PLAYERS;i++) if(IsPlayerConnected(i)) SetPlayerColor(i,colour);

stock RandomColour(){
	new PlayerColours[100] = {
		0xFF8C13FF,0x3FE65CFF,0x20B2AAFF,0xDC143CFF,0x6495EDFF,0xf0e68cFF,0x778899FF,0xFF1493FF,0xF4A460FF,0xEE82EEFF,0xFFD720FF,
		0x8b4513FF,0x4949A0FF,0x148b8bFF,0x14ff7fFF,0x556b2fFF,0x0FD9FAFF,0x10DC29FF,0x534081FF,0x0495CDFF,0xEF6CE8FF,0xBD34DAFF,
		0x247C1BFF,0x0C8E5DFF,0x635B03FF,0xCB7ED3FF,0x65ADEBFF,0x5C1ACCFF,0xF2F853FF,0x11F891FF,0x7B39AAFF,0x53EB10FF,0x54137DFF,
		0x275222FF,0xF09F5BFF,0x3D0A4FFF,0x22F767FF,0xD63034FF,0x9A6980FF,0xDFB935FF,0x3793FAFF,0x90239DFF,0xE9AB2FFF,0xAF2FF3FF,
		0x057F94FF,0xB98519FF,0x388EEAFF,0x028151FF,0xA55043FF,0x0DE018FF,0x93AB1CFF,0x95BAF0FF,0x369976FF,0x18F71FFF,0x4B8987FF,
		0x491B9EFF,0x829DC7FF,0xBCE635FF,0xCEA6DFFF,0x20D4ADFF,0x2D74FDFF,0x3C1C0DFF,0x12D6D4FF,0x48C000FF,0x2A51E2FF,0xE3AC12FF,
		0xFC42A8FF,0x2FC827FF,0x1A30BFFF,0xB740C2FF,0x42ACF5FF,0x2FD9DEFF,0xFAFB71FF,0x05D1CDFF,0xC471BDFF,0x94436EFF,0xC1F7ECFF,
		0xCE79EEFF,0xBD1EF2FF,0x93B7E4FF,0x3214AAFF,0x184D3BFF,0xAE4B99FF,0x7E49D7FF,0x4C436EFF,0xFA24CCFF,0xCE76BEFF,0xA04E0AFF,
		0x9F945CFF,0xDCDE3DFF,0x10C9C5FF,0x70524DFF,0x0BE472FF,0x8A2CD7FF,0x6152C2FF,0xCF72A9FF,0xE59338FF,0xEEDC2DFF,0xD8C762FF,
		0xC715FFFF
	};
	return PlayerColours[random(sizeof(PlayerColours))];
}

// Checkpoints

/*
 * DisablePlayerCheckpoint
 * SetPlayerCheckpoint
 * GetPlayerCheckpoint
 * IsPlayerInCheckpoint
 */

native S_DisablePlayerCheckpoint(playerid) = DisablePlayerCheckpoint;
native S_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size) = SetPlayerCheckpoint;
native S_IsPlayerInCheckpoint(playerid) = IsPlayerInCheckpoint;

stock DisablePlayerCheckpoint(playerid){
	#if DEBUG == true
		printf("DisablePlayerCheckpoint(%d)",playerid);
	#endif
	S_DisablePlayerCheckpoint(playerid);
}

stock SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size){
	#if DEBUG == true
		printf("SetPlayerCheckpoint(%d,%f,%f,%f,%f)",playerid,x,y,z,size);
	#endif
	PropertyFloatSet(sprintf("P:%d CheckX",playerid),x);
	PropertyFloatSet(sprintf("P:%d CheckY",playerid),y);
	PropertyFloatSet(sprintf("P:%d CheckZ",playerid),z);
	DisablePlayerCheckpoint(playerid);
	S_SetPlayerCheckpoint(playerid,x,y,z,size);
}

stock GetPlayerCheckpoint(playerid,&Float:x,&Float:y,&Float:z){
	x = PropertyFloat(sprintf("P:%d CheckX",playerid));
	y = PropertyFloat(sprintf("P:%d CheckY",playerid));
	z = PropertyFloat(sprintf("P:%d CheckZ",playerid));
}

stock IsPlayerInCheckpoint(playerid){
	#if DEBUG == true
		printf("IsPlayerInCheckpoint(%d)",playerid);
	#endif
	return S_IsPlayerInCheckpoint(playerid);
}

// Camera

/*
 * SetPlayerCameraPos
 * SetPlayerCameraLookAt
 * SetCameraBehindPlayer
 */

native S_SetPlayerCameraPos(playerid,Float:x, Float:y, Float:z) = SetPlayerCameraPos;
native S_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z) = SetPlayerCameraLookAt;
native S_SetCameraBehindPlayer(playerid) = SetCameraBehindPlayer;

stock SetPlayerCameraPos(playerid,Float:x, Float:y, Float:z){
	#if DEBUG == true
		printf("SetPlayerCameraPos(%d,%f,%f,%f)",playerid,x,y,z);
	#endif
	S_SetPlayerCameraPos(playerid,x,y,z);
}

stock SetPlayerCameraLookAt(playerid,Float:x,Float:y,Float:z){
	#if DEBUG == true
		printf("SetPlayerCameraLookAt(%d,%f,%f,%f)",playerid,x,y,z);
	#endif
	S_SetPlayerCameraLookAt(playerid,x,y,z);
}

stock SetCameraBehindPlayer(playerid){
	#if DEBUG == true
		printf("SetCameraBehindPlayer(%d)",playerid);
	#endif
	S_SetCameraBehindPlayer(playerid);
}

// Sounds

/*
 * PlayerPlaySound
 * PlaySoundForAll
 */

native S_PlayerPlaySound(playerid, soundid, Float:x, Float:y, Float:z) = PlayerPlaySound;

stock PlayerPlaySound(playerid,soundid,Float:x = 0.0,Float:y = 0.0,Float:z = 0.0){
	#if DEBUG == true
		printf("PlayerPlaySound(%d,%d,%f,%f,%f)",playerid,soundid,x,y,z);
	#endif
	S_PlayerPlaySound(playerid,soundid,x,y,z);
}

stock PlaySoundForAll(soundid) for(new i=0;i<MAX_PLAYERS;i++) if(IsPlayerConnected(i)) PlayerPlaySound(i,soundid);

// Files

/*
 * freset
 * fcreate
 * fdeleteline
 * fsize
 * StripNewLine
 */

stock freset(file[]){
	if(fexist(file)) fremove(file);
	return fcreate(file);
}

stock fcreate(filename[]){
	if(fexist(filename)) return false;
	new File:fhandle = fopen(filename,io_write);
	fclose(fhandle);
	return true;
}

stock fdeleteline(filename[],line[]){
	if(!fexist(filename)) return false;
	frename(filename,join(filename,".tmp"));
	fcreate(filename);
	new File:fh1 = fopen(filename,io_write),File:fh2 = fopen(join(filename,".tmp"),io_read);
	if(!fh1 || !fh2) return false;
	new temp[256];
	while(fread(fh2,temp)){
		StripNewLine(temp);
		if(!equal(temp,line,false)) fwrite(fh1,join(temp,"\r\n"));
	}
	fclose(fh1);
	fclose(fh2);
	fremove(join(filename,".tmp"));
	return true;
}

stock fsize(filename[]){
	new size[10];
    new File:file = fopen(filename,io_append);
    new Float:flen = flength(file)/1048576.0;
    if(flen < 1.0){
    	flen *= 1024;
    	format(size,sizeof(size),"%.f KB",flen);
    }
    else format(size,sizeof(size),"%.2f MB",flen);
    fclose(file);
    return size;
}

// Floats

/*
 * floatrand
 * floatminrand
 * lengthtox
 * lengthtoy
 * GetXYOnCircle
 * asin
 * acos
 * atan
 */

stock Float:floatrand(Float:max) return float(random(floatround(max) * 100)) / 100.0;

stock Float:floatminrand(Float:min,Float:max) return float(random((floatround(max) - floatround(min) * 100) + (floatround(min * 100)) / 100.0;

stock Float:lengthtox(Float:length,Float:angle) return floatmul(floatcos(floatdiv(floatmul(angle,PI),180.00)),length);

stock Float:lengthtoy(Float:length,Float:angle) return floatmul(-floatsin(floatdiv(floatmul(angle,PI),180.00)),length);

stock GetXYOnCircle(&Float:x, &Float:y, Float:cx, Float:cy, Float:radius, Float:angle){
	x = cx + radius*floatcos(angle,degrees);
	y = cy + radius*floatsin(angle,degrees);
}

stock Float:asin(Float:x){
	if(x < 1 && x > -1) return x+(1.0/2.0)*(floatpower(x,3)/3.0)+((1.0*3.0)/(2.0*4.0))*(floatpower(x,5)/5.0)+((1.0*3.0*5.0)/(2.0*4.0*6.0))*(floatpower(x,7)/7.0)+((1.0*3.0*5.0*7.0)/(2.0*4.0*6.0*8.0))*(floatpower(x,9)/9.0)+((1.0*3.0*5.0*7.0*9.0)/(2.0*4.0*6.0*8.0*10.0))*(floatpower(x,11)/11.0);
	return float(UNKNOWN);
}

stock Float:acos(Float:x){
	if(x < 1 && x > -1) return (pi/2.0)-asin(x);
	return float(UNKNOWN);
}

stock Float:atan(Float:x){
	if(x < 1 && x > -1) return x-(1.0/3.0)*floatpower(x,3)+(1.0/5.0)*floatpower(x,5)-(1.0/7.0)*floatpower(x,7)+(1.0/9.0)*floatpower(x,9)-(1.0/11.0)*floatpower(x,11)+(1.0/13.0)*floatpower(x,13)-(1.0/15.0)*floatpower(x,15)+(1.0/17.0)*floatpower(x,17)-(1.0/19.0)*floatpower(x,19)+(1.0/21.0)*floatpower(x,21)-(1.0/23.0)*floatpower(x,23)+(1.0/25.0)*floatpower(x,25);;
	return float(UNKNOWN);
}

// INI

/*
 * IniAdd
 * IniIntSet
 * IniInt
 * IniSet
 * IniGet
 * IniFloat
 * IniFloatSet
 * IniBool
 * IniBoolSet
 * IniDelete
 * IniIsSet
 */

stock IniAdd(file[],header[],key[],value=1) return IniIntSet(file,header,key,IniInt(file,header,key) + value);
 
stock IniIntSet(file[],header[],key[],value) return IniSet(file,header,key,RetStr(value));

stock IniInt(file[],header[],key[]) return strval(IniGet(file,header,key));

stock IniSet(file[],header[],key[],value[]){
	new bool:infile;
	if(!fexist(file)) fcreate(file);
	frename(file,join(file,".tmp"));
	fcreate(file);
	new File:fh1 = fopen(join(file,".tmp"),io_read),File:fh2 = fopen(file,io_write);
	if(!fh1 || !fh2) return false;
	new temp[256],bool:inheader;
	while(fread(fh1,temp)){
		StripNewLine(temp);
		if(inheader){
			if(temp[0] == '|' && temp[1] == '|' && temp[strlen(temp)] == '|' && temp[strlen(temp)-1] == '|') if(!equal(header,left(right(temp,2),2),false)) inheader = false;
			new p = strfind(temp,"=",true),tmp[256];
			if(p > 0) tmp = left(temp,p);
			if(equal(tmp,key,false)){
				format(temp,sizeof(temp),"%s=%s",key,value);
				infile = true;
				break;
			}
		}
		else{
			if(temp[0] == '|' && temp[1] == '|' && temp[strlen(temp)] == '|' && temp[strlen(temp)-1] == '|') if(equal(header,left(right(temp,2),2),false)) inheader = true;
		}
		fwrite(fh2,join(temp,"\r\n"));
	}
	fclose(fh1);
	fclose(fh2);
	if(!infile){
		inheader = false;
		frename(file,join(file,".tmp"));
		fcreate(file);
		fh1 = fopen(join(file,".tmp"),io_read),fh2 = fopen(file,io_write);
		if(!fh1 || !fh2) return false;
		new bool:fin;
		while(fread(fh1,temp)){
			StripNewLine(temp);
			if(fin == false){
				if(inheader){
					fwrite(fh2,sprintf("%s=%s\r\n",key,value));
					fin = true;
				}
				else{
					if(temp[0] == '|' && temp[1] == '|' && temp[strlen(temp)] == '|' && temp[strlen(temp)-1] == '|') if(equal(header,left(right(temp,2),2),false)) inheader = true;
				}
			}
			fwrite(fh2,join(temp,"\r\n"));
		}
		if(!inheader){
			fwrite(fh2,sprintf("||%s||\r\n",header));
			fwrite(fh2,sprintf("%s=%s\r\n",key,value));
		}
		fclose(fh1);
		fclose(fh2);
	}
	fremove(join(file,".tmp"));
	return true;
}

stock IniGet(file[],header[],key[]){
	new retstr[256];
	if(!fexist(file)) return retstr;
	new File:fhandle = fopen(file,io_readwrite);
	if(!fhandle) return retstr;
	new temp[256],bool:inheader;
	while(fread(fhandle,temp)){
		StripNewLine(temp);
		if(inheader){
			if(temp[0] == '|' && temp[1] == '|' && temp[strlen(temp)] == '|' && temp[strlen(temp)-1] == '|') if(!equal(header,left(right(temp,2),2),false)) inheader = false;
			new p = strfind(temp,"=",true),tmp[256];
			if(p > 0) tmp = left(temp,p);
			if(equal(tmp,key,false)){
				new len = strlen(temp);
				if(p!=-1 && p+1<len) 
				format(retstr,sizeof(retstr),"%s",right(tmp,len-p-1));
				break;
			}
		}
		else{
			if(temp[0] == '|' && temp[1] == '|' && temp[strlen(temp)] == '|' && temp[strlen(temp)-1] == '|') if(equal(header,left(right(temp,2),2),false)) inheader = true;
		}
	}
	fclose(fhandle);
	return retstr;
}

stock Float:IniFloat(file[],header[],key[]) return floatstr(IniGet(file,header,key));

stock IniFloatSet(file[],header[],key[],Float:value) return IniSet(file,header,key,strfloat(value));

stock bool:IniBool(file[],header[],key[]) return bool:strval(InitGet(file,header,key));

stock IniBoolSet(file[],header[],key[],bool:value) return IniSet(file,header,key,RetStr(value));

stock IniDelete(file[],header[],{Float,_}:...){
	if(!fexist(file)) return false;
	frename(file,join(file,".tmp"));
	fcreate(file);
	new File:fh1 = fopen(file,io_write),File:fh2 = fopen(join(file,".tmp"),io_read),num = numargs(),key[64];
	if(num == 3) GetArgString(2,key);
	if(!fh1 || !fh2) return false;
	new temp[256],bool:inheader;
	while(fread(fh2,temp)){
		StripNewLine(temp);
		new bool:dontwrite;
		if(inheader){
			if(temp[0] == '|' && temp[1] == '|' && temp[strlen(temp)] == '|' && temp[strlen(temp)-1] == '|') if(!equal(header,left(right(temp,2),2),false)) inheader = false;
			if(num == 3){
				new p = strfind(temp,"=",true),tmp[256];
				if(p > 0) tmp = left(temp,p);
				if(equal(tmp,key,false)){
					dontwrite = true;
					break;
				}
			}
			else dontwrite = true;
		}
		else{
			if(temp[0] == '|' && temp[1] == '|' && temp[strlen(temp)] == '|' && temp[strlen(temp)-1] == '|') if(equal(header,left(right(temp,2),2),false)) inheader = true;
		}
		if(!dontwrite) fwrite(fh1,join(temp,"\r\n"));
	}	
	fclose(fh1);
	fclose(fh2);
	fremove(fh2);
	return true;
}

stock IniIsSet(file[],header[],key[]){
	if(!fexist(file)) return false;	
	new File:fhandle = fopen(file,io_readwrite);
	if(!fhandle) return false;
	new temp[256],bool:inheader,bool:isset;
	while(fread(fhandle,temp)){
		StripNewLine(temp);
		if(inheader){
			if(temp[0] == '|' && temp[1] == '|' && temp[strlen(temp)] == '|' && temp[strlen(temp)-1] == '|') if(!equal(header,left(right(temp,2),2),false)) inheader = false;
			new p = strfind(temp,"=",true),tmp[256];
			if(p > 0) tmp = left(temp,p);
			if(equal(tmp,key,false)){
				isset = true;
				break;
			}
		}
		else{
			if(temp[0] == '|' && temp[1] == '|' && temp[strlen(temp)] == '|' && temp[strlen(temp)-1] == '|') if(equal(header,left(right(temp,2),2),false)) inheader = true;
		}
	}
	fclose(fhandle);
	return isset;
}

// Zones

/*
 * IsPlayerInZone
 * GetPlayerZone
 * GetZoneName
 */

stock IsPlayerInZone(playerid,zoneid){
	if(PropertyInt(sprintf("P:%d zone",playerid)) != zoneid) return false;
	return true;
}

stock GetPlayerZone(playerid) return PropertyInt(sprintf("P:%d zone",playerid));

stock GetZoneName(zoneid) return zones[zoneid][MAPZONE_NAME];


// Time

/*
 * SetTimer
 * KillTimer
 * GetTickCount
 * SetTimerEx
 * KillTimerEx
 * Wait
 * SetWorldRealTime
 * SetWorldTime
 */

native S_SetTimer(funcname[], interval, repeating) = SetTimer;
native S_KillTimer(timerid) = KillTimer;
native S_GetTickCount() = GetTickCount;
native S_SetWorldTime(hour) = SetWorldTime;

stock SetTimer(funcname[],interval,repeating){
	#if DEBUG == true
		printf("SetTimer(%s,%d,%d)",funcname,interval,repeating);
	#endif
	return S_SetTimer(funcname,interval,repeating);
}

stock KillTimer(timerid){
	#if DEBUG == true
		printf("KillTimer(%d)",timerid);
	#endif
	S_KillTimer(timerid);
}

stock GetTickCount(){
	#if DEBUG == true
		printf("GetTickCount()");
	#endif
	return S_GetTickCount();
}

stock Wait(time){
	new stamp = tickcount();
	while(tickcount() - stamp < time){}
}

public SetWorldRealTime(){
	new hour,minute,second;
	gettime(hour,minute,second);
	SetWorldTime(hour);
}

stock SetWorldTime(hour){
	#if DEBUG == true
		printf("SetWorldTime(%d)",hour);
	#endif
	S_SetWorldTime(hour);
	PropertyIntSet("WorldTime",hour);
}

stock GetWorldTime() return PropertyInt("WorldTime");

#if !defined _ste_included
	#define func0(%1); if (num == 0 && strcmp(str, "%1") == 0) %1();
	#define func1(%1); if (num == 1 && strcmp(str, "%1") == 0) %1(func[0]);
	#define func2(%1); if (num == 2 && strcmp(str, "%1") == 0) %1(func[0], func[1]);
	#define func3(%1); if (num == 3 && strcmp(str, "%1") == 0) %1(func[0], func[1], func[2]);
	#define func4(%1); if (num == 4 && strcmp(str, "%1") == 0) %1(func[0], func[1], func[2], func[3]);
	#define func5(%1); if (num == 4 && strcmp(str, "%1") == 0) %1(func[0], func[1], func[2], func[3], func[4]);
	#define func6(%1); if (num == 4 && strcmp(str, "%1") == 0) %1(func[0], func[1], func[2], func[3], func[4], func[5]);
	#define func7(%1); if (num == 4 && strcmp(str, "%1") == 0) %1(func[0], func[1], func[2], func[3], func[4], func[5], func[6]);
	#define func8(%1); if (num == 4 && strcmp(str, "%1") == 0) %1(func[0], func[1], func[2], func[3], func[4], func[5], func[6], func[7]);
	
	enum timerdat{
		FUNCTION[128],
		TRIGGERED,
		INTERVAL,
		REPEAT,
		NUMPARS,
		PARAMETER[MAX_PARS]
	}
	
	new timers[MAX_TIMERS][2];
	
	public SetTimerEx(...){
		new timerd[MAX_TIMERS][timerdat],numt,na = numargs();
		if(!na){
			new i,j=GetTickCount();
			for(i=0;i<MAX_TIMERS;i++){
				new k = timerd[i][TRIGGERED];
				if(k){
					if(!timers[i][0]){
						timerd[i][TRIGGERED] = 0;
						timerd[i][REPEAT] = 0;
					}
					else if(j - k >= timerd[i][INTERVAL]) break;
				}
			}
			if(i == MAX_TIMERS) return 0;
			FUNCTIONLIST(timerd[i][FUNCTION],timerd[i][NUMPARS],timerd[i][PARAMETER]);
			if(timerd[i][REPEAT] == 1){
				timerd[i][TRIGGERED] = GetTickCount();
				timers[i][1] = SetTimer("SetTimerEx",timerd[i][INTERVAL],0);
			}
			else timerd[i][TRIGGERED] = 0;
		}
		else{
			if(na < 3 || numt == MAX_TIMERS) return 0;
			new str[128],i,j;
			for(i=0;i<sizeof(str);i++){
				j = getarg(0,i);
				if(j != 0) str[i] = j;
				else break;
			}
			for(j=0;j<MAX_TIMERS;j++) if(!timerd[j][TRIGGERED]) break;
			for( ; i; i--) timerd[j][FUNCTION][i-1] = str[i - 1];
			timerd[j][TRIGGERED] = GetTickCount();
			i = getarg(1);
			timerd[j][INTERVAL] = i;
			i = getarg(2);
			timerd[j][REPEAT] = i ? 1 : 0;
			na -= 3;
			timerd[j][NUMPARS] = na;
			for(i=0;i<na && i < MAX_PARS;i++) timerd[j][PARAMETER][i] = getarg(i + 3);
			numt++;
			i = SetTimer("SetTimerEx",timerd[j][INTERVAL],0);
			timers[j][0] = i;
			timers[j][1] = i;
			return i;
		}
		return 0;
	}
	
	stock KillTimerEx(timerid){
		for(new i=0;i<MAX_TIMERS;i++){
			if(timers[i][0] == timerid){
				KillTimer(timers[i][1]);
				timers[i][1] = 0;
				timers[i][0] = 0;
				return true;
			}
		}
		return false;
	}
	
	stock FUNCTIONLIST(str[],num,func[]){
		func1(print);
		func1(SetGameModeText);
		func1(SetTeamCount);
		func1(ShowNameTags);
		func1(ShowPlayerMarkers);
		func0(GameModeExit);
		func1(SetWorldTime);
		func3(SendClientMessage);
		func2(SendClientMessageToAll);
		func3(SendDeathMessage);
		func3(GameTextForAll);
		func4(GameTextForPlayer);
		func1(SpawnPlayer);
		func4(SetPlayerPos);
		func2(SetPlayerScore);
		func2(SetPlayerHealth);
		func2(GivePlayerMoney);
		func2(SetPlayerFacingAngle);
		func1(ResetPlayerMoney);
		func2(SetPlayerMoney);
		func1(wiper);
		func3(SetTimer);
		func1(KillTimer);
		func1(KillTimerEx);
		func2(SetPlayerSkin);
		func2(PropertySet);
		func2(PropertyIntSet);
		func2(PropertyFloatSet);
		func1(RemovePlayerFromVehicle);
		func8(CreateVehicle);
		func4(SetVehiclePos);
		func2(SetVehicleZAngle);
		func4(SetVehicleParamsForPlayer);
		func1(SetVehicleToRespawn);
		func1(ResetPlayerWeapons);
		func3(GivePlayerWeapon);
		func1(Kick);
		func1(Ban);
		func2(SetPlayerColor);
		func1(DisablePlayerCheckpoint);
		func5(SetPlayerCheckpoint);
		func2(SetPlayerInterior);
		func4(SetPlayerCameraPos);
		func4(SetPlayerCameraLookAt);
		func1(SetCameraBehindPlayer);
		func5(PlayerPlaySound);
		func2(fcopy);
		func2(frename);
		func2(SetPlayerTeam);
		func4(GameTextForTeam);
		func4(SetTeamPos);
		func1(KickTeam);
		func1(BanTeam);
		func2(SetPlayerColourAlpha);
		func2(TakePlayerMoney);
		func2(SetTeamScore);
		func2(GiveTeamMoney);
		func3(SendClientMessageToAllOthers);
		func2(Eraser);
		func2(SendClientMessageToAdmins);
		func3(GameTextForAdmins);
		func1(Wait);
		func3(IniAdd);
		func4(IniIntSet);
		func4(IniSet);
		func1(freset);
		func1(fcreate);
		func2(fdeleteline);
		func0(SetWorldRealTime);
		func1(ResetPlayerWorldBounds);
		func1(SetAllColour);
		func2(AddPlayerHealth);
		func1(S_Kick);
		func1(S_Ban);
	}
#endif