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