daily pastebin goal
57%
SHARE
TWEET

Untitled

a guest Dec 24th, 2018 154 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; <COMPILER: v1.1.29.01>
  2. #IfWinActive GTA:SA:MP
  3. #Persistent
  4. #SingleInstance FORCE
  5. #MaxThreads
  6. #MaxHotkeysPerInterval 200
  7. global ERROR_OK                     := 0
  8. global ERROR_PROCESS_NOT_FOUND      := 1
  9. global ERROR_OPEN_PROCESS           := 2
  10. global ERROR_INVALID_HANDLE         := 3
  11. global ERROR_MODULE_NOT_FOUND       := 4
  12. global ERROR_ENUM_PROCESS_MODULES   := 5
  13. global ERROR_ZONE_NOT_FOUND         := 6
  14. global ERROR_CITY_NOT_FOUND         := 7
  15. global ERROR_READ_MEMORY            := 8
  16. global ERROR_WRITE_MEMORY           := 9
  17. global ERROR_ALLOC_MEMORY           := 10
  18. global ERROR_FREE_MEMORY            := 11
  19. global ERROR_WAIT_FOR_OBJECT        := 12
  20. global ERROR_CREATE_THREAD          := 13
  21. global ADDR_ZONECODE                := 0xA49AD4
  22. global ADDR_POSITION_X              := 0xB6F2E4
  23. global ADDR_POSITION_Y              := 0xB6F2E8
  24. global ADDR_POSITION_Z              := 0xB6F2EC
  25. global ADDR_CPED_PTR                := 0xB6F5F0
  26. global ADDR_CPED_HPOFF              := 0x540
  27. global ADDR_CPED_ARMOROFF           := 0x548
  28. global ADDR_CPED_MONEY              := 0x0B7CE54
  29. global ADDR_CPED_INTID              := 0xA4ACE8
  30. global ADDR_CPED_SKINIDOFF          := 0x22
  31. global ADDR_VEHICLE_PTR             := 0xBA18FC
  32. global ADDR_VEHICLE_HPOFF           := 0x4C0
  33. global ADDR_VEHICLE_DOORSTATE       := 0x4F8
  34. global ADDR_VEHICLE_ENGINESTATE     := 0x428
  35. global ADDR_VEHICLE_LIGHTSTATE      := 0x584
  36. global ADDR_VEHICLE_MODEL           := 0x22
  37. global ADDR_VEHICLE_TYPE            := 0x590
  38. global ADDR_VEHICLE_DRIVER          := 0x460
  39. global ADDR_VEHICLE_X               := 0x44
  40. global ADDR_VEHICLE_Y               := 0x48
  41. global ADDR_VEHICLE_Z               := 0x4C
  42. global oAirplaneModels := [417, 425, 447, 460, 469, 476, 487, 488, 497, 511, 512, 513, 519, 520, 548, 553, 563, 577, 592, 593]
  43. global oBikeModels := [481,509,510]
  44. global ovehicleNames := ["Landstalker","Bravura","Buffalo","Linerunner","Perrenial","Sentinel","Dumper","Firetruck","Trashmaster","Stretch","Manana","Infernus","Voodoo","Pony","Mule","Cheetah","Ambulance","Leviathan","Moonbeam","Esperanto","Taxi","Washington","Bobcat","Whoopee","BFInjection","Hunter","Premier","Enforcer","Securicar","Banshee","Predator","Bus","Rhino","Barracks","Hotknife","Trailer","Previon","Coach","Cabbie","Stallion","Rumpo","RCBandit","Romero","Packer","Monster","Admiral","Squalo","Seasparrow","Pizzaboy","Tram","Trailer","Turismo","Speeder","Reefer","Tropic","Flatbed","Yankee","Caddy","Solair","Berkley'sRCVan","Skimmer","PCJ-600","Faggio","Freeway","RCBaron","RCRaider","Glendale","Oceanic","Sanchez","Sparrow","Patriot","Quad","Coastguard","Dinghy","Hermes","Sabre","Rustler","ZR-350","Walton","Regina","Comet","BMX","Burrito","Camper","Marquis","Baggage","Dozer","Maverick","NewsChopper","Rancher","FBI Rancher","Virgo","Greenwood","Jetmax","Hotring","Sandking","BlistaCompact","Police Maverick","Boxvillde","Benson","Mesa","RCGoblin","HotringRacerA","HotringRacerB","BloodringBanger","Rancher","SuperGT","Elegant","Journey","Bike","MountainBike","Beagle","Cropduster","Stunt","Tanker","Roadtrain","Nebula","Majestic","Buccaneer","Shamal","hydra","FCR-900","NRG-500","HPV1000","CementTruck","TowTruck","Fortune","Cadrona","FBI Truck","Willard","Forklift","Tractor","Combine","Feltzer","Remington","Slamvan","Blade","Freight","Streak","Vortex","Vincent","Bullet","Clover","Sadler","Firetruck","Hustler","Intruder","Primo","Cargobob","Tampa","Sunrise","Merit","Utility","Nevada","Yosemite","Windsor","Monster","Monster","Uranus","Jester","Sultan","Stratum","Elegy","Raindance","RCTiger","Flash","Tahoma","Savanna","Bandito","FreightFlat","StreakCarriage","Kart","Mower","Dune","Sweeper","Broadway","Tornado","AT-400","DFT-30","Huntley","Stafford","BF-400","NewsVan","Tug","Trailer","Emperor","Wayfarer","Euros","Hotdog","Club","FreightBox","Trailer","Andromada","Dodo","RCCam","Launch","PoliceCar","PoliceCar","PoliceCar","Police Ranger","Picador","S.W.A.T","Alpha","Phoenix","GlendaleShit","SadlerShit","Luggage","Luggage","Stairs","Boxville","Tiller","UtilityTrailer"]
  45. global oweaponNames := ["Fist","Brass Knuckles","Golf Club","Nightstick","Knife","Baseball Bat","Shovel","Pool Cue","Katana","Chainsaw","Purple Dildo","Dildo","Vibrator","Silver Vibrator","Flowers","Cane","Grenade","Tear Gas","Molotov Cocktail", "", "", "", "9mm","Silenced 9mm","Desert Eagle","Shotgun","Sawnoff Shotgun","Combat Shotgun","Micro SMG/Uzi","MP5","AK-47","M4","Tec-9","Country Rifle","Sniper Rifle","RPG","HS Rocket","Flamethrower","Minigun","Satchel Charge","Detonator","Spraycan","Fire Extinguisher","Camera","Night Vis Goggles","Thermal Goggles","Parachute"]
  46. global oradiostationNames := ["Playback FM", "K Rose", "K-DST", "Bounce FM", "SF-UR", "Radio Los Santos", "Radio X", "CSR 103.9", "K-JAH West", "Master Sounds 98.3", "WCTR Talk Radio", "User Track Player", "Radio Off"]
  47. global oweatherNames := ["EXTRASUNNY_LA", "SUNNY_LA", "EXTRASUNNY_SMOG_LA", "SUNNY_SMOG_LA", "CLOUDY_LA", "SUNNY_SF", "EXTRASUNNY_SF", "CLOUDY_SF", "RAINY_SF", "FOGGY_SF", "SUNNY_VEGAS", "EXTRASUNNY_VEGAS", "CLOUDY_VEGAS", "EXTRASUNNY_COUNTRYSIDE", "SUNNY_COUNTRYSIDE", "CLOUDY_COUNTRYSIDE", "RAINY_COUNTRYSIDE", "EXTRASUNNY_DESERT", "SUNNY_DESERT", "SANDSTORM_DESERT", "UNDERWATER", "EXTRACOLOURS_1", "EXTRACOLOURS_2"]
  48. global ADDR_SAMP_INCHAT_PTR             := 0x21a10c
  49. global ADDR_SAMP_INCHAT_PTR_OFF         := 0x55
  50. global ADDR_SAMP_USERNAME               := 0x219A6F
  51. global FUNC_SAMP_SENDCMD                := 0x65c60
  52. global FUNC_SAMP_SENDSAY                := 0x57f0
  53. global FUNC_SAMP_ADDTOCHATWND           := 0x64520
  54. global ADDR_SAMP_CHATMSG_PTR            := 0x21a0e4
  55. global FUNC_SAMP_SHOWGAMETEXT           := 0x9c2c0
  56. global FUNC_SAMP_PLAYAUDIOSTR           := 0x62da0
  57. global FUNC_SAMP_STOPAUDIOSTR           := 0x629a0
  58. global DIALOG_STYLE_MSGBOX          := 0
  59. global DIALOG_STYLE_INPUT           := 1
  60. global DIALOG_STYLE_LIST            := 2
  61. global DIALOG_STYLE_PASSWORD        := 3
  62. global DIALOG_STYLE_TABLIST         := 4
  63. global DIALOG_STYLE_TABLIST_HEADERS := 5
  64. global SAMP_DIALOG_STRUCT_PTR                   := 0x21A0B8
  65. global SAMP_DIALOG_PTR1_OFFSET              := 0x1C
  66. global SAMP_DIALOG_LINES_OFFSET             := 0x44C
  67. global SAMP_DIALOG_INDEX_OFFSET             := 0x443
  68. global SAMP_DIALOG_BUTTON_HOVERING_OFFSET   := 0x465
  69. global SAMP_DIALOG_BUTTON_CLICKED_OFFSET    := 0x466
  70. global SAMP_DIALOG_PTR2_OFFSET              := 0x20
  71. global SAMP_DIALOG_LINECOUNT_OFFSET         := 0x150
  72. global SAMP_DIALOG_OPEN_OFFSET              := 0x28
  73. global SAMP_DIALOG_STYLE_OFFSET             := 0x2C
  74. global SAMP_DIALOG_ID_OFFSET                := 0x30
  75. global SAMP_DIALOG_TEXT_PTR_OFFSET          := 0x34
  76. global SAMP_DIALOG_CAPTION_OFFSET           := 0x40
  77. global FUNC_SAMP_SHOWDIALOG                 := 0x6B9C0
  78. global FUNC_SAMP_CLOSEDIALOG                := 0x6C040
  79. global SAMP_DIALOG_TEXT                     := 0x12D8F8
  80. global SAMP_DIALOG_SHOW                     := 0x28
  81. global SAMP_DIALOG_ID                       := 0x30
  82. global SAMP_CHAT_SHOW                       := 0x21A0E8
  83. global FUNC_UPDATESCOREBOARD                := 0x8A10
  84. global SAMP_INFO_OFFSET                     := 0x21A0F8
  85. global ADDR_SAMP_CRASHREPORT                := 0x5CF2C
  86. global SAMP_PPOOLS_OFFSET                   := 0x3CD
  87. global SAMP_PPOOL_PLAYER_OFFSET             := 0x18
  88. global SAMP_SLOCALPLAYERID_OFFSET           := 0x4
  89. global SAMP_ISTRLEN_LOCALPLAYERNAME_OFFSET  := 0x1A
  90. global SAMP_SZLOCALPLAYERNAME_OFFSET        := 0xA
  91. global SAMP_PSZLOCALPLAYERNAME_OFFSET       := 0xA
  92. global SAMP_PREMOTEPLAYER_OFFSET            := 0x2E
  93. global SAMP_ISTRLENNAME___OFFSET            := 0x1C
  94. global SAMP_SZPLAYERNAME_OFFSET             := 0xC
  95. global SAMP_PSZPLAYERNAME_OFFSET            := 0xC
  96. global SAMP_ILOCALPLAYERPING_OFFSET         := 0x26
  97. global SAMP_ILOCALPLAYERSCORE_OFFSET        := 0x2A
  98. global SAMP_IPING_OFFSET                    := 0x28
  99. global SAMP_ISCORE_OFFSET                   := 0x24
  100. global SAMP_ISNPC_OFFSET                    := 0x4
  101. global SAMP_PLAYER_MAX                      := 1004
  102. global CheckpointCheck                      := 0xC7DEEA
  103. global rmaddrs                              := [0xC7DEC8, 0xC7DECC, 0xC7DED0]
  104. global SIZE_SAMP_CHATMSG := 0xFC
  105. global hGTA := 0x0
  106. global dwGTAPID := 0x0
  107. global dwSAMP := 0x0
  108. global pMemory := 0x0
  109. global pParam1 := 0x0
  110. global pParam2 := 0x0
  111. global pParam3 := 0x0
  112. global pParam4                         := 0x0
  113. global pParam5                         := 0x0
  114. global pInjectFunc := 0x0
  115. global nZone := 1
  116. global nCity := 1
  117. global bInitZaC := 0
  118. global iRefreshScoreboard := 0
  119. global oScoreboardData := ""
  120. global iRefreshHandles := 0
  121. global iUpdateTick := 2500
  122. IsChatActive() {
  123.     if(!checkHandles())
  124.     return -1
  125.     dwInputInfo := readDWORD(hGTA, dwSAMP + SAMP_CHAT_SHOW)
  126.     dwInputBox := readDWORD(hGTA, dwInputInfo + 8)
  127.     byteChatActive := readMem(hGTA, dwInputBox + 4, 1)
  128.     if(ErrorLevel) {
  129.         ErrorLevel := ERROR_READ_MEMORY
  130.         return -1
  131.     }
  132.     return byteChatActive
  133. }
  134. ClearTextDialog() {
  135.     if(!checkHandles())
  136.     return ""
  137.     dwAddress := dwSAMP + SAMP_DIALOG_TEXT
  138.     sUsername := writeString(hGTA, dwAddress, "")
  139.     if(ErrorLevel) {
  140.         ErrorLevel := ERROR_READ_MEMORY
  141.         return ""
  142.     }
  143.     ErrorLevel := ERROR_OK
  144.     return sUsername
  145. }
  146. GetChatText() {
  147.     if(!checkHandles())
  148.     return -1
  149.     dwAddress := dwSAMP + SAMP_DIALOG_TEXT
  150.     sUsername := readString(hGTA, dwAddress, 256)
  151.     if(ErrorLevel) {
  152.         ErrorLevel := ERROR_READ_MEMORY
  153.         return -2
  154.     }
  155.     ErrorLevel := ERROR_OK
  156.     return sUsername
  157. }
  158. IsSAMPAvailable() {
  159.     if(!checkHandles())
  160.     return false
  161.     dwChatInfo := readDWORD(hGTA, dwSAMP + ADDR_SAMP_CHATMSG_PTR)
  162.     if(dwChatInfo == 0 || dwChatInfo == "ERROR")
  163.     {
  164.         return false
  165.     }
  166.     else
  167.     {
  168.         return true
  169.     }
  170. }
  171. isInChat() {
  172.     if(!checkHandles())
  173.     return -1
  174.     dwPtr := dwSAMP + ADDR_SAMP_INCHAT_PTR
  175.     dwAddress := readDWORD(hGTA, dwPtr) + ADDR_SAMP_INCHAT_PTR_OFF
  176.     if(ErrorLevel) {
  177.         ErrorLevel := ERROR_READ_MEMORY
  178.         return -1
  179.     }
  180.     dwInChat := readDWORD(hGTA, dwAddress)
  181.     if(ErrorLevel) {
  182.         ErrorLevel := ERROR_READ_MEMORY
  183.         return -1
  184.     }
  185.     ErrorLevel := ERROR_OK
  186.     if(dwInChat > 0) {
  187.         return true
  188.     } else {
  189.         return false
  190.     }
  191. }
  192. getUsername() {
  193.     if(!checkHandles())
  194.     return ""
  195.     dwAddress := dwSAMP + ADDR_SAMP_USERNAME
  196.     sUsername := readString(hGTA, dwAddress, 25)
  197.     if(ErrorLevel) {
  198.         ErrorLevel := ERROR_READ_MEMORY
  199.         return ""
  200.     }
  201.     ErrorLevel := ERROR_OK
  202.     return sUsername
  203. }
  204. getId() {
  205.     s:=getUsername()
  206.     return getPlayerIdByName(s)
  207. }
  208. SendChat(wText) {
  209.     wText := "" wText
  210.     if(!checkHandles())
  211.     return false
  212.     dwFunc:=0
  213.     if(SubStr(wText, 1, 1) == "/") {
  214.         dwFunc := dwSAMP + FUNC_SAMP_SENDCMD
  215.     } else {
  216.         dwFunc := dwSAMP + FUNC_SAMP_SENDSAY
  217.     }
  218.     callWithParams(hGTA, dwFunc, [["s", wText]], false)
  219.     ErrorLevel := ERROR_OK
  220.     return true
  221. }
  222. addChatMessage(text,color=0xffffffff) {
  223.     if(!checkHandles())
  224.     return false
  225.     dwFunc := dwSAMP + 0x64010
  226.     dwAddress := readDWORD(hGTA, dwSAMP + 0x21A0E4)
  227.     if(ErrorLevel || dwAddress==0) {
  228.         ErrorLevel := ERROR_READ_MEMORY
  229.         return false
  230.     }
  231.     callWithParamsforaddToChatWindow(hGTA, dwFunc, [["i", dwAddress],["i", 8],["s", text],["i", 0],["i", color],["i", 0]], false, true)
  232.     ErrorLevel := ERROR_OK
  233.     return true
  234. }
  235. showGameText(wText, dwTime, dwSize) {
  236.     wText := "" wText
  237.     dwTime += 0
  238.     dwTime := Floor(dwTime)
  239.     dwSize += 0
  240.     dwSize := Floor(dwSize)
  241.     if(!checkHandles())
  242.     return false
  243.     dwFunc := dwSAMP + FUNC_SAMP_SHOWGAMETEXT
  244.     callWithParams(hGTA, dwFunc, [["s", wText], ["i", dwTime], ["i", dwSize]], false)
  245.     ErrorLevel := ERROR_OK
  246.     return true
  247. }
  248. playAudioStream(wUrl) {
  249.     wUrl := "" wUrl
  250.     if(!checkHandles())
  251.     return false
  252.     dwFunc := dwSAMP + FUNC_SAMP_PLAYAUDIOSTR
  253.     patchRadio()
  254.     callWithParams(hGTA, dwFunc, [["s", wUrl], ["i", 0], ["i", 0], ["i", 0], ["i", 0], ["i", 0]], false)
  255.     unPatchRadio()
  256.     ErrorLevel := ERROR_OK
  257.     return true
  258. }
  259. stopAudioStream() {
  260.     if(!checkHandles())
  261.     return false
  262.     dwFunc := dwSAMP + FUNC_SAMP_STOPAUDIOSTR
  263.     patchRadio()
  264.     callWithParams(hGTA, dwFunc, [["i", 1]], false)
  265.     unPatchRadio()
  266.     ErrorLevel := ERROR_OK
  267.     return true
  268. }
  269. patchRadio()
  270. {
  271.     if(!checkHandles())
  272.     return false
  273.     VarSetCapacity(nop, 4, 0)
  274.     NumPut(0x90909090,nop,0,"UInt")
  275.     dwFunc := dwSAMP + FUNC_SAMP_PLAYAUDIOSTR
  276.     writeRaw(hGTA, dwFunc, &nop, 4)
  277.     writeRaw(hGTA, dwFunc+4, &nop, 1)
  278.     dwFunc := dwSAMP + FUNC_SAMP_STOPAUDIOSTR
  279.     writeRaw(hGTA, dwFunc, &nop, 4)
  280.     writeRaw(hGTA, dwFunc+4, &nop, 1)
  281.     return true
  282. }
  283. unPatchRadio()
  284. {
  285.     if(!checkHandles())
  286.     return false
  287.     VarSetCapacity(old, 4, 0)
  288.     dwFunc := dwSAMP + FUNC_SAMP_PLAYAUDIOSTR
  289.     NumPut(0x74003980,old,0,"UInt")
  290.     writeRaw(hGTA, dwFunc, &old, 4)
  291.     NumPut(0x39,old,0,"UChar")
  292.     writeRaw(hGTA, dwFunc+4, &old, 1)
  293.     dwFunc := dwSAMP + FUNC_SAMP_STOPAUDIOSTR
  294.     NumPut(0x74003980,old,0,"UInt")
  295.     writeRaw(hGTA, dwFunc, &old, 4)
  296.     NumPut(0x09,old,0,"UChar")
  297.     writeRaw(hGTA, dwFunc+4, &old, 1)
  298.     return true
  299. }
  300. blockChatInput() {
  301.     if(!checkHandles())
  302.     return false
  303.     VarSetCapacity(nop, 2, 0)
  304.     dwFunc := dwSAMP + FUNC_SAMP_SENDSAY
  305.     NumPut(0x04C2,nop,0,"Short")
  306.     writeRaw(hGTA, dwFunc, &nop, 2)
  307.     dwFunc := dwSAMP + FUNC_SAMP_SENDCMD
  308.     writeRaw(hGTA, dwFunc, &nop, 2)
  309.     return true
  310. }
  311. unBlockChatInput() {
  312.     if(!checkHandles())
  313.     return false
  314.     VarSetCapacity(nop, 2, 0)
  315.     dwFunc := dwSAMP + FUNC_SAMP_SENDSAY
  316.     NumPut(0xA164,nop,0,"Short")
  317.     writeRaw(hGTA, dwFunc, &nop, 2)
  318.     dwFunc := dwSAMP + FUNC_SAMP_SENDCMD
  319.     writeRaw(hGTA, dwFunc, &nop, 2)
  320.     return true
  321. }
  322. getServerName() {
  323.     if(!checkHandles())
  324.     return -1
  325.     dwAdress := readMem(hGTA, dwSAMP + 0x21A0F8, 4, "int")
  326.     if(ErrorLevel) {
  327.         ErrorLevel := ERROR_READ_MEMORY
  328.         return -1
  329.     }
  330.     if(!dwAdress)
  331.     return -1
  332.     ServerName := readString(hGTA, dwAdress + 0x121, 200)
  333.     if(ErrorLevel) {
  334.         ErrorLevel := ERROR_READ_MEMORY
  335.         return -1
  336.     }
  337.     ErrorLevel := ERROR_OK
  338.     return ServerName
  339. }
  340. getServerIP() {
  341.     if(!checkHandles())
  342.     return -1
  343.     dwAdress := readMem(hGTA, dwSAMP + 0x21A0F8, 4, "int")
  344.     if(ErrorLevel) {
  345.         ErrorLevel := ERROR_READ_MEMORY
  346.         return -1
  347.     }
  348.     if(!dwAdress)
  349.     return -1
  350.     ServerIP := readString(hGTA, dwAdress + 0x20, 100)
  351.     if(ErrorLevel) {
  352.         ErrorLevel := ERROR_READ_MEMORY
  353.         return -1
  354.     }
  355.     ErrorLevel := ERROR_OK
  356.     return ServerIP
  357. }
  358. getServerPort() {
  359.     if(!checkHandles())
  360.     return -1
  361.     dwAdress := readMem(hGTA, dwSAMP + 0x21A0F8, 4, "int")
  362.     if(ErrorLevel) {
  363.         ErrorLevel := ERROR_READ_MEMORY
  364.         return -1
  365.     }
  366.     if(!dwAdress)
  367.     return -1
  368.     ServerPort := readMem(hGTA, dwAdress + 0x225, 4, "int")
  369.     if(ErrorLevel) {
  370.         ErrorLevel := ERROR_READ_MEMORY
  371.         return -1
  372.     }
  373.     ErrorLevel := ERROR_OK
  374.     return ServerPort
  375. }
  376. getWeatherID() {
  377.     if(!checkHandles())
  378.     return -1
  379.     dwGTA := getModuleBaseAddress("gta_sa.exe", hGTA)
  380.     WeatherID := readMem(hGTA, dwGTA + 0xC81320, 2, "byte")
  381.     if(ErrorLevel) {
  382.         ErrorLevel := ERROR_READ_MEMORY
  383.         return -1
  384.     }
  385.     ErrorLevel := ERROR_OK
  386.     return WeatherID
  387. }
  388. getWeatherName() {
  389.     if(isPlayerInAnyVehicle() == 0)
  390.     return -1
  391.     if(id >= 0 && id < 23)
  392.     {
  393.         return oweatherNames[id-1]
  394.     }
  395.     return ""
  396. }
  397. getTargetPed() {
  398.     if(!checkHandles())
  399.     return 0
  400.     dwAddress := readDWORD(hGTA, 0xB6F3B8)
  401.     if(ErrorLevel) {
  402.         ErrorLevel := ERROR_READ_MEMORY
  403.         return 0
  404.     }
  405.     if(!dwAddress)
  406.     return 0
  407.     dwAddress := readDWORD(hGTA, dwAddress+0x79C)
  408.     if(ErrorLevel) {
  409.         ErrorLevel := ERROR_READ_MEMORY
  410.         return 0
  411.     }
  412.     ErrorLevel := ERROR_OK
  413.     return dwAddress
  414. }
  415. calcScreenCoors(fX,fY,fZ)
  416. {
  417.     if(!checkHandles())
  418.     return false
  419.     dwM := 0xB6FA2C
  420.     m_11 := readFloat(hGTA, dwM + 0*4)
  421.     if(ErrorLevel) {
  422.         ErrorLevel := ERROR_READ_MEMORY
  423.         return false
  424.     }
  425.     m_12 := readFloat(hGTA, dwM + 1*4)
  426.     m_13 := readFloat(hGTA, dwM + 2*4)
  427.     m_21 := readFloat(hGTA, dwM + 4*4)
  428.     m_22 := readFloat(hGTA, dwM + 5*4)
  429.     m_23 := readFloat(hGTA, dwM + 6*4)
  430.     m_31 := readFloat(hGTA, dwM + 8*4)
  431.     m_32 := readFloat(hGTA, dwM + 9*4)
  432.     m_33 := readFloat(hGTA, dwM + 10*4)
  433.     m_41 := readFloat(hGTA, dwM + 12*4)
  434.     m_42 := readFloat(hGTA, dwM + 13*4)
  435.     m_43 := readFloat(hGTA, dwM + 14*4)
  436.     dwLenX := readDWORD(hGTA, 0xC17044)
  437.     if(ErrorLevel) {
  438.         ErrorLevel := ERROR_READ_MEMORY
  439.         return false
  440.     }
  441.     dwLenY := readDWORD(hGTA, 0xC17048)
  442.     frX := fZ * m_31 + fY * m_21 + fX * m_11 + m_41
  443.     frY := fZ * m_32 + fY * m_22 + fX * m_12 + m_42
  444.     frZ := fZ * m_33 + fY * m_23 + fX * m_13 + m_43
  445.     fRecip := 1.0/frZ
  446.     frX *= fRecip * dwLenX
  447.     frY *= fRecip * dwLenY
  448.     if(frX<=dwLenX && frY<=dwLenY && frZ>1)
  449.     return [frX,frY,frZ]
  450. }
  451. getPedById(dwId) {
  452.     dwId += 0
  453.     dwId := Floor(dwId)
  454.     if(dwId < 0 || dwId >= SAMP_PLAYER_MAX)
  455.     return 0
  456.     if(iRefreshScoreboard+iUpdateTick > A_TickCount)
  457.     {
  458.         if(oScoreboardData[dwId])
  459.         {
  460.             if(oScoreboardData[dwId].HasKey("PED"))
  461.             return oScoreboardData[dwId].PED
  462.         }
  463.         return 0
  464.     }
  465.     if(!updateOScoreboardData())
  466.     return 0
  467.     if(oScoreboardData[dwId])
  468.     {
  469.         if(oScoreboardData[dwId].HasKey("PED"))
  470.         return oScoreboardData[dwId].PED
  471.     }
  472.     return 0
  473. }
  474. getIdByPed(dwPed) {
  475.     dwPed += 0
  476.     dwPed := Floor(dwPed)
  477.     if(!dwPed)
  478.     return -1
  479.     if(iRefreshScoreboard+iUpdateTick > A_TickCount)
  480.     {
  481.         For i, o in oScoreboardData
  482.         {
  483.             if(o.HasKey("PED"))
  484.             {
  485.                 if(o.PED==dwPed)
  486.                 return i
  487.             }
  488.         }
  489.         return -1
  490.     }
  491.     if(!updateOScoreboardData())
  492.     return -1
  493.     For i, o in oScoreboardData
  494.     {
  495.         if(o.HasKey("PED"))
  496.         {
  497.             if(o.PED==dwPed)
  498.             return i
  499.         }
  500.     }
  501.     return -1
  502. }
  503. getStreamedInPlayersInfo() {
  504.     r:=[]
  505.     if(iRefreshScoreboard+iUpdateTick > A_TickCount)
  506.     {
  507.         For i, o in oScoreboardData
  508.         {
  509.             if(o.HasKey("PED"))
  510.             {
  511.                 p := getPedCoordinates(o.PED)
  512.                 if(p)
  513.                 {
  514.                     o.POS := p
  515.                     r[i] := o
  516.                 }
  517.             }
  518.         }
  519.         return r
  520.     }
  521.     if(!updateOScoreboardData())
  522.     return ""
  523.     For i, o in oScoreboardData
  524.     {
  525.         if(o.HasKey("PED"))
  526.         {
  527.             p := getPedCoordinates(o.PED)
  528.             if(p)
  529.             {
  530.                 o.POS := p
  531.                 r[i] := o
  532.             }
  533.         }
  534.     }
  535.     return r
  536. }
  537. callFuncForAllStreamedInPlayers(cfunc,dist=0x7fffffff) {
  538.     cfunc := "" cfunc
  539.     dist += 0
  540.     if(!IsFunc(cfunc))
  541.     return false
  542.     p := getStreamedInPlayersInfo()
  543.     if(!p)
  544.     return false
  545.     if(dist<0x7fffffff)
  546.     {
  547.         lpos := getCoordinates()
  548.         if(!lpos)
  549.         return false
  550.         For i, o in p
  551.         {
  552.             if(dist>getDist(lpos,o.POS))
  553.             %cfunc%(o)
  554.         }
  555.     }
  556.     else
  557.     {
  558.         For i, o in p
  559.         %cfunc%(o)
  560.     }
  561.     return true
  562. }
  563. getDist(pos1,pos2) {
  564.     if(!pos1 || !pos2)
  565.     return 0
  566.     return Sqrt((pos1[1]-pos2[1])*(pos1[1]-pos2[1])+(pos1[2]-pos2[2])*(pos1[2]-pos2[2])+(pos1[3]-pos2[3])*(pos1[3]-pos2[3]))
  567. }
  568. getClosestPlayerPed() {
  569.     dist := 0x7fffffff
  570.     p := getStreamedInPlayersInfo()
  571.     if(!p)
  572.     return -1
  573.     lpos := getCoordinates()
  574.     if(!lpos)
  575.     return -1
  576.     id := -1
  577.     For i, o in p
  578.     {
  579.         t:=getDist(lpos,o.POS)
  580.         if(t<dist)
  581.         {
  582.             dist := t
  583.             id := i
  584.         }
  585.     }
  586.     PED := getPedById(id)
  587.     return PED
  588. }
  589. getClosestPlayerId() {
  590.     dist := 0x7fffffff
  591.     p := getStreamedInPlayersInfo()
  592.     if(!p)
  593.     return -1
  594.     lpos := getCoordinates()
  595.     if(!lpos)
  596.     return -1
  597.     id := -1
  598.     For i, o in p
  599.     {
  600.         t:=getDist(lpos,o.POS)
  601.         if(t<dist)
  602.         {
  603.             dist := t
  604.             id := i
  605.         }
  606.     }
  607.     return id
  608. }
  609. CountOnlinePlayers() {
  610.     if(!checkHandles())
  611.     return -1
  612.     dwOnline := readDWORD(hGTA, dwSAMP + 0x21A0B4)
  613.     if(ErrorLevel) {
  614.         ErrorLevel := ERROR_READ_MEMORY
  615.         return -1
  616.     }
  617.     dwAddr := dwOnline + 0x4
  618.     OnlinePlayers := readDWORD(hGTA, dwAddr)
  619.     if(ErrorLevel) {
  620.         ErrorLevel := ERROR_READ_MEMORY
  621.         return -1
  622.     }
  623.     ErrorLevel := ERROR_OK
  624.     return OnlinePlayers
  625. }
  626. getPedCoordinates(dwPED) {
  627.     dwPED += 0
  628.     dwPED := Floor(dwPED)
  629.     if(!dwPED)
  630.     return ""
  631.     if(!checkHandles())
  632.     return ""
  633.     dwAddress := readDWORD(hGTA, dwPED + 0x14)
  634.     if(ErrorLevel || dwAddress==0) {
  635.         ErrorLevel := ERROR_READ_MEMORY
  636.         return ""
  637.     }
  638.     fX := readFloat(hGTA, dwAddress + 0x30)
  639.     if(ErrorLevel) {
  640.         ErrorLevel := ERROR_READ_MEMORY
  641.         return ""
  642.     }
  643.     fY := readFloat(hGTA, dwAddress + 0x34)
  644.     if(ErrorLevel) {
  645.         ErrorLevel := ERROR_READ_MEMORY
  646.         return ""
  647.     }
  648.     fZ := readFloat(hGTA, dwAddress + 0x38)
  649.     if(ErrorLevel) {
  650.         ErrorLevel := ERROR_READ_MEMORY
  651.         return ""
  652.     }
  653.     ErrorLevel := ERROR_OK
  654.     return [fX, fY, fZ]
  655. }
  656. getTargetPos(dwId) {
  657.     dwId += 0
  658.     dwId := Floor(dwId)
  659.     if(dwId < 0 || dwId >= SAMP_PLAYER_MAX)
  660.     return ""
  661.     if(iRefreshScoreboard+iUpdateTick > A_TickCount)
  662.     {
  663.         if(oScoreboardData[dwId])
  664.         {
  665.             if(oScoreboardData[dwId].HasKey("PED"))
  666.             return getPedCoordinates(oScoreboardData[dwId].PED)
  667.             if(oScoreboardData[dwId].HasKey("MPOS"))
  668.             return oScoreboardData[dwId].MPOS
  669.         }
  670.         return ""
  671.     }
  672.     if(!updateOScoreboardData())
  673.     return ""
  674.     if(oScoreboardData[dwId])
  675.     {
  676.         if(oScoreboardData[dwId].HasKey("PED"))
  677.         return getPedCoordinates(oScoreboardData[dwId].PED)
  678.         if(oScoreboardData[dwId].HasKey("MPOS"))
  679.         return oScoreboardData[dwId].MPOS
  680.     }
  681.     return ""
  682. }
  683. getTargetPlayerSkinIdByPed(dwPED) {
  684.     if(!checkHandles())
  685.     return -1
  686.     dwAddr := dwPED + ADDR_CPED_SKINIDOFF
  687.     SkinID := readMem(hGTA, dwAddr, 2, "byte")
  688.     if(ErrorLevel) {
  689.         ErrorLevel := ERROR_READ_MEMORY
  690.         return -1
  691.     }
  692.     ErrorLevel := ERROR_OK
  693.     return SkinID
  694. }
  695. getTargetPlayerSkinIdById(dwId) {
  696.     if(!checkHandles())
  697.     return -1
  698.     dwPED := getPedById(dwId)
  699.     dwAddr := dwPED + ADDR_CPED_SKINIDOFF
  700.     SkinID := readMem(hGTA, dwAddr, 2, "byte")
  701.     if(ErrorLevel) {
  702.         ErrorLevel := ERROR_READ_MEMORY
  703.         return -1
  704.     }
  705.     ErrorLevel := ERROR_OK
  706.     return SkinID
  707. }
  708. getVehiclePointerByPed(dwPED) {
  709.     dwPED += 0
  710.     dwPED := Floor(dwPED)
  711.     if(!dwPED)
  712.     return 0
  713.     if(!checkHandles())
  714.     return 0
  715.     dwAddress := readDWORD(hGTA, dwPED + 0x58C)
  716.     if(ErrorLevel) {
  717.         ErrorLevel := ERROR_READ_MEMORY
  718.         return 0
  719.     }
  720.     ErrorLevel := ERROR_OK
  721.     return dwAddress
  722. }
  723. getVehiclePointerById(dwId) {
  724.     if(!dwId)
  725.     return 0
  726.     if(!checkHandles())
  727.     return 0
  728.     dwPed_By_Id := getPedById(dwId)
  729.     dwAddress := readDWORD(hGTA, dwPed_By_Id + 0x58C)
  730.     if(ErrorLevel) {
  731.         ErrorLevel := ERROR_READ_MEMORY
  732.         return 0
  733.     }
  734.     ErrorLevel := ERROR_OK
  735.     return dwAddress
  736. }
  737. isTargetInAnyVehicleByPed(dwPED)
  738. {
  739.     if(!checkHandles())
  740.     return -1
  741.     dwVehiclePointer := getVehiclePointerByPed(dwPedPointer)
  742.     if(dwVehiclePointer > 0)
  743.     {
  744.         return 1
  745.     }
  746.     else if(dwVehiclePointer <= 0)
  747.     {
  748.         return 0
  749.     }
  750.     else
  751.     {
  752.         return -1
  753.     }
  754. }
  755. isTargetInAnyVehiclebyId(dwId)
  756. {
  757.     if(!checkHandles())
  758.     return -1
  759.     dwPedPointer := getPedById(dwId)
  760.     dwVehiclePointer := getVehiclePointerByPed(dwPedPointer)
  761.     if(dwVehiclePointer > 0)
  762.     {
  763.         return 1
  764.     }
  765.     else if(dwVehiclePointer <= 0)
  766.     {
  767.         return 0
  768.     }
  769.     else
  770.     {
  771.         return -1
  772.     }
  773. }
  774. getTargetVehicleHealthByPed(dwPed) {
  775.     if(!checkHandles())
  776.     return -1
  777.     dwVehPtr := getVehiclePointerByPed(dwPed)
  778.     dwAddr := dwVehPtr + ADDR_VEHICLE_HPOFF
  779.     fHealth := readFloat(hGTA, dwAddr)
  780.     if(ErrorLevel) {
  781.         ErrorLevel := ERROR_READ_MEMORY
  782.         return -1
  783.     }
  784.     ErrorLevel := ERROR_OK
  785.     return Round(fHealth)
  786. }
  787. getTargetVehicleHealthById(dwId) {
  788.     if(!checkHandles())
  789.     return -1
  790.     dwVehPtr := getVehiclePointerById(dwId)
  791.     dwAddr := dwVehPtr + ADDR_VEHICLE_HPOFF
  792.     fHealth := readFloat(hGTA, dwAddr)
  793.     if(ErrorLevel) {
  794.         ErrorLevel := ERROR_READ_MEMORY
  795.         return -1
  796.     }
  797.     ErrorLevel := ERROR_OK
  798.     return Round(fHealth)
  799. }
  800. getTargetVehicleTypeByPed(dwPED) {
  801.     if(!checkHandles())
  802.     return 0
  803.     dwAddr := getVehiclePointerByPed(dwPED)
  804.     if(!dwAddr)
  805.     return 0
  806.     cVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_TYPE, 1, "Char")
  807.     if(ErrorLevel) {
  808.         ErrorLevel := ERROR_READ_MEMORY
  809.         return 0
  810.     }
  811.     ErrorLevel := ERROR_OK
  812.     if(!cVal)
  813.     {
  814.         mid := getVehicleModelId()
  815.         Loop % oAirplaneModels.MaxIndex()
  816.         {
  817.             if(oAirplaneModels[A_Index]==mid)
  818.             return 5
  819.         }
  820.         return 1
  821.     }
  822.     else if(cVal==5)
  823.     return 2
  824.     else if(cVal==6)
  825.     return 3
  826.     else if(cVal==9)
  827.     {
  828.         mid := getVehicleModelId()
  829.         Loop % oBikeModels.MaxIndex()
  830.         {
  831.             if(oBikeModels[A_Index]==mid)
  832.             return 6
  833.         }
  834.         return 4
  835.     }
  836.     return 0
  837. }
  838. getTargetVehicleTypeById(dwId) {
  839.     if(!checkHandles())
  840.     return 0
  841.     dwAddr := getVehiclePointerById(dwId)
  842.     if(!dwAddr)
  843.     return 0
  844.     cVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_TYPE, 1, "Char")
  845.     if(ErrorLevel) {
  846.         ErrorLevel := ERROR_READ_MEMORY
  847.         return 0
  848.     }
  849.     ErrorLevel := ERROR_OK
  850.     if(!cVal)
  851.     {
  852.         mid := getVehicleModelId()
  853.         Loop % oAirplaneModels.MaxIndex()
  854.         {
  855.             if(oAirplaneModels[A_Index]==mid)
  856.             return 5
  857.         }
  858.         return 1
  859.     }
  860.     else if(cVal==5)
  861.     return 2
  862.     else if(cVal==6)
  863.     return 3
  864.     else if(cVal==9)
  865.     {
  866.         mid := getVehicleModelId()
  867.         Loop % oBikeModels.MaxIndex()
  868.         {
  869.             if(oBikeModels[A_Index]==mid)
  870.             return 6
  871.         }
  872.         return 4
  873.     }
  874.     return 0
  875. }
  876. getTargetVehicleModelIdByPed(dwPED) {
  877.     if(!checkHandles())
  878.     return 0
  879.     dwAddr := getVehiclePointerByPed(dwPED)
  880.     if(!dwAddr)
  881.     return 0
  882.     sVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_MODEL, 2, "Short")
  883.     if(ErrorLevel) {
  884.         ErrorLevel := ERROR_READ_MEMORY
  885.         return 0
  886.     }
  887.     ErrorLevel := ERROR_OK
  888.     return sVal
  889. }
  890. getTargetVehicleModelIdById(dwId) {
  891.     if(!checkHandles())
  892.     return 0
  893.     dwAddr := getVehiclePointerById(dwId)
  894.     if(!dwAddr)
  895.     return 0
  896.     sVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_MODEL, 2, "Short")
  897.     if(ErrorLevel) {
  898.         ErrorLevel := ERROR_READ_MEMORY
  899.         return 0
  900.     }
  901.     ErrorLevel := ERROR_OK
  902.     return sVal
  903. }
  904. getTargetVehicleModelNameByPed(dwPED) {
  905.     id := getTargetVehicleModelIdByPed(dwPED)
  906.     if(id > 400 && id < 611)
  907.     {
  908.         return ovehicleNames[id-399]
  909.     }
  910.     return ""
  911. }
  912. getTargetVehicleModelNameById(dwId) {
  913.     id := getTargetVehicleModelIdById(dwId)
  914.     if(id > 400 && id < 611)
  915.     {
  916.         return ovehicleNames[id-399]
  917.     }
  918.     return ""
  919. }
  920. getTargetVehicleLightStateByPed(dwPED) {
  921.     if(!checkHandles())
  922.     return -1
  923.     dwAddr := getVehiclePointerByPed(dwPED)
  924.     if(!dwAddr)
  925.     return -1
  926.     dwVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_LIGHTSTATE, 4, "Int")
  927.     if(ErrorLevel) {
  928.         ErrorLevel := ERROR_READ_MEMORY
  929.         return -1
  930.     }
  931.     ErrorLevel := ERROR_OK
  932.     return (dwVal>0)
  933. }
  934. getTargetVehicleLightStateById(dwId) {
  935.     if(!checkHandles())
  936.     return -1
  937.     dwAddr := getVehiclePointerById(dwId)
  938.     if(!dwAddr)
  939.     return -1
  940.     dwVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_LIGHTSTATE, 4, "Int")
  941.     if(ErrorLevel) {
  942.         ErrorLevel := ERROR_READ_MEMORY
  943.         return -1
  944.     }
  945.     ErrorLevel := ERROR_OK
  946.     return (dwVal>0)
  947. }
  948. getTargetVehicleLockStateByPed(dwPED) {
  949.     if(!checkHandles())
  950.     return -1
  951.     dwAddr := getVehiclePointerByPed(dwPED)
  952.     if(!dwAddr)
  953.     return -1
  954.     dwVal := readDWORD(hGTA, dwAddr + ADDR_VEHICLE_DOORSTATE)
  955.     if(ErrorLevel) {
  956.         ErrorLevel := ERROR_READ_MEMORY
  957.         return -1
  958.     }
  959.     ErrorLevel := ERROR_OK
  960.     return (dwVal==2)
  961. }
  962. getTargetVehicleLockStateById(dwId) {
  963.     if(!checkHandles())
  964.     return -1
  965.     dwAddr := getVehiclePointerById(dwId)
  966.     if(!dwAddr)
  967.     return -1
  968.     dwVal := readDWORD(hGTA, dwAddr + ADDR_VEHICLE_DOORSTATE)
  969.     if(ErrorLevel) {
  970.         ErrorLevel := ERROR_READ_MEMORY
  971.         return -1
  972.     }
  973.     ErrorLevel := ERROR_OK
  974.     return (dwVal==2)
  975. }
  976. getTargetVehicleColor1byPed(dwPED) {
  977.     if(!checkHandles())
  978.     return 0
  979.     dwAddr := getVehiclePointerByPed(dwPED)
  980.     if(!dwAddr)
  981.     return 0
  982.     sVal := readMem(hGTA, dwAddr + 1076, 1, "byte")
  983.     if(ErrorLevel) {
  984.         ErrorLevel := ERROR_READ_MEMORY
  985.         return 0
  986.     }
  987.     ErrorLevel := ERROR_OK
  988.     return sVal
  989. }
  990. getTargetVehicleColor1byId(dwId) {
  991.     if(!checkHandles())
  992.     return 0
  993.     dwAddr := getVehiclePointerById(dwId)
  994.     if(!dwAddr)
  995.     return 0
  996.     sVal := readMem(hGTA, dwAddr + 1076, 1, "byte")
  997.     if(ErrorLevel) {
  998.         ErrorLevel := ERROR_READ_MEMORY
  999.         return 0
  1000.     }
  1001.     ErrorLevel := ERROR_OK
  1002.     return sVal
  1003. }
  1004. getTargetVehicleColor2byPed(dwPED) {
  1005.     if(!checkHandles())
  1006.     return 0
  1007.     dwAddr := getVehiclePointerByPed(dwPED)
  1008.     if(!dwAddr)
  1009.     return 0
  1010.     sVal := readMem(hGTA, dwAddr + 1077, 1, "byte")
  1011.     if(ErrorLevel) {
  1012.         ErrorLevel := ERROR_READ_MEMORY
  1013.         return 0
  1014.     }
  1015.     ErrorLevel := ERROR_OK
  1016.     return sVal
  1017. }
  1018. getTargetVehicleColor2byId(dwId) {
  1019.     if(!checkHandles())
  1020.     return 0
  1021.     dwAddr := getVehiclePointerById(dwId)
  1022.     if(!dwAddr)
  1023.     return 0
  1024.     sVal := readMem(hGTA, dwAddr + 1077, 1, "byte")
  1025.     if(ErrorLevel) {
  1026.         ErrorLevel := ERROR_READ_MEMORY
  1027.         return 0
  1028.     }
  1029.     ErrorLevel := ERROR_OK
  1030.     return sVal
  1031. }
  1032. getTargetVehicleSpeedByPed(dwPED) {
  1033.     if(!checkHandles())
  1034.     return -1
  1035.     dwAddr := getVehiclePointerByPed(dwPED)
  1036.     fSpeedX := readMem(hGTA, dwAddr + ADDR_VEHICLE_X, 4, "float")
  1037.     fSpeedY := readMem(hGTA, dwAddr + ADDR_VEHICLE_Y, 4, "float")
  1038.     fSpeedZ := readMem(hGTA, dwAddr + ADDR_VEHICLE_Z, 4, "float")
  1039.     fVehicleSpeed :=  sqrt((fSpeedX * fSpeedX) + (fSpeedY * fSpeedY) + (fSpeedZ * fSpeedZ))
  1040.     fVehicleSpeed := (fVehicleSpeed * 100) * 1.43
  1041.     return fVehicleSpeed
  1042. }
  1043. getTargetVehicleSpeedById(dwId) {
  1044.     if(!checkHandles())
  1045.     return -1
  1046.     dwAddr := getVehiclePointerById(dwId)
  1047.     fSpeedX := readMem(hGTA, dwAddr + ADDR_VEHICLE_X, 4, "float")
  1048.     fSpeedY := readMem(hGTA, dwAddr + ADDR_VEHICLE_Y, 4, "float")
  1049.     fSpeedZ := readMem(hGTA, dwAddr + ADDR_VEHICLE_Z, 4, "float")
  1050.     fVehicleSpeed :=  sqrt((fSpeedX * fSpeedX) + (fSpeedY * fSpeedY) + (fSpeedZ * fSpeedZ))
  1051.     fVehicleSpeed := (fVehicleSpeed * 100) * 1.43
  1052.     return fVehicleSpeed
  1053. }
  1054. getPlayerNameById(dwId) {
  1055.     dwId += 0
  1056.     dwId := Floor(dwId)
  1057.     if(dwId < 0 || dwId >= SAMP_PLAYER_MAX)
  1058.     return ""
  1059.     if(iRefreshScoreboard+iUpdateTick > A_TickCount)
  1060.     {
  1061.         if(oScoreboardData[dwId])
  1062.         return oScoreboardData[dwId].NAME
  1063.         return ""
  1064.     }
  1065.     if(!updateOScoreboardData())
  1066.     return ""
  1067.     if(oScoreboardData[dwId])
  1068.     return oScoreboardData[dwId].NAME
  1069.     return ""
  1070. }
  1071. getPlayerIdByName(wName) {
  1072.     wName := "" wName
  1073.     if(StrLen(wName) < 1 || StrLen(wName) > 24)
  1074.     return -1
  1075.     if(iRefreshScoreboard+iUpdateTick > A_TickCount)
  1076.     {
  1077.         For i, o in oScoreboardData
  1078.         {
  1079.             if(InStr(o.NAME,wName)==1)
  1080.             return i
  1081.         }
  1082.         return -1
  1083.     }
  1084.     if(!updateOScoreboardData())
  1085.     return -1
  1086.     For i, o in oScoreboardData
  1087.     {
  1088.         if(InStr(o.NAME,wName)==1)
  1089.         return i
  1090.     }
  1091.     return -1
  1092. }
  1093. getPlayerScoreById(dwId) {
  1094.     dwId += 0
  1095.     dwId := Floor(dwId)
  1096.     if(dwId < 0 || dwId >= SAMP_PLAYER_MAX)
  1097.     return ""
  1098.     if(iRefreshScoreboard+iUpdateTick > A_TickCount)
  1099.     {
  1100.         if(oScoreboardData[dwId])
  1101.         return oScoreboardData[dwId].SCORE
  1102.         return ""
  1103.     }
  1104.     if(!updateOScoreboardData())
  1105.     return ""
  1106.     if(oScoreboardData[dwId])
  1107.     return oScoreboardData[dwId].SCORE
  1108.     return ""
  1109. }
  1110. getPlayerPingById(dwId) {
  1111.     dwId += 0
  1112.     dwId := Floor(dwId)
  1113.     if(dwId < 0 || dwId >= SAMP_PLAYER_MAX)
  1114.     return -1
  1115.     if(iRefreshScoreboard+iUpdateTick > A_TickCount)
  1116.     {
  1117.         if(oScoreboardData[dwId])
  1118.         return oScoreboardData[dwId].PING
  1119.         return -1
  1120.     }
  1121.     if(!updateOScoreboardData())
  1122.     return -1
  1123.     if(oScoreboardData[dwId])
  1124.     return oScoreboardData[dwId].PING
  1125.     return -1
  1126. }
  1127. isNPCById(dwId) {
  1128.     dwId += 0
  1129.     dwId := Floor(dwId)
  1130.     if(dwId < 0 || dwId >= SAMP_PLAYER_MAX)
  1131.     return -1
  1132.     if(iRefreshScoreboard+iUpdateTick > A_TickCount)
  1133.     {
  1134.         if(oScoreboardData[dwId])
  1135.         return oScoreboardData[dwId].ISNPC
  1136.         return -1
  1137.     }
  1138.     if(!updateOScoreboardData())
  1139.     return -1
  1140.     if(oScoreboardData[dwId])
  1141.     return oScoreboardData[dwId].ISNPC
  1142.     return -1
  1143. }
  1144. updateScoreboardDataEx() {
  1145.     if(!checkHandles())
  1146.     return false
  1147.     dwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET)
  1148.     if(ErrorLevel || dwAddress==0) {
  1149.         ErrorLevel := ERROR_READ_MEMORY
  1150.         return false
  1151.     }
  1152.     dwFunc := dwSAMP + FUNC_UPDATESCOREBOARD
  1153.     VarSetCapacity(injectData, 11, 0)
  1154.     NumPut(0xB9, injectData, 0, "UChar")
  1155.     NumPut(dwAddress, injectData, 1, "UInt")
  1156.     NumPut(0xE8, injectData, 5, "UChar")
  1157.     offset := dwFunc - (pInjectFunc + 10)
  1158.     NumPut(offset, injectData, 6, "Int")
  1159.     NumPut(0xC3, injectData, 10, "UChar")
  1160.     writeRaw(hGTA, pInjectFunc, &injectData, 11)
  1161.     if(ErrorLevel)
  1162.     return false
  1163.     hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
  1164.     if(ErrorLevel)
  1165.     return false
  1166.     waitForSingleObject(hThread, 0xFFFFFFFF)
  1167.     closeProcess(hThread)
  1168.     return true
  1169. }
  1170. updateOScoreboardData() {
  1171.     if(!checkHandles())
  1172.     return 0
  1173.     oScoreboardData := []
  1174.     if(!updateScoreboardDataEx())
  1175.     return 0
  1176.     iRefreshScoreboard := A_TickCount
  1177.     dwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET)
  1178.     if(ErrorLevel || dwAddress==0) {
  1179.         ErrorLevel := ERROR_READ_MEMORY
  1180.         return 0
  1181.     }
  1182.     dwAddress := readDWORD(hGTA, dwAddress + SAMP_PPOOLS_OFFSET)
  1183.     if(ErrorLevel || dwAddress==0) {
  1184.         ErrorLevel := ERROR_READ_MEMORY
  1185.         return 0
  1186.     }
  1187.     dwPlayers := readDWORD(hGTA, dwAddress + SAMP_PPOOL_PLAYER_OFFSET)
  1188.     if(ErrorLevel || dwPlayers==0) {
  1189.         ErrorLevel := ERROR_READ_MEMORY
  1190.         return 0
  1191.     }
  1192.     wID := readMem(hGTA, dwPlayers + SAMP_SLOCALPLAYERID_OFFSET, 2, "Short")
  1193.     if(ErrorLevel) {
  1194.         ErrorLevel := ERROR_READ_MEMORY
  1195.         return 0
  1196.     }
  1197.     dwPing := readMem(hGTA, dwPlayers + SAMP_ILOCALPLAYERPING_OFFSET, 4, "Int")
  1198.     if(ErrorLevel) {
  1199.         ErrorLevel := ERROR_READ_MEMORY
  1200.         return 0
  1201.     }
  1202.     dwScore := readMem(hGTA, dwPlayers + SAMP_ILOCALPLAYERSCORE_OFFSET, 4, "Int")
  1203.     if(ErrorLevel) {
  1204.         ErrorLevel := ERROR_READ_MEMORY
  1205.         return 0
  1206.     }
  1207.     dwTemp := readMem(hGTA, dwPlayers + SAMP_ISTRLEN_LOCALPLAYERNAME_OFFSET, 4, "Int")
  1208.     if(ErrorLevel) {
  1209.         ErrorLevel := ERROR_READ_MEMORY
  1210.         return 0
  1211.     }
  1212.     sUsername := ""
  1213.     if(dwTemp <= 0xf) {
  1214.         sUsername := readString(hGTA, dwPlayers + SAMP_SZLOCALPLAYERNAME_OFFSET, 16)
  1215.         if(ErrorLevel) {
  1216.             ErrorLevel := ERROR_READ_MEMORY
  1217.             return 0
  1218.         }
  1219.     }
  1220.     else {
  1221.         dwAddress := readDWORD(hGTA, dwPlayers + SAMP_PSZLOCALPLAYERNAME_OFFSET)
  1222.         if(ErrorLevel) {
  1223.             ErrorLevel := ERROR_READ_MEMORY
  1224.             return 0
  1225.         }
  1226.         sUsername := readString(hGTA, dwAddress, 25)
  1227.         if(ErrorLevel) {
  1228.             ErrorLevel := ERROR_READ_MEMORY
  1229.             return 0
  1230.         }
  1231.     }
  1232.     oScoreboardData[wID] := Object("NAME", sUsername, "ID", wID, "PING", dwPing, "SCORE", dwScore, "ISNPC", 0)
  1233.     Loop, % SAMP_PLAYER_MAX
  1234.     {
  1235.         i := A_Index-1
  1236.         dwRemoteplayer := readDWORD(hGTA, dwPlayers+SAMP_PREMOTEPLAYER_OFFSET+i*4)
  1237.         if(ErrorLevel) {
  1238.             ErrorLevel := ERROR_READ_MEMORY
  1239.             return 0
  1240.         }
  1241.         if(dwRemoteplayer==0)
  1242.         continue
  1243.         dwPing := readMem(hGTA, dwRemoteplayer + SAMP_IPING_OFFSET, 4, "Int")
  1244.         if(ErrorLevel) {
  1245.             ErrorLevel := ERROR_READ_MEMORY
  1246.             return 0
  1247.         }
  1248.         dwScore := readMem(hGTA, dwRemoteplayer + SAMP_ISCORE_OFFSET, 4, "Int")
  1249.         if(ErrorLevel) {
  1250.             ErrorLevel := ERROR_READ_MEMORY
  1251.             return 0
  1252.         }
  1253.         dwIsNPC := readMem(hGTA, dwRemoteplayer + SAMP_ISNPC_OFFSET, 4, "Int")
  1254.         if(ErrorLevel) {
  1255.             ErrorLevel := ERROR_READ_MEMORY
  1256.             return 0
  1257.         }
  1258.         dwTemp := readMem(hGTA, dwRemoteplayer + SAMP_ISTRLENNAME___OFFSET, 4, "Int")
  1259.         if(ErrorLevel) {
  1260.             ErrorLevel := ERROR_READ_MEMORY
  1261.             return 0
  1262.         }
  1263.         sUsername := ""
  1264.         if(dwTemp <= 0xf)
  1265.         {
  1266.             sUsername := readString(hGTA, dwRemoteplayer+SAMP_SZPLAYERNAME_OFFSET, 16)
  1267.             if(ErrorLevel) {
  1268.                 ErrorLevel := ERROR_READ_MEMORY
  1269.                 return 0
  1270.             }
  1271.         }
  1272.         else {
  1273.             dwAddress := readDWORD(hGTA, dwRemoteplayer + SAMP_PSZPLAYERNAME_OFFSET)
  1274.             if(ErrorLevel || dwAddress==0) {
  1275.                 ErrorLevel := ERROR_READ_MEMORY
  1276.                 return 0
  1277.             }
  1278.             sUsername := readString(hGTA, dwAddress, 25)
  1279.             if(ErrorLevel) {
  1280.                 ErrorLevel := ERROR_READ_MEMORY
  1281.                 return 0
  1282.             }
  1283.         }
  1284.         o := Object("NAME", sUsername, "ID", i, "PING", dwPing, "SCORE", dwScore, "ISNPC", dwIsNPC)
  1285.         oScoreboardData[i] := o
  1286.         dwRemoteplayerData := readDWORD(hGTA, dwRemoteplayer + 0x0)
  1287.         if(ErrorLevel) {
  1288.             ErrorLevel := ERROR_READ_MEMORY
  1289.             return 0
  1290.         }
  1291.         if(dwRemoteplayerData==0)
  1292.         continue
  1293.         dwAddress := readDWORD(hGTA, dwRemoteplayerData + 489)
  1294.         if(ErrorLevel) {
  1295.             ErrorLevel := ERROR_READ_MEMORY
  1296.             return 0
  1297.         }
  1298.         if(dwAddress)
  1299.         {
  1300.             ix := readMem(hGTA, dwRemoteplayerData + 493, 4, "Int")
  1301.             if(ErrorLevel) {
  1302.                 ErrorLevel := ERROR_READ_MEMORY
  1303.                 return 0
  1304.             }
  1305.             iy := readMem(hGTA, dwRemoteplayerData + 497, 4, "Int")
  1306.             if(ErrorLevel) {
  1307.                 ErrorLevel := ERROR_READ_MEMORY
  1308.                 return 0
  1309.             }
  1310.             iz := readMem(hGTA, dwRemoteplayerData + 501, 4, "Int")
  1311.             if(ErrorLevel) {
  1312.                 ErrorLevel := ERROR_READ_MEMORY
  1313.                 return 0
  1314.             }
  1315.             o.MPOS := [ix, iy, iz]
  1316.         }
  1317.         dwpSAMP_Actor := readDWORD(hGTA, dwRemoteplayerData + 0x0)
  1318.         if(ErrorLevel) {
  1319.             ErrorLevel := ERROR_READ_MEMORY
  1320.             return 0
  1321.         }
  1322.         if(dwpSAMP_Actor==0)
  1323.         continue
  1324.         dwPed := readDWORD(hGTA, dwpSAMP_Actor + 676)
  1325.         if(ErrorLevel) {
  1326.             ErrorLevel := ERROR_READ_MEMORY
  1327.             return 0
  1328.         }
  1329.         if(dwPed==0)
  1330.         continue
  1331.         o.PED := dwPed
  1332.         fHP := readFloat(hGTA, dwRemoteplayerData + 444)
  1333.         if(ErrorLevel) {
  1334.             ErrorLevel := ERROR_READ_MEMORY
  1335.             return 0
  1336.         }
  1337.         fARMOR := readFloat(hGTA, dwRemoteplayerData + 440)
  1338.         if(ErrorLevel) {
  1339.             ErrorLevel := ERROR_READ_MEMORY
  1340.             return 0
  1341.         }
  1342.         o.HP := fHP
  1343.         o.ARMOR := fARMOR
  1344.     }
  1345.     ErrorLevel := ERROR_OK
  1346.     return 1
  1347. }
  1348. GetChatLine(Line, ByRef Output, timestamp=0, color=0){
  1349.     chatindex := 0
  1350.     FileRead, file, %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
  1351.     loop, Parse, file, `n, `r
  1352.     {
  1353.         if(A_LoopField)
  1354.         chatindex := A_Index
  1355.     }
  1356.     loop, Parse, file, `n, `r
  1357.     {
  1358.         if(A_Index = chatindex - line){
  1359.             output := A_LoopField
  1360.             break
  1361.         }
  1362.     }
  1363.     file := ""
  1364.     if(!timestamp)
  1365. output := RegExReplace(output, "U)^\[\d{2}:\d{2}:\d{2}\]")
  1366.     if(!color)
  1367. output := RegExReplace(output, "Ui)\{[a-f0-9]{6}\}")
  1368.     return
  1369. }
  1370. getPlayerHealth() {
  1371.     if(!checkHandles())
  1372.     return -1
  1373.     dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR)
  1374.     if(ErrorLevel) {
  1375.         ErrorLevel := ERROR_READ_MEMORY
  1376.         return -1
  1377.     }
  1378.     dwAddr := dwCPedPtr + ADDR_CPED_HPOFF
  1379.     fHealth := readFloat(hGTA, dwAddr)
  1380.     if(ErrorLevel) {
  1381.         ErrorLevel := ERROR_READ_MEMORY
  1382.         return -1
  1383.     }
  1384.     ErrorLevel := ERROR_OK
  1385.     return Round(fHealth)
  1386. }
  1387. getPlayerArmor() {
  1388.     if(!checkHandles())
  1389.     return -1
  1390.     dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR)
  1391.     if(ErrorLevel) {
  1392.         ErrorLevel := ERROR_READ_MEMORY
  1393.         return -1
  1394.     }
  1395.     dwAddr := dwCPedPtr + ADDR_CPED_ARMOROFF
  1396.     fHealth := readFloat(hGTA, dwAddr)
  1397.     if(ErrorLevel) {
  1398.         ErrorLevel := ERROR_READ_MEMORY
  1399.         return -1
  1400.     }
  1401.     ErrorLevel := ERROR_OK
  1402.     return Round(fHealth)
  1403. }
  1404. getPlayerInteriorId() {
  1405.     if(!checkHandles())
  1406.     return -1
  1407.     iid := readMem(hGTA, ADDR_CPED_INTID, 4, "Int")
  1408.     if(ErrorLevel) {
  1409.         ErrorLevel := ERROR_READ_MEMORY
  1410.         return -1
  1411.     }
  1412.     ErrorLevel := ERROR_OK
  1413.     return iid
  1414. }
  1415. getPlayerSkinID() {
  1416.     if(!checkHandles())
  1417.     return -1
  1418.     dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR)
  1419.     if(ErrorLevel) {
  1420.         ErrorLevel := ERROR_READ_MEMORY
  1421.         return -1
  1422.     }
  1423.     dwAddr := dwCPedPtr + ADDR_CPED_SKINIDOFF
  1424.     SkinID := readMem(hGTA, dwAddr, 2, "byte")
  1425.     if(ErrorLevel) {
  1426.         ErrorLevel := ERROR_READ_MEMORY
  1427.         return -1
  1428.     }
  1429.     ErrorLevel := ERROR_OK
  1430.     return SkinID
  1431. }
  1432. getPlayerMoney() {
  1433.     if(!checkHandles())
  1434.     return ""
  1435.     money := readMem(hGTA, ADDR_CPED_MONEY, 4, "Int")
  1436.     if(ErrorLevel) {
  1437.         ErrorLevel := ERROR_READ_MEMORY
  1438.         return ""
  1439.     }
  1440.     ErrorLevel := ERROR_OK
  1441.     return money
  1442. }
  1443. getPlayerWanteds() {
  1444.     if(!checkHandles())
  1445.     return -1
  1446.     dwPtr := 0xB7CD9C
  1447.     dwPtr := readDWORD(hGTA, dwPtr)
  1448.     if(ErrorLevel) {
  1449.         ErrorLevel := ERROR_READ_MEMORY
  1450.         return -1
  1451.     }
  1452.     Wanteds := readDWORD(hGTA, dwPtr)
  1453.     if(ErrorLevel) {
  1454.         ErrorLevel := ERROR_READ_MEMORY
  1455.         return -1
  1456.     }
  1457.     ErrorLevel := ERROR_OK
  1458.     return Wanteds
  1459. }
  1460. getPlayerWeaponId() {
  1461.     if(!checkHandles())
  1462.     return 0
  1463.     WaffenId := readMem(hGTA, 0xBAA410, 4, "byte")
  1464.     if(ErrorLevel) {
  1465.         ErrorLevel := ERROR_READ_MEMORY
  1466.         return -1
  1467.     }
  1468.     return WaffenId
  1469. }
  1470. getPlayerWeaponName() {
  1471.     id := getPlayerWeaponId()
  1472.     if(id >= 0 && id < 44)
  1473.     {
  1474.         return oweaponNames[id+1]
  1475.     }
  1476.     return ""
  1477. }
  1478. getPlayerState() {
  1479.     if(!checkHandles())
  1480.     return -1
  1481.     dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR)
  1482.     if(ErrorLevel) {
  1483.         ErrorLevel := ERROR_READ_MEMORY
  1484.         return -1
  1485.     }
  1486.     State := readDWORD(hGTA, dwCPedPtr + 0x530)
  1487.     if(ErrorLevel) {
  1488.         ErrorLevel := ERROR_READ_MEMORY
  1489.         return -1
  1490.     }
  1491.     ErrorLevel := ERROR_OK
  1492.     return State
  1493. }
  1494. IsPlayerInMenu() {
  1495.     if(!checkHandles())
  1496.     return -1
  1497.     IsInMenu := readMem(hGTA, 0xBA67A4, 4, "byte")
  1498.     if(ErrorLevel) {
  1499.         ErrorLevel := ERROR_READ_MEMORY
  1500.         return -1
  1501.     }
  1502.     ErrorLevel := ERROR_OK
  1503.     return IsInMenu
  1504. }
  1505. getPlayerMapPosX() {
  1506.     if(!checkHandles())
  1507.     return -1
  1508.     MapPosX := readFloat(hGTA, 0xBA67B8)
  1509.     if(ErrorLevel) {
  1510.         ErrorLevel := ERROR_READ_MEMORY
  1511.         return -1
  1512.     }
  1513.     ErrorLevel := ERROR_OK
  1514.     return MapPosX
  1515. }
  1516. getPlayerMapPosY() {
  1517.     if(!checkHandles())
  1518.     return -1
  1519.     MapPosY := readFloat(hGTA, 0xBA67BC)
  1520.     if(ErrorLevel) {
  1521.         ErrorLevel := ERROR_READ_MEMORY
  1522.         return -1
  1523.     }
  1524.     ErrorLevel := ERROR_OK
  1525.     return MapPosY
  1526. }
  1527. getPlayerMapZoom() {
  1528.     if(!checkHandles())
  1529.     return -1
  1530.     MapZoom := readFloat(hGTA, 0xBA67AC)
  1531.     if(ErrorLevel) {
  1532.         ErrorLevel := ERROR_READ_MEMORY
  1533.         return -1
  1534.     }
  1535.     ErrorLevel := ERROR_OK
  1536.     return MapZoom
  1537. }
  1538. IsPlayerFreezed() {
  1539.     if(!checkHandles())
  1540.     return -1
  1541.     dwGTA := getModuleBaseAddress("gta_sa.exe", hGTA)
  1542.     IPF := readMem(hGTA, dwGTA + 0x690495, 2, "byte")
  1543.     if(ErrorLevel) {
  1544.         ErrorLevel := ERROR_READ_MEMORY
  1545.         return -1
  1546.     }
  1547.     ErrorLevel := ERROR_OK
  1548.     return IPF
  1549. }
  1550. isPlayerInAnyVehicle()
  1551. {
  1552.     if(!checkHandles())
  1553.     return -1
  1554.     dwVehPtr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
  1555.     if(ErrorLevel) {
  1556.         ErrorLevel := ERROR_READ_MEMORY
  1557.         return -1
  1558.     }
  1559.     return (dwVehPtr > 0)
  1560. }
  1561. isPlayerDriver() {
  1562.     if(!checkHandles())
  1563.     return -1
  1564.     dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
  1565.     if(ErrorLevel) {
  1566.         ErrorLevel := ERROR_READ_MEMORY
  1567.         return -1
  1568.     }
  1569.     if(!dwAddr)
  1570.     return -1
  1571.     dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR)
  1572.     if(ErrorLevel) {
  1573.         ErrorLevel := ERROR_READ_MEMORY
  1574.         return -1
  1575.     }
  1576.     dwVal := readDWORD(hGTA, dwAddr + ADDR_VEHICLE_DRIVER)
  1577.     if(ErrorLevel) {
  1578.         ErrorLevel := ERROR_READ_MEMORY
  1579.         return -1
  1580.     }
  1581.     ErrorLevel := ERROR_OK
  1582.     return (dwVal==dwCPedPtr)
  1583. }
  1584. getVehicleHealth() {
  1585.     if(!checkHandles())
  1586.     return -1
  1587.     dwVehPtr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
  1588.     if(ErrorLevel) {
  1589.         ErrorLevel := ERROR_READ_MEMORY
  1590.         return -1
  1591.     }
  1592.     dwAddr := dwVehPtr + ADDR_VEHICLE_HPOFF
  1593.     fHealth := readFloat(hGTA, dwAddr)
  1594.     if(ErrorLevel) {
  1595.         ErrorLevel := ERROR_READ_MEMORY
  1596.         return -1
  1597.     }
  1598.     ErrorLevel := ERROR_OK
  1599.     return Round(fHealth)
  1600. }
  1601. getVehicleType() {
  1602.     if(!checkHandles())
  1603.     return 0
  1604.     dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
  1605.     if(ErrorLevel) {
  1606.         ErrorLevel := ERROR_READ_MEMORY
  1607.         return 0
  1608.     }
  1609.     if(!dwAddr)
  1610.     return 0
  1611.     cVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_TYPE, 1, "Char")
  1612.     if(ErrorLevel) {
  1613.         ErrorLevel := ERROR_READ_MEMORY
  1614.         return 0
  1615.     }
  1616.     ErrorLevel := ERROR_OK
  1617.     if(!cVal)
  1618.     {
  1619.         mid := getVehicleModelId()
  1620.         Loop % oAirplaneModels.MaxIndex()
  1621.         {
  1622.             if(oAirplaneModels[A_Index]==mid)
  1623.             return 5
  1624.         }
  1625.         return 1
  1626.     }
  1627.     else if(cVal==5)
  1628.     return 2
  1629.     else if(cVal==6)
  1630.     return 3
  1631.     else if(cVal==9)
  1632.     {
  1633.         mid := getVehicleModelId()
  1634.         Loop % oBikeModels.MaxIndex()
  1635.         {
  1636.             if(oBikeModels[A_Index]==mid)
  1637.             return 6
  1638.         }
  1639.         return 4
  1640.     }
  1641.     return 0
  1642. }
  1643. getVehicleModelId() {
  1644.     if(!checkHandles())
  1645.     return 0
  1646.     dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
  1647.     if(ErrorLevel) {
  1648.         ErrorLevel := ERROR_READ_MEMORY
  1649.         return 0
  1650.     }
  1651.     if(!dwAddr)
  1652.     return 0
  1653.     sVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_MODEL, 2, "Short")
  1654.     if(ErrorLevel) {
  1655.         ErrorLevel := ERROR_READ_MEMORY
  1656.         return 0
  1657.     }
  1658.     ErrorLevel := ERROR_OK
  1659.     return sVal
  1660. }
  1661. getVehicleModelName() {
  1662.     id:=getVehicleModelId()
  1663.     if(id > 400 && id < 611)
  1664.     {
  1665.         return ovehicleNames[id-399]
  1666.     }
  1667.     return ""
  1668. }
  1669. getVehicleLightState() {
  1670.     if(!checkHandles())
  1671.     return -1
  1672.     dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
  1673.     if(ErrorLevel) {
  1674.         ErrorLevel := ERROR_READ_MEMORY
  1675.         return -1
  1676.     }
  1677.     if(!dwAddr)
  1678.     return -1
  1679.     dwVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_LIGHTSTATE, 4, "Int")
  1680.     if(ErrorLevel) {
  1681.         ErrorLevel := ERROR_READ_MEMORY
  1682.         return -1
  1683.     }
  1684.     ErrorLevel := ERROR_OK
  1685.     return (dwVal>0)
  1686. }
  1687. getVehicleEngineState() {
  1688.     if(!checkHandles())
  1689.     return -1
  1690.     dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
  1691.     if(ErrorLevel) {
  1692.         ErrorLevel := ERROR_READ_MEMORY
  1693.         return -1
  1694.     }
  1695.     if(!dwAddr)
  1696.     return -1
  1697.     cVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_ENGINESTATE, 1, "Char")
  1698.     if(ErrorLevel) {
  1699.         ErrorLevel := ERROR_READ_MEMORY
  1700.         return -1
  1701.     }
  1702.     ErrorLevel := ERROR_OK
  1703.     return (cVal==24 || cVal==56 || cVal==88 || cVal==120)
  1704. }
  1705. getVehicleLockState() {
  1706.     if(!checkHandles())
  1707.     return -1
  1708.     dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
  1709.     if(ErrorLevel) {
  1710.         ErrorLevel := ERROR_READ_MEMORY
  1711.         return -1
  1712.     }
  1713.     if(!dwAddr)
  1714.     return -1
  1715.     dwVal := readDWORD(hGTA, dwAddr + ADDR_VEHICLE_DOORSTATE)
  1716.     if(ErrorLevel) {
  1717.         ErrorLevel := ERROR_READ_MEMORY
  1718.         return -1
  1719.     }
  1720.     ErrorLevel := ERROR_OK
  1721.     return (dwVal==2)
  1722. }
  1723. getVehicleColor1() {
  1724.     if(!checkHandles())
  1725.     return 0
  1726.     dwAddr := readDWORD(hGTA, 0xBA18FC)
  1727.     if(ErrorLevel) {
  1728.         ErrorLevel := ERROR_READ_MEMORY
  1729.         return 0
  1730.     }
  1731.     if(!dwAddr)
  1732.     return 0
  1733.     sVal := readMem(hGTA, dwAddr + 1076, 1, "byte")
  1734.     if(ErrorLevel) {
  1735.         ErrorLevel := ERROR_READ_MEMORY
  1736.         return 0
  1737.     }
  1738.     ErrorLevel := ERROR_OK
  1739.     return sVal
  1740. }
  1741. getVehicleColor2() {
  1742.     if(!checkHandles())
  1743.     return 0
  1744.     dwAddr := readDWORD(hGTA, 0xBA18FC)
  1745.     if(ErrorLevel) {
  1746.         ErrorLevel := ERROR_READ_MEMORY
  1747.         return 0
  1748.     }
  1749.     if(!dwAddr)
  1750.     return 0
  1751.     sVal := readMem(hGTA, dwAddr + 1077, 1, "byte")
  1752.     if(ErrorLevel) {
  1753.         ErrorLevel := ERROR_READ_MEMORY
  1754.         return 0
  1755.     }
  1756.     ErrorLevel := ERROR_OK
  1757.     return sVal
  1758. }
  1759. getVehicleSpeed() {
  1760.     if(!checkHandles())
  1761.     return -1
  1762.     dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
  1763.     if(ErrorLevel) {
  1764.         ErrorLevel := ERROR_READ_MEMORY
  1765.         return ""
  1766.     }
  1767.     fSpeedX := readMem(hGTA, dwAddr + ADDR_VEHICLE_X, 4, "float")
  1768.     fSpeedY := readMem(hGTA, dwAddr + ADDR_VEHICLE_Y, 4, "float")
  1769.     fSpeedZ := readMem(hGTA, dwAddr + ADDR_VEHICLE_Z, 4, "float")
  1770.     fVehicleSpeed :=  sqrt((fSpeedX * fSpeedX) + (fSpeedY * fSpeedY) + (fSpeedZ * fSpeedZ))
  1771.     fVehicleSpeed := (fVehicleSpeed * 100) * 1.43
  1772.     return fVehicleSpeed
  1773. }
  1774. getPlayerRadiostationID() {
  1775.     if(!checkHandles())
  1776.     return -1
  1777.     if(isPlayerInAnyVehicle() == 0)
  1778.     return -1
  1779.     dwGTA := getModuleBaseAddress("gta_sa.exe", hGTA)
  1780.     RadioStationID := readMem(hGTA, dwGTA + 0x4CB7E1, 1, "byte")
  1781.     if(ErrorLevel) {
  1782.         ErrorLevel := ERROR_READ_MEMORY
  1783.         return -1
  1784.     }
  1785.     return RadioStationID
  1786. }
  1787. getPlayerRadiostationName() {
  1788.     if(isPlayerInAnyVehicle() == 0)
  1789.     return -1
  1790.     id := getPlayerRadiostationID()
  1791.     if(id == 0)
  1792.     return -1
  1793.     if(id >= 0 && id < 14)
  1794.     {
  1795.         return oradiostationNames[id]
  1796.     }
  1797.     return ""
  1798. }
  1799. setCheckpoint(fX, fY, fZ, fSize ) {
  1800.     if(!checkHandles())
  1801.     return false
  1802.     dwFunc := dwSAMP + 0x9D340
  1803.     dwAddress := readDWORD(hGTA, dwSAMP + ADDR_SAMP_INCHAT_PTR)
  1804.     if(ErrorLevel || dwAddress==0) {
  1805.         ErrorLevel := ERROR_READ_MEMORY
  1806.         return false
  1807.     }
  1808.     VarSetCapacity(buf, 16, 0)
  1809.     NumPut(fX, buf, 0, "Float")
  1810.     NumPut(fY, buf, 4, "Float")
  1811.     NumPut(fZ, buf, 8, "Float")
  1812.     NumPut(fSize, buf, 12, "Float")
  1813.     writeRaw(hGTA, pParam1, &buf, 16)
  1814.     dwLen := 31
  1815.     VarSetCapacity(injectData, dwLen, 0)
  1816.     NumPut(0xB9, injectData, 0, "UChar")
  1817.     NumPut(dwAddress, injectData, 1, "UInt")
  1818.     NumPut(0x68, injectData, 5, "UChar")
  1819.     NumPut(pParam1+12, injectData, 6, "UInt")
  1820.     NumPut(0x68, injectData, 10, "UChar")
  1821.     NumPut(pParam1, injectData, 11, "UInt")
  1822.     NumPut(0xE8, injectData, 15, "UChar")
  1823.     offset := dwFunc - (pInjectFunc + 20)
  1824.     NumPut(offset, injectData, 16, "Int")
  1825.     NumPut(0x05C7, injectData, 20, "UShort")
  1826.     NumPut(dwAddress+0x24, injectData, 22, "UInt")
  1827.     NumPut(1, injectData, 26, "UInt")
  1828.     NumPut(0xC3, injectData, 30, "UChar")
  1829.     writeRaw(hGTA, pInjectFunc, &injectData, dwLen)
  1830.     if(ErrorLevel)
  1831.     return false
  1832.     hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
  1833.     if(ErrorLevel)
  1834.     return false
  1835.     waitForSingleObject(hThread, 0xFFFFFFFF)
  1836.     closeProcess(hThread)
  1837.     ErrorLevel := ERROR_OK
  1838.     return true
  1839. }
  1840. disableCheckpoint()
  1841. {
  1842.     if(!checkHandles())
  1843.     return false
  1844.     dwAddress := readDWORD(hGTA, dwSAMP + ADDR_SAMP_INCHAT_PTR)
  1845.     if(ErrorLevel || dwAddress==0) {
  1846.         ErrorLevel := ERROR_READ_MEMORY
  1847.         return false
  1848.     }
  1849.     VarSetCapacity(enablecp, 4, 0)
  1850.     NumPut(0,enablecp,0,"Int")
  1851.     writeRaw(hGTA, dwAddress+0x24, &enablecp, 4)
  1852.     ErrorLevel := ERROR_OK
  1853.     return true
  1854. }
  1855. IsMarkerCreated(){
  1856.     If(!checkHandles())
  1857.     return false
  1858.     active := readMem(hGTA, CheckpointCheck, 1, "byte")
  1859.     If(!active)
  1860.     return 0
  1861.     else return 1
  1862. }
  1863. CoordsFromRedmarker(){
  1864.     if(!checkhandles())
  1865.     return false
  1866.     for i, v in rmaddrs
  1867.     f%i% := readFloat(hGTA, v)
  1868.     return [f1, f2, f3]
  1869. }
  1870. getCoordinates() {
  1871.     if(!checkHandles())
  1872.     return ""
  1873.     fX := readFloat(hGTA, ADDR_POSITION_X)
  1874.     if(ErrorLevel) {
  1875.         ErrorLevel := ERROR_READ_MEMORY
  1876.         return ""
  1877.     }
  1878.     fY := readFloat(hGTA, ADDR_POSITION_Y)
  1879.     if(ErrorLevel) {
  1880.         ErrorLevel := ERROR_READ_MEMORY
  1881.         return ""
  1882.     }
  1883.     fZ := readFloat(hGTA, ADDR_POSITION_Z)
  1884.     if(ErrorLevel) {
  1885.         ErrorLevel := ERROR_READ_MEMORY
  1886.         return ""
  1887.     }
  1888.     ErrorLevel := ERROR_OK
  1889.     return [fX, fY, fZ]
  1890. }
  1891. GetPlayerPos(ByRef fX,ByRef fY,ByRef fZ) {
  1892.     if(!checkHandles())
  1893.     return 0
  1894.     fX := readFloat(hGTA, ADDR_POSITION_X)
  1895.     if(ErrorLevel) {
  1896.         ErrorLevel := ERROR_READ_MEMORY
  1897.         return 0
  1898.     }
  1899.     fY := readFloat(hGTA, ADDR_POSITION_Y)
  1900.     if(ErrorLevel) {
  1901.         ErrorLevel := ERROR_READ_MEMORY
  1902.         return 0
  1903.     }
  1904.     fZ := readFloat(hGTA, ADDR_POSITION_Z)
  1905.     if(ErrorLevel) {
  1906.         ErrorLevel := ERROR_READ_MEMORY
  1907.         return 0
  1908.     }
  1909.     ErrorLevel := ERROR_OK
  1910. }
  1911. getDialogStructPtr() {
  1912.     if (!checkHandles()) {
  1913.         ErrorLevel := ERROR_INVALID_HANDLE
  1914.         return false
  1915.     }
  1916.     dwPointer := readDWORD(hGTA, dwSAMP + SAMP_DIALOG_STRUCT_PTR)
  1917.     if (ErrorLevel) {
  1918.         ErrorLevel := ERROR_READ_MEMORY
  1919.         return false
  1920.     }
  1921.     ErrorLevel := ERROR_OK
  1922.     return dwPointer
  1923. }
  1924. isDialogOpen() {
  1925.     dwPointer := getDialogStructPtr()
  1926.     if (ErrorLevel || !dwPointer)
  1927.     return false
  1928.     dwIsOpen := readMem(hGTA, dwPointer + SAMP_DIALOG_OPEN_OFFSET, 4, "UInt")
  1929.     if (ErrorLevel) {
  1930.         ErrorLevel := ERROR_READ_MEMORY
  1931.         return false
  1932.     }
  1933.     ErrorLevel := ERROR_OK
  1934.     return dwIsOpen ? true : false
  1935. }
  1936. getDialogStyle() {
  1937.     dwPointer := getDialogStructPtr()
  1938.     if (ErrorLevel || !dwPointer)
  1939.     return -1
  1940.     style := readMem(hGTA, dwPointer + SAMP_DIALOG_STYLE_OFFSET, 4, "UInt")
  1941.     if (ErrorLevel) {
  1942.         ErrorLevel := ERROR_READ_MEMORY
  1943.         return -1
  1944.     }
  1945.     ErrorLevel := ERROR_OK
  1946.     return style
  1947. }
  1948. getDialogID() {
  1949.     dwPointer := getDialogStructPtr()
  1950.     if (ErrorLevel || !dwPointer)
  1951.     return -1
  1952.     id := readMem(hGTA, dwPointer + SAMP_DIALOG_ID_OFFSET, 4, "UInt")
  1953.     if (ErrorLevel) {
  1954.         ErrorLevel := ERROR_READ_MEMORY
  1955.         return -1
  1956.     }
  1957.     ErrorLevel := ERROR_OK
  1958.     return id
  1959. }
  1960. setDialogID(id) {
  1961.     dwPointer := getDialogStructPtr()
  1962.     if (ErrorLevel || !dwPointer)
  1963.     return false
  1964.     writeMemory(hGTA, dwPointer + SAMP_DIALOG_ID_OFFSET, id, "UInt", 4)
  1965.     if (ErrorLevel) {
  1966.         ErrorLevel := ERROR_WRITE_MEMORY
  1967.         return false
  1968.     }
  1969.     ErrorLevel := ERROR_OK
  1970.     return true
  1971. }
  1972. getDialogIndex() {
  1973.     dwPointer := getDialogStructPtr()
  1974.     if (ErrorLevel || !dwPointer)
  1975.     return 0
  1976.     dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_PTR1_OFFSET)
  1977.     if (ErrorLevel) {
  1978.         ErrorLevel := ERROR_READ_MEMORY
  1979.         return 0
  1980.     }
  1981.     index := readMem(hGTA, dwPointer + SAMP_DIALOG_INDEX_OFFSET, 1, "Byte")
  1982.     if (ErrorLevel) {
  1983.         ErrorLevel := ERROR_READ_MEMORY
  1984.         return 0
  1985.     }
  1986.     ErrorLevel := ERROR_OK
  1987.     return index + 1
  1988. }
  1989. getDialogCaption() {
  1990.     dwPointer := getDialogStructPtr()
  1991.     if (ErrorLevel || !dwPointer)
  1992.     return ""
  1993.     text := readString(hGTA, dwPointer + SAMP_DIALOG_CAPTION_OFFSET, 64)
  1994.     if (ErrorLevel) {
  1995.         ErrorLevel := ERROR_READ_MEMORY
  1996.         return ""
  1997.     }
  1998.     ErrorLevel := ERROR_OK
  1999.     return text
  2000. }
  2001. getDialogTextSize(dwAddress) {
  2002.     i := 0
  2003.     Loop, 4096 {
  2004.         i := A_Index - 1
  2005.         byte := Memory_ReadByte(hGTA, dwAddress + i)
  2006.         if (!byte)
  2007.         break
  2008.     }
  2009.     return i
  2010. }
  2011. getDialogText() {
  2012.     dwPointer := getDialogStructPtr()
  2013.     if (ErrorLevel || !dwPointer)
  2014.     return ""
  2015.     dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_TEXT_PTR_OFFSET)
  2016.     if (ErrorLevel) {
  2017.         ErrorLevel := ERROR_READ_MEMORY
  2018.         return ""
  2019.     }
  2020.     text := readString(hGTA, dwPointer, 4096)
  2021.     if (ErrorLevel) {
  2022.         text := readString(hGTA, dwPointer, getDialogTextSize(dwPointer))
  2023.         if (ErrorLevel) {
  2024.             ErrorLevel := ERROR_READ_MEMORY
  2025.             return ""
  2026.         }
  2027.     }
  2028.     ErrorLevel := ERROR_OK
  2029.     return text
  2030. }
  2031. getDialogLineCount() {
  2032.     dwPointer := getDialogStructPtr()
  2033.     if (ErrorLevel || !dwPointer)
  2034.     return 0
  2035.     dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_PTR2_OFFSET)
  2036.     if (ErrorLevel) {
  2037.         ErrorLevel := ERROR_READ_MEMORY
  2038.         return 0
  2039.     }
  2040.     count := readMem(hGTA, dwPointer + SAMP_DIALOG_LINECOUNT_OFFSET, 4, "UInt")
  2041.     if (ErrorLevel) {
  2042.         ErrorLevel := ERROR_READ_MEMORY
  2043.         return 0
  2044.     }
  2045.     ErrorLevel := ERROR_OK
  2046.     return count
  2047. }
  2048. getDialogLine__(index) {
  2049.     if (getDialogLineCount > index)
  2050.     return ""
  2051.     dwPointer := getDialogStructPtr()
  2052.     if (ErrorLevel || !dwPointer)
  2053.     return ""
  2054.     dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_PTR1_OFFSET)
  2055.     if (ErrorLevel) {
  2056.         ErrorLevel := ERROR_READ_MEMORY
  2057.         return ""
  2058.     }
  2059.     dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_LINES_OFFSET)
  2060.     if (ErrorLevel) {
  2061.         ErrorLevel := ERROR_READ_MEMORY
  2062.         return ""
  2063.     }
  2064.     dwLineAddress := readDWORD(hGTA, dwPointer + (index - 1) * 0x4)
  2065.     line := readString(hGTA, dwLineAddress, 128)
  2066.     ErrorLevel := ERROR_OK
  2067.     return line
  2068. }
  2069. getDialogLine(index) {
  2070.     lines := getDialogLines()
  2071.     if (index > lines.Length())
  2072.     return ""
  2073.     if (getDialogStyle() == DIALOG_STYLE_TABLIST_HEADERS)
  2074.     index++
  2075.     return lines[index]
  2076. }
  2077. getDialogLines() {
  2078.     text := getDialogText()
  2079.     if (text == "")
  2080.     return -1
  2081.     lines := StrSplit(text, "`n")
  2082.     return lines
  2083. }
  2084. isDialogButton1Selected() {
  2085.     dwPointer := getDialogStructPtr()
  2086.     if (ErrorLevel || !dwPointer)
  2087.     return false
  2088.     dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_PTR1_OFFSET)
  2089.     if (ErrorLevel) {
  2090.         ErrorLevel := ERROR_READ_MEMORY
  2091.         return false
  2092.     }
  2093.     selected := readMem(hGTA, dwPointer + SAMP_DIALOG_BUTTON_HOVERING_OFFSET, 1, "Byte")
  2094.     if (ErrorLevel) {
  2095.         ErrorLevel := ERROR_READ_MEMORY
  2096.         return false
  2097.     }
  2098.     ErrorLevel := ERROR_OK
  2099.     return selected
  2100. }
  2101. getDialogLines__() {
  2102.     count := getDialogLineCount()
  2103.     dwPointer := getDialogStructPtr()
  2104.     if (ErrorLevel || !dwPointer)
  2105.     return -1
  2106.     dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_PTR1_OFFSET)
  2107.     if (ErrorLevel) {
  2108.         ErrorLevel := ERROR_READ_MEMORY
  2109.         return -1
  2110.     }
  2111.     dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_LINES_OFFSET)
  2112.     if (ErrorLevel) {
  2113.         ErrorLevel := ERROR_READ_MEMORY
  2114.         return -1
  2115.     }
  2116.     lines := []
  2117.     Loop %count% {
  2118.         dwLineAddress := readDWORD(hGTA, dwPointer + (A_Index - 1) * 0x4)
  2119.         lines[A_Index] := readString(hGTA, dwLineAddress, 128)
  2120.     }
  2121.     ErrorLevel := ERROR_OK
  2122.     return lines
  2123. }
  2124. showDialog(style, caption, text, button1, button2 := "", id := 1) {
  2125.     style += 0
  2126.     style := Floor(style)
  2127.     id += 0
  2128.     id := Floor(id)
  2129.     caption := "" caption
  2130.     text := "" text
  2131.     button1 := "" button1
  2132.     button2 := "" button2
  2133.     if (id < 0 || id > 32767 || style < 0 || style > 5 || StrLen(caption) > 64 || StrLen(text) > 4096 || StrLen(button1) > 10 || StrLen(button2) > 10)
  2134.     return false
  2135.     if (!checkHandles())
  2136.     return false
  2137.     dwFunc := dwSAMP + FUNC_SAMP_SHOWDIALOG
  2138.     dwAddress := readDWORD(hGTA, dwSAMP + SAMP_DIALOG_STRUCT_PTR)
  2139.     if (ErrorLevel || !dwAddress) {
  2140.         ErrorLevel := ERROR_READ_MEMORY
  2141.         return false
  2142.     }
  2143.     writeString(hGTA, pParam5, caption)
  2144.     if (ErrorLevel)
  2145.     return false
  2146.     writeString(hGTA, pParam1, text)
  2147.     if (ErrorLevel)
  2148.     return false
  2149.     writeString(hGTA, pParam5 + 512, button1)
  2150.     if (ErrorLevel)
  2151.     return false
  2152.     writeString(hGTA, pParam5+StrLen(caption) + 1, button2)
  2153.     if (ErrorLevel)
  2154.     return false
  2155.     dwLen := 5 + 7 * 5 + 5 + 1
  2156.     VarSetCapacity(injectData, dwLen, 0)
  2157.     NumPut(0xB9, injectData, 0, "UChar")
  2158.     NumPut(dwAddress, injectData, 1, "UInt")
  2159.     NumPut(0x68, injectData, 5, "UChar")
  2160.     NumPut(1, injectData, 6, "UInt")
  2161.     NumPut(0x68, injectData, 10, "UChar")
  2162.     NumPut(pParam5 + StrLen(caption) + 1, injectData, 11, "UInt")
  2163.     NumPut(0x68, injectData, 15, "UChar")
  2164.     NumPut(pParam5 + 512, injectData, 16, "UInt")
  2165.     NumPut(0x68, injectData, 20, "UChar")
  2166.     NumPut(pParam1, injectData, 21, "UInt")
  2167.     NumPut(0x68, injectData, 25, "UChar")
  2168.     NumPut(pParam5, injectData, 26, "UInt")
  2169.     NumPut(0x68, injectData, 30, "UChar")
  2170.     NumPut(style, injectData, 31, "UInt")
  2171.     NumPut(0x68, injectData, 35, "UChar")
  2172.     NumPut(id, injectData, 36, "UInt")
  2173.     NumPut(0xE8, injectData, 40, "UChar")
  2174.     offset := dwFunc - (pInjectFunc + 45)
  2175.     NumPut(offset, injectData, 41, "Int")
  2176.     NumPut(0xC3, injectData, 45, "UChar")
  2177.     writeRaw(hGTA, pInjectFunc, &injectData, dwLen)
  2178.     if (ErrorLevel)
  2179.     return false
  2180.     hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
  2181.     if (ErrorLevel)
  2182.     return false
  2183.     waitForSingleObject(hThread, 0xFFFFFFFF)
  2184.     closeProcess(hThread)
  2185.     return true
  2186. }
  2187. initZonesAndCities() {
  2188.     AddCity("Las Venturas", 685.0, 476.093, -500.0, 3000.0, 3000.0, 500.0)
  2189.     AddCity("San Fierro", -3000.0, -742.306, -500.0, -1270.53, 1530.24, 500.0)
  2190.     AddCity("San Fierro", -1270.53, -402.481, -500.0, -1038.45, 832.495, 500.0)
  2191.     AddCity("San Fierro", -1038.45, -145.539, -500.0, -897.546, 376.632, 500.0)
  2192.     AddCity("Los Santos", 480.0, -3000.0, -500.0, 3000.0, -850.0, 500.0)
  2193.     AddCity("Los Santos", 80.0, -2101.61, -500.0, 1075.0, -1239.61, 500.0)
  2194.     AddCity("Tierra Robada", -1213.91, 596.349, -242.99, -480.539, 1659.68, 900.0)
  2195.     AddCity("Red County", -1213.91, -768.027, -242.99, 2997.06, 596.349, 900.0)
  2196.     AddCity("Flint County", -1213.91, -2892.97, -242.99, 44.6147, -768.027, 900.0)
  2197.     AddCity("Whetstone", -2997.47, -2892.97, -242.99, -1213.91, -1115.58, 900.0)
  2198.     AddZone("Avispa Country Club", -2667.810, -302.135, -28.831, -2646.400, -262.320, 71.169)
  2199.     AddZone("Easter Bay Airport", -1315.420, -405.388, 15.406, -1264.400, -209.543, 25.406)
  2200.     AddZone("Avispa Country Club", -2550.040, -355.493, 0.000, -2470.040, -318.493, 39.700)
  2201.     AddZone("Easter Bay Airport", -1490.330, -209.543, 15.406, -1264.400, -148.388, 25.406)
  2202.     AddZone("Garcia", -2395.140, -222.589, -5.3, -2354.090, -204.792, 200.000)
  2203.     AddZone("Shady Cabin", -1632.830, -2263.440, -3.0, -1601.330, -2231.790, 200.000)
  2204.     AddZone("East Los Santos", 2381.680, -1494.030, -89.084, 2421.030, -1454.350, 110.916)
  2205.     AddZone("LVA Freight Depot", 1236.630, 1163.410, -89.084, 1277.050, 1203.280, 110.916)
  2206.     AddZone("Blackfield Intersection", 1277.050, 1044.690, -89.084, 1315.350, 1087.630, 110.916)
  2207.     AddZone("Avispa Country Club", -2470.040, -355.493, 0.000, -2270.040, -318.493, 46.100)
  2208.     AddZone("Temple", 1252.330, -926.999, -89.084, 1357.000, -910.170, 110.916)
  2209.     AddZone("Unity Station", 1692.620, -1971.800, -20.492, 1812.620, -1932.800, 79.508)
  2210.     AddZone("LVA Freight Depot", 1315.350, 1044.690, -89.084, 1375.600, 1087.630, 110.916)
  2211.     AddZone("Los Flores", 2581.730, -1454.350, -89.084, 2632.830, -1393.420, 110.916)
  2212.     AddZone("Starfish Casino", 2437.390, 1858.100, -39.084, 2495.090, 1970.850, 60.916)
  2213.     AddZone("Easter Bay Chemicals", -1132.820, -787.391, 0.000, -956.476, -768.027, 200.000)
  2214.     AddZone("Downtown", 1370.850, -1170.870, -89.084, 1463.900, -1130.850, 110.916)
  2215.     AddZone("Esplanade East", -1620.300, 1176.520, -4.5, -1580.010, 1274.260, 200.000)
  2216.     AddZone("Market Station", 787.461, -1410.930, -34.126, 866.009, -1310.210, 65.874)
  2217.     AddZone("Linden Station", 2811.250, 1229.590, -39.594, 2861.250, 1407.590, 60.406)
  2218.     AddZone("Montgomery Intersection", 1582.440, 347.457, 0.000, 1664.620, 401.750, 200.000)
  2219.     AddZone("Frederick Bridge", 2759.250, 296.501, 0.000, 2774.250, 594.757, 200.000)
  2220.     AddZone("Yellow Bell Station", 1377.480, 2600.430, -21.926, 1492.450, 2687.360, 78.074)
  2221.     AddZone("Downtown Los Santos", 1507.510, -1385.210, 110.916, 1582.550, -1325.310, 335.916)
  2222.     AddZone("Jefferson", 2185.330, -1210.740, -89.084, 2281.450, -1154.590, 110.916)
  2223.     AddZone("Mulholland", 1318.130, -910.170, -89.084, 1357.000, -768.027, 110.916)
  2224.     AddZone("Avispa Country Club", -2361.510, -417.199, 0.000, -2270.040, -355.493, 200.000)
  2225.     AddZone("Jefferson", 1996.910, -1449.670, -89.084, 2056.860, -1350.720, 110.916)
  2226.     AddZone("Julius Thruway West", 1236.630, 2142.860, -89.084, 1297.470, 2243.230, 110.916)
  2227.     AddZone("Jefferson", 2124.660, -1494.030, -89.084, 2266.210, -1449.670, 110.916)
  2228.     AddZone("Julius Thruway North", 1848.400, 2478.490, -89.084, 1938.800, 2553.490, 110.916)
  2229.     AddZone("Rodeo", 422.680, -1570.200, -89.084, 466.223, -1406.050, 110.916)
  2230.     AddZone("Cranberry Station", -2007.830, 56.306, 0.000, -1922.000, 224.782, 100.000)
  2231.     AddZone("Downtown Los Santos", 1391.050, -1026.330, -89.084, 1463.900, -926.999, 110.916)
  2232.     AddZone("Redsands West", 1704.590, 2243.230, -89.084, 1777.390, 2342.830, 110.916)
  2233.     AddZone("Little Mexico", 1758.900, -1722.260, -89.084, 1812.620, -1577.590, 110.916)
  2234.     AddZone("Blackfield Intersection", 1375.600, 823.228, -89.084, 1457.390, 919.447, 110.916)
  2235.     AddZone("Los Santos International", 1974.630, -2394.330, -39.084, 2089.000, -2256.590, 60.916)
  2236.     AddZone("Beacon Hill", -399.633, -1075.520, -1.489, -319.033, -977.516, 198.511)
  2237.     AddZone("Rodeo", 334.503, -1501.950, -89.084, 422.680, -1406.050, 110.916)
  2238.     AddZone("Richman", 225.165, -1369.620, -89.084, 334.503, -1292.070, 110.916)
  2239.     AddZone("Downtown Los Santos", 1724.760, -1250.900, -89.084, 1812.620, -1150.870, 110.916)
  2240.     AddZone("The Strip", 2027.400, 1703.230, -89.084, 2137.400, 1783.230, 110.916)
  2241.     AddZone("Downtown Los Santos", 1378.330, -1130.850, -89.084, 1463.900, -1026.330, 110.916)
  2242.     AddZone("Blackfield Intersection", 1197.390, 1044.690, -89.084, 1277.050, 1163.390, 110.916)
  2243.     AddZone("Conference Center", 1073.220, -1842.270, -89.084, 1323.900, -1804.210, 110.916)
  2244.     AddZone("Montgomery", 1451.400, 347.457, -6.1, 1582.440, 420.802, 200.000)
  2245.     AddZone("Foster Valley", -2270.040, -430.276, -1.2, -2178.690, -324.114, 200.000)
  2246.     AddZone("Blackfield Chapel", 1325.600, 596.349, -89.084, 1375.600, 795.010, 110.916)
  2247.     AddZone("Los Santos International", 2051.630, -2597.260, -39.084, 2152.450, -2394.330, 60.916)
  2248.     AddZone("Mulholland", 1096.470, -910.170, -89.084, 1169.130, -768.027, 110.916)
  2249.     AddZone("Yellow Bell Gol Course", 1457.460, 2723.230, -89.084, 1534.560, 2863.230, 110.916)
  2250.     AddZone("The Strip", 2027.400, 1783.230, -89.084, 2162.390, 1863.230, 110.916)
  2251.     AddZone("Jefferson", 2056.860, -1210.740, -89.084, 2185.330, -1126.320, 110.916)
  2252.     AddZone("Mulholland", 952.604, -937.184, -89.084, 1096.470, -860.619, 110.916)
  2253.     AddZone("Aldea Malvada", -1372.140, 2498.520, 0.000, -1277.590, 2615.350, 200.000)
  2254.     AddZone("Las Colinas", 2126.860, -1126.320, -89.084, 2185.330, -934.489, 110.916)
  2255.     AddZone("Las Colinas", 1994.330, -1100.820, -89.084, 2056.860, -920.815, 110.916)
  2256.     AddZone("Richman", 647.557, -954.662, -89.084, 768.694, -860.619, 110.916)
  2257.     AddZone("LVA Freight Depot", 1277.050, 1087.630, -89.084, 1375.600, 1203.280, 110.916)
  2258.     AddZone("Julius Thruway North", 1377.390, 2433.230, -89.084, 1534.560, 2507.230, 110.916)
  2259.     AddZone("Willowfield", 2201.820, -2095.000, -89.084, 2324.000, -1989.900, 110.916)
  2260.     AddZone("Julius Thruway North", 1704.590, 2342.830, -89.084, 1848.400, 2433.230, 110.916)
  2261.     AddZone("Temple", 1252.330, -1130.850, -89.084, 1378.330, -1026.330, 110.916)
  2262.     AddZone("Little Mexico", 1701.900, -1842.270, -89.084, 1812.620, -1722.260, 110.916)
  2263.     AddZone("Queens", -2411.220, 373.539, 0.000, -2253.540, 458.411, 200.000)
  2264.     AddZone("Las Venturas Airport", 1515.810, 1586.400, -12.500, 1729.950, 1714.560, 87.500)
  2265.     AddZone("Richman", 225.165, -1292.070, -89.084, 466.223, -1235.070, 110.916)
  2266.     AddZone("Temple", 1252.330, -1026.330, -89.084, 1391.050, -926.999, 110.916)
  2267.     AddZone("East Los Santos", 2266.260, -1494.030, -89.084, 2381.680, -1372.040, 110.916)
  2268.     AddZone("Julius Thruway East", 2623.180, 943.235, -89.084, 2749.900, 1055.960, 110.916)
  2269.     AddZone("Willowfield", 2541.700, -1941.400, -89.084, 2703.580, -1852.870, 110.916)
  2270.     AddZone("Las Colinas", 2056.860, -1126.320, -89.084, 2126.860, -920.815, 110.916)
  2271.     AddZone("Julius Thruway East", 2625.160, 2202.760, -89.084, 2685.160, 2442.550, 110.916)
  2272.     AddZone("Rodeo", 225.165, -1501.950, -89.084, 334.503, -1369.620, 110.916)
  2273.     AddZone("Las Brujas", -365.167, 2123.010, -3.0, -208.570, 2217.680, 200.000)
  2274.     AddZone("Julius Thruway East", 2536.430, 2442.550, -89.084, 2685.160, 2542.550, 110.916)
  2275.     AddZone("Rodeo", 334.503, -1406.050, -89.084, 466.223, -1292.070, 110.916)
  2276.     AddZone("Vinewood", 647.557, -1227.280, -89.084, 787.461, -1118.280, 110.916)
  2277.     AddZone("Rodeo", 422.680, -1684.650, -89.084, 558.099, -1570.200, 110.916)
  2278.     AddZone("Julius Thruway North", 2498.210, 2542.550, -89.084, 2685.160, 2626.550, 110.916)
  2279.     AddZone("Downtown Los Santos", 1724.760, -1430.870, -89.084, 1812.620, -1250.900, 110.916)
  2280.     AddZone("Rodeo", 225.165, -1684.650, -89.084, 312.803, -1501.950, 110.916)
  2281.     AddZone("Jefferson", 2056.860, -1449.670, -89.084, 2266.210, -1372.040, 110.916)
  2282.     AddZone("Hampton Barns", 603.035, 264.312, 0.000, 761.994, 366.572, 200.000)
  2283.     AddZone("Temple", 1096.470, -1130.840, -89.084, 1252.330, -1026.330, 110.916)
  2284.     AddZone("Kincaid Bridge", -1087.930, 855.370, -89.084, -961.950, 986.281, 110.916)
  2285.     AddZone("Verona Beach", 1046.150, -1722.260, -89.084, 1161.520, -1577.590, 110.916)
  2286.     AddZone("Commerce", 1323.900, -1722.260, -89.084, 1440.900, -1577.590, 110.916)
  2287.     AddZone("Mulholland", 1357.000, -926.999, -89.084, 1463.900, -768.027, 110.916)
  2288.     AddZone("Rodeo", 466.223, -1570.200, -89.084, 558.099, -1385.070, 110.916)
  2289.     AddZone("Mulholland", 911.802, -860.619, -89.084, 1096.470, -768.027, 110.916)
  2290.     AddZone("Mulholland", 768.694, -954.662, -89.084, 952.604, -860.619, 110.916)
  2291.     AddZone("Julius Thruway South", 2377.390, 788.894, -89.084, 2537.390, 897.901, 110.916)
  2292.     AddZone("Idlewood", 1812.620, -1852.870, -89.084, 1971.660, -1742.310, 110.916)
  2293.     AddZone("Ocean Docks", 2089.000, -2394.330, -89.084, 2201.820, -2235.840, 110.916)
  2294.     AddZone("Commerce", 1370.850, -1577.590, -89.084, 1463.900, -1384.950, 110.916)
  2295.     AddZone("Julius Thruway North", 2121.400, 2508.230, -89.084, 2237.400, 2663.170, 110.916)
  2296.     AddZone("Temple", 1096.470, -1026.330, -89.084, 1252.330, -910.170, 110.916)
  2297.     AddZone("Glen Park", 1812.620, -1449.670, -89.084, 1996.910, -1350.720, 110.916)
  2298.     AddZone("Easter Bay Airport", -1242.980, -50.096, 0.000, -1213.910, 578.396, 200.000)
  2299.     AddZone("Martin Bridge", -222.179, 293.324, 0.000, -122.126, 476.465, 200.000)
  2300.     AddZone("The Strip", 2106.700, 1863.230, -89.084, 2162.390, 2202.760, 110.916)
  2301.     AddZone("Willowfield", 2541.700, -2059.230, -89.084, 2703.580, -1941.400, 110.916)
  2302.     AddZone("Marina", 807.922, -1577.590, -89.084, 926.922, -1416.250, 110.916)
  2303.     AddZone("Las Venturas Airport", 1457.370, 1143.210, -89.084, 1777.400, 1203.280, 110.916)
  2304.     AddZone("Idlewood", 1812.620, -1742.310, -89.084, 1951.660, -1602.310, 110.916)
  2305.     AddZone("Esplanade East", -1580.010, 1025.980, -6.1, -1499.890, 1274.260, 200.000)
  2306.     AddZone("Downtown Los Santos", 1370.850, -1384.950, -89.084, 1463.900, -1170.870, 110.916)
  2307.     AddZone("The Mako Span", 1664.620, 401.750, 0.000, 1785.140, 567.203, 200.000)
  2308.     AddZone("Rodeo", 312.803, -1684.650, -89.084, 422.680, -1501.950, 110.916)
  2309.     AddZone("Pershing Square", 1440.900, -1722.260, -89.084, 1583.500, -1577.590, 110.916)
  2310.     AddZone("Mulholland", 687.802, -860.619, -89.084, 911.802, -768.027, 110.916)
  2311.     AddZone("Gant Bridge", -2741.070, 1490.470, -6.1, -2616.400, 1659.680, 200.000)
  2312.     AddZone("Las Colinas", 2185.330, -1154.590, -89.084, 2281.450, -934.489, 110.916)
  2313.     AddZone("Mulholland", 1169.130, -910.170, -89.084, 1318.130, -768.027, 110.916)
  2314.     AddZone("Julius Thruway North", 1938.800, 2508.230, -89.084, 2121.400, 2624.230, 110.916)
  2315.     AddZone("Commerce", 1667.960, -1577.590, -89.084, 1812.620, -1430.870, 110.916)
  2316.     AddZone("Rodeo", 72.648, -1544.170, -89.084, 225.165, -1404.970, 110.916)
  2317.     AddZone("Roca Escalante", 2536.430, 2202.760, -89.084, 2625.160, 2442.550, 110.916)
  2318.     AddZone("Rodeo", 72.648, -1684.650, -89.084, 225.165, -1544.170, 110.916)
  2319.     AddZone("Market", 952.663, -1310.210, -89.084, 1072.660, -1130.850, 110.916)
  2320.     AddZone("Las Colinas", 2632.740, -1135.040, -89.084, 2747.740, -945.035, 110.916)
  2321.     AddZone("Mulholland", 861.085, -674.885, -89.084, 1156.550, -600.896, 110.916)
  2322.     AddZone("King's", -2253.540, 373.539, -9.1, -1993.280, 458.411, 200.000)
  2323.     AddZone("Redsands East", 1848.400, 2342.830, -89.084, 2011.940, 2478.490, 110.916)
  2324.     AddZone("Downtown", -1580.010, 744.267, -6.1, -1499.890, 1025.980, 200.000)
  2325.     AddZone("Conference Center", 1046.150, -1804.210, -89.084, 1323.900, -1722.260, 110.916)
  2326.     AddZone("Richman", 647.557, -1118.280, -89.084, 787.461, -954.662, 110.916)
  2327.     AddZone("Ocean Flats", -2994.490, 277.411, -9.1, -2867.850, 458.411, 200.000)
  2328.     AddZone("Greenglass College", 964.391, 930.890, -89.084, 1166.530, 1044.690, 110.916)
  2329.     AddZone("Glen Park", 1812.620, -1100.820, -89.084, 1994.330, -973.380, 110.916)
  2330.     AddZone("LVA Freight Depot", 1375.600, 919.447, -89.084, 1457.370, 1203.280, 110.916)
  2331.     AddZone("Regular Tom", -405.770, 1712.860, -3.0, -276.719, 1892.750, 200.000)
  2332.     AddZone("Verona Beach", 1161.520, -1722.260, -89.084, 1323.900, -1577.590, 110.916)
  2333.     AddZone("East Los Santos", 2281.450, -1372.040, -89.084, 2381.680, -1135.040, 110.916)
  2334.     AddZone("Caligula's Palace", 2137.400, 1703.230, -89.084, 2437.390, 1783.230, 110.916)
  2335.     AddZone("Idlewood", 1951.660, -1742.310, -89.084, 2124.660, -1602.310, 110.916)
  2336.     AddZone("Pilgrim", 2624.400, 1383.230, -89.084, 2685.160, 1783.230, 110.916)
  2337.     AddZone("Idlewood", 2124.660, -1742.310, -89.084, 2222.560, -1494.030, 110.916)
  2338.     AddZone("Queens", -2533.040, 458.411, 0.000, -2329.310, 578.396, 200.000)
  2339.     AddZone("Downtown", -1871.720, 1176.420, -4.5, -1620.300, 1274.260, 200.000)
  2340.     AddZone("Commerce", 1583.500, -1722.260, -89.084, 1758.900, -1577.590, 110.916)
  2341.     AddZone("East Los Santos", 2381.680, -1454.350, -89.084, 2462.130, -1135.040, 110.916)
  2342.     AddZone("Marina", 647.712, -1577.590, -89.084, 807.922, -1416.250, 110.916)
  2343.     AddZone("Richman", 72.648, -1404.970, -89.084, 225.165, -1235.070, 110.916)
  2344.     AddZone("Vinewood", 647.712, -1416.250, -89.084, 787.461, -1227.280, 110.916)
  2345.     AddZone("East Los Santos", 2222.560, -1628.530, -89.084, 2421.030, -1494.030, 110.916)
  2346.     AddZone("Rodeo", 558.099, -1684.650, -89.084, 647.522, -1384.930, 110.916)
  2347.     AddZone("Easter Tunnel", -1709.710, -833.034, -1.5, -1446.010, -730.118, 200.000)
  2348.     AddZone("Rodeo", 466.223, -1385.070, -89.084, 647.522, -1235.070, 110.916)
  2349.     AddZone("Redsands East", 1817.390, 2202.760, -89.084, 2011.940, 2342.830, 110.916)
  2350.     AddZone("The Clown's Pocket", 2162.390, 1783.230, -89.084, 2437.390, 1883.230, 110.916)
  2351.     AddZone("Idlewood", 1971.660, -1852.870, -89.084, 2222.560, -1742.310, 110.916)
  2352.     AddZone("Montgomery Intersection", 1546.650, 208.164, 0.000, 1745.830, 347.457, 200.000)
  2353.     AddZone("Willowfield", 2089.000, -2235.840, -89.084, 2201.820, -1989.900, 110.916)
  2354.     AddZone("Temple", 952.663, -1130.840, -89.084, 1096.470, -937.184, 110.916)
  2355.     AddZone("Prickle Pine", 1848.400, 2553.490, -89.084, 1938.800, 2863.230, 110.916)
  2356.     AddZone("Los Santos International", 1400.970, -2669.260, -39.084, 2189.820, -2597.260, 60.916)
  2357.     AddZone("Garver Bridge", -1213.910, 950.022, -89.084, -1087.930, 1178.930, 110.916)
  2358.     AddZone("Garver Bridge", -1339.890, 828.129, -89.084, -1213.910, 1057.040, 110.916)
  2359.     AddZone("Kincaid Bridge", -1339.890, 599.218, -89.084, -1213.910, 828.129, 110.916)
  2360.     AddZone("Kincaid Bridge", -1213.910, 721.111, -89.084, -1087.930, 950.022, 110.916)
  2361.     AddZone("Verona Beach", 930.221, -2006.780, -89.084, 1073.220, -1804.210, 110.916)
  2362.     AddZone("Verdant Bluffs", 1073.220, -2006.780, -89.084, 1249.620, -1842.270, 110.916)
  2363.     AddZone("Vinewood", 787.461, -1130.840, -89.084, 952.604, -954.662, 110.916)
  2364.     AddZone("Vinewood", 787.461, -1310.210, -89.084, 952.663, -1130.840, 110.916)
  2365.     AddZone("Commerce", 1463.900, -1577.590, -89.084, 1667.960, -1430.870, 110.916)
  2366.     AddZone("Market", 787.461, -1416.250, -89.084, 1072.660, -1310.210, 110.916)
  2367.     AddZone("Rockshore West", 2377.390, 596.349, -89.084, 2537.390, 788.894, 110.916)
  2368.     AddZone("Julius Thruway North", 2237.400, 2542.550, -89.084, 2498.210, 2663.170, 110.916)
  2369.     AddZone("East Beach", 2632.830, -1668.130, -89.084, 2747.740, -1393.420, 110.916)
  2370.     AddZone("Fallow Bridge", 434.341, 366.572, 0.000, 603.035, 555.680, 200.000)
  2371.     AddZone("Willowfield", 2089.000, -1989.900, -89.084, 2324.000, -1852.870, 110.916)
  2372.     AddZone("Chinatown", -2274.170, 578.396, -7.6, -2078.670, 744.170, 200.000)
  2373.     AddZone("El Castillo del Diablo", -208.570, 2337.180, 0.000, 8.430, 2487.180, 200.000)
  2374.     AddZone("Ocean Docks", 2324.000, -2145.100, -89.084, 2703.580, -2059.230, 110.916)
  2375.     AddZone("Easter Bay Chemicals", -1132.820, -768.027, 0.000, -956.476, -578.118, 200.000)
  2376.     AddZone("The Visage", 1817.390, 1703.230, -89.084, 2027.400, 1863.230, 110.916)
  2377.     AddZone("Ocean Flats", -2994.490, -430.276, -1.2, -2831.890, -222.589, 200.000)
  2378.     AddZone("Richman", 321.356, -860.619, -89.084, 687.802, -768.027, 110.916)
  2379.     AddZone("Green Palms", 176.581, 1305.450, -3.0, 338.658, 1520.720, 200.000)
  2380.     AddZone("Richman", 321.356, -768.027, -89.084, 700.794, -674.885, 110.916)
  2381.     AddZone("Starfish Casino", 2162.390, 1883.230, -89.084, 2437.390, 2012.180, 110.916)
  2382.     AddZone("East Beach", 2747.740, -1668.130, -89.084, 2959.350, -1498.620, 110.916)
  2383.     AddZone("Jefferson", 2056.860, -1372.040, -89.084, 2281.450, -1210.740, 110.916)
  2384.     AddZone("Downtown Los Santos", 1463.900, -1290.870, -89.084, 1724.760, -1150.870, 110.916)
  2385.     AddZone("Downtown Los Santos", 1463.900, -1430.870, -89.084, 1724.760, -1290.870, 110.916)
  2386.     AddZone("Garver Bridge", -1499.890, 696.442, -179.615, -1339.890, 925.353, 20.385)
  2387.     AddZone("Julius Thruway South", 1457.390, 823.228, -89.084, 2377.390, 863.229, 110.916)
  2388.     AddZone("East Los Santos", 2421.030, -1628.530, -89.084, 2632.830, -1454.350, 110.916)
  2389.     AddZone("Greenglass College", 964.391, 1044.690, -89.084, 1197.390, 1203.220, 110.916)
  2390.     AddZone("Las Colinas", 2747.740, -1120.040, -89.084, 2959.350, -945.035, 110.916)
  2391.     AddZone("Mulholland", 737.573, -768.027, -89.084, 1142.290, -674.885, 110.916)
  2392.     AddZone("Ocean Docks", 2201.820, -2730.880, -89.084, 2324.000, -2418.330, 110.916)
  2393.     AddZone("East Los Santos", 2462.130, -1454.350, -89.084, 2581.730, -1135.040, 110.916)
  2394.     AddZone("Ganton", 2222.560, -1722.330, -89.084, 2632.830, -1628.530, 110.916)
  2395.     AddZone("Avispa Country Club", -2831.890, -430.276, -6.1, -2646.400, -222.589, 200.000)
  2396.     AddZone("Willowfield", 1970.620, -2179.250, -89.084, 2089.000, -1852.870, 110.916)
  2397.     AddZone("Esplanade North", -1982.320, 1274.260, -4.5, -1524.240, 1358.900, 200.000)
  2398.     AddZone("The High Roller", 1817.390, 1283.230, -89.084, 2027.390, 1469.230, 110.916)
  2399.     AddZone("Ocean Docks", 2201.820, -2418.330, -89.084, 2324.000, -2095.000, 110.916)
  2400.     AddZone("Last Dime Motel", 1823.080, 596.349, -89.084, 1997.220, 823.228, 110.916)
  2401.     AddZone("Bayside Marina", -2353.170, 2275.790, 0.000, -2153.170, 2475.790, 200.000)
  2402.     AddZone("King's", -2329.310, 458.411, -7.6, -1993.280, 578.396, 200.000)
  2403.     AddZone("El Corona", 1692.620, -2179.250, -89.084, 1812.620, -1842.270, 110.916)
  2404.     AddZone("Blackfield Chapel", 1375.600, 596.349, -89.084, 1558.090, 823.228, 110.916)
  2405.     AddZone("The Pink Swan", 1817.390, 1083.230, -89.084, 2027.390, 1283.230, 110.916)
  2406.     AddZone("Julius Thruway West", 1197.390, 1163.390, -89.084, 1236.630, 2243.230, 110.916)
  2407.     AddZone("Los Flores", 2581.730, -1393.420, -89.084, 2747.740, -1135.040, 110.916)
  2408.     AddZone("The Visage", 1817.390, 1863.230, -89.084, 2106.700, 2011.830, 110.916)
  2409.     AddZone("Prickle Pine", 1938.800, 2624.230, -89.084, 2121.400, 2861.550, 110.916)
  2410.     AddZone("Verona Beach", 851.449, -1804.210, -89.084, 1046.150, -1577.590, 110.916)
  2411.     AddZone("Robada Intersection", -1119.010, 1178.930, -89.084, -862.025, 1351.450, 110.916)
  2412.     AddZone("Linden Side", 2749.900, 943.235, -89.084, 2923.390, 1198.990, 110.916)
  2413.     AddZone("Ocean Docks", 2703.580, -2302.330, -89.084, 2959.350, -2126.900, 110.916)
  2414.     AddZone("Willowfield", 2324.000, -2059.230, -89.084, 2541.700, -1852.870, 110.916)
  2415.     AddZone("King's", -2411.220, 265.243, -9.1, -1993.280, 373.539, 200.000)
  2416.     AddZone("Commerce", 1323.900, -1842.270, -89.084, 1701.900, -1722.260, 110.916)
  2417.     AddZone("Mulholland", 1269.130, -768.027, -89.084, 1414.070, -452.425, 110.916)
  2418.     AddZone("Marina", 647.712, -1804.210, -89.084, 851.449, -1577.590, 110.916)
  2419.     AddZone("Battery Point", -2741.070, 1268.410, -4.5, -2533.040, 1490.470, 200.000)
  2420.     AddZone("The Four Dragons Casino", 1817.390, 863.232, -89.084, 2027.390, 1083.230, 110.916)
  2421.     AddZone("Blackfield", 964.391, 1203.220, -89.084, 1197.390, 1403.220, 110.916)
  2422.     AddZone("Julius Thruway North", 1534.560, 2433.230, -89.084, 1848.400, 2583.230, 110.916)
  2423.     AddZone("Yellow Bell Gol Course", 1117.400, 2723.230, -89.084, 1457.460, 2863.230, 110.916)
  2424.     AddZone("Idlewood", 1812.620, -1602.310, -89.084, 2124.660, -1449.670, 110.916)
  2425.     AddZone("Redsands West", 1297.470, 2142.860, -89.084, 1777.390, 2243.230, 110.916)
  2426.     AddZone("Doherty", -2270.040, -324.114, -1.2, -1794.920, -222.589, 200.000)
  2427.     AddZone("Hilltop Farm", 967.383, -450.390, -3.0, 1176.780, -217.900, 200.000)
  2428.     AddZone("Las Barrancas", -926.130, 1398.730, -3.0, -719.234, 1634.690, 200.000)
  2429.     AddZone("Pirates in Men's Pants", 1817.390, 1469.230, -89.084, 2027.400, 1703.230, 110.916)
  2430.     AddZone("City Hall", -2867.850, 277.411, -9.1, -2593.440, 458.411, 200.000)
  2431.     AddZone("Avispa Country Club", -2646.400, -355.493, 0.000, -2270.040, -222.589, 200.000)
  2432.     AddZone("The Strip", 2027.400, 863.229, -89.084, 2087.390, 1703.230, 110.916)
  2433.     AddZone("Hashbury", -2593.440, -222.589, -1.0, -2411.220, 54.722, 200.000)
  2434.     AddZone("Los Santos International", 1852.000, -2394.330, -89.084, 2089.000, -2179.250, 110.916)
  2435.     AddZone("Whitewood Estates", 1098.310, 1726.220, -89.084, 1197.390, 2243.230, 110.916)
  2436.     AddZone("Sherman Reservoir", -789.737, 1659.680, -89.084, -599.505, 1929.410, 110.916)
  2437.     AddZone("El Corona", 1812.620, -2179.250, -89.084, 1970.620, -1852.870, 110.916)
  2438.     AddZone("Downtown", -1700.010, 744.267, -6.1, -1580.010, 1176.520, 200.000)
  2439.     AddZone("Foster Valley", -2178.690, -1250.970, 0.000, -1794.920, -1115.580, 200.000)
  2440.     AddZone("Las Payasadas", -354.332, 2580.360, 2.0, -133.625, 2816.820, 200.000)
  2441.     AddZone("Valle Ocultado", -936.668, 2611.440, 2.0, -715.961, 2847.900, 200.000)
  2442.     AddZone("Blackfield Intersection", 1166.530, 795.010, -89.084, 1375.600, 1044.690, 110.916)
  2443.     AddZone("Ganton", 2222.560, -1852.870, -89.084, 2632.830, -1722.330, 110.916)
  2444.     AddZone("Easter Bay Airport", -1213.910, -730.118, 0.000, -1132.820, -50.096, 200.000)
  2445.     AddZone("Redsands East", 1817.390, 2011.830, -89.084, 2106.700, 2202.760, 110.916)
  2446.     AddZone("Esplanade East", -1499.890, 578.396, -79.615, -1339.890, 1274.260, 20.385)
  2447.     AddZone("Caligula's Palace", 2087.390, 1543.230, -89.084, 2437.390, 1703.230, 110.916)
  2448.     AddZone("Royal Casino", 2087.390, 1383.230, -89.084, 2437.390, 1543.230, 110.916)
  2449.     AddZone("Richman", 72.648, -1235.070, -89.084, 321.356, -1008.150, 110.916)
  2450.     AddZone("Starfish Casino", 2437.390, 1783.230, -89.084, 2685.160, 2012.180, 110.916)
  2451.     AddZone("Mulholland", 1281.130, -452.425, -89.084, 1641.130, -290.913, 110.916)
  2452.     AddZone("Downtown", -1982.320, 744.170, -6.1, -1871.720, 1274.260, 200.000)
  2453.     AddZone("Hankypanky Point", 2576.920, 62.158, 0.000, 2759.250, 385.503, 200.000)
  2454.     AddZone("K.A.C.C. Military Fuels", 2498.210, 2626.550, -89.084, 2749.900, 2861.550, 110.916)
  2455.     AddZone("Harry Gold Parkway", 1777.390, 863.232, -89.084, 1817.390, 2342.830, 110.916)
  2456.     AddZone("Bayside Tunnel", -2290.190, 2548.290, -89.084, -1950.190, 2723.290, 110.916)
  2457.     AddZone("Ocean Docks", 2324.000, -2302.330, -89.084, 2703.580, -2145.100, 110.916)
  2458.     AddZone("Richman", 321.356, -1044.070, -89.084, 647.557, -860.619, 110.916)
  2459.     AddZone("Randolph Industrial Estate", 1558.090, 596.349, -89.084, 1823.080, 823.235, 110.916)
  2460.     AddZone("East Beach", 2632.830, -1852.870, -89.084, 2959.350, -1668.130, 110.916)
  2461.     AddZone("Flint Water", -314.426, -753.874, -89.084, -106.339, -463.073, 110.916)
  2462.     AddZone("Blueberry", 19.607, -404.136, 3.8, 349.607, -220.137, 200.000)
  2463.     AddZone("Linden Station", 2749.900, 1198.990, -89.084, 2923.390, 1548.990, 110.916)
  2464.     AddZone("Glen Park", 1812.620, -1350.720, -89.084, 2056.860, -1100.820, 110.916)
  2465.     AddZone("Downtown", -1993.280, 265.243, -9.1, -1794.920, 578.396, 200.000)
  2466.     AddZone("Redsands West", 1377.390, 2243.230, -89.084, 1704.590, 2433.230, 110.916)
  2467.     AddZone("Richman", 321.356, -1235.070, -89.084, 647.522, -1044.070, 110.916)
  2468.     AddZone("Gant Bridge", -2741.450, 1659.680, -6.1, -2616.400, 2175.150, 200.000)
  2469.     AddZone("Lil' Probe Inn", -90.218, 1286.850, -3.0, 153.859, 1554.120, 200.000)
  2470.     AddZone("Flint Intersection", -187.700, -1596.760, -89.084, 17.063, -1276.600, 110.916)
  2471.     AddZone("Las Colinas", 2281.450, -1135.040, -89.084, 2632.740, -945.035, 110.916)
  2472.     AddZone("Sobell Rail Yards", 2749.900, 1548.990, -89.084, 2923.390, 1937.250, 110.916)
  2473.     AddZone("The Emerald Isle", 2011.940, 2202.760, -89.084, 2237.400, 2508.230, 110.916)
  2474.     AddZone("El Castillo del Diablo", -208.570, 2123.010, -7.6, 114.033, 2337.180, 200.000)
  2475.     AddZone("Santa Flora", -2741.070, 458.411, -7.6, -2533.040, 793.411, 200.000)
  2476.     AddZone("Playa del Seville", 2703.580, -2126.900, -89.084, 2959.350, -1852.870, 110.916)
  2477.     AddZone("Market", 926.922, -1577.590, -89.084, 1370.850, -1416.250, 110.916)
  2478.     AddZone("Queens", -2593.440, 54.722, 0.000, -2411.220, 458.411, 200.000)
  2479.     AddZone("Pilson Intersection", 1098.390, 2243.230, -89.084, 1377.390, 2507.230, 110.916)
  2480.     AddZone("Spinybed", 2121.400, 2663.170, -89.084, 2498.210, 2861.550, 110.916)
  2481.     AddZone("Pilgrim", 2437.390, 1383.230, -89.084, 2624.400, 1783.230, 110.916)
  2482.     AddZone("Blackfield", 964.391, 1403.220, -89.084, 1197.390, 1726.220, 110.916)
  2483.     AddZone("'The Big Ear'", -410.020, 1403.340, -3.0, -137.969, 1681.230, 200.000)
  2484.     AddZone("Dillimore", 580.794, -674.885, -9.5, 861.085, -404.790, 200.000)
  2485.     AddZone("El Quebrados", -1645.230, 2498.520, 0.000, -1372.140, 2777.850, 200.000)
  2486.     AddZone("Esplanade North", -2533.040, 1358.900, -4.5, -1996.660, 1501.210, 200.000)
  2487.     AddZone("Easter Bay Airport", -1499.890, -50.096, -1.0, -1242.980, 249.904, 200.000)
  2488.     AddZone("Fisher's Lagoon", 1916.990, -233.323, -100.000, 2131.720, 13.800, 200.000)
  2489.     AddZone("Mulholland", 1414.070, -768.027, -89.084, 1667.610, -452.425, 110.916)
  2490.     AddZone("East Beach", 2747.740, -1498.620, -89.084, 2959.350, -1120.040, 110.916)
  2491.     AddZone("San Andreas Sound", 2450.390, 385.503, -100.000, 2759.250, 562.349, 200.000)
  2492.     AddZone("Shady Creeks", -2030.120, -2174.890, -6.1, -1820.640, -1771.660, 200.000)
  2493.     AddZone("Market", 1072.660, -1416.250, -89.084, 1370.850, -1130.850, 110.916)
  2494.     AddZone("Rockshore West", 1997.220, 596.349, -89.084, 2377.390, 823.228, 110.916)
  2495.     AddZone("Prickle Pine", 1534.560, 2583.230, -89.084, 1848.400, 2863.230, 110.916)
  2496.     AddZone("Easter Basin", -1794.920, -50.096, -1.04, -1499.890, 249.904, 200.000)
  2497.     AddZone("Leafy Hollow", -1166.970, -1856.030, 0.000, -815.624, -1602.070, 200.000)
  2498.     AddZone("LVA Freight Depot", 1457.390, 863.229, -89.084, 1777.400, 1143.210, 110.916)
  2499.     AddZone("Prickle Pine", 1117.400, 2507.230, -89.084, 1534.560, 2723.230, 110.916)
  2500.     AddZone("Blueberry", 104.534, -220.137, 2.3, 349.607, 152.236, 200.000)
  2501.     AddZone("El Castillo del Diablo", -464.515, 2217.680, 0.000, -208.570, 2580.360, 200.000)
  2502.     AddZone("Downtown", -2078.670, 578.396, -7.6, -1499.890, 744.267, 200.000)
  2503.     AddZone("Rockshore East", 2537.390, 676.549, -89.084, 2902.350, 943.235, 110.916)
  2504.     AddZone("San Fierro Bay", -2616.400, 1501.210, -3.0, -1996.660, 1659.680, 200.000)
  2505.     AddZone("Paradiso", -2741.070, 793.411, -6.1, -2533.040, 1268.410, 200.000)
  2506.     AddZone("The Camel's Toe", 2087.390, 1203.230, -89.084, 2640.400, 1383.230, 110.916)
  2507.     AddZone("Old Venturas Strip", 2162.390, 2012.180, -89.084, 2685.160, 2202.760, 110.916)
  2508.     AddZone("Juniper Hill", -2533.040, 578.396, -7.6, -2274.170, 968.369, 200.000)
  2509.     AddZone("Juniper Hollow", -2533.040, 968.369, -6.1, -2274.170, 1358.900, 200.000)
  2510.     AddZone("Roca Escalante", 2237.400, 2202.760, -89.084, 2536.430, 2542.550, 110.916)
  2511.     AddZone("Julius Thruway East", 2685.160, 1055.960, -89.084, 2749.900, 2626.550, 110.916)
  2512.     AddZone("Verona Beach", 647.712, -2173.290, -89.084, 930.221, -1804.210, 110.916)
  2513.     AddZone("Foster Valley", -2178.690, -599.884, -1.2, -1794.920, -324.114, 200.000)
  2514.     AddZone("Arco del Oeste", -901.129, 2221.860, 0.000, -592.090, 2571.970, 200.000)
  2515.     AddZone("Fallen Tree", -792.254, -698.555, -5.3, -452.404, -380.043, 200.000)
  2516.     AddZone("The Farm", -1209.670, -1317.100, 114.981, -908.161, -787.391, 251.981)
  2517.     AddZone("The Sherman Dam", -968.772, 1929.410, -3.0, -481.126, 2155.260, 200.000)
  2518.     AddZone("Esplanade North", -1996.660, 1358.900, -4.5, -1524.240, 1592.510, 200.000)
  2519.     AddZone("Financial", -1871.720, 744.170, -6.1, -1701.300, 1176.420, 300.000)
  2520.     AddZone("Garcia", -2411.220, -222.589, -1.14, -2173.040, 265.243, 200.000)
  2521.     AddZone("Montgomery", 1119.510, 119.526, -3.0, 1451.400, 493.323, 200.000)
  2522.     AddZone("Creek", 2749.900, 1937.250, -89.084, 2921.620, 2669.790, 110.916)
  2523.     AddZone("Los Santos International", 1249.620, -2394.330, -89.084, 1852.000, -2179.250, 110.916)
  2524.     AddZone("Santa Maria Beach", 72.648, -2173.290, -89.084, 342.648, -1684.650, 110.916)
  2525.     AddZone("Mulholland Intersection", 1463.900, -1150.870, -89.084, 1812.620, -768.027, 110.916)
  2526.     AddZone("Angel Pine", -2324.940, -2584.290, -6.1, -1964.220, -2212.110, 200.000)
  2527.     AddZone("Verdant Meadows", 37.032, 2337.180, -3.0, 435.988, 2677.900, 200.000)
  2528.     AddZone("Octane Springs", 338.658, 1228.510, 0.000, 664.308, 1655.050, 200.000)
  2529.     AddZone("Come-A-Lot", 2087.390, 943.235, -89.084, 2623.180, 1203.230, 110.916)
  2530.     AddZone("Redsands West", 1236.630, 1883.110, -89.084, 1777.390, 2142.860, 110.916)
  2531.     AddZone("Santa Maria Beach", 342.648, -2173.290, -89.084, 647.712, -1684.650, 110.916)
  2532.     AddZone("Verdant Bluffs", 1249.620, -2179.250, -89.084, 1692.620, -1842.270, 110.916)
  2533.     AddZone("Las Venturas Airport", 1236.630, 1203.280, -89.084, 1457.370, 1883.110, 110.916)
  2534.     AddZone("Flint Range", -594.191, -1648.550, 0.000, -187.700, -1276.600, 200.000)
  2535.     AddZone("Verdant Bluffs", 930.221, -2488.420, -89.084, 1249.620, -2006.780, 110.916)
  2536.     AddZone("Palomino Creek", 2160.220, -149.004, 0.000, 2576.920, 228.322, 200.000)
  2537.     AddZone("Ocean Docks", 2373.770, -2697.090, -89.084, 2809.220, -2330.460, 110.916)
  2538.     AddZone("Easter Bay Airport", -1213.910, -50.096, -4.5, -947.980, 578.396, 200.000)
  2539.     AddZone("Whitewood Estates", 883.308, 1726.220, -89.084, 1098.310, 2507.230, 110.916)
  2540.     AddZone("Calton Heights", -2274.170, 744.170, -6.1, -1982.320, 1358.900, 200.000)
  2541.     AddZone("Easter Basin", -1794.920, 249.904, -9.1, -1242.980, 578.396, 200.000)
  2542.     AddZone("Los Santos Inlet", -321.744, -2224.430, -89.084, 44.615, -1724.430, 110.916)
  2543.     AddZone("Doherty", -2173.040, -222.589, -1.0, -1794.920, 265.243, 200.000)
  2544.     AddZone("Mount Chiliad", -2178.690, -2189.910, -47.917, -2030.120, -1771.660, 576.083)
  2545.     AddZone("Fort Carson", -376.233, 826.326, -3.0, 123.717, 1220.440, 200.000)
  2546.     AddZone("Foster Valley", -2178.690, -1115.580, 0.000, -1794.920, -599.884, 200.000)
  2547.     AddZone("Ocean Flats", -2994.490, -222.589, -1.0, -2593.440, 277.411, 200.000)
  2548.     AddZone("Fern Ridge", 508.189, -139.259, 0.000, 1306.660, 119.526, 200.000)
  2549.     AddZone("Bayside", -2741.070, 2175.150, 0.000, -2353.170, 2722.790, 200.000)
  2550.     AddZone("Las Venturas Airport", 1457.370, 1203.280, -89.084, 1777.390, 1883.110, 110.916)
  2551.     AddZone("Blueberry Acres", -319.676, -220.137, 0.000, 104.534, 293.324, 200.000)
  2552.     AddZone("Palisades", -2994.490, 458.411, -6.1, -2741.070, 1339.610, 200.000)
  2553.     AddZone("North Rock", 2285.370, -768.027, 0.000, 2770.590, -269.740, 200.000)
  2554.     AddZone("Hunter Quarry", 337.244, 710.840, -115.239, 860.554, 1031.710, 203.761)
  2555.     AddZone("Los Santos International", 1382.730, -2730.880, -89.084, 2201.820, -2394.330, 110.916)
  2556.     AddZone("Missionary Hill", -2994.490, -811.276, 0.000, -2178.690, -430.276, 200.000)
  2557.     AddZone("San Fierro Bay", -2616.400, 1659.680, -3.0, -1996.660, 2175.150, 200.000)
  2558.     AddZone("Restricted Area", -91.586, 1655.050, -50.000, 421.234, 2123.010, 250.000)
  2559.     AddZone("Mount Chiliad", -2997.470, -1115.580, -47.917, -2178.690, -971.913, 576.083)
  2560.     AddZone("Mount Chiliad", -2178.690, -1771.660, -47.917, -1936.120, -1250.970, 576.083)
  2561.     AddZone("Easter Bay Airport", -1794.920, -730.118, -3.0, -1213.910, -50.096, 200.000)
  2562.     AddZone("The Panopticon", -947.980, -304.320, -1.1, -319.676, 327.071, 200.000)
  2563.     AddZone("Shady Creeks", -1820.640, -2643.680, -8.0, -1226.780, -1771.660, 200.000)
  2564.     AddZone("Back o Beyond", -1166.970, -2641.190, 0.000, -321.744, -1856.030, 200.000)
  2565.     AddZone("Mount Chiliad", -2994.490, -2189.910, -47.917, -2178.690, -1115.580, 576.083)
  2566.     AddZone("Tierra Robada", -1213.910, 596.349, -242.990, -480.539, 1659.680, 900.000)
  2567.     AddZone("Flint County", -1213.910, -2892.970, -242.990, 44.615, -768.027, 900.000)
  2568.     AddZone("Whetstone", -2997.470, -2892.970, -242.990, -1213.910, -1115.580, 900.000)
  2569.     AddZone("Bone County", -480.539, 596.349, -242.990, 869.461, 2993.870, 900.000)
  2570.     AddZone("Tierra Robada", -2997.470, 1659.680, -242.990, -480.539, 2993.870, 900.000)
  2571.     AddZone("San Fierro", -2997.470, -1115.580, -242.990, -1213.910, 1659.680, 900.000)
  2572.     AddZone("Las Venturas", 869.461, 596.349, -242.990, 2997.060, 2993.870, 900.000)
  2573.     AddZone("Red County", -1213.910, -768.027, -242.990, 2997.060, 596.349, 900.000)
  2574.     AddZone("Los Santos", 44.615, -2892.970, -242.990, 2997.060, -768.027, 900.000)
  2575.     AddCube("A-1", -3000.000000,2750.000000,-500,-2750.000000,3000.000000,500)
  2576.     AddCube("A-2", -2750.000000,2750.000000,-500,-2500.000000,3000.000000,500)
  2577.     AddCube("A-3", -2500.000000,2750.000000,-500,-2250.000000,3000.000000,500)
  2578.     AddCube("A-4", -2250.000000,2750.000000,-500,-2000.000000,3000.000000,500)
  2579.     AddCube("A-5", -2000.000000,2750.000000,-500,-1750.000000,3000.000000,500)
  2580.     AddCube("A-6", -1750.000000,2750.000000,-500,-1500.000000,3000.000000,500)
  2581.     AddCube("A-7", -1500.000000,2750.000000,-500,-1250.000000,3000.000000,500)
  2582.     AddCube("A-8", -1250.000000,2750.000000,-500,-1000.000000,3000.000000,500)
  2583.     AddCube("A-9", -1000.000000,2750.000000,-500,-750.000000,3000.000000,500)
  2584.     AddCube("A-10", -750.000000,2750.000000,-500,-500.000000,3000.000000,500)
  2585.     AddCube("A-11", -500.000000,2750.000000,-500,-250.000000,3000.000000,500)
  2586.     AddCube("A-12", -250.000000,2750.000000,-500,0.000000,3000.000000,500)
  2587.     AddCube("A-13", 0.000000,2750.000000,-500,250.000000,3000.000000,500)
  2588.     AddCube("A-14", 250.000000,2750.000000,-500,500.000000,3000.000000,500)
  2589.     AddCube("A-15", 500.000000,2750.000000,-500,750.000000,3000.000000,500)
  2590.     AddCube("A-16", 750.000000,2750.000000,-500,1000.000000,3000.000000,500)
  2591.     AddCube("A-17", 1000.000000,2750.000000,-500,1250.000000,3000.000000,500)
  2592.     AddCube("A-18", 1250.000000,2750.000000,-500,1500.000000,3000.000000,500)
  2593.     AddCube("A-19", 1500.000000,2750.000000,-500,1750.000000,3000.000000,500)
  2594.     AddCube("A-20", 1750.000000,2750.000000,-500,2000.000000,3000.000000,500)
  2595.     AddCube("A-21", 2000.000000,2750.000000,-500,2250.000000,3000.000000,500)
  2596.     AddCube("A-22", 2250.000000,2750.000000,-500,2500.000000,3000.000000,500)
  2597.     AddCube("A-23", 2500.000000,2750.000000,-500,2750.000000,3000.000000,500)
  2598.     AddCube("A-24", 2750.000000,2750.000000,-500,3000.000000,3000.000000,500)
  2599.     AddCube("�-1", -3000.000000,2500.000000,-500,-2750.000000,2750.000000,500)
  2600.     AddCube("�-2", -2750.000000,2500.000000,-500,-2500.000000,2750.000000,500)
  2601.     AddCube("�-3", -2500.000000,2500.000000,-500,-2250.000000,2750.000000,500)
  2602.     AddCube("�-4", -2250.000000,2500.000000,-500,-2000.000000,2750.000000,500)
  2603.     AddCube("�-5", -2000.000000,2500.000000,-500,-1750.000000,2750.000000,500)
  2604.     AddCube("�-6", -1750.000000,2500.000000,-500,-1500.000000,2750.000000,500)
  2605.     AddCube("�-7", -1500.000000,2500.000000,-500,-1250.000000,2750.000000,500)
  2606.     AddCube("�-8", -1250.000000,2500.000000,-500,-1000.000000,2750.000000,500)
  2607.     AddCube("�-9", -1000.000000,2500.000000,-500,-750.000000,2750.000000,500)
  2608.     AddCube("�-10", -750.000000,2500.000000,-500,-500.000000,2750.000000,500)
  2609.     AddCube("�-11", -500.000000,2500.000000,-500,-250.000000,2750.000000,500)
  2610.     AddCube("�-12", -250.000000,2500.000000,-500,0.000000,2750.000000,500)
  2611.     AddCube("�-13", 0.000000,2500.000000,-500,250.000000,2750.000000,500)
  2612.     AddCube("�-14", 250.000000,2500.000000,-500,500.000000,2750.000000,500)
  2613.     AddCube("�-15", 500.000000,2500.000000,-500,750.000000,2750.000000,500)
  2614.     AddCube("�-16", 750.000000,2500.000000,-500,1000.000000,2750.000000,500)
  2615.     AddCube("�-17", 1000.000000,2500.000000,-500,1250.000000,2750.000000,500)
  2616.     AddCube("�-18", 1250.000000,2500.000000,-500,1500.000000,2750.000000,500)
  2617.     AddCube("�-19", 1500.000000,2500.000000,-500,1750.000000,2750.000000,500)
  2618.     AddCube("�-20", 1750.000000,2500.000000,-500,2000.000000,2750.000000,500)
  2619.     AddCube("�-21", 2000.000000,2500.000000,-500,2250.000000,2750.000000,500)
  2620.     AddCube("�-22", 2250.000000,2500.000000,-500,2500.000000,2750.000000,500)
  2621.     AddCube("�-23", 2500.000000,2500.000000,-500,2750.000000,2750.000000,500)
  2622.     AddCube("�-24", 2750.000000,2500.000000,-500,3000.000000,2750.000000,500)
  2623.     AddCube("�-1", -3000.000000,2250.000000,-500,-2750.000000,2500.000000,500)
  2624.     AddCube("�-2", -2750.000000,2250.000000,-500,-2500.000000,2500.000000,500)
  2625.     AddCube("�-3", -2500.000000,2250.000000,-500,-2250.000000,2500.000000,500)
  2626.     AddCube("�-4", -2250.000000,2250.000000,-500,-2000.000000,2500.000000,500)
  2627.     AddCube("�-5", -2000.000000,2250.000000,-500,-1750.000000,2500.000000,500)
  2628.     AddCube("�-6", -1750.000000,2250.000000,-500,-1500.000000,2500.000000,500)
  2629.     AddCube("�-7", -1500.000000,2250.000000,-500,-1250.000000,2500.000000,500)
  2630.     AddCube("�-8", -1250.000000,2250.000000,-500,-1000.000000,2500.000000,500)
  2631.     AddCube("�-9", -1000.000000,2250.000000,-500,-750.000000,2500.000000,500)
  2632.     AddCube("�-10", -750.000000,2250.000000,-500,-500.000000,2500.000000,500)
  2633.     AddCube("�-11", -500.000000,2250.000000,-500,-250.000000,2500.000000,500)
  2634.     AddCube("�-12", -250.000000,2250.000000,-500,0.000000,2500.000000,500)
  2635.     AddCube("�-13", 0.000000,2250.000000,-500,250.000000,2500.000000,500)
  2636.     AddCube("�-14", 250.000000,2250.000000,-500,500.000000,2500.000000,500)
  2637.     AddCube("�-15", 500.000000,2250.000000,-500,750.000000,2500.000000,500)
  2638.     AddCube("�-16", 750.000000,2250.000000,-500,1000.000000,2500.000000,500)
  2639.     AddCube("�-17", 1000.000000,2250.000000,-500,1250.000000,2500.000000,500)
  2640.     AddCube("�-18", 1250.000000,2250.000000,-500,1500.000000,2500.000000,500)
  2641.     AddCube("�-19", 1500.000000,2250.000000,-500,1750.000000,2500.000000,500)
  2642.     AddCube("�-20", 1750.000000,2250.000000,-500,2000.000000,2500.000000,500)
  2643.     AddCube("�-21", 2000.000000,2250.000000,-500,2250.000000,2500.000000,500)
  2644.     AddCube("�-22", 2250.000000,2250.000000,-500,2500.000000,2500.000000,500)
  2645.     AddCube("�-23", 2500.000000,2250.000000,-500,2750.000000,2500.000000,500)
  2646.     AddCube("�-24", 2750.000000,2250.000000,-500,3000.000000,2500.000000,500)
  2647.     AddCube("�-1", -3000.000000,2000.000000,-500,-2750.000000,2250.000000,500)
  2648.     AddCube("�-2", -2750.000000,2000.000000,-500,-2500.000000,2250.000000,500)
  2649.     AddCube("�-3", -2500.000000,2000.000000,-500,-2250.000000,2250.000000,500)
  2650.     AddCube("�-4", -2250.000000,2000.000000,-500,-2000.000000,2250.000000,500)
  2651.     AddCube("�-5", -2000.000000,2000.000000,-500,-1750.000000,2250.000000,500)
  2652.     AddCube("�-6", -1750.000000,2000.000000,-500,-1500.000000,2250.000000,500)
  2653.     AddCube("�-7", -1500.000000,2000.000000,-500,-1250.000000,2250.000000,500)
  2654.     AddCube("�-8", -1250.000000,2000.000000,-500,-1000.000000,2250.000000,500)
  2655.     AddCube("�-9", -1000.000000,2000.000000,-500,-750.000000,2250.000000,500)
  2656.     AddCube("�-10", -750.000000,2000.000000,-500,-500.000000,2250.000000,500)
  2657.     AddCube("�-11", -500.000000,2000.000000,-500,-250.000000,2250.000000,500)
  2658.     AddCube("�-12", -250.000000,2000.000000,-500,0.000000,2250.000000,500)
  2659.     AddCube("�-13", 0.000000,2000.000000,-500,250.000000,2250.000000,500)
  2660.     AddCube("�-14", 250.000000,2000.000000,-500,500.000000,2250.000000,500)
  2661.     AddCube("�-15", 500.000000,2000.000000,-500,750.000000,2250.000000,500)
  2662.     AddCube("�-16", 750.000000,2000.000000,-500,1000.000000,2250.000000,500)
  2663.     AddCube("�-17", 1000.000000,2000.000000,-500,1250.000000,2250.000000,500)
  2664.     AddCube("�-18", 1250.000000,2000.000000,-500,1500.000000,2250.000000,500)
  2665.     AddCube("�-19", 1500.000000,2000.000000,-500,1750.000000,2250.000000,500)
  2666.     AddCube("�-20", 1750.000000,2000.000000,-500,2000.000000,2250.000000,500)
  2667.     AddCube("�-21", 2000.000000,2000.000000,-500,2250.000000,2250.000000,500)
  2668.     AddCube("�-22", 2250.000000,2000.000000,-500,2500.000000,2250.000000,500)
  2669.     AddCube("�-23", 2500.000000,2000.000000,-500,2750.000000,2250.000000,500)
  2670.     AddCube("�-24", 2750.000000,2000.000000,-500,3000.000000,2250.000000,500)
  2671.     AddCube("�-1", -3000.000000,1750.000000,-500,-2750.000000,2000.000000,500)
  2672.     AddCube("�-2", -2750.000000,1750.000000,-500,-2500.000000,2000.000000,500)
  2673.     AddCube("�-3", -2500.000000,1750.000000,-500,-2250.000000,2000.000000,500)
  2674.     AddCube("�-4", -2250.000000,1750.000000,-500,-2000.000000,2000.000000,500)
  2675.     AddCube("�-5", -2000.000000,1750.000000,-500,-1750.000000,2000.000000,500)
  2676.     AddCube("�-6", -1750.000000,1750.000000,-500,-1500.000000,2000.000000,500)
  2677.     AddCube("�-7", -1500.000000,1750.000000,-500,-1250.000000,2000.000000,500)
  2678.     AddCube("�-8", -1250.000000,1750.000000,-500,-1000.000000,2000.000000,500)
  2679.     AddCube("�-9", -1000.000000,1750.000000,-500,-750.000000,2000.000000,500)
  2680.     AddCube("�-10", -750.000000,1750.000000,-500,-500.000000,2000.000000,500)
  2681.     AddCube("�-11", -500.000000,1750.000000,-500,-250.000000,2000.000000,500)
  2682.     AddCube("�-12", -250.000000,1750.000000,-500,0.000000,2000.000000,500)
  2683.     AddCube("�-13", 0.000000,1750.000000,-500,250.000000,2000.000000,500)
  2684.     AddCube("�-14", 250.000000,1750.000000,-500,500.000000,2000.000000,500)
  2685.     AddCube("�-15", 500.000000,1750.000000,-500,750.000000,2000.000000,500)
  2686.     AddCube("�-16", 750.000000,1750.000000,-500,1000.000000,2000.000000,500)
  2687.     AddCube("�-17", 1000.000000,1750.000000,-500,1250.000000,2000.000000,500)
  2688.     AddCube("�-18", 1250.000000,1750.000000,-500,1500.000000,2000.000000,500)
  2689.     AddCube("�-19", 1500.000000,1750.000000,-500,1750.000000,2000.000000,500)
  2690.     AddCube("�-20", 1750.000000,1750.000000,-500,2000.000000,2000.000000,500)
  2691.     AddCube("�-21", 2000.000000,1750.000000,-500,2250.000000,2000.000000,500)
  2692.     AddCube("�-22", 2250.000000,1750.000000,-500,2500.000000,2000.000000,500)
  2693.     AddCube("�-23", 2500.000000,1750.000000,-500,2750.000000,2000.000000,500)
  2694.     AddCube("�-24", 2750.000000,1750.000000,-500,3000.000000,2000.000000,500)
  2695.     AddCube("�-1", -3000.000000,1500.000000,-500,-2750.000000,1750.000000,500)
  2696.     AddCube("�-2", -2750.000000,1500.000000,-500,-2500.000000,1750.000000,500)
  2697.     AddCube("�-3", -2500.000000,1500.000000,-500,-2250.000000,1750.000000,500)
  2698.     AddCube("�-4", -2250.000000,1500.000000,-500,-2000.000000,1750.000000,500)
  2699.     AddCube("�-5", -2000.000000,1500.000000,-500,-1750.000000,1750.000000,500)
  2700.     AddCube("�-6", -1750.000000,1500.000000,-500,-1500.000000,1750.000000,500)
  2701.     AddCube("�-7", -1500.000000,1500.000000,-500,-1250.000000,1750.000000,500)
  2702.     AddCube("�-8", -1250.000000,1500.000000,-500,-1000.000000,1750.000000,500)
  2703.     AddCube("�-9", -1000.000000,1500.000000,-500,-750.000000,1750.000000,500)
  2704.     AddCube("�-10", -750.000000,1500.000000,-500,-500.000000,1750.000000,500)
  2705.     AddCube("�-11", -500.000000,1500.000000,-500,-250.000000,1750.000000,500)
  2706.     AddCube("�-12", -250.000000,1500.000000,-500,0.000000,1750.000000,500)
  2707.     AddCube("�-13", 0.000000,1500.000000,-500,250.000000,1750.000000,500)
  2708.     AddCube("�-14", 250.000000,1500.000000,-500,500.000000,1750.000000,500)
  2709.     AddCube("�-15", 500.000000,1500.000000,-500,750.000000,1750.000000,500)
  2710.     AddCube("�-16", 750.000000,1500.000000,-500,1000.000000,1750.000000,500)
  2711.     AddCube("�-17", 1000.000000,1500.000000,-500,1250.000000,1750.000000,500)
  2712.     AddCube("�-18", 1250.000000,1500.000000,-500,1500.000000,1750.000000,500)
  2713.     AddCube("�-19", 1500.000000,1500.000000,-500,1750.000000,1750.000000,500)
  2714.     AddCube("�-20", 1750.000000,1500.000000,-500,2000.000000,1750.000000,500)
  2715.     AddCube("�-21", 2000.000000,1500.000000,-500,2250.000000,1750.000000,500)
  2716.     AddCube("�-22", 2250.000000,1500.000000,-500,2500.000000,1750.000000,500)
  2717.     AddCube("�-23", 2500.000000,1500.000000,-500,2750.000000,1750.000000,500)
  2718.     AddCube("�-24", 2750.000000,1500.000000,-500,3000.000000,1750.000000,500)
  2719.     AddCube("�-1", -3000.000000,1250.000000,-500,-2750.000000,1500.000000,500)
  2720.     AddCube("�-2", -2750.000000,1250.000000,-500,-2500.000000,1500.000000,500)
  2721.     AddCube("�-3", -2500.000000,1250.000000,-500,-2250.000000,1500.000000,500)
  2722.     AddCube("�-4", -2250.000000,1250.000000,-500,-2000.000000,1500.000000,500)
  2723.     AddCube("�-5", -2000.000000,1250.000000,-500,-1750.000000,1500.000000,500)
  2724.     AddCube("�-6", -1750.000000,1250.000000,-500,-1500.000000,1500.000000,500)
  2725.     AddCube("�-7", -1500.000000,1250.000000,-500,-1250.000000,1500.000000,500)
  2726.     AddCube("�-8", -1250.000000,1250.000000,-500,-1000.000000,1500.000000,500)
  2727.     AddCube("�-9", -1000.000000,1250.000000,-500,-750.000000,1500.000000,500)
  2728.     AddCube("�-10", -750.000000,1250.000000,-500,-500.000000,1500.000000,500)
  2729.     AddCube("�-11", -500.000000,1250.000000,-500,-250.000000,1500.000000,500)
  2730.     AddCube("�-12", -250.000000,1250.000000,-500,0.000000,1500.000000,500)
  2731.     AddCube("�-13", 0.000000,1250.000000,-500,250.000000,1500.000000,500)
  2732.     AddCube("�-14", 250.000000,1250.000000,-500,500.000000,1500.000000,500)
  2733.     AddCube("�-15", 500.000000,1250.000000,-500,750.000000,1500.000000,500)
  2734.     AddCube("�-16", 750.000000,1250.000000,-500,1000.000000,1500.000000,500)
  2735.     AddCube("�-17", 1000.000000,1250.000000,-500,1250.000000,1500.000000,500)
  2736.     AddCube("�-18", 1250.000000,1250.000000,-500,1500.000000,1500.000000,500)
  2737.     AddCube("�-19", 1500.000000,1250.000000,-500,1750.000000,1500.000000,500)
  2738.     AddCube("�-20", 1750.000000,1250.000000,-500,2000.000000,1500.000000,500)
  2739.     AddCube("�-21", 2000.000000,1250.000000,-500,2250.000000,1500.000000,500)
  2740.     AddCube("�-22", 2250.000000,1250.000000,-500,2500.000000,1500.000000,500)
  2741.     AddCube("�-23", 2500.000000,1250.000000,-500,2750.000000,1500.000000,500)
  2742.     AddCube("�-24", 2750.000000,1250.000000,-500,3000.000000,1500.000000,500)
  2743.     AddCube("�-1", -3000.000000,1000.000000,-500,-2750.000000,1250.000000,500)
  2744.     AddCube("�-2", -2750.000000,1000.000000,-500,-2500.000000,1250.000000,500)
  2745.     AddCube("�-3", -2500.000000,1000.000000,-500,-2250.000000,1250.000000,500)
  2746.     AddCube("�-4", -2250.000000,1000.000000,-500,-2000.000000,1250.000000,500)
  2747.     AddCube("�-5", -2000.000000,1000.000000,-500,-1750.000000,1250.000000,500)
  2748.     AddCube("�-6", -1750.000000,1000.000000,-500,-1500.000000,1250.000000,500)
  2749.     AddCube("�-7", -1500.000000,1000.000000,-500,-1250.000000,1250.000000,500)
  2750.     AddCube("�-8", -1250.000000,1000.000000,-500,-1000.000000,1250.000000,500)
  2751.     AddCube("�-9", -1000.000000,1000.000000,-500,-750.000000,1250.000000,500)
  2752.     AddCube("�-10", -750.000000,1000.000000,-500,-500.000000,1250.000000,500)
  2753.     AddCube("�-11", -500.000000,1000.000000,-500,-250.000000,1250.000000,500)
  2754.     AddCube("�-12", -250.000000,1000.000000,-500,0.000000,1250.000000,500)
  2755.     AddCube("�-13", 0.000000,1000.000000,-500,250.000000,1250.000000,500)
  2756.     AddCube("�-14", 250.000000,1000.000000,-500,500.000000,1250.000000,500)
  2757.     AddCube("�-15", 500.000000,1000.000000,-500,750.000000,1250.000000,500)
  2758.     AddCube("�-16", 750.000000,1000.000000,-500,1000.000000,1250.000000,500)
  2759.     AddCube("�-17", 1000.000000,1000.000000,-500,1250.000000,1250.000000,500)
  2760.     AddCube("�-18", 1250.000000,1000.000000,-500,1500.000000,1250.000000,500)
  2761.     AddCube("�-19", 1500.000000,1000.000000,-500,1750.000000,1250.000000,500)
  2762.     AddCube("�-20", 1750.000000,1000.000000,-500,2000.000000,1250.000000,500)
  2763.     AddCube("�-21", 2000.000000,1000.000000,-500,2250.000000,1250.000000,500)
  2764.     AddCube("�-22", 2250.000000,1000.000000,-500,2500.000000,1250.000000,500)
  2765.     AddCube("�-23", 2500.000000,1000.000000,-500,2750.000000,1250.000000,500)
  2766.     AddCube("�-24", 2750.000000,1000.000000,-500,3000.000000,1250.000000,500)
  2767.     AddCube("�-1", -3000.000000,750.000000,-500,-2750.000000,1000.000000,500)
  2768.     AddCube("�-2", -2750.000000,750.000000,-500,-2500.000000,1000.000000,500)
  2769.     AddCube("�-3", -2500.000000,750.000000,-500,-2250.000000,1000.000000,500)
  2770.     AddCube("�-4", -2250.000000,750.000000,-500,-2000.000000,1000.000000,500)
  2771.     AddCube("�-5", -2000.000000,750.000000,-500,-1750.000000,1000.000000,500)
  2772.     AddCube("�-6", -1750.000000,750.000000,-500,-1500.000000,1000.000000,500)
  2773.     AddCube("�-7", -1500.000000,750.000000,-500,-1250.000000,1000.000000,500)
  2774.     AddCube("�-8", -1250.000000,750.000000,-500,-1000.000000,1000.000000,500)
  2775.     AddCube("�-9", -1000.000000,750.000000,-500,-750.000000,1000.000000,500)
  2776.     AddCube("�-10", -750.000000,750.000000,-500,-500.000000,1000.000000,500)
  2777.     AddCube("�-11", -500.000000,750.000000,-500,-250.000000,1000.000000,500)
  2778.     AddCube("�-12", -250.000000,750.000000,-500,0.000000,1000.000000,500)
  2779.     AddCube("�-13", 0.000000,750.000000,-500,250.000000,1000.000000,500)
  2780.     AddCube("�-14", 250.000000,750.000000,-500,500.000000,1000.000000,500)
  2781.     AddCube("�-15", 500.000000,750.000000,-500,750.000000,1000.000000,500)
  2782.     AddCube("�-16", 750.000000,750.000000,-500,1000.000000,1000.000000,500)
  2783.     AddCube("�-17", 1000.000000,750.000000,-500,1250.000000,1000.000000,500)
  2784.     AddCube("�-18", 1250.000000,750.000000,-500,1500.000000,1000.000000,500)
  2785.     AddCube("�-19", 1500.000000,750.000000,-500,1750.000000,1000.000000,500)
  2786.     AddCube("�-20", 1750.000000,750.000000,-500,2000.000000,1000.000000,500)
  2787.     AddCube("�-21", 2000.000000,750.000000,-500,2250.000000,1000.000000,500)
  2788.     AddCube("�-22", 2250.000000,750.000000,-500,2500.000000,1000.000000,500)
  2789.     AddCube("�-23", 2500.000000,750.000000,-500,2750.000000,1000.000000,500)
  2790.     AddCube("�-24", 2750.000000,750.000000,-500,3000.000000,1000.000000,500)
  2791.     AddCube("�-1", -3000.000000,500.000000,-500,-2750.000000,750.000000,500)
  2792.     AddCube("�-2", -2750.000000,500.000000,-500,-2500.000000,750.000000,500)
  2793.     AddCube("�-3", -2500.000000,500.000000,-500,-2250.000000,750.000000,500)
  2794.     AddCube("�-4", -2250.000000,500.000000,-500,-2000.000000,750.000000,500)
  2795.     AddCube("�-5", -2000.000000,500.000000,-500,-1750.000000,750.000000,500)
  2796.     AddCube("�-6", -1750.000000,500.000000,-500,-1500.000000,750.000000,500)
  2797.     AddCube("�-7", -1500.000000,500.000000,-500,-1250.000000,750.000000,500)
  2798.     AddCube("�-8", -1250.000000,500.000000,-500,-1000.000000,750.000000,500)
  2799.     AddCube("�-9", -1000.000000,500.000000,-500,-750.000000,750.000000,500)
  2800.     AddCube("�-10", -750.000000,500.000000,-500,-500.000000,750.000000,500)
  2801.     AddCube("�-11", -500.000000,500.000000,-500,-250.000000,750.000000,500)
  2802.     AddCube("�-12", -250.000000,500.000000,-500,0.000000,750.000000,500)
  2803.     AddCube("�-13", 0.000000,500.000000,-500,250.000000,750.000000,500)
  2804.     AddCube("�-14", 250.000000,500.000000,-500,500.000000,750.000000,500)
  2805.     AddCube("�-15", 500.000000,500.000000,-500,750.000000,750.000000,500)
  2806.     AddCube("�-16", 750.000000,500.000000,-500,1000.000000,750.000000,500)
  2807.     AddCube("�-17", 1000.000000,500.000000,-500,1250.000000,750.000000,500)
  2808.     AddCube("�-18", 1250.000000,500.000000,-500,1500.000000,750.000000,500)
  2809.     AddCube("�-19", 1500.000000,500.000000,-500,1750.000000,750.000000,500)
  2810.     AddCube("�-20", 1750.000000,500.000000,-500,2000.000000,750.000000,500)
  2811.     AddCube("�-21", 2000.000000,500.000000,-500,2250.000000,750.000000,500)
  2812.     AddCube("�-22", 2250.000000,500.000000,-500,2500.000000,750.000000,500)
  2813.     AddCube("�-23", 2500.000000,500.000000,-500,2750.000000,750.000000,500)
  2814.     AddCube("�-24", 2750.000000,500.000000,-500,3000.000000,750.000000,500)
  2815.     AddCube("�-1", -3000.000000,250.000000,-500,-2750.000000,500.000000,500)
  2816.     AddCube("�-2", -2750.000000,250.000000,-500,-2500.000000,500.000000,500)
  2817.     AddCube("�-3", -2500.000000,250.000000,-500,-2250.000000,500.000000,500)
  2818.     AddCube("�-4", -2250.000000,250.000000,-500,-2000.000000,500.000000,500)
  2819.     AddCube("�-5", -2000.000000,250.000000,-500,-1750.000000,500.000000,500)
  2820.     AddCube("�-6", -1750.000000,250.000000,-500,-1500.000000,500.000000,500)
  2821.     AddCube("�-7", -1500.000000,250.000000,-500,-1250.000000,500.000000,500)
  2822.     AddCube("�-8", -1250.000000,250.000000,-500,-1000.000000,500.000000,500)
  2823.     AddCube("�-9", -1000.000000,250.000000,-500,-750.000000,500.000000,500)
  2824.     AddCube("�-10", -750.000000,250.000000,-500,-500.000000,500.000000,500)
  2825.     AddCube("�-11", -500.000000,250.000000,-500,-250.000000,500.000000,500)
  2826.     AddCube("�-12", -250.000000,250.000000,-500,0.000000,500.000000,500)
  2827.     AddCube("�-13", 0.000000,250.000000,-500,250.000000,500.000000,500)
  2828.     AddCube("�-14", 250.000000,250.000000,-500,500.000000,500.000000,500)
  2829.     AddCube("�-15", 500.000000,250.000000,-500,750.000000,500.000000,500)
  2830.     AddCube("�-16", 750.000000,250.000000,-500,1000.000000,500.000000,500)
  2831.     AddCube("�-17", 1000.000000,250.000000,-500,1250.000000,500.000000,500)
  2832.     AddCube("�-18", 1250.000000,250.000000,-500,1500.000000,500.000000,500)
  2833.     AddCube("�-19", 1500.000000,250.000000,-500,1750.000000,500.000000,500)
  2834.     AddCube("�-20", 1750.000000,250.000000,-500,2000.000000,500.000000,500)
  2835.     AddCube("�-21", 2000.000000,250.000000,-500,2250.000000,500.000000,500)
  2836.     AddCube("�-22", 2250.000000,250.000000,-500,2500.000000,500.000000,500)
  2837.     AddCube("�-23", 2500.000000,250.000000,-500,2750.000000,500.000000,500)
  2838.     AddCube("�-24", 2750.000000,250.000000,-500,3000.000000,500.000000,500)
  2839.     AddCube("�-1", -3000.000000,0.000000,-500,-2750.000000,250.000000,500)
  2840.     AddCube("�-2", -2750.000000,0.000000,-500,-2500.000000,250.000000,500)
  2841.     AddCube("�-3", -2500.000000,0.000000,-500,-2250.000000,250.000000,500)
  2842.     AddCube("�-4", -2250.000000,0.000000,-500,-2000.000000,250.000000,500)
  2843.     AddCube("�-5", -2000.000000,0.000000,-500,-1750.000000,250.000000,500)
  2844.     AddCube("�-6", -1750.000000,0.000000,-500,-1500.000000,250.000000,500)
  2845.     AddCube("�-7", -1500.000000,0.000000,-500,-1250.000000,250.000000,500)
  2846.     AddCube("�-8", -1250.000000,0.000000,-500,-1000.000000,250.000000,500)
  2847.     AddCube("�-9", -1000.000000,0.000000,-500,-750.000000,250.000000,500)
  2848.     AddCube("�-10", -750.000000,0.000000,-500,-500.000000,250.000000,500)
  2849.     AddCube("�-11", -500.000000,0.000000,-500,-250.000000,250.000000,500)
  2850.     AddCube("�-12", -250.000000,0.000000,-500,0.000000,250.000000,500)
  2851.     AddCube("�-13", 0.000000,0.000000,-500,250.000000,250.000000,500)
  2852.     AddCube("�-14", 250.000000,0.000000,-500,500.000000,250.000000,500)
  2853.     AddCube("�-15", 500.000000,0.000000,-500,750.000000,250.000000,500)
  2854.     AddCube("�-16", 750.000000,0.000000,-500,1000.000000,250.000000,500)
  2855.     AddCube("�-17", 1000.000000,0.000000,-500,1250.000000,250.000000,500)
  2856.     AddCube("�-18", 1250.000000,0.000000,-500,1500.000000,250.000000,500)
  2857.     AddCube("�-19", 1500.000000,0.000000,-500,1750.000000,250.000000,500)
  2858.     AddCube("�-20", 1750.000000,0.000000,-500,2000.000000,250.000000,500)
  2859.     AddCube("�-21", 2000.000000,0.000000,-500,2250.000000,250.000000,500)
  2860.     AddCube("�-22", 2250.000000,0.000000,-500,2500.000000,250.000000,500)
  2861.     AddCube("�-23", 2500.000000,0.000000,-500,2750.000000,250.000000,500)
  2862.     AddCube("�-24", 2750.000000,0.000000,-500,3000.000000,250.000000,500)
  2863.     AddCube("�-1", -3000.000000,-250.000000,-500,-2750.000000,0.000000,500)
  2864.     AddCube("�-2", -2750.000000,-250.000000,-500,-2500.000000,0.000000,500)
  2865.     AddCube("�-3", -2500.000000,-250.000000,-500,-2250.000000,0.000000,500)
  2866.     AddCube("�-4", -2250.000000,-250.000000,-500,-2000.000000,0.000000,500)
  2867.     AddCube("�-5", -2000.000000,-250.000000,-500,-1750.000000,0.000000,500)
  2868.     AddCube("�-6", -1750.000000,-250.000000,-500,-1500.000000,0.000000,500)
  2869.     AddCube("�-7", -1500.000000,-250.000000,-500,-1250.000000,0.000000,500)
  2870.     AddCube("�-8", -1250.000000,-250.000000,-500,-1000.000000,0.000000,500)
  2871.     AddCube("�-9", -1000.000000,-250.000000,-500,-750.000000,0.000000,500)
  2872.     AddCube("�-10", -750.000000,-250.000000,-500,-500.000000,0.000000,500)
  2873.     AddCube("�-11", -500.000000,-250.000000,-500,-250.000000,0.000000,500)
  2874.     AddCube("�-12", -250.000000,-250.000000,-500,0.000000,0.000000,500)
  2875.     AddCube("�-13", 0.000000,-250.000000,-500,250.000000,0.000000,500)
  2876.     AddCube("�-14", 250.000000,-250.000000,-500,500.000000,0.000000,500)
  2877.     AddCube("�-15", 500.000000,-250.000000,-500,750.000000,0.000000,500)
  2878.     AddCube("�-16", 750.000000,-250.000000,-500,1000.000000,0.000000,500)
  2879.     AddCube("�-17", 1000.000000,-250.000000,-500,1250.000000,0.000000,500)
  2880.     AddCube("�-18", 1250.000000,-250.000000,-500,1500.000000,0.000000,500)
  2881.     AddCube("�-19", 1500.000000,-250.000000,-500,1750.000000,0.000000,500)
  2882.     AddCube("�-20", 1750.000000,-250.000000,-500,2000.000000,0.000000,500)
  2883.     AddCube("�-21", 2000.000000,-250.000000,-500,2250.000000,0.000000,500)
  2884.     AddCube("�-22", 2250.000000,-250.000000,-500,2500.000000,0.000000,500)
  2885.     AddCube("�-23", 2500.000000,-250.000000,-500,2750.000000,0.000000,500)
  2886.     AddCube("�-24", 2750.000000,-250.000000,-500,3000.000000,0.000000,500)
  2887.     AddCube("�-1", -3000.000000,-500.000000,-500,-2750.000000,-250.000000,500)
  2888.     AddCube("�-2", -2750.000000,-500.000000,-500,-2500.000000,-250.000000,500)
  2889.     AddCube("�-3", -2500.000000,-500.000000,-500,-2250.000000,-250.000000,500)
  2890.     AddCube("�-4", -2250.000000,-500.000000,-500,-2000.000000,-250.000000,500)
  2891.     AddCube("�-5", -2000.000000,-500.000000,-500,-1750.000000,-250.000000,500)
  2892.     AddCube("�-6", -1750.000000,-500.000000,-500,-1500.000000,-250.000000,500)
  2893.     AddCube("�-7", -1500.000000,-500.000000,-500,-1250.000000,-250.000000,500)
  2894.     AddCube("�-8", -1250.000000,-500.000000,-500,-1000.000000,-250.000000,500)
  2895.     AddCube("�-9", -1000.000000,-500.000000,-500,-750.000000,-250.000000,500)
  2896.     AddCube("�-10", -750.000000,-500.000000,-500,-500.000000,-250.000000,500)
  2897.     AddCube("�-11", -500.000000,-500.000000,-500,-250.000000,-250.000000,500)
  2898.     AddCube("�-12", -250.000000,-500.000000,-500,0.000000,-250.000000,500)
  2899.     AddCube("�-13", 0.000000,-500.000000,-500,250.000000,-250.000000,500)
  2900.     AddCube("�-14", 250.000000,-500.000000,-500,500.000000,-250.000000,500)
  2901.     AddCube("�-15", 500.000000,-500.000000,-500,750.000000,-250.000000,500)
  2902.     AddCube("�-16", 750.000000,-500.000000,-500,1000.000000,-250.000000,500)
  2903.     AddCube("�-17", 1000.000000,-500.000000,-500,1250.000000,-250.000000,500)
  2904.     AddCube("�-18", 1250.000000,-500.000000,-500,1500.000000,-250.000000,500)
  2905.     AddCube("�-19", 1500.000000,-500.000000,-500,1750.000000,-250.000000,500)
  2906.     AddCube("�-20", 1750.000000,-500.000000,-500,2000.000000,-250.000000,500)
  2907.     AddCube("�-21", 2000.000000,-500.000000,-500,2250.000000,-250.000000,500)
  2908.     AddCube("�-22", 2250.000000,-500.000000,-500,2500.000000,-250.000000,500)
  2909.     AddCube("�-23", 2500.000000,-500.000000,-500,2750.000000,-250.000000,500)
  2910.     AddCube("�-24", 2750.000000,-500.000000,-500,3000.000000,-250.000000,500)
  2911.     AddCube("�-1", -3000.000000,-750.000000,-500,-2750.000000,-500.000000,500)
  2912.     AddCube("�-2", -2750.000000,-750.000000,-500,-2500.000000,-500.000000,500)
  2913.     AddCube("�-3", -2500.000000,-750.000000,-500,-2250.000000,-500.000000,500)
  2914.     AddCube("�-4", -2250.000000,-750.000000,-500,-2000.000000,-500.000000,500)
  2915.     AddCube("�-5", -2000.000000,-750.000000,-500,-1750.000000,-500.000000,500)
  2916.     AddCube("�-6", -1750.000000,-750.000000,-500,-1500.000000,-500.000000,500)
  2917.     AddCube("�-7", -1500.000000,-750.000000,-500,-1250.000000,-500.000000,500)
  2918.     AddCube("�-8", -1250.000000,-750.000000,-500,-1000.000000,-500.000000,500)
  2919.     AddCube("�-9", -1000.000000,-750.000000,-500,-750.000000,-500.000000,500)
  2920.     AddCube("�-10", -750.000000,-750.000000,-500,-500.000000,-500.000000,500)
  2921.     AddCube("�-11", -500.000000,-750.000000,-500,-250.000000,-500.000000,500)
  2922.     AddCube("�-12", -250.000000,-750.000000,-500,0.000000,-500.000000,500)
  2923.     AddCube("�-13", 0.000000,-750.000000,-500,250.000000,-500.000000,500)
  2924.     AddCube("�-14", 250.000000,-750.000000,-500,500.000000,-500.000000,500)
  2925.     AddCube("�-15", 500.000000,-750.000000,-500,750.000000,-500.000000,500)
  2926.     AddCube("�-16", 750.000000,-750.000000,-500,1000.000000,-500.000000,500)
  2927.     AddCube("�-17", 1000.000000,-750.000000,-500,1250.000000,-500.000000,500)
  2928.     AddCube("�-18", 1250.000000,-750.000000,-500,1500.000000,-500.000000,500)
  2929.     AddCube("�-19", 1500.000000,-750.000000,-500,1750.000000,-500.000000,500)
  2930.     AddCube("�-20", 1750.000000,-750.000000,-500,2000.000000,-500.000000,500)
  2931.     AddCube("�-21", 2000.000000,-750.000000,-500,2250.000000,-500.000000,500)
  2932.     AddCube("�-22", 2250.000000,-750.000000,-500,2500.000000,-500.000000,500)
  2933.     AddCube("�-23", 2500.000000,-750.000000,-500,2750.000000,-500.000000,500)
  2934.     AddCube("�-24", 2750.000000,-750.000000,-500,3000.000000,-500.000000,500)
  2935.     AddCube("�-1", -3000.000000,-1000.000000,-500,-2750.000000,-750.000000,500)
  2936.     AddCube("�-2", -2750.000000,-1000.000000,-500,-2500.000000,-750.000000,500)
  2937.     AddCube("�-3", -2500.000000,-1000.000000,-500,-2250.000000,-750.000000,500)
  2938.     AddCube("�-4", -2250.000000,-1000.000000,-500,-2000.000000,-750.000000,500)
  2939.     AddCube("�-5", -2000.000000,-1000.000000,-500,-1750.000000,-750.000000,500)
  2940.     AddCube("�-6", -1750.000000,-1000.000000,-500,-1500.000000,-750.000000,500)
  2941.     AddCube("�-7", -1500.000000,-1000.000000,-500,-1250.000000,-750.000000,500)
  2942.     AddCube("�-8", -1250.000000,-1000.000000,-500,-1000.000000,-750.000000,500)
  2943.     AddCube("�-9", -1000.000000,-1000.000000,-500,-750.000000,-750.000000,500)
  2944.     AddCube("�-10", -750.000000,-1000.000000,-500,-500.000000,-750.000000,500)
  2945.     AddCube("�-11", -500.000000,-1000.000000,-500,-250.000000,-750.000000,500)
  2946.     AddCube("�-12", -250.000000,-1000.000000,-500,0.000000,-750.000000,500)
  2947.     AddCube("�-13", 0.000000,-1000.000000,-500,250.000000,-750.000000,500)
  2948.     AddCube("�-14", 250.000000,-1000.000000,-500,500.000000,-750.000000,500)
  2949.     AddCube("�-15", 500.000000,-1000.000000,-500,750.000000,-750.000000,500)
  2950.     AddCube("�-16", 750.000000,-1000.000000,-500,1000.000000,-750.000000,500)
  2951.     AddCube("�-17", 1000.000000,-1000.000000,-500,1250.000000,-750.000000,500)
  2952.     AddCube("�-18", 1250.000000,-1000.000000,-500,1500.000000,-750.000000,500)
  2953.     AddCube("�-19", 1500.000000,-1000.000000,-500,1750.000000,-750.000000,500)
  2954.     AddCube("�-20", 1750.000000,-1000.000000,-500,2000.000000,-750.000000,500)
  2955.     AddCube("�-21", 2000.000000,-1000.000000,-500,2250.000000,-750.000000,500)
  2956.     AddCube("�-22", 2250.000000,-1000.000000,-500,2500.000000,-750.000000,500)
  2957.     AddCube("�-23", 2500.000000,-1000.000000,-500,2750.000000,-750.000000,500)
  2958.     AddCube("�-24", 2750.000000,-1000.000000,-500,3000.000000,-750.000000,500)
  2959.     AddCube("�-1", -3000.000000,-1250.000000,-500,-2750.000000,-1000.000000,500)
  2960.     AddCube("�-2", -2750.000000,-1250.000000,-500,-2500.000000,-1000.000000,500)
  2961.     AddCube("�-3", -2500.000000,-1250.000000,-500,-2250.000000,-1000.000000,500)
  2962.     AddCube("�-4", -2250.000000,-1250.000000,-500,-2000.000000,-1000.000000,500)
  2963.     AddCube("�-5", -2000.000000,-1250.000000,-500,-1750.000000,-1000.000000,500)
  2964.     AddCube("�-6", -1750.000000,-1250.000000,-500,-1500.000000,-1000.000000,500)
  2965.     AddCube("�-7", -1500.000000,-1250.000000,-500,-1250.000000,-1000.000000,500)
  2966.     AddCube("�-8", -1250.000000,-1250.000000,-500,-1000.000000,-1000.000000,500)
  2967.     AddCube("�-9", -1000.000000,-1250.000000,-500,-750.000000,-1000.000000,500)
  2968.     AddCube("�-10", -750.000000,-1250.000000,-500,-500.000000,-1000.000000,500)
  2969.     AddCube("�-11", -500.000000,-1250.000000,-500,-250.000000,-1000.000000,500)
  2970.     AddCube("�-12", -250.000000,-1250.000000,-500,0.000000,-1000.000000,500)
  2971.     AddCube("�-13", 0.000000,-1250.000000,-500,250.000000,-1000.000000,500)
  2972.     AddCube("�-14", 250.000000,-1250.000000,-500,500.000000,-1000.000000,500)
  2973.     AddCube("�-15", 500.000000,-1250.000000,-500,750.000000,-1000.000000,500)
  2974.     AddCube("�-16", 750.000000,-1250.000000,-500,1000.000000,-1000.000000,500)
  2975.     AddCube("�-17", 1000.000000,-1250.000000,-500,1250.000000,-1000.000000,500)
  2976.     AddCube("�-18", 1250.000000,-1250.000000,-500,1500.000000,-1000.000000,500)
  2977.     AddCube("�-19", 1500.000000,-1250.000000,-500,1750.000000,-1000.000000,500)
  2978.     AddCube("�-20", 1750.000000,-1250.000000,-500,2000.000000,-1000.000000,500)
  2979.     AddCube("�-21", 2000.000000,-1250.000000,-500,2250.000000,-1000.000000,500)
  2980.     AddCube("�-22", 2250.000000,-1250.000000,-500,2500.000000,-1000.000000,500)
  2981.     AddCube("�-23", 2500.000000,-1250.000000,-500,2750.000000,-1000.000000,500)
  2982.     AddCube("�-24", 2750.000000,-1250.000000,-500,3000.000000,-1000.000000,500)
  2983.     AddCube("�-1", -3000.000000,-1500.000000,-500,-2750.000000,-1250.000000,500)
  2984.     AddCube("�-2", -2750.000000,-1500.000000,-500,-2500.000000,-1250.000000,500)
  2985.     AddCube("�-3", -2500.000000,-1500.000000,-500,-2250.000000,-1250.000000,500)
  2986.     AddCube("�-4", -2250.000000,-1500.000000,-500,-2000.000000,-1250.000000,500)
  2987.     AddCube("�-5", -2000.000000,-1500.000000,-500,-1750.000000,-1250.000000,500)
  2988.     AddCube("�-6", -1750.000000,-1500.000000,-500,-1500.000000,-1250.000000,500)
  2989.     AddCube("�-7", -1500.000000,-1500.000000,-500,-1250.000000,-1250.000000,500)
  2990.     AddCube("�-8", -1250.000000,-1500.000000,-500,-1000.000000,-1250.000000,500)
  2991.     AddCube("�-9", -1000.000000,-1500.000000,-500,-750.000000,-1250.000000,500)
  2992.     AddCube("�-10", -750.000000,-1500.000000,-500,-500.000000,-1250.000000,500)
  2993.     AddCube("�-11", -500.000000,-1500.000000,-500,-250.000000,-1250.000000,500)
  2994.     AddCube("�-12", -250.000000,-1500.000000,-500,0.000000,-1250.000000,500)
  2995.     AddCube("�-13", 0.000000,-1500.000000,-500,250.000000,-1250.000000,500)
  2996.     AddCube("�-14", 250.000000,-1500.000000,-500,500.000000,-1250.000000,500)
  2997.     AddCube("�-15", 500.000000,-1500.000000,-500,750.000000,-1250.000000,500)
  2998.     AddCube("�-16", 750.000000,-1500.000000,-500,1000.000000,-1250.000000,500)
  2999.     AddCube("�-17", 1000.000000,-1500.000000,-500,1250.000000,-1250.000000,500)
  3000.     AddCube("�-18", 1250.000000,-1500.000000,-500,1500.000000,-1250.000000,500)
  3001.     AddCube("�-19", 1500.000000,-1500.000000,-500,1750.000000,-1250.000000,500)
  3002.     AddCube("�-20", 1750.000000,-1500.000000,-500,2000.000000,-1250.000000,500)
  3003.     AddCube("�-21", 2000.000000,-1500.000000,-500,2250.000000,-1250.000000,500)
  3004.     AddCube("�-22", 2250.000000,-1500.000000,-500,2500.000000,-1250.000000,500)
  3005.     AddCube("�-23", 2500.000000,-1500.000000,-500,2750.000000,-1250.000000,500)
  3006.     AddCube("�-24", 2750.000000,-1500.000000,-500,3000.000000,-1250.000000,500)
  3007.     AddCube("�-1", -3000.000000,-1750.000000,-500,-2750.000000,-1500.000000,500)
  3008.     AddCube("�-2", -2750.000000,-1750.000000,-500,-2500.000000,-1500.000000,500)
  3009.     AddCube("�-3", -2500.000000,-1750.000000,-500,-2250.000000,-1500.000000,500)
  3010.     AddCube("�-4", -2250.000000,-1750.000000,-500,-2000.000000,-1500.000000,500)
  3011.     AddCube("�-5", -2000.000000,-1750.000000,-500,-1750.000000,-1500.000000,500)
  3012.     AddCube("�-6", -1750.000000,-1750.000000,-500,-1500.000000,-1500.000000,500)
  3013.     AddCube("�-7", -1500.000000,-1750.000000,-500,-1250.000000,-1500.000000,500)
  3014.     AddCube("�-8", -1250.000000,-1750.000000,-500,-1000.000000,-1500.000000,500)
  3015.     AddCube("�-9", -1000.000000,-1750.000000,-500,-750.000000,-1500.000000,500)
  3016.     AddCube("�-10", -750.000000,-1750.000000,-500,-500.000000,-1500.000000,500)
  3017.     AddCube("�-11", -500.000000,-1750.000000,-500,-250.000000,-1500.000000,500)
  3018.     AddCube("�-12", -250.000000,-1750.000000,-500,0.000000,-1500.000000,500)
  3019.     AddCube("�-13", 0.000000,-1750.000000,-500,250.000000,-1500.000000,500)
  3020.     AddCube("�-14", 250.000000,-1750.000000,-500,500.000000,-1500.000000,500)
  3021.     AddCube("�-15", 500.000000,-1750.000000,-500,750.000000,-1500.000000,500)
  3022.     AddCube("�-16", 750.000000,-1750.000000,-500,1000.000000,-1500.000000,500)
  3023.     AddCube("�-17", 1000.000000,-1750.000000,-500,1250.000000,-1500.000000,500)
  3024.     AddCube("�-18", 1250.000000,-1750.000000,-500,1500.000000,-1500.000000,500)
  3025.     AddCube("�-19", 1500.000000,-1750.000000,-500,1750.000000,-1500.000000,500)
  3026.     AddCube("�-20", 1750.000000,-1750.000000,-500,2000.000000,-1500.000000,500)
  3027.     AddCube("�-21", 2000.000000,-1750.000000,-500,2250.000000,-1500.000000,500)
  3028.     AddCube("�-22", 2250.000000,-1750.000000,-500,2500.000000,-1500.000000,500)
  3029.     AddCube("�-23", 2500.000000,-1750.000000,-500,2750.000000,-1500.000000,500)
  3030.     AddCube("�-24", 2750.000000,-1750.000000,-500,3000.000000,-1500.000000,500)
  3031.     AddCube("�-1", -3000.000000,-2000.000000,-500,-2750.000000,-1750.000000,500)
  3032.     AddCube("�-2", -2750.000000,-2000.000000,-500,-2500.000000,-1750.000000,500)
  3033.     AddCube("�-3", -2500.000000,-2000.000000,-500,-2250.000000,-1750.000000,500)
  3034.     AddCube("�-4", -2250.000000,-2000.000000,-500,-2000.000000,-1750.000000,500)
  3035.     AddCube("�-5", -2000.000000,-2000.000000,-500,-1750.000000,-1750.000000,500)
  3036.     AddCube("�-6", -1750.000000,-2000.000000,-500,-1500.000000,-1750.000000,500)
  3037.     AddCube("�-7", -1500.000000,-2000.000000,-500,-1250.000000,-1750.000000,500)
  3038.     AddCube("�-8", -1250.000000,-2000.000000,-500,-1000.000000,-1750.000000,500)
  3039.     AddCube("�-9", -1000.000000,-2000.000000,-500,-750.000000,-1750.000000,500)
  3040.     AddCube("�-10", -750.000000,-2000.000000,-500,-500.000000,-1750.000000,500)
  3041.     AddCube("�-11", -500.000000,-2000.000000,-500,-250.000000,-1750.000000,500)
  3042.     AddCube("�-12", -250.000000,-2000.000000,-500,0.000000,-1750.000000,500)
  3043.     AddCube("�-13", 0.000000,-2000.000000,-500,250.000000,-1750.000000,500)
  3044.     AddCube("�-14", 250.000000,-2000.000000,-500,500.000000,-1750.000000,500)
  3045.     AddCube("�-15", 500.000000,-2000.000000,-500,750.000000,-1750.000000,500)
  3046.     AddCube("�-16", 750.000000,-2000.000000,-500,1000.000000,-1750.000000,500)
  3047.     AddCube("�-17", 1000.000000,-2000.000000,-500,1250.000000,-1750.000000,500)
  3048.     AddCube("�-18", 1250.000000,-2000.000000,-500,1500.000000,-1750.000000,500)
  3049.     AddCube("�-19", 1500.000000,-2000.000000,-500,1750.000000,-1750.000000,500)
  3050.     AddCube("�-20", 1750.000000,-2000.000000,-500,2000.000000,-1750.000000,500)
  3051.     AddCube("�-21", 2000.000000,-2000.000000,-500,2250.000000,-1750.000000,500)
  3052.     AddCube("�-22", 2250.000000,-2000.000000,-500,2500.000000,-1750.000000,500)
  3053.     AddCube("�-23", 2500.000000,-2000.000000,-500,2750.000000,-1750.000000,500)
  3054.     AddCube("�-24", 2750.000000,-2000.000000,-500,3000.000000,-1750.000000,500)
  3055.     AddCube("�-1", -3000.000000,-2250.000000,-500,-2750.000000,-2000.000000,500)
  3056.     AddCube("�-2", -2750.000000,-2250.000000,-500,-2500.000000,-2000.000000,500)
  3057.     AddCube("�-3", -2500.000000,-2250.000000,-500,-2250.000000,-2000.000000,500)
  3058.     AddCube("�-4", -2250.000000,-2250.000000,-500,-2000.000000,-2000.000000,500)
  3059.     AddCube("�-5", -2000.000000,-2250.000000,-500,-1750.000000,-2000.000000,500)
  3060.     AddCube("�-6", -1750.000000,-2250.000000,-500,-1500.000000,-2000.000000,500)
  3061.     AddCube("�-7", -1500.000000,-2250.000000,-500,-1250.000000,-2000.000000,500)
  3062.     AddCube("�-8", -1250.000000,-2250.000000,-500,-1000.000000,-2000.000000,500)
  3063.     AddCube("�-9", -1000.000000,-2250.000000,-500,-750.000000,-2000.000000,500)
  3064.     AddCube("�-10", -750.000000,-2250.000000,-500,-500.000000,-2000.000000,500)
  3065.     AddCube("�-11", -500.000000,-2250.000000,-500,-250.000000,-2000.000000,500)
  3066.     AddCube("�-12", -250.000000,-2250.000000,-500,0.000000,-2000.000000,500)
  3067.     AddCube("�-13", 0.000000,-2250.000000,-500,250.000000,-2000.000000,500)
  3068.     AddCube("�-14", 250.000000,-2250.000000,-500,500.000000,-2000.000000,500)
  3069.     AddCube("�-15", 500.000000,-2250.000000,-500,750.000000,-2000.000000,500)
  3070.     AddCube("�-16", 750.000000,-2250.000000,-500,1000.000000,-2000.000000,500)
  3071.     AddCube("�-17", 1000.000000,-2250.000000,-500,1250.000000,-2000.000000,500)
  3072.     AddCube("�-18", 1250.000000,-2250.000000,-500,1500.000000,-2000.000000,500)
  3073.     AddCube("�-19", 1500.000000,-2250.000000,-500,1750.000000,-2000.000000,500)
  3074.     AddCube("�-20", 1750.000000,-2250.000000,-500,2000.000000,-2000.000000,500)
  3075.     AddCube("�-21", 2000.000000,-2250.000000,-500,2250.000000,-2000.000000,500)
  3076.     AddCube("�-22", 2250.000000,-2250.000000,-500,2500.000000,-2000.000000,500)
  3077.     AddCube("�-23", 2500.000000,-2250.000000,-500,2750.000000,-2000.000000,500)
  3078.     AddCube("�-24", 2750.000000,-2250.000000,-500,3000.000000,-2000.000000,500)
  3079.     AddCube("�-1", -3000.000000,-2500.000000,-500,-2750.000000,-2250.000000,500)
  3080.     AddCube("�-2", -2750.000000,-2500.000000,-500,-2500.000000,-2250.000000,500)
  3081.     AddCube("�-3", -2500.000000,-2500.000000,-500,-2250.000000,-2250.000000,500)
  3082.     AddCube("�-4", -2250.000000,-2500.000000,-500,-2000.000000,-2250.000000,500)
  3083.     AddCube("�-5", -2000.000000,-2500.000000,-500,-1750.000000,-2250.000000,500)
  3084.     AddCube("�-6", -1750.000000,-2500.000000,-500,-1500.000000,-2250.000000,500)
  3085.     AddCube("�-7", -1500.000000,-2500.000000,-500,-1250.000000,-2250.000000,500)
  3086.     AddCube("�-8", -1250.000000,-2500.000000,-500,-1000.000000,-2250.000000,500)
  3087.     AddCube("�-9", -1000.000000,-2500.000000,-500,-750.000000,-2250.000000,500)
  3088.     AddCube("�-10", -750.000000,-2500.000000,-500,-500.000000,-2250.000000,500)
  3089.     AddCube("�-11", -500.000000,-2500.000000,-500,-250.000000,-2250.000000,500)
  3090.     AddCube("�-12", -250.000000,-2500.000000,-500,0.000000,-2250.000000,500)
  3091.     AddCube("�-13", 0.000000,-2500.000000,-500,250.000000,-2250.000000,500)
  3092.     AddCube("�-14", 250.000000,-2500.000000,-500,500.000000,-2250.000000,500)
  3093.     AddCube("�-15", 500.000000,-2500.000000,-500,750.000000,-2250.000000,500)
  3094.     AddCube("�-16", 750.000000,-2500.000000,-500,1000.000000,-2250.000000,500)
  3095.     AddCube("�-17", 1000.000000,-2500.000000,-500,1250.000000,-2250.000000,500)
  3096.     AddCube("�-18", 1250.000000,-2500.000000,-500,1500.000000,-2250.000000,500)
  3097.     AddCube("�-19", 1500.000000,-2500.000000,-500,1750.000000,-2250.000000,500)
  3098.     AddCube("�-20", 1750.000000,-2500.000000,-500,2000.000000,-2250.000000,500)
  3099.     AddCube("�-21", 2000.000000,-2500.000000,-500,2250.000000,-2250.000000,500)
  3100.     AddCube("�-22", 2250.000000,-2500.000000,-500,2500.000000,-2250.000000,500)
  3101.     AddCube("�-23", 2500.000000,-2500.000000,-500,2750.000000,-2250.000000,500)
  3102.     AddCube("�-24", 2750.000000,-2500.000000,-500,3000.000000,-2250.000000,500)
  3103.     AddCube("�-1", -3000.000000,-2750.000000,-500,-2750.000000,-2500.000000,500)
  3104.     AddCube("�-2", -2750.000000,-2750.000000,-500,-2500.000000,-2500.000000,500)
  3105.     AddCube("�-3", -2500.000000,-2750.000000,-500,-2250.000000,-2500.000000,500)
  3106.     AddCube("�-4", -2250.000000,-2750.000000,-500,-2000.000000,-2500.000000,500)
  3107.     AddCube("�-5", -2000.000000,-2750.000000,-500,-1750.000000,-2500.000000,500)
  3108.     AddCube("�-6", -1750.000000,-2750.000000,-500,-1500.000000,-2500.000000,500)
  3109.     AddCube("�-7", -1500.000000,-2750.000000,-500,-1250.000000,-2500.000000,500)
  3110.     AddCube("�-8", -1250.000000,-2750.000000,-500,-1000.000000,-2500.000000,500)
  3111.     AddCube("�-9", -1000.000000,-2750.000000,-500,-750.000000,-2500.000000,500)
  3112.     AddCube("�-10", -750.000000,-2750.000000,-500,-500.000000,-2500.000000,500)
  3113.     AddCube("�-11", -500.000000,-2750.000000,-500,-250.000000,-2500.000000,500)
  3114.     AddCube("�-12", -250.000000,-2750.000000,-500,0.000000,-2500.000000,500)
  3115.     AddCube("�-13", 0.000000,-2750.000000,-500,250.000000,-2500.000000,500)
  3116.     AddCube("�-14", 250.000000,-2750.000000,-500,500.000000,-2500.000000,500)
  3117.     AddCube("�-15", 500.000000,-2750.000000,-500,750.000000,-2500.000000,500)
  3118.     AddCube("�-16", 750.000000,-2750.000000,-500,1000.000000,-2500.000000,500)
  3119.     AddCube("�-17", 1000.000000,-2750.000000,-500,1250.000000,-2500.000000,500)
  3120.     AddCube("�-18", 1250.000000,-2750.000000,-500,1500.000000,-2500.000000,500)
  3121.     AddCube("�-19", 1500.000000,-2750.000000,-500,1750.000000,-2500.000000,500)
  3122.     AddCube("�-20", 1750.000000,-2750.000000,-500,2000.000000,-2500.000000,500)
  3123.     AddCube("�-21", 2000.000000,-2750.000000,-500,2250.000000,-2500.000000,500)
  3124.     AddCube("�-22", 2250.000000,-2750.000000,-500,2500.000000,-2500.000000,500)
  3125.     AddCube("�-23", 2500.000000,-2750.000000,-500,2750.000000,-2500.000000,500)
  3126.     AddCube("�-24", 2750.000000,-2750.000000,-500,3000.000000,-2500.000000,500)
  3127.     AddCube("�-1", -3000.000000,-3000.000000,-500,-2750.000000,-2750.000000,500)
  3128.     AddCube("�-2", -2750.000000,-3000.000000,-500,-2500.000000,-2750.000000,500)
  3129.     AddCube("�-3", -2500.000000,-3000.000000,-500,-2250.000000,-2750.000000,500)
  3130.     AddCube("�-4", -2250.000000,-3000.000000,-500,-2000.000000,-2750.000000,500)
  3131.     AddCube("�-5", -2000.000000,-3000.000000,-500,-1750.000000,-2750.000000,500)
  3132.     AddCube("�-6", -1750.000000,-3000.000000,-500,-1500.000000,-2750.000000,500)
  3133.     AddCube("�-7", -1500.000000,-3000.000000,-500,-1250.000000,-2750.000000,500)
  3134.     AddCube("�-8", -1250.000000,-3000.000000,-500,-1000.000000,-2750.000000,500)
  3135.     AddCube("�-9", -1000.000000,-3000.000000,-500,-750.000000,-2750.000000,500)
  3136.     AddCube("�-10", -750.000000,-3000.000000,-500,-500.000000,-2750.000000,500)
  3137.     AddCube("�-11", -500.000000,-3000.000000,-500,-250.000000,-2750.000000,500)
  3138.     AddCube("�-12", -250.000000,-3000.000000,-500,0.000000,-2750.000000,500)
  3139.     AddCube("�-13", 0.000000,-3000.000000,-500,250.000000,-2750.000000,500)
  3140.     AddCube("�-14", 250.000000,-3000.000000,-500,500.000000,-2750.000000,500)
  3141.     AddCube("�-15", 500.000000,-3000.000000,-500,750.000000,-2750.000000,500)
  3142.     AddCube("�-16", 750.000000,-3000.000000,-500,1000.000000,-2750.000000,500)
  3143.     AddCube("�-17", 1000.000000,-3000.000000,-500,1250.000000,-2750.000000,500)
  3144.     AddCube("�-18", 1250.000000,-3000.000000,-500,1500.000000,-2750.000000,500)
  3145.     AddCube("�-19", 1500.000000,-3000.000000,-500,1750.000000,-2750.000000,500)
  3146.     AddCube("�-20", 1750.000000,-3000.000000,-500,2000.000000,-2750.000000,500)
  3147.     AddCube("�-21", 2000.000000,-3000.000000,-500,2250.000000,-2750.000000,500)
  3148.     AddCube("�-22", 2250.000000,-3000.000000,-500,2500.000000,-2750.000000,500)
  3149.     AddCube("�-23", 2500.000000,-3000.000000,-500,2750.000000,-2750.000000,500)
  3150.     AddCube("�-24", 2750.000000,-3000.000000,-500,3000.000000,-2750.000000,500)
  3151. }
  3152. calculateZone(posX, posY, posZ) {
  3153.     if ( bInitZaC == 0 )
  3154.     {
  3155.         initZonesAndCities()
  3156.         bInitZaC := 1
  3157.     }
  3158.     Loop % nZone-1
  3159.     {
  3160.         if (posX >= zone%A_Index%_x1) && (posY >= zone%A_Index%_y1) && (posZ >= zone%A_Index%_z1) && (posX <= zone%A_Index%_x2) && (posY <= zone%A_Index%_y2) && (posZ <= zone%A_Index%_z2)
  3161.         {
  3162.             ErrorLevel := ERROR_OK
  3163.             return zone%A_Index%_name
  3164.         }
  3165.     }
  3166.     ErrorLevel := ERROR_ZONE_NOT_FOUND
  3167.     return "Unbekannt"
  3168. }
  3169. calculateCity(posX, posY, posZ) {
  3170.     if ( bInitZaC == 0 )
  3171.     {
  3172.         initZonesAndCities()
  3173.         bInitZaC := 1
  3174.     }
  3175.     smallestCity := "Unbekannt"
  3176.     currentCitySize := 0
  3177.     smallestCitySize := 0
  3178.     Loop % nCity-1
  3179.     {
  3180.         if (posX >= city%A_Index%_x1) && (posY >= city%A_Index%_y1) && (posZ >= city%A_Index%_z1) && (posX <= city%A_Index%_x2) && (posY <= city%A_Index%_y2) && (posZ <= city%A_Index%_z2)
  3181.         {
  3182.             currentCitySize := ((city%A_Index%_x2 - city%A_Index%_x1) * (city%A_Index%_y2 - city%A_Index%_y1) * (city%A_Index%_z2 - city%A_Index%_z1))
  3183.             if (smallestCity == "Unbekannt") || (currentCitySize < smallestCitySize)
  3184.             {
  3185.                 smallestCity := city%A_Index%_name
  3186.                 smallestCitySize := currentCitySize
  3187.             }
  3188.         }
  3189.     }
  3190.     if(smallestCity == "Unbekannt") {
  3191.         ErrorLevel := ERROR_CITY_NOT_FOUND
  3192.     } else {
  3193.         ErrorLevel := ERROR_OK
  3194.     }
  3195.     return smallestCity
  3196. }
  3197. AddZone(sName, x1, y1, z1, x2, y2, z2) {
  3198.     global
  3199.     zone%nZone%_name := sName
  3200.     zone%nZone%_x1 := x1
  3201.     zone%nZone%_y1 := y1
  3202.     zone%nZone%_z1 := z1
  3203.     zone%nZone%_x2 := x2
  3204.     zone%nZone%_y2 := y2
  3205.     zone%nZone%_z2 := z2
  3206.     nZone := nZone + 1
  3207. }
  3208. AddCity(sName, x1, y1, z1, x2, y2, z2) {
  3209.     global
  3210.     city%nCity%_name := sName
  3211.     city%nCity%_x1 := x1
  3212.     city%nCity%_y1 := y1
  3213.     city%nCity%_z1 := z1
  3214.     city%nCity%_x2 := x2
  3215.     city%nCity%_y2 := y2
  3216.     city%nCity%_z2 := z2
  3217.     nCity := nCity + 1
  3218. }
  3219. IsPlayerInRangeOfPoint(_posX, _posY, _posZ, _posRadius)
  3220. {
  3221.     GetPlayerPos(posX, posY, posZ)
  3222.     X := posX -_posX
  3223.     Y := posY -_posY
  3224.     Z := posZ -_posZ
  3225.     if(((X < _posRadius) && (X > -_posRadius)) && ((Y < _posRadius) && (Y > -_posRadius)) && ((Z < _posRadius) && (Z > -_posRadius)))
  3226.     return TRUE
  3227.     return FALSE
  3228. }
  3229. IsPlayerInRangeOfPoint2D(_posX, _posY, _posRadius)
  3230. {
  3231.     GetPlayerPos(posX, posY, posZ)
  3232.     X := posX - _posX
  3233.     Y := posY - _posY
  3234.     if(((X < _posRadius) && (X > -_posRadius)) && ((Y < _posRadius) && (Y > -_posRadius)))
  3235.     return TRUE
  3236.     return FALSE
  3237. }
  3238. getPlayerZone()
  3239. {
  3240.     aktPos := getCoordinates()
  3241.     return calculateZone(aktPos[1], aktPos[2], aktPos[3])
  3242. }
  3243. getPlayerCity()
  3244. {
  3245.     aktPos := getCoordinates()
  3246.     return calculateCity(aktPos[1], aktPos[2], aktPos[3])
  3247. }
  3248. AntiCrash(){
  3249.     If(!checkHandles())
  3250.     return false
  3251.     cReport := ADDR_SAMP_CRASHREPORT
  3252.     writeMemory(hGTA, dwSAMP + cReport, 0x90909090, 4)
  3253.     cReport += 0x4
  3254.     writeMemory(hGTA, dwSAMP + cReport, 0x90, 1)
  3255.     cReport += 0x9
  3256.     writeMemory(hGTA, dwSAMP + cReport, 0x90909090, 4)
  3257.     cReport += 0x4
  3258.     writeMemory(hGTA, dwSAMP + cReport, 0x90, 1)
  3259. }
  3260. writeMemory(hProcess,address,writevalue,length=4, datatype="int") {
  3261.     if(!hProcess) {
  3262.         ErrorLevel := ERROR_INVALID_HANDLE
  3263.         return false
  3264.     }
  3265.     VarSetCapacity(finalvalue,length, 0)
  3266.     NumPut(writevalue,finalvalue,0,datatype)
  3267.     dwRet :=  DllCall(  "WriteProcessMemory"
  3268.     ,"Uint",hProcess
  3269.     ,"Uint",address
  3270.     ,"Uint",&finalvalue
  3271.     ,"Uint",length
  3272.     ,"Uint",0)
  3273.     if(dwRet == 0) {
  3274.         ErrorLevel := ERROR_WRITE_MEMORY
  3275.         return false
  3276.     }
  3277.     ErrorLevel := ERROR_OK
  3278.     return true
  3279. }
  3280. checkHandles() {
  3281.     if(iRefreshHandles+500>A_TickCount)
  3282.     return true
  3283.     iRefreshHandles:=A_TickCount
  3284.     if(!refreshGTA() || !refreshSAMP() || !refreshMemory()) {
  3285.         return false
  3286.     } else {
  3287.         return true
  3288.     }
  3289.     return true
  3290. }
  3291. refreshGTA() {
  3292.     newPID := getPID("GTA:SA:MP")
  3293.     if(!newPID) {
  3294.         if(hGTA) {
  3295.             virtualFreeEx(hGTA, pMemory, 0, 0x8000)
  3296.             closeProcess(hGTA)
  3297.             hGTA := 0x0
  3298.         }
  3299.         dwGTAPID := 0
  3300.         hGTA := 0x0
  3301.         dwSAMP := 0x0
  3302.         pMemory := 0x0
  3303.         return false
  3304.     }
  3305.     if(!hGTA || (dwGTAPID != newPID)) {
  3306.         hGTA := openProcess(newPID)
  3307.         if(ErrorLevel) {
  3308.             dwGTAPID := 0
  3309.             hGTA := 0x0
  3310.             dwSAMP := 0x0
  3311.             pMemory := 0x0
  3312.             return false
  3313.         }
  3314.         dwGTAPID := newPID
  3315.         dwSAMP := 0x0
  3316.         pMemory := 0x0
  3317.         return true
  3318.     }
  3319.     return true
  3320. }
  3321. refreshSAMP() {
  3322.     if(dwSAMP)
  3323.     return true
  3324.     dwSAMP := getModuleBaseAddress("samp.dll", hGTA)
  3325.     if(!dwSAMP)
  3326.     return false
  3327.     return true
  3328. }
  3329. refreshMemory() {
  3330.     if(!pMemory) {
  3331.         pMemory     := virtualAllocEx(hGTA, 6144, 0x1000 | 0x2000, 0x40)
  3332.         if(ErrorLevel) {
  3333.             pMemory := 0x0
  3334.             return false
  3335.         }
  3336.         pParam1     := pMemory
  3337.         pParam2     := pMemory + 1024
  3338.         pParam3     := pMemory + 2048
  3339.         pParam4     := pMemory + 3072
  3340.         pParam5     := pMemory + 4096
  3341.         pInjectFunc := pMemory + 5120
  3342.     }
  3343.     return true
  3344. }
  3345. getPID(szWindow) {
  3346.     local dwPID := 0
  3347.     WinGet, dwPID, PID, %szWindow%
  3348.     return dwPID
  3349. }
  3350. openProcess(dwPID, dwRights = 0x1F0FFF) {
  3351.     hProcess := DllCall("OpenProcess"
  3352.     , "UInt", dwRights
  3353.     , "int",  0
  3354.     , "UInt", dwPID
  3355.     , "Uint")
  3356.     if(hProcess == 0) {
  3357.         ErrorLevel := ERROR_OPEN_PROCESS
  3358.         return 0
  3359.     }
  3360.     ErrorLevel := ERROR_OK
  3361.     return hProcess
  3362. }
  3363. closeProcess(hProcess) {
  3364.     if(hProcess == 0) {
  3365.         ErrorLevel := ERROR_INVALID_HANDLE
  3366.         return 0
  3367.     }
  3368.     dwRet := DllCall(    "CloseHandle"
  3369.     , "Uint", hProcess
  3370.     , "UInt")
  3371.     ErrorLevel := ERROR_OK
  3372. }
  3373. getModuleBaseAddress(sModule, hProcess) {
  3374.     if(!sModule) {
  3375.         ErrorLevel := ERROR_MODULE_NOT_FOUND
  3376.         return 0
  3377.     }
  3378.     if(!hProcess) {
  3379.         ErrorLevel := ERROR_INVALID_HANDLE
  3380.         return 0
  3381.     }
  3382.     dwSize = 1024*4
  3383.     VarSetCapacity(hMods, dwSize)
  3384.     VarSetCapacity(cbNeeded, 4)
  3385.     dwRet := DllCall(    "Psapi.dll\EnumProcessModules"
  3386.     , "UInt", hProcess
  3387.     , "UInt", &hMods
  3388.     , "UInt", dwSize
  3389.     , "UInt*", cbNeeded
  3390.     , "UInt")
  3391.     if(dwRet == 0) {
  3392.         ErrorLevel := ERROR_ENUM_PROCESS_MODULES
  3393.         return 0
  3394.     }
  3395.     dwMods := cbNeeded / 4
  3396.     i := 0
  3397.     VarSetCapacity(hModule, 4)
  3398.     VarSetCapacity(sCurModule, 260)
  3399.     while(i < dwMods) {
  3400.         hModule := NumGet(hMods, i*4)
  3401.         DllCall("Psapi.dll\GetModuleFileNameEx"
  3402.         , "UInt", hProcess
  3403.         , "UInt", hModule
  3404.         , "Str", sCurModule
  3405.         , "UInt", 260)
  3406.         SplitPath, sCurModule, sFilename
  3407.         if(sModule == sFilename) {
  3408.             ErrorLevel := ERROR_OK
  3409.             return hModule
  3410.         }
  3411.         i := i + 1
  3412.     }
  3413.     ErrorLevel := ERROR_MODULE_NOT_FOUND
  3414.     return 0
  3415. }
  3416. readString(hProcess, dwAddress, dwLen) {
  3417.     if(!hProcess) {
  3418.         ErrorLevel := ERROR_INVALID_HANDLE
  3419.         return 0
  3420.     }
  3421.     VarSetCapacity(sRead, dwLen)
  3422.     dwRet := DllCall(    "ReadProcessMemory"
  3423.     , "UInt", hProcess
  3424.     , "UInt", dwAddress
  3425.     , "Str", sRead
  3426.     , "UInt", dwLen
  3427.     , "UInt*", 0
  3428.     , "UInt")
  3429.     if(dwRet == 0) {
  3430.         ErrorLevel := ERROR_READ_MEMORY
  3431.         return 0
  3432.     }
  3433.     ErrorLevel := ERROR_OK
  3434.     if A_IsUnicode
  3435.     return __ansiToUnicode(sRead)
  3436.     return sRead
  3437. }
  3438. readFloat(hProcess, dwAddress) {
  3439.     if(!hProcess) {
  3440.         ErrorLevel := ERROR_INVALID_HANDLE
  3441.         return 0
  3442.     }
  3443.     VarSetCapacity(dwRead, 4)
  3444.     dwRet := DllCall(    "ReadProcessMemory"
  3445.     , "UInt",  hProcess
  3446.     , "UInt",  dwAddress
  3447.     , "Str",   dwRead
  3448.     , "UInt",  4
  3449.     , "UInt*", 0
  3450.     , "UInt")
  3451.     if(dwRet == 0) {
  3452.         ErrorLevel := ERROR_READ_MEMORY
  3453.         return 0
  3454.     }
  3455.     ErrorLevel := ERROR_OK
  3456.     return NumGet(dwRead, 0, "Float")
  3457. }
  3458. readDWORD(hProcess, dwAddress) {
  3459.     if(!hProcess) {
  3460.         ErrorLevel := ERROR_INVALID_HANDLE
  3461.         return 0
  3462.     }
  3463.     VarSetCapacity(dwRead, 4)
  3464.     dwRet := DllCall(    "ReadProcessMemory"
  3465.     , "UInt",  hProcess
  3466.     , "UInt",  dwAddress
  3467.     , "Str",   dwRead
  3468.     , "UInt",  4
  3469.     , "UInt*", 0)
  3470.     if(dwRet == 0) {
  3471.         ErrorLevel := ERROR_READ_MEMORY
  3472.         return 0
  3473.     }
  3474.     ErrorLevel := ERROR_OK
  3475.     return NumGet(dwRead, 0, "UInt")
  3476. }
  3477. readMem(hProcess, dwAddress, dwLen=4, type="UInt") {
  3478.     if(!hProcess) {
  3479.         ErrorLevel := ERROR_INVALID_HANDLE
  3480.         return 0
  3481.     }
  3482.     VarSetCapacity(dwRead, dwLen)
  3483.     dwRet := DllCall(    "ReadProcessMemory"
  3484.     , "UInt",  hProcess
  3485.     , "UInt",  dwAddress
  3486.     , "Str",   dwRead
  3487.     , "UInt",  dwLen
  3488.     , "UInt*", 0)
  3489.     if(dwRet == 0) {
  3490.         ErrorLevel := ERROR_READ_MEMORY
  3491.         return 0
  3492.     }
  3493.     ErrorLevel := ERROR_OK
  3494.     return NumGet(dwRead, 0, type)
  3495. }
  3496. writeString(hProcess, dwAddress, wString) {
  3497.     if(!hProcess) {
  3498.         ErrorLevel := ERROR_INVALID_HANDLE
  3499.         return false
  3500.     }
  3501.     sString := wString
  3502.     if A_IsUnicode
  3503.     sString := __unicodeToAnsi(wString)
  3504.     dwRet := DllCall(    "WriteProcessMemory"
  3505.     , "UInt", hProcess
  3506.     , "UInt", dwAddress
  3507.     , "Str", sString
  3508.     , "UInt", StrLen(wString) + 1
  3509.     , "UInt", 0
  3510.     , "UInt")
  3511.     if(dwRet == 0) {
  3512.         ErrorLEvel := ERROR_WRITE_MEMORY
  3513.         return false
  3514.     }
  3515.     ErrorLevel := ERROR_OK
  3516.     return true
  3517. }
  3518. writeRaw(hProcess, dwAddress, pBuffer, dwLen) {
  3519.     if(!hProcess) {
  3520.         ErrorLevel := ERROR_INVALID_HANDLE
  3521.         return false
  3522.     }
  3523.     dwRet := DllCall(    "WriteProcessMemory"
  3524.     , "UInt", hProcess
  3525.     , "UInt", dwAddress
  3526.     , "UInt", pBuffer
  3527.     , "UInt", dwLen
  3528.     , "UInt", 0
  3529.     , "UInt")
  3530.     if(dwRet == 0) {
  3531.         ErrorLEvel := ERROR_WRITE_MEMORY
  3532.         return false
  3533.     }
  3534.     ErrorLevel := ERROR_OK
  3535.     return true
  3536. }
  3537. Memory_ReadByte(process_handle, address) {
  3538.     VarSetCapacity(value, 1, 0)
  3539.     DllCall("ReadProcessMemory", "UInt", process_handle, "UInt", address, "Str", value, "UInt", 1, "UInt *", 0)
  3540.     return, NumGet(value, 0, "Byte")
  3541. }
  3542. callWithParams(hProcess, dwFunc, aParams, bCleanupStack = true) {
  3543.     if(!hProcess) {
  3544.         ErrorLevel := ERROR_INVALID_HANDLE
  3545.         return false
  3546.     }
  3547.     validParams := 0
  3548.     i := aParams.MaxIndex()
  3549.     dwLen := i * 5    + 5    + 1
  3550.     if(bCleanupStack)
  3551.     dwLen += 3
  3552.     VarSetCapacity(injectData, i * 5    + 5       + 3       + 1, 0)
  3553.     i_ := 1
  3554.     while(i > 0) {
  3555.         if(aParams[i][1] != "") {
  3556.             dwMemAddress := 0x0
  3557.             if(aParams[i][1] == "p") {
  3558.                 dwMemAddress := aParams[i][2]
  3559.             } else if(aParams[i][1] == "s") {
  3560.                 if(i_>3)
  3561.                 return false
  3562.                 dwMemAddress := pParam%i_%
  3563.                 writeString(hProcess, dwMemAddress, aParams[i][2])
  3564.                 if(ErrorLevel)
  3565.                 return false
  3566.                 i_ += 1
  3567.             } else if(aParams[i][1] == "i") {
  3568.                 dwMemAddress := aParams[i][2]
  3569.             } else {
  3570.                 return false
  3571.             }
  3572.             NumPut(0x68, injectData, validParams * 5, "UChar")
  3573.             NumPut(dwMemAddress, injectData, validParams * 5 + 1, "UInt")
  3574.             validParams += 1
  3575.         }
  3576.         i -= 1
  3577.     }
  3578.     offset := dwFunc - ( pInjectFunc + validParams * 5 + 5 )
  3579.     NumPut(0xE8, injectData, validParams * 5, "UChar")
  3580.     NumPut(offset, injectData, validParams * 5 + 1, "Int")
  3581.     if(bCleanupStack) {
  3582.         NumPut(0xC483, injectData, validParams * 5 + 5, "UShort")
  3583.         NumPut(validParams*4, injectData, validParams * 5 + 7, "UChar")
  3584.         NumPut(0xC3, injectData, validParams * 5 + 8, "UChar")
  3585.     } else {
  3586.         NumPut(0xC3, injectData, validParams * 5 + 5, "UChar")
  3587.     }
  3588.     writeRaw(hGTA, pInjectFunc, &injectData, dwLen)
  3589.     if(ErrorLevel)
  3590.     return false
  3591.     hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
  3592.     if(ErrorLevel)
  3593.     return false
  3594.     waitForSingleObject(hThread, 0xFFFFFFFF)
  3595.     closeProcess(hThread)
  3596.     return true
  3597. }
  3598. virtualAllocEx(hProcess, dwSize, flAllocationType, flProtect) {
  3599.     if(!hProcess) {
  3600.         ErrorLevel := ERROR_INVALID_HANDLE
  3601.         return 0
  3602.     }
  3603.     dwRet := DllCall(    "VirtualAllocEx"
  3604.     , "UInt", hProcess
  3605.     , "UInt", 0
  3606.     , "UInt", dwSize
  3607.     , "UInt", flAllocationType
  3608.     , "UInt", flProtect
  3609.     , "UInt")
  3610.     if(dwRet == 0) {
  3611.         ErrorLEvel := ERROR_ALLOC_MEMORY
  3612.         return 0
  3613.     }
  3614.     ErrorLevel := ERROR_OK
  3615.     return dwRet
  3616. }
  3617. virtualFreeEx(hProcess, lpAddress, dwSize, dwFreeType) {
  3618.     if(!hProcess) {
  3619.         ErrorLevel := ERROR_INVALID_HANDLE
  3620.         return 0
  3621.     }
  3622.     dwRet := DllCall(    "VirtualFreeEx"
  3623.     , "UInt", hProcess
  3624.     , "UInt", lpAddress
  3625.     , "UInt", dwSize
  3626.     , "UInt", dwFreeType
  3627.     , "UInt")
  3628.     if(dwRet == 0) {
  3629.         ErrorLEvel := ERROR_FREE_MEMORY
  3630.         return 0
  3631.     }
  3632.     ErrorLevel := ERROR_OK
  3633.     return dwRet
  3634. }
  3635. createRemoteThread(hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId) {
  3636.     if(!hProcess) {
  3637.         ErrorLevel := ERROR_INVALID_HANDLE
  3638.         return 0
  3639.     }
  3640.     dwRet := DllCall(    "CreateRemoteThread"
  3641.     , "UInt", hProcess
  3642.     , "UInt", lpThreadAttributes
  3643.     , "UInt", dwStackSize
  3644.     , "UInt", lpStartAddress
  3645.     , "UInt", lpParameter
  3646.     , "UInt", dwCreationFlags
  3647.     , "UInt", lpThreadId
  3648.     , "UInt")
  3649.     if(dwRet == 0) {
  3650.         ErrorLEvel := ERROR_ALLOC_MEMORY
  3651.         return 0
  3652.     }
  3653.     ErrorLevel := ERROR_OK
  3654.     return dwRet
  3655. }
  3656. waitForSingleObject(hThread, dwMilliseconds) {
  3657.     if(!hThread) {
  3658.         ErrorLevel := ERROR_INVALID_HANDLE
  3659.         return 0
  3660.     }
  3661.     dwRet := DllCall(    "WaitForSingleObject"
  3662.     , "UInt", hThread
  3663.     , "UInt", dwMilliseconds
  3664.     , "UInt")
  3665.     if(dwRet == 0xFFFFFFFF) {
  3666.         ErrorLEvel := ERROR_WAIT_FOR_OBJECT
  3667.         return 0
  3668.     }
  3669.     ErrorLevel := ERROR_OK
  3670.     return dwRet
  3671. }
  3672. __ansiToUnicode(sString, nLen = 0) {
  3673.     If !nLen
  3674.     {
  3675.         nLen := DllCall("MultiByteToWideChar"
  3676.         , "Uint", 0
  3677.         , "Uint", 0
  3678.         , "Uint", &sString
  3679.         , "int",  -1
  3680.         , "Uint", 0
  3681.         , "int",  0)
  3682.     }
  3683.     VarSetCapacity(wString, nLen * 2)
  3684.     DllCall("MultiByteToWideChar"
  3685.     , "Uint", 0
  3686.     , "Uint", 0
  3687.     , "Uint", &sString
  3688.     , "int",  -1
  3689.     , "Uint", &wString
  3690.     , "int",  nLen)
  3691.     return wString
  3692. }
  3693. __unicodeToAnsi(wString, nLen = 0) {
  3694.     pString := wString + 1 > 65536 ? wString : &wString
  3695.     If !nLen
  3696.     {
  3697.         nLen := DllCall("WideCharToMultiByte"
  3698.         , "Uint", 0
  3699.         , "Uint", 0
  3700.         , "Uint", pString
  3701.         , "int",  -1
  3702.         , "Uint", 0
  3703.         , "int",  0
  3704.         , "Uint", 0
  3705.         , "Uint", 0)
  3706.     }
  3707.     VarSetCapacity(sString, nLen)
  3708.     DllCall("WideCharToMultiByte"
  3709.     , "Uint", 0
  3710.     , "Uint", 0
  3711.     , "Uint", pString
  3712.     , "int",  -1
  3713.     , "str",  sString
  3714.     , "int",  nLen
  3715.     , "Uint", 0
  3716.     , "Uint", 0)
  3717.     return sString
  3718. }
  3719. callWithParamsforaddToChatWindow(hProcess, dwFunc, aParams, bCleanupStack = true, thiscall = false) {
  3720.     if(!hProcess) {
  3721.         ErrorLevel := ERROR_INVALID_HANDLE
  3722.         return false
  3723.     }
  3724.     validParams := 0
  3725.     i := aParams.MaxIndex()
  3726.     dwLen := i * 5    + 5    + 1
  3727.     if(bCleanupStack)
  3728.     dwLen += 3
  3729.     VarSetCapacity(injectData, i * 5    + 5