· 8 years ago · Mar 02, 2018, 07:02 PM
1#IfWinActive, GTA:SA:MP
2#SingleInstance, force
3#Persistent
4#NoEnv
5#usehook
6global ERROR_OK := 0
7global ERROR_PROCESS_NOT_FOUND := 1
8global ERROR_OPEN_PROCESS := 2
9global ERROR_INVALID_HANDLE := 3
10global ERROR_MODULE_NOT_FOUND := 4
11global ERROR_ENUM_PROCESS_MODULES := 5
12global ERROR_ZONE_NOT_FOUND := 6
13global ERROR_CITY_NOT_FOUND := 7
14global ERROR_READ_MEMORY := 8
15global ERROR_WRITE_MEMORY := 9
16global ERROR_ALLOC_MEMORY := 10
17global ERROR_FREE_MEMORY := 11
18global ERROR_WAIT_FOR_OBJECT := 12
19global ERROR_CREATE_THREAD := 13
20global ADDR_ZONECODE := 0xA49AD4
21global ADDR_POSITION_X := 0xB6F2E4
22global ADDR_POSITION_Y := 0xB6F2E8
23global ADDR_POSITION_Z := 0xB6F2EC
24global ADDR_CPED_PTR := 0xB6F5F0
25global ADDR_CPED_HPOFF := 0x540
26global ADDR_CPED_ARMOROFF := 0x548
27global ADDR_CPED_MONEY := 0x0B7CE54
28global ADDR_CPED_INTID := 0xA4ACE8
29global ADDR_CPED_SKINIDOFF := 0x22
30global ADDR_VEHICLE_PTR := 0xBA18FC
31global ADDR_VEHICLE_HPOFF := 0x4C0
32global ADDR_VEHICLE_DOORSTATE := 0x4F8
33global ADDR_VEHICLE_ENGINESTATE := 0x428
34global ADDR_VEHICLE_LIGHTSTATE := 0x584
35global ADDR_VEHICLE_MODEL := 0x22
36global ADDR_VEHICLE_TYPE := 0x590
37global ADDR_VEHICLE_DRIVER := 0x460
38global ADDR_VEHICLE_X := 0x44
39global ADDR_VEHICLE_Y := 0x48
40global ADDR_VEHICLE_Z := 0x4C
41global oAirplaneModels := [417, 425, 447, 460, 469, 476, 487, 488, 497, 511, 512, 513, 519, 520, 548, 553, 563, 577, 592, 593]
42global oBikeModels := [481,509,510]
43global 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","FBIRancher","Virgo","Greenwood","Jetmax","Hotring","Sandking","BlistaCompact","PoliceMaverick","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","FBITruck","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","PoliceRanger","Picador","S.W.A.T","Alpha","Phoenix","GlendaleShit","SadlerShit","Luggage","Luggage","Stairs","Boxville","Tiller","UtilityTrailer"]
44global 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"]
45global 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"]
46global 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"]
47global ADDR_SAMP_INCHAT_PTR := 0x21a10c
48global ADDR_SAMP_INCHAT_PTR_OFF := 0x55
49global ADDR_SAMP_USERNAME := 0x219A6F
50global FUNC_SAMP_SENDCMD := 0x65c60
51global FUNC_SAMP_SENDSAY := 0x57f0
52global FUNC_SAMP_ADDTOCHATWND := 0x64520
53global ADDR_SAMP_CHATMSG_PTR := 0x21a0e4
54global FUNC_SAMP_SHOWGAMETEXT := 0x9c2c0
55global FUNC_SAMP_PLAYAUDIOSTR := 0x62da0
56global FUNC_SAMP_STOPAUDIOSTR := 0x629a0
57global DIALOG_STYLE_MSGBOX := 0
58global DIALOG_STYLE_INPUT := 1
59global DIALOG_STYLE_LIST := 2
60global DIALOG_STYLE_PASSWORD := 3
61global DIALOG_STYLE_TABLIST := 4
62global DIALOG_STYLE_TABLIST_HEADERS := 5
63global SAMP_DIALOG_STRUCT_PTR := 0x21A0B8
64global SAMP_DIALOG_PTR1_OFFSET := 0x1C
65global SAMP_DIALOG_LINES_OFFSET := 0x44C
66global SAMP_DIALOG_INDEX_OFFSET := 0x443
67global SAMP_DIALOG_BUTTON_HOVERING_OFFSET := 0x465
68global SAMP_DIALOG_BUTTON_CLICKED_OFFSET := 0x466
69global SAMP_DIALOG_PTR2_OFFSET := 0x20
70global SAMP_DIALOG_LINECOUNT_OFFSET := 0x150
71global SAMP_DIALOG_OPEN_OFFSET := 0x28
72global SAMP_DIALOG_STYLE_OFFSET := 0x2C
73global SAMP_DIALOG_ID_OFFSET := 0x30
74global SAMP_DIALOG_TEXT_PTR_OFFSET := 0x34
75global SAMP_DIALOG_CAPTION_OFFSET := 0x40
76global FUNC_SAMP_SHOWDIALOG := 0x6B9C0
77global FUNC_SAMP_CLOSEDIALOG := 0x6C040
78global FUNC_UPDATESCOREBOARD := 0x8A10
79global SAMP_INFO_OFFSET := 0x21A0F8
80global ADDR_SAMP_CRASHREPORT := 0x5CF2C
81global SAMP_PPOOLS_OFFSET := 0x3CD
82global SAMP_PPOOL_PLAYER_OFFSET := 0x18
83global SAMP_SLOCALPLAYERID_OFFSET := 0x4
84global SAMP_ISTRLEN_LOCALPLAYERNAME_OFFSET := 0x1A
85global SAMP_SZLOCALPLAYERNAME_OFFSET := 0xA
86global SAMP_PSZLOCALPLAYERNAME_OFFSET := 0xA
87global SAMP_PREMOTEPLAYER_OFFSET := 0x2E
88global SAMP_ISTRLENNAME___OFFSET := 0x1C
89global SAMP_SZPLAYERNAME_OFFSET := 0xC
90global SAMP_PSZPLAYERNAME_OFFSET := 0xC
91global SAMP_ILOCALPLAYERPING_OFFSET := 0x26
92global SAMP_ILOCALPLAYERSCORE_OFFSET := 0x2A
93global SAMP_IPING_OFFSET := 0x28
94global SAMP_ISCORE_OFFSET := 0x24
95global SAMP_ISNPC_OFFSET := 0x4
96global SAMP_PLAYER_MAX := 1004
97global CheckpointCheck := 0xC7DEEA
98global rmaddrs := [0xC7DEC8, 0xC7DECC, 0xC7DED0]
99global SIZE_SAMP_CHATMSG := 0xFC
100global hGTA := 0x0
101global dwGTAPID := 0x0
102global dwSAMP := 0x0
103global pMemory := 0x0
104global pParam1 := 0x0
105global pParam2 := 0x0
106global pParam3 := 0x0
107global pParam4 := 0x0
108global pParam5 := 0x0
109global pInjectFunc := 0x0
110global nZone := 1
111global nCity := 1
112global bInitZaC := 0
113global iRefreshScoreboard := 0
114global oScoreboardData := ""
115global iRefreshHandles := 0
116global iUpdateTick := 2500
117IsSAMPAvailable() {
118if(!checkHandles())
119return false
120dwChatInfo := readDWORD(hGTA, dwSAMP + ADDR_SAMP_CHATMSG_PTR)
121if(dwChatInfo == 0 || dwChatInfo == "ERROR")
122{
123return false
124}
125else
126{
127return true
128}
129}
130isInChat() {
131if(!checkHandles())
132return -1
133dwPtr := dwSAMP + ADDR_SAMP_INCHAT_PTR
134dwAddress := readDWORD(hGTA, dwPtr) + ADDR_SAMP_INCHAT_PTR_OFF
135if(ErrorLevel) {
136ErrorLevel := ERROR_READ_MEMORY
137return -1
138}
139dwInChat := readDWORD(hGTA, dwAddress)
140if(ErrorLevel) {
141ErrorLevel := ERROR_READ_MEMORY
142return -1
143}
144ErrorLevel := ERROR_OK
145if(dwInChat > 0) {
146return true
147} else {
148return false
149}
150}
151getUsername() {
152if(!checkHandles())
153return ""
154dwAddress := dwSAMP + ADDR_SAMP_USERNAME
155sUsername := readString(hGTA, dwAddress, 25)
156if(ErrorLevel) {
157ErrorLevel := ERROR_READ_MEMORY
158return ""
159}
160ErrorLevel := ERROR_OK
161return sUsername
162}
163getId() {
164s:=getUsername()
165return getPlayerIdByName(s)
166}
167SendChat(wText) {
168wText := "" wText
169if(!checkHandles())
170return false
171dwFunc:=0
172if(SubStr(wText, 1, 1) == "/") {
173dwFunc := dwSAMP + FUNC_SAMP_SENDCMD
174} else {
175dwFunc := dwSAMP + FUNC_SAMP_SENDSAY
176}
177callWithParams(hGTA, dwFunc, [["s", wText]], false)
178ErrorLevel := ERROR_OK
179return true
180}
181addChatMessage(wText) {
182wText := "" wText
183if(!checkHandles())
184return false
185dwFunc := dwSAMP + FUNC_SAMP_ADDTOCHATWND
186dwChatInfo := readDWORD(hGTA, dwSAMP + ADDR_SAMP_CHATMSG_PTR)
187if(ErrorLevel) {
188ErrorLevel := ERROR_READ_MEMORY
189return false
190}
191callWithParams(hGTA, dwFunc, [["p", dwChatInfo], ["s", wText]], true)
192ErrorLevel := ERROR_OK
193return true
194}
195showGameText(wText, dwTime, dwSize) {
196wText := "" wText
197dwTime += 0
198dwTime := Floor(dwTime)
199dwSize += 0
200dwSize := Floor(dwSize)
201if(!checkHandles())
202return false
203dwFunc := dwSAMP + FUNC_SAMP_SHOWGAMETEXT
204callWithParams(hGTA, dwFunc, [["s", wText], ["i", dwTime], ["i", dwSize]], false)
205ErrorLevel := ERROR_OK
206return true
207}
208playAudioStream(wUrl) {
209wUrl := "" wUrl
210if(!checkHandles())
211return false
212dwFunc := dwSAMP + FUNC_SAMP_PLAYAUDIOSTR
213patchRadio()
214callWithParams(hGTA, dwFunc, [["s", wUrl], ["i", 0], ["i", 0], ["i", 0], ["i", 0], ["i", 0]], false)
215unPatchRadio()
216ErrorLevel := ERROR_OK
217return true
218}
219stopAudioStream() {
220if(!checkHandles())
221return false
222dwFunc := dwSAMP + FUNC_SAMP_STOPAUDIOSTR
223patchRadio()
224callWithParams(hGTA, dwFunc, [["i", 1]], false)
225unPatchRadio()
226ErrorLevel := ERROR_OK
227return true
228}
229patchRadio()
230{
231if(!checkHandles())
232return false
233VarSetCapacity(nop, 4, 0)
234NumPut(0x90909090,nop,0,"UInt")
235dwFunc := dwSAMP + FUNC_SAMP_PLAYAUDIOSTR
236writeRaw(hGTA, dwFunc, &nop, 4)
237writeRaw(hGTA, dwFunc+4, &nop, 1)
238dwFunc := dwSAMP + FUNC_SAMP_STOPAUDIOSTR
239writeRaw(hGTA, dwFunc, &nop, 4)
240writeRaw(hGTA, dwFunc+4, &nop, 1)
241return true
242}
243unPatchRadio()
244{
245if(!checkHandles())
246return false
247VarSetCapacity(old, 4, 0)
248dwFunc := dwSAMP + FUNC_SAMP_PLAYAUDIOSTR
249NumPut(0x74003980,old,0,"UInt")
250writeRaw(hGTA, dwFunc, &old, 4)
251NumPut(0x39,old,0,"UChar")
252writeRaw(hGTA, dwFunc+4, &old, 1)
253dwFunc := dwSAMP + FUNC_SAMP_STOPAUDIOSTR
254NumPut(0x74003980,old,0,"UInt")
255writeRaw(hGTA, dwFunc, &old, 4)
256NumPut(0x09,old,0,"UChar")
257writeRaw(hGTA, dwFunc+4, &old, 1)
258return true
259}
260blockChatInput() {
261if(!checkHandles())
262return false
263VarSetCapacity(nop, 2, 0)
264dwFunc := dwSAMP + FUNC_SAMP_SENDSAY
265NumPut(0x04C2,nop,0,"Short")
266writeRaw(hGTA, dwFunc, &nop, 2)
267dwFunc := dwSAMP + FUNC_SAMP_SENDCMD
268writeRaw(hGTA, dwFunc, &nop, 2)
269return true
270}
271unBlockChatInput() {
272if(!checkHandles())
273return false
274VarSetCapacity(nop, 2, 0)
275dwFunc := dwSAMP + FUNC_SAMP_SENDSAY
276NumPut(0xA164,nop,0,"Short")
277writeRaw(hGTA, dwFunc, &nop, 2)
278dwFunc := dwSAMP + FUNC_SAMP_SENDCMD
279writeRaw(hGTA, dwFunc, &nop, 2)
280return true
281}
282getServerName() {
283if(!checkHandles())
284return -1
285dwAdress := readMem(hGTA, dwSAMP + 0x21A0F8, 4, "int")
286if(ErrorLevel) {
287ErrorLevel := ERROR_READ_MEMORY
288return -1
289}
290if(!dwAdress)
291return -1
292ServerName := readString(hGTA, dwAdress + 0x121, 200)
293if(ErrorLevel) {
294ErrorLevel := ERROR_READ_MEMORY
295return -1
296}
297ErrorLevel := ERROR_OK
298return ServerName
299}
300getServerIP() {
301if(!checkHandles())
302return -1
303dwAdress := readMem(hGTA, dwSAMP + 0x21A0F8, 4, "int")
304if(ErrorLevel) {
305ErrorLevel := ERROR_READ_MEMORY
306return -1
307}
308if(!dwAdress)
309return -1
310ServerIP := readString(hGTA, dwAdress + 0x20, 100)
311if(ErrorLevel) {
312ErrorLevel := ERROR_READ_MEMORY
313return -1
314}
315ErrorLevel := ERROR_OK
316return ServerIP
317}
318getServerPort() {
319if(!checkHandles())
320return -1
321dwAdress := readMem(hGTA, dwSAMP + 0x21A0F8, 4, "int")
322if(ErrorLevel) {
323ErrorLevel := ERROR_READ_MEMORY
324return -1
325}
326if(!dwAdress)
327return -1
328ServerPort := readMem(hGTA, dwAdress + 0x225, 4, "int")
329if(ErrorLevel) {
330ErrorLevel := ERROR_READ_MEMORY
331return -1
332}
333ErrorLevel := ERROR_OK
334return ServerPort
335}
336getWeatherID() {
337if(!checkHandles())
338return -1
339dwGTA := getModuleBaseAddress("gta_sa.exe", hGTA)
340WeatherID := readMem(hGTA, dwGTA + 0xC81320, 2, "byte")
341if(ErrorLevel) {
342ErrorLevel := ERROR_READ_MEMORY
343return -1
344}
345ErrorLevel := ERROR_OK
346return WeatherID
347}
348getWeatherName() {
349if(isPlayerInAnyVehicle() == 0)
350return -1
351if(id >= 0 && id < 23)
352{
353return oweatherNames[id-1]
354}
355return ""
356}
357getTargetPed() {
358if(!checkHandles())
359return 0
360dwAddress := readDWORD(hGTA, 0xB6F3B8)
361if(ErrorLevel) {
362ErrorLevel := ERROR_READ_MEMORY
363return 0
364}
365if(!dwAddress)
366return 0
367dwAddress := readDWORD(hGTA, dwAddress+0x79C)
368if(ErrorLevel) {
369ErrorLevel := ERROR_READ_MEMORY
370return 0
371}
372ErrorLevel := ERROR_OK
373return dwAddress
374}
375calcScreenCoors(fX,fY,fZ)
376{
377if(!checkHandles())
378return false
379dwM := 0xB6FA2C
380m_11 := readFloat(hGTA, dwM + 0*4)
381if(ErrorLevel) {
382ErrorLevel := ERROR_READ_MEMORY
383return false
384}
385m_12 := readFloat(hGTA, dwM + 1*4)
386m_13 := readFloat(hGTA, dwM + 2*4)
387m_21 := readFloat(hGTA, dwM + 4*4)
388m_22 := readFloat(hGTA, dwM + 5*4)
389m_23 := readFloat(hGTA, dwM + 6*4)
390m_31 := readFloat(hGTA, dwM + 8*4)
391m_32 := readFloat(hGTA, dwM + 9*4)
392m_33 := readFloat(hGTA, dwM + 10*4)
393m_41 := readFloat(hGTA, dwM + 12*4)
394m_42 := readFloat(hGTA, dwM + 13*4)
395m_43 := readFloat(hGTA, dwM + 14*4)
396dwLenX := readDWORD(hGTA, 0xC17044)
397if(ErrorLevel) {
398ErrorLevel := ERROR_READ_MEMORY
399return false
400}
401dwLenY := readDWORD(hGTA, 0xC17048)
402frX := fZ * m_31 + fY * m_21 + fX * m_11 + m_41
403frY := fZ * m_32 + fY * m_22 + fX * m_12 + m_42
404frZ := fZ * m_33 + fY * m_23 + fX * m_13 + m_43
405fRecip := 1.0/frZ
406frX *= fRecip * dwLenX
407frY *= fRecip * dwLenY
408if(frX<=dwLenX && frY<=dwLenY && frZ>1)
409return [frX,frY,frZ]
410}
411getPedById(dwId) {
412dwId += 0
413dwId := Floor(dwId)
414if(dwId < 0 || dwId >= SAMP_PLAYER_MAX)
415return 0
416if(iRefreshScoreboard+iUpdateTick > A_TickCount)
417{
418if(oScoreboardData[dwId])
419{
420if(oScoreboardData[dwId].HasKey("PED"))
421return oScoreboardData[dwId].PED
422}
423return 0
424}
425if(!updateOScoreboardData())
426return 0
427if(oScoreboardData[dwId])
428{
429if(oScoreboardData[dwId].HasKey("PED"))
430return oScoreboardData[dwId].PED
431}
432return 0
433}
434getIdByPed(dwPed) {
435dwPed += 0
436dwPed := Floor(dwPed)
437if(!dwPed)
438return -1
439if(iRefreshScoreboard+iUpdateTick > A_TickCount)
440{
441For i, o in oScoreboardData
442{
443if(o.HasKey("PED"))
444{
445if(o.PED==dwPed)
446return i
447}
448}
449return -1
450}
451if(!updateOScoreboardData())
452return -1
453For i, o in oScoreboardData
454{
455if(o.HasKey("PED"))
456{
457if(o.PED==dwPed)
458return i
459}
460}
461return -1
462}
463getStreamedInPlayersInfo() {
464r:=[]
465if(iRefreshScoreboard+iUpdateTick > A_TickCount)
466{
467For i, o in oScoreboardData
468{
469if(o.HasKey("PED"))
470{
471p := getPedCoordinates(o.PED)
472if(p)
473{
474o.POS := p
475r[i] := o
476}
477}
478}
479return r
480}
481if(!updateOScoreboardData())
482return ""
483For i, o in oScoreboardData
484{
485if(o.HasKey("PED"))
486{
487p := getPedCoordinates(o.PED)
488if(p)
489{
490o.POS := p
491r[i] := o
492}
493}
494}
495return r
496}
497callFuncForAllStreamedInPlayers(cfunc,dist=0x7fffffff) {
498cfunc := "" cfunc
499dist += 0
500if(!IsFunc(cfunc))
501return false
502p := getStreamedInPlayersInfo()
503if(!p)
504return false
505if(dist<0x7fffffff)
506{
507lpos := getCoordinates()
508if(!lpos)
509return false
510For i, o in p
511{
512if(dist>getDist(lpos,o.POS))
513%cfunc%(o)
514}
515}
516else
517{
518For i, o in p
519%cfunc%(o)
520}
521return true
522}
523getDist(pos1,pos2) {
524if(!pos1 || !pos2)
525return 0
526return 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]))
527}
528getClosestPlayerPed() {
529dist := 0x7fffffff
530p := getStreamedInPlayersInfo()
531if(!p)
532return -1
533lpos := getCoordinates()
534if(!lpos)
535return -1
536id := -1
537For i, o in p
538{
539t:=getDist(lpos,o.POS)
540if(t<dist)
541{
542dist := t
543id := i
544}
545}
546PED := getPedById(id)
547return PED
548}
549getClosestPlayerId() {
550dist := 0x7fffffff
551p := getStreamedInPlayersInfo()
552if(!p)
553return -1
554lpos := getCoordinates()
555if(!lpos)
556return -1
557id := -1
558For i, o in p
559{
560t:=getDist(lpos,o.POS)
561if(t<dist)
562{
563dist := t
564id := i
565}
566}
567return id
568}
569CountOnlinePlayers() {
570if(!checkHandles())
571return -1
572dwOnline := readDWORD(hGTA, dwSAMP + 0x21A0B4)
573if(ErrorLevel) {
574ErrorLevel := ERROR_READ_MEMORY
575return -1
576}
577dwAddr := dwOnline + 0x4
578OnlinePlayers := readDWORD(hGTA, dwAddr)
579if(ErrorLevel) {
580ErrorLevel := ERROR_READ_MEMORY
581return -1
582}
583ErrorLevel := ERROR_OK
584return OnlinePlayers
585}
586getPedCoordinates(dwPED) {
587dwPED += 0
588dwPED := Floor(dwPED)
589if(!dwPED)
590return ""
591if(!checkHandles())
592return ""
593dwAddress := readDWORD(hGTA, dwPED + 0x14)
594if(ErrorLevel || dwAddress==0) {
595ErrorLevel := ERROR_READ_MEMORY
596return ""
597}
598fX := readFloat(hGTA, dwAddress + 0x30)
599if(ErrorLevel) {
600ErrorLevel := ERROR_READ_MEMORY
601return ""
602}
603fY := readFloat(hGTA, dwAddress + 0x34)
604if(ErrorLevel) {
605ErrorLevel := ERROR_READ_MEMORY
606return ""
607}
608fZ := readFloat(hGTA, dwAddress + 0x38)
609if(ErrorLevel) {
610ErrorLevel := ERROR_READ_MEMORY
611return ""
612}
613ErrorLevel := ERROR_OK
614return [fX, fY, fZ]
615}
616getTargetPos(dwId) {
617dwId += 0
618dwId := Floor(dwId)
619if(dwId < 0 || dwId >= SAMP_PLAYER_MAX)
620return ""
621if(iRefreshScoreboard+iUpdateTick > A_TickCount)
622{
623if(oScoreboardData[dwId])
624{
625if(oScoreboardData[dwId].HasKey("PED"))
626return getPedCoordinates(oScoreboardData[dwId].PED)
627if(oScoreboardData[dwId].HasKey("MPOS"))
628return oScoreboardData[dwId].MPOS
629}
630return ""
631}
632if(!updateOScoreboardData())
633return ""
634if(oScoreboardData[dwId])
635{
636if(oScoreboardData[dwId].HasKey("PED"))
637return getPedCoordinates(oScoreboardData[dwId].PED)
638if(oScoreboardData[dwId].HasKey("MPOS"))
639return oScoreboardData[dwId].MPOS
640}
641return ""
642}
643getTargetPlayerSkinIdByPed(dwPED) {
644if(!checkHandles())
645return -1
646dwAddr := dwPED + ADDR_CPED_SKINIDOFF
647SkinID := readMem(hGTA, dwAddr, 2, "byte")
648if(ErrorLevel) {
649ErrorLevel := ERROR_READ_MEMORY
650return -1
651}
652ErrorLevel := ERROR_OK
653return SkinID
654}
655getTargetPlayerSkinIdById(dwId) {
656if(!checkHandles())
657return -1
658dwPED := getPedById(dwId)
659dwAddr := dwPED + ADDR_CPED_SKINIDOFF
660SkinID := readMem(hGTA, dwAddr, 2, "byte")
661if(ErrorLevel) {
662ErrorLevel := ERROR_READ_MEMORY
663return -1
664}
665ErrorLevel := ERROR_OK
666return SkinID
667}
668getVehiclePointerByPed(dwPED) {
669dwPED += 0
670dwPED := Floor(dwPED)
671if(!dwPED)
672return 0
673if(!checkHandles())
674return 0
675dwAddress := readDWORD(hGTA, dwPED + 0x58C)
676if(ErrorLevel) {
677ErrorLevel := ERROR_READ_MEMORY
678return 0
679}
680ErrorLevel := ERROR_OK
681return dwAddress
682}
683getVehiclePointerById(dwId) {
684if(!dwId)
685return 0
686if(!checkHandles())
687return 0
688dwPed_By_Id := getPedById(dwId)
689dwAddress := readDWORD(hGTA, dwPed_By_Id + 0x58C)
690if(ErrorLevel) {
691ErrorLevel := ERROR_READ_MEMORY
692return 0
693}
694ErrorLevel := ERROR_OK
695return dwAddress
696}
697isTargetInAnyVehicleByPed(dwPED)
698{
699if(!checkHandles())
700return -1
701dwVehiclePointer := getVehiclePointerByPed(dwPedPointer)
702if(dwVehiclePointer > 0)
703{
704return 1
705}
706else if(dwVehiclePointer <= 0)
707{
708return 0
709}
710else
711{
712return -1
713}
714}
715isTargetInAnyVehiclebyId(dwId)
716{
717if(!checkHandles())
718return -1
719dwPedPointer := getPedById(dwId)
720dwVehiclePointer := getVehiclePointerByPed(dwPedPointer)
721if(dwVehiclePointer > 0)
722{
723return 1
724}
725else if(dwVehiclePointer <= 0)
726{
727return 0
728}
729else
730{
731return -1
732}
733}
734getTargetVehicleHealthByPed(dwPed) {
735if(!checkHandles())
736return -1
737dwVehPtr := getVehiclePointerByPed(dwPed)
738dwAddr := dwVehPtr + ADDR_VEHICLE_HPOFF
739fHealth := readFloat(hGTA, dwAddr)
740if(ErrorLevel) {
741ErrorLevel := ERROR_READ_MEMORY
742return -1
743}
744ErrorLevel := ERROR_OK
745return Round(fHealth)
746}
747getTargetVehicleHealthById(dwId) {
748if(!checkHandles())
749return -1
750dwVehPtr := getVehiclePointerById(dwId)
751dwAddr := dwVehPtr + ADDR_VEHICLE_HPOFF
752fHealth := readFloat(hGTA, dwAddr)
753if(ErrorLevel) {
754ErrorLevel := ERROR_READ_MEMORY
755return -1
756}
757ErrorLevel := ERROR_OK
758return Round(fHealth)
759}
760getTargetVehicleTypeByPed(dwPED) {
761if(!checkHandles())
762return 0
763dwAddr := getVehiclePointerByPed(dwPED)
764if(!dwAddr)
765return 0
766cVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_TYPE, 1, "Char")
767if(ErrorLevel) {
768ErrorLevel := ERROR_READ_MEMORY
769return 0
770}
771ErrorLevel := ERROR_OK
772if(!cVal)
773{
774mid := getVehicleModelId()
775Loop % oAirplaneModels.MaxIndex()
776{
777if(oAirplaneModels[A_Index]==mid)
778return 5
779}
780return 1
781}
782else if(cVal==5)
783return 2
784else if(cVal==6)
785return 3
786else if(cVal==9)
787{
788mid := getVehicleModelId()
789Loop % oBikeModels.MaxIndex()
790{
791if(oBikeModels[A_Index]==mid)
792return 6
793}
794return 4
795}
796return 0
797}
798getTargetVehicleTypeById(dwId) {
799if(!checkHandles())
800return 0
801dwAddr := getVehiclePointerById(dwId)
802if(!dwAddr)
803return 0
804cVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_TYPE, 1, "Char")
805if(ErrorLevel) {
806ErrorLevel := ERROR_READ_MEMORY
807return 0
808}
809ErrorLevel := ERROR_OK
810if(!cVal)
811{
812mid := getVehicleModelId()
813Loop % oAirplaneModels.MaxIndex()
814{
815if(oAirplaneModels[A_Index]==mid)
816return 5
817}
818return 1
819}
820else if(cVal==5)
821return 2
822else if(cVal==6)
823return 3
824else if(cVal==9)
825{
826mid := getVehicleModelId()
827Loop % oBikeModels.MaxIndex()
828{
829if(oBikeModels[A_Index]==mid)
830return 6
831}
832return 4
833}
834return 0
835}
836getTargetVehicleModelIdByPed(dwPED) {
837if(!checkHandles())
838return 0
839dwAddr := getVehiclePointerByPed(dwPED)
840if(!dwAddr)
841return 0
842sVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_MODEL, 2, "Short")
843if(ErrorLevel) {
844ErrorLevel := ERROR_READ_MEMORY
845return 0
846}
847ErrorLevel := ERROR_OK
848return sVal
849}
850getTargetVehicleModelIdById(dwId) {
851if(!checkHandles())
852return 0
853dwAddr := getVehiclePointerById(dwId)
854if(!dwAddr)
855return 0
856sVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_MODEL, 2, "Short")
857if(ErrorLevel) {
858ErrorLevel := ERROR_READ_MEMORY
859return 0
860}
861ErrorLevel := ERROR_OK
862return sVal
863}
864getTargetVehicleModelNameByPed(dwPED) {
865id := getTargetVehicleModelIdByPed(dwPED)
866if(id > 400 && id < 611)
867{
868return ovehicleNames[id-399]
869}
870return ""
871}
872getTargetVehicleModelNameById(dwId) {
873id := getTargetVehicleModelIdById(dwId)
874if(id > 400 && id < 611)
875{
876return ovehicleNames[id-399]
877}
878return ""
879}
880getTargetVehicleLightStateByPed(dwPED) {
881if(!checkHandles())
882return -1
883dwAddr := getVehiclePointerByPed(dwPED)
884if(!dwAddr)
885return -1
886dwVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_LIGHTSTATE, 4, "Int")
887if(ErrorLevel) {
888ErrorLevel := ERROR_READ_MEMORY
889return -1
890}
891ErrorLevel := ERROR_OK
892return (dwVal>0)
893}
894getTargetVehicleLightStateById(dwId) {
895if(!checkHandles())
896return -1
897dwAddr := getVehiclePointerById(dwId)
898if(!dwAddr)
899return -1
900dwVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_LIGHTSTATE, 4, "Int")
901if(ErrorLevel) {
902ErrorLevel := ERROR_READ_MEMORY
903return -1
904}
905ErrorLevel := ERROR_OK
906return (dwVal>0)
907}
908getTargetVehicleLockStateByPed(dwPED) {
909if(!checkHandles())
910return -1
911dwAddr := getVehiclePointerByPed(dwPED)
912if(!dwAddr)
913return -1
914dwVal := readDWORD(hGTA, dwAddr + ADDR_VEHICLE_DOORSTATE)
915if(ErrorLevel) {
916ErrorLevel := ERROR_READ_MEMORY
917return -1
918}
919ErrorLevel := ERROR_OK
920return (dwVal==2)
921}
922getTargetVehicleLockStateById(dwId) {
923if(!checkHandles())
924return -1
925dwAddr := getVehiclePointerById(dwId)
926if(!dwAddr)
927return -1
928dwVal := readDWORD(hGTA, dwAddr + ADDR_VEHICLE_DOORSTATE)
929if(ErrorLevel) {
930ErrorLevel := ERROR_READ_MEMORY
931return -1
932}
933ErrorLevel := ERROR_OK
934return (dwVal==2)
935}
936getTargetVehicleColor1byPed(dwPED) {
937if(!checkHandles())
938return 0
939dwAddr := getVehiclePointerByPed(dwPED)
940if(!dwAddr)
941return 0
942sVal := readMem(hGTA, dwAddr + 1076, 1, "byte")
943if(ErrorLevel) {
944ErrorLevel := ERROR_READ_MEMORY
945return 0
946}
947ErrorLevel := ERROR_OK
948return sVal
949}
950getTargetVehicleColor1byId(dwId) {
951if(!checkHandles())
952return 0
953dwAddr := getVehiclePointerById(dwId)
954if(!dwAddr)
955return 0
956sVal := readMem(hGTA, dwAddr + 1076, 1, "byte")
957if(ErrorLevel) {
958ErrorLevel := ERROR_READ_MEMORY
959return 0
960}
961ErrorLevel := ERROR_OK
962return sVal
963}
964getTargetVehicleColor2byPed(dwPED) {
965if(!checkHandles())
966return 0
967dwAddr := getVehiclePointerByPed(dwPED)
968if(!dwAddr)
969return 0
970sVal := readMem(hGTA, dwAddr + 1077, 1, "byte")
971if(ErrorLevel) {
972ErrorLevel := ERROR_READ_MEMORY
973return 0
974}
975ErrorLevel := ERROR_OK
976return sVal
977}
978getTargetVehicleColor2byId(dwId) {
979if(!checkHandles())
980return 0
981dwAddr := getVehiclePointerById(dwId)
982if(!dwAddr)
983return 0
984sVal := readMem(hGTA, dwAddr + 1077, 1, "byte")
985if(ErrorLevel) {
986ErrorLevel := ERROR_READ_MEMORY
987return 0
988}
989ErrorLevel := ERROR_OK
990return sVal
991}
992getTargetVehicleSpeedByPed(dwPED) {
993if(!checkHandles())
994return -1
995dwAddr := getVehiclePointerByPed(dwPED)
996fSpeedX := readMem(hGTA, dwAddr + ADDR_VEHICLE_X, 4, "float")
997fSpeedY := readMem(hGTA, dwAddr + ADDR_VEHICLE_Y, 4, "float")
998fSpeedZ := readMem(hGTA, dwAddr + ADDR_VEHICLE_Z, 4, "float")
999fVehicleSpeed := sqrt((fSpeedX * fSpeedX) + (fSpeedY * fSpeedY) + (fSpeedZ * fSpeedZ))
1000fVehicleSpeed := (fVehicleSpeed * 100) * 1.43
1001return fVehicleSpeed
1002}
1003getTargetVehicleSpeedById(dwId) {
1004if(!checkHandles())
1005return -1
1006dwAddr := getVehiclePointerById(dwId)
1007fSpeedX := readMem(hGTA, dwAddr + ADDR_VEHICLE_X, 4, "float")
1008fSpeedY := readMem(hGTA, dwAddr + ADDR_VEHICLE_Y, 4, "float")
1009fSpeedZ := readMem(hGTA, dwAddr + ADDR_VEHICLE_Z, 4, "float")
1010fVehicleSpeed := sqrt((fSpeedX * fSpeedX) + (fSpeedY * fSpeedY) + (fSpeedZ * fSpeedZ))
1011fVehicleSpeed := (fVehicleSpeed * 100) * 1.43
1012return fVehicleSpeed
1013}
1014getPlayerNameById(dwId) {
1015dwId += 0
1016dwId := Floor(dwId)
1017if(dwId < 0 || dwId >= SAMP_PLAYER_MAX)
1018return ""
1019if(iRefreshScoreboard+iUpdateTick > A_TickCount)
1020{
1021if(oScoreboardData[dwId])
1022return oScoreboardData[dwId].NAME
1023return ""
1024}
1025if(!updateOScoreboardData())
1026return ""
1027if(oScoreboardData[dwId])
1028return oScoreboardData[dwId].NAME
1029return ""
1030}
1031getPlayerIdByName(wName, exact := false) {
1032wName := "" wName
1033if(StrLen(wName) < 1 || StrLen(wName) > 24)
1034return -1
1035if(iRefreshScoreboard+iUpdateTick > A_TickCount)
1036{
1037For i, o in oScoreboardData
1038{
1039if (o.NAME = wName)
1040return i
1041}
1042For i, o in oScoreboardData
1043{
1044if (!exact && InStr(o.NAME,wName)==1)
1045return i
1046else if (exact && o.NAME = wName)
1047return i
1048}
1049return -1
1050}
1051if(!updateOScoreboardData())
1052return -2
1053For i, o in oScoreboardData
1054{
1055if (o.NAME = wName)
1056return i
1057}
1058For i, o in oScoreboardData
1059{
1060if (!exact && InStr(o.NAME,wName)==1)
1061return i
1062else if (exact && o.NAME = wName)
1063return i
1064}
1065return -1
1066}
1067getPlayerScoreById(dwId) {
1068dwId += 0
1069dwId := Floor(dwId)
1070if(dwId < 0 || dwId >= SAMP_PLAYER_MAX)
1071return ""
1072if(iRefreshScoreboard+iUpdateTick > A_TickCount)
1073{
1074if(oScoreboardData[dwId])
1075return oScoreboardData[dwId].SCORE
1076return ""
1077}
1078if(!updateOScoreboardData())
1079return ""
1080if(oScoreboardData[dwId])
1081return oScoreboardData[dwId].SCORE
1082return ""
1083}
1084getPlayerPingById(dwId) {
1085dwId += 0
1086dwId := Floor(dwId)
1087if(dwId < 0 || dwId >= SAMP_PLAYER_MAX)
1088return -1
1089if(iRefreshScoreboard+iUpdateTick > A_TickCount)
1090{
1091if(oScoreboardData[dwId])
1092return oScoreboardData[dwId].PING
1093return -1
1094}
1095if(!updateOScoreboardData())
1096return -1
1097if(oScoreboardData[dwId])
1098return oScoreboardData[dwId].PING
1099return -1
1100}
1101isNPCById(dwId) {
1102dwId += 0
1103dwId := Floor(dwId)
1104if(dwId < 0 || dwId >= SAMP_PLAYER_MAX)
1105return -1
1106if(iRefreshScoreboard+iUpdateTick > A_TickCount)
1107{
1108if(oScoreboardData[dwId])
1109return oScoreboardData[dwId].ISNPC
1110return -1
1111}
1112if(!updateOScoreboardData())
1113return -1
1114if(oScoreboardData[dwId])
1115return oScoreboardData[dwId].ISNPC
1116return -1
1117}
1118updateScoreboardDataEx() {
1119if(!checkHandles())
1120return false
1121dwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET)
1122if(ErrorLevel || dwAddress==0) {
1123ErrorLevel := ERROR_READ_MEMORY
1124return false
1125}
1126dwFunc := dwSAMP + FUNC_UPDATESCOREBOARD
1127VarSetCapacity(injectData, 11, 0)
1128NumPut(0xB9, injectData, 0, "UChar")
1129NumPut(dwAddress, injectData, 1, "UInt")
1130NumPut(0xE8, injectData, 5, "UChar")
1131offset := dwFunc - (pInjectFunc + 10)
1132NumPut(offset, injectData, 6, "Int")
1133NumPut(0xC3, injectData, 10, "UChar")
1134writeRaw(hGTA, pInjectFunc, &injectData, 11)
1135if(ErrorLevel)
1136return false
1137hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
1138if(ErrorLevel)
1139return false
1140waitForSingleObject(hThread, 0xFFFFFFFF)
1141closeProcess(hThread)
1142return true
1143}
1144updateOScoreboardData() {
1145if(!checkHandles())
1146return 0
1147oScoreboardData := []
1148if(!updateScoreboardDataEx())
1149return 0
1150iRefreshScoreboard := A_TickCount
1151dwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET)
1152if(ErrorLevel || dwAddress==0) {
1153ErrorLevel := ERROR_READ_MEMORY
1154return 0
1155}
1156dwAddress := readDWORD(hGTA, dwAddress + SAMP_PPOOLS_OFFSET)
1157if(ErrorLevel || dwAddress==0) {
1158ErrorLevel := ERROR_READ_MEMORY
1159return 0
1160}
1161dwPlayers := readDWORD(hGTA, dwAddress + SAMP_PPOOL_PLAYER_OFFSET)
1162if(ErrorLevel || dwPlayers==0) {
1163ErrorLevel := ERROR_READ_MEMORY
1164return 0
1165}
1166wID := readMem(hGTA, dwPlayers + SAMP_SLOCALPLAYERID_OFFSET, 2, "Short")
1167if(ErrorLevel) {
1168ErrorLevel := ERROR_READ_MEMORY
1169return 0
1170}
1171dwPing := readMem(hGTA, dwPlayers + SAMP_ILOCALPLAYERPING_OFFSET, 4, "Int")
1172if(ErrorLevel) {
1173ErrorLevel := ERROR_READ_MEMORY
1174return 0
1175}
1176dwScore := readMem(hGTA, dwPlayers + SAMP_ILOCALPLAYERSCORE_OFFSET, 4, "Int")
1177if(ErrorLevel) {
1178ErrorLevel := ERROR_READ_MEMORY
1179return 0
1180}
1181dwTemp := readMem(hGTA, dwPlayers + SAMP_ISTRLEN_LOCALPLAYERNAME_OFFSET, 4, "Int")
1182if(ErrorLevel) {
1183ErrorLevel := ERROR_READ_MEMORY
1184return 0
1185}
1186sUsername := ""
1187if(dwTemp <= 0xf) {
1188sUsername := readString(hGTA, dwPlayers + SAMP_SZLOCALPLAYERNAME_OFFSET, 16)
1189if(ErrorLevel) {
1190ErrorLevel := ERROR_READ_MEMORY
1191return 0
1192}
1193}
1194else {
1195dwAddress := readDWORD(hGTA, dwPlayers + SAMP_PSZLOCALPLAYERNAME_OFFSET)
1196if(ErrorLevel) {
1197ErrorLevel := ERROR_READ_MEMORY
1198return 0
1199}
1200sUsername := readString(hGTA, dwAddress, 25)
1201if(ErrorLevel) {
1202ErrorLevel := ERROR_READ_MEMORY
1203return 0
1204}
1205}
1206oScoreboardData[wID] := Object("NAME", sUsername, "ID", wID, "PING", dwPing, "SCORE", dwScore, "ISNPC", 0)
1207Loop, % SAMP_PLAYER_MAX
1208{
1209i := A_Index-1
1210dwRemoteplayer := readDWORD(hGTA, dwPlayers+SAMP_PREMOTEPLAYER_OFFSET+i*4)
1211if(ErrorLevel) {
1212ErrorLevel := ERROR_READ_MEMORY
1213return 0
1214}
1215if(dwRemoteplayer==0)
1216continue
1217dwPing := readMem(hGTA, dwRemoteplayer + SAMP_IPING_OFFSET, 4, "Int")
1218if(ErrorLevel) {
1219ErrorLevel := ERROR_READ_MEMORY
1220return 0
1221}
1222dwScore := readMem(hGTA, dwRemoteplayer + SAMP_ISCORE_OFFSET, 4, "Int")
1223if(ErrorLevel) {
1224ErrorLevel := ERROR_READ_MEMORY
1225return 0
1226}
1227dwIsNPC := readMem(hGTA, dwRemoteplayer + SAMP_ISNPC_OFFSET, 4, "Int")
1228if(ErrorLevel) {
1229ErrorLevel := ERROR_READ_MEMORY
1230return 0
1231}
1232dwTemp := readMem(hGTA, dwRemoteplayer + SAMP_ISTRLENNAME___OFFSET, 4, "Int")
1233if(ErrorLevel) {
1234ErrorLevel := ERROR_READ_MEMORY
1235return 0
1236}
1237sUsername := ""
1238if(dwTemp <= 0xf)
1239{
1240sUsername := readString(hGTA, dwRemoteplayer+SAMP_SZPLAYERNAME_OFFSET, 16)
1241if(ErrorLevel) {
1242ErrorLevel := ERROR_READ_MEMORY
1243return 0
1244}
1245}
1246else {
1247dwAddress := readDWORD(hGTA, dwRemoteplayer + SAMP_PSZPLAYERNAME_OFFSET)
1248if(ErrorLevel || dwAddress==0) {
1249ErrorLevel := ERROR_READ_MEMORY
1250return 0
1251}
1252sUsername := readString(hGTA, dwAddress, 25)
1253if(ErrorLevel) {
1254ErrorLevel := ERROR_READ_MEMORY
1255return 0
1256}
1257}
1258o := Object("NAME", sUsername, "ID", i, "PING", dwPing, "SCORE", dwScore, "ISNPC", dwIsNPC)
1259oScoreboardData[i] := o
1260dwRemoteplayerData := readDWORD(hGTA, dwRemoteplayer + 0x0)
1261if(ErrorLevel) {
1262ErrorLevel := ERROR_READ_MEMORY
1263return 0
1264}
1265if(dwRemoteplayerData==0)
1266continue
1267dwAddress := readDWORD(hGTA, dwRemoteplayerData + 489)
1268if(ErrorLevel) {
1269ErrorLevel := ERROR_READ_MEMORY
1270return 0
1271}
1272if(dwAddress)
1273{
1274ix := readMem(hGTA, dwRemoteplayerData + 493, 4, "Int")
1275if(ErrorLevel) {
1276ErrorLevel := ERROR_READ_MEMORY
1277return 0
1278}
1279iy := readMem(hGTA, dwRemoteplayerData + 497, 4, "Int")
1280if(ErrorLevel) {
1281ErrorLevel := ERROR_READ_MEMORY
1282return 0
1283}
1284iz := readMem(hGTA, dwRemoteplayerData + 501, 4, "Int")
1285if(ErrorLevel) {
1286ErrorLevel := ERROR_READ_MEMORY
1287return 0
1288}
1289o.MPOS := [ix, iy, iz]
1290}
1291dwpSAMP_Actor := readDWORD(hGTA, dwRemoteplayerData + 0x0)
1292if(ErrorLevel) {
1293ErrorLevel := ERROR_READ_MEMORY
1294return 0
1295}
1296if(dwpSAMP_Actor==0)
1297continue
1298dwPed := readDWORD(hGTA, dwpSAMP_Actor + 676)
1299if(ErrorLevel) {
1300ErrorLevel := ERROR_READ_MEMORY
1301return 0
1302}
1303if(dwPed==0)
1304continue
1305o.PED := dwPed
1306fHP := readFloat(hGTA, dwRemoteplayerData + 444)
1307if(ErrorLevel) {
1308ErrorLevel := ERROR_READ_MEMORY
1309return 0
1310}
1311fARMOR := readFloat(hGTA, dwRemoteplayerData + 440)
1312if(ErrorLevel) {
1313ErrorLevel := ERROR_READ_MEMORY
1314return 0
1315}
1316o.HP := fHP
1317o.ARMOR := fARMOR
1318}
1319ErrorLevel := ERROR_OK
1320return 1
1321}
1322GetChatLine(Line, ByRef Output, timestamp=0, color=0){
1323chatindex := 0
1324FileRead, file, %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
1325loop, Parse, file, `n, `r
1326{
1327if(A_LoopField)
1328chatindex := A_Index
1329}
1330loop, Parse, file, `n, `r
1331{
1332if(A_Index = chatindex - line){
1333output := A_LoopField
1334break
1335}
1336}
1337file := ""
1338if(!timestamp)
1339output := RegExReplace(output, "U)^\[\d{2}:\d{2}:\d{2}\]")
1340if(!color)
1341output := RegExReplace(output, "Ui)\{[a-f0-9]{6}\}")
1342return
1343}
1344getPlayerHealth() {
1345if(!checkHandles())
1346return -1
1347dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR)
1348if(ErrorLevel) {
1349ErrorLevel := ERROR_READ_MEMORY
1350return -1
1351}
1352dwAddr := dwCPedPtr + ADDR_CPED_HPOFF
1353fHealth := readFloat(hGTA, dwAddr)
1354if(ErrorLevel) {
1355ErrorLevel := ERROR_READ_MEMORY
1356return -1
1357}
1358ErrorLevel := ERROR_OK
1359return Round(fHealth)
1360}
1361getPlayerArmor() {
1362if(!checkHandles())
1363return -1
1364dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR)
1365if(ErrorLevel) {
1366ErrorLevel := ERROR_READ_MEMORY
1367return -1
1368}
1369dwAddr := dwCPedPtr + ADDR_CPED_ARMOROFF
1370fHealth := readFloat(hGTA, dwAddr)
1371if(ErrorLevel) {
1372ErrorLevel := ERROR_READ_MEMORY
1373return -1
1374}
1375ErrorLevel := ERROR_OK
1376return Round(fHealth)
1377}
1378getPlayerInteriorId() {
1379if(!checkHandles())
1380return -1
1381iid := readMem(hGTA, ADDR_CPED_INTID, 4, "Int")
1382if(ErrorLevel) {
1383ErrorLevel := ERROR_READ_MEMORY
1384return -1
1385}
1386ErrorLevel := ERROR_OK
1387return iid
1388}
1389getPlayerSkinID() {
1390if(!checkHandles())
1391return -1
1392dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR)
1393if(ErrorLevel) {
1394ErrorLevel := ERROR_READ_MEMORY
1395return -1
1396}
1397dwAddr := dwCPedPtr + ADDR_CPED_SKINIDOFF
1398SkinID := readMem(hGTA, dwAddr, 2, "byte")
1399if(ErrorLevel) {
1400ErrorLevel := ERROR_READ_MEMORY
1401return -1
1402}
1403ErrorLevel := ERROR_OK
1404return SkinID
1405}
1406getPlayerMoney() {
1407if(!checkHandles())
1408return ""
1409money := readMem(hGTA, ADDR_CPED_MONEY, 4, "Int")
1410if(ErrorLevel) {
1411ErrorLevel := ERROR_READ_MEMORY
1412return ""
1413}
1414ErrorLevel := ERROR_OK
1415return money
1416}
1417getPlayerWanteds() {
1418if(!checkHandles())
1419return -1
1420dwPtr := 0xB7CD9C
1421dwPtr := readDWORD(hGTA, dwPtr)
1422if(ErrorLevel) {
1423ErrorLevel := ERROR_READ_MEMORY
1424return -1
1425}
1426Wanteds := readDWORD(hGTA, dwPtr)
1427if(ErrorLevel) {
1428ErrorLevel := ERROR_READ_MEMORY
1429return -1
1430}
1431ErrorLevel := ERROR_OK
1432return Wanteds
1433}
1434getPlayerWeaponId() {
1435if(!checkHandles())
1436return 0
1437WaffenId := readMem(hGTA, 0xBAA410, 4, "byte")
1438if(ErrorLevel) {
1439ErrorLevel := ERROR_READ_MEMORY
1440return -1
1441}
1442return WaffenId
1443}
1444getPlayerWeaponName() {
1445id := getPlayerWeaponId()
1446if(id >= 0 && id < 44)
1447{
1448return oweaponNames[id+1]
1449}
1450return ""
1451}
1452getPlayerState() {
1453if(!checkHandles())
1454return -1
1455dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR)
1456if(ErrorLevel) {
1457ErrorLevel := ERROR_READ_MEMORY
1458return -1
1459}
1460State := readDWORD(hGTA, dwCPedPtr + 0x530)
1461if(ErrorLevel) {
1462ErrorLevel := ERROR_READ_MEMORY
1463return -1
1464}
1465ErrorLevel := ERROR_OK
1466return State
1467}
1468IsPlayerInMenu() {
1469if(!checkHandles())
1470return -1
1471IsInMenu := readMem(hGTA, 0xBA67A4, 4, "byte")
1472if(ErrorLevel) {
1473ErrorLevel := ERROR_READ_MEMORY
1474return -1
1475}
1476ErrorLevel := ERROR_OK
1477return IsInMenu
1478}
1479getPlayerMapPosX() {
1480if(!checkHandles())
1481return -1
1482MapPosX := readFloat(hGTA, 0xBA67B8)
1483if(ErrorLevel) {
1484ErrorLevel := ERROR_READ_MEMORY
1485return -1
1486}
1487ErrorLevel := ERROR_OK
1488return MapPosX
1489}
1490getPlayerMapPosY() {
1491if(!checkHandles())
1492return -1
1493MapPosY := readFloat(hGTA, 0xBA67BC)
1494if(ErrorLevel) {
1495ErrorLevel := ERROR_READ_MEMORY
1496return -1
1497}
1498ErrorLevel := ERROR_OK
1499return MapPosY
1500}
1501getPlayerMapZoom() {
1502if(!checkHandles())
1503return -1
1504MapZoom := readFloat(hGTA, 0xBA67AC)
1505if(ErrorLevel) {
1506ErrorLevel := ERROR_READ_MEMORY
1507return -1
1508}
1509ErrorLevel := ERROR_OK
1510return MapZoom
1511}
1512IsPlayerFreezed() {
1513if(!checkHandles())
1514return -1
1515dwGTA := getModuleBaseAddress("gta_sa.exe", hGTA)
1516IPF := readMem(hGTA, dwGTA + 0x690495, 2, "byte")
1517if(ErrorLevel) {
1518ErrorLevel := ERROR_READ_MEMORY
1519return -1
1520}
1521ErrorLevel := ERROR_OK
1522return IPF
1523}
1524isPlayerInAnyVehicle()
1525{
1526if(!checkHandles())
1527return -1
1528dwVehPtr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
1529if(ErrorLevel) {
1530ErrorLevel := ERROR_READ_MEMORY
1531return -1
1532}
1533return (dwVehPtr > 0)
1534}
1535isPlayerDriver() {
1536if(!checkHandles())
1537return -1
1538dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
1539if(ErrorLevel) {
1540ErrorLevel := ERROR_READ_MEMORY
1541return -1
1542}
1543if(!dwAddr)
1544return -1
1545dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR)
1546if(ErrorLevel) {
1547ErrorLevel := ERROR_READ_MEMORY
1548return -1
1549}
1550dwVal := readDWORD(hGTA, dwAddr + ADDR_VEHICLE_DRIVER)
1551if(ErrorLevel) {
1552ErrorLevel := ERROR_READ_MEMORY
1553return -1
1554}
1555ErrorLevel := ERROR_OK
1556return (dwVal==dwCPedPtr)
1557}
1558getVehicleHealth() {
1559if(!checkHandles())
1560return -1
1561dwVehPtr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
1562if(ErrorLevel) {
1563ErrorLevel := ERROR_READ_MEMORY
1564return -1
1565}
1566dwAddr := dwVehPtr + ADDR_VEHICLE_HPOFF
1567fHealth := readFloat(hGTA, dwAddr)
1568if(ErrorLevel) {
1569ErrorLevel := ERROR_READ_MEMORY
1570return -1
1571}
1572ErrorLevel := ERROR_OK
1573return Round(fHealth)
1574}
1575getVehicleType() {
1576if(!checkHandles())
1577return 0
1578dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
1579if(ErrorLevel) {
1580ErrorLevel := ERROR_READ_MEMORY
1581return 0
1582}
1583if(!dwAddr)
1584return 0
1585cVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_TYPE, 1, "Char")
1586if(ErrorLevel) {
1587ErrorLevel := ERROR_READ_MEMORY
1588return 0
1589}
1590ErrorLevel := ERROR_OK
1591if(!cVal)
1592{
1593mid := getVehicleModelId()
1594Loop % oAirplaneModels.MaxIndex()
1595{
1596if(oAirplaneModels[A_Index]==mid)
1597return 5
1598}
1599return 1
1600}
1601else if(cVal==5)
1602return 2
1603else if(cVal==6)
1604return 3
1605else if(cVal==9)
1606{
1607mid := getVehicleModelId()
1608Loop % oBikeModels.MaxIndex()
1609{
1610if(oBikeModels[A_Index]==mid)
1611return 6
1612}
1613return 4
1614}
1615return 0
1616}
1617getVehicleModelId() {
1618if(!checkHandles())
1619return 0
1620dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
1621if(ErrorLevel) {
1622ErrorLevel := ERROR_READ_MEMORY
1623return 0
1624}
1625if(!dwAddr)
1626return 0
1627sVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_MODEL, 2, "Short")
1628if(ErrorLevel) {
1629ErrorLevel := ERROR_READ_MEMORY
1630return 0
1631}
1632ErrorLevel := ERROR_OK
1633return sVal
1634}
1635getVehicleModelName() {
1636id:=getVehicleModelId()
1637if(id > 400 && id < 611)
1638{
1639return ovehicleNames[id-399]
1640}
1641return ""
1642}
1643getVehicleLightState() {
1644if(!checkHandles())
1645return -1
1646dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
1647if(ErrorLevel) {
1648ErrorLevel := ERROR_READ_MEMORY
1649return -1
1650}
1651if(!dwAddr)
1652return -1
1653dwVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_LIGHTSTATE, 4, "Int")
1654if(ErrorLevel) {
1655ErrorLevel := ERROR_READ_MEMORY
1656return -1
1657}
1658ErrorLevel := ERROR_OK
1659return (dwVal>0)
1660}
1661getVehicleEngineState() {
1662if(!checkHandles())
1663return -1
1664dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
1665if(ErrorLevel) {
1666ErrorLevel := ERROR_READ_MEMORY
1667return -1
1668}
1669if(!dwAddr)
1670return -1
1671cVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_ENGINESTATE, 1, "Char")
1672if(ErrorLevel) {
1673ErrorLevel := ERROR_READ_MEMORY
1674return -1
1675}
1676ErrorLevel := ERROR_OK
1677return (cVal==24 || cVal==56 || cVal==88 || cVal==120)
1678}
1679getVehicleLockState() {
1680if(!checkHandles())
1681return -1
1682dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
1683if(ErrorLevel) {
1684ErrorLevel := ERROR_READ_MEMORY
1685return -1
1686}
1687if(!dwAddr)
1688return -1
1689dwVal := readDWORD(hGTA, dwAddr + ADDR_VEHICLE_DOORSTATE)
1690if(ErrorLevel) {
1691ErrorLevel := ERROR_READ_MEMORY
1692return -1
1693}
1694ErrorLevel := ERROR_OK
1695return (dwVal==2)
1696}
1697getVehicleColor1() {
1698if(!checkHandles())
1699return 0
1700dwAddr := readDWORD(hGTA, 0xBA18FC)
1701if(ErrorLevel) {
1702ErrorLevel := ERROR_READ_MEMORY
1703return 0
1704}
1705if(!dwAddr)
1706return 0
1707sVal := readMem(hGTA, dwAddr + 1076, 1, "byte")
1708if(ErrorLevel) {
1709ErrorLevel := ERROR_READ_MEMORY
1710return 0
1711}
1712ErrorLevel := ERROR_OK
1713return sVal
1714}
1715getVehicleColor2() {
1716if(!checkHandles())
1717return 0
1718dwAddr := readDWORD(hGTA, 0xBA18FC)
1719if(ErrorLevel) {
1720ErrorLevel := ERROR_READ_MEMORY
1721return 0
1722}
1723if(!dwAddr)
1724return 0
1725sVal := readMem(hGTA, dwAddr + 1077, 1, "byte")
1726if(ErrorLevel) {
1727ErrorLevel := ERROR_READ_MEMORY
1728return 0
1729}
1730ErrorLevel := ERROR_OK
1731return sVal
1732}
1733getVehicleSpeed() {
1734if(!checkHandles())
1735return -1
1736dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
1737if(ErrorLevel) {
1738ErrorLevel := ERROR_READ_MEMORY
1739return ""
1740}
1741fSpeedX := readMem(hGTA, dwAddr + ADDR_VEHICLE_X, 4, "float")
1742fSpeedY := readMem(hGTA, dwAddr + ADDR_VEHICLE_Y, 4, "float")
1743fSpeedZ := readMem(hGTA, dwAddr + ADDR_VEHICLE_Z, 4, "float")
1744fVehicleSpeed := sqrt((fSpeedX * fSpeedX) + (fSpeedY * fSpeedY) + (fSpeedZ * fSpeedZ))
1745fVehicleSpeed := (fVehicleSpeed * 100) * 1.43
1746return fVehicleSpeed
1747}
1748getPlayerRadiostationID() {
1749if(!checkHandles())
1750return -1
1751if(isPlayerInAnyVehicle() == 0)
1752return -1
1753dwGTA := getModuleBaseAddress("gta_sa.exe", hGTA)
1754RadioStationID := readMem(hGTA, dwGTA + 0x4CB7E1, 1, "byte")
1755if(ErrorLevel) {
1756ErrorLevel := ERROR_READ_MEMORY
1757return -1
1758}
1759return RadioStationID
1760}
1761getPlayerRadiostationName() {
1762if(isPlayerInAnyVehicle() == 0)
1763return -1
1764id := getPlayerRadiostationID()
1765if(id == 0)
1766return -1
1767if(id >= 0 && id < 14)
1768{
1769return oradiostationNames[id]
1770}
1771return ""
1772}
1773setCheckpoint(fX, fY, fZ, fSize := 7) {
1774if(!checkHandles())
1775return false
1776dwFunc := dwSAMP + 0x9D340
1777dwAddress := readDWORD(hGTA, dwSAMP + ADDR_SAMP_INCHAT_PTR)
1778if(ErrorLevel || dwAddress==0) {
1779ErrorLevel := ERROR_READ_MEMORY
1780return false
1781}
1782VarSetCapacity(buf, 16, 0)
1783NumPut(fX, buf, 0, "Float")
1784NumPut(fY, buf, 4, "Float")
1785NumPut(fZ, buf, 8, "Float")
1786NumPut(fSize, buf, 12, "Float")
1787writeRaw(hGTA, pParam1, &buf, 16)
1788dwLen := 31
1789VarSetCapacity(injectData, dwLen, 0)
1790NumPut(0xB9, injectData, 0, "UChar")
1791NumPut(dwAddress, injectData, 1, "UInt")
1792NumPut(0x68, injectData, 5, "UChar")
1793NumPut(pParam1+12, injectData, 6, "UInt")
1794NumPut(0x68, injectData, 10, "UChar")
1795NumPut(pParam1, injectData, 11, "UInt")
1796NumPut(0xE8, injectData, 15, "UChar")
1797offset := dwFunc - (pInjectFunc + 20)
1798NumPut(offset, injectData, 16, "Int")
1799NumPut(0x05C7, injectData, 20, "UShort")
1800NumPut(dwAddress+0x24, injectData, 22, "UInt")
1801NumPut(1, injectData, 26, "UInt")
1802NumPut(0xC3, injectData, 30, "UChar")
1803writeRaw(hGTA, pInjectFunc, &injectData, dwLen)
1804if(ErrorLevel)
1805return false
1806hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
1807if(ErrorLevel)
1808return false
1809waitForSingleObject(hThread, 0xFFFFFFFF)
1810closeProcess(hThread)
1811dwAddress := readDWORD(hGTA, dwSAMP + ADDR_SAMP_INCHAT_PTR)
1812writeMemory(hGTA, dwAddress + 0xC, fX, 4, "Float")
1813writeMemory(hGTA, dwAddress + 0x10, fY, 4, "Float")
1814writeMemory(hGTA, dwAddress + 0x14, fZ, 4, "Float")
1815writeMemory(hGTA, dwAddress + 0x18, fSize, 4, "Float")
1816ErrorLevel := ERROR_OK
1817return true
1818}
1819disableCheckpoint()
1820{
1821if(!checkHandles())
1822return false
1823dwAddress := readDWORD(hGTA, dwSAMP + ADDR_SAMP_INCHAT_PTR)
1824if(ErrorLevel || dwAddress==0) {
1825ErrorLevel := ERROR_READ_MEMORY
1826return false
1827}
1828VarSetCapacity(enablecp, 4, 0)
1829NumPut(0,enablecp,0,"Int")
1830writeRaw(hGTA, dwAddress+0x24, &enablecp, 4)
1831ErrorLevel := ERROR_OK
1832return true
1833}
1834IsMarkerCreated(){
1835If(!checkHandles())
1836return false
1837active := readMem(hGTA, CheckpointCheck, 1, "byte")
1838If(!active)
1839return 0
1840else return 1
1841}
1842CoordsFromRedmarker(){
1843if(!checkhandles())
1844return false
1845for i, v in rmaddrs
1846f%i% := readFloat(hGTA, v)
1847return [f1, f2, f3]
1848}
1849getCoordinates() {
1850if(!checkHandles())
1851return ""
1852fX := readFloat(hGTA, ADDR_POSITION_X)
1853if(ErrorLevel) {
1854ErrorLevel := ERROR_READ_MEMORY
1855return ""
1856}
1857fY := readFloat(hGTA, ADDR_POSITION_Y)
1858if(ErrorLevel) {
1859ErrorLevel := ERROR_READ_MEMORY
1860return ""
1861}
1862fZ := readFloat(hGTA, ADDR_POSITION_Z)
1863if(ErrorLevel) {
1864ErrorLevel := ERROR_READ_MEMORY
1865return ""
1866}
1867ErrorLevel := ERROR_OK
1868return [fX, fY, fZ]
1869}
1870GetPlayerPos(ByRef fX,ByRef fY,ByRef fZ) {
1871if(!checkHandles())
1872return 0
1873fX := readFloat(hGTA, ADDR_POSITION_X)
1874if(ErrorLevel) {
1875ErrorLevel := ERROR_READ_MEMORY
1876return 0
1877}
1878fY := readFloat(hGTA, ADDR_POSITION_Y)
1879if(ErrorLevel) {
1880ErrorLevel := ERROR_READ_MEMORY
1881return 0
1882}
1883fZ := readFloat(hGTA, ADDR_POSITION_Z)
1884if(ErrorLevel) {
1885ErrorLevel := ERROR_READ_MEMORY
1886return 0
1887}
1888ErrorLevel := ERROR_OK
1889}
1890getDialogStructPtr() {
1891if (!checkHandles()) {
1892ErrorLevel := ERROR_INVALID_HANDLE
1893return false
1894}
1895dwPointer := readDWORD(hGTA, dwSAMP + SAMP_DIALOG_STRUCT_PTR)
1896if (ErrorLevel) {
1897ErrorLevel := ERROR_READ_MEMORY
1898return false
1899}
1900ErrorLevel := ERROR_OK
1901return dwPointer
1902}
1903isDialogOpen() {
1904dwPointer := getDialogStructPtr()
1905if (ErrorLevel || !dwPointer)
1906return false
1907dwIsOpen := readMem(hGTA, dwPointer + SAMP_DIALOG_OPEN_OFFSET, 4, "UInt")
1908if (ErrorLevel) {
1909ErrorLevel := ERROR_READ_MEMORY
1910return false
1911}
1912ErrorLevel := ERROR_OK
1913return dwIsOpen ? true : false
1914}
1915getDialogStyle() {
1916dwPointer := getDialogStructPtr()
1917if (ErrorLevel || !dwPointer)
1918return -1
1919style := readMem(hGTA, dwPointer + SAMP_DIALOG_STYLE_OFFSET, 4, "UInt")
1920if (ErrorLevel) {
1921ErrorLevel := ERROR_READ_MEMORY
1922return -1
1923}
1924ErrorLevel := ERROR_OK
1925return style
1926}
1927getDialogID() {
1928dwPointer := getDialogStructPtr()
1929if (ErrorLevel || !dwPointer)
1930return -1
1931id := readMem(hGTA, dwPointer + SAMP_DIALOG_ID_OFFSET, 4, "UInt")
1932if (ErrorLevel) {
1933ErrorLevel := ERROR_READ_MEMORY
1934return -1
1935}
1936ErrorLevel := ERROR_OK
1937return id
1938}
1939setDialogID(id) {
1940dwPointer := getDialogStructPtr()
1941if (ErrorLevel || !dwPointer)
1942return false
1943writeMemory(hGTA, dwPointer + SAMP_DIALOG_ID_OFFSET, id, "UInt", 4)
1944if (ErrorLevel) {
1945ErrorLevel := ERROR_WRITE_MEMORY
1946return false
1947}
1948ErrorLevel := ERROR_OK
1949return true
1950}
1951getDialogIndex() {
1952dwPointer := getDialogStructPtr()
1953if (ErrorLevel || !dwPointer)
1954return 0
1955dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_PTR1_OFFSET)
1956if (ErrorLevel) {
1957ErrorLevel := ERROR_READ_MEMORY
1958return 0
1959}
1960index := readMem(hGTA, dwPointer + SAMP_DIALOG_INDEX_OFFSET, 1, "Byte")
1961if (ErrorLevel) {
1962ErrorLevel := ERROR_READ_MEMORY
1963return 0
1964}
1965ErrorLevel := ERROR_OK
1966return index + 1
1967}
1968getDialogCaption() {
1969dwPointer := getDialogStructPtr()
1970if (ErrorLevel || !dwPointer)
1971return ""
1972text := readString(hGTA, dwPointer + SAMP_DIALOG_CAPTION_OFFSET, 64)
1973if (ErrorLevel) {
1974ErrorLevel := ERROR_READ_MEMORY
1975return ""
1976}
1977ErrorLevel := ERROR_OK
1978return text
1979}
1980getDialogTextSize(dwAddress) {
1981i := 0
1982Loop, 4096 {
1983i := A_Index - 1
1984byte := Memory_ReadByte(hGTA, dwAddress + i)
1985if (!byte)
1986break
1987}
1988return i
1989}
1990getDialogText() {
1991dwPointer := getDialogStructPtr()
1992if (ErrorLevel || !dwPointer)
1993return ""
1994dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_TEXT_PTR_OFFSET)
1995if (ErrorLevel) {
1996ErrorLevel := ERROR_READ_MEMORY
1997return ""
1998}
1999text := readString(hGTA, dwPointer, 4096)
2000if (ErrorLevel) {
2001text := readString(hGTA, dwPointer, getDialogTextSize(dwPointer))
2002if (ErrorLevel) {
2003ErrorLevel := ERROR_READ_MEMORY
2004return ""
2005}
2006}
2007ErrorLevel := ERROR_OK
2008return text
2009}
2010getDialogLineCount() {
2011dwPointer := getDialogStructPtr()
2012if (ErrorLevel || !dwPointer)
2013return 0
2014dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_PTR2_OFFSET)
2015if (ErrorLevel) {
2016ErrorLevel := ERROR_READ_MEMORY
2017return 0
2018}
2019count := readMem(hGTA, dwPointer + SAMP_DIALOG_LINECOUNT_OFFSET, 4, "UInt")
2020if (ErrorLevel) {
2021ErrorLevel := ERROR_READ_MEMORY
2022return 0
2023}
2024ErrorLevel := ERROR_OK
2025return count
2026}
2027getDialogLine__(index) {
2028if (getDialogLineCount > index)
2029return ""
2030dwPointer := getDialogStructPtr()
2031if (ErrorLevel || !dwPointer)
2032return ""
2033dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_PTR1_OFFSET)
2034if (ErrorLevel) {
2035ErrorLevel := ERROR_READ_MEMORY
2036return ""
2037}
2038dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_LINES_OFFSET)
2039if (ErrorLevel) {
2040ErrorLevel := ERROR_READ_MEMORY
2041return ""
2042}
2043dwLineAddress := readDWORD(hGTA, dwPointer + (index - 1) * 0x4)
2044line := readString(hGTA, dwLineAddress, 128)
2045ErrorLevel := ERROR_OK
2046return line
2047}
2048getDialogLine(index) {
2049lines := getDialogLines()
2050if (index > lines.Length())
2051return ""
2052if (getDialogStyle() == DIALOG_STYLE_TABLIST_HEADERS)
2053index++
2054return lines[index]
2055}
2056getDialogLines() {
2057text := getDialogText()
2058if (text == "")
2059return -1
2060lines := StrSplit(text, "`n")
2061return lines
2062}
2063isDialogButton1Selected() {
2064dwPointer := getDialogStructPtr()
2065if (ErrorLevel || !dwPointer)
2066return false
2067dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_PTR1_OFFSET)
2068if (ErrorLevel) {
2069ErrorLevel := ERROR_READ_MEMORY
2070return false
2071}
2072selected := readMem(hGTA, dwPointer + SAMP_DIALOG_BUTTON_HOVERING_OFFSET, 1, "Byte")
2073if (ErrorLevel) {
2074ErrorLevel := ERROR_READ_MEMORY
2075return false
2076}
2077ErrorLevel := ERROR_OK
2078return selected
2079}
2080getDialogLines__() {
2081count := getDialogLineCount()
2082dwPointer := getDialogStructPtr()
2083if (ErrorLevel || !dwPointer)
2084return -1
2085dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_PTR1_OFFSET)
2086if (ErrorLevel) {
2087ErrorLevel := ERROR_READ_MEMORY
2088return -1
2089}
2090dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_LINES_OFFSET)
2091if (ErrorLevel) {
2092ErrorLevel := ERROR_READ_MEMORY
2093return -1
2094}
2095lines := []
2096Loop %count% {
2097dwLineAddress := readDWORD(hGTA, dwPointer + (A_Index - 1) * 0x4)
2098lines[A_Index] := readString(hGTA, dwLineAddress, 128)
2099}
2100ErrorLevel := ERROR_OK
2101return lines
2102}
2103showDialog(style, caption, text, button1, button2 := "", id := 1) {
2104style += 0
2105style := Floor(style)
2106id += 0
2107id := Floor(id)
2108caption := "" caption
2109text := "" text
2110button1 := "" button1
2111button2 := "" button2
2112if (id < 0 || id > 32767 || style < 0 || style > 5 || StrLen(caption) > 64 || StrLen(text) > 4096 || StrLen(button1) > 10 || StrLen(button2) > 10)
2113return false
2114if (!checkHandles())
2115return false
2116dwFunc := dwSAMP + FUNC_SAMP_SHOWDIALOG
2117dwAddress := readDWORD(hGTA, dwSAMP + SAMP_DIALOG_STRUCT_PTR)
2118if (ErrorLevel || !dwAddress) {
2119ErrorLevel := ERROR_READ_MEMORY
2120return false
2121}
2122writeString(hGTA, pParam5, caption)
2123if (ErrorLevel)
2124return false
2125writeString(hGTA, pParam1, text)
2126if (ErrorLevel)
2127return false
2128writeString(hGTA, pParam5 + 512, button1)
2129if (ErrorLevel)
2130return false
2131writeString(hGTA, pParam5+StrLen(caption) + 1, button2)
2132if (ErrorLevel)
2133return false
2134dwLen := 5 + 7 * 5 + 5 + 1
2135VarSetCapacity(injectData, dwLen, 0)
2136NumPut(0xB9, injectData, 0, "UChar")
2137NumPut(dwAddress, injectData, 1, "UInt")
2138NumPut(0x68, injectData, 5, "UChar")
2139NumPut(1, injectData, 6, "UInt")
2140NumPut(0x68, injectData, 10, "UChar")
2141NumPut(pParam5 + StrLen(caption) + 1, injectData, 11, "UInt")
2142NumPut(0x68, injectData, 15, "UChar")
2143NumPut(pParam5 + 512, injectData, 16, "UInt")
2144NumPut(0x68, injectData, 20, "UChar")
2145NumPut(pParam1, injectData, 21, "UInt")
2146NumPut(0x68, injectData, 25, "UChar")
2147NumPut(pParam5, injectData, 26, "UInt")
2148NumPut(0x68, injectData, 30, "UChar")
2149NumPut(style, injectData, 31, "UInt")
2150NumPut(0x68, injectData, 35, "UChar")
2151NumPut(id, injectData, 36, "UInt")
2152NumPut(0xE8, injectData, 40, "UChar")
2153offset := dwFunc - (pInjectFunc + 45)
2154NumPut(offset, injectData, 41, "Int")
2155NumPut(0xC3, injectData, 45, "UChar")
2156writeRaw(hGTA, pInjectFunc, &injectData, dwLen)
2157if (ErrorLevel)
2158return false
2159hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
2160if (ErrorLevel)
2161return false
2162waitForSingleObject(hThread, 0xFFFFFFFF)
2163closeProcess(hThread)
2164return true
2165}
2166initZonesAndCities() {
2167AddCity("Las Venturas", 685.0, 476.093, -500.0, 3000.0, 3000.0, 500.0)
2168AddCity("San Fierro", -3000.0, -742.306, -500.0, -1270.53, 1530.24, 500.0)
2169AddCity("San Fierro", -1270.53, -402.481, -500.0, -1038.45, 832.495, 500.0)
2170AddCity("San Fierro", -1038.45, -145.539, -500.0, -897.546, 376.632, 500.0)
2171AddCity("Los Santos", 480.0, -3000.0, -500.0, 3000.0, -850.0, 500.0)
2172AddCity("Los Santos", 80.0, -2101.61, -500.0, 1075.0, -1239.61, 500.0)
2173AddCity("Tierra Robada", -1213.91, 596.349, -242.99, -480.539, 1659.68, 900.0)
2174AddCity("Red County", -1213.91, -768.027, -242.99, 2997.06, 596.349, 900.0)
2175AddCity("Flint County", -1213.91, -2892.97, -242.99, 44.6147, -768.027, 900.0)
2176AddCity("Whetstone", -2997.47, -2892.97, -242.99, -1213.91, -1115.58, 900.0)
2177AddZone("Avispa Country Club", -2667.810, -302.135, -28.831, -2646.400, -262.320, 71.169)
2178AddZone("Easter Bay Airport", -1315.420, -405.388, 15.406, -1264.400, -209.543, 25.406)
2179AddZone("Avispa Country Club", -2550.040, -355.493, 0.000, -2470.040, -318.493, 39.700)
2180AddZone("Easter Bay Airport", -1490.330, -209.543, 15.406, -1264.400, -148.388, 25.406)
2181AddZone("Garcia", -2395.140, -222.589, -5.3, -2354.090, -204.792, 200.000)
2182AddZone("Shady Cabin", -1632.830, -2263.440, -3.0, -1601.330, -2231.790, 200.000)
2183AddZone("East Los Santos", 2381.680, -1494.030, -89.084, 2421.030, -1454.350, 110.916)
2184AddZone("LVA Freight Depot", 1236.630, 1163.410, -89.084, 1277.050, 1203.280, 110.916)
2185AddZone("Blackfield Intersection", 1277.050, 1044.690, -89.084, 1315.350, 1087.630, 110.916)
2186AddZone("Avispa Country Club", -2470.040, -355.493, 0.000, -2270.040, -318.493, 46.100)
2187AddZone("Temple", 1252.330, -926.999, -89.084, 1357.000, -910.170, 110.916)
2188AddZone("Unity Station", 1692.620, -1971.800, -20.492, 1812.620, -1932.800, 79.508)
2189AddZone("LVA Freight Depot", 1315.350, 1044.690, -89.084, 1375.600, 1087.630, 110.916)
2190AddZone("Los Flores", 2581.730, -1454.350, -89.084, 2632.830, -1393.420, 110.916)
2191AddZone("Starfish Casino", 2437.390, 1858.100, -39.084, 2495.090, 1970.850, 60.916)
2192AddZone("Easter Bay Chemicals", -1132.820, -787.391, 0.000, -956.476, -768.027, 200.000)
2193AddZone("Downtown Los Santos", 1370.850, -1170.870, -89.084, 1463.900, -1130.850, 110.916)
2194AddZone("Esplanade East", -1620.300, 1176.520, -4.5, -1580.010, 1274.260, 200.000)
2195AddZone("Market Station", 787.461, -1410.930, -34.126, 866.009, -1310.210, 65.874)
2196AddZone("Linden Station", 2811.250, 1229.590, -39.594, 2861.250, 1407.590, 60.406)
2197AddZone("Montgomery Intersection", 1582.440, 347.457, 0.000, 1664.620, 401.750, 200.000)
2198AddZone("Frederick Bridge", 2759.250, 296.501, 0.000, 2774.250, 594.757, 200.000)
2199AddZone("Yellow Bell Station", 1377.480, 2600.430, -21.926, 1492.450, 2687.360, 78.074)
2200AddZone("Downtown Los Santos", 1507.510, -1385.210, 110.916, 1582.550, -1325.310, 335.916)
2201AddZone("Jefferson", 2185.330, -1210.740, -89.084, 2281.450, -1154.590, 110.916)
2202AddZone("Mulholland", 1318.130, -910.170, -89.084, 1357.000, -768.027, 110.916)
2203AddZone("Avispa Country Club", -2361.510, -417.199, 0.000, -2270.040, -355.493, 200.000)
2204AddZone("Jefferson", 1996.910, -1449.670, -89.084, 2056.860, -1350.720, 110.916)
2205AddZone("Julius Thruway West", 1236.630, 2142.860, -89.084, 1297.470, 2243.230, 110.916)
2206AddZone("Jefferson", 2124.660, -1494.030, -89.084, 2266.210, -1449.670, 110.916)
2207AddZone("Julius Thruway North", 1848.400, 2478.490, -89.084, 1938.800, 2553.490, 110.916)
2208AddZone("Rodeo", 422.680, -1570.200, -89.084, 466.223, -1406.050, 110.916)
2209AddZone("Cranberry Station", -2007.830, 56.306, 0.000, -1922.000, 224.782, 100.000)
2210AddZone("Downtown Los Santos", 1391.050, -1026.330, -89.084, 1463.900, -926.999, 110.916)
2211AddZone("Redsands West", 1704.590, 2243.230, -89.084, 1777.390, 2342.830, 110.916)
2212AddZone("Little Mexico", 1758.900, -1722.260, -89.084, 1812.620, -1577.590, 110.916)
2213AddZone("Blackfield Intersection", 1375.600, 823.228, -89.084, 1457.390, 919.447, 110.916)
2214AddZone("Los Santos International", 1974.630, -2394.330, -39.084, 2089.000, -2256.590, 60.916)
2215AddZone("Beacon Hill", -399.633, -1075.520, -1.489, -319.033, -977.516, 198.511)
2216AddZone("Rodeo", 334.503, -1501.950, -89.084, 422.680, -1406.050, 110.916)
2217AddZone("Richman", 225.165, -1369.620, -89.084, 334.503, -1292.070, 110.916)
2218AddZone("Downtown Los Santos", 1724.760, -1250.900, -89.084, 1812.620, -1150.870, 110.916)
2219AddZone("The Strip", 2027.400, 1703.230, -89.084, 2137.400, 1783.230, 110.916)
2220AddZone("Downtown Los Santos", 1378.330, -1130.850, -89.084, 1463.900, -1026.330, 110.916)
2221AddZone("Blackfield Intersection", 1197.390, 1044.690, -89.084, 1277.050, 1163.390, 110.916)
2222AddZone("Conference Center", 1073.220, -1842.270, -89.084, 1323.900, -1804.210, 110.916)
2223AddZone("Montgomery", 1451.400, 347.457, -6.1, 1582.440, 420.802, 200.000)
2224AddZone("Foster Valley", -2270.040, -430.276, -1.2, -2178.690, -324.114, 200.000)
2225AddZone("Blackfield Chapel", 1325.600, 596.349, -89.084, 1375.600, 795.010, 110.916)
2226AddZone("Los Santos International", 2051.630, -2597.260, -39.084, 2152.450, -2394.330, 60.916)
2227AddZone("Mulholland", 1096.470, -910.170, -89.084, 1169.130, -768.027, 110.916)
2228AddZone("Yellow Bell Gol Course", 1457.460, 2723.230, -89.084, 1534.560, 2863.230, 110.916)
2229AddZone("The Strip", 2027.400, 1783.230, -89.084, 2162.390, 1863.230, 110.916)
2230AddZone("Jefferson", 2056.860, -1210.740, -89.084, 2185.330, -1126.320, 110.916)
2231AddZone("Mulholland", 952.604, -937.184, -89.084, 1096.470, -860.619, 110.916)
2232AddZone("Aldea Malvada", -1372.140, 2498.520, 0.000, -1277.590, 2615.350, 200.000)
2233AddZone("Las Colinas", 2126.860, -1126.320, -89.084, 2185.330, -934.489, 110.916)
2234AddZone("Las Colinas", 1994.330, -1100.820, -89.084, 2056.860, -920.815, 110.916)
2235AddZone("Richman", 647.557, -954.662, -89.084, 768.694, -860.619, 110.916)
2236AddZone("LVA Freight Depot", 1277.050, 1087.630, -89.084, 1375.600, 1203.280, 110.916)
2237AddZone("Julius Thruway North", 1377.390, 2433.230, -89.084, 1534.560, 2507.230, 110.916)
2238AddZone("Willowfield", 2201.820, -2095.000, -89.084, 2324.000, -1989.900, 110.916)
2239AddZone("Julius Thruway North", 1704.590, 2342.830, -89.084, 1848.400, 2433.230, 110.916)
2240AddZone("Temple", 1252.330, -1130.850, -89.084, 1378.330, -1026.330, 110.916)
2241AddZone("Little Mexico", 1701.900, -1842.270, -89.084, 1812.620, -1722.260, 110.916)
2242AddZone("Queens", -2411.220, 373.539, 0.000, -2253.540, 458.411, 200.000)
2243AddZone("Las Venturas Airport", 1515.810, 1586.400, -12.500, 1729.950, 1714.560, 87.500)
2244AddZone("Richman", 225.165, -1292.070, -89.084, 466.223, -1235.070, 110.916)
2245AddZone("Temple", 1252.330, -1026.330, -89.084, 1391.050, -926.999, 110.916)
2246AddZone("East Los Santos", 2266.260, -1494.030, -89.084, 2381.680, -1372.040, 110.916)
2247AddZone("Julius Thruway East", 2623.180, 943.235, -89.084, 2749.900, 1055.960, 110.916)
2248AddZone("Willowfield", 2541.700, -1941.400, -89.084, 2703.580, -1852.870, 110.916)
2249AddZone("Las Colinas", 2056.860, -1126.320, -89.084, 2126.860, -920.815, 110.916)
2250AddZone("Julius Thruway East", 2625.160, 2202.760, -89.084, 2685.160, 2442.550, 110.916)
2251AddZone("Rodeo", 225.165, -1501.950, -89.084, 334.503, -1369.620, 110.916)
2252AddZone("Las Brujas", -365.167, 2123.010, -3.0, -208.570, 2217.680, 200.000)
2253AddZone("Julius Thruway East", 2536.430, 2442.550, -89.084, 2685.160, 2542.550, 110.916)
2254AddZone("Rodeo", 334.503, -1406.050, -89.084, 466.223, -1292.070, 110.916)
2255AddZone("Vinewood", 647.557, -1227.280, -89.084, 787.461, -1118.280, 110.916)
2256AddZone("Rodeo", 422.680, -1684.650, -89.084, 558.099, -1570.200, 110.916)
2257AddZone("Julius Thruway North", 2498.210, 2542.550, -89.084, 2685.160, 2626.550, 110.916)
2258AddZone("Downtown Los Santos", 1724.760, -1430.870, -89.084, 1812.620, -1250.900, 110.916)
2259AddZone("Rodeo", 225.165, -1684.650, -89.084, 312.803, -1501.950, 110.916)
2260AddZone("Jefferson", 2056.860, -1449.670, -89.084, 2266.210, -1372.040, 110.916)
2261AddZone("Hampton Barns", 603.035, 264.312, 0.000, 761.994, 366.572, 200.000)
2262AddZone("Temple", 1096.470, -1130.840, -89.084, 1252.330, -1026.330, 110.916)
2263AddZone("Kincaid Bridge", -1087.930, 855.370, -89.084, -961.950, 986.281, 110.916)
2264AddZone("Verona Beach", 1046.150, -1722.260, -89.084, 1161.520, -1577.590, 110.916)
2265AddZone("Commerce", 1323.900, -1722.260, -89.084, 1440.900, -1577.590, 110.916)
2266AddZone("Mulholland", 1357.000, -926.999, -89.084, 1463.900, -768.027, 110.916)
2267AddZone("Rodeo", 466.223, -1570.200, -89.084, 558.099, -1385.070, 110.916)
2268AddZone("Mulholland", 911.802, -860.619, -89.084, 1096.470, -768.027, 110.916)
2269AddZone("Mulholland", 768.694, -954.662, -89.084, 952.604, -860.619, 110.916)
2270AddZone("Julius Thruway South", 2377.390, 788.894, -89.084, 2537.390, 897.901, 110.916)
2271AddZone("Idlewood", 1812.620, -1852.870, -89.084, 1971.660, -1742.310, 110.916)
2272AddZone("Ocean Docks", 2089.000, -2394.330, -89.084, 2201.820, -2235.840, 110.916)
2273AddZone("Commerce", 1370.850, -1577.590, -89.084, 1463.900, -1384.950, 110.916)
2274AddZone("Julius Thruway North", 2121.400, 2508.230, -89.084, 2237.400, 2663.170, 110.916)
2275AddZone("Temple", 1096.470, -1026.330, -89.084, 1252.330, -910.170, 110.916)
2276AddZone("Glen Park", 1812.620, -1449.670, -89.084, 1996.910, -1350.720, 110.916)
2277AddZone("Easter Bay Airport", -1242.980, -50.096, 0.000, -1213.910, 578.396, 200.000)
2278AddZone("Martin Bridge", -222.179, 293.324, 0.000, -122.126, 476.465, 200.000)
2279AddZone("The Strip", 2106.700, 1863.230, -89.084, 2162.390, 2202.760, 110.916)
2280AddZone("Willowfield", 2541.700, -2059.230, -89.084, 2703.580, -1941.400, 110.916)
2281AddZone("Marina", 807.922, -1577.590, -89.084, 926.922, -1416.250, 110.916)
2282AddZone("Las Venturas Airport", 1457.370, 1143.210, -89.084, 1777.400, 1203.280, 110.916)
2283AddZone("Idlewood", 1812.620, -1742.310, -89.084, 1951.660, -1602.310, 110.916)
2284AddZone("Esplanade East", -1580.010, 1025.980, -6.1, -1499.890, 1274.260, 200.000)
2285AddZone("Downtown Los Santos", 1370.850, -1384.950, -89.084, 1463.900, -1170.870, 110.916)
2286AddZone("The Mako Span", 1664.620, 401.750, 0.000, 1785.140, 567.203, 200.000)
2287AddZone("Rodeo", 312.803, -1684.650, -89.084, 422.680, -1501.950, 110.916)
2288AddZone("Pershing Square", 1440.900, -1722.260, -89.084, 1583.500, -1577.590, 110.916)
2289AddZone("Mulholland", 687.802, -860.619, -89.084, 911.802, -768.027, 110.916)
2290AddZone("Gant Bridge", -2741.070, 1490.470, -6.1, -2616.400, 1659.680, 200.000)
2291AddZone("Las Colinas", 2185.330, -1154.590, -89.084, 2281.450, -934.489, 110.916)
2292AddZone("Mulholland", 1169.130, -910.170, -89.084, 1318.130, -768.027, 110.916)
2293AddZone("Julius Thruway North", 1938.800, 2508.230, -89.084, 2121.400, 2624.230, 110.916)
2294AddZone("Commerce", 1667.960, -1577.590, -89.084, 1812.620, -1430.870, 110.916)
2295AddZone("Rodeo", 72.648, -1544.170, -89.084, 225.165, -1404.970, 110.916)
2296AddZone("Roca Escalante", 2536.430, 2202.760, -89.084, 2625.160, 2442.550, 110.916)
2297AddZone("Rodeo", 72.648, -1684.650, -89.084, 225.165, -1544.170, 110.916)
2298AddZone("Market", 952.663, -1310.210, -89.084, 1072.660, -1130.850, 110.916)
2299AddZone("Las Colinas", 2632.740, -1135.040, -89.084, 2747.740, -945.035, 110.916)
2300AddZone("Mulholland", 861.085, -674.885, -89.084, 1156.550, -600.896, 110.916)
2301AddZone("King's", -2253.540, 373.539, -9.1, -1993.280, 458.411, 200.000)
2302AddZone("Redsands East", 1848.400, 2342.830, -89.084, 2011.940, 2478.490, 110.916)
2303AddZone("Downtown", -1580.010, 744.267, -6.1, -1499.890, 1025.980, 200.000)
2304AddZone("Conference Center", 1046.150, -1804.210, -89.084, 1323.900, -1722.260, 110.916)
2305AddZone("Richman", 647.557, -1118.280, -89.084, 787.461, -954.662, 110.916)
2306AddZone("Ocean Flats", -2994.490, 277.411, -9.1, -2867.850, 458.411, 200.000)
2307AddZone("Greenglass College", 964.391, 930.890, -89.084, 1166.530, 1044.690, 110.916)
2308AddZone("Glen Park", 1812.620, -1100.820, -89.084, 1994.330, -973.380, 110.916)
2309AddZone("LVA Freight Depot", 1375.600, 919.447, -89.084, 1457.370, 1203.280, 110.916)
2310AddZone("Regular Tom", -405.770, 1712.860, -3.0, -276.719, 1892.750, 200.000)
2311AddZone("Verona Beach", 1161.520, -1722.260, -89.084, 1323.900, -1577.590, 110.916)
2312AddZone("East Los Santos", 2281.450, -1372.040, -89.084, 2381.680, -1135.040, 110.916)
2313AddZone("Caligula's Palace", 2137.400, 1703.230, -89.084, 2437.390, 1783.230, 110.916)
2314AddZone("Idlewood", 1951.660, -1742.310, -89.084, 2124.660, -1602.310, 110.916)
2315AddZone("Pilgrim", 2624.400, 1383.230, -89.084, 2685.160, 1783.230, 110.916)
2316AddZone("Idlewood", 2124.660, -1742.310, -89.084, 2222.560, -1494.030, 110.916)
2317AddZone("Queens", -2533.040, 458.411, 0.000, -2329.310, 578.396, 200.000)
2318AddZone("Downtown", -1871.720, 1176.420, -4.5, -1620.300, 1274.260, 200.000)
2319AddZone("Commerce", 1583.500, -1722.260, -89.084, 1758.900, -1577.590, 110.916)
2320AddZone("East Los Santos", 2381.680, -1454.350, -89.084, 2462.130, -1135.040, 110.916)
2321AddZone("Marina", 647.712, -1577.590, -89.084, 807.922, -1416.250, 110.916)
2322AddZone("Richman", 72.648, -1404.970, -89.084, 225.165, -1235.070, 110.916)
2323AddZone("Vinewood", 647.712, -1416.250, -89.084, 787.461, -1227.280, 110.916)
2324AddZone("East Los Santos", 2222.560, -1628.530, -89.084, 2421.030, -1494.030, 110.916)
2325AddZone("Rodeo", 558.099, -1684.650, -89.084, 647.522, -1384.930, 110.916)
2326AddZone("Easter Tunnel", -1709.710, -833.034, -1.5, -1446.010, -730.118, 200.000)
2327AddZone("Rodeo", 466.223, -1385.070, -89.084, 647.522, -1235.070, 110.916)
2328AddZone("Redsands East", 1817.390, 2202.760, -89.084, 2011.940, 2342.830, 110.916)
2329AddZone("The Clown's Pocket", 2162.390, 1783.230, -89.084, 2437.390, 1883.230, 110.916)
2330AddZone("Idlewood", 1971.660, -1852.870, -89.084, 2222.560, -1742.310, 110.916)
2331AddZone("Montgomery Intersection", 1546.650, 208.164, 0.000, 1745.830, 347.457, 200.000)
2332AddZone("Willowfield", 2089.000, -2235.840, -89.084, 2201.820, -1989.900, 110.916)
2333AddZone("Temple", 952.663, -1130.840, -89.084, 1096.470, -937.184, 110.916)
2334AddZone("Prickle Pine", 1848.400, 2553.490, -89.084, 1938.800, 2863.230, 110.916)
2335AddZone("Los Santos International", 1400.970, -2669.260, -39.084, 2189.820, -2597.260, 60.916)
2336AddZone("Garver Bridge", -1213.910, 950.022, -89.084, -1087.930, 1178.930, 110.916)
2337AddZone("Garver Bridge", -1339.890, 828.129, -89.084, -1213.910, 1057.040, 110.916)
2338AddZone("Kincaid Bridge", -1339.890, 599.218, -89.084, -1213.910, 828.129, 110.916)
2339AddZone("Kincaid Bridge", -1213.910, 721.111, -89.084, -1087.930, 950.022, 110.916)
2340AddZone("Verona Beach", 930.221, -2006.780, -89.084, 1073.220, -1804.210, 110.916)
2341AddZone("Verdant Bluffs", 1073.220, -2006.780, -89.084, 1249.620, -1842.270, 110.916)
2342AddZone("Vinewood", 787.461, -1130.840, -89.084, 952.604, -954.662, 110.916)
2343AddZone("Vinewood", 787.461, -1310.210, -89.084, 952.663, -1130.840, 110.916)
2344AddZone("Commerce", 1463.900, -1577.590, -89.084, 1667.960, -1430.870, 110.916)
2345AddZone("Market", 787.461, -1416.250, -89.084, 1072.660, -1310.210, 110.916)
2346AddZone("Rockshore West", 2377.390, 596.349, -89.084, 2537.390, 788.894, 110.916)
2347AddZone("Julius Thruway North", 2237.400, 2542.550, -89.084, 2498.210, 2663.170, 110.916)
2348AddZone("East Beach", 2632.830, -1668.130, -89.084, 2747.740, -1393.420, 110.916)
2349AddZone("Fallow Bridge", 434.341, 366.572, 0.000, 603.035, 555.680, 200.000)
2350AddZone("Willowfield", 2089.000, -1989.900, -89.084, 2324.000, -1852.870, 110.916)
2351AddZone("Chinatown", -2274.170, 578.396, -7.6, -2078.670, 744.170, 200.000)
2352AddZone("El Castillo del Diablo", -208.570, 2337.180, 0.000, 8.430, 2487.180, 200.000)
2353AddZone("Ocean Docks", 2324.000, -2145.100, -89.084, 2703.580, -2059.230, 110.916)
2354AddZone("Easter Bay Chemicals", -1132.820, -768.027, 0.000, -956.476, -578.118, 200.000)
2355AddZone("The Visage", 1817.390, 1703.230, -89.084, 2027.400, 1863.230, 110.916)
2356AddZone("Ocean Flats", -2994.490, -430.276, -1.2, -2831.890, -222.589, 200.000)
2357AddZone("Richman", 321.356, -860.619, -89.084, 687.802, -768.027, 110.916)
2358AddZone("Green Palms", 176.581, 1305.450, -3.0, 338.658, 1520.720, 200.000)
2359AddZone("Richman", 321.356, -768.027, -89.084, 700.794, -674.885, 110.916)
2360AddZone("Starfish Casino", 2162.390, 1883.230, -89.084, 2437.390, 2012.180, 110.916)
2361AddZone("East Beach", 2747.740, -1668.130, -89.084, 2959.350, -1498.620, 110.916)
2362AddZone("Jefferson", 2056.860, -1372.040, -89.084, 2281.450, -1210.740, 110.916)
2363AddZone("Downtown Los Santos", 1463.900, -1290.870, -89.084, 1724.760, -1150.870, 110.916)
2364AddZone("Downtown Los Santos", 1463.900, -1430.870, -89.084, 1724.760, -1290.870, 110.916)
2365AddZone("Garver Bridge", -1499.890, 696.442, -179.615, -1339.890, 925.353, 20.385)
2366AddZone("Julius Thruway South", 1457.390, 823.228, -89.084, 2377.390, 863.229, 110.916)
2367AddZone("East Los Santos", 2421.030, -1628.530, -89.084, 2632.830, -1454.350, 110.916)
2368AddZone("Greenglass College", 964.391, 1044.690, -89.084, 1197.390, 1203.220, 110.916)
2369AddZone("Las Colinas", 2747.740, -1120.040, -89.084, 2959.350, -945.035, 110.916)
2370AddZone("Mulholland", 737.573, -768.027, -89.084, 1142.290, -674.885, 110.916)
2371AddZone("Ocean Docks", 2201.820, -2730.880, -89.084, 2324.000, -2418.330, 110.916)
2372AddZone("East Los Santos", 2462.130, -1454.350, -89.084, 2581.730, -1135.040, 110.916)
2373AddZone("Ganton", 2222.560, -1722.330, -89.084, 2632.830, -1628.530, 110.916)
2374AddZone("Avispa Country Club", -2831.890, -430.276, -6.1, -2646.400, -222.589, 200.000)
2375AddZone("Willowfield", 1970.620, -2179.250, -89.084, 2089.000, -1852.870, 110.916)
2376AddZone("Esplanade North", -1982.320, 1274.260, -4.5, -1524.240, 1358.900, 200.000)
2377AddZone("The High Roller", 1817.390, 1283.230, -89.084, 2027.390, 1469.230, 110.916)
2378AddZone("Ocean Docks", 2201.820, -2418.330, -89.084, 2324.000, -2095.000, 110.916)
2379AddZone("Last Dime Motel", 1823.080, 596.349, -89.084, 1997.220, 823.228, 110.916)
2380AddZone("Bayside Marina", -2353.170, 2275.790, 0.000, -2153.170, 2475.790, 200.000)
2381AddZone("King's", -2329.310, 458.411, -7.6, -1993.280, 578.396, 200.000)
2382AddZone("El Corona", 1692.620, -2179.250, -89.084, 1812.620, -1842.270, 110.916)
2383AddZone("Blackfield Chapel", 1375.600, 596.349, -89.084, 1558.090, 823.228, 110.916)
2384AddZone("The Pink Swan", 1817.390, 1083.230, -89.084, 2027.390, 1283.230, 110.916)
2385AddZone("Julius Thruway West", 1197.390, 1163.390, -89.084, 1236.630, 2243.230, 110.916)
2386AddZone("Los Flores", 2581.730, -1393.420, -89.084, 2747.740, -1135.040, 110.916)
2387AddZone("The Visage", 1817.390, 1863.230, -89.084, 2106.700, 2011.830, 110.916)
2388AddZone("Prickle Pine", 1938.800, 2624.230, -89.084, 2121.400, 2861.550, 110.916)
2389AddZone("Verona Beach", 851.449, -1804.210, -89.084, 1046.150, -1577.590, 110.916)
2390AddZone("Robada Intersection", -1119.010, 1178.930, -89.084, -862.025, 1351.450, 110.916)
2391AddZone("Linden Side", 2749.900, 943.235, -89.084, 2923.390, 1198.990, 110.916)
2392AddZone("Ocean Docks", 2703.580, -2302.330, -89.084, 2959.350, -2126.900, 110.916)
2393AddZone("Willowfield", 2324.000, -2059.230, -89.084, 2541.700, -1852.870, 110.916)
2394AddZone("King's", -2411.220, 265.243, -9.1, -1993.280, 373.539, 200.000)
2395AddZone("Commerce", 1323.900, -1842.270, -89.084, 1701.900, -1722.260, 110.916)
2396AddZone("Mulholland", 1269.130, -768.027, -89.084, 1414.070, -452.425, 110.916)
2397AddZone("Marina", 647.712, -1804.210, -89.084, 851.449, -1577.590, 110.916)
2398AddZone("Battery Point", -2741.070, 1268.410, -4.5, -2533.040, 1490.470, 200.000)
2399AddZone("The Four Dragons Casino", 1817.390, 863.232, -89.084, 2027.390, 1083.230, 110.916)
2400AddZone("Blackfield", 964.391, 1203.220, -89.084, 1197.390, 1403.220, 110.916)
2401AddZone("Julius Thruway North", 1534.560, 2433.230, -89.084, 1848.400, 2583.230, 110.916)
2402AddZone("Yellow Bell Gol Course", 1117.400, 2723.230, -89.084, 1457.460, 2863.230, 110.916)
2403AddZone("Idlewood", 1812.620, -1602.310, -89.084, 2124.660, -1449.670, 110.916)
2404AddZone("Redsands West", 1297.470, 2142.860, -89.084, 1777.390, 2243.230, 110.916)
2405AddZone("Doherty", -2270.040, -324.114, -1.2, -1794.920, -222.589, 200.000)
2406AddZone("Hilltop Farm", 967.383, -450.390, -3.0, 1176.780, -217.900, 200.000)
2407AddZone("Las Barrancas", -926.130, 1398.730, -3.0, -719.234, 1634.690, 200.000)
2408AddZone("Pirates in Men's Pants", 1817.390, 1469.230, -89.084, 2027.400, 1703.230, 110.916)
2409AddZone("City Hall", -2867.850, 277.411, -9.1, -2593.440, 458.411, 200.000)
2410AddZone("Avispa Country Club", -2646.400, -355.493, 0.000, -2270.040, -222.589, 200.000)
2411AddZone("The Strip", 2027.400, 863.229, -89.084, 2087.390, 1703.230, 110.916)
2412AddZone("Hashbury", -2593.440, -222.589, -1.0, -2411.220, 54.722, 200.000)
2413AddZone("Los Santos International", 1852.000, -2394.330, -89.084, 2089.000, -2179.250, 110.916)
2414AddZone("Whitewood Estates", 1098.310, 1726.220, -89.084, 1197.390, 2243.230, 110.916)
2415AddZone("Sherman Reservoir", -789.737, 1659.680, -89.084, -599.505, 1929.410, 110.916)
2416AddZone("El Corona", 1812.620, -2179.250, -89.084, 1970.620, -1852.870, 110.916)
2417AddZone("Downtown", -1700.010, 744.267, -6.1, -1580.010, 1176.520, 200.000)
2418AddZone("Foster Valley", -2178.690, -1250.970, 0.000, -1794.920, -1115.580, 200.000)
2419AddZone("Las Payasadas", -354.332, 2580.360, 2.0, -133.625, 2816.820, 200.000)
2420AddZone("Valle Ocultado", -936.668, 2611.440, 2.0, -715.961, 2847.900, 200.000)
2421AddZone("Blackfield Intersection", 1166.530, 795.010, -89.084, 1375.600, 1044.690, 110.916)
2422AddZone("Ganton", 2222.560, -1852.870, -89.084, 2632.830, -1722.330, 110.916)
2423AddZone("Easter Bay Airport", -1213.910, -730.118, 0.000, -1132.820, -50.096, 200.000)
2424AddZone("Redsands East", 1817.390, 2011.830, -89.084, 2106.700, 2202.760, 110.916)
2425AddZone("Esplanade East", -1499.890, 578.396, -79.615, -1339.890, 1274.260, 20.385)
2426AddZone("Caligula's Palace", 2087.390, 1543.230, -89.084, 2437.390, 1703.230, 110.916)
2427AddZone("Royal Casino", 2087.390, 1383.230, -89.084, 2437.390, 1543.230, 110.916)
2428AddZone("Richman", 72.648, -1235.070, -89.084, 321.356, -1008.150, 110.916)
2429AddZone("Starfish Casino", 2437.390, 1783.230, -89.084, 2685.160, 2012.180, 110.916)
2430AddZone("Mulholland", 1281.130, -452.425, -89.084, 1641.130, -290.913, 110.916)
2431AddZone("Downtown", -1982.320, 744.170, -6.1, -1871.720, 1274.260, 200.000)
2432AddZone("Hankypanky Point", 2576.920, 62.158, 0.000, 2759.250, 385.503, 200.000)
2433AddZone("K.A.C.C. Military Fuels", 2498.210, 2626.550, -89.084, 2749.900, 2861.550, 110.916)
2434AddZone("Harry Gold Parkway", 1777.390, 863.232, -89.084, 1817.390, 2342.830, 110.916)
2435AddZone("Bayside Tunnel", -2290.190, 2548.290, -89.084, -1950.190, 2723.290, 110.916)
2436AddZone("Ocean Docks", 2324.000, -2302.330, -89.084, 2703.580, -2145.100, 110.916)
2437AddZone("Richman", 321.356, -1044.070, -89.084, 647.557, -860.619, 110.916)
2438AddZone("Randolph Industrial Estate", 1558.090, 596.349, -89.084, 1823.080, 823.235, 110.916)
2439AddZone("East Beach", 2632.830, -1852.870, -89.084, 2959.350, -1668.130, 110.916)
2440AddZone("Flint Water", -314.426, -753.874, -89.084, -106.339, -463.073, 110.916)
2441AddZone("Blueberry", 19.607, -404.136, 3.8, 349.607, -220.137, 200.000)
2442AddZone("Linden Station", 2749.900, 1198.990, -89.084, 2923.390, 1548.990, 110.916)
2443AddZone("Glen Park", 1812.620, -1350.720, -89.084, 2056.860, -1100.820, 110.916)
2444AddZone("Downtown", -1993.280, 265.243, -9.1, -1794.920, 578.396, 200.000)
2445AddZone("Redsands West", 1377.390, 2243.230, -89.084, 1704.590, 2433.230, 110.916)
2446AddZone("Richman", 321.356, -1235.070, -89.084, 647.522, -1044.070, 110.916)
2447AddZone("Gant Bridge", -2741.450, 1659.680, -6.1, -2616.400, 2175.150, 200.000)
2448AddZone("Lil' Probe Inn", -90.218, 1286.850, -3.0, 153.859, 1554.120, 200.000)
2449AddZone("Flint Intersection", -187.700, -1596.760, -89.084, 17.063, -1276.600, 110.916)
2450AddZone("Las Colinas", 2281.450, -1135.040, -89.084, 2632.740, -945.035, 110.916)
2451AddZone("Sobell Rail Yards", 2749.900, 1548.990, -89.084, 2923.390, 1937.250, 110.916)
2452AddZone("The Emerald Isle", 2011.940, 2202.760, -89.084, 2237.400, 2508.230, 110.916)
2453AddZone("El Castillo del Diablo", -208.570, 2123.010, -7.6, 114.033, 2337.180, 200.000)
2454AddZone("Santa Flora", -2741.070, 458.411, -7.6, -2533.040, 793.411, 200.000)
2455AddZone("Playa del Seville", 2703.580, -2126.900, -89.084, 2959.350, -1852.870, 110.916)
2456AddZone("Market", 926.922, -1577.590, -89.084, 1370.850, -1416.250, 110.916)
2457AddZone("Queens", -2593.440, 54.722, 0.000, -2411.220, 458.411, 200.000)
2458AddZone("Pilson Intersection", 1098.390, 2243.230, -89.084, 1377.390, 2507.230, 110.916)
2459AddZone("Spinybed", 2121.400, 2663.170, -89.084, 2498.210, 2861.550, 110.916)
2460AddZone("Pilgrim", 2437.390, 1383.230, -89.084, 2624.400, 1783.230, 110.916)
2461AddZone("Blackfield", 964.391, 1403.220, -89.084, 1197.390, 1726.220, 110.916)
2462AddZone("'The Big Ear'", -410.020, 1403.340, -3.0, -137.969, 1681.230, 200.000)
2463AddZone("Dillimore", 580.794, -674.885, -9.5, 861.085, -404.790, 200.000)
2464AddZone("El Quebrados", -1645.230, 2498.520, 0.000, -1372.140, 2777.850, 200.000)
2465AddZone("Esplanade North", -2533.040, 1358.900, -4.5, -1996.660, 1501.210, 200.000)
2466AddZone("Easter Bay Airport", -1499.890, -50.096, -1.0, -1242.980, 249.904, 200.000)
2467AddZone("Fisher's Lagoon", 1916.990, -233.323, -100.000, 2131.720, 13.800, 200.000)
2468AddZone("Mulholland", 1414.070, -768.027, -89.084, 1667.610, -452.425, 110.916)
2469AddZone("East Beach", 2747.740, -1498.620, -89.084, 2959.350, -1120.040, 110.916)
2470AddZone("San Andreas Sound", 2450.390, 385.503, -100.000, 2759.250, 562.349, 200.000)
2471AddZone("Shady Creeks", -2030.120, -2174.890, -6.1, -1820.640, -1771.660, 200.000)
2472AddZone("Market", 1072.660, -1416.250, -89.084, 1370.850, -1130.850, 110.916)
2473AddZone("Rockshore West", 1997.220, 596.349, -89.084, 2377.390, 823.228, 110.916)
2474AddZone("Prickle Pine", 1534.560, 2583.230, -89.084, 1848.400, 2863.230, 110.916)
2475AddZone("Easter Basin", -1794.920, -50.096, -1.04, -1499.890, 249.904, 200.000)
2476AddZone("Leafy Hollow", -1166.970, -1856.030, 0.000, -815.624, -1602.070, 200.000)
2477AddZone("LVA Freight Depot", 1457.390, 863.229, -89.084, 1777.400, 1143.210, 110.916)
2478AddZone("Prickle Pine", 1117.400, 2507.230, -89.084, 1534.560, 2723.230, 110.916)
2479AddZone("Blueberry", 104.534, -220.137, 2.3, 349.607, 152.236, 200.000)
2480AddZone("El Castillo del Diablo", -464.515, 2217.680, 0.000, -208.570, 2580.360, 200.000)
2481AddZone("Downtown", -2078.670, 578.396, -7.6, -1499.890, 744.267, 200.000)
2482AddZone("Rockshore East", 2537.390, 676.549, -89.084, 2902.350, 943.235, 110.916)
2483AddZone("San Fierro Bay", -2616.400, 1501.210, -3.0, -1996.660, 1659.680, 200.000)
2484AddZone("Paradiso", -2741.070, 793.411, -6.1, -2533.040, 1268.410, 200.000)
2485AddZone("The Camel's Toe", 2087.390, 1203.230, -89.084, 2640.400, 1383.230, 110.916)
2486AddZone("Old Venturas Strip", 2162.390, 2012.180, -89.084, 2685.160, 2202.760, 110.916)
2487AddZone("Juniper Hill", -2533.040, 578.396, -7.6, -2274.170, 968.369, 200.000)
2488AddZone("Juniper Hollow", -2533.040, 968.369, -6.1, -2274.170, 1358.900, 200.000)
2489AddZone("Roca Escalante", 2237.400, 2202.760, -89.084, 2536.430, 2542.550, 110.916)
2490AddZone("Julius Thruway East", 2685.160, 1055.960, -89.084, 2749.900, 2626.550, 110.916)
2491AddZone("Verona Beach", 647.712, -2173.290, -89.084, 930.221, -1804.210, 110.916)
2492AddZone("Foster Valley", -2178.690, -599.884, -1.2, -1794.920, -324.114, 200.000)
2493AddZone("Arco del Oeste", -901.129, 2221.860, 0.000, -592.090, 2571.970, 200.000)
2494AddZone("Fallen Tree", -792.254, -698.555, -5.3, -452.404, -380.043, 200.000)
2495AddZone("The Farm", -1209.670, -1317.100, 114.981, -908.161, -787.391, 251.981)
2496AddZone("The Sherman Dam", -968.772, 1929.410, -3.0, -481.126, 2155.260, 200.000)
2497AddZone("Esplanade North", -1996.660, 1358.900, -4.5, -1524.240, 1592.510, 200.000)
2498AddZone("Financial", -1871.720, 744.170, -6.1, -1701.300, 1176.420, 300.000)
2499AddZone("Garcia", -2411.220, -222.589, -1.14, -2173.040, 265.243, 200.000)
2500AddZone("Montgomery", 1119.510, 119.526, -3.0, 1451.400, 493.323, 200.000)
2501AddZone("Creek", 2749.900, 1937.250, -89.084, 2921.620, 2669.790, 110.916)
2502AddZone("Los Santos International", 1249.620, -2394.330, -89.084, 1852.000, -2179.250, 110.916)
2503AddZone("Santa Maria Beach", 72.648, -2173.290, -89.084, 342.648, -1684.650, 110.916)
2504AddZone("Mulholland Intersection", 1463.900, -1150.870, -89.084, 1812.620, -768.027, 110.916)
2505AddZone("Angel Pine", -2324.940, -2584.290, -6.1, -1964.220, -2212.110, 200.000)
2506AddZone("Verdant Meadows", 37.032, 2337.180, -3.0, 435.988, 2677.900, 200.000)
2507AddZone("Octane Springs", 338.658, 1228.510, 0.000, 664.308, 1655.050, 200.000)
2508AddZone("Come-A-Lot", 2087.390, 943.235, -89.084, 2623.180, 1203.230, 110.916)
2509AddZone("Redsands West", 1236.630, 1883.110, -89.084, 1777.390, 2142.860, 110.916)
2510AddZone("Santa Maria Beach", 342.648, -2173.290, -89.084, 647.712, -1684.650, 110.916)
2511AddZone("Verdant Bluffs", 1249.620, -2179.250, -89.084, 1692.620, -1842.270, 110.916)
2512AddZone("Las Venturas Airport", 1236.630, 1203.280, -89.084, 1457.370, 1883.110, 110.916)
2513AddZone("Flint Range", -594.191, -1648.550, 0.000, -187.700, -1276.600, 200.000)
2514AddZone("Verdant Bluffs", 930.221, -2488.420, -89.084, 1249.620, -2006.780, 110.916)
2515AddZone("Palomino Creek", 2160.220, -149.004, 0.000, 2576.920, 228.322, 200.000)
2516AddZone("Ocean Docks", 2373.770, -2697.090, -89.084, 2809.220, -2330.460, 110.916)
2517AddZone("Easter Bay Airport", -1213.910, -50.096, -4.5, -947.980, 578.396, 200.000)
2518AddZone("Whitewood Estates", 883.308, 1726.220, -89.084, 1098.310, 2507.230, 110.916)
2519AddZone("Calton Heights", -2274.170, 744.170, -6.1, -1982.320, 1358.900, 200.000)
2520AddZone("Easter Basin", -1794.920, 249.904, -9.1, -1242.980, 578.396, 200.000)
2521AddZone("Los Santos Inlet", -321.744, -2224.430, -89.084, 44.615, -1724.430, 110.916)
2522AddZone("Doherty", -2173.040, -222.589, -1.0, -1794.920, 265.243, 200.000)
2523AddZone("Mount Chiliad", -2178.690, -2189.910, -47.917, -2030.120, -1771.660, 576.083)
2524AddZone("Fort Carson", -376.233, 826.326, -3.0, 123.717, 1220.440, 200.000)
2525AddZone("Foster Valley", -2178.690, -1115.580, 0.000, -1794.920, -599.884, 200.000)
2526AddZone("Ocean Flats", -2994.490, -222.589, -1.0, -2593.440, 277.411, 200.000)
2527AddZone("Fern Ridge", 508.189, -139.259, 0.000, 1306.660, 119.526, 200.000)
2528AddZone("Bayside", -2741.070, 2175.150, 0.000, -2353.170, 2722.790, 200.000)
2529AddZone("Las Venturas Airport", 1457.370, 1203.280, -89.084, 1777.390, 1883.110, 110.916)
2530AddZone("Blueberry Acres", -319.676, -220.137, 0.000, 104.534, 293.324, 200.000)
2531AddZone("Palisades", -2994.490, 458.411, -6.1, -2741.070, 1339.610, 200.000)
2532AddZone("North Rock", 2285.370, -768.027, 0.000, 2770.590, -269.740, 200.000)
2533AddZone("Hunter Quarry", 337.244, 710.840, -115.239, 860.554, 1031.710, 203.761)
2534AddZone("Los Santos International", 1382.730, -2730.880, -89.084, 2201.820, -2394.330, 110.916)
2535AddZone("Missionary Hill", -2994.490, -811.276, 0.000, -2178.690, -430.276, 200.000)
2536AddZone("San Fierro Bay", -2616.400, 1659.680, -3.0, -1996.660, 2175.150, 200.000)
2537AddZone("Restricted Area", -91.586, 1655.050, -50.000, 421.234, 2123.010, 250.000)
2538AddZone("Mount Chiliad", -2997.470, -1115.580, -47.917, -2178.690, -971.913, 576.083)
2539AddZone("Mount Chiliad", -2178.690, -1771.660, -47.917, -1936.120, -1250.970, 576.083)
2540AddZone("Easter Bay Airport", -1794.920, -730.118, -3.0, -1213.910, -50.096, 200.000)
2541AddZone("The Panopticon", -947.980, -304.320, -1.1, -319.676, 327.071, 200.000)
2542AddZone("Shady Creeks", -1820.640, -2643.680, -8.0, -1226.780, -1771.660, 200.000)
2543AddZone("Back o Beyond", -1166.970, -2641.190, 0.000, -321.744, -1856.030, 200.000)
2544AddZone("Mount Chiliad", -2994.490, -2189.910, -47.917, -2178.690, -1115.580, 576.083)
2545AddZone("Tierra Robada", -1213.910, 596.349, -242.990, -480.539, 1659.680, 900.000)
2546AddZone("Flint County", -1213.910, -2892.970, -242.990, 44.615, -768.027, 900.000)
2547AddZone("Whetstone", -2997.470, -2892.970, -242.990, -1213.910, -1115.580, 900.000)
2548AddZone("Bone County", -480.539, 596.349, -242.990, 869.461, 2993.870, 900.000)
2549AddZone("Tierra Robada", -2997.470, 1659.680, -242.990, -480.539, 2993.870, 900.000)
2550AddZone("San Fierro", -2997.470, -1115.580, -242.990, -1213.910, 1659.680, 900.000)
2551AddZone("Las Venturas", 869.461, 596.349, -242.990, 2997.060, 2993.870, 900.000)
2552AddZone("Red County", -1213.910, -768.027, -242.990, 2997.060, 596.349, 900.000)
2553AddZone("Los Santos", 44.615, -2892.970, -242.990, 2997.060, -768.027, 900.000)
2554}
2555calculateZone(posX, posY, posZ) {
2556if ( bInitZaC == 0 )
2557{
2558initZonesAndCities()
2559bInitZaC := 1
2560}
2561Loop % nZone-1
2562{
2563if (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)
2564{
2565ErrorLevel := ERROR_OK
2566return zone%A_Index%_name
2567}
2568}
2569ErrorLevel := ERROR_ZONE_NOT_FOUND
2570return "Unbekannt"
2571}
2572calculateCity(posX, posY, posZ) {
2573if ( bInitZaC == 0 )
2574{
2575initZonesAndCities()
2576bInitZaC := 1
2577}
2578smallestCity := "Unbekannt"
2579currentCitySize := 0
2580smallestCitySize := 0
2581Loop % nCity-1
2582{
2583if (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)
2584{
2585currentCitySize := ((city%A_Index%_x2 - city%A_Index%_x1) * (city%A_Index%_y2 - city%A_Index%_y1) * (city%A_Index%_z2 - city%A_Index%_z1))
2586if (smallestCity == "Unbekannt") || (currentCitySize < smallestCitySize)
2587{
2588smallestCity := city%A_Index%_name
2589smallestCitySize := currentCitySize
2590}
2591}
2592}
2593if(smallestCity == "Unbekannt") {
2594ErrorLevel := ERROR_CITY_NOT_FOUND
2595} else {
2596ErrorLevel := ERROR_OK
2597}
2598return smallestCity
2599}
2600AddZone(sName, x1, y1, z1, x2, y2, z2) {
2601global
2602zone%nZone%_name := sName
2603zone%nZone%_x1 := x1
2604zone%nZone%_y1 := y1
2605zone%nZone%_z1 := z1
2606zone%nZone%_x2 := x2
2607zone%nZone%_y2 := y2
2608zone%nZone%_z2 := z2
2609nZone := nZone + 1
2610}
2611AddCity(sName, x1, y1, z1, x2, y2, z2) {
2612global
2613city%nCity%_name := sName
2614city%nCity%_x1 := x1
2615city%nCity%_y1 := y1
2616city%nCity%_z1 := z1
2617city%nCity%_x2 := x2
2618city%nCity%_y2 := y2
2619city%nCity%_z2 := z2
2620nCity := nCity + 1
2621}
2622IsPlayerInRangeOfPoint(_posX, _posY, _posZ, _posRadius)
2623{
2624GetPlayerPos(posX, posY, posZ)
2625X := posX -_posX
2626Y := posY -_posY
2627Z := posZ -_posZ
2628if(((X < _posRadius) && (X > -_posRadius)) && ((Y < _posRadius) && (Y > -_posRadius)) && ((Z < _posRadius) && (Z > -_posRadius)))
2629return TRUE
2630return FALSE
2631}
2632IsPlayerInRangeOfPoint2D(_posX, _posY, _posRadius)
2633{
2634GetPlayerPos(posX, posY, posZ)
2635X := posX - _posX
2636Y := posY - _posY
2637if(((X < _posRadius) && (X > -_posRadius)) && ((Y < _posRadius) && (Y > -_posRadius)))
2638return TRUE
2639return FALSE
2640}
2641getPlayerZone()
2642{
2643aktPos := getCoordinates()
2644return calculateZone(aktPos[1], aktPos[2], aktPos[3])
2645}
2646getPlayerCity()
2647{
2648aktPos := getCoordinates()
2649return calculateCity(aktPos[1], aktPos[2], aktPos[3])
2650}
2651AntiCrash(){
2652If(!checkHandles())
2653return false
2654cReport := ADDR_SAMP_CRASHREPORT
2655writeMemory(hGTA, dwSAMP + cReport, 0x90909090, 4)
2656cReport += 0x4
2657writeMemory(hGTA, dwSAMP + cReport, 0x90, 1)
2658cReport += 0x9
2659writeMemory(hGTA, dwSAMP + cReport, 0x90909090, 4)
2660cReport += 0x4
2661writeMemory(hGTA, dwSAMP + cReport, 0x90, 1)
2662}
2663writeMemory(hProcess,address,writevalue,length=4, datatype="int") {
2664if(!hProcess) {
2665ErrorLevel := ERROR_INVALID_HANDLE
2666return false
2667}
2668VarSetCapacity(finalvalue,length, 0)
2669NumPut(writevalue,finalvalue,0,datatype)
2670dwRet := DllCall( "WriteProcessMemory"
2671,"Uint",hProcess
2672,"Uint",address
2673,"Uint",&finalvalue
2674,"Uint",length
2675,"Uint",0)
2676if(dwRet == 0) {
2677ErrorLevel := ERROR_WRITE_MEMORY
2678return false
2679}
2680ErrorLevel := ERROR_OK
2681return true
2682}
2683checkHandles() {
2684if(iRefreshHandles+500>A_TickCount)
2685return true
2686iRefreshHandles:=A_TickCount
2687if(!refreshGTA() || !refreshSAMP() || !refreshMemory()) {
2688return false
2689} else {
2690return true
2691}
2692return true
2693}
2694refreshGTA() {
2695newPID := getPID("GTA:SA:MP")
2696if(!newPID) {
2697if(hGTA) {
2698virtualFreeEx(hGTA, pMemory, 0, 0x8000)
2699closeProcess(hGTA)
2700hGTA := 0x0
2701}
2702dwGTAPID := 0
2703hGTA := 0x0
2704dwSAMP := 0x0
2705pMemory := 0x0
2706return false
2707}
2708if(!hGTA || (dwGTAPID != newPID)) {
2709hGTA := openProcess(newPID)
2710if(ErrorLevel) {
2711dwGTAPID := 0
2712hGTA := 0x0
2713dwSAMP := 0x0
2714pMemory := 0x0
2715return false
2716}
2717dwGTAPID := newPID
2718dwSAMP := 0x0
2719pMemory := 0x0
2720return true
2721}
2722return true
2723}
2724refreshSAMP() {
2725if(dwSAMP)
2726return true
2727dwSAMP := getModuleBaseAddress("samp.dll", hGTA)
2728if(!dwSAMP)
2729return false
2730return true
2731}
2732refreshMemory() {
2733if(!pMemory) {
2734pMemory := virtualAllocEx(hGTA, 6144, 0x1000 | 0x2000, 0x40)
2735if(ErrorLevel) {
2736pMemory := 0x0
2737return false
2738}
2739pParam1 := pMemory
2740pParam2 := pMemory + 1024
2741pParam3 := pMemory + 2048
2742pParam4 := pMemory + 3072
2743pParam5 := pMemory + 4096
2744pInjectFunc := pMemory + 5120
2745}
2746return true
2747}
2748getPID(szWindow) {
2749local dwPID := 0
2750WinGet, dwPID, PID, %szWindow%
2751return dwPID
2752}
2753openProcess(dwPID, dwRights = 0x1F0FFF) {
2754hProcess := DllCall("OpenProcess"
2755, "UInt", dwRights
2756, "int", 0
2757, "UInt", dwPID
2758, "Uint")
2759if(hProcess == 0) {
2760ErrorLevel := ERROR_OPEN_PROCESS
2761return 0
2762}
2763ErrorLevel := ERROR_OK
2764return hProcess
2765}
2766closeProcess(hProcess) {
2767if(hProcess == 0) {
2768ErrorLevel := ERROR_INVALID_HANDLE
2769return 0
2770}
2771dwRet := DllCall( "CloseHandle"
2772, "Uint", hProcess
2773, "UInt")
2774ErrorLevel := ERROR_OK
2775}
2776getModuleBaseAddress(sModule, hProcess) {
2777if(!sModule) {
2778ErrorLevel := ERROR_MODULE_NOT_FOUND
2779return 0
2780}
2781if(!hProcess) {
2782ErrorLevel := ERROR_INVALID_HANDLE
2783return 0
2784}
2785dwSize = 1024*4
2786VarSetCapacity(hMods, dwSize)
2787VarSetCapacity(cbNeeded, 4)
2788dwRet := DllCall( "Psapi.dll\EnumProcessModules"
2789, "UInt", hProcess
2790, "UInt", &hMods
2791, "UInt", dwSize
2792, "UInt*", cbNeeded
2793, "UInt")
2794if(dwRet == 0) {
2795ErrorLevel := ERROR_ENUM_PROCESS_MODULES
2796return 0
2797}
2798dwMods := cbNeeded / 4
2799i := 0
2800VarSetCapacity(hModule, 4)
2801VarSetCapacity(sCurModule, 260)
2802while(i < dwMods) {
2803hModule := NumGet(hMods, i*4)
2804DllCall("Psapi.dll\GetModuleFileNameEx"
2805, "UInt", hProcess
2806, "UInt", hModule
2807, "Str", sCurModule
2808, "UInt", 260)
2809SplitPath, sCurModule, sFilename
2810if(sModule == sFilename) {
2811ErrorLevel := ERROR_OK
2812return hModule
2813}
2814i := i + 1
2815}
2816ErrorLevel := ERROR_MODULE_NOT_FOUND
2817return 0
2818}
2819readString(hProcess, dwAddress, dwLen) {
2820if(!hProcess) {
2821ErrorLevel := ERROR_INVALID_HANDLE
2822return 0
2823}
2824VarSetCapacity(sRead, dwLen)
2825dwRet := DllCall( "ReadProcessMemory"
2826, "UInt", hProcess
2827, "UInt", dwAddress
2828, "Str", sRead
2829, "UInt", dwLen
2830, "UInt*", 0
2831, "UInt")
2832if(dwRet == 0) {
2833ErrorLevel := ERROR_READ_MEMORY
2834return 0
2835}
2836ErrorLevel := ERROR_OK
2837if A_IsUnicode
2838return __ansiToUnicode(sRead)
2839return sRead
2840}
2841readFloat(hProcess, dwAddress) {
2842if(!hProcess) {
2843ErrorLevel := ERROR_INVALID_HANDLE
2844return 0
2845}
2846VarSetCapacity(dwRead, 4)
2847dwRet := DllCall( "ReadProcessMemory"
2848, "UInt", hProcess
2849, "UInt", dwAddress
2850, "Str", dwRead
2851, "UInt", 4
2852, "UInt*", 0
2853, "UInt")
2854if(dwRet == 0) {
2855ErrorLevel := ERROR_READ_MEMORY
2856return 0
2857}
2858ErrorLevel := ERROR_OK
2859return NumGet(dwRead, 0, "Float")
2860}
2861readDWORD(hProcess, dwAddress) {
2862if(!hProcess) {
2863ErrorLevel := ERROR_INVALID_HANDLE
2864return 0
2865}
2866VarSetCapacity(dwRead, 4)
2867dwRet := DllCall( "ReadProcessMemory"
2868, "UInt", hProcess
2869, "UInt", dwAddress
2870, "Str", dwRead
2871, "UInt", 4
2872, "UInt*", 0)
2873if(dwRet == 0) {
2874ErrorLevel := ERROR_READ_MEMORY
2875return 0
2876}
2877ErrorLevel := ERROR_OK
2878return NumGet(dwRead, 0, "UInt")
2879}
2880readMem(hProcess, dwAddress, dwLen=4, type="UInt") {
2881if(!hProcess) {
2882ErrorLevel := ERROR_INVALID_HANDLE
2883return 0
2884}
2885VarSetCapacity(dwRead, dwLen)
2886dwRet := DllCall( "ReadProcessMemory"
2887, "UInt", hProcess
2888, "UInt", dwAddress
2889, "Str", dwRead
2890, "UInt", dwLen
2891, "UInt*", 0)
2892if(dwRet == 0) {
2893ErrorLevel := ERROR_READ_MEMORY
2894return 0
2895}
2896ErrorLevel := ERROR_OK
2897return NumGet(dwRead, 0, type)
2898}
2899writeString(hProcess, dwAddress, wString) {
2900if(!hProcess) {
2901ErrorLevel := ERROR_INVALID_HANDLE
2902return false
2903}
2904sString := wString
2905if A_IsUnicode
2906sString := __unicodeToAnsi(wString)
2907dwRet := DllCall( "WriteProcessMemory"
2908, "UInt", hProcess
2909, "UInt", dwAddress
2910, "Str", sString
2911, "UInt", StrLen(wString) + 1
2912, "UInt", 0
2913, "UInt")
2914if(dwRet == 0) {
2915ErrorLEvel := ERROR_WRITE_MEMORY
2916return false
2917}
2918ErrorLevel := ERROR_OK
2919return true
2920}
2921writeRaw(hProcess, dwAddress, pBuffer, dwLen) {
2922if(!hProcess) {
2923ErrorLevel := ERROR_INVALID_HANDLE
2924return false
2925}
2926dwRet := DllCall( "WriteProcessMemory"
2927, "UInt", hProcess
2928, "UInt", dwAddress
2929, "UInt", pBuffer
2930, "UInt", dwLen
2931, "UInt", 0
2932, "UInt")
2933if(dwRet == 0) {
2934ErrorLEvel := ERROR_WRITE_MEMORY
2935return false
2936}
2937ErrorLevel := ERROR_OK
2938return true
2939}
2940Memory_ReadByte(process_handle, address) {
2941VarSetCapacity(value, 1, 0)
2942DllCall("ReadProcessMemory", "UInt", process_handle, "UInt", address, "Str", value, "UInt", 1, "UInt *", 0)
2943return, NumGet(value, 0, "Byte")
2944}
2945callWithParams(hProcess, dwFunc, aParams, bCleanupStack = true) {
2946if(!hProcess) {
2947ErrorLevel := ERROR_INVALID_HANDLE
2948return false
2949}
2950validParams := 0
2951i := aParams.MaxIndex()
2952dwLen := i * 5 + 5 + 1
2953if(bCleanupStack)
2954dwLen += 3
2955VarSetCapacity(injectData, i * 5 + 5 + 3 + 1, 0)
2956i_ := 1
2957while(i > 0) {
2958if(aParams[i][1] != "") {
2959dwMemAddress := 0x0
2960if(aParams[i][1] == "p") {
2961dwMemAddress := aParams[i][2]
2962} else if(aParams[i][1] == "s") {
2963if(i_>3)
2964return false
2965dwMemAddress := pParam%i_%
2966writeString(hProcess, dwMemAddress, aParams[i][2])
2967if(ErrorLevel)
2968return false
2969i_ += 1
2970} else if(aParams[i][1] == "i") {
2971dwMemAddress := aParams[i][2]
2972} else {
2973return false
2974}
2975NumPut(0x68, injectData, validParams * 5, "UChar")
2976NumPut(dwMemAddress, injectData, validParams * 5 + 1, "UInt")
2977validParams += 1
2978}
2979i -= 1
2980}
2981offset := dwFunc - ( pInjectFunc + validParams * 5 + 5 )
2982NumPut(0xE8, injectData, validParams * 5, "UChar")
2983NumPut(offset, injectData, validParams * 5 + 1, "Int")
2984if(bCleanupStack) {
2985NumPut(0xC483, injectData, validParams * 5 + 5, "UShort")
2986NumPut(validParams*4, injectData, validParams * 5 + 7, "UChar")
2987NumPut(0xC3, injectData, validParams * 5 + 8, "UChar")
2988} else {
2989NumPut(0xC3, injectData, validParams * 5 + 5, "UChar")
2990}
2991writeRaw(hGTA, pInjectFunc, &injectData, dwLen)
2992if(ErrorLevel)
2993return false
2994hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
2995if(ErrorLevel)
2996return false
2997waitForSingleObject(hThread, 0xFFFFFFFF)
2998closeProcess(hThread)
2999return true
3000}
3001virtualAllocEx(hProcess, dwSize, flAllocationType, flProtect) {
3002if(!hProcess) {
3003ErrorLevel := ERROR_INVALID_HANDLE
3004return 0
3005}
3006dwRet := DllCall( "VirtualAllocEx"
3007, "UInt", hProcess
3008, "UInt", 0
3009, "UInt", dwSize
3010, "UInt", flAllocationType
3011, "UInt", flProtect
3012, "UInt")
3013if(dwRet == 0) {
3014ErrorLEvel := ERROR_ALLOC_MEMORY
3015return 0
3016}
3017ErrorLevel := ERROR_OK
3018return dwRet
3019}
3020virtualFreeEx(hProcess, lpAddress, dwSize, dwFreeType) {
3021if(!hProcess) {
3022ErrorLevel := ERROR_INVALID_HANDLE
3023return 0
3024}
3025dwRet := DllCall( "VirtualFreeEx"
3026, "UInt", hProcess
3027, "UInt", lpAddress
3028, "UInt", dwSize
3029, "UInt", dwFreeType
3030, "UInt")
3031if(dwRet == 0) {
3032ErrorLEvel := ERROR_FREE_MEMORY
3033return 0
3034}
3035ErrorLevel := ERROR_OK
3036return dwRet
3037}
3038createRemoteThread(hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId) {
3039if(!hProcess) {
3040ErrorLevel := ERROR_INVALID_HANDLE
3041return 0
3042}
3043dwRet := DllCall( "CreateRemoteThread"
3044, "UInt", hProcess
3045, "UInt", lpThreadAttributes
3046, "UInt", dwStackSize
3047, "UInt", lpStartAddress
3048, "UInt", lpParameter
3049, "UInt", dwCreationFlags
3050, "UInt", lpThreadId
3051, "UInt")
3052if(dwRet == 0) {
3053ErrorLEvel := ERROR_ALLOC_MEMORY
3054return 0
3055}
3056ErrorLevel := ERROR_OK
3057return dwRet
3058}
3059waitForSingleObject(hThread, dwMilliseconds) {
3060if(!hThread) {
3061ErrorLevel := ERROR_INVALID_HANDLE
3062return 0
3063}
3064dwRet := DllCall( "WaitForSingleObject"
3065, "UInt", hThread
3066, "UInt", dwMilliseconds
3067, "UInt")
3068if(dwRet == 0xFFFFFFFF) {
3069ErrorLEvel := ERROR_WAIT_FOR_OBJECT
3070return 0
3071}
3072ErrorLevel := ERROR_OK
3073return dwRet
3074}
3075__ansiToUnicode(sString, nLen = 0) {
3076If !nLen
3077{
3078nLen := DllCall("MultiByteToWideChar"
3079, "Uint", 0
3080, "Uint", 0
3081, "Uint", &sString
3082, "int", -1
3083, "Uint", 0
3084, "int", 0)
3085}
3086VarSetCapacity(wString, nLen * 2)
3087DllCall("MultiByteToWideChar"
3088, "Uint", 0
3089, "Uint", 0
3090, "Uint", &sString
3091, "int", -1
3092, "Uint", &wString
3093, "int", nLen)
3094return wString
3095}
3096__unicodeToAnsi(wString, nLen = 0) {
3097pString := wString + 1 > 65536 ? wString : &wString
3098If !nLen
3099{
3100nLen := DllCall("WideCharToMultiByte"
3101, "Uint", 0
3102, "Uint", 0
3103, "Uint", pString
3104, "int", -1
3105, "Uint", 0
3106, "int", 0
3107, "Uint", 0
3108, "Uint", 0)
3109}
3110VarSetCapacity(sString, nLen)
3111DllCall("WideCharToMultiByte"
3112, "Uint", 0
3113, "Uint", 0
3114, "Uint", pString
3115, "int", -1
3116, "str", sString
3117, "int", nLen
3118, "Uint", 0
3119, "Uint", 0)
3120return sString
3121}
3122global SAMP_MAX_VEHICLES := 2000
3123global SAMP_PPOOL_VEHICLE_OFFSET := 0x1C
3124global VEHPOOL_iVehicleCount := 0x0
3125global VEHPOOL_iIsListed := 0x3074
3126global VEHPOOL_pGTA_Vehicle := 0x4FB4
3127global iRefreshVeh := 0
3128global oVehiclePoolData := []
3129global iUpdateTickVeh := 1000
3130getVehicleID() {
3131if (!checkHandles())
3132return -1
3133vID := readMem(hGTA, readDWORD(hGTA, dwSAMP + 0x13C848) + 0x14, 2, "Short")
3134if (ErrorLevel || !vID || vID > 2000)
3135return -1
3136return vID
3137}
3138GetVehicleModelIDByVPed(dwvPed) {
3139checkHandles()
3140id := readMem(hGTA, dwvPed + 0x22, 2, "Short")
3141return id
3142}
3143getStreamedVehicles() {
3144if (!checkHandles())
3145return false
3146if (iRefreshVeh + iUpdateTickVeh > A_TickCount)
3147return true
3148oVehiclePoolData := []
3149iRefreshVeh := A_TickCount
3150dwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET)
3151dwAddress := readDWORD(hGTA, dwAddress + SAMP_PPOOLS_OFFSET)
3152stVehiclePool := readDWORD(hGTA, dwAddress + 0x1C)
3153vehicleoffset := 0
3154Loop, % SAMP_MAX_VEHICLES
3155{
3156index := A_Index - 1, vehicleoffset += 4
3157iIsListed := readDWORD(hGTA, stVehiclePool + VEHPOOL_iIsListed + index * 0x4)
3158if (iIsListed == 0)
3159continue
3160ptrGTAVeh := readDWORD(hGTA, stVehiclePool + VEHPOOL_pGTA_Vehicle + index * 0x4)
3161if (ptrGTAVeh == 0)
3162continue
3163dwDriver := readDWORD(hGTA, ptrGTAVeh + 1120)
3164occupied := dwDriver != 0 ? 1 : 0
3165GTACARid := GetVehicleModelIDByVPed(ptrGTAVeh)
3166sVehId := Round((vehicleoffset / 4) - 1)
3167if (GTACARid > 400 && GTACARid < 611)
3168oVehiclePoolData[index] := Object("PTR", ptrGTAVeh, "SAMPID", sVehId, "CARNAME", ovehicleNames[GTACARid - 399], "OCCUPIED", occupied)
3169}
3170return true
3171}
3172getVehiclePointer(wID) {
3173if (wID < 1 || wID > SAMP_MAX_VEHICLES || !checkHandles())
3174return false
3175var1 := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET)
3176var2 := readDWORD(hGTA, var1 + SAMP_PPOOLS_OFFSET)
3177stVehiclePool := readDWORD(hGTA, var2 + SAMP_PPOOL_VEHICLE_OFFSET)
3178if (stVehiclePool) {
3179var3 := readDWORD(hGTA, stVehiclePool + 0x4FB4 + wID * 0x4)
3180return var3
3181} else {
3182return false
3183}
3184}
3185getVehiclePos(dwVehPtr = 0xBA18FC) {
3186if (!checkHandles())
3187return false
3188if (dwVehPtr = ADDR_VEHICLE_PTR)
3189dwVehPtr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
3190dwAddress := readDWORD(hGTA, dwVehPtr + 0x14)
3191if (!dwAddress)
3192return false
3193fX := readFloat(hGTA, dwAddress + 0x30)
3194fY := readFloat(hGTA, dwAddress + 0x34)
3195fZ := readFloat(hGTA, dwAddress + 0x38)
3196vehicleID := readDWORD(hGTA, dwVehPtr + 0x22)
3197return [fX, fY, fZ, vehicleID]
3198}
3199getVehicleRot(dwVehPtr = 0xBA18FC) {
3200if (!checkHandles())
3201return false
3202if (dwVehPtr = ADDR_VEHICLE_PTR)
3203dwVehPtr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
3204dwAddress := readDWORD(hGTA, dwVehPtr + 0x14)
3205if (!dwAddress)
3206return false
3207rotX := readFloat(hGTA, dwAddress + 0x0)
3208rotY := readFloat(hGTA, dwAddress + 0x4)
3209rotZ := readFloat(hGTA, dwAddress + 0x8)
3210vehicleID := readDWORD(hGTA, dwVehPtr + 0x22)
3211return [rotX, rotY, rotZ, vehicleID]
3212}
3213getSeatIDs() {
3214if (!checkHandles())
3215return -1
3216dw := readDWORD(hGTA, 0xBA18FC)
3217if (dw) {
3218driver := readDWORD(hGTA, dw + 0x460)
3219psg1 := readDWORD(hGTA, dw + 0x464)
3220psg2 := readDWORD(hGTA, dw + 0x468)
3221psg3 := readDWORD(hGTA, dw + 0x46C)
3222psg4 := readDWORD(hGTA, dw + 0x470)
3223psg5 := readDWORD(hGTA, dw + 0x474)
3224psg6 := readDWORD(hGTA, dw + 0x478)
3225psg7 := readDWORD(hGTA, dw + 0x47C)
3226psg8 := readDWORD(hGTA, dw + 0x480)
3227psg9 := readDWORD(hGTA, dw + 0x484)
3228return [getIdByPed(driver), getIdByPed(psg1), getIdByPed(psg2), getIdByPed(psg3), getIdByPed(psg4), getIdByPed(psg5), getIdByPed(psg6), getIdByPed(psg7), getIdByPed(psg8), getIdByPed(psg9)]
3229} else {
3230addChatMessage2(PREFIX . "Du befindest dich nicht in einem Fahrzeug!")
3231}
3232}
3233GetVehicleColor_func := DllCall("GetProcAddress", UInt, hModule, Str, "API_GetVehicleColor")
3234GetVehicleColor(ByRef int_ColorFirst, ByRef int_ColorSecond) {
3235global GetVehicleColor_func
3236res := DllCall(GetVehicleColor_func, IntP, int_ColorFirst, IntP, int_ColorSecond)
3237return res
3238}
3239createTextLabel(sText, dwColor, fX, fY, fZ, fDrawDistance := 50.0, bTestLOS := 0, wPlayerID := 0xFFFF, wVehicleID := 0xFFFF) {
3240if (!checkHandles())
3241return -1
3242dwAddress := readDWORD(hGTA, readDWORD(hGTA, readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) + SAMP_PPOOLS_OFFSET) + 0xC)
3243Loop, 2048 {
3244wID := A_Index - 1
3245if (!readDWORD(hGTA, dwAddress + 0xE800 + wID * 4)) {
3246return callWithParams2(hGTA, dwSAMP + 0x11C0, [["i", dwAddress], ["i", wID], ["s", sText], ["i", dwColor], ["f", fX], ["f", fY], ["f", fZ]
3247, ["f", fDrawDistance], ["i", bTestLOS], ["i", wPlayerID], ["i", wVehicleID]], false, true) ? wID : -1
3248}
3249}
3250return -1
3251}
3252updateTextLabel(wID, sText, dwColor) {
3253if (wID < 0 || wID > 2047 || !checkHandles())
3254return false
3255dwAddress := readDWORD(hGTA, readDWORD(hGTA, readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) + SAMP_PPOOLS_OFFSET) + 0xC)
3256fX := readFloat(hGTA, dwAddress + wID * 0x1D + 0x8)
3257fY := readFloat(hGTA, dwAddress + wID * 0x1D + 0xC)
3258fZ := readFloat(hGTA, dwAddress + wID * 0x1D + 0x10)
3259fDrawDistance := readFloat(hGTA, dwAddress + wID * 0x1D + 0x14)
3260bTestLOS := readMem(hGTA, dwAddress + wID * 0x1D + 0x18, 1, "Byte")
3261wPlayerID := readMem(hGTA, dwAddress + wID * 0x1D + 0x19, 2, "UShort")
3262wVehicleID := readMem(hGTA, dwAddress + wID * 0x1D + 0x1B, 2, "UShort")
3263return callWithParams2(hGTA, dwSAMP + 0x11C0, [["i", dwAddress], ["i", wID], ["s", sText], ["i", dwColor], ["f", fX], ["f", fY], ["f", fZ], ["f", fDrawDistance]
3264, ["i", bTestLOS], ["i", wPlayerID], ["i", wVehicleID]], false, true)
3265}
3266deleteTextLabel(ByRef wID) {
3267if (!checkHandles())
3268return false
3269dwAddress := readDWORD(hGTA, readDWORD(hGTA, readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) + SAMP_PPOOLS_OFFSET) + 0xC)
3270if (callWithParams2(hGTA, dwSAMP + 0x12D0, [["i", dwAddress], ["i", wID]], false, true)) {
3271wID := -1
3272return true
3273}
3274return false
3275}
3276global SAMP_3DTEXT := 0x12C7BC
3277getLabelText() {
3278if (!checkHandles())
3279return -1
3280ADDR_3DText := readDWORD(hGTA, dwSAMP + SAMP_3DTEXT)
3281TEXT_3DTEXT := readString(hGTA, ADDR_3DText, 512)
3282return TEXT_3DTEXT
3283}
3284global iRefreshTL := 0
3285global oTextLabelData := ""
3286global iUpdateTickTL := 1000
3287updateTextLabelData() {
3288if (!checkHandles())
3289return 0
3290if (iRefreshTL+iUpdateTickTL > A_TickCount)
3291return 1
3292oTextLabelData := []
3293iRefreshTL := A_TickCount
3294dwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET)
3295if (ErrorLevel || dwAddress==0) {
3296ErrorLevel := ERROR_READ_MEMORY
3297return 0
3298}
3299dwAddress := readDWORD(hGTA, dwAddress + SAMP_PPOOLS_OFFSET)
3300if (ErrorLevel || dwAddress==0) {
3301ErrorLevel := ERROR_READ_MEMORY
3302return 0
3303}
3304dwTextLabels := readDWORD(hGTA, dwAddress + 12)
3305if (ErrorLevel || dwTextDraws==0) {
3306ErrorLevel := ERROR_READ_MEMORY
3307return 0
3308}
3309Loop, % 2048
3310{
3311i := A_Index-1
3312dwIsActive := readDWORD(hGTA, dwTextLabels + 59392 + i*4)
3313if (ErrorLevel) {
3314ErrorLevel := ERROR_READ_MEMORY
3315return 0
3316}
3317if (dwIsActive==0)
3318continue
3319dwAddr := readDWORD(hGTA, dwTextLabels + i*29)
3320if (ErrorLevel) {
3321ErrorLevel := ERROR_READ_MEMORY
3322return 0
3323}
3324if (dwAddr==0)
3325continue
3326sText := readString(hGTA, dwAddr, 256)
3327if (ErrorLevel) {
3328ErrorLevel := ERROR_READ_MEMORY
3329return 0
3330}
3331fX := readFloat(hGTA, dwTextLabels + i*29 +8)
3332if (ErrorLevel) {
3333ErrorLevel := ERROR_READ_MEMORY
3334return 0
3335}
3336fY := readFloat(hGTA, dwTextLabels + i*29 +12)
3337if (ErrorLevel) {
3338ErrorLevel := ERROR_READ_MEMORY
3339return 0
3340}
3341fZ := readFloat(hGTA, dwTextLabels + i*29 +16)
3342if (ErrorLevel) {
3343ErrorLevel := ERROR_READ_MEMORY
3344return 0
3345}
3346wPlayerID := readMem(hGTA, dwTextLabels + i * 0x1D + 0x19, 2, "UShort")
3347wVehicleID := readMem(hGTA, dwTextLabels + i * 0x1D + 0x1B, 2, "UShort")
3348oTextLabelData[i] := Object("TEXT", sText, "XPOS", fX , "YPOS", fY , "ZPOS", fZ, "PLAYERID", wPlayerID, "VEHICLEID", wVehicleID)
3349}
3350ErrorLevel := ERROR_OK
3351return 1
3352}
3353countLabels() {
3354if (!updateTextLabelData())
3355return -1
3356j := 0
3357For i, o in oTextLabelData
3358{
3359j += 1
3360}
3361return j
3362}
3363printLabels() {
3364if (!updateTextLabelData())
3365return
3366For i, o in oTextLabelData
3367{
3368addChatMessage2("ID: " . i . ", x:" . o.XPOS . ", y:" . o.YPOS . ", z:" . o.ZPOS . ", player: " . o.PLAYERID . ", vehicle: " . o.VEHICLEID)
3369addChatMessage2("{FFFFFF}" . o.TEXT)
3370}
3371}
3372createTextDraw(sString, fX, fY, dwLetterColor := 0xFFFFFFFF, bFont := 3, fLetterWidth := 0.4, fLetterHeight := 1, bShadowSize := 0, bOutline := 1
3373, dwShadowColor := 0xFF000000, bBox := 0, dwBoxColor := 0xFFFFFFFF, fBoxSizeX := 0.0, fBoxSizeY := 0.0, bLeft := 0, bRight := 0, bCenter := 1
3374, bProportional := 1, wModel := 0, fXRot := 0.0, fYRot := 0.0, fZRot := 0.0, fZoom := 1.0, wColor1 := 0xFFFF, wColor2 := 0xFFFF) {
3375if (StrLen(sString) > 800 || bFont > 5 || !checkHandles())
3376return -1
3377dwAddress := readDWORD(hGTA, readDWORD(hGTA, readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) + SAMP_PPOOLS_OFFSET) + 0x10)
3378Loop, 2048 {
3379wID := A_Index - 1
3380if (!readDWORD(hGTA, dwAddress + wID * 4)) {
3381VarSetCapacity(struct, 63, 0)
3382NumPut((bBox ? 1 : 0) + (bLeft ? 2 : 0) + (bRight ? 4 : 0) + (bCenter ? 8 : 0) + (bProportional ? 16 : 0), &struct, 0, "Byte")
3383NumPut(fLetterWidth, &struct, 1, "Float")
3384NumPut(fLetterHeight, &struct, 5, "Float")
3385NumPut(dwLetterColor, &struct, 9, "Int")
3386NumPut(fBoxSizeX, &struct, 0xD, "Float")
3387NumPut(fBoxSizeY, &struct, 0x11, "Float")
3388NumPut(dwBoxColor, &struct, 0x15, "Int")
3389NumPut(bShadowSize, &struct, 0x19, "Byte")
3390NumPut(bOutline, &struct, 0x1A, "Byte")
3391NumPut(dwShadowColor, &struct, 0x1B, "Int")
3392NumPut(bFont, &struct, 0x1F, "Byte")
3393NumPut(1, &struct, 0x20, "Byte")
3394NumPut(fX, &struct, 0x21, "Float")
3395NumPut(fY, &struct, 0x25, "Float")
3396NumPut(wModel, &struct, 0x29, "Short")
3397NumPut(fXRot, &struct, 0x2B, "Float")
3398NumPut(fYRot, &struct, 0x2F, "Float")
3399NumPut(fZRot, &struct, 0x33, "Float")
3400NumPut(fZoom, &struct, 0x37, "Float")
3401NumPut(wColor1, &struct, 0x3B, "Short")
3402NumPut(wColor2, &struct, 0x3D, "Short")
3403writeRaw(hGTA, pParam5, &struct, 63)
3404if (ErrorLevel)
3405return -1
3406return callWithParams2(hGTA, dwSAMP + 0x1AE20, [["i", dwAddress], ["i", wID], ["i", pParam5], ["s", sString]], false, true) ? wID : -1
3407}
3408}
3409return -1
3410}
3411moveTextDraw(wID, xPos, yPos) {
3412if (wID < 0 || wID > 2047 || !checkHandles())
3413return false
3414dwAddress := readDWORD(hGTA, readDWORD(hGTA, readDWORD(hGTA, readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) + SAMP_PPOOLS_OFFSET) + 0x10) + wID * 4 + (4 * (SAMP_MAX_PLAYERTEXTDRAWS + SAMP_MAX_TEXTDRAWS)))
3415return writeMemory(hGTA, dwAddress + 0x98B, xPos, 4, "Float") && writeMemory(hGTA, dwAddress + 0x98F, yPos, 4, "Float")
3416}
3417updateTextDraw(wID, sString) {
3418if (wID < 0 || wID > 2047 || StrLen(sString) > 800 || !checkHandles())
3419return false
3420dwAddress := readDWORD(hGTA, readDWORD(hGTA, readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) + SAMP_PPOOLS_OFFSET) + 0x10)
3421return writeString(hGTA, readDWORD(hGTA, dwAddress + wID * 4 + (4 * (SAMP_MAX_PLAYERTEXTDRAWS + SAMP_MAX_TEXTDRAWS))), sString)
3422}
3423deleteTextDraw(ByRef wID) {
3424if (wID < 0 || wID > 2047 || !checkHandles())
3425return false
3426dwAddress := readDWORD(hGTA, readDWORD(hGTA, readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) + SAMP_PPOOLS_OFFSET) + 0x10)
3427if (callWithParams2(hGTA, dwSAMP + 0x1AD00, [["i", dwAddress], ["i", wID]], false, true)) {
3428wID := -1
3429return true
3430}
3431return false
3432}
3433global TEXT_DRAW_POOL_OFFSET := 0x10
3434global SAMP_MAX_PLAYERTEXTDRAWS := 256
3435global SAMP_MAX_TEXTDRAWS := 2048
3436global iRefreshTD := 0
3437global iUpdateTickTD := 1000
3438global oTextDraws := []
3439updateTextDraws() {
3440if (!checkHandles())
3441return 0
3442if (iRefreshTD + iUpdateTickTD > A_TickCount)
3443return 1
3444oTextDraws := []
3445iRefreshTD := A_TickCount
3446dwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET)
3447if (ErrorLevel || !dwAddress) {
3448ErrorLevel := ERROR_READ_MEMORY
3449return 0
3450}
3451dwAddress := readDWORD(hGTA, dwAddress + SAMP_PPOOLS_OFFSET)
3452if (ErrorLevel || !dwAddress) {
3453ErrorLevel := ERROR_READ_MEMORY
3454return 0
3455}
3456dwTextDraw := readDWORD(hGTA, dwAddress + TEXT_DRAW_POOL_OFFSET)
3457if (ErrorLevel || !dwTextDraw) {
3458ErrorLevel := ERROR_READ_MEMORY
3459return 0
3460}
3461Loop, % SAMP_MAX_TEXTDRAWS
3462{
3463i := A_Index - 1
3464dwIsActive := readDWORD(hGTA, dwTextDraw + i * 4)
3465if (ErrorLevel) {
3466ErrorLevel := ERROR_READ_MEMORY
3467return 0
3468}
3469if (!dwIsActive)
3470continue
3471dwAddr := readDWORD(hGTA, dwTextDraw + i * 4 + (4 * (SAMP_MAX_PLAYERTEXTDRAWS + SAMP_MAX_TEXTDRAWS)))
3472if (ErrorLevel) {
3473ErrorLevel := ERROR_READ_MEMORY
3474return 0
3475}
3476if (!dwAddr)
3477continue
3478sText := readString(hGTA, dwAddr, 800)
3479if (ErrorLevel) {
3480ErrorLevel := ERROR_READ_MEMORY
3481return 0
3482}
3483oTextDraws[i] := sText
3484}
3485ErrorLevel := ERROR_OK
3486return 1
3487}
3488printTextDraws() {
3489if (!updateTextDraws())
3490return
3491oReplace := ["~s~", "~r~", "~w~", "~h~", "~g~", "~y~", "~n~", "~b~", " ", " "]
3492For i, o in oTextDraws
3493{
3494Loop % oReplace.MaxIndex() {
3495o := StrReplace(o, oReplace[A_Index], " ")
3496}
3497addChatMessage2(o)
3498}
3499return
3500}
3501getTextDrawBySubstring(substring) {
3502if (!updateTextDraws())
3503return
3504oReplace := ["~s~", "~r~", "~w~", "~h~", "~g~", "~y~", "~n~", "~b~", " ", " "]
3505For i, o in oTextDraws
3506{
3507if (!InStr(o, substring))
3508continue
3509Loop % oReplace.MaxIndex()
3510o := StrReplace(o, oReplace[A_Index], " ")
3511return o
3512}
3513}
3514restartGameEx() {
3515if (!checkHandles())
3516return -1
3517dwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET)
3518if (ErrorLevel || dwAddress==0) {
3519ErrorLevel := ERROR_READ_MEMORY
3520return -1
3521}
3522dwFunc := dwSAMP + 0xA060
3523VarSetCapacity(injectData, 11, 0)
3524NumPut(0xB9, injectData, 0, "UChar")
3525NumPut(dwAddress, injectData, 1, "UInt")
3526NumPut(0xE8, injectData, 5, "UChar")
3527offset := dwFunc - (pInjectFunc + 10)
3528NumPut(offset, injectData, 6, "Int")
3529NumPut(0xC3, injectData, 10, "UChar")
3530writeRaw(hGTA, pInjectFunc, &injectData, 11)
3531if (ErrorLevel)
3532return false
3533hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
3534if (ErrorLevel)
3535return false
3536waitForSingleObject(hThread, 0xFFFFFFFF)
3537return true
3538}
3539disconnectEx() {
3540if (!checkHandles())
3541return 0
3542dwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET)
3543if (ErrorLevel || dwAddress==0) {
3544ErrorLevel := ERROR_READ_MEMORY
3545return 0
3546}
3547dwAddress := readDWORD(hGTA, dwAddress + 0x3c9)
3548if (ErrorLevel || dwAddress==0) {
3549ErrorLevel := ERROR_READ_MEMORY
3550return 0
3551}
3552ecx := dwAddress
3553dwAddress := readDWORD(hGTA, dwAddress)
3554if (ErrorLevel || dwAddress==0) {
3555ErrorLevel := ERROR_READ_MEMORY
3556return 0
3557}
3558VarSetCapacity(injectData, 24, 0)
3559NumPut(0xB9, injectData, 0, "UChar")
3560NumPut(ecx, injectData, 1, "UInt")
3561NumPut(0xB8, injectData, 5, "UChar")
3562NumPut(dwAddress, injectData, 6, "UInt")
3563NumPut(0x68, injectData, 10, "UChar")
3564NumPut(0, injectData, 11, "UInt")
3565NumPut(0x68, injectData, 15, "UChar")
3566NumPut(500, injectData, 16, "UInt")
3567NumPut(0x50FF, injectData, 20, "UShort")
3568NumPut(0x08, injectData, 22, "UChar")
3569NumPut(0xC3, injectData, 23, "UChar")
3570writeRaw(hGTA, pInjectFunc, &injectData, 24)
3571if (ErrorLevel)
3572return false
3573hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
3574if (ErrorLevel)
3575return false
3576waitForSingleObject(hThread, 0xFFFFFFFF)
3577return true
3578}
3579setRestart() {
3580VarSetCapacity(old, 4, 0)
3581dwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET)
3582if (ErrorLevel || dwAddress==0) {
3583ErrorLevel := ERROR_READ_MEMORY
3584return 0
3585}
3586NumPut(9,old,0,"Int")
3587writeRaw(hGTA, dwAddress + 957, &old, 4)
3588}
3589restart() {
3590restartGameEx()
3591disconnectEx()
3592Sleep, 1000
3593setRestart()
3594}
3595addChatMessage2(text, color := 0xFFFFFFFF, timestamp := true) {
3596return !checkHandles() ? false : callWithParams2(hGTA, dwSAMP + 0x64010, [["i", readDWORD(hGTA, dwSAMP + ADDR_SAMP_CHATMSG_PTR)], ["i", timestamp ? 4 : 2]
3597, ["s", text], ["i", 0], ["i", color], ["i", 0]], false, true)
3598}
3599global SAMP_CHAT_OFF := 0x0152
3600global SAMP_CHAT_SIZE := 144
3601readChatLine(line, color = 0) {
3602if (!checkHandles())
3603return 0
3604dwPTR := readDWORD(hGTA, dwSAMP + ADDR_SAMP_CHATMSG_PTR)
3605chat := readString(hGTA, dwPTR + SAMP_CHAT_OFF + SIZE_SAMP_CHATMSG * (99 - line), SAMP_CHAT_SIZE)
3606if (!color)
3607chat := RegExReplace(chat, "\{[a-fA-F0-9]{6}\}")
3608return chat
3609}
3610setChatLine(line, text) {
3611if (!checkHandles())
3612return 0
3613dwPTR := readDWORD(hGTA, dwSAMP + ADDR_SAMP_CHATMSG_PTR)
3614result := writeString(hGTA, dwPTR + SAMP_CHAT_OFF + SIZE_SAMP_CHATMSG * (99 - line), text)
3615return result
3616}
3617getKills() {
3618if (!checkHandles()) {
3619return false
3620}
3621pedLocal := readDWORD(hGTA, 0xB6F5F0)
3622if (!pedLocal) {
3623return false
3624}
3625peds := getPeds()
3626if (!peds) {
3627return false
3628}
3629data := []
3630For index, object in peds {
3631state := readMem(hGTA, object.PED + 0x530, 4, "UInt")
3632if ((pedStates[object.PED] == 55 || pedStates[object.PED] == 54) == (state == 55 || state == 54)) {
3633Continue
3634}
3635pedStates[object.PED] := state
3636if (object.PED && !object.ISNPC && (state == 55 || state == 54)) {
3637pedMurderer := readDWORD(hGTA, object.PED + 0x764)
3638murderer := false
3639For index2, object2 in peds
3640{
3641if (object2.PED == pedMurderer) {
3642murderer := object2
3643Break
3644}
3645}
3646weapon := readMem(hGTA, object.PED + 0x760, 4, "UInt")
3647skin := readMem(hGTA, object.PED + 0x22, 2, "UShort")
3648if (!murderer)
3649data.Push({victim: object, weapon: weapon, skin: skin})
3650else
3651data.Push({victim: object, murderer: murderer, weapon: weapon, skin: skin})
3652}
3653}
3654return data
3655}
3656getPeds() {
3657if (!checkHandles()) {
3658return false
3659}
3660if (!updateScoreboardDataEx()) {
3661return false
3662}
3663dwAddress := readDWORD(hGTA, dwSAMP + 0x21A0F8)
3664dwAddress := readDWORD(hGTA, dwAddress + 0x3CD)
3665dwAddress := readDWORD(hGTA, dwAddress + 0x18)
3666data := []
3667wID := readMem(hGTA, dwAddress + 0x4, 2, "UShort")
3668dwPed := readDWORD(hGTA, 0xB6F5F0)
3669if (readDWORD(hGTA, dwAddress + 0x1A) <= 16) {
3670sName := readString(hGTA, dwAddress + 0xA, 16)
3671} else {
3672sName := readString(hGTA, readDWORD(hGTA, dwAddress + 0xA), 20)
3673}
3674data.Push({LOCAL: true, ID: wID, PED: dwPed, ISNPC: false, NAME: sName})
3675Loop % 1000
3676{
3677i := A_Index - 1
3678dwRemotePlayer := readDWORD(hGTA, dwAddress + 0x2E + i*4)
3679if (!dwRemotePlayer) {
3680Continue
3681}
3682dwRemotePlayerData := readDWORD(hGTA, dwRemotePlayer)
3683dwRemotePlayerData := readDWORD(hGTA, dwRemotePlayerData)
3684dwPed := readDWORD(hGTA, dwRemotePlayerData + 0x2A4)
3685if (!dwPed) {
3686Continue
3687}
3688dwIsNPC := readDWORD(hGTA, dwRemotePlayer + 0x4)
3689if (readMem(hGTA, dwRemotePlayer + 0x1C, 4, "Int") <= 16) {
3690sName := readString(hGTA, dwRemotePlayer + 0xC, 16)
3691} else {
3692sName := readString(hGTA, readDWORD(hGTA, dwRemotePlayer + 0xC), 20)
3693}
3694data.Push({LOCAL: false, ID: i, PED: dwPed, ISNPC: dwIsNPC, NAME: sName})
3695}
3696return data
3697}
3698global GAMETEXT_1 := 0xBAAD40
3699global GAMETEXT_2 := 0xBAADC0
3700global GAMETEXT_3 := 0xBAAE40
3701global GAMETEXT_4 := 0xBAAEC0
3702global GAMETEXT_5 := 0xBAABC0
3703getGameText(type = 1, length = 12) {
3704if (!checkHandles())
3705return ""
3706if (type == 1) {
3707text := readString(hGTA, GAMETEXT_1, length)
3708} else if (type == 2) {
3709text := readString(hGTA, GAMETEXT_2, length)
3710} else if (type == 3) {
3711text := readString(hGTA, GAMETEXT_3, length)
3712} else if (type == 4) {
3713text := readString(hGTA, GAMETEXT_4, length)
3714} else if (type == 5) {
3715text := readString(hGTA, GAMETEXT_5, length)
3716}
3717return text
3718}
3719instruction := 0
3720fpsUnlock() {
3721if (!checkHandles())
3722return 0
3723global instruction
3724instruction := readMem(hGTA, dwSAMP + 0x9D9D0, 4, "UInt")
3725return writeMemory(hGTA, dwSAMP + 0x9D9D0, 0x5051FF15, 4, "UChar")
3726}
3727fpsLock() {
3728if (!checkHandles())
3729return 0
3730global instruction
3731if (instruction) {
3732return writeMemory(hGTA, dwSAMP + 0x9D9D0, instruction, 4, "UInt")
3733} else {
3734return false
3735}
3736}
3737blockDialog() {
3738if (!checkHandles()) {
3739ErrorLevel := ERROR_INVALID_HANDLE
3740return false
3741}
3742VarSetCapacity(injectBytecode, 7, 0)
3743Loop, 7 {
3744NumPut(0x90, injectBytecode, A_Index - 1, "UChar")
3745}
3746return writeRaw(hGTA, dwSAMP + 0x6C014, &injectBytecode, 7)
3747}
3748unblockDialog() {
3749if (!checkHandles()) {
3750ErrorLevel := ERROR_INVALID_HANDLE
3751return false
3752}
3753bytecodes := [0xC7, 0x46, 0x28, 0x1, 0x0, 0x0, 0x0]
3754VarSetCapacity(injectBytecode, 7, 0)
3755for i, o in bytecodes
3756NumPut(o, injectBytecode, i - 1, "UChar")
3757return writeRaw(hGTA, dwSAMP + 0x6C014, &injectBytecode, 7)
3758}
3759DownloadBin(url, byref buf) {
3760if (!DllCall("LoadLibrary", "str", "wininet") || !(h := DllCall("wininet\InternetOpen", "str", a, "uint", 1, "ptr", 0, "ptr", 0, "uint", 0, "ptr")))
3761return 0
3762c := s := 0
3763if (f := DllCall("wininet\InternetOpenUrl", "ptr", h, "str", url, "ptr", 0, "uint", 0, "uint", 0x80003000, "ptr", 0, "ptr")) {
3764while (DllCall("wininet\InternetQueryDataAvailable", "ptr", f, "uint*", s, "uint", 0, "ptr", 0) && s>0) {
3765VarSetCapacity(b, c+s, 0)
3766if (c>0)
3767DllCall("RtlMoveMemory", "ptr", &b, "ptr", &buf, "ptr", c)
3768DllCall("wininet\InternetReadFile", "ptr", f, "ptr", &b+c, "uint", s, "uint*", r)
3769c += r
3770VarSetCapacity(buf, c, 0)
3771if (c>0)
3772DllCall("RtlMoveMemory", "ptr", &buf, "ptr", &b, "ptr", c)
3773}
3774DllCall("wininet\InternetCloseHandle", "ptr", f)
3775}
3776DllCall("wininet\InternetCloseHandle", "ptr", h)
3777return c
3778}
3779DownloadToString(url, head, encoding = "utf-8") {
3780static a := "AutoHotkey/" A_AhkVersion
3781if (!DllCall("LoadLibrary", "str", "wininet") || !(h := DllCall("wininet\InternetOpen", "str", a, "uint", 1, "ptr", 0, "ptr", 0, "uint", 0, "ptr")))
3782return 0
3783c := s := 0, o := ""
3784if (f := DllCall("wininet\InternetOpenUrl", "ptr", h, "str", url, "str", head, "int", -1, "uint", 0x80083000, "ptr", 0, "ptr")) {
3785while (DllCall("wininet\InternetQueryDataAvailable", "ptr", f, "uint*", s, "uint", 0, "ptr", 0) && s > 0) {
3786VarSetCapacity(b, s, 0)
3787DllCall("wininet\InternetReadFile", "ptr", f, "ptr", &b, "uint", s, "uint*", r)
3788o .= StrGet(&b, r >> (encoding = "utf-16" || encoding = "cp1200"), encoding)
3789}
3790DllCall("wininet\InternetCloseHandle", "ptr", f)
3791}
3792DllCall("wininet\InternetCloseHandle", "ptr", h)
3793return o
3794}
3795URLDownloadToVar(url, showerror := false) {
3796hObject := ComObjCreate("WinHttp.WinHttpRequest.5.1")
3797try {
3798hObject.Open("GET", url)
3799hObject.SetTimeouts(0, 2000, 2000, 2000)
3800hObject.Send()
3801data := hObject.ResponseText
3802} catch e {
3803if (showerror == true) {
3804addChatMessage2(PREFIX . "Aktuell liegt ein Fehler in der Verbindung zum Server vor!")
3805}
3806return "ERROR_CONNECTION"
3807}
3808return data
3809}
3810Unzip(sZip, sUnz) {
3811fso := ComObjCreate("Scripting.FileSystemObject")
3812psh := ComObjCreate("Shell.Application")
3813zippedItems := psh.Namespace( sZip ).items().count
3814psh.Namespace( sUnz ).CopyHere( psh.Namespace( sZip ).items, 4|16 )
3815Loop {
3816Sleep, 50
3817unzippedItems := psh.Namespace( sUnz ).items().count
3818IfEqual, zippedItems, %unzippedItems%
3819break
3820}
3821}
3822PlayerInput(text) {
3823global alternativePlayerInput
3824if (alternativePlayerInput) {
3825Sleep, 100
3826Suspend, On
3827SendInput, t^a{backspace}/%text%
3828Input, var, V, {Enter}{Esc}{LButton}
3829SendInput, {End}+{Home}{Del}{Esc}
3830Suspend, Off
3831} else {
3832KeyWait, Enter
3833SendInput, t^a{backspace}/%text%
3834Input, var, V, {Enter}{Esc}{LButton}
3835SendInput, {End}+{Home}{Del}{Esc}
3836KeyWait, Enter
3837}
3838return var
3839}
3840getFullName(name, showerror := false) {
3841if name is number
3842{
3843name := getPlayerNameById(name)
3844if (name == "") {
3845if (showerror)
3846addChatMessage2(PREFIX . "Der Spieler mit der ID " . SECCOL . name . " {FFFFFF}ist nicht auf dem Server!")
3847return ""
3848} else {
3849return name
3850}
3851} else {
3852name := getPlayerIdByName(name)
3853if (name == -1) {
3854if (showerror)
3855addChatMessage2(PREFIX . "Der Spieler " . SECCOL . name . " {FFFFFF}ist nicht auf dem Server!")
3856return ""
3857} else {
3858return getPlayerNameById(name)
3859}
3860}
3861}
3862sendClientMessage(message) {
3863if (StrLen(message) > 144) {
3864subMessage := SubStr(message, 1, 141)
3865if (RegExMatch(subMessage, "(.+)({\S{6}})(\s*)$", message_)) {
3866addChatMessage2(message_1 . "...")
3867sendClientMessage(message_2 . "..." . message_3 . SubStr(message, 142))
3868} else if (RegExMatch(subMessage, "(.+)({\S{0,6})$", message_)) {
3869addChatMessage2(message_1 . "...")
3870subMessage2 := SubStr(message, 142)
3871if (RegExMatch(subMessage2, "^(\S{0,6}})(.+)", message2_)) {
3872sendClientMessage(message_2 . message2_1 . "..." . message2_2)
3873} else {
3874sendClientMessage("..." . subMessage2)
3875}
3876} else {
3877addChatMessage2(subMessage . "...")
3878color := ""
3879if (RegExMatch(subMessage, "(.*)({\S{6}})(.*)", message_)) {
3880color := message_2
3881}
3882sendClientMessage(color . "..." . SubStr(message, 142))
3883}
3884} else {
3885addChatMessage2(message)
3886}
3887}
3888getWeaponName(id) {
3889weapons := {0: "Fist", 1: "Brass Knuckles", 2: "Golf Club", 3: "Nightstick", 4: "Knife", 5: "Baseball Bat", 6: "Shovel", 7: "Pool Cue", 8: "Katana", 9: "Chainsaw", 10: "Purple Dildo", 11: "Dildo", 12: "Vibrator", 13: "Silver Vibrator", 14: "Flowers", 15: "Cane", 16: "Grenade", 17: "Tear Gas", 18: "Molotov Cocktail", 22: "9mm", 23: "Silenced 9mm", 24: "Desert Eagle", 25: "Shotgun", 26: "Sawnoff Shotgun", 27: "Combat Shotgun", 28: "Micro SMG/Uzi", 29: "MP5", 30: "AK-47", 31: "M4", 32: "Tec-9", 33: "Country Rifle", 34: "Sniper Rifle", 35: "RPG", 36: "HS Rocket", 37: "Flamethrower", 38: "Minigun", 39: "Satchel Charge", 40: "Detonator", 41: "Spraycan", 42: "Fire Extinguisher", 43: "Camera", 44: "Night Vis Goggles", 45: "Thermal Goggles", 46: "Parachute", 47: "Fake Pistol", 49: "Vehicle", 50: "Helicopter Blades", 51: "Explosion", 53: "Drowned", 54: "Splat", 255: "Suicide"}
3890if (weapons[id]) {
3891return weapons[id]
3892}
3893return "Unknown"
3894}
3895getLocation() {
3896zone := getPlayerZone()
3897city := getPlayerCity()
3898if (city == "" || city == "Unbekannt") {
3899return zone
3900} else {
3901return zone . ", " . city
3902}
3903}
3904formatNumber(_number) {
3905StringReplace, _number, _number, -
3906IfEqual, ErrorLevel, 0, SetEnv Sign, -
3907Loop, Parse, _number, .
3908if (A_Index = 1) {
3909len := StrLen(A_LoopField)
3910Loop, Parse, A_LoopField
3911if (Mod(len-A_Index,3) = 0 and A_Index != len) {
3912x .= A_LoopField "."
3913} else {
3914x .= A_LoopField
3915}
3916} else {
3917Return Sign x "." A_LoopField
3918}
3919Return Sign x
3920}
3921formatTime(time) {
3922hours := Floor(time / 60 / 60)
3923minutes := Floor(time / 60) - hours * 60
3924seconds := time - minutes * 60 - hours * 60 * 60
3925time := ""
3926if (hours > 0) {
3927time .= hours . "h"
3928if (minutes > 0) {
3929time .= ", "
3930} else if (seconds > 0) {
3931time .= ", "
3932}
3933}
3934if (minutes > 0) {
3935time .= minutes . "min"
3936if (seconds > 0) {
3937time .= ", "
3938}
3939}
3940if (seconds > 0 || (minutes == 0 && hours == 0)) {
3941time .= seconds . "s"
3942}
3943return time
3944}
3945getDayTime() {
3946FormatTime, time,, HH
3947if (time >= 11 && time < 18) {
3948return "Tag"
3949} else if (time >= 18) {
3950return "Abend"
3951} else if (time >= 0 && time < 11) {
3952return "Morgen"
3953}
3954return ""
3955}
3956getUnixTimestamp(time_orig) {
3957StringLeft, now_year, time_orig, 4
3958StringMid, now_month, time_orig, 5, 2
3959StringMid, now_day, time_orig, 7, 2
3960StringMid, now_hour, time_orig, 9, 2
3961StringMid, now_min, time_orig, 11, 2
3962StringRight, now_sec, time_orig, 2
3963year_sec := 31536000 * (now_year - 1970)
3964leap_days := (now_year - 1972) / 4 + 1
3965Transform, leap_days, Floor, %leap_days%
3966this_leap := now_year/4
3967Transform, this_leap_round, Floor, %this_leap%
3968if (this_leap = this_leap_round) {
3969if (now_month <= 2) {
3970leap_days--
3971}
3972}
3973leap_sec := leap_days * 86400
3974if (now_month == 01)
3975month_sec = 0
3976if (now_month == 02)
3977month_sec = 2678400
3978if (now_month == 03)
3979month_sec = 5097600
3980if (now_month == 04)
3981month_sec = 7776000
3982if (now_month == 05)
3983month_sec = 10368000
3984if (now_month == 06)
3985month_sec = 13046400
3986if (now_month == 07)
3987month_sec = 15638400
3988if (now_month == 08)
3989month_sec = 18316800
3990if (now_month == 09)
3991month_sec = 20995200
3992if (now_month == 10)
3993month_sec = 23587200
3994if (now_month == 11)
3995month_sec = 26265600
3996if (now_month == 12)
3997month_sec = 28857600
3998day_sec := (now_day - 1) * 86400
3999hour_sec := now_hour * 3600
4000min_sec := now_min * 60
4001date_sec := year_sec + month_sec + day_sec + leap_sec + hour_sec + min_sec + now_sec
4002return date_sec
4003}
4004getDistanceBetween(posX, posY, posZ, _posX, _posY, _posZ, _posRadius) {
4005X := posX -_posX
4006Y := posY -_posY
4007Z := posZ -_posZ
4008if (((X < _posRadius) && (X > -_posRadius)) && ((Y < _posRadius) && (Y > -_posRadius)) && ((Z < _posRadius) && (Z > -_posRadius)))
4009return TRUE
4010return FALSE
4011}
4012getDistanceToPoint(posX, posY, posZ, _posX, _posY, _posZ) {
4013return Sqrt((posX - _posX) ** 2 + (posY - _posY) ** 2 + (posZ - _posZ) ** 2)
4014}
4015IniRead(fileName, section, key, default := 0) {
4016IniRead, var, %fileName%, %section%, %key%, %default%
4017return var
4018}
4019getUserFriendlyHotkeyName(hk) {
4020StringUpper, hk, hk
4021hk := StrReplace(hk, "~", "")
4022hk := StrReplace(hk, "+", "UMSCHALT+")
4023hk := StrReplace(hk, "^", "STRG+")
4024hk := StrReplace(hk, "!", "ALT+")
4025return hk
4026}
4027global fractions := {"": [0, "Zivilist"], "lspd": [1, "LSPD"], "fbi": [2, "FBI"], "lvpd": [3, "LVPD"], "lsmd": [4, "LSMD"], "russen": [5, "Russen Mafia"], "yakuza": [6, "Yakuza"], "regierung": [7, "Regierung"], "agency": [8, "Agency"], "news": [9, "San News"], "grove": [10, "Grove Street"], "ballas": [11, "Ballas"], "lcm": [12, "LCM"], "oamt": [13, "Ordnungsamt"], "gmbh": [14, "Transport GmbH"], "rifa": [15, "S.F. Rifa"], "vagos": [16, "Vagos"], "triaden": [17, "Triaden"], "safd": [19, "SAFD"]}
4028getFraktionByID(id) {
4029fraction := ""
4030for index, entry in fractions {
4031if (entry[1] == id) {
4032fraction := entry[2]
4033break
4034}
4035}
4036return fraction
4037}
4038getFraktionColorByID(id) {
4039fractionColor := ""
4040if (id == 1) {
4041fractionColor := "{217BFF}"
4042} else if (id == 2) {
4043fractionColor := "{0E00DC}"
4044} else if (id == 4) {
4045fractionColor := "{AA3333}"
4046} else if (id == 5) {
4047fractionColor := "{85847F}"
4048} else if (id == 6) {
4049fractionColor := "{FFFFFF}"
4050} else if (id == 10) {
4051fractionColor := "{078C09}"
4052} else if (id == 11) {
4053fractionColor := "{9300FF}"
4054} else if (id == 12) {
4055fractionColor := "{0046FF}"
4056} else if (id == 15) {
4057fractionColor := "{00DCFF}"
4058} else if (id == 16) {
4059fractionColor := "{FFFF00}"
4060} else if (id == 17) {
4061fractionColor := "{FF8000}"
4062}
4063return fractionColor
4064}
4065getFraktionColorByName(name) {
4066fractionColor := ""
4067if (InStr(name, "LSPD")) {
4068fractionColor := "{217BFF}"
4069} else if (InStr(name, "FBI")) {
4070fractionColor := "{0E00DC}"
4071} else if (InStr(name, "LVPD")) {
4072fractionColor := "{AA3333}"
4073} else if (InStr(name, "Russen")) {
4074fractionColor := "{85847F}"
4075} else if (InStr(name, "Yakuza")) {
4076fractionColor := "{FFFFFF}"
4077} else if (InStr(name, "Grove")) {
4078fractionColor := "{078C09}"
4079} else if (InStr(name, "Ballas")) {
4080fractionColor := "{9300FF}"
4081} else if (InStr(name, "Chickos")) {
4082fractionColor := "{0046FF}"
4083} else if (InStr(name, "Rifa")) {
4084fractionColor := "{00DCFF}"
4085} else if (InStr(name, "Vagos")) {
4086fractionColor := "{FFFF00}"
4087} else if (InStr(name, "Triaden")) {
4088fractionColor := "{FF8000}"
4089}
4090return fractionColor
4091}
4092getFraktionNameShort(name) {
4093nameShort := ""
4094if (InStr(name, "Russen")) {
4095nameShort := "Russen"
4096} else if (InStr(name, "Yakuza")) {
4097nameShort := "Yaku"
4098} else if (InStr(name, "Grove")) {
4099nameShort := "GS"
4100} else if (InStr(name, "Ballas")) {
4101nameShort := "Ballas"
4102} else if (InStr(name, "Chickos")) {
4103nameShort := "LCM"
4104} else if (InStr(name, "Rifa")) {
4105nameShort := "Rifa"
4106} else if (InStr(name, "Vagos")) {
4107nameShort := "Vagos"
4108} else if (InStr(name, "Triaden")) {
4109nameShort := "Triaden"
4110}
4111return nameShort
4112}
4113getFraktionBySkinID(id) {
4114fraction := 0
4115skins := {1: [163, 164, 265, 266, 267, 280, 281, 283, 284, 288, 306], 2: [165, 166, 240, 286, 294, 11, 172, 194, 211, 309], 3: [282, 287, 307], 5: [43, 111, 112, 113, 124, 125, 126, 127, 258, 272, 40], 6: [121, 122, 123, 186, 203, 204, 228, 169, 224], 10: [105, 106, 107, 269, 271, 65, 270], 11: [102, 103, 104, 293, 13], 12: [46, 47, 48, 98, 185, 223, 249, 214], 15: [114, 115, 116, 173, 174, 175, 184, 273, 195, 298], 16: [108, 109, 110, 292, 91], 17: [49, 117, 118, 120, 208, 263]}
4116for fname, fskins in skins
4117{
4118for index, fskin in fskins
4119{
4120if (fskin == id) {
4121fraction := fname
4122break, 2
4123}
4124}
4125}
4126return fraction
4127}
4128callWithParams2(hProcess, dwFunc, aParams, bCleanupStack = true, bThisCall = false, bReturn = false, sDatatype = "Char") {
4129if (!hProcess || !dwFunc)
4130return false
4131dataOffset := 0
4132i := aParams.MaxIndex()
4133bytesUsed := 0
4134bytesMax := 5120
4135dwLen := i * 5 + bCleanupStack * 3 + bReturn * 5 + 6
4136VarSetCapacity(injectData, dwLen, 0)
4137while (i > 0) {
4138if (aParams[i][1] == "i" || aParams[i][1] == "p" || aParams[i][1] == "f")
4139value := aParams[i][2]
4140else if (aParams[i][1] == "s") {
4141if (bytesMax - bytesUsed < StrLen(aParams[i][2]))
4142return false
4143value := pMemory + bytesUsed
4144writeString(hProcess, value, aParams[i][2])
4145bytesUsed += StrLen(aParams[i][2]) + 1
4146if (ErrorLevel)
4147return false
4148}
4149else
4150return false
4151NumPut((bThisCall && i == 1 ? 0xB9 : 0x68), injectData, dataOffset, "UChar")
4152NumPut(value, injectData, ++dataOffset, aParams[i][1] == "f" ? "Float" : "Int")
4153dataOffset += 4
4154i--
4155}
4156offset := dwFunc - (pInjectFunc + dataOffset + 5)
4157NumPut(0xE8, injectData, dataOffset, "UChar")
4158NumPut(offset, injectData, ++dataOffset, "Int")
4159dataOffset += 4
4160if (bReturn) {
4161NumPut(sDatatype = "Char" ? 0xA2 : 0xA3, injectData, dataOffset, "UChar")
4162NumPut(pParam1, injectData, ++dataOffset, "UInt")
4163dataOffset += 4
4164}
4165if (bCleanupStack) {
4166NumPut(0xC483, injectData, dataOffset, "UShort")
4167dataOffset += 2
4168NumPut((aParams.MaxIndex() - bThisCall) * 4, injectData, dataOffset, "UChar")
4169dataOffset++
4170}
4171NumPut(0xC3, injectData, dataOffset, "UChar")
4172writeRaw(hGTA, pInjectFunc, &injectData, dwLen)
4173if (ErrorLevel)
4174return false
4175hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
4176if (ErrorLevel)
4177return false
4178waitForSingleObject(hThread, 0xFFFFFFFF)
4179closeProcess(hThread)
4180if (bReturn)
4181return readMem(hGTA, pParam1, 4, sDatatype)
4182return true
4183}
4184class JSON
4185{
4186class Load extends JSON.Functor
4187{
4188Call(self, ByRef text, reviver:="")
4189{
4190this.rev := IsObject(reviver) ? reviver : false
4191this.keys := this.rev ? {} : false
4192static quot := Chr(34), bashq := "\" . quot
4193, json_value := quot . "{[01234567890-tfn"
4194, json_value_or_array_closing := quot . "{[]01234567890-tfn"
4195, object_key_or_object_closing := quot . "}"
4196key := ""
4197is_key := false
4198root := {}
4199stack := [root]
4200next := json_value
4201pos := 0
4202while ((ch := SubStr(text, ++pos, 1)) != "") {
4203if InStr(" `t`r`n", ch)
4204continue
4205if !InStr(next, ch, 1)
4206this.ParseError(next, text, pos)
4207holder := stack[1]
4208is_array := holder.IsArray
4209if InStr(",:", ch) {
4210next := (is_key := !is_array && ch == ",") ? quot : json_value
4211} else if InStr("}]", ch) {
4212ObjRemoveAt(stack, 1)
4213next := stack[1]==root ? "" : stack[1].IsArray ? ",]" : ",}"
4214} else {
4215if InStr("{[", ch) {
4216static json_array := Func("Array").IsBuiltIn || ![].IsArray ? {IsArray: true} : 0
4217(ch == "{")
4218? ( is_key := true
4219, value := {}
4220, next := object_key_or_object_closing )
4221: ( value := json_array ? new json_array : []
4222, next := json_value_or_array_closing )
4223ObjInsertAt(stack, 1, value)
4224if (this.keys)
4225this.keys[value] := []
4226} else {
4227if (ch == quot) {
4228i := pos
4229while (i := InStr(text, quot,, i+1)) {
4230value := StrReplace(SubStr(text, pos+1, i-pos-1), "\\", "\u005c")
4231static tail := A_AhkVersion<"2" ? 0 : -1
4232if (SubStr(value, tail) != "\")
4233break
4234}
4235if (!i)
4236this.ParseError("'", text, pos)
4237value := StrReplace(value, "\/", "/")
4238, value := StrReplace(value, bashq, quot)
4239, value := StrReplace(value, "\b", "`b")
4240, value := StrReplace(value, "\f", "`f")
4241, value := StrReplace(value, "\n", "`n")
4242, value := StrReplace(value, "\r", "`r")
4243, value := StrReplace(value, "\t", "`t")
4244pos := i
4245i := 0
4246while (i := InStr(value, "\",, i+1)) {
4247if !(SubStr(value, i+1, 1) == "u")
4248this.ParseError("\", text, pos - StrLen(SubStr(value, i+1)))
4249uffff := Abs("0x" . SubStr(value, i+2, 4))
4250if (A_IsUnicode || uffff < 0x100)
4251value := SubStr(value, 1, i-1) . Chr(uffff) . SubStr(value, i+6)
4252}
4253if (is_key) {
4254key := value, next := ":"
4255continue
4256}
4257} else {
4258value := SubStr(text, pos, i := RegExMatch(text, "[\]\},\s]|$",, pos)-pos)
4259static number := "number", integer :="integer"
4260if value is %number%
4261{
4262if value is %integer%
4263value += 0
4264}
4265else if (value == "true" || value == "false")
4266value := %value% + 0
4267else if (value == "null")
4268value := ""
4269else
4270this.ParseError(next, text, pos, i)
4271pos += i-1
4272}
4273next := holder==root ? "" : is_array ? ",]" : ",}"
4274}
4275is_array? key := ObjPush(holder, value) : holder[key] := value
4276if (this.keys && this.keys.HasKey(holder))
4277this.keys[holder].Push(key)
4278}
4279}
4280return this.rev ? this.Walk(root, "") : root[""]
4281}
4282ParseError(expect, ByRef text, pos, len:=1)
4283{
4284static quot := Chr(34), qurly := quot . "}"
4285line := StrSplit(SubStr(text, 1, pos), "`n", "`r").Length()
4286col := pos - InStr(text, "`n",, -(StrLen(text)-pos+1))
4287msg := Format("{1}`n`nLine:`t{2}`nCol:`t{3}`nChar:`t{4}"
4288, (expect == "") ? "Extra data"
4289: (expect == "'") ? "Unterminated string starting at"
4290: (expect == "\") ? "Invalid \escape"
4291: (expect == ":") ? "Expecting ':' delimiter"
4292: (expect == quot) ? "Expecting object key enclosed in double quotes"
4293: (expect == qurly) ? "Expecting object key enclosed in double quotes or object closing '}'"
4294: (expect == ",}") ? "Expecting ',' delimiter or object closing '}'"
4295: (expect == ",]") ? "Expecting ',' delimiter or array closing ']'"
4296: InStr(expect, "]") ? "Expecting JSON value or array closing ']'"
4297: "Expecting JSON value(string, number, true, false, null, object or array)"
4298, line, col, pos)
4299static offset := A_AhkVersion<"2" ? -3 : -4
4300throw Exception(msg, offset, SubStr(text, pos, len))
4301}
4302Walk(holder, key)
4303{
4304value := holder[key]
4305if IsObject(value) {
4306for i, k in this.keys[value] {
4307v := this.Walk(value, k)
4308if (v != JSON.Undefined)
4309value[k] := v
4310else
4311ObjDelete(value, k)
4312}
4313}
4314return this.rev.Call(holder, key, value)
4315}
4316}
4317class Dump extends JSON.Functor
4318{
4319Call(self, value, replacer:="", space:="")
4320{
4321this.rep := IsObject(replacer) ? replacer : ""
4322this.gap := ""
4323if (space) {
4324static integer := "integer"
4325if space is %integer%
4326Loop, % ((n := Abs(space))>10 ? 10 : n)
4327this.gap .= " "
4328else
4329this.gap := SubStr(space, 1, 10)
4330this.indent := "`n"
4331}
4332return this.Str({"": value}, "")
4333}
4334Str(holder, key)
4335{
4336value := holder[key]
4337if (this.rep)
4338value := this.rep.Call(holder, key, ObjHasKey(holder, key) ? value : JSON.Undefined)
4339if IsObject(value) {
4340static type := A_AhkVersion<"2" ? "" : Func("Type")
4341if (type ? type.Call(value) == "Object" : ObjGetCapacity(value) != "") {
4342if (this.gap) {
4343stepback := this.indent
4344this.indent .= this.gap
4345}
4346is_array := value.IsArray
4347if (!is_array) {
4348for i in value
4349is_array := i == A_Index
4350until !is_array
4351}
4352str := ""
4353if (is_array) {
4354Loop, % value.Length() {
4355if (this.gap)
4356str .= this.indent
4357v := this.Str(value, A_Index)
4358str .= (v != "") ? v . "," : "null,"
4359}
4360} else {
4361colon := this.gap ? ": " : ":"
4362for k in value {
4363v := this.Str(value, k)
4364if (v != "") {
4365if (this.gap)
4366str .= this.indent
4367str .= this.Quote(k) . colon . v . ","
4368}
4369}
4370}
4371if (str != "") {
4372str := RTrim(str, ",")
4373if (this.gap)
4374str .= stepback
4375}
4376if (this.gap)
4377this.indent := stepback
4378return is_array ? "[" . str . "]" : "{" . str . "}"
4379}
4380} else
4381return ObjGetCapacity([value], 1)=="" ? value : this.Quote(value)
4382}
4383Quote(string)
4384{
4385static quot := Chr(34), bashq := "\" . quot
4386if (string != "") {
4387string := StrReplace(string, "\", "\\")
4388, string := StrReplace(string, quot, bashq)
4389, string := StrReplace(string, "`b", "\b")
4390, string := StrReplace(string, "`f", "\f")
4391, string := StrReplace(string, "`n", "\n")
4392, string := StrReplace(string, "`r", "\r")
4393, string := StrReplace(string, "`t", "\t")
4394static rx_escapable := A_AhkVersion<"2" ? "O)[^\x20-\x7e]" : "[^\x20-\x7e]"
4395while RegExMatch(string, rx_escapable, m)
4396string := StrReplace(string, m.Value, Format("\u{1:04x}", Ord(m.Value)))
4397}
4398return quot . string . quot
4399}
4400}
4401Undefined[]
4402{
4403get {
4404static empty := {}, vt_empty := ComObject(0, &empty, 1)
4405return vt_empty
4406}
4407}
4408class Functor
4409{
4410__Call(method, ByRef arg, args*)
4411{
4412if IsObject(method)
4413return (new this).Call(method, arg, args*)
4414else if (method == "")
4415return (new this).Call(arg, args*)
4416}
4417}
4418}
4419SetWorkingDir, %A_ScriptDir%
4420IfExist, update.bat
4421{
4422FileDelete, update.bat
4423}
4424global baseURL := "http://imperator.square7.ch/Keybinder/"
4425projectName := "Imperator"
4426
4427unBlockChatInput()
4428chatLogFile := FileOpen(A_MyDocuments . "\GTA San Andreas User Files\SAMP\chatlog.txt", "r")
4429firstChatLogRun := true
4430chatLogLines := []
4431FormatTime, time, , dd.MM.yyyy HH:mm:ss
4432IfNotExist, bin
4433{
4434FileCreateDir, bin
4435}
4436IfNotExist, bin\sqlite3.dll
4437{
4438URLDownloadToFile, %baseURL%sqlite3.dll, bin\sqlite3.dll
4439}
4440IniRead, SQLite3DllPath, SQLiteDB.ini, Main, DllPath, %A_Space%
4441if (SQLite3DllPath != "bin\SQLite3.dll") {
4442IniWrite, % "bin\SQLite3.dll", SQLiteDB.ini, Main, DllPath
4443sleep, 5000
4444Progress, Off
4445}
4446
4447Class SQLiteDB Extends SQLiteDB.BaseClass {
4448Class BaseClass {
4449Static Version := ""
4450Static _SQLiteDLL := A_ScriptDir . "\SQLite3.dll"
4451Static _RefCount := 0
4452Static _MinVersion := "3.6"
4453}
4454Class _Table {
4455__New() {
4456This.ColumnCount := 0
4457This.RowCount := 0
4458This.ColumnNames := []
4459This.Rows := []
4460This.HasNames := False
4461This.HasRows := False
4462This._CurrentRow := 0
4463}
4464GetRow(RowIndex, ByRef Row) {
4465Row := ""
4466If (RowIndex < 1 || RowIndex > This.RowCount)
4467Return False
4468If !This.Rows.HasKey(RowIndex)
4469Return False
4470Row := This.Rows[RowIndex]
4471This._CurrentRow := RowIndex
4472Return True
4473}
4474Next(ByRef Row) {
4475Row := ""
4476If (This._CurrentRow >= This.RowCount)
4477Return -1
4478This._CurrentRow += 1
4479If !This.Rows.HasKey(This._CurrentRow)
4480Return False
4481Row := This.Rows[This._CurrentRow]
4482Return True
4483}
4484Reset() {
4485This._CurrentRow := 0
4486Return True
4487}
4488}
4489Class _RecordSet {
4490__New() {
4491This.ColumnCount := 0
4492This.ColumnNames := []
4493This.HasNames := False
4494This.HasRows := False
4495This.CurrentRow := 0
4496This.ErrorMsg := ""
4497This.ErrorCode := 0
4498This._Handle := 0
4499This._DB := {}
4500}
4501Next(ByRef Row) {
4502Static SQLITE_NULL := 5
4503Static SQLITE_BLOB := 4
4504Static EOR := -1
4505Row := ""
4506This.ErrorMsg := ""
4507This.ErrorCode := 0
4508If !(This._Handle) {
4509This.ErrorMsg := "Invalid query handle!"
4510Return False
4511}
4512RC := DllCall("SQlite3.dll\sqlite3_step", "Ptr", This._Handle, "Cdecl Int")
4513If (ErrorLevel) {
4514This.ErrorMsg := "DLLCall sqlite3_step failed!"
4515This.ErrorCode := ErrorLevel
4516Return False
4517}
4518If (RC <> This._DB._ReturnCode("SQLITE_ROW")) {
4519If (RC = This._DB._ReturnCode("SQLITE_DONE")) {
4520This.ErrorMsg := "EOR"
4521This.ErrorCode := RC
4522Return EOR
4523}
4524This.ErrorMsg := This._DB.ErrMsg()
4525This.ErrorCode := RC
4526Return False
4527}
4528RC := DllCall("SQlite3.dll\sqlite3_data_count", "Ptr", This._Handle, "Cdecl Int")
4529If (ErrorLevel) {
4530This.ErrorMsg := "DLLCall sqlite3_data_count failed!"
4531This.ErrorCode := ErrorLevel
4532Return False
4533}
4534If (RC < 1) {
4535This.ErrorMsg := "RecordSet is empty!"
4536This.ErrorCode := This._DB._ReturnCode("SQLITE_EMPTY")
4537Return False
4538}
4539Row := []
4540Loop, %RC% {
4541Column := A_Index - 1
4542ColumnType := DllCall("SQlite3.dll\sqlite3_column_type", "Ptr", This._Handle, "Int", Column, "Cdecl Int")
4543If (ErrorLevel) {
4544This.ErrorMsg := "DLLCall sqlite3_column_type failed!"
4545This.ErrorCode := ErrorLevel
4546Return False
4547}
4548If (ColumnType = SQLITE_NULL) {
4549Row[A_Index] := ""
4550} Else If (ColumnType = SQLITE_BLOB) {
4551BlobPtr := DllCall("SQlite3.dll\sqlite3_column_blob", "Ptr", This._Handle, "Int", Column, "Cdecl UPtr")
4552BlobSize := DllCall("SQlite3.dll\sqlite3_column_bytes", "Ptr", This._Handle, "Int", Column, "Cdecl Int")
4553If (BlobPtr = 0) || (BlobSize = 0) {
4554Row[A_Index] := ""
4555} Else {
4556Row[A_Index] := {}
4557Row[A_Index].Size := BlobSize
4558Row[A_Index].Blob := ""
4559Row[A_Index].SetCapacity("Blob", BlobSize)
4560Addr := Row[A_Index].GetAddress("Blob")
4561DllCall("Kernel32.dll\RtlMoveMemory", "Ptr", Addr, "Ptr", BlobPtr, "Ptr", BlobSize)
4562}
4563} Else {
4564StrPtr := DllCall("SQlite3.dll\sqlite3_column_text", "Ptr", This._Handle, "Int", Column, "Cdecl UPtr")
4565If (ErrorLevel) {
4566This.ErrorMsg := "DLLCall sqlite3_column_text failed!"
4567This.ErrorCode := ErrorLevel
4568Return False
4569}
4570Row[A_Index] := StrGet(StrPtr, "UTF-8")
4571}
4572}
4573This.CurrentRow += 1
4574Return True
4575}
4576Reset() {
4577This.ErrorMsg := ""
4578This.ErrorCode := 0
4579If !(This._Handle) {
4580This.ErrorMsg := "Invalid query handle!"
4581Return False
4582}
4583RC := DllCall("SQlite3.dll\sqlite3_reset", "Ptr", This._Handle, "Cdecl Int")
4584If (ErrorLevel) {
4585This.ErrorMsg := "DLLCall sqlite3_reset failed!"
4586This.ErrorCode := ErrorLevel
4587Return False
4588}
4589If (RC) {
4590This.ErrorMsg := This._DB._ErrMsg()
4591This.ErrorCode := RC
4592Return False
4593}
4594This.CurrentRow := 0
4595Return True
4596}
4597Free() {
4598This.ErrorMsg := ""
4599This.ErrorCode := 0
4600If !(This._Handle)
4601Return True
4602RC := DllCall("SQlite3.dll\sqlite3_finalize", "Ptr", This._Handle, "Cdecl Int")
4603If (ErrorLevel) {
4604This.ErrorMsg := "DLLCall sqlite3_finalize failed!"
4605This.ErrorCode := ErrorLevel
4606Return False
4607}
4608If (RC) {
4609This.ErrorMsg := This._DB._ErrMsg()
4610This.ErrorCode := RC
4611Return False
4612}
4613This._DB._Queries.Remove(This._Handle)
4614This._Handle := 0
4615Return True
4616}
4617}
4618__New() {
4619This._Path := ""
4620This._Handle := 0
4621This._Queries := {}
4622If (This.Base._RefCount = 0) {
4623SQLiteDLL := This.Base._SQLiteDLL
4624If !FileExist(SQLiteDLL)
4625If FileExist(A_ScriptDir . "\SQLiteDB.ini") {
4626IniRead, SQLiteDLL, %A_ScriptDir%\SQLiteDB.ini, Main, DllPath, %SQLiteDLL%
4627This.Base._SQLiteDLL := SQLiteDLL
4628}
4629If !(DLL := DllCall("LoadLibrary", "Str", This.Base._SQLiteDLL, "UPtr")) {
4630MsgBox, 16, SQLiteDB Error, % "DLL " . SQLiteDLL . " does not exist!"
4631ExitApp
4632}
4633This.Base.Version := StrGet(DllCall("SQlite3.dll\sqlite3_libversion", "Cdecl UPtr"), "UTF-8")
4634SQLVersion := StrSplit(This.Base.Version, ".")
4635MinVersion := StrSplit(This.Base._MinVersion, ".")
4636If (SQLVersion[1] < MinVersion[1]) || ((SQLVersion[1] = MinVersion[1]) && (SQLVersion[2] < MinVersion[2])){
4637DllCall("FreeLibrary", "Ptr", DLL)
4638MsgBox, 16, SQLite ERROR, % "Version " . This.Base.Version . " of SQLite3.dll is not supported!`n`n"
4639. "You can download the current version from www.sqlite.org!"
4640ExitApp
4641}
4642}
4643This.Base._RefCount += 1
4644}
4645__Delete() {
4646If (This._Handle)
4647This.CloseDB()
4648This.Base._RefCount -= 1
4649If (This.Base._RefCount = 0) {
4650If (DLL := DllCall("GetModuleHandle", "Str", This.Base._SQLiteDLL, "UPtr"))
4651DllCall("FreeLibrary", "Ptr", DLL)
4652}
4653}
4654_StrToUTF8(Str, ByRef UTF8) {
4655VarSetCapacity(UTF8, StrPut(Str, "UTF-8"), 0)
4656StrPut(Str, &UTF8, "UTF-8")
4657Return &UTF8
4658}
4659_UTF8ToStr(UTF8) {
4660Return StrGet(UTF8, "UTF-8")
4661}
4662_ErrMsg() {
4663If (RC := DllCall("SQLite3.dll\sqlite3_errmsg", "Ptr", This._Handle, "Cdecl UPtr"))
4664Return StrGet(&RC, "UTF-8")
4665Return ""
4666}
4667_ErrCode() {
4668Return DllCall("SQLite3.dll\sqlite3_errcode", "Ptr", This._Handle, "Cdecl Int")
4669}
4670_Changes() {
4671Return DllCall("SQLite3.dll\sqlite3_changes", "Ptr", This._Handle, "Cdecl Int")
4672}
4673_ReturnCode(RC) {
4674Static RCODE := {SQLITE_OK: 0
4675, SQLITE_ERROR: 1
4676, SQLITE_INTERNAL: 2
4677, SQLITE_PERM: 3
4678, SQLITE_ABORT: 4
4679, SQLITE_BUSY: 5
4680, SQLITE_LOCKED: 6
4681, SQLITE_NOMEM: 7
4682, SQLITE_READONLY: 8
4683, SQLITE_INTERRUPT: 9
4684, SQLITE_IOERR: 10
4685, SQLITE_CORRUPT: 11
4686, SQLITE_NOTFOUND: 12
4687, SQLITE_FULL: 13
4688, SQLITE_CANTOPEN: 14
4689, SQLITE_PROTOCOL: 15
4690, SQLITE_EMPTY: 16
4691, SQLITE_SCHEMA: 17
4692, SQLITE_TOOBIG: 18
4693, SQLITE_CONSTRAINT: 19
4694, SQLITE_MISMATCH: 20
4695, SQLITE_MISUSE: 21
4696, SQLITE_NOLFS: 22
4697, SQLITE_AUTH: 23
4698, SQLITE_FORMAT: 24
4699, SQLITE_RANGE: 25
4700, SQLITE_NOTADB: 26
4701, SQLITE_ROW: 100
4702, SQLITE_DONE: 101}
4703Return RCODE.HasKey(RC) ? RCODE[RC] : ""
4704}
4705ErrorMsg := ""
4706ErrorCode := 0
4707Changes := 0
4708SQL := ""
4709OpenDB(DBPath, Access := "W", Create := True) {
4710Static SQLITE_OPEN_READONLY := 0x01
4711Static SQLITE_OPEN_READWRITE := 0x02
4712Static SQLITE_OPEN_CREATE := 0x04
4713Static MEMDB := ":memory:"
4714This.ErrorMsg := ""
4715This.ErrorCode := 0
4716HDB := 0
4717If (DBPath = "")
4718DBPath := MEMDB
4719If (DBPath = This._Path) && (This._Handle)
4720Return True
4721If (This._Handle) {
4722This.ErrorMsg := "You must first close DB " . This._Path . "!"
4723Return False
4724}
4725Flags := 0
4726Access := SubStr(Access, 1, 1)
4727If (Access <> "W") && (Access <> "R")
4728Access := "R"
4729Flags := SQLITE_OPEN_READONLY
4730If (Access = "W") {
4731Flags := SQLITE_OPEN_READWRITE
4732If (Create)
4733Flags |= SQLITE_OPEN_CREATE
4734}
4735This._Path := DBPath
4736This._StrToUTF8(DBPath, UTF8)
4737RC := DllCall("SQlite3.dll\sqlite3_open_v2", "Ptr", &UTF8, "PtrP", HDB, "Int", Flags, "Ptr", 0, "Cdecl Int")
4738If (ErrorLevel) {
4739This._Path := ""
4740This.ErrorMsg := "DLLCall sqlite3_open_v2 failed!"
4741This.ErrorCode := ErrorLevel
4742Return False
4743}
4744If (RC) {
4745This._Path := ""
4746This.ErrorMsg := This._ErrMsg()
4747This.ErrorCode := RC
4748Return False
4749}
4750This._Handle := HDB
4751Return True
4752}
4753CloseDB() {
4754This.ErrorMsg := ""
4755This.ErrorCode := 0
4756This.SQL := ""
4757If !(This._Handle)
4758Return True
4759For Each, Query in This._Queries
4760DllCall("SQlite3.dll\sqlite3_finalize", "Ptr", Query, "Cdecl Int")
4761RC := DllCall("SQlite3.dll\sqlite3_close", "Ptr", This._Handle, "Cdecl Int")
4762If (ErrorLevel) {
4763This.ErrorMsg := "DLLCall sqlite3_close failed!"
4764This.ErrorCode := ErrorLevel
4765Return False
4766}
4767If (RC) {
4768This.ErrorMsg := This._ErrMsg()
4769This.ErrorCode := RC
4770Return False
4771}
4772This._Path := ""
4773This._Handle := ""
4774This._Queries := []
4775Return True
4776}
4777AttachDB(DBPath, DBAlias) {
4778Return This.Exec("ATTACH DATABASE '" . DBPath . "' As " . DBAlias . ";")
4779}
4780DetachDB(DBAlias) {
4781Return This.Exec("DETACH DATABASE " . DBAlias . ";")
4782}
4783Exec(SQL, Callback := "") {
4784This.ErrorMsg := ""
4785This.ErrorCode := 0
4786This.SQL := SQL
4787If !(This._Handle) {
4788This.ErrorMsg := "Invalid dadabase handle!"
4789Return False
4790}
4791CBPtr := 0
4792Err := 0
4793If (FO := Func(Callback)) && (FO.MinParams = 4)
4794CBPtr := RegisterCallback(Callback, "F C", 4, &SQL)
4795This._StrToUTF8(SQL, UTF8)
4796RC := DllCall("SQlite3.dll\sqlite3_exec", "Ptr", This._Handle, "Ptr", &UTF8, "Int", CBPtr, "Ptr", Object(This)
4797, "PtrP", Err, "Cdecl Int")
4798CallError := ErrorLevel
4799If (CBPtr)
4800DllCall("Kernel32.dll\GlobalFree", "Ptr", CBPtr)
4801If (CallError) {
4802This.ErrorMsg := "DLLCall sqlite3_exec failed!"
4803This.ErrorCode := CallError
4804Return False
4805}
4806If (RC) {
4807This.ErrorMsg := StrGet(Err, "UTF-8")
4808This.ErrorCode := RC
4809DllCall("SQLite3.dll\sqlite3_free", "Ptr", Err, "Cdecl")
4810Return False
4811}
4812This.Changes := This._Changes()
4813Return True
4814}
4815GetTable(SQL, ByRef TB, MaxResult := 0) {
4816TB := ""
4817This.ErrorMsg := ""
4818This.ErrorCode := 0
4819This.SQL := SQL
4820If !(This._Handle) {
4821This.ErrorMsg := "Invalid dadabase handle!"
4822Return False
4823}
4824If !RegExMatch(SQL, "i)^\s*(SELECT|PRAGMA)\s") {
4825This.ErrorMsg := "Method " . A_ThisFunc . " requires a query statement!"
4826Return False
4827}
4828Names := ""
4829Err := 0, RC := 0, GetRows := 0
4830I := 0, Rows := Cols := 0
4831Table := 0
4832If MaxResult Is Not Integer
4833MaxResult := 0
4834If (MaxResult < -2)
4835MaxResult := 0
4836This._StrToUTF8(SQL, UTF8)
4837RC := DllCall("SQlite3.dll\sqlite3_get_table", "Ptr", This._Handle, "Ptr", &UTF8, "PtrP", Table
4838, "IntP", Rows, "IntP", Cols, "PtrP", Err, "Cdecl Int")
4839If (ErrorLevel) {
4840This.ErrorMsg := "DLLCall sqlite3_get_table failed!"
4841This.ErrorCode := ErrorLevel
4842Return False
4843}
4844If (RC) {
4845This.ErrorMsg := StrGet(Err, "UTF-8")
4846This.ErrorCode := RC
4847DllCall("SQLite3.dll\sqlite3_free", "Ptr", Err, "Cdecl")
4848Return False
4849}
4850TB := new This._Table
4851TB.ColumnCount := Cols
4852TB.RowCount := Rows
4853If (MaxResult = -1) {
4854DllCall("SQLite3.dll\sqlite3_free_table", "Ptr", Table, "Cdecl")
4855If (ErrorLevel) {
4856This.ErrorMsg := "DLLCall sqlite3_free_table failed!"
4857This.ErrorCode := ErrorLevel
4858Return False
4859}
4860Return True
4861}
4862If (MaxResult = -2)
4863GetRows := 0
4864Else If (MaxResult > 0) && (MaxResult <= Rows)
4865GetRows := MaxResult
4866Else
4867GetRows := Rows
4868Offset := 0
4869Names := Array()
4870Loop, %Cols% {
4871Names[A_Index] := StrGet(NumGet(Table+0, Offset, "UPtr"), "UTF-8")
4872Offset += A_PtrSize
4873}
4874TB.ColumnNames := Names
4875TB.HasNames := True
4876Loop, %GetRows% {
4877I := A_Index
4878TB.Rows[I] := []
4879Loop, %Cols% {
4880TB.Rows[I][A_Index] := StrGet(NumGet(Table+0, Offset, "UPtr"), "UTF-8")
4881Offset += A_PtrSize
4882}
4883}
4884If (GetRows)
4885TB.HasRows := True
4886DllCall("SQLite3.dll\sqlite3_free_table", "Ptr", Table, "Cdecl")
4887If (ErrorLevel) {
4888TB := ""
4889This.ErrorMsg := "DLLCall sqlite3_free_table failed!"
4890This.ErrorCode := ErrorLevel
4891Return False
4892}
4893Return True
4894}
4895Query(SQL, ByRef RS) {
4896RS := ""
4897This.ErrorMsg := ""
4898This.ErrorCode := 0
4899This.SQL := SQL
4900ColumnCount := 0
4901HasRows := False
4902If !(This._Handle) {
4903This.ErrorMsg := "Invalid dadabase handle!"
4904Return False
4905}
4906If !RegExMatch(SQL, "i)^\s*(SELECT|PRAGMA)\s|") {
4907This.ErrorMsg := "Method " . A_ThisFunc . " requires a query statement!"
4908Return False
4909}
4910Query := 0
4911This._StrToUTF8(SQL, UTF8)
4912RC := DllCall("SQlite3.dll\sqlite3_prepare_v2", "Ptr", This._Handle, "Ptr", &UTF8, "Int", -1
4913, "PtrP", Query, "Ptr", 0, "Cdecl Int")
4914If (ErrorLeveL) {
4915This.ErrorMsg := "DLLCall sqlite3_prepare_v2 failed!"
4916This.ErrorCode := ErrorLevel
4917Return False
4918}
4919If (RC) {
4920This.ErrorMsg := This._ErrMsg()
4921This.ErrorCode := RC
4922Return False
4923}
4924RC := DllCall("SQlite3.dll\sqlite3_column_count", "Ptr", Query, "Cdecl Int")
4925If (ErrorLevel) {
4926This.ErrorMsg := "DLLCall sqlite3_column_count failed!"
4927This.ErrorCode := ErrorLevel
4928Return False
4929}
4930If (RC < 1) {
4931This.ErrorMsg := "Query result is empty!"
4932This.ErrorCode := This._ReturnCode("SQLITE_EMPTY")
4933Return False
4934}
4935ColumnCount := RC
4936Names := []
4937Loop, %RC% {
4938StrPtr := DllCall("SQlite3.dll\sqlite3_column_name", "Ptr", Query, "Int", A_Index - 1, "Cdecl UPtr")
4939If (ErrorLevel) {
4940This.ErrorMsg := "DLLCall sqlite3_column_name failed!"
4941This.ErrorCode := ErrorLevel
4942Return False
4943}
4944Names[A_Index] := StrGet(StrPtr, "UTF-8")
4945}
4946RC := DllCall("SQlite3.dll\sqlite3_step", "Ptr", Query, "Cdecl Int")
4947If (ErrorLevel) {
4948This.ErrorMsg := "DLLCall sqlite3_step failed!"
4949This.ErrorCode := ErrorLevel
4950Return False
4951}
4952If (RC = This._ReturnCode("SQLITE_ROW"))
4953HasRows := True
4954RC := DllCall("SQlite3.dll\sqlite3_reset", "Ptr", Query, "Cdecl Int")
4955If (ErrorLevel) {
4956This.ErrorMsg := "DLLCall sqlite3_reset failed!"
4957This.ErrorCode := ErrorLevel
4958Return False
4959}
4960RS := new This._RecordSet
4961RS.ColumnCount := ColumnCount
4962RS.ColumnNames := Names
4963RS.HasNames := True
4964RS.HasRows := HasRows
4965RS._Handle := Query
4966RS._DB := This
4967This._Queries[Query] := Query
4968Return True
4969}
4970LastInsertRowID(ByRef RowID) {
4971This.ErrorMsg := ""
4972This.ErrorCode := 0
4973This.SQL := ""
4974If !(This._Handle) {
4975This.ErrorMsg := "Invalid dadabase handle!"
4976Return False
4977}
4978RowID := 0
4979RC := DllCall("SQLite3.dll\sqlite3_last_insert_rowid", "Ptr", This._Handle, "Cdecl Int64")
4980If (ErrorLevel) {
4981This.ErrorMsg := "DLLCall sqlite3_last_insert_rowid failed!"
4982This.ErrorCode := ErrorLevel
4983Return False
4984}
4985RowID := RC
4986Return True
4987}
4988TotalChanges(ByRef Rows) {
4989This.ErrorMsg := ""
4990This.ErrorCode := 0
4991This.SQL := ""
4992If !(This._Handle) {
4993This.ErrorMsg := "Invalid dadabase handle!"
4994Return False
4995}
4996Rows := 0
4997RC := DllCall("SQLite3.dll\sqlite3_total_changes", "Ptr", This._Handle, "Cdecl Int")
4998If (ErrorLevel) {
4999This.ErrorMsg := "DLLCall sqlite3_total_changes failed!"
5000This.ErrorCode := ErrorLevel
5001Return False
5002}
5003Rows := RC
5004Return True
5005}
5006SetTimeout(Timeout := 1000) {
5007This.ErrorMsg := ""
5008This.ErrorCode := 0
5009This.SQL := ""
5010If !(This._Handle) {
5011This.ErrorMsg := "Invalid dadabase handle!"
5012Return False
5013}
5014If Timeout Is Not Integer
5015Timeout := 1000
5016RC := DllCall("SQLite3.dll\sqlite3_busy_timeout", "Ptr", This._Handle, "Cdecl Int")
5017If (ErrorLevel) {
5018This.ErrorMsg := "DLLCall sqlite3_busy_timeout failed!"
5019This.ErrorCode := ErrorLevel
5020Return False
5021}
5022If (RC) {
5023This.ErrorMsg := This._ErrMsg()
5024This.ErrorCode := RC
5025Return False
5026}
5027Return True
5028}
5029EscapeStr(ByRef Str, Quote := True) {
5030This.ErrorMsg := ""
5031This.ErrorCode := 0
5032This.SQL := ""
5033If !(This._Handle) {
5034This.ErrorMsg := "Invalid dadabase handle!"
5035Return False
5036}
5037If Str Is Number
5038Return True
5039OP := Quote ? "%Q" : "%q"
5040This._StrToUTF8(Str, UTF8)
5041Ptr := DllCall("SQLite3.dll\sqlite3_mprintf", "Ptr", &OP, "Ptr", &UTF8, "Cdecl UPtr")
5042If (ErrorLevel) {
5043This.ErrorMsg := "DLLCall sqlite3_mprintf failed!"
5044This.ErrorCode := ErrorLevel
5045Return False
5046}
5047Str := This._UTF8ToStr(Ptr)
5048DllCall("SQLite3.dll\sqlite3_free", "Ptr", Ptr, "Cdecl")
5049Return True
5050}
5051StoreBLOB(SQL, BlobArray) {
5052Static SQLITE_STATIC := 0
5053Static SQLITE_TRANSIENT := -1
5054This.ErrorMsg := ""
5055This.ErrorCode := 0
5056If !(This._Handle) {
5057This.ErrorMsg := "Invalid dadabase handle!"
5058Return False
5059}
5060If !RegExMatch(SQL, "i)^\s*(INSERT|UPDATE|REPLACE)\s") {
5061This.ErrorMsg := A_ThisFunc . " requires an INSERT/UPDATE/REPLACE statement!"
5062Return False
5063}
5064Query := 0
5065This._StrToUTF8(SQL, UTF8)
5066RC := DllCall("SQlite3.dll\sqlite3_prepare_v2", "Ptr", This._Handle, "Ptr", &UTF8, "Int", -1
5067, "PtrP", Query, "Ptr", 0, "Cdecl Int")
5068If (ErrorLeveL) {
5069This.ErrorMsg := A_ThisFunc . ": DLLCall sqlite3_prepare_v2 failed!"
5070This.ErrorCode := ErrorLevel
5071Return False
5072}
5073If (RC) {
5074This.ErrorMsg := A_ThisFunc . ": " . This._ErrMsg()
5075This.ErrorCode := RC
5076Return False
5077}
5078For BlobNum, Blob In BlobArray {
5079If !(Blob.Addr) || !(Blob.Size) {
5080This.ErrorMsg := A_ThisFunc . ": Invalid parameter BlobArray!"
5081This.ErrorCode := ErrorLevel
5082Return False
5083}
5084RC := DllCall("SQlite3.dll\sqlite3_bind_blob", "Ptr", Query, "Int", BlobNum, "Ptr", Blob.Addr
5085, "Int", Blob.Size, "Ptr", SQLITE_STATIC, "Cdecl Int")
5086If (ErrorLeveL) {
5087This.ErrorMsg := A_ThisFunc . ": DLLCall sqlite3_prepare_v2 failed!"
5088This.ErrorCode := ErrorLevel
5089Return False
5090}
5091If (RC) {
5092This.ErrorMsg := A_ThisFunc . ": " . This._ErrMsg()
5093This.ErrorCode := RC
5094Return False
5095}
5096}
5097RC := DllCall("SQlite3.dll\sqlite3_step", "Ptr", Query, "Cdecl Int")
5098If (ErrorLevel) {
5099This.ErrorMsg := A_ThisFunc . ": DLLCall sqlite3_step failed!"
5100This.ErrorCode := ErrorLevel
5101Return False
5102}
5103If (RC) && (RC <> This._ReturnCode("SQLITE_DONE")) {
5104This.ErrorMsg := A_ThisFunc . ": " . This._ErrMsg()
5105This.ErrorCode := RC
5106Return False
5107}
5108RC := DllCall("SQlite3.dll\sqlite3_finalize", "Ptr", Query, "Cdecl Int")
5109If (ErrorLevel) {
5110This.ErrorMsg := A_ThisFunc . ": DLLCall sqlite3_finalize failed!"
5111This.ErrorCode := ErrorLevel
5112Return False
5113}
5114If (RC) {
5115This.ErrorMsg := A_ThisFunc . ": " . This._ErrMsg()
5116This.ErrorCode := RC
5117Return False
5118}
5119Return True
5120}
5121}
5122SQLiteDB := new SQLiteDB
5123SQLiteDB.OpenDB(projectName . ".db")
5124if (!SQLiteDB.Exec("CREATE TABLE IF NOT EXISTS enemies (name VARCHAR(35), fraction TINYINT(2), updated INT(10), PRIMARY KEY (name));")) {
5125MsgBox, 16, SQLite Fehler, % "Es ist ein Fehler beim Erstellen der Gegner-Datenbank aufgetreten!`n`nFehlernachricht:`t" . SQLiteDB.ErrorMsg . "`nFehlercode:`t" . SQLiteDB.ErrorCode . "`n`nBitte melde dich bei Imperator im Forum!"
5126SQLiteDB.CloseDB()
5127ExitApp
5128}
5129if (!SQLiteDB.Exec("CREATE TABLE IF NOT EXISTS friends (name VARCHAR(35), added INT(10), PRIMARY KEY (name));")) {
5130MsgBox, 16, SQLite Fehler, % "Es ist ein Fehler beim Erstellen der Freunde-Datenbank aufgetreten!`n`nFehlernachricht:`t" . SQLiteDB.ErrorMsg . "`nFehlercode:`t" . SQLiteDB.ErrorCode . "`n`nBitte melde dich bei Imperator im Forum!"
5131SQLiteDB.CloseDB()
5132ExitApp
5133}