· 6 years ago · Nov 15, 2019, 05:34 PM
1#NoTrayIcon
2
3
4; ####################
5; #### SAMP UDF R16 ####
6; SAMP Version: 0.3.7 R1
7; Written by Chuck_Floyd
8; https://github.com/FrozenBrain
9; Modified by Suchty112
10; https://github.com/Suchty112
11; Modified by: paul-phoenix
12; https://github.com/paul-phoenix
13; Modified by: Agrippa1994
14; https://github.com/agrippa1994
15; Modified by: RawDev and ELon
16; Modified by: democrazy
17; CM Version: http://cheat-master.ru/forum/149-619860-1
18; Обновление от 04.08.2018
19; Дополнял: MurKotik
20; Дополнял: McFree
21; Дополнял: aknqkzxlcs
22; Дополнял: Godarck
23; Дополнял: Слюнявчик
24; Дополнял: MrGPro
25; Дополнял: Phoenixxx_Czar
26; Дополнял: Dworkin
27; Дополнял: Ghost29
28; Дополнял: slavawar
29; Дополнял: Artur_iOS
30; Дополнял: ByNika
31; Перевёл: I_Qwerty_I
32; Do not remove these lines.
33; Не удаляйте пожалуйста авторов
34; ####################
35; http://rebres.ru/SAMP-UDF-Developer.ahk
36; DLL API библиотека: http://rebres.ru/AutoHotKey/Include SA-MP API AutoHotKey.rar
37; Samp Dop Function: http://rebres.ru/AutoHotKey/SAMP-Dop-Function.ahk
38; Библиотека dx9_overlay: http://rebres.ru/AutoHotKey/dx9_overlay for AHK.rar
39
40
41
42; Samp-udf-addon
43global ADDR_SET_POSITION := 0xB7CD98
44global ADDR_SET_POSITION_OFFSET := 0x14
45global ADDR_SET_POSITION_X_OFFSET := 0x30
46global ADDR_SET_POSITION_Y_OFFSET := 0x34
47global ADDR_SET_POSITION_Z_OFFSET := 0x38
48global ADDR_SET_INTERIOR_OFFSET := 0xB72914
49global SAMP_SZIP_OFFSET := 0x20
50;~ global SAMP_SZHOSTNAME_OFFSET := 0x121
51global SAMP_INFO_SETTINGS_OFFSET := 0x3C5
52global SAMP_DIALOG_LINENUMBER_OFFSET := 0x140
53
54; ErrorLevels
55global ERROR_OK := 0
56global ERROR_PROCESS_NOT_FOUND := 1
57global ERROR_OPEN_PROCESS := 2
58global ERROR_INVALID_HANDLE := 3
59global ERROR_MODULE_NOT_FOUND := 4
60global ERROR_ENUM_PROCESS_MODULES := 5
61global ERROR_ZONE_NOT_FOUND := 6
62global ERROR_CITY_NOT_FOUND := 7
63global ERROR_READ_MEMORY := 8
64global ERROR_WRITE_MEMORY := 9
65global ERROR_ALLOC_MEMORY := 10
66global ERROR_FREE_MEMORY := 11
67global ERROR_WAIT_FOR_OBJECT := 12
68global ERROR_CREATE_THREAD := 13
69
70; GTA Addresses
71global ADDR_ZONECODE := 0xA49AD4 ;Player Zone
72global ADDR_POSITION_X := 0xB6F2E4 ;Player X Position
73global ADDR_POSITION_Y := 0xB6F2E8 ;Player Y Position
74global ADDR_POSITION_Z := 0xB6F2EC ;Player Z Position
75global ADDR_CPED_PTR := 0xB6F5F0 ;Player CPED Pointer
76global ADDR_CPED_HPOFF := 0x540 ;Player Health
77global ADDR_CPED_ARMOROFF := 0x548 ;Player Armour
78global ADDR_CPED_MONEY := 0x0B7CE54 ;Player Money
79global ADDR_CPED_INTID := 0xA4ACE8 ;Player Interior-ID
80global ADDR_CPED_SKINIDOFF := 0x22 ;Player Skin-ID
81;
82global ADDR_VEHICLE_PTR := 0xBA18FC ;Vehicle CPED Pointer
83global ADDR_VEHICLE_HPOFF := 0x4C0 ;Vehicle Health
84global ADDR_VEHICLE_DOORSTATE := 0x4F8 ;Vehicle Door Status
85global ADDR_VEHICLE_ENGINESTATE := 0x428 ;Vehicle Engine Status
86global ADDR_VEHICLE_SIRENSTATE := 0x1069
87global ADDR_VEHICLE_SIRENSTATE2 := 0x1300
88global ADDR_VEHICLE_LIGHTSTATE := 0x584 ;Vehicle Light Status
89global ADDR_VEHICLE_MODEL := 0x22 ;Vehicle Car-ID & Car-Name
90global ADDR_VEHICLE_TYPE := 0x590 ;Vehicle Typ-ID (1 = Car)
91global ADDR_VEHICLE_DRIVER := 0x460 ;Vehicle Driver
92global ADDR_VEHICLE_X := 0x44 ;Vehicle Speed X
93global ADDR_VEHICLE_Y := 0x48 ;Vehicle Speed Y
94global ADDR_VEHICLE_Z := 0x4C ;Vehicle Speed Z
95global oAirplaneModels := [417, 425, 447, 460, 469, 476, 487, 488, 497, 511, 512, 513, 519, 520, 548, 553, 563, 577, 592, 593]
96global oBikeModels := [481,509,510]
97global 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"]
98global 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","21Desert 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"]
99global 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"]
100global 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"]
101Global oWeaponIdForModel := {1:331, 2:333, 3:334, 4:335, 5:336, 6:337, 7:338, 8:339, 9:341, 10:321, 11:322, 12:323, 13:324, 14:325, 15:326, 16:342, 17:343, 18:344, 22:346, 23:347, 24:348, 25:349, 26:350, 27:351, 28:352, 29:353, 30:355, 31:356, 32:372, 33:357, 34:358, 35:359, 36:360, 37:361, 38:362, 39:363, 40:364, 41:365, 42:366, 43:367, 44:368, 45:369, 46:371}
102
103; SAMP Адреса
104global ADDR_SAMP_INCHAT_PTR := 0x21a10c
105global ADDR_SAMP_INCHAT_PTR_OFF := 0x55
106global ADDR_SAMP_USERNAME := 0x219A6F
107global FUNC_SAMP_SENDCMD := 0x65c60
108global FUNC_SAMP_SENDSAY := 0x57f0
109global FUNC_SAMP_ADDTOCHATWND := 0x64520
110global ADDR_SAMP_CHATMSG_PTR := 0x21a0e4
111global FUNC_SAMP_SHOWGAMETEXT := 0x9c2c0
112global FUNC_SAMP_PLAYAUDIOSTR := 0x62da0
113global FUNC_SAMP_STOPAUDIOSTR := 0x629a0
114; ########################## Стили Диалога ##########################
115global DIALOG_STYLE_MSGBOX := 0
116global DIALOG_STYLE_INPUT := 1
117global DIALOG_STYLE_LIST := 2
118global DIALOG_STYLE_PASSWORD := 3
119global DIALOG_STYLE_TABLIST := 4
120global DIALOG_STYLE_TABLIST_HEADERS := 5
121; ######################### Структуры диалога #########################
122global SAMP_DIALOG_STRUCT_PTR := 0x21A0B8
123global SAMP_DIALOG_PTR1_OFFSET := 0x1C
124global SAMP_DIALOG_LINES_OFFSET := 0x44C
125global SAMP_DIALOG_INDEX_OFFSET := 0x443
126global SAMP_DIALOG_BUTTON_HOVERING_OFFSET := 0x465
127global SAMP_DIALOG_BUTTON_CLICKED_OFFSET := 0x466
128global SAMP_DIALOG_PTR2_OFFSET := 0x20
129global SAMP_DIALOG_LINECOUNT_OFFSET := 0x150
130global SAMP_DIALOG_OPEN_OFFSET := 0x28
131global SAMP_DIALOG_STYLE_OFFSET := 0x2C
132global SAMP_DIALOG_ID_OFFSET := 0x30
133global SAMP_DIALOG_TEXT_PTR_OFFSET := 0x34
134global SAMP_DIALOG_CAPTION_OFFSET := 0x40
135global FUNC_SAMP_SHOWDIALOG := 0x6B9C0
136global FUNC_SAMP_CLOSEDIALOG := 0x6C040
137global FUNC_UPDATESCOREBOARD := 0x8A10
138global SAMP_INFO_OFFSET := 0x21A0F8
139global ADDR_SAMP_CRASHREPORT := 0x5CF2C
140global SAMP_PPOOLS_OFFSET := 0x3CD
141global SAMP_PPOOL_PLAYER_OFFSET := 0x18
142global SAMP_SLOCALPLAYERID_OFFSET := 0x4
143global SAMP_ISTRLEN_LOCALPLAYERNAME_OFFSET := 0x1A
144global SAMP_SZLOCALPLAYERNAME_OFFSET := 0xA
145global SAMP_PSZLOCALPLAYERNAME_OFFSET := 0xA
146global SAMP_PREMOTEPLAYER_OFFSET := 0x2E
147global SAMP_ISTRLENNAME___OFFSET := 0x1C
148global SAMP_SZPLAYERNAME_OFFSET := 0xC
149global SAMP_PSZPLAYERNAME_OFFSET := 0xC
150global SAMP_ILOCALPLAYERPING_OFFSET := 0x26
151global SAMP_ILOCALPLAYERSCORE_OFFSET := 0x2A
152global SAMP_IPING_OFFSET := 0x28
153global SAMP_ISCORE_OFFSET := 0x24
154global SAMP_ISNPC_OFFSET := 0x4
155global SAMP_PLAYER_MAX := 1004
156global SAMP_KILLSTAT_OFFSET := 0x21A0EC
157global multVehicleSpeed_tick := 0
158global CheckpointCheck := 0xC7DEEA
159global rmaddrs := [0xC7DEC8, 0xC7DECC, 0xC7DED0]
160
161; Sizes
162global SIZE_SAMP_CHATMSG := 0xFC
163; Internal
164global hGTA := 0x0
165global dwGTAPID := 0x0
166global dwSAMP := 0x0
167global pMemory := 0x0
168global pParam1 := 0x0
169global pParam2 := 0x0
170global pParam3 := 0x0
171global pParam4 := 0x0
172global pParam5 := 0x0
173global pInjectFunc := 0x0
174global nZone := 1
175global nCity := 1
176global bInitZaC := 0
177global iRefreshScoreboard := 0
178global oScoreboardData := ""
179global iRefreshHandles := 0
180global iUpdateTick := 2500 ; Время в мс, используемое в функциях getPlayerNameById и др. для обновления данных. По умолчанию 2500 (2.5 сек)
181; ###############################################################################################################################
182; # #
183; # Функции для взаимодействия с клиентом SAMP #
184; # - IsSAMPAvailable() - Возвращает состояние SAMP (0 - Запущен, 1 - Выключен) #
185; # - isInChat() - Проверяет открыт ли чат (0 - нет, 1 - да) #
186; # - getUsername() - Возвращает ник локального игрока #
187; # - getId() - Возвращает id локального игрока #
188; # - SendChat(wText) - Отправка сообщения/команды серверу #
189; # - addChatMessage(wText) - Локальное сообдещие в чат #
190; # - showGameText(wText, dwTime, dwTextsize) - Отоброжение Game Text #
191; # - playAudioStream(wUrl) - Воспроизведение аудиопотока #
192; # - stopAudioStream() - Остановка аудиопотока #
193; # - GetChatLine(Line, Output) - Вывод строки из чат лога (0 - Последняя строка) #
194; # - blockChatInput() - Блокировка отправления сообщений серверу #
195; # - unBlockChatInput() - Разблокировка отправлений сообщений серверу #
196; # #
197; # --------------------------------------------------------------------------------------------------------------------------- #
198; # #
199; # - getServerName() - Возвращает название сервера #
200; # - getServerIP() - Возвращает IP сервера #
201; # - getServerPort() - Возвращает порт сервера #
202; # - CountOnlinePlayers() - Возвращает текущий онлайн на сервере #
203; # #
204; # --------------------------------------------------------------------------------------------------------------------------- #
205; # #
206; # - getWeatherID() - Возвращает ID текущей погоды #
207; # - getWeatherName() - Возвращает название текущей погоды #
208; # #
209; # --------------------------------------------------------------------------------------------------------------------------- #
210; # #
211; # - patchRadio() - Включает патч для аудиопотока #
212; # - unPatchRadio() - Выключает патч для аудиопотока #
213; # #
214; ###############################################################################################################################
215; # Функции для взаимодействия с диалогами (v.0.3.7) #
216; # --------------------------------------------------------------------------------------------------------------------------- #
217; # - isDialogOpen() - Проверяет открыт ли диалог #
218; # - getDialogStyle() - Возвращает id стиля диалога #
219; # - getDialogID() - Возвращает id диалога (исходя из данных сервера) #
220; # - setDialogID(id) - Изменение ID диалога #
221; # - getDialogCaption() - Возвращает заголовок диалога #
222; # - getDialogText() - Возвращает текст диалога #
223; # - getDialogLineCount() - Возвращает количество строк диалога #
224; # - getDialogLine(index) - Возвращает содержимое строки по номеру #
225; # - getDialogLines() - Возвращает массив строк диалога #
226; # - getDialogStructPtr() - Возвращает указатель на структуру диалога #
227; # - showDialog(style, caption, text, button1, button2, id) - Создание локального диалога #
228; ###############################################################################################################################
229; # #
230; # Функции для взаимодействия с игроками #
231; # - getTargetPed(dwPED) - Возвращает PED ID, по таргету #
232; # - getPedById(dwId) - Возвращает PED ID по id игрока #
233; # - getIdByPed(dwId) - Возвращает id игрока по PED #
234; # - getStreamedInPlayersInfo() - Возвращает объект, хранящий информацию об игроках в зоне стрима #
235; # - callFuncForAllStreamedInPlayers(cfunc) - Вызывает функцию отображающую всю информации о игроках в зоне стрима #
236; # - getDist(pos1, pos2) - Возвращает растояние между двумя точками #
237; # - getClosestPlayerPed() - Возвращает PED ID ближайшего игрока #
238; # - getClosestPlayerId() - Возвращает id ближайшего игрока #
239; # - getPedCoordinates(dwPED) - Возвращает кординаты (в зоне стрима) по PED ID #
240; # - getTargetPosById(dwId) - Возвращает позицию игрока по id #
241; # - getTargetPlayerSkinIdByPed(dwPED) - Возвращает id скина по PED ID #
242; # - getTargetPlayerSkinIdById(dwId) - Возвращает id скина по id игрока #
243; # - calcScreenCoors(fX,fY,fZ) - Возвращает массив координат [fX,fY,fZ] относительно экрана #
244; # #
245; # Функции для взаимодействия с транспортом: #
246; # - getVehiclePointerByPed(dwPED) - Возвращает указатель на транспорт по PED ID #
247; # - getVehiclePointerById(dwId) - Возвращает указатель на транспорт по id игрока #
248; # - isTargetInAnyVehicleByPed(dwPED) - Проверяет находится ли игрок в транспорте по PED ID #
249; # - isTargetInAnyVehicleById(dwId) - Проверяет находится ли игрок в транспорте по id игрока #
250; # - getTargetVehicleHealthByPed(dwPED) - Возвращает hp транспорта по PED ID #
251; # - getTargetVehicleHealthById(dwId) - Возвращает hp транспорта по id игрока #
252; # - getTargetVehicleTypeByPed(dwPED) - Возвращает тип транспорта по PED ID (возвращает число, а не название) #
253; # - getTargetVehicleTypeById(dwId) - Возвращает тип транспорта по id игрока (возвращает число, а не название) #
254; # - getTargetVehicleModelIdByPed(dwPED) - Возвращает номер модели транспорта по PED ID #
255; # - getTargetVehicleModelIdById(dwId) - Возвращает номер модели транспорта по id игрока #
256; # - getTargetVehicleModelNameByPed(dwPED) - Возвращает название модели транспорта по PED ID #
257; # - getTargetVehicleModelNameById(dwId) - Возвращает название модели транспорта по id игрока #
258; # - getTargetVehicleLightStateByPed(dwPED) - Возвращает состояние света транспорта по PED ID (вкл./выкл.) #
259; # - getTargetVehicleLightStateById(dwId) - Возвращает состояние света транспорта по id игрока (вкл./выкл.) #
260; # - getTargetVehicleEngineStateByPed(dwPED) - Возвращает состояние мотора транспорта по PED ID (вкл./выкл.) #
261; # - getTargetVehicleEngineStateById(dwId) - Возвращает состояние мотора транспорта по id игрока (вкл./выкл.) #
262; # - getTargetVehicleLockStateByPed(dwPED) - Возвращает состояние дверей транспорта по PED ID (закрыты/открыты) #
263; # - getTargetVehicleLockStateById(dwId) - Возвращает состояние дверей транспорта по id игрока (закрыты/открыты) #
264; # - getTargetVehicleColor1ByPed(dwPED) - Возвращает 1-й цвет транспорта по PED ID #
265; # - getTargetVehicleColor1ById(dwId) - Возвращает 1-й цвет транспорта по id игрока #
266; # - getTargetVehicleColor2ByPed(dwPED) - Возвращает 2-й цвет транспорта по PED ID #
267; # - getTargetVehicleColor2ById(dwId) - Возвращает 2-й цвет транспорта по id игрока #
268; # - getTargetVehicleSpeedByPed(dwPED) - Возвращает текущую скорость транспорта по PED ID #
269; # - getTargetVehicleSpeedById(dwId) - Возвращает текущую скорость транспорта по id игрока #
270; # #
271; ###############################################################################################################################
272; # #
273; # Функции для взаимодейтвия с общим списком игроков (Tab): #
274; # - getPlayerScoreById(dwId) - Возвращает уровень игрока по id #
275; # - getPlayerPingById(dwId) - Возвращает ping игрока по id #
276; # - getPlayerNameById(dwId) - Возвращает ник игрока по id #
277; # - getPlayerIdByName(wName) - Возвращает id игрока по нику #
278; # - updateScoreboardDataEx() - Обновление данных Tab'a #
279; # - updateOScoreboardData() - Обновление данных игроков на сервере #
280; # - isNPCById(dwId) - Проверяет является ли персонаж NPC по id #
281; # #
282; ###############################################################################################################################
283; # #
284; # Функции для взаимодействия с локальным игроком: #
285; # - getPlayerHealth() - Возвращает hp локального игрока #
286; # - getPlayerArmour() - Возвращает количество брони локального игрока #
287; # - getPlayerInteriorId() - Возвращает id интерьера #
288; # - getPlayerSkinId() - Возвращает id скина локального игрока #
289; # - getPlayerMoney() - Возвращает количество денег на руках у локального игрока #
290; # - getPlayerWanteds() - Возвращает уровень розыска локального игрока #
291; # - getPlayerWeaponId() - Возвращает id оружия в руках у локального игрока #
292; # - getPlayerWeaponName() - Возвращает название оружия в руках у локального игрока #
293; # - getPlayerState() - Возвращает состояние локального игрока (возвращает число) #
294; # - getPlayerMapPosX() - Возвращает X позицию на карте (Esc > Карта) локального игрока #
295; # - getPlayerMapPosY() - Возвращает Y позицию на карте (Esc > Карта) локального игрока #
296; # - getPlayerMapZoom() - Возвращает коэф. увеличения карты (Esc > Карта) локального игрока #
297; # - IsPlayerFreezed() - Проверяет заморожен ли локальний игрок #
298; # #
299; ###############################################################################################################################
300; # #
301; # Функции для взаимодействия с текущим транспортом: #
302; # - isPlayerInAnyVehicle() - Проверяет находится ли локальный игрок в транспорте (любом) #
303; # - getVehicleHealth() - Возвращает hp текущего транспорта #
304; # - isPlayerDriver() - Проверяет является ли локальный игрок водителем #
305; # - getVehicleType() - Возвращает тип текущего транспорта #
306; # - getVehicleModelId() - Возвращает номер модели текущего транспорта #
307; # - getVehicleModelName() - Возвращает название модели текущего транспорта #
308; # - getVehicleLightState() - Возвращает состояние света текущего транспорта (вкл./выкл.) #
309; # - getVehicleEngineState() - Возвращает состояние мотора текущего транспорта (вкл./выкл.) #
310; # - getVehicleLockState() - Возвращает состояние дверей текущего транспорта #
311; # - getVehicleColor1() - Возвращает 1-й цвет текущего транспорта #
312; # - getVehicleColor2() - Возвращает 2-й цвет текущего транспорта #
313; # - getVehicleSpeed() - Возвращает текущую скорость текущего транспорта #
314; # - getPlayerRadiostationID() - Возвращает номер радиостанции текущего транспорта #
315; # - getPlayerRadiostationName() - Возвращает название радиостанции текущего транспорта #
316; # #
317; ###############################################################################################################################
318; # #
319; # Функции для взаимодействия с координатами: #
320; # - getCoordinates() - Возвращает массив координат [fX,fY,fZ] локального игрока #
321; # - getPlayerPos(X,Y,Z) - Возвращает координаты локального игрока в указанные перменные #
322; # #
323; # --------------------------------------------------------------------------------------------------------------------------- #
324; # #
325; # - initZonesAndCities() - Инициализация районов и городов карты #
326; # - calculateZone(X, Y, Z) - Возвращает название района по координатам #
327; # - calculateCity(X, Y, Z) - Возвращает название города по координатам #
328; # - getCurrentZonecode() - ..:: НЕ РАБОТАЕТ ::.. #
329; # - AddZone(Name, X1, Y1, Z1, X2, Y2, Z2) - Добавление нового района #
330; # - AddCity(Name, X1, Y1, Z1, X2, Y2, Z2) - Добавление нового города #
331; # - IsPlayerInRangeOfPoint(X, Y, Z, Radius) - Проверяет находится ли локальный игрок в радиусе 3D координат #
332; # - IsIsPlayerInRangeOfPoint2D(X, Y, Radius) - Проверяет находится ли локальный игрок в радиусе 2D координат #
333; # - getPlayerZone() - Возвращает название района локального игрока #
334; # - getPlayerCity() - Возвращает название района локального игрока #
335; # #
336; ###############################################################################################################################
337; # Sonstiges: #
338; # - checkHandles() #
339; # - AntiCrash() - AntiCrash #
340; ###############################################################################################################################
341; # Функции для взаимодействия с памятью (внутренние функции): #
342; # - checkHandles() #
343; # - refreshGTA() #
344; # - refreshSAMP() #
345; # - refreshMemory() #
346; # - getPID(szWindow) #
347; # - openProcess(dwPID, dwRights) #
348; # - closeProcess(hProcess) #
349; # - getModuleBaseAddress(sModule, dwPID) #
350; # - readString(hProcess, dwAddress, dwLen) #
351; # - readFloat(hProcess, dwAddress) #
352; # - readDWORD(hProcess, dwAddress) #
353; # - readMem(hProcess, dwAddress, dwLen=4, type="UInt") #
354; # - writeString(hProcess, dwAddress, wString) #
355; # - writeRaw(hProcess, dwAddress, data, dwLen) #
356; # - Memory_ReadByte(process_handle, address) #
357; # - callWithParams(hProcess, dwFunc, aParams, bCleanupStack = true) #
358; # - virtualAllocEx(hProcess, dwSize, flAllocationType, flProtect) #
359; # - virtualFreeEx(hProcess, lpAddress, dwSize, dwFreeType) #
360; # - createRemoteThread(hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, #
361; # - dwCreationFlags, lpThreadId) #
362; # - waitForSingleObject(hThread, dwMilliseconds) #
363; # - __ansiToUnicode(sString, nLen = 0) #
364; # - __unicodeToAnsi(wString, nLen = 0) #
365; ###############################################################################################################################
366; # by MurKotik #
367; # - setCoordinates(x, y, z, Interior) - Изменяет координаты локальному игроку #
368; # - setIP(IP) - Изменяет IP сервера (Не доработано) #
369; # - setUsername(username) - Изменяет ник (Не доработано) #
370; # - colorhud(color) - Изменяет зелёный цвет в игре на указаный #
371; # - setTime(hour) - Изменяет времени на сервере (визуально) #
372; # - getSkinID() - Возвращает ID Скина локального игрока #
373; # - getDialogTitle() - Возвращает заголовок последнего диалога #
374; # - getPlayerColor(id) - Возвращает ID цвета ника игрока по id игрока #
375; # - setPlayerColor(id,color) - Изменяет цвет ника игроку по id игрока #
376; # - colorToStr(color) - Конвертация цвета из десятичной в шестнадцатиричную систему измерения #
377; # - getWeaponId() - Возвращает ID оружия локального персонажа #
378; # - restartGameEx() - Рестарт игры (Не отключает от сервера) #
379; # - setrestart() - Изменяет состояние игрока на Restart (Переподключение к серверу) #
380; # - disconnectEx() - Отключение от сервера #
381; # - WriteProcessMemory(title,addresse,wert,size) - Работа с пресетам #
382; # - FloatToHex(value) - Перевод из Float в Hex #
383; # - IntToHex(int) - Перевод из Int в Hex #
384; # - HexToDec(str) - Перевод из Hex в Dec (Строковых значений) #
385; # - addChatMessageEx(Color, wText) - Локальное сообщение с изменением цвета timestamp'a #
386; # - connect(IP) - Подключение к серверу по IP (Пока что без смены Порта) #
387; # - setWeather(id) - Изменяет погоду (визуально) #
388; # - setPlayerFreeze(status) - Изменяет статус заморозки (0 - разморозка, 2 - заморозка) #
389; # - GetVehicleNumberPlate() - #
390; # by McFree #
391; # - getPlayerPosById(dwId) - Возвращает позицию игрока по id игрока #
392; # - HexToDecOne(Hex) - Перевод из Hex в Dec #
393; # - HexToDecTwo(Hex) - Перевод шестнадцатиричного числа в десятичное #
394; # - hex2rgb(CR) - Перевод шестнадцатиричного цвета в rgb строку (255,255,255) #
395; # - rgb2hex(R, G, B) - Перевод RGB цвета в шестнадцатиричное значение (FFFFFF) #
396; # - ProcessWriteMemory(Str ,addresse, process, Str, byte) - Запись в память #
397; # - ProcessReadMemory(address, processIDorName, type, numBytes) - Чтение из памяти #
398; # - GetCoordsSamp(ByRef ResX, ByRef ResY) - Перевод кординат монитора на кординаты SA-MP #
399; # - getZoneByName(zName, ByRef CurZone) - Возвращает координаты зоны по имени #
400; # - getCenterPointToZone(zName, ByRef PointPos)- Возвращает координаты центра зоны по имени #
401; # by Godarck #
402; # - GetInterior() - Проверяет находится ли персонаж в интерьере (true/false) #
403; # - getVehicleSirenState() - Проверяет в ключена ли сирена (true/false) #
404; # - CoordsFromRedmarker() - Возвращает координаты метки с карты. #
405; # - NearPlayerInCar(dist) - Определяет игрока в автомобиле рядом #
406; # - isTargetDriverbyId(dwId) - Проверяет является ли игрок водителем т/с по id #
407; # - ConvertCarColor(Color) - Конвертация цвета в RGB для getVehicleColor1() и getVehicleColor2() #
408; # By Unknown #
409; # - disableCheckpoint() - Отключает маркер на карте (Disable RED Marker on map) #
410; # - setCheckpoint(xpos,ypos,zpos,Radius) - Устанавливает маркер на карте #
411; # By MrGPro #
412; # - getServerHour() - Возвращает минуты по серверному времени (Только серверах где отображается)#
413; # - getServerMinute() - Возвращает часы по серверному времени (Только серверах где отображается) #
414; # - getVehicleIdServer() - Возвращает ID транспорта на сервере в который сидит локальный игрок #
415; # By Слюнявчик #
416; # - IsInAFK() - Проверяет находится ли локальный игрока в AFK #
417; # (1 - AFK, 0 - не AFK, -1 - Игра закрыта) #
418; # By Phoenixxx_Czar #
419; # - isPlayerInStreamById(player_id [, dist]) - Определяет есть ли игроки на заданной дистации от вас #
420; # - getDialogLineNumber() - Замена, в случае не работоспособности getDialogIndex() #
421; # - getsexbyskin(skin) - Выдает пол по иду скина (0 - Ошибка, 1 - Мужской, 2 - Женский) #
422; # - GetWeaponIDforModel(model) - Выдает ид оружия по его модели. #
423; # By aknqkzxlcs #
424; # - setPlayerName(playerid, newnick) - Визуальная смена Ника игрока по id (над головой и в табе) #
425; # - getDialogIndex() - Возвращает индекс выбранной строки, начиная с 1 #
426; # - isDialogButtonSelected(Button id) - Наведена ли мышка на кнопку или была ли кнопка нажата (id: 1 или 2) #
427; # - set_player_armed_weapon_to(weaponid) - Меняет оружие в руках на указанное путем перелистывания #
428; # - setPlayerHealth(float) - Установить уровень ХП персонажу (Пример данных: float := 50.0) #
429; # - setPlayerArmor(float) - Установить уровень брони персонажу #
430; # - setVehicleHealth(float) - Установить уровень ХП автомобилю #
431; # - getPlayerAnim() - Возвращает ID текущей анимации #
432; # - toggleUnlimitedAmmo() - Бесконечные патроны #
433; # - toggleNoReload() - Стрельба без перезарядки #
434; # - toggleNoRecoil() - Стрельба без отдачи #
435; # - getKillStat() - Возвращает киллстат в виде массива из 5 строк #
436; # - getLastDamagePed(playerid, weapon) - Получить ид того игрока, который тебя дамажил последним #
437; # - toggleAntiBikeFall() - не падать с байка #
438; # - toggleAntiCarEject() - вас не могут выкинуть из машины #
439; # - toggleNoAnimations() - анимации не отображаются #
440; # - toggleObjectDrawMode() - курсор для отображения информации о streamer объектах на сервере #
441; # - toggleMotionBlur() - размытость при движении на большой скорости как в сингле #
442; # - toggleNoDamageByWeapon() - вкл/выкл невосприимчивость к пулям #
443; # - toggleInvulnerability() - вкл/выкл неуязвимость #
444; # - isPlayerCrouch() - Положение персонажа (1 - сидит, 0 - стоит) #
445; # - multVehicleSpeed(1.1) - Спидхак, ставится в цикл. Чем выше цифра, тем сильнее пинок под зад #
446; # - setFireImmunity(state) - Установить иммунитет к огню (0 - выкл, 1 - не гореть в огне) #
447; # - setInfiniteRun(state) - бесконечный бег (0 выкл / 1 вкл) #
448; # - isMarkerSetup() - Установлена ли метка на карте #
449; # - setDialogState(state) - Свернуть / развернуть диалог 0 - Скрыть 1 - Развернуть #
450; # - blurlevel() - Выдаёт / устанавливает уровень размытости пример - blurlevel(level) #
451; # - getWeaponAmmo() - Возвращает общее количество патрон в текущем оружии #
452; # - gmpatch() - by FYP, отключает встроенный клиентский античит на бессмертие #
453; # - getVehicleMaxPassengers() - Максимальное количество пассажирских мест в текущем транспорте #
454; # - getVehiclePassenger(место) - Возвращает CPed pointer пассажира/водителя #
455; # - getVehiclePassengerId(место) - возвращает id пассажира/водителя места: 0 водительское, 1-8 пассажирские #
456; # - writeBytes(hProcess, dwAddress, bytes) - записать несколько байтов по адресу (служебная функция) #
457; # - setChatState(state) - установить состояние чату (от 0 до 2) #
458; # - getChatState() - состояние видимости чата (0 - спрятан, 1 - без контура, 2 - с контуром) #
459; # - getChatLineEx(line = 0) - Читает чат из памяти, а не из чатлога #
460; # - removeChatLine(line = 0) - Удаляет строку из чата #
461; # - NOP_SetPlayerPos() - Если включен, то сервер не может вас телепортировать куда-либо #
462; # - getChatLineColor(line, isHex) - возвращает цвет строки #
463; # - setChatLineColor(color, line) - установить цвет строки #
464; # - getChatLineTimestamp(line, isUnixtime) - возвращает временную отметку строки чата #
465; # - setChatLineTimestamp(timestamp, line) - установить время для строки чата (только в unixtime) #
466; # - CJ() - установить себе скин СJ #
467; # - getTargetPlayerWeaponModel(player) - Возвращает имя оружия игрока #
468; # - getTargetPlayerHealth(player) - Возвращает количество ХП игрока #
469; # - getTargetPlayerArmour(player) - Возвращает количество брони игрока #
470; # - setDialogIndex(index) - Устанавливает активную строку в диалоге #
471; # By Dworkin #
472; # - getCameraCoordinates() - Получение координаты вашей камеры #
473; # - GetBonePosition(ped,boneId) - Получение координат костей по педу. #
474; # - IsLineOfSightClear(startX,startY,startZ,endX,endY,endZ,bCheckBuildings, bCheckVehicles, bCheckPeds, bCheckObjects, bCheckDummies, bSeeThroughStuff, bIgnoreSomeObjectsForCamera) определяет нет ли между двумя точками объектов. #
475; # - IsPlayerVisible(ped) - находится ли пед у вас в зоне экрана(вышей камеры) даже если он за объектами. #
476; # - getGameScreenWidthHeight() - Выдаёт текущее разрешения экрана выставленного в игре.
477; # - AntiPause() - Запрещает уход игры на паузу в свёрнутои режиме #
478; # - UnlockFps(status) - Отключение блокировки ограничения FPS 100 #
479; # By Ghost29 #
480; # - togglekillstat(state) - Переключает киллстат. (1 - вкл, 0 - выкл) #
481; # - setkillstatwidth(width) - Ширина между строками киллстата #
482; # - movekillstat(x) - Двигает киллстат по Х #
483; # - setdistkillstat(int) - Расстояние между правым столбиком и иконкой гана #
484; # - PrintLow(text, time) - Выводит текст внизу экрана. Поддерживает форматирование типа ~g~ / ~n~ #
485; # By slavawar #
486; # - WallHack() - Активация ВХ (Даёт возможностость видеть противника сквозь стены) #
487; # - setCarNitro() - Установить в текующую машину нитро #
488; # - GetCameraRotation() - Выдает ротацию камеры #
489; # - NightVision(value) - Включает/выключает ночное визор #
490; # - ThermalVision(value) - Включает/выключает тепловой визор #
491; # - UnderWaterDrive(value) - Езда/ходьба под водой #
492; # - WaterDrive(value) - Ездить по воде, колёса боком #
493; # - GetGravity() - Выдает текущую гравитацию #
494; # - SetGravity(value) - Установить гравитацию #
495; # - noManyPanSpray(value) - Не нужно платить за починку, на рп серверах. #
496; # By Artur_iOS #
497; # - setPlayerWanted(level) - Установка уровня розыска #
498; # - getPlayerWanteds() - Выдаёт уровень розыска #
499; # - getPlayerFps(float := false) - Получить текущий FPS #
500; # By ByNika #
501; # - GetCheckDialogButton() - Выдаёт ноер последней нажатой кнопки в диалоге (Button) #
502; ###############################################################################################################################
503; # Аргументы для функции getWeaponAmmo(Ammo, Clip, Slot = -1)
504; # [1] Ammo - возвращает в указанную переменную общее количество патрон текущего оружия
505; # [2] Clip (необязательный) - возвращает в переменную количество патрон в магазине текущего оружия
506; # [3] Slot (необязательный) - если не указан, то возвращает количество патрон текущего оружия, иначе патроны оружия из указанного слота
507; # Подробнее: http://wiki.sa-mp.com/wiki/Weapons
508
509GetCheckDialogButton()
510{
511 if (isDialogOpen() == 1)
512 {
513 Loop
514 {
515 if (GetKeyState("LButton","P"))
516 {
517 Loop
518 {
519 if (isDialogButtonSelected(1) == 1)
520 {
521 while (isDialogOpen() = 0)
522 return 1
523 }
524 else if (GetKeyState("LButton","P"))
525 {
526 while (isDialogOpen() = 0)
527 return 1
528 }
529 else if (GetKeyState("Esc","P"))
530 {
531 while (isDialogOpen() = 0)
532 return 0
533 }
534 else if (GetKeyState("Enter","P"))
535 {
536 while (isDialogOpen() = 0)
537 return 1
538 }
539 else
540 {
541 while (isDialogOpen() = 0)
542 return 0
543 }
544 }
545 }
546 if (GetKeyState("Up","P") || GetKeyState("Down","P"))
547 {
548 Loop
549 {
550 if (isDialogButtonSelected(1) == 1)
551 {
552 while (isDialogOpen() = 0)
553 return 1
554 }
555 else if (GetKeyState("LButton","P"))
556 {
557 while (isDialogOpen() = 0)
558 return 1
559 }
560 else if (GetKeyState("Esc","P"))
561 {
562 while (isDialogOpen() = 0)
563 return 0
564 }
565 else if (GetKeyState("Enter","P"))
566 {
567 while (isDialogOpen() = 0)
568 return 1
569 }
570 else if (isDialogOpen() = 0)
571 return 0
572 }
573 }
574 else if (GetKeyState("Esc", "P") && GetKeyState("Enter", "U"))
575 {
576 while (isDialogOpen() = 0)
577 return 0
578 }
579 else if (GetKeyState("Enter", "P") && GetKeyState("Esc", "U"))
580 {
581 while (isDialogOpen() = 0)
582 return 1
583 }
584 else if (GetKeyState("Enter", "P"))
585 return 1
586 else if (GetKeyState("Esc", "P"))
587 return 0
588 else if (isDialogOpen() = 0)
589 return 1
590 }
591 }
592 if (isDialogOpen() == 0)
593 return 0
594}
595
596setPlayerWanted(level) {
597 if(!checkHandles())
598 return -1
599 return ProcessWriteMemory(level, 0x58DB60, "gta_sa.exe", "Byte", 1)
600}
601
602getPlayerFps(float := false) {
603 return (float ? ProcessReadMemory(0xB7CB50, "gta_sa.exe", "Float", 4):Round(ProcessReadMemory(0xB7CB50, "gta_sa.exe", "Float", 4)))
604}
605
606GetVehicleNumberPlate() {
607 if(!checkHandles())
608 return ""
609
610 dwVehPtr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
611 if(ErrorLevel || dwVehPtr==0) {
612 ErrorLevel := ERROR_READ_MEMORY
613 return ""
614 }
615
616 dwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET)
617 if(ErrorLevel || dwAddress==0) {
618 ErrorLevel := ERROR_READ_MEMORY
619 return ""
620 }
621
622 dwAddress := readDWORD(hGTA, dwAddress + SAMP_PPOOLS_OFFSET)
623 if(ErrorLevel || dwAddress==0) {
624 ErrorLevel := ERROR_READ_MEMORY
625 return ""
626 }
627
628 vehpool := readDWORD(hGTA, dwAddress + 0x1C)
629 if(ErrorLevel || vehpool==0) {
630 ErrorLevel := ERROR_READ_MEMORY
631 return ""
632 }
633
634 Loop, 2000
635 {
636 i := A_Index-1
637
638 listed := readDWORD(hGTA, vehpool + 0x3074 + i*4)
639 if(ErrorLevel) {
640 ErrorLevel := ERROR_READ_MEMORY
641 return ""
642 }
643
644 if(listed==0)
645 continue
646
647 svehptr := readDWORD(hGTA, vehpool + 0x4FB4 + i*4)
648 if(ErrorLevel) {
649 ErrorLevel := ERROR_READ_MEMORY
650 return ""
651 }
652
653 if(svehptr==dwVehPtr) {
654 sampveh := readDWORD(hGTA, vehpool + 0x1134 + i*4)
655 if(ErrorLevel || sampveh==0) {
656 ErrorLevel := ERROR_READ_MEMORY
657 return ""
658 }
659
660 plate := readString(hGTA, sampveh + 0x93, 32)
661 if(ErrorLevel) {
662 ErrorLevel := ERROR_READ_MEMORY
663 return ""
664 }
665
666 ErrorLevel := ERROR_OK
667 return plate
668 }
669 }
670
671 ErrorLevel := ERROR_OK
672 return ""
673}
674
675noManyPanSpray(value) {
676 If(!checkHandles())
677 return false
678 If(value) {
679 writeMemory(hGTA, 0x96C009, 0x1)
680 } else {
681 writeMemory(hGTA, 0x96C009, 0x0)
682 }
683}
684
685getWeaponAmmo(ByRef Ammo := "", ByRef Clip := "", slot := -1)
686{
687 if(!checkHandles())
688 return -1
689 if(!CPed := readDWORD(hGTA, ADDR_CPED_PTR))
690 return -1
691 if slot not between 0 and 12
692 {
693 VarSetCapacity(slot, 1)
694 DllCall("ReadProcessMemory", "UInt", hGTA, "UInt", CPed + 0x718, "Str", slot, "UInt", 1, "UInt*", 0)
695 slot := NumGet(slot, 0, "short")
696 if slot >= 12544
697 slot -= 12544
698 }
699 struct := CPed + 0x5AC
700 VarSetCapacity(Ammo, 4)
701 VarSetCapacity(Clip, 4)
702 DllCall("ReadProcessMemory", "UInt", hGTA, "UInt", struct + (0x1C * slot), "Str", Ammo, "UInt", 4, "UInt*", 0)
703 DllCall("ReadProcessMemory", "UInt", hGTA, "UInt", struct + (0x1C * slot) - 0x4, "Str", Clip, "UInt", 4, "UInt*", 0)
704 Ammo := NumGet(Ammo, 0, "int")
705 Clip := NumGet(Clip, 0, "int")
706 return Ammo
707}
708
709GetCameraRotation() {
710 If(!checkHandles())
711 return -1
712 return readFloat(hGTA, 0xB6F178)
713}
714
715NightVision(value) {
716 If(!checkHandles())
717 return false
718 If(value)
719 writeMemory(hGTA, 0xC402B8, 0x1)
720 else writeMemory(hGTA, 0xC402B8, 0x0)
721}
722
723setCarNitro() {
724 If(!checkHandles())
725 return -1
726 return writeMemory(hGTA, 0x969165, 0x1)
727}
728
729ThermalVision(value) {
730 If(!checkHandles())
731 return false
732 If(value)
733 writeMemory(hGTA, 0xC402B9, 0x1)
734 else writeMemory(hGTA, 0xC402B9, 0x0)
735}
736
737UnderWaterDrive(value) {
738 If(!checkHandles())
739 return false
740 If(value)
741 writeMemory(hGTA, 0x6C2759, 0x1)
742 else writeMemory(hGTA, 0x6C2759, 0x0)
743}
744
745WaterDrive(value) {
746 If(!checkHandles())
747 return false
748 If(value) {
749 writeMemory(hGTA, 0x969152, 0x1)
750 } else {
751 writeMemory(hGTA, 0x969152, 0x0)
752 }
753}
754
755GetGravity() {
756 If(!checkHandles())
757 return -1
758 return readFloat(hGTA, 0x863984)
759}
760
761SetGravity(value) {
762 If(!checkHandles())
763 return -1
764 writeMemory(hGTA, 0x863984, value, 4, "float")
765}
766
767;status: 1 - enable, 0 - disable
768UnlockFps(status) {
769 if(!checkHandles())
770 return false
771 if (status = 1) {
772 dwSAMP := getModuleBaseAddress("samp.dll", hGTA)
773 writeMemory(hGTA, dwSAMP + 0x9D9D0, 1347550997, 4, "UInt")
774 }
775 if (status = 0) {
776 dwSAMP := getModuleBaseAddress("samp.dll", hGTA)
777 writeMemory(hGTA, dwSAMP + 0x9D9D0, 4294417384, 4, "UInt")
778 }
779 return
780}
781
782AntiPause() {
783 if(!checkHandles())
784 return false
785 writeBytes(hGTA, 0x747FB6, "01")
786 writeBytes(hGTA, 0x74805A, "01")
787 writeBytes(hGTA, 0x74542B, "90909090909090")
788 writeBytes(hGTA, 0x74542C, "90909090909090")
789 writeBytes(hGTA, 0x74542D, "909090909090")
790 return
791}
792
793WallHack(tog := -1)
794{
795 if(!checkHandles())
796 return -1
797 byte := readMem(hGTA, dwSAMP + 0x70F1A, 1, "byte")
798 if((tog == -1 && byte == 232) || tog == true || tog == 1) {
799 writeBytes(hGTA, dwSAMP + 0x70F1A, "9090909090")
800 writeBytes(hGTA, dwSAMP + 0x6FE0A, "9090909090")
801 writeBytes(hGTA, dwSAMP + 0x70E24, "909090909090")
802 writeBytes(hGTA, dwSAMP + 0x6FD14, "909090909090")
803 return true
804 } else if((tog == -1 && byte == 144) || !tog) {
805 writeBytes(hGTA, dwSAMP + 0x70F1A, "E8B1AD0300")
806 writeBytes(hGTA, dwSAMP + 0x6FE0A, "E8C1BE0300")
807 writeBytes(hGTA, dwSAMP + 0x70E24, "0F8A71010000")
808 writeBytes(hGTA, dwSAMP + 0x6FD14, "0F8A50010000")
809 return false
810 }
811 return -1
812}
813
814getGameScreenWidthHeight() {
815 if(!checkHandles())
816 return false
817
818 Width := readDword(hGTA, 0xC9C040)
819 if(ErrorLevel) {
820 ErrorLevel := ERROR_READ_MEMORY
821 return ""
822 }
823
824 Height := readDword(hGTA, 0xC9C044)
825 if(ErrorLevel) {
826 ErrorLevel := ERROR_READ_MEMORY
827 return ""
828 }
829
830 ErrorLevel := ERROR_OK
831 return [Width, Height]
832}
833
834GetWeaponIDforModel(model)
835{
836 for iID, iModelId in oWeaponIdForModel
837 if (iModelId == model)
838 return iID
839 return 0
840}
841
842setDialogIndex(index)
843{
844 dwPointer := getDialogStructPtr()
845 if (ErrorLevel || !dwPointer)
846 return false
847
848 dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_PTR2_OFFSET)
849 if (ErrorLevel) {
850 ErrorLevel := ERROR_READ_MEMORY
851 return false
852 }
853
854 return writeMemory(hGTA, dwPointer + 0x143, index - 1, 1, "Byte")
855}
856
857IsLineOfSightClear(startX,startY,startZ,endX,endY,endZ,bCheckBuildings, bCheckVehicles, bCheckPeds, bCheckObjects, bCheckDummies, bSeeThroughStuff, bIgnoreSomeObjectsForCamera) {
858 if(!checkHandles())
859 return 0
860 dwFunc := 0x56A490
861 dwLen := 59
862 VarSetCapacity(injectData, dwLen, 0)
863 ; buffer fur die 2 Positionen erstellen
864 ; 3*float = 12 *2
865 VarSetCapacity(vectors, 24, 0)
866 NumPut(startX, vectors, 0, "Float")
867 NumPut(startY, vectors, 4, "Float")
868 NumPut(startZ, vectors, 8, "Float")
869 NumPut(endX, vectors, 12, "Float")
870 NumPut(endY, vectors, 16, "Float")
871 NumPut(endZ, vectors, 20, "Float")
872 ; Vectoren in den reservierten Bereich schreiben, damit darauf zugegriffen werden kann
873 writeRaw(hGTA, pParam1, &vectors, 24)
874 ; push
875 NumPut(0x68, injectData, 0, "UChar")
876 NumPut(bIgnoreSomeObjectsForCamera, injectData, 1, "UInt")
877 NumPut(0x68, injectData, 5, "UChar")
878 NumPut(bSeeThroughStuff, injectData, 6, "UInt")
879 NumPut(0x68, injectData, 10, "UChar")
880 NumPut(bCheckDummies, injectData, 11, "UInt")
881 NumPut(0x68, injectData, 15, "UChar")
882 NumPut(bCheckObjects, injectData, 16, "UInt")
883 NumPut(0x68, injectData, 20, "UChar")
884 NumPut(bCheckPeds, injectData, 21, "UInt")
885 NumPut(0x68, injectData, 25, "UChar")
886 NumPut(bCheckVehicles, injectData, 26, "UInt")
887 NumPut(0x68, injectData, 30, "UChar")
888 NumPut(bCheckBuildings, injectData, 31, "UInt")
889 NumPut(0x68, injectData, 35, "UChar")
890 NumPut(pParam1+12, injectData, 36, "UInt")
891 NumPut(0x68, injectData, 40, "UChar")
892 NumPut(pParam1, injectData, 41, "UInt")
893 ; call
894 NumPut(0xE8, injectData, 45, "UChar")
895 offset := dwFunc - (pInjectFunc + 50)
896 NumPut(offset, injectData, 46, "UInt")
897 ; Ruckgabewert
898 NumPut(0xA2, injectData, 50, "UChar")
899 NumPut(pParam2, injectData, 51, "UInt")
900 ; add esp 0x24
901 NumPut(0xC483, injectData, 55, "UShort")
902 NumPut(0x24, injectData, 57, "UChar")
903 NumPut(0xC3, injectData, 58, "UChar")
904 writeRaw(hGTA, pInjectFunc, &injectData, dwLen)
905 if(ErrorLevel)
906 return 0
907 hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
908 if(ErrorLevel)
909 return 0
910 waitForSingleObject(hThread, 0xFFFFFFFF)
911 closeProcess(hThread)
912 return (readDWORD(hGTA, pParam2) ? 1 : 0)
913}
914
915IsPlayerVisible(ped)
916{
917 If(!checkHandles())
918 return false
919 dwFunc := 0x536BC0
920 dwLen := 16
921 VarSetCapacity(injectData, dwLen, 0)
922 NumPut(0xB9, injectData, 0, "UChar") ;mov ecx
923 NumPut(ped, injectData, 1, "UInt")
924 NumPut(0xE8, injectData, 5, "UChar") ;call
925 offset := dwFunc - (pInjectFunc + 10)
926 NumPut(offset, injectData, 6, "Int")
927 ; return value
928 NumPut(0xA2, injectData, 10, "UChar") ; mov bReturn, al
929 NumPut(pParam1, injectData, 11, "Int")
930 NumPut(0xC3, injectData, 15, "UChar") ; retn
931 writeRaw(hGTA, pInjectFunc, &injectData, dwLen)
932 hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
933 waitForSingleObject(hThread, 0xFFFFFFFF)
934 closeProcess(hThread)
935 return readMem(hGTA, pParam1, 1, "UChar")
936}
937
938getTargetPlayerHealth(player) ; dwPed or playerid
939{
940 if(!checkHandles())
941 return 0
942 if (player is integer) and (player >= 0) and (player <= 999)
943 player := getPedById(player)
944 if(!player)
945 return 0
946 return readMem(hGTA, player + 0x540, 2, "byte")
947}
948
949getTargetPlayerArmour(player) ; dwPed or playerid
950{
951 if(!checkHandles())
952 return 0
953 if (player is integer) and (player >= 0) and (player <= 999)
954 player := getPedById(player)
955 if(!player)
956 return 0
957 return readMem(hGTA, player + 0x548, 2, "byte")
958}
959
960getTargetPlayerWeaponModel(player) ; dwPed or playerid
961{
962 if(!checkHandles())
963 return 0
964 if (player is integer) and (player >= 0) and (player <= 999)
965 player := getPedById(player)
966 if(!player)
967 return 0
968 model := readMem(hGTA, player + 0x740, 2, "byte")
969 if(model == 65535)
970 return 0
971 return model
972}
973
974CJ()
975{
976 if(!checkHandles())
977 return false
978 SIZE := 5
979 dwFunc := dwSAMP + 0x15860
980 offset := dwFunc - (pInjectFunc + SIZE)
981 VarSetCapacity(inject, SIZE + 1, 0)
982 NumPut(0xE8, inject, 0, "UChar") ; call
983 NumPut(offset, inject, 1, "Int")
984 NumPut(0xC3, inject, 5, "UChar") ; ret
985 writeRaw(hGTA, pInjectFunc, &inject, SIZE + 1)
986 hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
987 waitForSingleObject(hThread, 0xFFFFFFFF)
988 closeProcess(hThread)
989 return true
990}
991
992getChatLineColor(line := 0, isHex := true) {
993 ; 0x152 - offset for first message
994 ; 0xFC - size of a full message
995 ; 0xD4 - size of a string message
996 ; 99 - max count of a messages
997 if(!checkHandles())
998 return -1
999 dwAddress := readDWORD(hGTA, dwSAMP + ADDR_SAMP_CHATMSG_PTR)
1000 if ErrorLevel
1001 return -1
1002 clAddress := dwAddress + 0x152 + ((99-line) * 0xFC) + 0xD4
1003 if ErrorLevel
1004 return -1
1005 color := readMem(hGTA, clAddress, 3, "byte")
1006 if ErrorLevel
1007 return -1
1008 if isHex
1009 return inttohex(color)
1010 return color
1011}
1012
1013setChatLineColor(color, line := 0) {
1014 if(!checkHandles())
1015 return false
1016 if color is not integer
1017 {
1018 while(substr(color, 1, 1) == "0")
1019 color := substr(color, 2)
1020 color := "0x" color
1021 if strlen(color) != 8
1022 return false ; разрешено 3 байта (6 символов + 2 это 0x)
1023 } else if(color > 16777215)
1024 return false ; цвет не может превышать 3 байта
1025 dwAddress := readDWORD(hGTA, dwSAMP + ADDR_SAMP_CHATMSG_PTR)
1026 if ErrorLevel
1027 return false
1028 clAddress := dwAddress + 0x152 + ((99-line) * 0xFC) + 0xD4
1029 if ErrorLevel
1030 return false
1031 writeMemory(hGTA, clAddress, color, 3, "byte")
1032 if ErrorLevel
1033 return false
1034 sendinput {f7 3} ; 3 - без соба, 4 - есть собейт
1035 return true
1036}
1037
1038getChatLineTimestamp(line := 0, unixtime := true) {
1039 ; 0x152 - offset for first message
1040 ; 0xFC - size of a full message
1041 ; 0x20 - offset from timestamp to message
1042 ; 99 - max count of a messages
1043 if(!checkHandles())
1044 return -1
1045 dwAddress := readDWORD(hGTA, dwSAMP + ADDR_SAMP_CHATMSG_PTR)
1046 if ErrorLevel
1047 return -1
1048 tsAddress := dwAddress + 0x152 + ((99-line) * 0xFC) - 0x20
1049 if ErrorLevel
1050 return -1
1051 timestamp := readMem(hGTA, tsAddress, 4, "int")
1052 if ErrorLevel
1053 return -1
1054 ; timestamp += (A_Now - A_NowUTC)
1055 if unixtime
1056 return timestamp
1057 s = 1970
1058 s += timestamp,s
1059 ; return [ substr(s, 1, 4), substr(s, 5, 2), substr(s, 7, 2), substr(s, 9, 2), substr(s, 11, 2), substr(s, 13, 2) ] ; [Y,M,D,HH,MM,SS]
1060 return [ substr(s, 9, 2) , substr(s, 11, 2) , substr(s, 13, 2) , substr(s, 7, 2) , substr(s, 5, 2) , substr(s, 1, 4) ] ; [HH,MM,SS,D,M,Y]
1061}
1062
1063setChatLineTimestamp(timestamp, line := 0) {
1064 if(!checkHandles())
1065 return false
1066 if timestamp is float
1067 timestamp := floor(timestamp)
1068 if substr(timestamp, 1, 1) == "+" or substr(timestamp, 1, 1) == "-"
1069 timestamp := getChatLineTimestamp(line) + timestamp
1070 if timestamp is not integer
1071 return false
1072 dwAddress := readDWORD(hGTA, dwSAMP + ADDR_SAMP_CHATMSG_PTR)
1073 if ErrorLevel
1074 return false
1075 tsAddress := dwAddress + 0x152 + ((99-line) * 0xFC) - 0x20
1076 if ErrorLevel
1077 return false
1078 writeMemory(hGTA, tsAddress, timestamp, 4, "int")
1079 if ErrorLevel
1080 return -1
1081 sendinput {f7 3} ; 3 - без соба, 4 - есть собейт
1082 return true
1083}
1084
1085NOP_SetPlayerPos(tog := -1)
1086{
1087 if(!checkHandles())
1088 return -1
1089 dwAddress := dwSAMP+0x15970
1090 byte := readMem(hGTA, dwAddress, 1, "byte")
1091 if((tog == -1 && byte != 195) || tog == true || tog == 1)
1092 {
1093 writeBytes(hGTA, dwAddress, "C390")
1094 return true
1095 } else if((tog == -1 && byte == 195) || !tog)
1096 {
1097 writeBytes(hGTA, dwAddress, "E910")
1098 return false
1099 }
1100 return -1
1101}
1102
1103removeChatLine(line := 0)
1104{
1105 if(!checkHandles())
1106 return false
1107 if(!dwAddress := readDWORD(hGTA, dwSAMP + ADDR_SAMP_CHATMSG_PTR))
1108 return false
1109 loop % 100 - line
1110 {
1111 a := ""
1112 dwLine := dwAddress + 0x132 + ( (99 - A_Index - line) * 0xFC )
1113 loop 0xFC
1114 {
1115 byte := substr(inttohex(Memory_ReadByte(hGTA, dwLine++)), 3)
1116 a .= (strlen(byte) == 1 ? "0" : "") byte
1117 }
1118 dwLine := dwAddress + 0x132 + ( (100 - A_Index - line) * 0xFC )
1119 writeBytes(hGTA, dwLine, a)
1120 }
1121 sendinput {f7 3} ; 3 - без соба, 4 - есть собейт
1122 return true
1123}
1124
1125getChatLineEx(line := 0) {
1126 ; 0x152 - offset for first message
1127 ; 0xFC - size of a message
1128 ; 99 - max count of a messages
1129 if(!checkHandles())
1130 return
1131 dwPtr := dwSAMP + ADDR_SAMP_CHATMSG_PTR
1132 dwAddress := readDWORD(hGTA, dwPtr)
1133 if(ErrorLevel)
1134 return
1135 msg := readString(hGTA, dwAddress + 0x152 + ( (99-line) * 0xFC), 0xFC)
1136 if(ErrorLevel)
1137 return
1138 return msg
1139}
1140
1141PrintLow(text, time) {
1142 ;0x69F1E0 = PrintLowPriorityMessage(const char* text, int time_in_ms, int unknown1 = 1, int unknown2 = 1);
1143 if(!checkHandles())
1144 return -1
1145 dwFunc := 0x69F1E0
1146 callwithparams(hGta, dwFunc, [["s",text], ["i", time], ["i", 1], ["i", 1]], true)
1147}
1148
1149getChatState(state := -1)
1150{
1151 if(!checkHandles())
1152 return false
1153 dwAddr := readDWORD(hGTA, dwSAMP + ADDR_SAMP_CHATMSG_PTR) + 8
1154 if state between 0 and 2
1155 {
1156 writeByte(hGTA, dwAddr, state)
1157 sendinput {f7 3}
1158 }
1159 return Memory_ReadByte(hGTA, dwAddr)
1160}
1161
1162GetBonePosition(ped,boneId){
1163 callWithParamsBonePos(0x5E4280, [["i", ped],["i", pParamBonePos1],["i",boneId],["i", 1]], false, true)
1164 return [readFloat(hGTA, pParamBonePos1), readFloat(hGTA, pParamBonePos1 + 4), readFloat(hGTA, pParamBonePos1 + 8)]
1165}
1166 callWithParamsBonePos(dwFunc, aParams, bCleanupStack = true, thiscall = false) {
1167 validParams := 0
1168 i := aParams.MaxIndex()
1169 dwLen := i * 5 + 5 + 1
1170 if(bCleanupStack)
1171 dwLen += 3
1172 VarSetCapacity(injectData, i * 5 + 5 + 3 + 1, 0)
1173 i_ := 1
1174 while(i > 0) {
1175 if(aParams[i][1] != "") {
1176 dwMemAddress := 0x0
1177 if(aParams[i][1] == "p") {
1178 dwMemAddress := aParams[i][2]
1179 } else if(aParams[i][1] == "s") {
1180 if(i_>3)
1181 return false
1182 dwMemAddress := pParamBonePos%i_%
1183 writeString(hGTA,dwMemAddress, aParams[i][2])
1184 if(ErrorLevel)
1185 return false
1186 i_ += 1
1187 } else if(aParams[i][1] == "i") {
1188 dwMemAddress := aParams[i][2]
1189 } else {
1190 return false
1191 }
1192 NumPut((thiscall && i == 1 ? 0xB9 : 0x68), injectData, validParams * 5, "UChar")
1193 NumPut(dwMemAddress, injectData, validParams * 5 + 1, "UInt")
1194 validParams += 1
1195 }
1196 i -= 1
1197 }
1198 offset := dwFunc - ( pInjectFuncBonePos + validParams * 5 + 5 )
1199 NumPut(0xE8, injectData, validParams * 5, "UChar")
1200 NumPut(offset, injectData, validParams * 5 + 1, "Int")
1201 if(bCleanupStack) {
1202 NumPut(0xC483, injectData, validParams * 5 + 5, "UShort")
1203 NumPut(validParams*4, injectData, validParams * 5 + 7, "UChar")
1204 NumPut(0xC3, injectData, validParams * 5 + 8, "UChar")
1205 } else {
1206 NumPut(0xC3, injectData, validParams * 5 + 5, "UChar")
1207 }
1208 writeRaw(hGTA, pInjectFuncBonePos, &injectData, dwLen)
1209 if(ErrorLevel)
1210 return false
1211 hThread := createRemoteThread(hGTA, 0, 0, pInjectFuncBonePos, 0, 0, 0)
1212 if(ErrorLevel)
1213 return false
1214 waitForSingleObject(hThread, 0xFFFFFFFF)
1215 closeProcess(hThread)
1216 return true
1217 }
1218getVehicleMaxPassengers()
1219{
1220 if(!checkHandles())
1221 return -1
1222 if(!CVeh := readDWORD(hGTA, ADDR_VEHICLE_PTR))
1223 return -1
1224 return readMem(hGTA, CVeh + 0x488, 1, "byte")
1225}
1226
1227getVehiclePassenger(place)
1228{
1229 ; возвращает указатель на игрока
1230 ; 0 - водитель, от 1 до 8 - пассажирские места
1231 if(!checkHandles())
1232 return -1
1233 if(!CVeh := readDWORD(hGTA, ADDR_VEHICLE_PTR))
1234 return -1
1235 return readDWORD(hGTA, CVeh + 0x460 + (place * 4))
1236}
1237
1238getVehiclePassengerId(place)
1239{
1240 CPed := getVehiclePassenger(place)
1241 return getIdByPed(CPed)
1242}
1243
1244getLastDamagePed(ByRef Ped := "", ByRef Weapon := "")
1245{
1246 if(!checkHandles())
1247 return -1
1248 if(!CPed := readDWORD(hGTA, ADDR_CPED_PTR))
1249 return -1
1250 if(!dwPed := readDWORD(hGTA, CPed + 0x764))
1251 return -1
1252 Ped := getIdByPed(dwPed)
1253 Weapon := readMem(hGTA, CPed + 0x760, 4, "int")
1254 return Ped
1255}
1256
1257getKillStat(ByRef IsEnabled := "")
1258{
1259 if(!checkHandles())
1260 return false
1261 a := []
1262 klist := readDWORD(hGTA, dwSAMP + 0x21A0EC)
1263 isEnabled := readMem(hGTA, klist, 4, "int")
1264 klist += 4
1265 loop 5
1266 {
1267 szKiller := readString(hGTA, klist, 25)
1268 szVictim := readString(hGTA, (klist += 25), 25)
1269 clKillerColor := inttohex(readMem(hGTA, (klist += 25), 4, "uint"))
1270 clVictimColor := inttohex(readMem(hGTA, (klist += 4), 4, "uint"))
1271 byteType := Memory_ReadByte(hGTA, (klist += 4))
1272 klist++
1273 a.Insert([szKiller, szVictim, clKillerColor, clVictimColor, byteType])
1274 }
1275 return a
1276}
1277
1278setFireImmunity(state)
1279{
1280 if(!checkHandles())
1281 return
1282 writeMemory(hGTA, 0xB7CEE6, (state ? 1 : 0), 1, "byte")
1283}
1284
1285setInfiniteRun(state)
1286{
1287 if(!checkHandles())
1288 return
1289 writeMemory(hGTA, 0xB7CEE4, (state ? 1 : 0), 1, "byte")
1290}
1291
1292isMarkerSetup()
1293{
1294 if(!checkHandles())
1295 return -1
1296 return readMem(hGTA, 0xBA6774, 1, "byte")
1297}
1298
1299multVehicleSpeed(MultValue := 1.01, SleepTime := 10, MaxSpeedX := 2.0, MaxSpeedY := 2.0)
1300{
1301 if(multVehicleSpeed_tick + SleepTime > A_TickCount)
1302 return false
1303 multVehicleSpeed_tick := A_TickCount
1304
1305 if(!checkHandles())
1306 return false
1307 if(!dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR))
1308 return false
1309
1310 if(!MultValue)
1311 {
1312 writeFloat(hGTA, dwAddr + ADDR_VEHICLE_X, 0.0)
1313 writeFloat(hGTA, dwAddr + ADDR_VEHICLE_Y, 0.0)
1314 return true
1315 }
1316
1317 fSpeedX := readMem(hGTA, dwAddr + ADDR_VEHICLE_X, 4, "float")
1318 fSpeedY := readMem(hGTA, dwAddr + ADDR_VEHICLE_Y, 4, "float")
1319
1320 if(abs(fSpeedX) <= MaxSpeedX)
1321 writeFloat(hGTA, dwAddr + ADDR_VEHICLE_X, fSpeedX * MultValue)
1322 if(abs(fSpeedY) <= MaxSpeedY)
1323 writeFloat(hGTA, dwAddr + ADDR_VEHICLE_Y, fSpeedY * MultValue)
1324
1325 return true
1326}
1327
1328
1329togglekillstat(state)
1330{
1331 if(!checkHandles())
1332 return false
1333 dwKillptr := readDWORD(hGTA, dwSAMP + SAMP_KILLSTAT_OFFSET)
1334 if(ErrorLevel || dwKillptr == 0) {
1335 ErrorLevel := ERROR_READ_MEMORY
1336 return false
1337 }
1338
1339 writeBytes(hGTA, dwKillptr, state)
1340 if(ErrorLevel) {
1341 ErrorLevel := ERROR_WRITE_MEMORY
1342 return -1
1343 }
1344 return true
1345}
1346
1347setkillstatwidth(width)
1348{
1349 if(!checkHandles())
1350 return false
1351
1352 dwKillptr := readDWORD(hGTA, dwSAMP + SAMP_KILLSTAT_OFFSET)
1353 if(ErrorLevel || dwKillptr == 0) {
1354 ErrorLevel := ERROR_READ_MEMORY
1355 return false
1356 }
1357
1358 writeBytes(hGTA, dwKillptr + 0x133, width)
1359 if(ErrorLevel) {
1360 ErrorLevel := ERROR_WRITE_MEMORY
1361 return false
1362 }
1363 return true
1364}
1365
1366movekillstat(x)
1367{
1368 if(!checkHandles())
1369 return false
1370
1371 dwKillptr := readDWORD(hGTA, dwSAMP + SAMP_KILLSTAT_OFFSET)
1372 if(ErrorLevel || dwKillptr == 0) {
1373 ErrorLevel := ERROR_READ_MEMORY
1374 return false
1375 }
1376
1377 writeBytes(hGTA, dwKillptr + 0x12B, x)
1378 if(ErrorLevel) {
1379 ErrorLevel := ERROR_WRITE_MEMORY
1380 return false
1381 }
1382 return true
1383}
1384
1385setdistkillstat(int)
1386{
1387 if(!checkHandles())
1388 return false
1389
1390 dwKillptr := readDWORD(hGTA, dwSAMP + SAMP_KILLSTAT_OFFSET)
1391 if(ErrorLevel || dwKillptr == 0) {
1392 ErrorLevel := ERROR_READ_MEMORY
1393 return false
1394 }
1395
1396 writeBytes(hGTA, dwKillptr + 0x12F, int)
1397 if(ErrorLevel) {
1398 ErrorLevel := ERROR_WRITE_MEMORY
1399 return false
1400 }
1401 return true
1402}
1403
1404getWeaponSlotById(id)
1405{
1406 if id between 2 and 9
1407 slot := 1
1408 if id between 10 and 15
1409 slot := 10
1410 if id in 16,17,18,39
1411 slot := 8
1412 if id between 22 and 24
1413 slot := 2
1414 if id between 25 and 27
1415 slot := 3
1416 if id in 28,29,32
1417 slot := 4
1418 if id in 30,31
1419 slot := 5
1420 if id in 33,34
1421 slot := 6
1422 if id between 35 and 38
1423 slot := 7
1424 if id == 40
1425 slot := 12
1426 if id between 41 and 43
1427 slot := 9
1428 if id between 44 and 46
1429 slot := 11
1430}
1431
1432isPlayerCrouch()
1433{
1434 if(!checkHandles())
1435 return -1
1436 if(!CPed := readDWORD(hGTA, ADDR_CPED_PTR))
1437 return -1
1438 state := readMem(hGTA, CPed + 0x46F, 1, "byte")
1439 if(state == 132)
1440 return 1
1441 if(state == 128)
1442 return 0
1443 return -1
1444}
1445
1446setDialogState(tog)
1447{
1448 if(!checkHandles())
1449 return false
1450
1451 dwPointer := getDialogStructPtr()
1452 if(ErrorLevel || !dwPointer)
1453 return false
1454
1455 writeMemory(hGTA, dwPointer + 0x28, (tog ? 1 : 0), 1, "byte")
1456 if(!tog)
1457 Send {f6}{esc}
1458 return true
1459}
1460
1461toggleObjectDrawMode(tog := -1)
1462{
1463 if(!checkHandles())
1464 return -1
1465 byte := readMem(hGTA, dwSAMP + 0x69529, 1, "byte")
1466 if((tog == -1 && byte == 15) || tog == true || tog == 1)
1467 {
1468 writeBytes(hGTA, dwSAMP + 0x69529, "909090909090")
1469 return true
1470 } else if((tog == -1 && byte == 144) || !tog)
1471 {
1472 writeBytes(hGTA, dwSAMP + 0x69529, "0F84AE000000")
1473 Send {f6}{esc}
1474 return false
1475 }
1476 return -1
1477}
1478
1479blurlevel(level := -1)
1480{
1481 if(!checkHandles())
1482 return -1
1483 if level between 0 and 255
1484 writeMemory(hGTA, 0x8D5104, level, 1, "byte")
1485 blur := readMem(hGTA, 0x8D5104, 1, "byte")
1486 return blur
1487}
1488
1489toggleNoDamageByWeapon(tog := -1)
1490{
1491 if(!checkHandles())
1492 return -1
1493 byte := readMem(hGTA, 0x60A5BA, 1, "byte")
1494 if((tog == -1 && byte == 216) || tog == true || tog == 1)
1495 {
1496 writeBytes(hGTA, 0x60A5BA, "909090")
1497 return true
1498 } else if((tog == -1 && byte == 144) || !tog)
1499 {
1500 writeBytes(hGTA, 0x60A5BA, "D95E18")
1501 return false
1502 }
1503 addChatMessageEx(0xCC0000, "only for gta_sa.exe 1.0 us")
1504 return -1
1505}
1506
1507toggleInvulnerability(tog := -1)
1508{
1509 if(!checkHandles())
1510 return -1
1511 byte := readMem(hGTA, 0x60A5BA, 1, "byte")
1512 if((tog == -1 && byte == 217) || tog == true || tog == 1)
1513 {
1514 writeBytes(hGTA, 0x4B3314, "909090")
1515 return true
1516 } else if((tog == -1 && byte == 144) || !tog)
1517 {
1518 writeBytes(hGTA, 0x4B3314, "D86504")
1519 return false
1520 }
1521 addChatMessageEx(0xCC0000, "only for gta_sa.exe 1.0 us")
1522 return -1
1523}
1524
1525gmpatch()
1526{
1527 if(!checkHandles())
1528 return false
1529 a := writeMemory(hGTA, 0x4B35A0, 0x560CEC83, 4, "int")
1530 b := writeMemory(hGTA, 0x4B35A4, 0xF18B, 2, "byte")
1531 return (a && b)
1532}
1533
1534toggleUnlimitedAmmo(tog := -1)
1535{
1536 if(!checkHandles())
1537 return -1
1538 byte := readMem(hGTA, 0x7428E6, 1, "byte")
1539 if((tog == -1 && byte == 255) || tog == true || tog == 1)
1540 {
1541 writeBytes(hGTA, 0x7428E6, "909090")
1542 return true
1543 } else if((tog == -1 && byte == 144) || !tog)
1544 {
1545 writeBytes(hGTA, 0x7428E6, "FF4E0C")
1546 return false
1547 }
1548 addChatMessageEx(0xCC0000, "only for gta_sa.exe 1.0 us")
1549 return -1
1550}
1551
1552toggleNoReload(tog := -1)
1553{
1554 if(!checkHandles())
1555 return -1
1556 byte := readMem(hGTA, 0x7428B0, 1, "byte")
1557 if((tog == -1 && byte == 137) || tog == true || tog == 1)
1558 {
1559 writeBytes(hGTA, 0x7428B0, "909090")
1560 return true
1561 } else if((tog == -1 && byte == 144) || !tog)
1562 {
1563 writeBytes(hGTA, 0x7428B0, "894608")
1564 return false
1565 }
1566 addChatMessageEx(0xCC0000, "only for gta_sa.exe 1.0 us")
1567 return -1
1568}
1569
1570toggleNoRecoil(tog := -1)
1571{
1572 if(!checkHandles())
1573 return -1
1574 byte := readMem(hGTA, 0x740450, 1, "byte")
1575 if((tog == -1 && byte == 216) || tog == true || tog == 1)
1576 {
1577 writeBytes(hGTA, 0x740450, "90909090909090909090")
1578 return true
1579 } else if((tog == -1 && byte == 144) || !tog)
1580 {
1581 writeBytes(hGTA, 0x740450, "D80D3C8B8500D84C241C")
1582 return false
1583 }
1584 addChatMessageEx(0xCC0000, "only for gta_sa.exe 1.0 us")
1585 return -1
1586}
1587
1588toggleAntiBikeFall(tog := -1)
1589{
1590 if(!checkHandles())
1591 return -1
1592 byte := readMem(hGTA, 0x4BA3B9, 1, "byte")
1593 if((tog == -1 && byte == 15) || tog == true || tog == 1)
1594 {
1595 writeBytes(hGTA, 0x4BA3B9, "E9A703000090")
1596 return true
1597 } else if((tog == -1 && byte == 233) || !tog)
1598 {
1599 writeBytes(hGTA, 0x4BA3B9, "0F84A6030000")
1600 return false
1601 }
1602 addChatMessageEx(0xCC0000, "only for gta_sa.exe 1.0 us")
1603 return -1
1604}
1605
1606toggleAntiCarEject(tog := -1)
1607{
1608 if(!checkHandles())
1609 return -1
1610 byte := readMem(hGTA, dwSAMP + 0x146E0, 1, "byte")
1611 if((tog == -1 && byte == 233) || tog == true || tog == 1)
1612 {
1613 writeBytes(hGTA, dwSAMP + 0x146E0, "C390909090")
1614 return true
1615 } else if((tog == -1 && byte == 195) || !tog)
1616 {
1617 writeBytes(hGTA, dwSAMP + 0x146E0, "E9D7722700")
1618 return false
1619 }
1620 return -1
1621}
1622
1623toggleNoAnimations(tog := -1)
1624{
1625 if(!checkHandles())
1626 return -1
1627 byte := readMem(hGTA, dwSAMP + 0x16FA0, 1, "byte")
1628 if((tog == -1 && byte == 85) || tog == true || tog == 1)
1629 {
1630 writeMemory(hGTA, dwSAMP + 0x16FA0, 0xC3, 1, "byte")
1631 return true
1632 } else if((tog == -1 && byte == 195) || !tog)
1633 {
1634 writeMemory(hGTA, dwSAMP + 0x16FA0, 0x55, 1, "byte")
1635 return false
1636 }
1637 return -1
1638}
1639
1640toggleMotionBlur(tog := -1)
1641{
1642 if(!checkHandles())
1643 return -1
1644 byte := readMem(hGTA, 0x704E8A, 1, "byte")
1645 if((tog == -1 && byte == 144) || tog == true || tog == 1)
1646 {
1647 writeBytes(hGTA, 0x704E8A, "E811E2FFFF")
1648 return true
1649 } else if((tog == -1 && byte == 232) || !tog)
1650 {
1651 writeBytes(hGTA, 0x704E8A, "9090909090")
1652 return false
1653 }
1654 addChatMessageEx(0xCC0000, "only for gta_sa.exe 1.0 us")
1655 return -1
1656}
1657
1658writeBytes(handle, address, bytes)
1659{
1660 length := strlen(bytes) / 2
1661 VarSetCapacity(toInject, length, 0)
1662 Loop %length%
1663 {
1664 byte := "0x" substr(bytes, ((A_Index - 1) * 2) + 1, 2)
1665 NumPut(byte, toInject, A_Index - 1, "uchar")
1666 }
1667 return writeRaw(handle, address, &toInject, length)
1668}
1669
1670setPlayerFreeze(status) {
1671 if(!checkHandles())
1672 return -1
1673
1674 dwCPed := readDWORD(hGTA, 0xB6F5F0)
1675 if(ErrorLevel) {
1676 ErrorLevel := ERROR_READ_MEMORY
1677 return -1
1678 }
1679 dwAddr := dwCPed + 0x42
1680 writeString(hGTA, dwAddr, status)
1681 if(ErrorLevel) {
1682 ErrorLevel := ERROR_WRITE_MEMORY
1683 return -1
1684 }
1685 ErrorLevel := ERROR_OK
1686 return true
1687}
1688
1689getPlayerAnim()
1690{
1691 if(!checkHandles())
1692 return false
1693 dwPointer := readDWORD(hGTA, dwSAMP + 0x13D190)
1694 anim := readMem(hGTA, dwPointer + 0x2F4C, 2, "byte")
1695 return anim
1696}
1697
1698setPlayerHealth(amount) {
1699 if(!checkHandles())
1700 return -1
1701
1702 dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR)
1703 if(ErrorLevel) {
1704 ErrorLevel := ERROR_READ_MEMORY
1705 return -1
1706 }
1707
1708 dwAddr := dwCPedPtr + ADDR_CPED_HPOFF
1709 writeFloat(hGTA, dwAddr, amount)
1710 if(ErrorLevel) {
1711 ErrorLevel := ERROR_READ_MEMORY
1712 return -1
1713 }
1714
1715 ErrorLevel := ERROR_OK
1716 return true
1717}
1718
1719setPlayerArmor(amount) {
1720 if(!checkHandles())
1721 return -1
1722
1723 dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR)
1724 if(ErrorLevel) {
1725 ErrorLevel := ERROR_READ_MEMORY
1726 return -1
1727 }
1728
1729 dwAddr := dwCPedPtr + ADDR_CPED_ARMOROFF
1730 writeFloat(hGTA, dwAddr, amount)
1731 if(ErrorLevel) {
1732 ErrorLevel := ERROR_READ_MEMORY
1733 return -1
1734 }
1735
1736 ErrorLevel := ERROR_OK
1737 return true
1738}
1739
1740setVehicleHealth(amount) {
1741 if(!checkHandles())
1742 return -1
1743
1744 dwVehPtr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
1745 if(ErrorLevel) {
1746 ErrorLevel := ERROR_READ_MEMORY
1747 return -1
1748 }
1749
1750 dwAddr := dwVehPtr + ADDR_VEHICLE_HPOFF
1751 writeFloat(hGTA, dwAddr, amount)
1752 if(ErrorLevel) {
1753 ErrorLevel := ERROR_READ_MEMORY
1754 return -1
1755 }
1756
1757 ErrorLevel := ERROR_OK
1758 return true
1759}
1760
1761getDialogIndex() {
1762 dwPointer := getDialogStructPtr()
1763 if (ErrorLevel || !dwPointer)
1764 return false
1765
1766 dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_PTR2_OFFSET)
1767 if (ErrorLevel) {
1768 ErrorLevel := ERROR_READ_MEMORY
1769 return 0
1770 }
1771
1772 index := readMem(hGTA, dwPointer + 0x143, 1, "Byte")
1773 if (ErrorLevel) {
1774 ErrorLevel := ERROR_READ_MEMORY
1775 return false
1776 }
1777
1778 ErrorLevel := ERROR_OK
1779 return index + 1
1780}
1781
1782isDialogButtonSelected(btn := 1) {
1783 dwPointer := getDialogStructPtr()
1784 if (ErrorLevel || !dwPointer)
1785 return false
1786
1787 dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_PTR2_OFFSET)
1788 if (ErrorLevel) {
1789 ErrorLevel := ERROR_READ_MEMORY
1790 return 0
1791 }
1792
1793 offset := (btn == 1 ? 0x165 : 0x2C5)
1794 sel := readMem(hGTA, dwPointer + offset, 1, "Byte")
1795 if (ErrorLevel) {
1796 ErrorLevel := ERROR_READ_MEMORY
1797 return false
1798 }
1799
1800 ErrorLevel := ERROR_OK
1801 return sel
1802}
1803
1804getServerHour() {
1805 if(!checkHandles())
1806 return -1
1807
1808 dwGTA := getModuleBaseAddress("gta_sa.exe", hGTA)
1809 Hour := readMem(hGTA, 0xB70153, 1, "Int")
1810 if (Hour <= 9) {
1811 FixHour = 0%Hour%
1812 return FixHour
1813 }
1814 if(ErrorLevel) {
1815 ErrorLevel := ERROR_READ_MEMORY
1816 return -1
1817 }
1818
1819 ErrorLevel := ERROR_OK
1820 return Hour
1821}
1822getsexbyskin(skin)
1823{
1824if skin in 1,2,3,4,5,6,7,8,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,32,33,34,35,36,37,42,43,44,45,46,47,48,49,50,51,52,57,58,59,60,61,62,66,67,68,70,71,72,73,79,80,81,82,83,84,86,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,132,133,134,135,136,137,142,143,144,146,147,149,153,154,155,156,158,159,160,161,162,163,164,165,166,167,168,170,171,173,174,175,176,177,179,180,181,182,183,184,185,186,187,188,189,200,202,203,204,206,208,209,210,212,213,217,220,221,222,223,227,228,229,230,234,235,236,239,240,241,242,247,248,249,250,252,253,254,255,258,259,260,261,262,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,299,300,301,302,303,304,305,310,311
1825 return 1
1826if skin in 9,10,11,12,13,31,38,39,40,41,53,54,55,56,63,64,65,69,75,76,77,85,87,88,89,90,91,92,93,129,130,131,138,139,140,141,143,144,145,148,150,151,152,157,169,172,178,190,191,192,193,194,195,196,197,198,199,201,205,207,211,214,215,216,218,219,224,225,226,231,232,233,237,238,243,244,245,246,251,256,257,263,298,306,307,308,309
1827 return 2
1828else
1829 return 0
1830}
1831
1832set_player_armed_weapon_to(weaponid)
1833{
1834 c := getPlayerWeaponId()
1835 WinGet, gtapid, List, GTA:SA:MP
1836 SendMessage, 0x50,, 0x4090409,, GTA:SA:MP
1837 Loop
1838 {
1839 ControlSend,, {E down}, ahk_id %gtapid1%
1840 Sleep, 5
1841 ControlSend,, {E up}, ahk_id %gtapid1%
1842 if(getPlayerWeaponId() == c || getPlayerWeaponId() == weaponid)
1843 break
1844 }
1845}
1846
1847getZoneByName(zName, ByRef CurZone ) {
1848 if ( bInitZaC == 0 )
1849 {
1850 initZonesAndCities()
1851 bInitZaC := 1
1852 }
1853 Loop % nZone-1
1854 {
1855 if (zone%A_Index%_name == zName)
1856 {
1857 ErrorLevel := ERROR_OK
1858 CurZone[1] := zone%A_Index%_name
1859 CurZone[2] := %A_Index%
1860 CurZone[3,1,1] := zone%A_Index%_x1
1861 CurZone[3,1,2] := zone%A_Index%_y1
1862 CurZone[3,1,3] := zone%A_Index%_z1
1863 CurZone[3,2,1] := zone%A_Index%_x2
1864 CurZone[3,2,2] := zone%A_Index%_y2
1865 CurZone[3,2,3] := zone%A_Index%_z2
1866 return true
1867 }
1868 }
1869 ErrorLevel := ERROR_ZONE_NOT_FOUND
1870 return "Unknown"
1871}
1872; PointPos[1] - X Point
1873; PointPos[2] - Z Point
1874getCenterPointToZone(zName, ByRef PointPos) {
1875 getZoneByName(zName, CurZone)
1876 PointPos[1] := 125 + CurZone[3,1,1]
1877 PointPos[2] := 125 + CurZone[3,1,2]
1878 return true
1879}
1880
1881getDialogLineNumber() {
1882 dwPointer := getDialogStructPtr()
1883 if (ErrorLevel || !dwPointer)
1884 return 0
1885 dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_PTR2_OFFSET)
1886 if (ErrorLevel) {
1887 ErrorLevel := ERROR_READ_MEMORY
1888 return 0
1889 }
1890 count := readMem(hGTA, dwPointer + SAMP_DIALOG_LINENUMBER_OFFSET, 4, "UInt")
1891 if (ErrorLevel) {
1892 ErrorLevel := ERROR_READ_MEMORY
1893 return 0
1894 }
1895 return count//16777216+1
1896}
1897
1898getServerMinute() {
1899 if(!checkHandles())
1900 return -1
1901
1902 dwGTA := getModuleBaseAddress("gta_sa.exe", hGTA)
1903 Minute := readMem(hGTA, 0xB70152, 1, "Int")
1904 if (Minute <= 9) {
1905 FixMinute = 0%Minute%
1906 return FixMinute
1907 }
1908 if(ErrorLevel) {
1909 ErrorLevel := ERROR_READ_MEMORY
1910 return -1
1911 }
1912
1913 ErrorLevel := ERROR_OK
1914 return Minute
1915}
1916
1917getCameraCoordinates() {
1918 if(!checkHandles())
1919 return false
1920
1921 fX := readFloat(hGTA, 0xB6F9CC)
1922 if(ErrorLevel) {
1923 ErrorLevel := ERROR_READ_MEMORY
1924 return ""
1925 }
1926
1927 fY := readFloat(hGTA, 0xB6F9D0)
1928 if(ErrorLevel) {
1929 ErrorLevel := ERROR_READ_MEMORY
1930 return ""
1931 }
1932
1933 fZ := readFloat(hGTA, 0xB6F9D4)
1934 if(ErrorLevel) {
1935 ErrorLevel := ERROR_READ_MEMORY
1936 return ""
1937 }
1938
1939 ErrorLevel := ERROR_OK
1940 return [fX, fY, fZ]
1941}
1942
1943getPlayerPosById(dwId) {
1944 dwId += 0
1945 dwId := Floor(dwId)
1946 if(dwId < 0 || dwId >= SAMP_PLAYER_MAX)
1947 return ""
1948
1949 if(iRefreshScoreboard+iUpdateTick > A_TickCount)
1950 {
1951 if(oScoreboardData[dwId])
1952 {
1953 if(oScoreboardData[dwId].HasKey("PED"))
1954 return getPedCoordinates(oScoreboardData[dwId].PED)
1955 if(oScoreboardData[dwId].HasKey("MPOS"))
1956 return oScoreboardData[dwId].MPOS
1957 }
1958 return ""
1959 }
1960
1961 if(!updateOScoreboardData())
1962 return ""
1963
1964 if(oScoreboardData[dwId])
1965 {
1966 if(oScoreboardData[dwId].HasKey("PED"))
1967 return getPedCoordinates(oScoreboardData[dwId].PED)
1968 if(oScoreboardData[dwId].HasKey("MPOS"))
1969 return oScoreboardData[dwId].MPOS
1970 }
1971 return ""
1972}
1973
1974HexToDecOne(Hex)
1975{
1976 if (InStr(Hex, "0x") != 1)
1977 Hex := "0x" Hex
1978 return, Hex + 0
1979}
1980
1981HexToDecTwo(hex)
1982{
1983 VarSetCapacity(dec, 66, 0)
1984 , val := DllCall("msvcrt.dll\_wcstoui64", "Str", hex, "UInt", 0, "UInt", 16, "CDECL Int64")
1985 , DllCall("msvcrt.dll\_i64tow", "Int64", val, "Str", dec, "UInt", 10, "CDECL")
1986 return dec
1987}
1988hex2rgb(CR)
1989{
1990 NumPut((InStr(CR, "#") ? "0x" SubStr(CR, 2) : "0x") SubStr(CR, -5), (V := "000000"))
1991 return NumGet(V, 2, "UChar") "," NumGet(V, 1, "UChar") "," NumGet(V, 0, "UChar")
1992}
1993rgb2hex(R, G, B, H := 1)
1994{
1995 static U := A_IsUnicode ? "_wcstoui64" : "_strtoui64"
1996 static V := A_IsUnicode ? "_i64tow" : "_i64toa"
1997 rgb := ((R << 16) + (G << 8) + B)
1998 H := ((H = 1) ? "#" : ((H = 2) ? "0x" : ""))
1999 VarSetCapacity(S, 66, 0)
2000 value := DllCall("msvcrt.dll\" U, "Str", rgb , "UInt", 0, "UInt", 10, "CDECL Int64")
2001 DllCall("msvcrt.dll\" V, "Int64", value, "Str", S, "UInt", 16, "CDECL")
2002 return H S
2003}
2004GetCoordsSamp(ByRef ResX, ByRef ResY)
2005{
2006 MouseGetPos, PosX, PosY
2007 PosXProc := PosX * 100 / A_ScreenWidth
2008 PosYProc := PosY * 100 / A_ScreenHeight
2009 ResX := PosXProc * 8
2010 ResY := PosYProc * 6
2011}
2012getVehicleIdServer(address=0x13C298, datatype="int", length=4, offset=0)
2013{
2014 if (isPlayerDriver() != "-1" or isPlayerInAnyVehicle() != "0")
2015 {
2016 Process, Exist, gta_sa.exe
2017 PID_GTA := ErrorLevel
2018 VarSetCapacity(me32, 548, 0)
2019 NumPut(548, me32)
2020 snapMod := DllCall("CreateToolhelp32Snapshot", "Uint", 0x00000008, "Uint", PID_GTA)
2021 If (snapMod = -1)
2022 Return 0
2023 If (DllCall("Module32First", "Uint", snapMod, "Uint", &me32))
2024{
2025 Loop
2026 {
2027 If (!DllCall("lstrcmpi", "Str", "samp.dll", "UInt", &me32 + 32)) {
2028 DllCall("CloseHandle", "UInt", snapMod)
2029 key:= NumGet(&me32 + 20)
2030 WinGet, PID_SAMP, PID, GTA:SA:MP
2031 hwnd_samp := DllCall("OpenProcess","Uint",0x1F0FFF,"int",0,"int", PID_SAMP)
2032 VarSetCapacity(readvalue,length, 0)
2033 DllCall("ReadProcessMemory","Uint",hwnd_samp,"Uint",key+address+offset,"Str",readvalue,"Uint",length,"Uint *",0)
2034 finalvalue := NumGet(readvalue,0,datatype)
2035 DllCall("CloseHandle", "int", hwnd_samp)
2036 return finalvalue
2037 }
2038 }
2039 Until !DllCall("Module32Next", "Uint", snapMod, "UInt", &me32)
2040 }
2041 DllCall("CloseHandle", "Uint", snapMod)
2042 }
2043 else
2044 Return 0
2045}
2046; Визуально меняет ник любого игрока
2047setPlayerName(playerid, newnick) {
2048 if(!checkHandles() || !strlen(newnick))
2049 return 0
2050
2051 dwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET)
2052 if(ErrorLevel || dwAddress==0) {
2053 ErrorLevel := ERROR_READ_MEMORY
2054 return 0
2055 }
2056
2057 dwAddress := readDWORD(hGTA, dwAddress + SAMP_PPOOLS_OFFSET)
2058 if(ErrorLevel || dwAddress==0) {
2059 ErrorLevel := ERROR_READ_MEMORY
2060 return 0
2061 }
2062
2063 dwPlayers := readDWORD(hGTA, dwAddress + SAMP_PPOOL_PLAYER_OFFSET)
2064 if(ErrorLevel || dwPlayers==0) {
2065 ErrorLevel := ERROR_READ_MEMORY
2066 return 0
2067 }
2068
2069 dwRemoteplayer := readDWORD(hGTA, dwPlayers+SAMP_PREMOTEPLAYER_OFFSET+playerid*4) ;pRemotePlayer
2070 if(ErrorLevel) {
2071 ErrorLevel := ERROR_READ_MEMORY
2072 return 0
2073 }
2074
2075 if(dwRemoteplayer==0)
2076 return 0
2077
2078 dwTemp := readMem(hGTA, dwRemoteplayer + SAMP_ISTRLENNAME___OFFSET, 4, "Int")
2079 if(ErrorLevel) {
2080 ErrorLevel := ERROR_READ_MEMORY
2081 return 0
2082 }
2083 sUsername := ""
2084 if(dwTemp <= 0xf)
2085 {
2086 sUsername := readString(hGTA, dwRemoteplayer+SAMP_SZPLAYERNAME_OFFSET, 16)
2087 if(ErrorLevel) {
2088 ErrorLevel := ERROR_READ_MEMORY
2089 return 0
2090 }
2091 writeString(hGTA, dwRemoteplayer+SAMP_SZPLAYERNAME_OFFSET, newnick)
2092 }
2093 else {
2094 dwAddress := readDWORD(hGTA, dwRemoteplayer + SAMP_PSZPLAYERNAME_OFFSET)
2095 if(ErrorLevel || dwAddress==0) {
2096 ErrorLevel := ERROR_READ_MEMORY
2097 return 0
2098 }
2099 sUsername := readString(hGTA, dwAddress, 25)
2100 if(ErrorLevel) {
2101 ErrorLevel := ERROR_READ_MEMORY
2102 return 0
2103 }
2104 writeString(hGTA, dwAddress, newnick)
2105 }
2106
2107 ErrorLevel := ERROR_OK
2108 return 1
2109}
2110
2111HexToDec(str)
2112{
2113 local newStr := ""
2114 static comp := {0:0, 1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:7, 8:8, 9:9, "a":10, "b":11, "c":12, "d":13, "e":14, "f":15}
2115 StringLower, str, str
2116 str := RegExReplace(str, "^0x|[^a-f0-9]+", "")
2117 Loop, % StrLen(str)
2118 newStr .= SubStr(str, (StrLen(str)-A_Index)+1, 1)
2119 newStr := StrSplit(newStr, "")
2120 local ret := 0
2121 for i,char in newStr
2122 ret += comp[char]*(16**(i-1))
2123 return ret
2124}
2125
2126addChatMessageEx(Color, wText) {
2127 wText := "" wText
2128
2129 if(!checkHandles())
2130 return false
2131
2132 VarSetCapacity(data2, 4, 0)
2133 NumPut(HexToDec(Color),data2,0,"Int")
2134
2135 Addrr := readDWORD(hGTA, dwSAMP+ADDR_SAMP_CHATMSG_PTR)
2136
2137 VarSetCapacity(data1, 4, 0)
2138 NumPut(readDWORD(hGTA, Addrr + 0x12A), data1,0,"Int")
2139
2140 WriteRaw(hGTA, Addrr + 0x12A, &data2, 4)
2141
2142 dwFunc := dwSAMP + FUNC_SAMP_ADDTOCHATWND
2143 dwChatInfo := readDWORD(hGTA, dwSAMP + ADDR_SAMP_CHATMSG_PTR)
2144 if(ErrorLevel) {
2145 ErrorLevel := ERROR_READ_MEMORY
2146 return false
2147 }
2148
2149 callWithParams(hGTA, dwFunc, [["p", dwChatInfo], ["s", wText]], true)
2150 WriteRaw(hGTA, Addrr + 0x12A, &data1, 4)
2151
2152 ErrorLevel := ERROR_OK
2153
2154 return true
2155}
2156
2157connect(IP) {
2158 setIP(IP)
2159 restartGameEx()
2160 disconnectEx()
2161 Sleep 1000
2162 setrestart()
2163 Return
2164}
2165
2166WriteProcessMemory(title,addresse,wert,size)
2167{
2168 VarSetCapacity(idvar,32,0)
2169 VarSetCapacity(processhandle,32,0)
2170 VarSetCapacity(value, 32, 0)
2171 NumPut(wert,value,0,Uint)
2172 address=%addresse%
2173 WinGet ,idvar,PID,%title%
2174 processhandle:=DllCall("OpenProcess","Uint",0x38,"int",0,"int",idvar)
2175 Bvar:=DllCall("WriteProcessMemory","Uint",processhandle,"Uint",address+0,"Uint",&value,"Uint",size,"Uint",0)
2176}
2177
2178setCoordinates(x, y, z, Interior) {
2179 if(!checkHandles())
2180 return False
2181
2182 dwAddress := readMem(hGTA, ADDR_SET_POSITION)
2183 if(ErrorLevel) {
2184 ErrorLevel := ERROR_READ_MEMORY
2185 Return False
2186 }
2187
2188 dwAddress := readMem(hGTA, dwAddress + ADDR_SET_POSITION_OFFSET)
2189 if(ErrorLevel) {
2190 ErrorLevel := ERROR_READ_MEMORY
2191 Return False
2192 }
2193
2194 Sleep 100
2195
2196 writeByte(hGTA, ADDR_SET_INTERIOR_OFFSET, Interior)
2197 if(ErrorLevel) {
2198 ErrorLevel := ERROR_WRITE_MEMORY
2199 Return False
2200 }
2201
2202 writeFloat(hGTA, dwAddress + ADDR_SET_POSITION_X_OFFSET, x)
2203 if(ErrorLevel) {
2204 ErrorLevel := ERROR_WRITE_MEMORY
2205 Return False
2206 }
2207
2208 writeFloat(hGTA, dwAddress + ADDR_SET_POSITION_Y_OFFSET, y)
2209 if(ErrorLevel) {
2210 ErrorLevel := ERROR_WRITE_MEMORY
2211 Return False
2212 }
2213
2214 writeFloat(hGTA, dwAddress + ADDR_SET_POSITION_Z_OFFSET, z)
2215 if(ErrorLevel) {
2216 ErrorLevel := ERROR_WRITE_MEMORY
2217 Return False
2218 }
2219
2220 Return True
2221}
2222colorhud(colorhud)
2223{
2224 VarSetCapacity(idvar,32,0)
2225 VarSetCapacity(processhandle,32,0)
2226 VarSetCapacity(value, 32, 0)
2227 NumPut(colorhud,value,0,Uint)
2228 address=0xBAB230
2229 WinGet ,idvar,PID,GTA:SA:MP
2230 processhandle:=DllCall("OpenProcess","Uint",0x38,"int",0,"int",idvar)
2231 Bvar:=DllCall("WriteProcessMemory","Uint",processhandle,"Uint",address+0,"Uint",&value,"Uint","4","Uint",0)
2232}
2233
2234; Смена Ip Сервера
2235setIP(IP) {
2236 if(!checkHandles())
2237 return False
2238
2239 dwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET)
2240 if(ErrorLevel || dwAddress==0) {
2241 ErrorLevel := ERROR_READ_MEMORY
2242 return False
2243 }
2244
2245 writeString(hGTA, dwAddress + SAMP_SZIP_OFFSET, IP)
2246 if(ErrorLevel) {
2247 ErrorLevel := ERROR_WRITE_MEMORY
2248 return False
2249 }
2250
2251 return True
2252}
2253
2254; set nickname
2255setUsername(Username) {
2256 if(!checkHandles())
2257 return False
2258
2259 dwAddress := dwSAMP + ADDR_SAMP_USERNAME
2260 writeString(hGTA, dwAddress, Username)
2261 if(ErrorLevel) {
2262 ErrorLevel := ERROR_WRITE_MEMORY
2263 return False
2264 }
2265
2266 ErrorLevel := ERROR_OK
2267 return True
2268}
2269
2270setChatLine(line, msg) {
2271 if(!checkHandles())
2272 return -1
2273
2274 dwPtr := dwSAMP + ADDR_SAMP_CHATMSG_PTR
2275 dwAddress := readDWORD(hGTA,dwPtr)
2276 if(ErrorLevel) {
2277 ErrorLevel := ERROR_READ_MEMORY
2278 return -1
2279 }
2280
2281 ; 0x152, offset for first msg
2282 ; 0xFC, size of a msg
2283 ; 99, max msg
2284 writeString(hGTA, dwAddress + 0x152 + ( (99-line) * 0xFC), msg)
2285 if(ErrorLevel) {
2286 ErrorLevel := ERROR_WRITE_MEMORY
2287 return -1
2288 }
2289
2290 sendinput {f7 3} ; 3 - без соба, 4 - есть собейт
2291
2292 ErrorLevel := ERROR_OK
2293 return True
2294}
2295
2296getTagNameDistance() {
2297 if(!checkHandles())
2298 return -1
2299
2300 dwSAMPInfo := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET)
2301 if(ErrorLevel) {
2302 ErrorLevel := ERROR_READ_MEMORY
2303 return -1
2304 }
2305
2306 dwSAMPInfoSettings := readDWORD(hGTA, dwSAMPInfo + SAMP_INFO_SETTINGS_OFFSET)
2307 if(ErrorLevel) {
2308 ErrorLevel := ERROR_READ_MEMORY
2309 return -1
2310 }
2311
2312 distance := readFloat(hGTA, dwSAMPInfoSettings + 0x27)
2313 if(ErrorLevel) {
2314 ErrorLevel := ERROR_READ_MEMORY
2315 return -1
2316 }
2317
2318 ErrorLevel := ERROR_OK
2319 return distance
2320}
2321
2322setTagNameDistance(status, distance) {
2323 if(!checkHandles())
2324 return -1
2325
2326 status := status ? 1 : 0
2327
2328 dwSAMPInfo := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET)
2329 if(ErrorLevel) {
2330 ErrorLevel := ERROR_READ_MEMORY
2331 return -1
2332 }
2333
2334 dwSAMPInfoSettings := readDWORD(hGTA, dwSAMPInfo + SAMP_INFO_SETTINGS_OFFSET)
2335 if(ErrorLevel) {
2336 ErrorLevel := ERROR_READ_MEMORY
2337 return -1
2338 }
2339
2340 writeByte(hGTA, dwSAMPInfoSettings + 0x38, 1)
2341 if(ErrorLevel) {
2342 ErrorLevel := ERROR_WRITE_MEMORY
2343 return -1
2344 }
2345
2346 writeByte(hGTA, dwSAMPInfoSettings + 0x2F, status)
2347 if(ErrorLevel) {
2348 ErrorLevel := ERROR_WRITE_MEMORY
2349 return -1
2350 }
2351
2352 writeFloat(hGTA, dwSAMPInfoSettings + 0x27, distance)
2353 if(ErrorLevel) {
2354 ErrorLevel := ERROR_WRITE_MEMORY
2355 return -1
2356 }
2357
2358 ErrorLevel := ERROR_OK
2359 return
2360}
2361
2362; sets the ingame hour (day/night)
2363setTime(hour)
2364{
2365 if(!checkHandles())
2366 return
2367 ; disable gta setTime function
2368 VarSetCapacity(nop, 6, 0)
2369 Loop 6 {
2370 NumPut(0x90, nop, A_INDEX-1, "UChar")
2371 }
2372 writeRaw(hGTA, 0x52D168, &nop, 6)
2373
2374 ; set our own weather
2375 VarSetCapacity(time, 1, 0)
2376 NumPut(hour, time, 0, "Int")
2377 writeRaw(hGTA, 0xB70153, &time, 1)
2378}
2379
2380; sets the weather
2381; @param weather id
2382setWeather(id)
2383{
2384 if(!checkHandles())
2385 return
2386 VarSetCapacity(weather, 1, 0)
2387 NumPut(id, weather, 0, "Int")
2388 writeRaw(hGTA, 0xC81320, &weather, 1)
2389 if(ErrorLevel)
2390 return false
2391
2392
2393 return true
2394}
2395
2396; get the id of your skin
2397getSkinID() {
2398 if(!checkHandles())
2399 return -1
2400
2401 dwAddress := readDWORD(hGTA, 0xB6F3B8)
2402
2403 if(ErrorLevel || dwAddress==0) {
2404 ErrorLevel := ERROR_READ_MEMORY
2405 return -1
2406 }
2407
2408 id := readMem(hGTA, dwAddress + 0x22, 2, "UShort")
2409 if(ErrorLevel) {
2410 ErrorLevel := ERROR_READ_MEMORY
2411 return -1
2412 }
2413 ErrorLevel := ERROR_OK
2414 return id
2415}
2416
2417; get the title of dialog
2418getDialogTitle()
2419{
2420 if(!checkHandles())
2421 return ""
2422 dwAddress := readDWORD(hGTA, dwSAMP + 0x21A0B8)
2423 if(ErrorLevel) {
2424 ErrorLevel := ERROR_READ_MEMORY
2425 return ""
2426 }
2427 text := readString(hGTA, dwAddress + 0x40, 128)
2428 if(ErrorLevel) {
2429 ErrorLevel := ERROR_READ_MEMORY
2430 return ""
2431 }
2432
2433 ErrorLevel := ERROR_OK
2434 return text
2435}
2436; get the color of player
2437; @author democrazy
2438getPlayerColor(id)
2439{
2440 id += 0
2441
2442 if(!checkHandles())
2443 return -1
2444
2445 color := readDWORD(hGTA, dwSAMP + 0x216378 + 4*id)
2446 if(ErrorLevel) {
2447 ErrorLevel := ERROR_READ_MEMORY
2448 return -1
2449 }
2450 return color
2451}
2452
2453; set the color of player
2454; @author democrazy
2455setPlayerColor(id,color)
2456{
2457 id += 0
2458 color +=0
2459
2460 if(!checkHandles())
2461 return
2462
2463 VarSetCapacity(bla, 4, 0)
2464 NumPut(color,bla,0,"UInt")
2465
2466 writeRaw(hGTA, dwSAMP + 0x216378 + 4*id, &bla, 4)
2467}
2468; convert color from decimal into hex
2469; @author democrazy
2470colorToStr(color)
2471{
2472 color += 0
2473 color >>= 8
2474 color &= 0xffffff
2475 SetFormat, IntegerFast, hex
2476 color += 0
2477 color .= ""
2478 StringTrimLeft, color, color, 2
2479 SetFormat, IntegerFast, d
2480 if (StrLen(color) == 5)
2481 color := "0"color
2482 return "{" color "}"
2483}
2484
2485; Get Interior param.
2486;;@autor Godarck
2487
2488GetInterior()
2489{
2490 dwAddress := readDWORD(hGTA, ADDR_SET_INTERIOR_OFFSET)
2491 if (ErrorLevel || dwAddress == 0) {
2492 ErrorLevel := ERROR_READ_MEMORY
2493 return false
2494 }
2495 return true
2496}
2497
2498; get current weapon id
2499; @author AnalFatal
2500getWeaponId()
2501{
2502 If(!checkHandles())
2503 return 0
2504
2505 c := readDWORD(hGTA, ADDR_CPED_PTR)
2506 If(ErrorLevel) {
2507 ErrorLevel := ERROR_READ_MEMORY
2508 return 0
2509 }
2510 id := readMem(hGTA, c + 0x740)
2511 If(ErrorLevel) {
2512 ErrorLevel := ERROR_READ_MEMORY
2513 return 0
2514 }
2515
2516 return id
2517}
2518writeFloat(hProcess, dwAddress, wFloat) {
2519 if(!hProcess) {
2520 ErrorLevel := ERROR_INVALID_HANDLE
2521 return false
2522 }
2523
2524 wFloat := FloatToHex(wFloat)
2525
2526 dwRet := DllCall( "WriteProcessMemory"
2527 , "UInt", hProcess
2528 , "UInt", dwAddress
2529 , "UInt *", wFloat
2530 , "UInt", 4
2531 , "UInt *", 0)
2532
2533 ErrorLevel := ERROR_OK
2534 return true
2535}
2536
2537writeByte(hProcess, dwAddress, wInt) {
2538 if(!hProcess) {
2539 ErrorLevel := ERROR_INVALID_HANDLE
2540 return false
2541 }
2542
2543 wInt := IntToHex(wInt)
2544
2545 dwRet := DllCall( "WriteProcessMemory"
2546 , "UInt", hProcess
2547 , "UInt", dwAddress
2548 , "UInt *", wInt
2549 , "UInt", 1
2550 , "UInt *", 0)
2551}
2552
2553FloatToHex(value) {
2554 format := A_FormatInteger
2555 SetFormat, Integer, H
2556 result := DllCall("MulDiv", Float, value, Int, 1, Int, 1, UInt)
2557 SetFormat, Integer, %format%
2558 return, result
2559}
2560
2561IntToHex(int)
2562{
2563 CurrentFormat := A_FormatInteger
2564 SetFormat, integer, hex
2565 int += 0
2566 SetFormat, integer, %CurrentFormat%
2567 return int
2568}
2569
2570disconnectEx() {
2571
2572 if(!checkHandles())
2573 return 0
2574
2575 dwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) ;g_SAMP
2576 if(ErrorLevel || dwAddress==0) {
2577 ErrorLevel := ERROR_READ_MEMORY
2578 return 0
2579 }
2580
2581 dwAddress := readDWORD(hGTA, dwAddress + 0x3c9) ;pRakClientInterface
2582 if(ErrorLevel || dwAddress==0) {
2583 ErrorLevel := ERROR_READ_MEMORY
2584 return 0
2585 }
2586
2587 ecx := dwAddress ;this
2588
2589 dwAddress := readDWORD(hGTA, dwAddress) ;vtable
2590 if(ErrorLevel || dwAddress==0) {
2591 ErrorLevel := ERROR_READ_MEMORY
2592 return 0
2593 }
2594
2595
2596
2597 VarSetCapacity(injectData, 24, 0) ;mov, call, retn
2598
2599 NumPut(0xB9, injectData, 0, "UChar") ;mov ecx 0+1
2600 NumPut(ecx, injectData, 1, "UInt") ;1+4
2601
2602 NumPut(0xB8, injectData, 5, "UChar") ;mov eax 5+1
2603 NumPut(dwAddress, injectData, 6, "UInt") ;6+4
2604
2605 ;NumPut(0x006A006A, injectData, 10, "UInt") ; 2x push 10+4
2606
2607 NumPut(0x68, injectData, 10, "UChar") ;10 + 1 ;push style
2608 NumPut(0, injectData, 11, "UInt") ;11 + 4
2609
2610 NumPut(0x68, injectData, 15, "UChar") ;15 + 1 ;push style
2611 NumPut(500, injectData, 16, "UInt") ;16 + 4
2612
2613 ;---
2614
2615 NumPut(0x50FF, injectData, 20, "UShort") ;20 + 2
2616 NumPut(0x08, injectData, 22, "UChar") ;22 + 1
2617
2618 NumPut(0xC3, injectData, 23, "UChar") ;retn 23+1
2619
2620 writeRaw(hGTA, pInjectFunc, &injectData, 24)
2621 if(ErrorLevel)
2622 return false
2623
2624 hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
2625 if(ErrorLevel)
2626 return false
2627
2628 waitForSingleObject(hThread, 0xFFFFFFFF)
2629
2630 closeProcess(hThread)
2631
2632 return true
2633}
2634setrestart()
2635{
2636 VarSetCapacity(old, 4, 0)
2637 dwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) ;g_SAMP
2638 if(ErrorLevel || dwAddress==0) {
2639 ErrorLevel := ERROR_READ_MEMORY
2640 return 0
2641 }
2642
2643 NumPut(9,old,0,"Int")
2644 writeRaw(hGTA, dwAddress + 957, &old, 4)
2645}
2646restartGameEx() {
2647
2648 if(!checkHandles())
2649 return -1
2650
2651 dwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) ;g_SAMP
2652 if(ErrorLevel || dwAddress==0) {
2653 ErrorLevel := ERROR_READ_MEMORY
2654 return -1
2655 }
2656
2657 dwFunc := dwSAMP + 0xA060
2658
2659 VarSetCapacity(injectData, 11, 0) ;mov, call, retn
2660
2661 NumPut(0xB9, injectData, 0, "UChar") ;mov ecx 0+1
2662 NumPut(dwAddress, injectData, 1, "UInt") ;1+4
2663 NumPut(0xE8, injectData, 5, "UChar") ;call 5+1
2664 offset := dwFunc - (pInjectFunc + 10)
2665 NumPut(offset, injectData, 6, "Int") ; 6+4
2666 NumPut(0xC3, injectData, 10, "UChar") ; 10+1
2667
2668 writeRaw(hGTA, pInjectFunc, &injectData, 11)
2669 if(ErrorLevel)
2670 return false
2671
2672 hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
2673 if(ErrorLevel)
2674 return false
2675
2676 waitForSingleObject(hThread, 0xFFFFFFFF)
2677
2678 closeProcess(hThread)
2679
2680 return true
2681}
2682; ##### SAMP-Funktionen #####
2683
2684isPlayerInStreamById(player_id, radius := 150)
2685{
2686 NAME := ""
2687 check := []
2688 p := getStreamedInPlayersInfo()
2689 if (!p)
2690 return 0
2691 For i, o in p ; берет игроков из стрима в переменную NAME
2692 {
2693 if (Floor(getDist(getCoordinates(), o.POS)) <= radius)
2694 {
2695 NAME .= o.NAME ", "
2696 }
2697 }
2698 if (IsObject(player_id)) ; Если получен массив
2699 {
2700 for k, v in player_id ; Проверяет находиться ли ид из массива в зоне стрима
2701 {
2702 i := 0
2703 Loop, Parse, % NAME, % ",", % " ,.`n`r"
2704 {
2705 if (A_LoopField == getPlayerNameById(v))
2706 {
2707 i := 1
2708 break
2709 }
2710 }
2711 if (i)
2712 check[v] := i
2713 else
2714 check[v] := i
2715 }
2716 return check
2717 }
2718 else if (!IsObject(player_id)) ; если передан ид
2719 {
2720
2721 if (!getPlayerNameById(player_id))
2722 return 0
2723 i := 0
2724 Loop, Parse, % NAME, % ",", % " ,.`n`r"
2725 {
2726 if (A_LoopField == getPlayerNameById(player_id))
2727 return 1
2728 }
2729 return 0
2730 }
2731}
2732
2733
2734IsSAMPAvailable() {
2735 if(!checkHandles())
2736 return false
2737
2738 dwChatInfo := readDWORD(hGTA, dwSAMP + ADDR_SAMP_CHATMSG_PTR)
2739
2740 if(dwChatInfo == 0 || dwChatInfo == "ERROR")
2741 {
2742 return false
2743 }
2744 else
2745 {
2746 return true
2747 }
2748}
2749isInChat() {
2750 if(!checkHandles())
2751 return -1
2752
2753 dwPtr := dwSAMP + ADDR_SAMP_INCHAT_PTR
2754 dwAddress := readDWORD(hGTA, dwPtr) + ADDR_SAMP_INCHAT_PTR_OFF
2755 if(ErrorLevel) {
2756 ErrorLevel := ERROR_READ_MEMORY
2757 return -1
2758 }
2759
2760 dwInChat := readDWORD(hGTA, dwAddress)
2761 if(ErrorLevel) {
2762 ErrorLevel := ERROR_READ_MEMORY
2763 return -1
2764 }
2765
2766 ErrorLevel := ERROR_OK
2767 if(dwInChat > 0) {
2768 return true
2769 } else {
2770 return false
2771 }
2772}
2773
2774getUsername() {
2775 if(!checkHandles())
2776 return ""
2777
2778 dwAddress := dwSAMP + ADDR_SAMP_USERNAME
2779 sUsername := readString(hGTA, dwAddress, 25)
2780 if(ErrorLevel) {
2781 ErrorLevel := ERROR_READ_MEMORY
2782 return ""
2783 }
2784
2785 ErrorLevel := ERROR_OK
2786 return sUsername
2787}
2788
2789getId() {
2790 s:=getUsername()
2791 return getPlayerIdByName(s)
2792}
2793
2794
2795SendChat(wText) {
2796 wText := "" wText
2797
2798 if(!checkHandles())
2799 return false
2800
2801 dwFunc:=0
2802 if(SubStr(wText, 1, 1) == "/") {
2803 dwFunc := dwSAMP + FUNC_SAMP_SENDCMD
2804 } else {
2805 dwFunc := dwSAMP + FUNC_SAMP_SENDSAY
2806 }
2807
2808 callWithParams(hGTA, dwFunc, [["s", wText]], false)
2809
2810 ErrorLevel := ERROR_OK
2811 return true
2812}
2813;=================================================[Работа с памятью]=========================================================
2814; Источник - http://dumpz.org/2345353/
2815ProcessReadMemory(address, processIDorName, type := "Int", numBytes := 4) {
2816 VarSetCapacity(buf, numBytes, 0)
2817 Process Exist, %processIDorName%
2818 if !processID := ErrorLevel
2819 return -1
2820 ;throw Exception("Invalid process name or process ID:`n`n""" . processIDorName . """")
2821 if !processHandle := DllCall("OpenProcess", "Int", 24, "UInt", 0, "UInt", processID, "Ptr")
2822 throw Exception("Failed to open process.`n`nError code:`t" . A_LastError)
2823 result := DllCall("ReadProcessMemory", "Ptr", processHandle, "Ptr", address, "Ptr", &buf, "Ptr", numBytes, "PtrP", numBytesRead, "UInt")
2824 if !DllCall("CloseHandle", "Ptr", processHandle, "UInt") && !result
2825 throw Exception("Failed to close process handle.`n`nError code:`t" . A_LastError)
2826 if !result
2827 throw Exception("Failed to read process memory.`n`nError code:`t" . A_LastError)
2828 if !numBytesRead
2829 throw Exception("Read 0 bytes from the`n`nprocess:`t" . processIDorName . "`naddress:`t" . address)
2830 return (type = "Str")
2831 ? StrGet(&buf, numBytes)
2832 : NumGet(buf, type)
2833}
2834ProcessWriteMemory(data, address, processIDorName, type := "Int", numBytes := 4) {
2835 VarSetCapacity(buf, numBytes, 0)
2836 (type = "Str")
2837 ? StrPut(data, &buf, numBytes)
2838 : NumPut(data, buf, type)
2839 Process Exist, %processIDorName%
2840 if !processID := ErrorLevel
2841 ;throw Exception("Invalid process name or process ID:`n`n""" . processIDorName . """")
2842 return
2843 if !processHandle := DllCall("OpenProcess", "Int", 40, "UInt", 0, "UInt", processID, "Ptr")
2844 throw Exception("Failed to open process.`n`nError code:`t" . A_LastError)
2845 result := DllCall("WriteProcessMemory", "Ptr", processHandle, "Ptr", address, "Ptr", &buf, "Ptr", numBytes, "UInt", 0, "UInt")
2846 if !DllCall("CloseHandle", "Ptr", processHandle, "UInt") && !result
2847 throw Exception("Failed to close process handle.`n`nError code:`t" . A_LastError)
2848 if !result
2849 ;throw Exception("Failed to write process memory.`n`nError code:`t" . A_LastError)
2850 return
2851 return result
2852}
2853;==================================================[Работа с памятью]==========================================================
2854addChatMessage(wText) {
2855 wText := "" wText
2856
2857 if(!checkHandles())
2858 return false
2859
2860 dwFunc := dwSAMP + FUNC_SAMP_ADDTOCHATWND
2861 dwChatInfo := readDWORD(hGTA, dwSAMP + ADDR_SAMP_CHATMSG_PTR)
2862 if(ErrorLevel) {
2863 ErrorLevel := ERROR_READ_MEMORY
2864 return false
2865 }
2866
2867 callWithParams(hGTA, dwFunc, [["p", dwChatInfo], ["s", wText]], true)
2868
2869 ErrorLevel := ERROR_OK
2870 return true
2871}
2872
2873showGameText(wText, dwTime, dwSize) {
2874 wText := "" wText
2875 dwTime += 0
2876 dwTime := Floor(dwTime)
2877 dwSize += 0
2878 dwSize := Floor(dwSize)
2879
2880 if(!checkHandles())
2881 return false
2882
2883 dwFunc := dwSAMP + FUNC_SAMP_SHOWGAMETEXT
2884
2885 callWithParams(hGTA, dwFunc, [["s", wText], ["i", dwTime], ["i", dwSize]], false)
2886
2887 ErrorLevel := ERROR_OK
2888 return true
2889}
2890
2891playAudioStream(wUrl) {
2892 wUrl := "" wUrl
2893
2894 if(!checkHandles())
2895 return false
2896
2897 dwFunc := dwSAMP + FUNC_SAMP_PLAYAUDIOSTR
2898
2899 patchRadio()
2900
2901 callWithParams(hGTA, dwFunc, [["s", wUrl], ["i", 0], ["i", 0], ["i", 0], ["i", 0], ["i", 0]], false)
2902
2903 unPatchRadio()
2904
2905 ErrorLevel := ERROR_OK
2906 return true
2907}
2908
2909stopAudioStream() {
2910 if(!checkHandles())
2911 return false
2912
2913 dwFunc := dwSAMP + FUNC_SAMP_STOPAUDIOSTR
2914
2915 patchRadio()
2916
2917 callWithParams(hGTA, dwFunc, [["i", 1]], false)
2918
2919 unPatchRadio()
2920
2921 ErrorLevel := ERROR_OK
2922 return true
2923}
2924
2925patchRadio()
2926{
2927 if(!checkHandles())
2928 return false
2929
2930 VarSetCapacity(nop, 4, 0)
2931 NumPut(0x90909090,nop,0,"UInt")
2932
2933 dwFunc := dwSAMP + FUNC_SAMP_PLAYAUDIOSTR
2934 writeRaw(hGTA, dwFunc, &nop, 4)
2935 writeRaw(hGTA, dwFunc+4, &nop, 1)
2936
2937 dwFunc := dwSAMP + FUNC_SAMP_STOPAUDIOSTR
2938 writeRaw(hGTA, dwFunc, &nop, 4)
2939 writeRaw(hGTA, dwFunc+4, &nop, 1)
2940 return true
2941}
2942
2943unPatchRadio()
2944{
2945 if(!checkHandles())
2946 return false
2947
2948 VarSetCapacity(old, 4, 0)
2949
2950 dwFunc := dwSAMP + FUNC_SAMP_PLAYAUDIOSTR
2951 NumPut(0x74003980,old,0,"UInt")
2952 writeRaw(hGTA, dwFunc, &old, 4)
2953 NumPut(0x39,old,0,"UChar")
2954 writeRaw(hGTA, dwFunc+4, &old, 1)
2955
2956 dwFunc := dwSAMP + FUNC_SAMP_STOPAUDIOSTR
2957 NumPut(0x74003980,old,0,"UInt")
2958 writeRaw(hGTA, dwFunc, &old, 4)
2959 NumPut(0x09,old,0,"UChar")
2960 writeRaw(hGTA, dwFunc+4, &old, 1)
2961 return true
2962}
2963
2964blockChatInput() {
2965 if(!checkHandles())
2966 return false
2967
2968 VarSetCapacity(nop, 2, 0)
2969
2970 dwFunc := dwSAMP + FUNC_SAMP_SENDSAY
2971 NumPut(0x04C2,nop,0,"Short")
2972 writeRaw(hGTA, dwFunc, &nop, 2)
2973
2974 dwFunc := dwSAMP + FUNC_SAMP_SENDCMD
2975 writeRaw(hGTA, dwFunc, &nop, 2)
2976
2977 return true
2978}
2979
2980unBlockChatInput() {
2981 if(!checkHandles())
2982 return false
2983
2984 VarSetCapacity(nop, 2, 0)
2985
2986 dwFunc := dwSAMP + FUNC_SAMP_SENDSAY
2987 NumPut(0xA164,nop,0,"Short")
2988 writeRaw(hGTA, dwFunc, &nop, 2)
2989
2990 dwFunc := dwSAMP + FUNC_SAMP_SENDCMD
2991 writeRaw(hGTA, dwFunc, &nop, 2)
2992
2993 return true
2994}
2995
2996getServerName() {
2997 if(!checkHandles())
2998 return -1
2999
3000 dwAdress := readMem(hGTA, dwSAMP + 0x21A0F8, 4, "int")
3001 if(ErrorLevel) {
3002 ErrorLevel := ERROR_READ_MEMORY
3003 return -1
3004 }
3005
3006 if(!dwAdress)
3007 return -1
3008
3009 ServerName := readString(hGTA, dwAdress + 0x121, 200)
3010
3011 if(ErrorLevel) {
3012 ErrorLevel := ERROR_READ_MEMORY
3013 return -1
3014 }
3015
3016 ErrorLevel := ERROR_OK
3017 return ServerName
3018}
3019
3020getServerIP() {
3021 if(!checkHandles())
3022 return -1
3023
3024 dwAdress := readMem(hGTA, dwSAMP + 0x21A0F8, 4, "int")
3025 if(ErrorLevel) {
3026 ErrorLevel := ERROR_READ_MEMORY
3027 return -1
3028 }
3029
3030 if(!dwAdress)
3031 return -1
3032
3033 ServerIP := readString(hGTA, dwAdress + 0x20, 100)
3034 if(ErrorLevel) {
3035 ErrorLevel := ERROR_READ_MEMORY
3036 return -1
3037 }
3038
3039 ErrorLevel := ERROR_OK
3040 return ServerIP
3041}
3042
3043getServerPort() {
3044 if(!checkHandles())
3045 return -1
3046
3047 dwAdress := readMem(hGTA, dwSAMP + 0x21A0F8, 4, "int")
3048 if(ErrorLevel) {
3049 ErrorLevel := ERROR_READ_MEMORY
3050 return -1
3051 }
3052
3053 if(!dwAdress)
3054 return -1
3055
3056 ServerPort := readMem(hGTA, dwAdress + 0x225, 4, "int")
3057 if(ErrorLevel) {
3058 ErrorLevel := ERROR_READ_MEMORY
3059 return -1
3060 }
3061
3062 ErrorLevel := ERROR_OK
3063 return ServerPort
3064}
3065
3066
3067getWeatherID() {
3068 if(!checkHandles())
3069 return -1
3070
3071 dwGTA := getModuleBaseAddress("gta_sa.exe", hGTA)
3072 WeatherID := readMem(hGTA, 0xC81320, 2, "byte")
3073 if(ErrorLevel) {
3074 ErrorLevel := ERROR_READ_MEMORY
3075 return -1
3076 }
3077
3078 ErrorLevel := ERROR_OK
3079 return WeatherID
3080}
3081
3082getWeatherName() {
3083 if(isPlayerInAnyVehicle() == 0)
3084 return -1
3085
3086 if(id >= 0 && id < 23)
3087 {
3088 return oweatherNames[id-1]
3089 }
3090 return ""
3091}
3092
3093; ##### Extra-Player-Funktionen #####
3094; by Godarck
3095isTargetDriverbyId(dwId)
3096{
3097 if(!checkHandles())
3098 return -1
3099 dwPedPointer := getPedById(dwId)
3100 dwAddrVPtr := getVehiclePointerByPed(dwPedPointer)
3101 if(ErrorLevel) {
3102 ErrorLevel := ERROR_READ_MEMORY
3103 return -1
3104 }
3105 dwVal := readDWORD(hGTA, dwAddrVPtr + ADDR_VEHICLE_DRIVER)
3106 if(ErrorLevel) {
3107 ErrorLevel := ERROR_READ_MEMORY
3108 return -1
3109 }
3110 ErrorLevel := ERROR_OK
3111 return (dwVal == dwPedPointer)
3112}
3113getTargetPed() {
3114 if(!checkHandles())
3115 return 0
3116
3117 dwAddress := readDWORD(hGTA, 0xB6F3B8)
3118 if(ErrorLevel) {
3119 ErrorLevel := ERROR_READ_MEMORY
3120 return 0
3121 }
3122 if(!dwAddress)
3123 return 0
3124
3125 dwAddress := readDWORD(hGTA, dwAddress+0x79C)
3126 if(ErrorLevel) {
3127 ErrorLevel := ERROR_READ_MEMORY
3128 return 0
3129 }
3130
3131 ErrorLevel := ERROR_OK
3132 return dwAddress
3133}
3134
3135calcScreenCoors(fX,fY,fZ)
3136{
3137 if(!checkHandles())
3138 return false
3139
3140 dwM := 0xB6FA2C
3141
3142 m_11 := readFloat(hGTA, dwM + 0*4)
3143 if(ErrorLevel) {
3144 ErrorLevel := ERROR_READ_MEMORY
3145 return false
3146 }
3147
3148 m_12 := readFloat(hGTA, dwM + 1*4)
3149 m_13 := readFloat(hGTA, dwM + 2*4)
3150 m_21 := readFloat(hGTA, dwM + 4*4)
3151 m_22 := readFloat(hGTA, dwM + 5*4)
3152 m_23 := readFloat(hGTA, dwM + 6*4)
3153 m_31 := readFloat(hGTA, dwM + 8*4)
3154 m_32 := readFloat(hGTA, dwM + 9*4)
3155 m_33 := readFloat(hGTA, dwM + 10*4)
3156 m_41 := readFloat(hGTA, dwM + 12*4)
3157 m_42 := readFloat(hGTA, dwM + 13*4)
3158 m_43 := readFloat(hGTA, dwM + 14*4)
3159
3160 dwLenX := readDWORD(hGTA, 0xC17044)
3161 if(ErrorLevel) {
3162 ErrorLevel := ERROR_READ_MEMORY
3163 return false
3164 }
3165 dwLenY := readDWORD(hGTA, 0xC17048)
3166
3167 frX := fZ * m_31 + fY * m_21 + fX * m_11 + m_41
3168 frY := fZ * m_32 + fY * m_22 + fX * m_12 + m_42
3169 frZ := fZ * m_33 + fY * m_23 + fX * m_13 + m_43
3170
3171 fRecip := 1.0/frZ
3172 frX *= fRecip * dwLenX
3173 frY *= fRecip * dwLenY
3174
3175 if(frX<=dwLenX && frY<=dwLenY && frZ>1)
3176 return [frX,frY,frZ]
3177}
3178ConvertCarColor(Color)
3179{
3180 ArrayRGB := ["0xF5F5F5FF", "0x2A77A1FF", "0x840410FF", "0x263739FF", "0x86446EFF", "0xD78E10FF", "0x4C75B7FF", "0xBDBEC6FF", "0x5E7072FF", "0x46597AFF", "0x656A79FF", "0x5D7E8DFF", "0x58595AFF", "0xD6DAD6FF", "0x9CA1A3FF", "0x335F3FFF", "0x730E1AFF", "0x7B0A2AFF", "0x9F9D94FF", "0x3B4E78FF", "0x732E3EFF", "0x691E3BFF", "0x96918CFF", "0x515459FF", "0x3F3E45FF", "0xA5A9A7FF", "0x635C5AFF", "0x3D4A68FF", "0x979592FF", "0x421F21FF", "0x5F272BFF", "0x8494ABFF", "0x767B7CFF", "0x646464FF", "0x5A5752FF", "0x252527FF", "0x2D3A35FF", "0x93A396FF", "0x6D7A88FF", "0x221918FF", "0x6F675FFF", "0x7C1C2AFF", "0x5F0A15FF", "0x193826FF", "0x5D1B20FF", "0x9D9872FF", "0x7A7560FF", "0x989586FF", "0xADB0B0FF", "0x848988FF", "0x304F45FF", "0x4D6268FF", "0x162248FF", "0x272F4BFF", "0x7D6256FF", "0x9EA4ABFF", "0x9C8D71FF", "0x6D1822FF", "0x4E6881FF", "0x9C9C98FF", "0x917347FF", "0x661C26FF", "0x949D9FFF", "0xA4A7A5FF", "0x8E8C46FF", "0x341A1EFF", "0x6A7A8CFF", "0xAAAD8EFF", "0xAB988FFF", "0x851F2EFF", "0x6F8297FF", "0x585853FF", "0x9AA790FF", "0x601A23FF", "0x20202CFF", "0xA4A096FF", "0xAA9D84FF", "0x78222BFF", "0x0E316DFF", "0x722A3FFF", "0x7B715EFF", "0x741D28FF", "0x1E2E32FF", "0x4D322FFF", "0x7C1B44FF", "0x2E5B20FF", "0x395A83FF", "0x6D2837FF", "0xA7A28FFF", "0xAFB1B1FF", "0x364155FF", "0x6D6C6EFF", "0x0F6A89FF", "0x204B6BFF", "0x2B3E57FF", "0x9B9F9DFF", "0x6C8495FF", "0x4D8495FF", "0xAE9B7FFF", "0x406C8FFF", "0x1F253BFF", "0xAB9276FF", "0x134573FF", "0x96816CFF", "0x64686AFF", "0x105082FF", "0xA19983FF", "0x385694FF", "0x525661FF", "0x7F6956FF", "0x8C929AFF", "0x596E87FF", "0x473532FF", "0x44624FFF", "0x730A27FF", "0x223457FF", "0x640D1BFF", "0xA3ADC6FF", "0x695853FF", "0x9B8B80FF", "0x620B1CFF", "0x5B5D5EFF", "0x624428FF", "0x731827FF", "0x1B376DFF", "0xEC6AAEFF", "0x000000FF"]
3181 ArrayRGBNew := ["0x177517FF", "0x210606FF", "0x125478FF", "0x452A0DFF", "0x571E1EFF", "0x010701FF", "0x25225AFF", "0x2C89AAFF", "0x8A4DBDFF", "0x35963AFF", "0xB7B7B7FF", "0x464C8DFF", "0x84888CFF", "0x817867FF", "0x817A26FF", "0x6A506FFF", "0x583E6FFF", "0x8CB972FF", "0x824F78FF", "0x6D276AFF", "0x1E1D13FF", "0x1E1306FF", "0x1F2518FF", "0x2C4531FF", "0x1E4C99FF", "0x2E5F43FF", "0x1E9948FF", "0x1E9999FF", "0x999976FF", "0x7C8499FF", "0x992E1EFF", "0x2C1E08FF", "0x142407FF", "0x993E4DFF", "0x1E4C99FF", "0x198181FF", "0x1A292AFF", "0x16616FFF", "0x1B6687FF", "0x6C3F99FF", "0x481A0EFF", "0x7A7399FF", "0x746D99FF", "0x53387EFF", "0x222407FF", "0x3E190CFF", "0x46210EFF", "0x991E1EFF", "0x8D4C8DFF", "0x805B80FF", "0x7B3E7EFF", "0x3C1737FF", "0x733517FF", "0x781818FF", "0x83341AFF", "0x8E2F1CFF", "0x7E3E53FF", "0x7C6D7CFF", "0x020C02FF", "0x072407FF", "0x163012FF", "0x16301BFF", "0x642B4FFF", "0x368452FF", "0x999590FF", "0x818D96FF", "0x99991EFF", "0x7F994CFF", "0x839292FF", "0x788222FF", "0x2B3C99FF", "0x3A3A0BFF", "0x8A794EFF", "0x0E1F49FF", "0x15371CFF", "0x15273AFF", "0x375775FF", "0x060820FF", "0x071326FF", "0x20394BFF", "0x2C5089FF", "0x15426CFF", "0x103250FF", "0x241663FF", "0x692015FF", "0x8C8D94FF", "0x516013FF", "0x090F02FF", "0x8C573AFF", "0x52888EFF", "0x995C52FF", "0x99581EFF", "0x993A63FF", "0x998F4EFF", "0x99311EFF", "0x0D1842FF", "0x521E1EFF", "0x42420DFF", "0x4C991EFF", "0x082A1DFF", "0x96821DFF", "0x197F19FF", "0x3B141FFF", "0x745217FF", "0x893F8DFF", "0x7E1A6CFF", "0x0B370BFF", "0x27450DFF", "0x071F24FF", "0x784573FF", "0x8A653AFF", "0x732617FF", "0x319490FF", "0x56941DFF", "0x59163DFF", "0x1B8A2FFF", "0x38160BFF", "0x041804FF", "0x355D8EFF", "0x2E3F5BFF", "0x561A28FF", "0x4E0E27FF", "0x706C67FF", "0x3B3E42FF", "0x2E2D33FF", "0x7B7E7DFF", "0x4A4442FF", "0x28344EFF"]
3182if (Color > 0) and (Color < 128)
3183 RGB := ArrayRGB[Color]
3184if (Color > 127) and (Color < 256)
3185{
3186 RGB := ArrayRGBNew[Color + 127]
3187}
3188StringLeft, RGBTemp, RGB, 8
3189StringRight, RGB, RGBTemp, 6
3190if Color = 0
3191 RGB := "000000"
3192return RGB
3193}
3194;--
3195getPedById(dwId) {
3196 dwId += 0
3197 dwId := Floor(dwId)
3198 if(dwId < 0 || dwId >= SAMP_PLAYER_MAX)
3199 return 0
3200
3201 if(iRefreshScoreboard+iUpdateTick > A_TickCount)
3202 {
3203 if(oScoreboardData[dwId])
3204 {
3205 if(oScoreboardData[dwId].HasKey("PED"))
3206 return oScoreboardData[dwId].PED
3207 }
3208 return 0
3209 }
3210
3211 if(!updateOScoreboardData())
3212 return 0
3213
3214 if(oScoreboardData[dwId])
3215 {
3216 if(oScoreboardData[dwId].HasKey("PED"))
3217 return oScoreboardData[dwId].PED
3218 }
3219 return 0
3220}
3221
3222getIdByPed(dwPed) {
3223 dwPed += 0
3224 dwPed := Floor(dwPed)
3225 if(!dwPed)
3226 return -1
3227
3228 if(iRefreshScoreboard+iUpdateTick > A_TickCount)
3229 {
3230 For i, o in oScoreboardData
3231 {
3232 if(o.HasKey("PED"))
3233 {
3234 if(o.PED==dwPed)
3235 return i
3236 }
3237 }
3238 return -1
3239 }
3240
3241 if(!updateOScoreboardData())
3242 return -1
3243
3244 For i, o in oScoreboardData
3245 {
3246 if(o.HasKey("PED"))
3247 {
3248 if(o.PED==dwPed)
3249 return i
3250 }
3251 }
3252 return -1
3253}
3254IsInAFK() {
3255 res := ProcessReadMemory(0xBA6748 + 0x5C, "gta_sa.exe")
3256 if (res==-1)
3257 return -1
3258 WinGet, win, MinMax, GTA:SA:MP
3259 if ((res=0) and (win=-1)) or res=1
3260 return 1
3261 return 0
3262}
3263getStreamedInPlayersInfo() {
3264 r:=[]
3265 if(iRefreshScoreboard+iUpdateTick > A_TickCount)
3266 {
3267 For i, o in oScoreboardData
3268 {
3269 if(o.HasKey("PED"))
3270 {
3271 p := getPedCoordinates(o.PED)
3272 if(p)
3273 {
3274 o.POS := p
3275 r[i] := o
3276 }
3277 }
3278 }
3279 return r
3280 }
3281
3282 if(!updateOScoreboardData())
3283 return ""
3284
3285 For i, o in oScoreboardData
3286 {
3287 if(o.HasKey("PED"))
3288 {
3289 p := getPedCoordinates(o.PED)
3290 if(p)
3291 {
3292 o.POS := p
3293 r[i] := o
3294 }
3295 }
3296 }
3297 return r
3298}
3299
3300callFuncForAllStreamedInPlayers(cfunc,dist=0x7fffffff) {
3301 cfunc := "" cfunc
3302 dist += 0
3303 if(!IsFunc(cfunc))
3304 return false
3305 p := getStreamedInPlayersInfo()
3306 if(!p)
3307 return false
3308 if(dist<0x7fffffff)
3309 {
3310 lpos := getCoordinates()
3311 if(!lpos)
3312 return false
3313 For i, o in p
3314 {
3315 if(dist>getDist(lpos,o.POS))
3316 %cfunc%(o)
3317 }
3318 }
3319 else
3320 {
3321 For i, o in p
3322 %cfunc%(o)
3323 }
3324 return true
3325}
3326
3327getDist(pos1,pos2) {
3328 if(!pos1 || !pos2)
3329 return 0
3330 return Sqrt((pos1[1]-pos2[1])*(pos1[1]-pos2[1])+(pos1[2]-pos2[2])*(pos1[2]-pos2[2])+(pos1[3]-pos2[3])*(pos1[3]-pos2[3]))
3331}
3332getClosestPlayerPed() {
3333 dist := 0x7fffffff ;max int32
3334 p := getStreamedInPlayersInfo()
3335 if(!p)
3336 return -1
3337 lpos := getCoordinates()
3338 if(!lpos)
3339 return -1
3340 id := -1
3341 For i, o in p
3342 {
3343 t:=getDist(lpos,o.POS)
3344 if(t<dist)
3345 {
3346 dist := t
3347 id := i
3348 }
3349 }
3350 PED := getPedById(id)
3351 return PED
3352}
3353
3354getClosestPlayerId() {
3355 dist := 0x7fffffff ;max int32
3356 p := getStreamedInPlayersInfo()
3357 if(!p)
3358 return -1
3359 lpos := getCoordinates()
3360 if(!lpos)
3361 return -1
3362 id := -1
3363 For i, o in p
3364 {
3365 t:=getDist(lpos,o.POS)
3366 if(t<dist)
3367 {
3368 dist := t
3369 id := i
3370 }
3371 }
3372 return id
3373}
3374
3375CountOnlinePlayers() {
3376if(!checkHandles())
3377return -1
3378dwOnline := readDWORD(hGTA, dwSAMP + 0x21A0B4)
3379if(ErrorLevel) {
3380ErrorLevel := ERROR_READ_MEMORY
3381return -1
3382}
3383dwAddr := dwOnline + 0x4
3384OnlinePlayers := readDWORD(hGTA, dwAddr)
3385if(ErrorLevel) {
3386ErrorLevel := ERROR_READ_MEMORY
3387return -1
3388}
3389ErrorLevel := ERROR_OK
3390return OnlinePlayers
3391}
3392
3393getPedCoordinates(dwPED) {
3394 dwPED += 0
3395 dwPED := Floor(dwPED)
3396 if(!dwPED)
3397 return ""
3398
3399 if(!checkHandles())
3400 return ""
3401
3402 dwAddress := readDWORD(hGTA, dwPED + 0x14)
3403 if(ErrorLevel || dwAddress==0) {
3404 ErrorLevel := ERROR_READ_MEMORY
3405 return ""
3406 }
3407
3408 fX := readFloat(hGTA, dwAddress + 0x30)
3409 if(ErrorLevel) {
3410 ErrorLevel := ERROR_READ_MEMORY
3411 return ""
3412 }
3413
3414 fY := readFloat(hGTA, dwAddress + 0x34)
3415 if(ErrorLevel) {
3416 ErrorLevel := ERROR_READ_MEMORY
3417 return ""
3418 }
3419
3420 fZ := readFloat(hGTA, dwAddress + 0x38)
3421 if(ErrorLevel) {
3422 ErrorLevel := ERROR_READ_MEMORY
3423 return ""
3424 }
3425
3426 ErrorLevel := ERROR_OK
3427 return [fX, fY, fZ]
3428}
3429
3430getTargetPos(dwId) {
3431 dwId += 0
3432 dwId := Floor(dwId)
3433 if(dwId < 0 || dwId >= SAMP_PLAYER_MAX)
3434 return ""
3435
3436 if(iRefreshScoreboard+iUpdateTick > A_TickCount)
3437 {
3438 if(oScoreboardData[dwId])
3439 {
3440 if(oScoreboardData[dwId].HasKey("PED"))
3441 return getPedCoordinates(oScoreboardData[dwId].PED)
3442 if(oScoreboardData[dwId].HasKey("MPOS"))
3443 return oScoreboardData[dwId].MPOS
3444 }
3445 return ""
3446 }
3447
3448 if(!updateOScoreboardData())
3449 return ""
3450
3451 if(oScoreboardData[dwId])
3452 {
3453 if(oScoreboardData[dwId].HasKey("PED"))
3454 return getPedCoordinates(oScoreboardData[dwId].PED)
3455 if(oScoreboardData[dwId].HasKey("MPOS"))
3456 return oScoreboardData[dwId].MPOS
3457 }
3458 return ""
3459}
3460
3461getTargetPlayerSkinIdByPed(dwPED) {
3462 if(!checkHandles())
3463 return -1
3464
3465 dwAddr := dwPED + ADDR_CPED_SKINIDOFF
3466 SkinID := readMem(hGTA, dwAddr, 2, "byte")
3467 if(ErrorLevel) {
3468 ErrorLevel := ERROR_READ_MEMORY
3469 return -1
3470 }
3471
3472 ErrorLevel := ERROR_OK
3473 return SkinID
3474}
3475
3476getTargetPlayerSkinIdById(dwId) {
3477 if(!checkHandles())
3478 return -1
3479
3480 dwPED := getPedById(dwId)
3481 dwAddr := dwPED + ADDR_CPED_SKINIDOFF
3482
3483 SkinID := readMem(hGTA, dwAddr, 2, "byte")
3484 if(ErrorLevel) {
3485 ErrorLevel := ERROR_READ_MEMORY
3486 return -1
3487 }
3488
3489 ErrorLevel := ERROR_OK
3490 return SkinID
3491}
3492
3493; ##### Extra-Player-Fahrzeug-Funktionenn #####
3494
3495NearPlayerInCar(dist)
3496{
3497 TempDist := 100000
3498 if(!p := getStreamedInPlayersInfo())
3499 return false
3500 if(!lpos := getCoordinates())
3501 return false
3502 for i, o in p
3503 {
3504 t := getDist(lpos, o.POS)
3505 if(t <= dist)
3506 {
3507 if(t < TempDist && t > 5 && isTargetInAnyVehiclebyId(o.ID))
3508 TempId := i, TempDist := t
3509 }
3510 }
3511 return TempId
3512}
3513
3514getVehiclePointerByPed(dwPED) {
3515 dwPED += 0
3516 dwPED := Floor(dwPED)
3517 if(!dwPED)
3518 return 0
3519 if(!checkHandles())
3520 return 0
3521 dwAddress := readDWORD(hGTA, dwPED + 0x58C)
3522 if(ErrorLevel) {
3523 ErrorLevel := ERROR_READ_MEMORY
3524 return 0
3525 }
3526 ErrorLevel := ERROR_OK
3527 return dwAddress
3528}
3529
3530getVehiclePointerById(dwId) {
3531 if(!dwId)
3532 return 0
3533 if(!checkHandles())
3534 return 0
3535
3536 dwPed_By_Id := getPedById(dwId)
3537
3538 dwAddress := readDWORD(hGTA, dwPed_By_Id + 0x58C)
3539 if(ErrorLevel) {
3540 ErrorLevel := ERROR_READ_MEMORY
3541 return 0
3542 }
3543 ErrorLevel := ERROR_OK
3544 return dwAddress
3545}
3546
3547isTargetInAnyVehicleByPed(dwPED)
3548{
3549 if(!checkHandles())
3550 return -1
3551
3552 dwVehiclePointer := getVehiclePointerByPed(dwPedPointer)
3553
3554 if(dwVehiclePointer > 0)
3555 {
3556 return 1
3557 }
3558 else if(dwVehiclePointer <= 0)
3559 {
3560 return 0
3561 }
3562 else
3563 {
3564 return -1
3565 }
3566}
3567
3568isTargetInAnyVehiclebyId(dwId)
3569{
3570 if(!checkHandles())
3571 return -1
3572
3573 dwPedPointer := getPedById(dwId)
3574 dwVehiclePointer := getVehiclePointerByPed(dwPedPointer)
3575
3576 if(dwVehiclePointer > 0)
3577 {
3578 return 1
3579 }
3580 else if(dwVehiclePointer <= 0)
3581 {
3582 return 0
3583 }
3584 else
3585 {
3586 return -1
3587 }
3588}
3589
3590getTargetVehicleHealthByPed(dwPed) {
3591 if(!checkHandles())
3592 return -1
3593
3594 dwVehPtr := getVehiclePointerByPed(dwPed)
3595 dwAddr := dwVehPtr + ADDR_VEHICLE_HPOFF
3596 fHealth := readFloat(hGTA, dwAddr)
3597 if(ErrorLevel) {
3598 ErrorLevel := ERROR_READ_MEMORY
3599 return -1
3600 }
3601
3602 ErrorLevel := ERROR_OK
3603 return Round(fHealth)
3604}
3605
3606getTargetVehicleHealthById(dwId) {
3607 if(!checkHandles())
3608 return -1
3609
3610 dwVehPtr := getVehiclePointerById(dwId)
3611 dwAddr := dwVehPtr + ADDR_VEHICLE_HPOFF
3612 fHealth := readFloat(hGTA, dwAddr)
3613 if(ErrorLevel) {
3614 ErrorLevel := ERROR_READ_MEMORY
3615 return -1
3616 }
3617
3618 ErrorLevel := ERROR_OK
3619 return Round(fHealth)
3620}
3621
3622getTargetVehicleTypeByPed(dwPED) {
3623 if(!checkHandles())
3624 return 0
3625
3626 dwAddr := getVehiclePointerByPed(dwPED)
3627
3628 if(!dwAddr)
3629 return 0
3630
3631 cVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_TYPE, 1, "Char")
3632 if(ErrorLevel) {
3633 ErrorLevel := ERROR_READ_MEMORY
3634 return 0
3635 }
3636
3637 ErrorLevel := ERROR_OK
3638 if(!cVal)
3639 {
3640 mid := getVehicleModelId()
3641 Loop % oAirplaneModels.MaxIndex()
3642 {
3643 if(oAirplaneModels[A_Index]==mid)
3644 return 5
3645 }
3646 return 1
3647 }
3648 else if(cVal==5)
3649 return 2
3650 else if(cVal==6)
3651 return 3
3652 else if(cVal==9)
3653 {
3654 mid := getVehicleModelId()
3655 Loop % oBikeModels.MaxIndex()
3656 {
3657 if(oBikeModels[A_Index]==mid)
3658 return 6
3659 }
3660 return 4
3661 }
3662 return 0
3663}
3664
3665getTargetVehicleTypeById(dwId) {
3666 if(!checkHandles())
3667 return 0
3668
3669 dwAddr := getVehiclePointerById(dwId)
3670
3671 if(!dwAddr)
3672 return 0
3673
3674 cVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_TYPE, 1, "Char")
3675 if(ErrorLevel) {
3676 ErrorLevel := ERROR_READ_MEMORY
3677 return 0
3678 }
3679
3680 ErrorLevel := ERROR_OK
3681 if(!cVal)
3682 {
3683 mid := getVehicleModelId()
3684 Loop % oAirplaneModels.MaxIndex()
3685 {
3686 if(oAirplaneModels[A_Index]==mid)
3687 return 5
3688 }
3689 return 1
3690 }
3691 else if(cVal==5)
3692 return 2
3693 else if(cVal==6)
3694 return 3
3695 else if(cVal==9)
3696 {
3697 mid := getVehicleModelId()
3698 Loop % oBikeModels.MaxIndex()
3699 {
3700 if(oBikeModels[A_Index]==mid)
3701 return 6
3702 }
3703 return 4
3704 }
3705 return 0
3706}
3707
3708getTargetVehicleModelIdByPed(dwPED) {
3709 if(!checkHandles())
3710 return 0
3711
3712 dwAddr := getVehiclePointerByPed(dwPED)
3713
3714 if(!dwAddr)
3715 return 0
3716
3717 sVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_MODEL, 2, "Short")
3718 if(ErrorLevel) {
3719 ErrorLevel := ERROR_READ_MEMORY
3720 return 0
3721 }
3722
3723 ErrorLevel := ERROR_OK
3724 return sVal
3725}
3726
3727getTargetVehicleModelIdById(dwId) {
3728 if(!checkHandles())
3729 return 0
3730
3731 dwAddr := getVehiclePointerById(dwId)
3732
3733 if(!dwAddr)
3734 return 0
3735
3736 sVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_MODEL, 2, "Short")
3737 if(ErrorLevel) {
3738 ErrorLevel := ERROR_READ_MEMORY
3739 return 0
3740 }
3741
3742 ErrorLevel := ERROR_OK
3743 return sVal
3744}
3745
3746getTargetVehicleModelNameByPed(dwPED) {
3747 id := getTargetVehicleModelIdByPed(dwPED)
3748 if(id > 400 && id < 611)
3749 {
3750 return ovehicleNames[id-399]
3751 }
3752 return ""
3753}
3754
3755getTargetVehicleModelNameById(dwId) {
3756 id := getTargetVehicleModelIdById(dwId)
3757 if(id > 400 && id < 611)
3758 {
3759 return ovehicleNames[id-399]
3760 }
3761 return ""
3762}
3763
3764getTargetVehicleLightStateByPed(dwPED) {
3765 if(!checkHandles())
3766 return -1
3767
3768 dwAddr := getVehiclePointerByPed(dwPED)
3769
3770 if(!dwAddr)
3771 return -1
3772
3773 dwVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_LIGHTSTATE, 1, "byte")
3774 if(ErrorLevel) {
3775 ErrorLevel := ERROR_READ_MEMORY
3776 return -1
3777 }
3778
3779 ErrorLevel := ERROR_OK
3780 return (dwVal>0)
3781}
3782
3783
3784getTargetVehicleLightStateById(dwId) {
3785 if(!checkHandles())
3786 return -1
3787
3788 dwAddr := getVehiclePointerById(dwId)
3789
3790 if(!dwAddr)
3791 return -1
3792
3793 dwVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_LIGHTSTATE, 1, "byte")
3794 if(ErrorLevel) {
3795 ErrorLevel := ERROR_READ_MEMORY
3796 return -1
3797 }
3798
3799 ErrorLevel := ERROR_OK
3800 return (dwVal>0)
3801}
3802
3803getTargetVehicleLockStateByPed(dwPED) {
3804 if(!checkHandles())
3805 return -1
3806
3807 dwAddr := getVehiclePointerByPed(dwPED)
3808
3809 if(!dwAddr)
3810 return -1
3811
3812 dwVal := readDWORD(hGTA, dwAddr + ADDR_VEHICLE_DOORSTATE)
3813 if(ErrorLevel) {
3814 ErrorLevel := ERROR_READ_MEMORY
3815 return -1
3816 }
3817
3818 ErrorLevel := ERROR_OK
3819 return (dwVal==2)
3820}
3821
3822getTargetVehicleLockStateById(dwId) {
3823 if(!checkHandles())
3824 return -1
3825
3826 dwAddr := getVehiclePointerById(dwId)
3827
3828 if(!dwAddr)
3829 return -1
3830
3831 dwVal := readDWORD(hGTA, dwAddr + ADDR_VEHICLE_DOORSTATE)
3832 if(ErrorLevel) {
3833 ErrorLevel := ERROR_READ_MEMORY
3834 return -1
3835 }
3836
3837 ErrorLevel := ERROR_OK
3838 return (dwVal==2)
3839}
3840
3841getTargetVehicleColor1byPed(dwPED) {
3842 if(!checkHandles())
3843 return 0
3844
3845 dwAddr := getVehiclePointerByPed(dwPED)
3846
3847 if(!dwAddr)
3848 return 0
3849
3850 sVal := readMem(hGTA, dwAddr + 1076, 1, "byte")
3851
3852 if(ErrorLevel) {
3853 ErrorLevel := ERROR_READ_MEMORY
3854 return 0
3855 }
3856
3857 ErrorLevel := ERROR_OK
3858 return sVal
3859}
3860
3861getTargetVehicleColor1byId(dwId) {
3862 if(!checkHandles())
3863 return 0
3864
3865 dwAddr := getVehiclePointerById(dwId)
3866
3867 if(!dwAddr)
3868 return 0
3869
3870 sVal := readMem(hGTA, dwAddr + 1076, 1, "byte")
3871
3872 if(ErrorLevel) {
3873 ErrorLevel := ERROR_READ_MEMORY
3874 return 0
3875 }
3876
3877 ErrorLevel := ERROR_OK
3878 return sVal
3879}
3880
3881getTargetVehicleColor2byPed(dwPED) {
3882 if(!checkHandles())
3883 return 0
3884
3885 dwAddr := getVehiclePointerByPed(dwPED)
3886
3887 if(!dwAddr)
3888 return 0
3889
3890 sVal := readMem(hGTA, dwAddr + 1077, 1, "byte")
3891
3892 if(ErrorLevel) {
3893 ErrorLevel := ERROR_READ_MEMORY
3894 return 0
3895 }
3896
3897 ErrorLevel := ERROR_OK
3898 return sVal
3899}
3900
3901getTargetVehicleColor2byId(dwId) {
3902 if(!checkHandles())
3903 return 0
3904
3905 dwAddr := getVehiclePointerById(dwId)
3906
3907 if(!dwAddr)
3908 return 0
3909
3910 sVal := readMem(hGTA, dwAddr + 1077, 1, "byte")
3911
3912 if(ErrorLevel) {
3913 ErrorLevel := ERROR_READ_MEMORY
3914 return 0
3915 }
3916
3917 ErrorLevel := ERROR_OK
3918 return sVal
3919}
3920
3921getTargetVehicleSpeedByPed(dwPED) {
3922 if(!checkHandles())
3923 return -1
3924
3925 dwAddr := getVehiclePointerByPed(dwPED)
3926
3927 fSpeedX := readMem(hGTA, dwAddr + ADDR_VEHICLE_X, 4, "float")
3928 fSpeedY := readMem(hGTA, dwAddr + ADDR_VEHICLE_Y, 4, "float")
3929 fSpeedZ := readMem(hGTA, dwAddr + ADDR_VEHICLE_Z, 4, "float")
3930
3931 fVehicleSpeed := sqrt((fSpeedX * fSpeedX) + (fSpeedY * fSpeedY) + (fSpeedZ * fSpeedZ))
3932 fVehicleSpeed := (fVehicleSpeed * 100) * 1.43 ;Der Wert "1.43" ist meistens auf jedem Server anders. Die Geschwindigkeit wird somit erhГѓВ¶ht bzw. verringert
3933
3934 return fVehicleSpeed
3935}
3936
3937getTargetVehicleSpeedById(dwId) {
3938 if(!checkHandles())
3939 return -1
3940
3941 dwAddr := getVehiclePointerById(dwId)
3942
3943 fSpeedX := readMem(hGTA, dwAddr + ADDR_VEHICLE_X, 4, "float")
3944 fSpeedY := readMem(hGTA, dwAddr + ADDR_VEHICLE_Y, 4, "float")
3945 fSpeedZ := readMem(hGTA, dwAddr + ADDR_VEHICLE_Z, 4, "float")
3946
3947 fVehicleSpeed := sqrt((fSpeedX * fSpeedX) + (fSpeedY * fSpeedY) + (fSpeedZ * fSpeedZ))
3948 fVehicleSpeed := (fVehicleSpeed * 100) * 1.43 ;Der Wert "1.43" ist meistens auf jedem Server anders. Die Geschwindigkeit wird somit erhГѓВ¶ht bzw. verringert
3949
3950 return fVehicleSpeed
3951}
3952; ##### Scoreboard-Funktionen #####
3953
3954getPlayerNameById(dwId) {
3955 dwId += 0
3956 dwId := Floor(dwId)
3957 if(dwId < 0 || dwId >= SAMP_PLAYER_MAX)
3958 return ""
3959
3960 if(iRefreshScoreboard+iUpdateTick > A_TickCount)
3961 {
3962 if(oScoreboardData[dwId])
3963 return oScoreboardData[dwId].NAME
3964 return ""
3965 }
3966
3967 if(!updateOScoreboardData())
3968 return ""
3969
3970 if(oScoreboardData[dwId])
3971 return oScoreboardData[dwId].NAME
3972 return ""
3973}
3974
3975getPlayerIdByName(wName) {
3976 wName := "" wName
3977 if(StrLen(wName) < 1 || StrLen(wName) > 24)
3978 return -1
3979
3980 if(iRefreshScoreboard+iUpdateTick > A_TickCount)
3981 {
3982 For i, o in oScoreboardData
3983 {
3984 if(InStr(o.NAME,wName)==1)
3985 return i
3986 }
3987 return -1
3988 }
3989
3990 if(!updateOScoreboardData())
3991 return -1
3992
3993 For i, o in oScoreboardData
3994 {
3995 if(InStr(o.NAME,wName)==1)
3996 return i
3997 }
3998 return -1
3999}
4000
4001getPlayerScoreById(dwId) {
4002 dwId += 0
4003 dwId := Floor(dwId)
4004 if(dwId < 0 || dwId >= SAMP_PLAYER_MAX)
4005 return ""
4006
4007 if(iRefreshScoreboard+iUpdateTick > A_TickCount)
4008 {
4009 if(oScoreboardData[dwId])
4010 return oScoreboardData[dwId].SCORE
4011 return ""
4012 }
4013
4014 if(!updateOScoreboardData())
4015 return ""
4016
4017 if(oScoreboardData[dwId])
4018 return oScoreboardData[dwId].SCORE
4019 return ""
4020}
4021
4022getPlayerPingById(dwId) {
4023 dwId += 0
4024 dwId := Floor(dwId)
4025 if(dwId < 0 || dwId >= SAMP_PLAYER_MAX)
4026 return -1
4027
4028 if(iRefreshScoreboard+iUpdateTick > A_TickCount)
4029 {
4030 if(oScoreboardData[dwId])
4031 return oScoreboardData[dwId].PING
4032 return -1
4033 }
4034
4035 if(!updateOScoreboardData())
4036 return -1
4037
4038 if(oScoreboardData[dwId])
4039 return oScoreboardData[dwId].PING
4040 return -1
4041}
4042
4043isNPCById(dwId) {
4044 dwId += 0
4045 dwId := Floor(dwId)
4046 if(dwId < 0 || dwId >= SAMP_PLAYER_MAX)
4047 return -1
4048
4049 if(iRefreshScoreboard+iUpdateTick > A_TickCount)
4050 {
4051 if(oScoreboardData[dwId])
4052 return oScoreboardData[dwId].ISNPC
4053 return -1
4054 }
4055
4056 if(!updateOScoreboardData())
4057 return -1
4058
4059 if(oScoreboardData[dwId])
4060 return oScoreboardData[dwId].ISNPC
4061 return -1
4062}
4063
4064; internal stuff
4065updateScoreboardDataEx() {
4066
4067 if(!checkHandles())
4068 return false
4069
4070 dwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) ;g_SAMP
4071 if(ErrorLevel || dwAddress==0) {
4072 ErrorLevel := ERROR_READ_MEMORY
4073 return false
4074 }
4075
4076 dwFunc := dwSAMP + FUNC_UPDATESCOREBOARD
4077
4078 VarSetCapacity(injectData, 11, 0) ;mov + call + retn
4079
4080 NumPut(0xB9, injectData, 0, "UChar")
4081 NumPut(dwAddress, injectData, 1, "UInt")
4082
4083 NumPut(0xE8, injectData, 5, "UChar")
4084 offset := dwFunc - (pInjectFunc + 10)
4085 NumPut(offset, injectData, 6, "Int")
4086 NumPut(0xC3, injectData, 10, "UChar")
4087
4088 writeRaw(hGTA, pInjectFunc, &injectData, 11)
4089 if(ErrorLevel)
4090 return false
4091
4092 hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
4093 if(ErrorLevel)
4094 return false
4095
4096 waitForSingleObject(hThread, 0xFFFFFFFF)
4097
4098 closeProcess(hThread)
4099
4100 return true
4101
4102}
4103
4104; internal stuff
4105updateOScoreboardData() {
4106 if(!checkHandles())
4107 return 0
4108
4109 oScoreboardData := []
4110
4111 if(!updateScoreboardDataEx())
4112 return 0
4113
4114 iRefreshScoreboard := A_TickCount
4115
4116 dwAddress := readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET)
4117 if(ErrorLevel || dwAddress==0) {
4118 ErrorLevel := ERROR_READ_MEMORY
4119 return 0
4120 }
4121
4122 dwAddress := readDWORD(hGTA, dwAddress + SAMP_PPOOLS_OFFSET)
4123 if(ErrorLevel || dwAddress==0) {
4124 ErrorLevel := ERROR_READ_MEMORY
4125 return 0
4126 }
4127
4128 dwPlayers := readDWORD(hGTA, dwAddress + SAMP_PPOOL_PLAYER_OFFSET)
4129 if(ErrorLevel || dwPlayers==0) {
4130 ErrorLevel := ERROR_READ_MEMORY
4131 return 0
4132 }
4133
4134 wID := readMem(hGTA, dwPlayers + SAMP_SLOCALPLAYERID_OFFSET, 2, "Short") ;sLocalPlayerID
4135 if(ErrorLevel) {
4136 ErrorLevel := ERROR_READ_MEMORY
4137 return 0
4138 }
4139
4140 dwPing := readMem(hGTA, dwPlayers + SAMP_ILOCALPLAYERPING_OFFSET, 4, "Int")
4141 if(ErrorLevel) {
4142 ErrorLevel := ERROR_READ_MEMORY
4143 return 0
4144 }
4145
4146 dwScore := readMem(hGTA, dwPlayers + SAMP_ILOCALPLAYERSCORE_OFFSET, 4, "Int")
4147 if(ErrorLevel) {
4148 ErrorLevel := ERROR_READ_MEMORY
4149 return 0
4150 }
4151
4152 dwTemp := readMem(hGTA, dwPlayers + SAMP_ISTRLEN_LOCALPLAYERNAME_OFFSET, 4, "Int") ;iStrlen_LocalPlayerName
4153 if(ErrorLevel) {
4154 ErrorLevel := ERROR_READ_MEMORY
4155 return 0
4156 }
4157
4158 sUsername := ""
4159 if(dwTemp <= 0xf) {
4160 sUsername := readString(hGTA, dwPlayers + SAMP_SZLOCALPLAYERNAME_OFFSET, 16) ;szLocalPlayerName
4161 if(ErrorLevel) {
4162 ErrorLevel := ERROR_READ_MEMORY
4163 return 0
4164 }
4165 }
4166 else {
4167 dwAddress := readDWORD(hGTA, dwPlayers + SAMP_PSZLOCALPLAYERNAME_OFFSET) ;pszLocalPlayerName
4168 if(ErrorLevel) {
4169 ErrorLevel := ERROR_READ_MEMORY
4170 return 0
4171 }
4172 sUsername := readString(hGTA, dwAddress, 25)
4173 if(ErrorLevel) {
4174 ErrorLevel := ERROR_READ_MEMORY
4175 return 0
4176 }
4177 }
4178 oScoreboardData[wID] := Object("NAME", sUsername, "ID", wID, "PING", dwPing, "SCORE", dwScore, "ISNPC", 0)
4179
4180 Loop, % SAMP_PLAYER_MAX
4181 {
4182 i := A_Index-1
4183
4184 dwRemoteplayer := readDWORD(hGTA, dwPlayers+SAMP_PREMOTEPLAYER_OFFSET+i*4) ;pRemotePlayer
4185 if(ErrorLevel) {
4186 ErrorLevel := ERROR_READ_MEMORY
4187 return 0
4188 }
4189
4190 if(dwRemoteplayer==0)
4191 continue
4192
4193 dwPing := readMem(hGTA, dwRemoteplayer + SAMP_IPING_OFFSET, 4, "Int")
4194 if(ErrorLevel) {
4195 ErrorLevel := ERROR_READ_MEMORY
4196 return 0
4197 }
4198
4199 dwScore := readMem(hGTA, dwRemoteplayer + SAMP_ISCORE_OFFSET, 4, "Int")
4200 if(ErrorLevel) {
4201 ErrorLevel := ERROR_READ_MEMORY
4202 return 0
4203 }
4204
4205 dwIsNPC := readMem(hGTA, dwRemoteplayer + SAMP_ISNPC_OFFSET, 4, "Int")
4206 if(ErrorLevel) {
4207 ErrorLevel := ERROR_READ_MEMORY
4208 return 0
4209 }
4210
4211 dwTemp := readMem(hGTA, dwRemoteplayer + SAMP_ISTRLENNAME___OFFSET, 4, "Int")
4212 if(ErrorLevel) {
4213 ErrorLevel := ERROR_READ_MEMORY
4214 return 0
4215 }
4216 sUsername := ""
4217 if(dwTemp <= 0xf)
4218 {
4219 sUsername := readString(hGTA, dwRemoteplayer+SAMP_SZPLAYERNAME_OFFSET, 16)
4220 if(ErrorLevel) {
4221 ErrorLevel := ERROR_READ_MEMORY
4222 return 0
4223 }
4224 }
4225 else {
4226 dwAddress := readDWORD(hGTA, dwRemoteplayer + SAMP_PSZPLAYERNAME_OFFSET)
4227 if(ErrorLevel || dwAddress==0) {
4228 ErrorLevel := ERROR_READ_MEMORY
4229 return 0
4230 }
4231 sUsername := readString(hGTA, dwAddress, 25)
4232 if(ErrorLevel) {
4233 ErrorLevel := ERROR_READ_MEMORY
4234 return 0
4235 }
4236 }
4237 o := Object("NAME", sUsername, "ID", i, "PING", dwPing, "SCORE", dwScore, "ISNPC", dwIsNPC)
4238 oScoreboardData[i] := o
4239
4240 dwRemoteplayerData := readDWORD(hGTA, dwRemoteplayer + 0x0) ;pPlayerData
4241 if(ErrorLevel) {
4242 ErrorLevel := ERROR_READ_MEMORY
4243 return 0
4244 }
4245 if(dwRemoteplayerData==0) ;this ever happen?
4246 continue
4247
4248 dwAddress := readDWORD(hGTA, dwRemoteplayerData + 489) ;iGlobalMarkerLoaded
4249 if(ErrorLevel) {
4250 ErrorLevel := ERROR_READ_MEMORY
4251 return 0
4252 }
4253 if(dwAddress)
4254 {
4255 ix := readMem(hGTA, dwRemoteplayerData + 493, 4, "Int") ;x map
4256 if(ErrorLevel) {
4257 ErrorLevel := ERROR_READ_MEMORY
4258 return 0
4259 }
4260 iy := readMem(hGTA, dwRemoteplayerData + 497, 4, "Int") ;y map
4261 if(ErrorLevel) {
4262 ErrorLevel := ERROR_READ_MEMORY
4263 return 0
4264 }
4265 iz := readMem(hGTA, dwRemoteplayerData + 501, 4, "Int") ;z map
4266 if(ErrorLevel) {
4267 ErrorLevel := ERROR_READ_MEMORY
4268 return 0
4269 }
4270 o.MPOS := [ix, iy, iz]
4271 }
4272
4273 dwpSAMP_Actor := readDWORD(hGTA, dwRemoteplayerData + 0x0) ;pSAMP_Actor
4274 if(ErrorLevel) {
4275 ErrorLevel := ERROR_READ_MEMORY
4276 return 0
4277 }
4278 if(dwpSAMP_Actor==0) ;not streamed in
4279 continue
4280
4281 dwPed := readDWORD(hGTA, dwpSAMP_Actor + 676) ;pGTA_Ped_
4282 if(ErrorLevel) {
4283 ErrorLevel := ERROR_READ_MEMORY
4284 return 0
4285 }
4286 if(dwPed==0)
4287 continue
4288 o.PED := dwPed
4289
4290 fHP := readFloat(hGTA, dwRemoteplayerData + 444)
4291 if(ErrorLevel) {
4292 ErrorLevel := ERROR_READ_MEMORY
4293 return 0
4294 }
4295 fARMOR := readFloat(hGTA, dwRemoteplayerData + 440)
4296 if(ErrorLevel) {
4297 ErrorLevel := ERROR_READ_MEMORY
4298 return 0
4299 }
4300 o.HP := fHP
4301 o.ARMOR := fARMOR
4302 }
4303 ErrorLevel := ERROR_OK
4304 return 1
4305}
4306
4307
4308; ##### Sonstiges #####
4309; written by David_Luchs %
4310; returns nth message of chatlog (beggining from bottom)
4311; -1 = error
4312GetChatLine(Line, ByRef Output, timestamp=0, color=0){
4313 chatindex := 0
4314 FileRead, file, %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
4315 loop, Parse, file, `n, `r
4316 {
4317 if(A_LoopField)
4318 chatindex := A_Index
4319 }
4320 loop, Parse, file, `n, `r
4321 {
4322 if(A_Index = chatindex - line){
4323 output := A_LoopField
4324 break
4325 }
4326 }
4327 file := ""
4328 if(!timestamp)
4329 output := RegExReplace(output, "U)^\[\d{2}:\d{2}:\d{2}\]")
4330 if(!color)
4331 output := RegExReplace(output, "Ui)\{[a-f0-9]{6}\}")
4332 return
4333}
4334
4335; ##### Spielerfunktionen #####
4336getPlayerHealth() {
4337 if(!checkHandles())
4338 return -1
4339
4340 dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR)
4341 if(ErrorLevel) {
4342 ErrorLevel := ERROR_READ_MEMORY
4343 return -1
4344 }
4345
4346 dwAddr := dwCPedPtr + ADDR_CPED_HPOFF
4347 fHealth := readFloat(hGTA, dwAddr)
4348 if(ErrorLevel) {
4349 ErrorLevel := ERROR_READ_MEMORY
4350 return -1
4351 }
4352
4353 ErrorLevel := ERROR_OK
4354 return Round(fHealth)
4355}
4356
4357getPlayerArmor() {
4358 if(!checkHandles())
4359 return -1
4360
4361 dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR)
4362 if(ErrorLevel) {
4363 ErrorLevel := ERROR_READ_MEMORY
4364 return -1
4365 }
4366
4367 dwAddr := dwCPedPtr + ADDR_CPED_ARMOROFF
4368 fHealth := readFloat(hGTA, dwAddr)
4369 if(ErrorLevel) {
4370 ErrorLevel := ERROR_READ_MEMORY
4371 return -1
4372 }
4373
4374 ErrorLevel := ERROR_OK
4375 return Round(fHealth)
4376}
4377
4378getPlayerInteriorId() {
4379 if(!checkHandles())
4380 return -1
4381
4382 iid := readMem(hGTA, ADDR_CPED_INTID, 4, "Int")
4383 if(ErrorLevel) {
4384 ErrorLevel := ERROR_READ_MEMORY
4385 return -1
4386 }
4387
4388 ErrorLevel := ERROR_OK
4389 return iid
4390}
4391
4392getPlayerSkinID() {
4393 if(!checkHandles())
4394 return -1
4395
4396 dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR)
4397 if(ErrorLevel) {
4398 ErrorLevel := ERROR_READ_MEMORY
4399 return -1
4400 }
4401
4402 dwAddr := dwCPedPtr + ADDR_CPED_SKINIDOFF
4403 SkinID := readMem(hGTA, dwAddr, 2, "byte")
4404 if(ErrorLevel) {
4405 ErrorLevel := ERROR_READ_MEMORY
4406 return -1
4407 }
4408
4409 ErrorLevel := ERROR_OK
4410 return SkinID
4411}
4412
4413getPlayerMoney() {
4414 if(!checkHandles())
4415 return ""
4416
4417 money := readMem(hGTA, ADDR_CPED_MONEY, 4, "Int")
4418 if(ErrorLevel) {
4419 ErrorLevel := ERROR_READ_MEMORY
4420 return ""
4421 }
4422
4423 ErrorLevel := ERROR_OK
4424 return money
4425}
4426
4427getPlayerWanteds() {
4428 if(!checkHandles())
4429 return -1
4430 return ProcessReadMemory(0x58DB60, "gta_sa.exe", "Byte", 1)
4431}
4432
4433getPlayerWeaponId() {
4434 if(!checkHandles())
4435 return 0
4436
4437 WaffenId := readMem(hGTA, 0xBAA410, 4, "byte")
4438 if(ErrorLevel) {
4439 ErrorLevel := ERROR_READ_MEMORY
4440 return -1
4441 }
4442
4443 return WaffenId
4444}
4445
4446getPlayerWeaponName() {
4447 id := getPlayerWeaponId()
4448 if(id >= 0 && id < 44)
4449 {
4450 return oweaponNames[id+1]
4451 }
4452 return ""
4453}
4454
4455getPlayerState() {
4456 if(!checkHandles())
4457 return -1
4458
4459 dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR)
4460 if(ErrorLevel) {
4461 ErrorLevel := ERROR_READ_MEMORY
4462 return -1
4463 }
4464
4465 State := readDWORD(hGTA, dwCPedPtr + 0x530)
4466 if(ErrorLevel) {
4467 ErrorLevel := ERROR_READ_MEMORY
4468 return -1
4469 }
4470
4471 ErrorLevel := ERROR_OK
4472 return State
4473}
4474
4475IsPlayerInMenu() {
4476 if(!checkHandles())
4477 return -1
4478
4479 IsInMenu := readMem(hGTA, 0xBA67A4, 4, "byte")
4480 if(ErrorLevel) {
4481 ErrorLevel := ERROR_READ_MEMORY
4482 return -1
4483 }
4484
4485 ErrorLevel := ERROR_OK
4486 return IsInMenu
4487}
4488
4489getPlayerMapPosX() {
4490 if(!checkHandles())
4491 return -1
4492
4493 MapPosX := readFloat(hGTA, 0xBA67B8)
4494 if(ErrorLevel) {
4495 ErrorLevel := ERROR_READ_MEMORY
4496 return -1
4497 }
4498
4499 ErrorLevel := ERROR_OK
4500 return MapPosX
4501}
4502
4503getPlayerMapPosY() {
4504 if(!checkHandles())
4505 return -1
4506
4507 MapPosY := readFloat(hGTA, 0xBA67BC)
4508 if(ErrorLevel) {
4509 ErrorLevel := ERROR_READ_MEMORY
4510 return -1
4511 }
4512
4513 ErrorLevel := ERROR_OK
4514 return MapPosY
4515}
4516
4517getPlayerMapZoom() {
4518 if(!checkHandles())
4519 return -1
4520
4521 MapZoom := readFloat(hGTA, 0xBA67AC)
4522 if(ErrorLevel) {
4523 ErrorLevel := ERROR_READ_MEMORY
4524 return -1
4525 }
4526
4527 ErrorLevel := ERROR_OK
4528 return MapZoom
4529}
4530
4531IsPlayerFreezed() {
4532 if(!checkHandles())
4533 return -1
4534
4535 dwGTA := getModuleBaseAddress("gta_sa.exe", hGTA)
4536 IPF := readMem(hGTA, dwGTA + 0x690495, 2, "byte")
4537 if(ErrorLevel) {
4538 ErrorLevel := ERROR_READ_MEMORY
4539 return -1
4540 }
4541
4542 ErrorLevel := ERROR_OK
4543 return IPF
4544}
4545
4546; ##### Fahrzeugfunktionen #####
4547
4548isPlayerInAnyVehicle()
4549{
4550 if(!checkHandles())
4551 return -1
4552
4553 dwVehPtr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
4554 if(ErrorLevel) {
4555 ErrorLevel := ERROR_READ_MEMORY
4556 return -1
4557 }
4558
4559 return (dwVehPtr > 0)
4560}
4561
4562isPlayerDriver() {
4563 if(!checkHandles())
4564 return -1
4565
4566 dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
4567 if(ErrorLevel) {
4568 ErrorLevel := ERROR_READ_MEMORY
4569 return -1
4570 }
4571
4572 if(!dwAddr)
4573 return -1
4574
4575 dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR)
4576 if(ErrorLevel) {
4577 ErrorLevel := ERROR_READ_MEMORY
4578 return -1
4579 }
4580
4581 dwVal := readDWORD(hGTA, dwAddr + ADDR_VEHICLE_DRIVER)
4582 if(ErrorLevel) {
4583 ErrorLevel := ERROR_READ_MEMORY
4584 return -1
4585 }
4586
4587 ErrorLevel := ERROR_OK
4588 return (dwVal==dwCPedPtr)
4589}
4590
4591getVehicleHealth() {
4592 if(!checkHandles())
4593 return -1
4594
4595 dwVehPtr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
4596 if(ErrorLevel) {
4597 ErrorLevel := ERROR_READ_MEMORY
4598 return -1
4599 }
4600
4601 dwAddr := dwVehPtr + ADDR_VEHICLE_HPOFF
4602 fHealth := readFloat(hGTA, dwAddr)
4603 if(ErrorLevel) {
4604 ErrorLevel := ERROR_READ_MEMORY
4605 return -1
4606 }
4607
4608 ErrorLevel := ERROR_OK
4609 return Round(fHealth)
4610}
4611
4612getVehicleType() {
4613 if(!checkHandles())
4614 return 0
4615
4616 dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
4617 if(ErrorLevel) {
4618 ErrorLevel := ERROR_READ_MEMORY
4619 return 0
4620 }
4621
4622 if(!dwAddr)
4623 return 0
4624
4625 cVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_TYPE, 1, "Char")
4626 if(ErrorLevel) {
4627 ErrorLevel := ERROR_READ_MEMORY
4628 return 0
4629 }
4630
4631 ErrorLevel := ERROR_OK
4632 if(!cVal)
4633 {
4634 mid := getVehicleModelId()
4635 Loop % oAirplaneModels.MaxIndex()
4636 {
4637 if(oAirplaneModels[A_Index]==mid)
4638 return 5
4639 }
4640 return 1
4641 }
4642 else if(cVal==5)
4643 return 2
4644 else if(cVal==6)
4645 return 3
4646 else if(cVal==9)
4647 {
4648 mid := getVehicleModelId()
4649 Loop % oBikeModels.MaxIndex()
4650 {
4651 if(oBikeModels[A_Index]==mid)
4652 return 6
4653 }
4654 return 4
4655 }
4656 return 0
4657}
4658
4659getVehicleModelId() {
4660 if(!checkHandles())
4661 return 0
4662
4663 dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
4664 if(ErrorLevel) {
4665 ErrorLevel := ERROR_READ_MEMORY
4666 return 0
4667 }
4668
4669 if(!dwAddr)
4670 return 0
4671
4672 sVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_MODEL, 2, "Short")
4673 if(ErrorLevel) {
4674 ErrorLevel := ERROR_READ_MEMORY
4675 return 0
4676 }
4677
4678 ErrorLevel := ERROR_OK
4679 return sVal
4680}
4681
4682getVehicleModelName() {
4683 id:=getVehicleModelId()
4684 if(id > 399 && id < 611)
4685 {
4686 return ovehicleNames[id-399]
4687 }
4688 return ""
4689}
4690
4691
4692getVehicleLightState() {
4693 if(!checkHandles())
4694 return -1
4695
4696 dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
4697 if(ErrorLevel) {
4698 ErrorLevel := ERROR_READ_MEMORY
4699 return -1
4700 }
4701
4702 if(!dwAddr)
4703 return -1
4704
4705 dwVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_LIGHTSTATE, 1, "byte")
4706 if(ErrorLevel) {
4707 ErrorLevel := ERROR_READ_MEMORY
4708 return -1
4709 }
4710
4711 ErrorLevel := ERROR_OK
4712 return (dwVal>0)
4713}
4714
4715getVehicleEngineState() {
4716 if(!checkHandles())
4717 return -1
4718
4719 dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
4720 if(ErrorLevel) {
4721 ErrorLevel := ERROR_READ_MEMORY
4722 return -1
4723 }
4724
4725 if(!dwAddr)
4726 return -1
4727
4728 cVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_ENGINESTATE, 1, "Char")
4729 if(ErrorLevel) {
4730 ErrorLevel := ERROR_READ_MEMORY
4731 return -1
4732 }
4733
4734 ErrorLevel := ERROR_OK
4735 return (cVal==24 || cVal==56 || cVal==88 || cVal==120)
4736}
4737
4738
4739getVehicleSirenState() {
4740 if(!checkHandles())
4741 return -1
4742
4743 dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
4744 if(ErrorLevel) {
4745 ErrorLevel := ERROR_READ_MEMORY
4746 return -1
4747 }
4748
4749 if(!dwAddr)
4750 return -1
4751
4752 cVal := readMem(hGTA, dwAddr + ADDR_VEHICLE_SIRENSTATE, 1, "Char")
4753 if(ErrorLevel) {
4754 ErrorLevel := ERROR_READ_MEMORY
4755 return -1
4756 }
4757
4758 ErrorLevel := ERROR_OK
4759 return (cVal==-48)
4760}
4761
4762getVehicleLockState() {
4763 if(!checkHandles())
4764 return -1
4765
4766 dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
4767 if(ErrorLevel) {
4768 ErrorLevel := ERROR_READ_MEMORY
4769 return -1
4770 }
4771
4772 if(!dwAddr)
4773 return -1
4774
4775 dwVal := readDWORD(hGTA, dwAddr + ADDR_VEHICLE_DOORSTATE)
4776 if(ErrorLevel) {
4777 ErrorLevel := ERROR_READ_MEMORY
4778 return -1
4779 }
4780
4781 ErrorLevel := ERROR_OK
4782 return (dwVal==2)
4783}
4784getVehicleColor1() {
4785 if(!checkHandles())
4786 return 0
4787
4788 dwAddr := readDWORD(hGTA, 0xBA18FC)
4789 if(ErrorLevel) {
4790 ErrorLevel := ERROR_READ_MEMORY
4791 return 0
4792 }
4793
4794 if(!dwAddr)
4795 return 0
4796
4797 sVal := readMem(hGTA, dwAddr + 1076, 1, "byte")
4798
4799 if(ErrorLevel) {
4800 ErrorLevel := ERROR_READ_MEMORY
4801 return 0
4802 }
4803
4804 ErrorLevel := ERROR_OK
4805 return sVal
4806}
4807
4808getVehicleColor2() {
4809 if(!checkHandles())
4810 return 0
4811
4812 dwAddr := readDWORD(hGTA, 0xBA18FC)
4813 if(ErrorLevel) {
4814 ErrorLevel := ERROR_READ_MEMORY
4815 return 0
4816 }
4817
4818 if(!dwAddr)
4819 return 0
4820
4821 sVal := readMem(hGTA, dwAddr + 1077, 1, "byte")
4822
4823 if(ErrorLevel) {
4824 ErrorLevel := ERROR_READ_MEMORY
4825 return 0
4826 }
4827
4828 ErrorLevel := ERROR_OK
4829 return sVal
4830}
4831
4832getVehicleSpeed() {
4833 if(!checkHandles())
4834 return -1
4835
4836 dwAddr := readDWORD(hGTA, ADDR_VEHICLE_PTR)
4837 if(ErrorLevel) {
4838 ErrorLevel := ERROR_READ_MEMORY
4839 return ""
4840 }
4841
4842 fSpeedX := readMem(hGTA, dwAddr + ADDR_VEHICLE_X, 4, "float")
4843 fSpeedY := readMem(hGTA, dwAddr + ADDR_VEHICLE_Y, 4, "float")
4844 fSpeedZ := readMem(hGTA, dwAddr + ADDR_VEHICLE_Z, 4, "float")
4845
4846 fVehicleSpeed := sqrt((fSpeedX * fSpeedX) + (fSpeedY * fSpeedY) + (fSpeedZ * fSpeedZ))
4847 fVehicleSpeed := (fVehicleSpeed * 100) * 1.43 ;Der Wert "1.43" ist meistens auf jedem Server anders. Die Geschwindigkeit wird somit erhГѓВ¶ht bzw. verringert
4848
4849 return fVehicleSpeed
4850}
4851
4852getPlayerRadiostationID() {
4853 if(!checkHandles())
4854 return -1
4855
4856 if(isPlayerInAnyVehicle() == 0)
4857 return -1
4858
4859 dwGTA := getModuleBaseAddress("gta_sa.exe", hGTA)
4860 RadioStationID := readMem(hGTA, dwGTA + 0x4CB7E1, 1, "byte")
4861 if(ErrorLevel) {
4862 ErrorLevel := ERROR_READ_MEMORY
4863 return -1
4864 }
4865
4866 return RadioStationID
4867}
4868
4869getPlayerRadiostationName() {
4870 if(isPlayerInAnyVehicle() == 0)
4871 return -1
4872
4873 id := getPlayerRadiostationID()
4874
4875 if(id == 0)
4876 return -1
4877
4878 if(id >= 0 && id < 14)
4879 {
4880 return oradiostationNames[id]
4881 }
4882 return ""
4883}
4884
4885; ##### Checkpointsachen #####
4886setCheckpoint(fX, fY, fZ, fSize ) {
4887 if(!checkHandles())
4888 return false
4889 dwFunc := dwSAMP + 0x9D340
4890 dwAddress := readDWORD(hGTA, dwSAMP + ADDR_SAMP_INCHAT_PTR) ;misc info
4891 if(ErrorLevel || dwAddress==0) {
4892 ErrorLevel := ERROR_READ_MEMORY
4893 return false
4894 }
4895 VarSetCapacity(buf, 16, 0)
4896 NumPut(fX, buf, 0, "Float")
4897 NumPut(fY, buf, 4, "Float")
4898 NumPut(fZ, buf, 8, "Float")
4899 NumPut(fSize, buf, 12, "Float")
4900 writeRaw(hGTA, pParam1, &buf, 16)
4901 dwLen := 31
4902 VarSetCapacity(injectData, dwLen, 0)
4903 NumPut(0xB9, injectData, 0, "UChar")
4904 NumPut(dwAddress, injectData, 1, "UInt")
4905 NumPut(0x68, injectData, 5, "UChar")
4906 NumPut(pParam1+12, injectData, 6, "UInt")
4907 NumPut(0x68, injectData, 10, "UChar")
4908 NumPut(pParam1, injectData, 11, "UInt")
4909 NumPut(0xE8, injectData, 15, "UChar")
4910 offset := dwFunc - (pInjectFunc + 20)
4911 NumPut(offset, injectData, 16, "Int")
4912 NumPut(0x05C7, injectData, 20, "UShort")
4913 NumPut(dwAddress+0x24, injectData, 22, "UInt")
4914 NumPut(1, injectData, 26, "UInt")
4915 NumPut(0xC3, injectData, 30, "UChar")
4916 writeRaw(hGTA, pInjectFunc, &injectData, dwLen)
4917 if(ErrorLevel)
4918 return false
4919 hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
4920 if(ErrorLevel)
4921 return false
4922 waitForSingleObject(hThread, 0xFFFFFFFF)
4923 closeProcess(hThread)
4924 ErrorLevel := ERROR_OK
4925 return true
4926}
4927
4928disableCheckpoint()
4929{
4930 if(!checkHandles())
4931 return false
4932 dwAddress := readDWORD(hGTA, dwSAMP + ADDR_SAMP_INCHAT_PTR) ;misc info
4933 if(ErrorLevel || dwAddress==0) {
4934 ErrorLevel := ERROR_READ_MEMORY
4935 return false
4936 }
4937 VarSetCapacity(enablecp, 4, 0)
4938 NumPut(0,enablecp,0,"Int")
4939 writeRaw(hGTA, dwAddress+0x24, &enablecp, 4)
4940 ErrorLevel := ERROR_OK
4941 return true
4942}
4943
4944IsMarkerCreated(){
4945 If(!checkHandles())
4946 return false
4947 active := readMem(hGTA, CheckpointCheck, 1, "byte")
4948 If(!active)
4949 return 0
4950 else return 1
4951}
4952CoordsFromRedmarker(){
4953 if(!checkhandles())
4954 return false
4955 for i, v in rmaddrs
4956 f%i% := readFloat(hGTA, v)
4957 return [f1, f2, f3]
4958}
4959; ##### Positionsbestimmung #####
4960getCoordinates() {
4961 if(!checkHandles())
4962 return ""
4963
4964 fX := readFloat(hGTA, ADDR_POSITION_X)
4965 if(ErrorLevel) {
4966 ErrorLevel := ERROR_READ_MEMORY
4967 return ""
4968 }
4969
4970 fY := readFloat(hGTA, ADDR_POSITION_Y)
4971 if(ErrorLevel) {
4972 ErrorLevel := ERROR_READ_MEMORY
4973 return ""
4974 }
4975
4976 fZ := readFloat(hGTA, ADDR_POSITION_Z)
4977 if(ErrorLevel) {
4978 ErrorLevel := ERROR_READ_MEMORY
4979 return ""
4980 }
4981
4982 ErrorLevel := ERROR_OK
4983 return [fX, fY, fZ]
4984}
4985
4986GetPlayerPos(ByRef fX,ByRef fY,ByRef fZ) {
4987 if(!checkHandles())
4988 return 0
4989
4990 fX := readFloat(hGTA, ADDR_POSITION_X)
4991 if(ErrorLevel) {
4992 ErrorLevel := ERROR_READ_MEMORY
4993 return 0
4994 }
4995
4996 fY := readFloat(hGTA, ADDR_POSITION_Y)
4997 if(ErrorLevel) {
4998 ErrorLevel := ERROR_READ_MEMORY
4999 return 0
5000 }
5001
5002 fZ := readFloat(hGTA, ADDR_POSITION_Z)
5003 if(ErrorLevel) {
5004 ErrorLevel := ERROR_READ_MEMORY
5005 return 0
5006 }
5007
5008 ErrorLevel := ERROR_OK
5009}
5010
5011; ######################### Dialog Functions #########################
5012getDialogStructPtr() {
5013 if (!checkHandles()) {
5014 ErrorLevel := ERROR_INVALID_HANDLE
5015 return false
5016 }
5017
5018 dwPointer := readDWORD(hGTA, dwSAMP + SAMP_DIALOG_STRUCT_PTR)
5019 if (ErrorLevel) {
5020 ErrorLevel := ERROR_READ_MEMORY
5021 return false
5022 }
5023
5024 ErrorLevel := ERROR_OK
5025 return dwPointer
5026}
5027
5028isDialogOpen() {
5029 dwPointer := getDialogStructPtr()
5030 if (ErrorLevel || !dwPointer)
5031 return false
5032
5033 dwIsOpen := readMem(hGTA, dwPointer + SAMP_DIALOG_OPEN_OFFSET, 4, "UInt")
5034 if (ErrorLevel) {
5035 ErrorLevel := ERROR_READ_MEMORY
5036 return false
5037 }
5038
5039 ErrorLevel := ERROR_OK
5040 return dwIsOpen ? true : false
5041}
5042
5043getDialogStyle() {
5044 dwPointer := getDialogStructPtr()
5045 if (ErrorLevel || !dwPointer)
5046 return -1
5047
5048 style := readMem(hGTA, dwPointer + SAMP_DIALOG_STYLE_OFFSET, 4, "UInt")
5049 if (ErrorLevel) {
5050 ErrorLevel := ERROR_READ_MEMORY
5051 return -1
5052 }
5053
5054 ErrorLevel := ERROR_OK
5055 return style
5056}
5057
5058getDialogID() {
5059 dwPointer := getDialogStructPtr()
5060 if (ErrorLevel || !dwPointer)
5061 return -1
5062
5063 id := readMem(hGTA, dwPointer + SAMP_DIALOG_ID_OFFSET, 4, "UInt")
5064 if (ErrorLevel) {
5065 ErrorLevel := ERROR_READ_MEMORY
5066 return -1
5067 }
5068
5069 ErrorLevel := ERROR_OK
5070 return id
5071}
5072
5073setDialogID(id) {
5074 dwPointer := getDialogStructPtr()
5075 if (ErrorLevel || !dwPointer)
5076 return false
5077
5078 writeMemory(hGTA, dwPointer + SAMP_DIALOG_ID_OFFSET, id, "UInt", 4)
5079 if (ErrorLevel) {
5080 ErrorLevel := ERROR_WRITE_MEMORY
5081 return false
5082 }
5083
5084 ErrorLevel := ERROR_OK
5085 return true
5086}
5087
5088getDialogCaption() {
5089 dwPointer := getDialogStructPtr()
5090 if (ErrorLevel || !dwPointer)
5091 return ""
5092
5093 text := readString(hGTA, dwPointer + SAMP_DIALOG_CAPTION_OFFSET, 64)
5094 if (ErrorLevel) {
5095 ErrorLevel := ERROR_READ_MEMORY
5096 return ""
5097 }
5098
5099 ErrorLevel := ERROR_OK
5100 return text
5101}
5102
5103getDialogTextSize(dwAddress) {
5104 i := 0
5105 Loop, 4096 {
5106 i := A_Index - 1
5107 byte := Memory_ReadByte(hGTA, dwAddress + i)
5108 if (!byte)
5109 break
5110 }
5111
5112 return i
5113}
5114
5115getDialogText() {
5116 dwPointer := getDialogStructPtr()
5117 if (ErrorLevel || !dwPointer)
5118 return ""
5119
5120 dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_TEXT_PTR_OFFSET)
5121 if (ErrorLevel) {
5122 ErrorLevel := ERROR_READ_MEMORY
5123 return ""
5124 }
5125
5126 text := readString(hGTA, dwPointer, 4096)
5127 if (ErrorLevel) {
5128 text := readString(hGTA, dwPointer, getDialogTextSize(dwPointer))
5129 if (ErrorLevel) {
5130 ErrorLevel := ERROR_READ_MEMORY
5131 return ""
5132 }
5133 }
5134
5135 ErrorLevel := ERROR_OK
5136 return text
5137}
5138
5139getDialogLineCount() {
5140 dwPointer := getDialogStructPtr()
5141 if (ErrorLevel || !dwPointer)
5142 return 0
5143
5144 dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_PTR2_OFFSET)
5145 if (ErrorLevel) {
5146 ErrorLevel := ERROR_READ_MEMORY
5147 return 0
5148 }
5149
5150 count := readMem(hGTA, dwPointer + SAMP_DIALOG_LINECOUNT_OFFSET, 4, "UInt")
5151 if (ErrorLevel) {
5152 ErrorLevel := ERROR_READ_MEMORY
5153 return 0
5154 }
5155
5156 ErrorLevel := ERROR_OK
5157 return count
5158}
5159
5160getDialogLine__(index) {
5161 if (getDialogLineCount > index)
5162 return ""
5163
5164 dwPointer := getDialogStructPtr()
5165 if (ErrorLevel || !dwPointer)
5166 return ""
5167
5168 dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_PTR1_OFFSET)
5169 if (ErrorLevel) {
5170 ErrorLevel := ERROR_READ_MEMORY
5171 return ""
5172 }
5173
5174 dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_LINES_OFFSET)
5175 if (ErrorLevel) {
5176 ErrorLevel := ERROR_READ_MEMORY
5177 return ""
5178 }
5179
5180 dwLineAddress := readDWORD(hGTA, dwPointer + (index - 1) * 0x4)
5181 line := readString(hGTA, dwLineAddress, 128)
5182
5183 ErrorLevel := ERROR_OK
5184 return line
5185}
5186
5187getDialogLine(index) {
5188 lines := getDialogLines()
5189 if (index > lines.Length())
5190 return ""
5191
5192 if (getDialogStyle() == DIALOG_STYLE_TABLIST_HEADERS)
5193 index++
5194
5195 return lines[index]
5196}
5197
5198getDialogLines() {
5199 text := getDialogText()
5200 if (text == "")
5201 return -1
5202
5203 lines := StrSplit(text, "`n")
5204 return lines
5205}
5206
5207
5208getDialogLines__() {
5209 count := getDialogLineCount()
5210
5211 dwPointer := getDialogStructPtr()
5212 if (ErrorLevel || !dwPointer)
5213 return -1
5214
5215 dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_PTR1_OFFSET)
5216 if (ErrorLevel) {
5217 ErrorLevel := ERROR_READ_MEMORY
5218 return -1
5219 }
5220
5221 dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_LINES_OFFSET)
5222 if (ErrorLevel) {
5223 ErrorLevel := ERROR_READ_MEMORY
5224 return -1
5225 }
5226
5227 lines := []
5228 Loop %count% {
5229 dwLineAddress := readDWORD(hGTA, dwPointer + (A_Index - 1) * 0x4)
5230 lines[A_Index] := readString(hGTA, dwLineAddress, 128)
5231 }
5232
5233 ErrorLevel := ERROR_OK
5234 return lines
5235}
5236
5237showDialog(style, caption, text, button1, button2 := "", id := 1) {
5238 style += 0
5239 style := Floor(style)
5240 id += 0
5241 id := Floor(id)
5242 caption := "" caption
5243 text := "" text
5244 button1 := "" button1
5245 button2 := "" button2
5246
5247 if (id < 0 || id > 32767 || style < 0 || style > 5 || StrLen(caption) > 64 || StrLen(text) > 4096 || StrLen(button1) > 10 || StrLen(button2) > 10)
5248 return false
5249
5250 if (!checkHandles())
5251 return false
5252
5253 dwFunc := dwSAMP + FUNC_SAMP_SHOWDIALOG
5254 sleep 200
5255 dwAddress := readDWORD(hGTA, dwSAMP + SAMP_DIALOG_STRUCT_PTR)
5256 if (ErrorLevel || !dwAddress) {
5257 ErrorLevel := ERROR_READ_MEMORY
5258 return false
5259 }
5260
5261 writeString(hGTA, pParam5, caption)
5262 if (ErrorLevel)
5263 return false
5264 writeString(hGTA, pParam1, text)
5265 if (ErrorLevel)
5266 return false
5267 writeString(hGTA, pParam5 + 512, button1)
5268 if (ErrorLevel)
5269 return false
5270 writeString(hGTA, pParam5+StrLen(caption) + 1, button2)
5271 if (ErrorLevel)
5272 return false
5273
5274 ;mov + 7 * push + call + retn
5275 dwLen := 5 + 7 * 5 + 5 + 1
5276 VarSetCapacity(injectData, dwLen, 0)
5277
5278 NumPut(0xB9, injectData, 0, "UChar") ;0 + 1 ;mov ecx
5279 NumPut(dwAddress, injectData, 1, "UInt") ;1 + 4
5280 NumPut(0x68, injectData, 5, "UChar") ;5 + 1 ;push send
5281 NumPut(1, injectData, 6, "UInt") ;6 + 4
5282 NumPut(0x68, injectData, 10, "UChar") ;10 + 1 ;push button2
5283 NumPut(pParam5 + StrLen(caption) + 1, injectData, 11, "UInt") ;11 + 4
5284 NumPut(0x68, injectData, 15, "UChar") ;15 + 1 ;push button1
5285 NumPut(pParam5 + 512, injectData, 16, "UInt") ;16 + 4
5286 NumPut(0x68, injectData, 20, "UChar") ;20 + 1 ;push text
5287 NumPut(pParam1, injectData, 21, "UInt") ;21 + 4
5288 NumPut(0x68, injectData, 25, "UChar") ;25 + 1 ;push caption
5289 NumPut(pParam5, injectData, 26, "UInt") ;26 + 4
5290 NumPut(0x68, injectData, 30, "UChar") ;30 + 1 ;push style
5291 NumPut(style, injectData, 31, "UInt") ;31 + 4
5292 NumPut(0x68, injectData, 35, "UChar") ;35 + 1 ;push id
5293 NumPut(id, injectData, 36, "UInt") ;36 + 4
5294
5295 NumPut(0xE8, injectData, 40, "UChar") ;40 + 1 ;call
5296 offset := dwFunc - (pInjectFunc + 45)
5297 NumPut(offset, injectData, 41, "Int") ;41 + 4
5298 NumPut(0xC3, injectData, 45, "UChar") ;45 + 1 ;retn
5299
5300 writeRaw(hGTA, pInjectFunc, &injectData, dwLen)
5301 if (ErrorLevel)
5302 return false
5303
5304 hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
5305 if (ErrorLevel)
5306 return false
5307
5308 waitForSingleObject(hThread, 0xFFFFFFFF)
5309 closeProcess(hThread)
5310
5311 return true
5312}
5313
5314
5315initZonesAndCities() {
5316 AddCity("Las Venturas", 685.0, 476.093, -500.0, 3000.0, 3000.0, 500.0)
5317 AddCity("San Fierro", -3000.0, -742.306, -500.0, -1270.53, 1530.24, 500.0)
5318 AddCity("San Fierro", -1270.53, -402.481, -500.0, -1038.45, 832.495, 500.0)
5319 AddCity("San Fierro", -1038.45, -145.539, -500.0, -897.546, 376.632, 500.0)
5320 AddCity("Los Santos", 480.0, -3000.0, -500.0, 3000.0, -850.0, 500.0)
5321 AddCity("Los Santos", 80.0, -2101.61, -500.0, 1075.0, -1239.61, 500.0)
5322 AddCity("Tierra Robada", -1213.91, 596.349, -242.99, -480.539, 1659.68, 900.0)
5323 AddCity("Red County", -1213.91, -768.027, -242.99, 2997.06, 596.349, 900.0)
5324 AddCity("Flint County", -1213.91, -2892.97, -242.99, 44.6147, -768.027, 900.0)
5325 AddCity("Whetstone", -2997.47, -2892.97, -242.99, -1213.91, -1115.58, 900.0)
5326
5327 AddZone("Avispa Country Club", -2667.810, -302.135, -28.831, -2646.400, -262.320, 71.169)
5328 AddZone("Easter Bay Airport", -1315.420, -405.388, 15.406, -1264.400, -209.543, 25.406)
5329 AddZone("Avispa Country Club", -2550.040, -355.493, 0.000, -2470.040, -318.493, 39.700)
5330 AddZone("Easter Bay Airport", -1490.330, -209.543, 15.406, -1264.400, -148.388, 25.406)
5331 AddZone("Garcia", -2395.140, -222.589, -5.3, -2354.090, -204.792, 200.000)
5332 AddZone("Shady Cabin", -1632.830, -2263.440, -3.0, -1601.330, -2231.790, 200.000)
5333 AddZone("East Los Santos", 2381.680, -1494.030, -89.084, 2421.030, -1454.350, 110.916)
5334 AddZone("LVA Freight Depot", 1236.630, 1163.410, -89.084, 1277.050, 1203.280, 110.916)
5335 AddZone("Blackfield Intersection", 1277.050, 1044.690, -89.084, 1315.350, 1087.630, 110.916)
5336 AddZone("Avispa Country Club", -2470.040, -355.493, 0.000, -2270.040, -318.493, 46.100)
5337 AddZone("Temple", 1252.330, -926.999, -89.084, 1357.000, -910.170, 110.916)
5338 AddZone("Unity Station", 1692.620, -1971.800, -20.492, 1812.620, -1932.800, 79.508)
5339 AddZone("LVA Freight Depot", 1315.350, 1044.690, -89.084, 1375.600, 1087.630, 110.916)
5340 AddZone("Los Flores", 2581.730, -1454.350, -89.084, 2632.830, -1393.420, 110.916)
5341 AddZone("Starfish Casino", 2437.390, 1858.100, -39.084, 2495.090, 1970.850, 60.916)
5342 AddZone("Easter Bay Chemicals", -1132.820, -787.391, 0.000, -956.476, -768.027, 200.000)
5343 AddZone("Downtown Los Santos", 1370.850, -1170.870, -89.084, 1463.900, -1130.850, 110.916)
5344 AddZone("Esplanade East", -1620.300, 1176.520, -4.5, -1580.010, 1274.260, 200.000)
5345 AddZone("Market Station", 787.461, -1410.930, -34.126, 866.009, -1310.210, 65.874)
5346 AddZone("Linden Station", 2811.250, 1229.590, -39.594, 2861.250, 1407.590, 60.406)
5347 AddZone("Montgomery Intersection", 1582.440, 347.457, 0.000, 1664.620, 401.750, 200.000)
5348 AddZone("Frederick Bridge", 2759.250, 296.501, 0.000, 2774.250, 594.757, 200.000)
5349 AddZone("Yellow Bell Station", 1377.480, 2600.430, -21.926, 1492.450, 2687.360, 78.074)
5350 AddZone("Downtown Los Santos", 1507.510, -1385.210, 110.916, 1582.550, -1325.310, 335.916)
5351 AddZone("Jefferson", 2185.330, -1210.740, -89.084, 2281.450, -1154.590, 110.916)
5352 AddZone("Mulholland", 1318.130, -910.170, -89.084, 1357.000, -768.027, 110.916)
5353 AddZone("Avispa Country Club", -2361.510, -417.199, 0.000, -2270.040, -355.493, 200.000)
5354 AddZone("Jefferson", 1996.910, -1449.670, -89.084, 2056.860, -1350.720, 110.916)
5355 AddZone("Julius Thruway West", 1236.630, 2142.860, -89.084, 1297.470, 2243.230, 110.916)
5356 AddZone("Jefferson", 2124.660, -1494.030, -89.084, 2266.210, -1449.670, 110.916)
5357 AddZone("Julius Thruway North", 1848.400, 2478.490, -89.084, 1938.800, 2553.490, 110.916)
5358 AddZone("Rodeo", 422.680, -1570.200, -89.084, 466.223, -1406.050, 110.916)
5359 AddZone("Cranberry Station", -2007.830, 56.306, 0.000, -1922.000, 224.782, 100.000)
5360 AddZone("Downtown Los Santos", 1391.050, -1026.330, -89.084, 1463.900, -926.999, 110.916)
5361 AddZone("Redsands West", 1704.590, 2243.230, -89.084, 1777.390, 2342.830, 110.916)
5362 AddZone("Little Mexico", 1758.900, -1722.260, -89.084, 1812.620, -1577.590, 110.916)
5363 AddZone("Blackfield Intersection", 1375.600, 823.228, -89.084, 1457.390, 919.447, 110.916)
5364 AddZone("Los Santos International", 1974.630, -2394.330, -39.084, 2089.000, -2256.590, 60.916)
5365 AddZone("Beacon Hill", -399.633, -1075.520, -1.489, -319.033, -977.516, 198.511)
5366 AddZone("Rodeo", 334.503, -1501.950, -89.084, 422.680, -1406.050, 110.916)
5367 AddZone("Richman", 225.165, -1369.620, -89.084, 334.503, -1292.070, 110.916)
5368 AddZone("Downtown Los Santos", 1724.760, -1250.900, -89.084, 1812.620, -1150.870, 110.916)
5369 AddZone("The Strip", 2027.400, 1703.230, -89.084, 2137.400, 1783.230, 110.916)
5370 AddZone("Downtown Los Santos", 1378.330, -1130.850, -89.084, 1463.900, -1026.330, 110.916)
5371 AddZone("Blackfield Intersection", 1197.390, 1044.690, -89.084, 1277.050, 1163.390, 110.916)
5372 AddZone("Conference Center", 1073.220, -1842.270, -89.084, 1323.900, -1804.210, 110.916)
5373 AddZone("Montgomery", 1451.400, 347.457, -6.1, 1582.440, 420.802, 200.000)
5374 AddZone("Foster Valley", -2270.040, -430.276, -1.2, -2178.690, -324.114, 200.000)
5375 AddZone("Blackfield Chapel", 1325.600, 596.349, -89.084, 1375.600, 795.010, 110.916)
5376 AddZone("Los Santos International", 2051.630, -2597.260, -39.084, 2152.450, -2394.330, 60.916)
5377 AddZone("Mulholland", 1096.470, -910.170, -89.084, 1169.130, -768.027, 110.916)
5378 AddZone("Yellow Bell Gol Course", 1457.460, 2723.230, -89.084, 1534.560, 2863.230, 110.916)
5379 AddZone("The Strip", 2027.400, 1783.230, -89.084, 2162.390, 1863.230, 110.916)
5380 AddZone("Jefferson", 2056.860, -1210.740, -89.084, 2185.330, -1126.320, 110.916)
5381 AddZone("Mulholland", 952.604, -937.184, -89.084, 1096.470, -860.619, 110.916)
5382 AddZone("Aldea Malvada", -1372.140, 2498.520, 0.000, -1277.590, 2615.350, 200.000)
5383 AddZone("Las Colinas", 2126.860, -1126.320, -89.084, 2185.330, -934.489, 110.916)
5384 AddZone("Las Colinas", 1994.330, -1100.820, -89.084, 2056.860, -920.815, 110.916)
5385 AddZone("Richman", 647.557, -954.662, -89.084, 768.694, -860.619, 110.916)
5386 AddZone("LVA Freight Depot", 1277.050, 1087.630, -89.084, 1375.600, 1203.280, 110.916)
5387 AddZone("Julius Thruway North", 1377.390, 2433.230, -89.084, 1534.560, 2507.230, 110.916)
5388 AddZone("Willowfield", 2201.820, -2095.000, -89.084, 2324.000, -1989.900, 110.916)
5389 AddZone("Julius Thruway North", 1704.590, 2342.830, -89.084, 1848.400, 2433.230, 110.916)
5390 AddZone("Temple", 1252.330, -1130.850, -89.084, 1378.330, -1026.330, 110.916)
5391 AddZone("Little Mexico", 1701.900, -1842.270, -89.084, 1812.620, -1722.260, 110.916)
5392 AddZone("Queens", -2411.220, 373.539, 0.000, -2253.540, 458.411, 200.000)
5393 AddZone("Las Venturas Airport", 1515.810, 1586.400, -12.500, 1729.950, 1714.560, 87.500)
5394 AddZone("Richman", 225.165, -1292.070, -89.084, 466.223, -1235.070, 110.916)
5395 AddZone("Temple", 1252.330, -1026.330, -89.084, 1391.050, -926.999, 110.916)
5396 AddZone("East Los Santos", 2266.260, -1494.030, -89.084, 2381.680, -1372.040, 110.916)
5397 AddZone("Julius Thruway East", 2623.180, 943.235, -89.084, 2749.900, 1055.960, 110.916)
5398 AddZone("Willowfield", 2541.700, -1941.400, -89.084, 2703.580, -1852.870, 110.916)
5399 AddZone("Las Colinas", 2056.860, -1126.320, -89.084, 2126.860, -920.815, 110.916)
5400 AddZone("Julius Thruway East", 2625.160, 2202.760, -89.084, 2685.160, 2442.550, 110.916)
5401 AddZone("Rodeo", 225.165, -1501.950, -89.084, 334.503, -1369.620, 110.916)
5402 AddZone("Las Brujas", -365.167, 2123.010, -3.0, -208.570, 2217.680, 200.000)
5403 AddZone("Julius Thruway East", 2536.430, 2442.550, -89.084, 2685.160, 2542.550, 110.916)
5404 AddZone("Rodeo", 334.503, -1406.050, -89.084, 466.223, -1292.070, 110.916)
5405 AddZone("Vinewood", 647.557, -1227.280, -89.084, 787.461, -1118.280, 110.916)
5406 AddZone("Rodeo", 422.680, -1684.650, -89.084, 558.099, -1570.200, 110.916)
5407 AddZone("Julius Thruway North", 2498.210, 2542.550, -89.084, 2685.160, 2626.550, 110.916)
5408 AddZone("Downtown Los Santos", 1724.760, -1430.870, -89.084, 1812.620, -1250.900, 110.916)
5409 AddZone("Rodeo", 225.165, -1684.650, -89.084, 312.803, -1501.950, 110.916)
5410 AddZone("Jefferson", 2056.860, -1449.670, -89.084, 2266.210, -1372.040, 110.916)
5411 AddZone("Hampton Barns", 603.035, 264.312, 0.000, 761.994, 366.572, 200.000)
5412 AddZone("Temple", 1096.470, -1130.840, -89.084, 1252.330, -1026.330, 110.916)
5413 AddZone("Kincaid Bridge", -1087.930, 855.370, -89.084, -961.950, 986.281, 110.916)
5414 AddZone("Verona Beach", 1046.150, -1722.260, -89.084, 1161.520, -1577.590, 110.916)
5415 AddZone("Commerce", 1323.900, -1722.260, -89.084, 1440.900, -1577.590, 110.916)
5416 AddZone("Mulholland", 1357.000, -926.999, -89.084, 1463.900, -768.027, 110.916)
5417 AddZone("Rodeo", 466.223, -1570.200, -89.084, 558.099, -1385.070, 110.916)
5418 AddZone("Mulholland", 911.802, -860.619, -89.084, 1096.470, -768.027, 110.916)
5419 AddZone("Mulholland", 768.694, -954.662, -89.084, 952.604, -860.619, 110.916)
5420 AddZone("Julius Thruway South", 2377.390, 788.894, -89.084, 2537.390, 897.901, 110.916)
5421 AddZone("Idlewood", 1812.620, -1852.870, -89.084, 1971.660, -1742.310, 110.916)
5422 AddZone("Ocean Docks", 2089.000, -2394.330, -89.084, 2201.820, -2235.840, 110.916)
5423 AddZone("Commerce", 1370.850, -1577.590, -89.084, 1463.900, -1384.950, 110.916)
5424 AddZone("Julius Thruway North", 2121.400, 2508.230, -89.084, 2237.400, 2663.170, 110.916)
5425 AddZone("Temple", 1096.470, -1026.330, -89.084, 1252.330, -910.170, 110.916)
5426 AddZone("Glen Park", 1812.620, -1449.670, -89.084, 1996.910, -1350.720, 110.916)
5427 AddZone("Easter Bay Airport", -1242.980, -50.096, 0.000, -1213.910, 578.396, 200.000)
5428 AddZone("Martin Bridge", -222.179, 293.324, 0.000, -122.126, 476.465, 200.000)
5429 AddZone("The Strip", 2106.700, 1863.230, -89.084, 2162.390, 2202.760, 110.916)
5430 AddZone("Willowfield", 2541.700, -2059.230, -89.084, 2703.580, -1941.400, 110.916)
5431 AddZone("Marina", 807.922, -1577.590, -89.084, 926.922, -1416.250, 110.916)
5432 AddZone("Las Venturas Airport", 1457.370, 1143.210, -89.084, 1777.400, 1203.280, 110.916)
5433 AddZone("Idlewood", 1812.620, -1742.310, -89.084, 1951.660, -1602.310, 110.916)
5434 AddZone("Esplanade East", -1580.010, 1025.980, -6.1, -1499.890, 1274.260, 200.000)
5435 AddZone("Downtown Los Santos", 1370.850, -1384.950, -89.084, 1463.900, -1170.870, 110.916)
5436 AddZone("The Mako Span", 1664.620, 401.750, 0.000, 1785.140, 567.203, 200.000)
5437 AddZone("Rodeo", 312.803, -1684.650, -89.084, 422.680, -1501.950, 110.916)
5438 AddZone("Pershing Square", 1440.900, -1722.260, -89.084, 1583.500, -1577.590, 110.916)
5439 AddZone("Mulholland", 687.802, -860.619, -89.084, 911.802, -768.027, 110.916)
5440 AddZone("Gant Bridge", -2741.070, 1490.470, -6.1, -2616.400, 1659.680, 200.000)
5441 AddZone("Las Colinas", 2185.330, -1154.590, -89.084, 2281.450, -934.489, 110.916)
5442 AddZone("Mulholland", 1169.130, -910.170, -89.084, 1318.130, -768.027, 110.916)
5443 AddZone("Julius Thruway North", 1938.800, 2508.230, -89.084, 2121.400, 2624.230, 110.916)
5444 AddZone("Commerce", 1667.960, -1577.590, -89.084, 1812.620, -1430.870, 110.916)
5445 AddZone("Rodeo", 72.648, -1544.170, -89.084, 225.165, -1404.970, 110.916)
5446 AddZone("Roca Escalante", 2536.430, 2202.760, -89.084, 2625.160, 2442.550, 110.916)
5447 AddZone("Rodeo", 72.648, -1684.650, -89.084, 225.165, -1544.170, 110.916)
5448 AddZone("Market", 952.663, -1310.210, -89.084, 1072.660, -1130.850, 110.916)
5449 AddZone("Las Colinas", 2632.740, -1135.040, -89.084, 2747.740, -945.035, 110.916)
5450 AddZone("Mulholland", 861.085, -674.885, -89.084, 1156.550, -600.896, 110.916)
5451 AddZone("King's", -2253.540, 373.539, -9.1, -1993.280, 458.411, 200.000)
5452 AddZone("Redsands East", 1848.400, 2342.830, -89.084, 2011.940, 2478.490, 110.916)
5453 AddZone("Downtown", -1580.010, 744.267, -6.1, -1499.890, 1025.980, 200.000)
5454 AddZone("Conference Center", 1046.150, -1804.210, -89.084, 1323.900, -1722.260, 110.916)
5455 AddZone("Richman", 647.557, -1118.280, -89.084, 787.461, -954.662, 110.916)
5456 AddZone("Ocean Flats", -2994.490, 277.411, -9.1, -2867.850, 458.411, 200.000)
5457 AddZone("Greenglass College", 964.391, 930.890, -89.084, 1166.530, 1044.690, 110.916)
5458 AddZone("Glen Park", 1812.620, -1100.820, -89.084, 1994.330, -973.380, 110.916)
5459 AddZone("LVA Freight Depot", 1375.600, 919.447, -89.084, 1457.370, 1203.280, 110.916)
5460 AddZone("Regular Tom", -405.770, 1712.860, -3.0, -276.719, 1892.750, 200.000)
5461 AddZone("Verona Beach", 1161.520, -1722.260, -89.084, 1323.900, -1577.590, 110.916)
5462 AddZone("East Los Santos", 2281.450, -1372.040, -89.084, 2381.680, -1135.040, 110.916)
5463 AddZone("Caligula's Palace", 2137.400, 1703.230, -89.084, 2437.390, 1783.230, 110.916)
5464 AddZone("Idlewood", 1951.660, -1742.310, -89.084, 2124.660, -1602.310, 110.916)
5465 AddZone("Pilgrim", 2624.400, 1383.230, -89.084, 2685.160, 1783.230, 110.916)
5466 AddZone("Idlewood", 2124.660, -1742.310, -89.084, 2222.560, -1494.030, 110.916)
5467 AddZone("Queens", -2533.040, 458.411, 0.000, -2329.310, 578.396, 200.000)
5468 AddZone("Downtown", -1871.720, 1176.420, -4.5, -1620.300, 1274.260, 200.000)
5469 AddZone("Commerce", 1583.500, -1722.260, -89.084, 1758.900, -1577.590, 110.916)
5470 AddZone("East Los Santos", 2381.680, -1454.350, -89.084, 2462.130, -1135.040, 110.916)
5471 AddZone("Marina", 647.712, -1577.590, -89.084, 807.922, -1416.250, 110.916)
5472 AddZone("Richman", 72.648, -1404.970, -89.084, 225.165, -1235.070, 110.916)
5473 AddZone("Vinewood", 647.712, -1416.250, -89.084, 787.461, -1227.280, 110.916)
5474 AddZone("East Los Santos", 2222.560, -1628.530, -89.084, 2421.030, -1494.030, 110.916)
5475 AddZone("Rodeo", 558.099, -1684.650, -89.084, 647.522, -1384.930, 110.916)
5476 AddZone("Easter Tunnel", -1709.710, -833.034, -1.5, -1446.010, -730.118, 200.000)
5477 AddZone("Rodeo", 466.223, -1385.070, -89.084, 647.522, -1235.070, 110.916)
5478 AddZone("Redsands East", 1817.390, 2202.760, -89.084, 2011.940, 2342.830, 110.916)
5479 AddZone("The Clown's Pocket", 2162.390, 1783.230, -89.084, 2437.390, 1883.230, 110.916)
5480 AddZone("Idlewood", 1971.660, -1852.870, -89.084, 2222.560, -1742.310, 110.916)
5481 AddZone("Montgomery Intersection", 1546.650, 208.164, 0.000, 1745.830, 347.457, 200.000)
5482 AddZone("Willowfield", 2089.000, -2235.840, -89.084, 2201.820, -1989.900, 110.916)
5483 AddZone("Temple", 952.663, -1130.840, -89.084, 1096.470, -937.184, 110.916)
5484 AddZone("Prickle Pine", 1848.400, 2553.490, -89.084, 1938.800, 2863.230, 110.916)
5485 AddZone("Los Santos International", 1400.970, -2669.260, -39.084, 2189.820, -2597.260, 60.916)
5486 AddZone("Garver Bridge", -1213.910, 950.022, -89.084, -1087.930, 1178.930, 110.916)
5487 AddZone("Garver Bridge", -1339.890, 828.129, -89.084, -1213.910, 1057.040, 110.916)
5488 AddZone("Kincaid Bridge", -1339.890, 599.218, -89.084, -1213.910, 828.129, 110.916)
5489 AddZone("Kincaid Bridge", -1213.910, 721.111, -89.084, -1087.930, 950.022, 110.916)
5490 AddZone("Verona Beach", 930.221, -2006.780, -89.084, 1073.220, -1804.210, 110.916)
5491 AddZone("Verdant Bluffs", 1073.220, -2006.780, -89.084, 1249.620, -1842.270, 110.916)
5492 AddZone("Vinewood", 787.461, -1130.840, -89.084, 952.604, -954.662, 110.916)
5493 AddZone("Vinewood", 787.461, -1310.210, -89.084, 952.663, -1130.840, 110.916)
5494 AddZone("Commerce", 1463.900, -1577.590, -89.084, 1667.960, -1430.870, 110.916)
5495 AddZone("Market", 787.461, -1416.250, -89.084, 1072.660, -1310.210, 110.916)
5496 AddZone("Rockshore West", 2377.390, 596.349, -89.084, 2537.390, 788.894, 110.916)
5497 AddZone("Julius Thruway North", 2237.400, 2542.550, -89.084, 2498.210, 2663.170, 110.916)
5498 AddZone("East Beach", 2632.830, -1668.130, -89.084, 2747.740, -1393.420, 110.916)
5499 AddZone("Fallow Bridge", 434.341, 366.572, 0.000, 603.035, 555.680, 200.000)
5500 AddZone("Willowfield", 2089.000, -1989.900, -89.084, 2324.000, -1852.870, 110.916)
5501 AddZone("Chinatown", -2274.170, 578.396, -7.6, -2078.670, 744.170, 200.000)
5502 AddZone("El Castillo del Diablo", -208.570, 2337.180, 0.000, 8.430, 2487.180, 200.000)
5503 AddZone("Ocean Docks", 2324.000, -2145.100, -89.084, 2703.580, -2059.230, 110.916)
5504 AddZone("Easter Bay Chemicals", -1132.820, -768.027, 0.000, -956.476, -578.118, 200.000)
5505 AddZone("The Visage", 1817.390, 1703.230, -89.084, 2027.400, 1863.230, 110.916)
5506 AddZone("Ocean Flats", -2994.490, -430.276, -1.2, -2831.890, -222.589, 200.000)
5507 AddZone("Richman", 321.356, -860.619, -89.084, 687.802, -768.027, 110.916)
5508 AddZone("Green Palms", 176.581, 1305.450, -3.0, 338.658, 1520.720, 200.000)
5509 AddZone("Richman", 321.356, -768.027, -89.084, 700.794, -674.885, 110.916)
5510 AddZone("Starfish Casino", 2162.390, 1883.230, -89.084, 2437.390, 2012.180, 110.916)
5511 AddZone("East Beach", 2747.740, -1668.130, -89.084, 2959.350, -1498.620, 110.916)
5512 AddZone("Jefferson", 2056.860, -1372.040, -89.084, 2281.450, -1210.740, 110.916)
5513 AddZone("Downtown Los Santos", 1463.900, -1290.870, -89.084, 1724.760, -1150.870, 110.916)
5514 AddZone("Downtown Los Santos", 1463.900, -1430.870, -89.084, 1724.760, -1290.870, 110.916)
5515 AddZone("Garver Bridge", -1499.890, 696.442, -179.615, -1339.890, 925.353, 20.385)
5516 AddZone("Julius Thruway South", 1457.390, 823.228, -89.084, 2377.390, 863.229, 110.916)
5517 AddZone("East Los Santos", 2421.030, -1628.530, -89.084, 2632.830, -1454.350, 110.916)
5518 AddZone("Greenglass College", 964.391, 1044.690, -89.084, 1197.390, 1203.220, 110.916)
5519 AddZone("Las Colinas", 2747.740, -1120.040, -89.084, 2959.350, -945.035, 110.916)
5520 AddZone("Mulholland", 737.573, -768.027, -89.084, 1142.290, -674.885, 110.916)
5521 AddZone("Ocean Docks", 2201.820, -2730.880, -89.084, 2324.000, -2418.330, 110.916)
5522 AddZone("East Los Santos", 2462.130, -1454.350, -89.084, 2581.730, -1135.040, 110.916)
5523 AddZone("Ganton", 2222.560, -1722.330, -89.084, 2632.830, -1628.530, 110.916)
5524 AddZone("Avispa Country Club", -2831.890, -430.276, -6.1, -2646.400, -222.589, 200.000)
5525 AddZone("Willowfield", 1970.620, -2179.250, -89.084, 2089.000, -1852.870, 110.916)
5526 AddZone("Esplanade North", -1982.320, 1274.260, -4.5, -1524.240, 1358.900, 200.000)
5527 AddZone("The High Roller", 1817.390, 1283.230, -89.084, 2027.390, 1469.230, 110.916)
5528 AddZone("Ocean Docks", 2201.820, -2418.330, -89.084, 2324.000, -2095.000, 110.916)
5529 AddZone("Last Dime Motel", 1823.080, 596.349, -89.084, 1997.220, 823.228, 110.916)
5530 AddZone("Bayside Marina", -2353.170, 2275.790, 0.000, -2153.170, 2475.790, 200.000)
5531 AddZone("King's", -2329.310, 458.411, -7.6, -1993.280, 578.396, 200.000)
5532 AddZone("El Corona", 1692.620, -2179.250, -89.084, 1812.620, -1842.270, 110.916)
5533 AddZone("Blackfield Chapel", 1375.600, 596.349, -89.084, 1558.090, 823.228, 110.916)
5534 AddZone("The Pink Swan", 1817.390, 1083.230, -89.084, 2027.390, 1283.230, 110.916)
5535 AddZone("Julius Thruway West", 1197.390, 1163.390, -89.084, 1236.630, 2243.230, 110.916)
5536 AddZone("Los Flores", 2581.730, -1393.420, -89.084, 2747.740, -1135.040, 110.916)
5537 AddZone("The Visage", 1817.390, 1863.230, -89.084, 2106.700, 2011.830, 110.916)
5538 AddZone("Prickle Pine", 1938.800, 2624.230, -89.084, 2121.400, 2861.550, 110.916)
5539 AddZone("Verona Beach", 851.449, -1804.210, -89.084, 1046.150, -1577.590, 110.916)
5540 AddZone("Robada Intersection", -1119.010, 1178.930, -89.084, -862.025, 1351.450, 110.916)
5541 AddZone("Linden Side", 2749.900, 943.235, -89.084, 2923.390, 1198.990, 110.916)
5542 AddZone("Ocean Docks", 2703.580, -2302.330, -89.084, 2959.350, -2126.900, 110.916)
5543 AddZone("Willowfield", 2324.000, -2059.230, -89.084, 2541.700, -1852.870, 110.916)
5544 AddZone("King's", -2411.220, 265.243, -9.1, -1993.280, 373.539, 200.000)
5545 AddZone("Commerce", 1323.900, -1842.270, -89.084, 1701.900, -1722.260, 110.916)
5546 AddZone("Mulholland", 1269.130, -768.027, -89.084, 1414.070, -452.425, 110.916)
5547 AddZone("Marina", 647.712, -1804.210, -89.084, 851.449, -1577.590, 110.916)
5548 AddZone("Battery Point", -2741.070, 1268.410, -4.5, -2533.040, 1490.470, 200.000)
5549 AddZone("The Four Dragons Casino", 1817.390, 863.232, -89.084, 2027.390, 1083.230, 110.916)
5550 AddZone("Blackfield", 964.391, 1203.220, -89.084, 1197.390, 1403.220, 110.916)
5551 AddZone("Julius Thruway North", 1534.560, 2433.230, -89.084, 1848.400, 2583.230, 110.916)
5552 AddZone("Yellow Bell Gol Course", 1117.400, 2723.230, -89.084, 1457.460, 2863.230, 110.916)
5553 AddZone("Idlewood", 1812.620, -1602.310, -89.084, 2124.660, -1449.670, 110.916)
5554 AddZone("Redsands West", 1297.470, 2142.860, -89.084, 1777.390, 2243.230, 110.916)
5555 AddZone("Doherty", -2270.040, -324.114, -1.2, -1794.920, -222.589, 200.000)
5556 AddZone("Hilltop Farm", 967.383, -450.390, -3.0, 1176.780, -217.900, 200.000)
5557 AddZone("Las Barrancas", -926.130, 1398.730, -3.0, -719.234, 1634.690, 200.000)
5558 AddZone("Pirates in Men's Pants", 1817.390, 1469.230, -89.084, 2027.400, 1703.230, 110.916)
5559 AddZone("City Hall", -2867.850, 277.411, -9.1, -2593.440, 458.411, 200.000)
5560 AddZone("Avispa Country Club", -2646.400, -355.493, 0.000, -2270.040, -222.589, 200.000)
5561 AddZone("The Strip", 2027.400, 863.229, -89.084, 2087.390, 1703.230, 110.916)
5562 AddZone("Hashbury", -2593.440, -222.589, -1.0, -2411.220, 54.722, 200.000)
5563 AddZone("Los Santos International", 1852.000, -2394.330, -89.084, 2089.000, -2179.250, 110.916)
5564 AddZone("Whitewood Estates", 1098.310, 1726.220, -89.084, 1197.390, 2243.230, 110.916)
5565 AddZone("Sherman Reservoir", -789.737, 1659.680, -89.084, -599.505, 1929.410, 110.916)
5566 AddZone("El Corona", 1812.620, -2179.250, -89.084, 1970.620, -1852.870, 110.916)
5567 AddZone("Downtown", -1700.010, 744.267, -6.1, -1580.010, 1176.520, 200.000)
5568 AddZone("Foster Valley", -2178.690, -1250.970, 0.000, -1794.920, -1115.580, 200.000)
5569 AddZone("Las Payasadas", -354.332, 2580.360, 2.0, -133.625, 2816.820, 200.000)
5570 AddZone("Valle Ocultado", -936.668, 2611.440, 2.0, -715.961, 2847.900, 200.000)
5571 AddZone("Blackfield Intersection", 1166.530, 795.010, -89.084, 1375.600, 1044.690, 110.916)
5572 AddZone("Ganton", 2222.560, -1852.870, -89.084, 2632.830, -1722.330, 110.916)
5573 AddZone("Easter Bay Airport", -1213.910, -730.118, 0.000, -1132.820, -50.096, 200.000)
5574 AddZone("Redsands East", 1817.390, 2011.830, -89.084, 2106.700, 2202.760, 110.916)
5575 AddZone("Esplanade East", -1499.890, 578.396, -79.615, -1339.890, 1274.260, 20.385)
5576 AddZone("Caligula's Palace", 2087.390, 1543.230, -89.084, 2437.390, 1703.230, 110.916)
5577 AddZone("Royal Casino", 2087.390, 1383.230, -89.084, 2437.390, 1543.230, 110.916)
5578 AddZone("Richman", 72.648, -1235.070, -89.084, 321.356, -1008.150, 110.916)
5579 AddZone("Starfish Casino", 2437.390, 1783.230, -89.084, 2685.160, 2012.180, 110.916)
5580 AddZone("Mulholland", 1281.130, -452.425, -89.084, 1641.130, -290.913, 110.916)
5581 AddZone("Downtown", -1982.320, 744.170, -6.1, -1871.720, 1274.260, 200.000)
5582 AddZone("Hankypanky Point", 2576.920, 62.158, 0.000, 2759.250, 385.503, 200.000)
5583 AddZone("K.A.C.C. Military Fuels", 2498.210, 2626.550, -89.084, 2749.900, 2861.550, 110.916)
5584 AddZone("Harry Gold Parkway", 1777.390, 863.232, -89.084, 1817.390, 2342.830, 110.916)
5585 AddZone("Bayside Tunnel", -2290.190, 2548.290, -89.084, -1950.190, 2723.290, 110.916)
5586 AddZone("Ocean Docks", 2324.000, -2302.330, -89.084, 2703.580, -2145.100, 110.916)
5587 AddZone("Richman", 321.356, -1044.070, -89.084, 647.557, -860.619, 110.916)
5588 AddZone("Randolph Industrial Estate", 1558.090, 596.349, -89.084, 1823.080, 823.235, 110.916)
5589 AddZone("East Beach", 2632.830, -1852.870, -89.084, 2959.350, -1668.130, 110.916)
5590 AddZone("Flint Water", -314.426, -753.874, -89.084, -106.339, -463.073, 110.916)
5591 AddZone("Blueberry", 19.607, -404.136, 3.8, 349.607, -220.137, 200.000)
5592 AddZone("Linden Station", 2749.900, 1198.990, -89.084, 2923.390, 1548.990, 110.916)
5593 AddZone("Glen Park", 1812.620, -1350.720, -89.084, 2056.860, -1100.820, 110.916)
5594 AddZone("Downtown", -1993.280, 265.243, -9.1, -1794.920, 578.396, 200.000)
5595 AddZone("Redsands West", 1377.390, 2243.230, -89.084, 1704.590, 2433.230, 110.916)
5596 AddZone("Richman", 321.356, -1235.070, -89.084, 647.522, -1044.070, 110.916)
5597 AddZone("Gant Bridge", -2741.450, 1659.680, -6.1, -2616.400, 2175.150, 200.000)
5598 AddZone("Lil' Probe Inn", -90.218, 1286.850, -3.0, 153.859, 1554.120, 200.000)
5599 AddZone("Flint Intersection", -187.700, -1596.760, -89.084, 17.063, -1276.600, 110.916)
5600 AddZone("Las Colinas", 2281.450, -1135.040, -89.084, 2632.740, -945.035, 110.916)
5601 AddZone("Sobell Rail Yards", 2749.900, 1548.990, -89.084, 2923.390, 1937.250, 110.916)
5602 AddZone("The Emerald Isle", 2011.940, 2202.760, -89.084, 2237.400, 2508.230, 110.916)
5603 AddZone("El Castillo del Diablo", -208.570, 2123.010, -7.6, 114.033, 2337.180, 200.000)
5604 AddZone("Santa Flora", -2741.070, 458.411, -7.6, -2533.040, 793.411, 200.000)
5605 AddZone("Playa del Seville", 2703.580, -2126.900, -89.084, 2959.350, -1852.870, 110.916)
5606 AddZone("Market", 926.922, -1577.590, -89.084, 1370.850, -1416.250, 110.916)
5607 AddZone("Queens", -2593.440, 54.722, 0.000, -2411.220, 458.411, 200.000)
5608 AddZone("Pilson Intersection", 1098.390, 2243.230, -89.084, 1377.390, 2507.230, 110.916)
5609 AddZone("Spinybed", 2121.400, 2663.170, -89.084, 2498.210, 2861.550, 110.916)
5610 AddZone("Pilgrim", 2437.390, 1383.230, -89.084, 2624.400, 1783.230, 110.916)
5611 AddZone("Blackfield", 964.391, 1403.220, -89.084, 1197.390, 1726.220, 110.916)
5612 AddZone("'The Big Ear'", -410.020, 1403.340, -3.0, -137.969, 1681.230, 200.000)
5613 AddZone("Dillimore", 580.794, -674.885, -9.5, 861.085, -404.790, 200.000)
5614 AddZone("El Quebrados", -1645.230, 2498.520, 0.000, -1372.140, 2777.850, 200.000)
5615 AddZone("Esplanade North", -2533.040, 1358.900, -4.5, -1996.660, 1501.210, 200.000)
5616 AddZone("Easter Bay Airport", -1499.890, -50.096, -1.0, -1242.980, 249.904, 200.000)
5617 AddZone("Fisher's Lagoon", 1916.990, -233.323, -100.000, 2131.720, 13.800, 200.000)
5618 AddZone("Mulholland", 1414.070, -768.027, -89.084, 1667.610, -452.425, 110.916)
5619 AddZone("East Beach", 2747.740, -1498.620, -89.084, 2959.350, -1120.040, 110.916)
5620 AddZone("San Andreas Sound", 2450.390, 385.503, -100.000, 2759.250, 562.349, 200.000)
5621 AddZone("Shady Creeks", -2030.120, -2174.890, -6.1, -1820.640, -1771.660, 200.000)
5622 AddZone("Market", 1072.660, -1416.250, -89.084, 1370.850, -1130.850, 110.916)
5623 AddZone("Rockshore West", 1997.220, 596.349, -89.084, 2377.390, 823.228, 110.916)
5624 AddZone("Prickle Pine", 1534.560, 2583.230, -89.084, 1848.400, 2863.230, 110.916)
5625 AddZone("Easter Basin", -1794.920, -50.096, -1.04, -1499.890, 249.904, 200.000)
5626 AddZone("Leafy Hollow", -1166.970, -1856.030, 0.000, -815.624, -1602.070, 200.000)
5627 AddZone("LVA Freight Depot", 1457.390, 863.229, -89.084, 1777.400, 1143.210, 110.916)
5628 AddZone("Prickle Pine", 1117.400, 2507.230, -89.084, 1534.560, 2723.230, 110.916)
5629 AddZone("Blueberry", 104.534, -220.137, 2.3, 349.607, 152.236, 200.000)
5630 AddZone("El Castillo del Diablo", -464.515, 2217.680, 0.000, -208.570, 2580.360, 200.000)
5631 AddZone("Downtown", -2078.670, 578.396, -7.6, -1499.890, 744.267, 200.000)
5632 AddZone("Rockshore East", 2537.390, 676.549, -89.084, 2902.350, 943.235, 110.916)
5633 AddZone("San Fierro Bay", -2616.400, 1501.210, -3.0, -1996.660, 1659.680, 200.000)
5634 AddZone("Paradiso", -2741.070, 793.411, -6.1, -2533.040, 1268.410, 200.000)
5635 AddZone("The Camel's Toe", 2087.390, 1203.230, -89.084, 2640.400, 1383.230, 110.916)
5636 AddZone("Old Venturas Strip", 2162.390, 2012.180, -89.084, 2685.160, 2202.760, 110.916)
5637 AddZone("Juniper Hill", -2533.040, 578.396, -7.6, -2274.170, 968.369, 200.000)
5638 AddZone("Juniper Hollow", -2533.040, 968.369, -6.1, -2274.170, 1358.900, 200.000)
5639 AddZone("Roca Escalante", 2237.400, 2202.760, -89.084, 2536.430, 2542.550, 110.916)
5640 AddZone("Julius Thruway East", 2685.160, 1055.960, -89.084, 2749.900, 2626.550, 110.916)
5641 AddZone("Verona Beach", 647.712, -2173.290, -89.084, 930.221, -1804.210, 110.916)
5642 AddZone("Foster Valley", -2178.690, -599.884, -1.2, -1794.920, -324.114, 200.000)
5643 AddZone("Arco del Oeste", -901.129, 2221.860, 0.000, -592.090, 2571.970, 200.000)
5644 AddZone("Fallen Tree", -792.254, -698.555, -5.3, -452.404, -380.043, 200.000)
5645 AddZone("The Farm", -1209.670, -1317.100, 114.981, -908.161, -787.391, 251.981)
5646 AddZone("The Sherman Dam", -968.772, 1929.410, -3.0, -481.126, 2155.260, 200.000)
5647 AddZone("Esplanade North", -1996.660, 1358.900, -4.5, -1524.240, 1592.510, 200.000)
5648 AddZone("Financial", -1871.720, 744.170, -6.1, -1701.300, 1176.420, 300.000)
5649 AddZone("Garcia", -2411.220, -222.589, -1.14, -2173.040, 265.243, 200.000)
5650 AddZone("Montgomery", 1119.510, 119.526, -3.0, 1451.400, 493.323, 200.000)
5651 AddZone("Creek", 2749.900, 1937.250, -89.084, 2921.620, 2669.790, 110.916)
5652 AddZone("Los Santos International", 1249.620, -2394.330, -89.084, 1852.000, -2179.250, 110.916)
5653 AddZone("Santa Maria Beach", 72.648, -2173.290, -89.084, 342.648, -1684.650, 110.916)
5654 AddZone("Mulholland Intersection", 1463.900, -1150.870, -89.084, 1812.620, -768.027, 110.916)
5655 AddZone("Angel Pine", -2324.940, -2584.290, -6.1, -1964.220, -2212.110, 200.000)
5656 AddZone("Verdant Meadows", 37.032, 2337.180, -3.0, 435.988, 2677.900, 200.000)
5657 AddZone("Octane Springs", 338.658, 1228.510, 0.000, 664.308, 1655.050, 200.000)
5658 AddZone("Come-A-Lot", 2087.390, 943.235, -89.084, 2623.180, 1203.230, 110.916)
5659 AddZone("Redsands West", 1236.630, 1883.110, -89.084, 1777.390, 2142.860, 110.916)
5660 AddZone("Santa Maria Beach", 342.648, -2173.290, -89.084, 647.712, -1684.650, 110.916)
5661 AddZone("Verdant Bluffs", 1249.620, -2179.250, -89.084, 1692.620, -1842.270, 110.916)
5662 AddZone("Las Venturas Airport", 1236.630, 1203.280, -89.084, 1457.370, 1883.110, 110.916)
5663 AddZone("Flint Range", -594.191, -1648.550, 0.000, -187.700, -1276.600, 200.000)
5664 AddZone("Verdant Bluffs", 930.221, -2488.420, -89.084, 1249.620, -2006.780, 110.916)
5665 AddZone("Palomino Creek", 2160.220, -149.004, 0.000, 2576.920, 228.322, 200.000)
5666 AddZone("Ocean Docks", 2373.770, -2697.090, -89.084, 2809.220, -2330.460, 110.916)
5667 AddZone("Easter Bay Airport", -1213.910, -50.096, -4.5, -947.980, 578.396, 200.000)
5668 AddZone("Whitewood Estates", 883.308, 1726.220, -89.084, 1098.310, 2507.230, 110.916)
5669 AddZone("Calton Heights", -2274.170, 744.170, -6.1, -1982.320, 1358.900, 200.000)
5670 AddZone("Easter Basin", -1794.920, 249.904, -9.1, -1242.980, 578.396, 200.000)
5671 AddZone("Los Santos Inlet", -321.744, -2224.430, -89.084, 44.615, -1724.430, 110.916)
5672 AddZone("Doherty", -2173.040, -222.589, -1.0, -1794.920, 265.243, 200.000)
5673 AddZone("Mount Chiliad", -2178.690, -2189.910, -47.917, -2030.120, -1771.660, 576.083)
5674 AddZone("Fort Carson", -376.233, 826.326, -3.0, 123.717, 1220.440, 200.000)
5675 AddZone("Foster Valley", -2178.690, -1115.580, 0.000, -1794.920, -599.884, 200.000)
5676 AddZone("Ocean Flats", -2994.490, -222.589, -1.0, -2593.440, 277.411, 200.000)
5677 AddZone("Fern Ridge", 508.189, -139.259, 0.000, 1306.660, 119.526, 200.000)
5678 AddZone("Bayside", -2741.070, 2175.150, 0.000, -2353.170, 2722.790, 200.000)
5679 AddZone("Las Venturas Airport", 1457.370, 1203.280, -89.084, 1777.390, 1883.110, 110.916)
5680 AddZone("Blueberry Acres", -319.676, -220.137, 0.000, 104.534, 293.324, 200.000)
5681 AddZone("Palisades", -2994.490, 458.411, -6.1, -2741.070, 1339.610, 200.000)
5682 AddZone("North Rock", 2285.370, -768.027, 0.000, 2770.590, -269.740, 200.000)
5683 AddZone("Hunter Quarry", 337.244, 710.840, -115.239, 860.554, 1031.710, 203.761)
5684 AddZone("Los Santos International", 1382.730, -2730.880, -89.084, 2201.820, -2394.330, 110.916)
5685 AddZone("Missionary Hill", -2994.490, -811.276, 0.000, -2178.690, -430.276, 200.000)
5686 AddZone("San Fierro Bay", -2616.400, 1659.680, -3.0, -1996.660, 2175.150, 200.000)
5687 AddZone("Restricted Area", -91.586, 1655.050, -50.000, 421.234, 2123.010, 250.000)
5688 AddZone("Mount Chiliad", -2997.470, -1115.580, -47.917, -2178.690, -971.913, 576.083)
5689 AddZone("Mount Chiliad", -2178.690, -1771.660, -47.917, -1936.120, -1250.970, 576.083)
5690 AddZone("Easter Bay Airport", -1794.920, -730.118, -3.0, -1213.910, -50.096, 200.000)
5691 AddZone("The Panopticon", -947.980, -304.320, -1.1, -319.676, 327.071, 200.000)
5692 AddZone("Shady Creeks", -1820.640, -2643.680, -8.0, -1226.780, -1771.660, 200.000)
5693 AddZone("Back o Beyond", -1166.970, -2641.190, 0.000, -321.744, -1856.030, 200.000)
5694 AddZone("Mount Chiliad", -2994.490, -2189.910, -47.917, -2178.690, -1115.580, 576.083)
5695 AddZone("Tierra Robada", -1213.910, 596.349, -242.990, -480.539, 1659.680, 900.000)
5696 AddZone("Flint County", -1213.910, -2892.970, -242.990, 44.615, -768.027, 900.000)
5697 AddZone("Whetstone", -2997.470, -2892.970, -242.990, -1213.910, -1115.580, 900.000)
5698 AddZone("Bone County", -480.539, 596.349, -242.990, 869.461, 2993.870, 900.000)
5699 AddZone("Tierra Robada", -2997.470, 1659.680, -242.990, -480.539, 2993.870, 900.000)
5700 AddZone("San Fierro", -2997.470, -1115.580, -242.990, -1213.910, 1659.680, 900.000)
5701 AddZone("Las Venturas", 869.461, 596.349, -242.990, 2997.060, 2993.870, 900.000)
5702 AddZone("Red County", -1213.910, -768.027, -242.990, 2997.060, 596.349, 900.000)
5703 AddZone("Los Santos", 44.615, -2892.970, -242.990, 2997.060, -768.027, 900.000)
5704}
5705
5706calculateZone(posX, posY, posZ) {
5707
5708 if ( bInitZaC == 0 )
5709 {
5710 initZonesAndCities()
5711 bInitZaC := 1
5712 }
5713
5714 Loop % nZone-1
5715 {
5716 if (posX >= zone%A_Index%_x1) && (posY >= zone%A_Index%_y1) && (posZ >= zone%A_Index%_z1) && (posX <= zone%A_Index%_x2) && (posY <= zone%A_Index%_y2) && (posZ <= zone%A_Index%_z2)
5717 {
5718 ErrorLevel := ERROR_OK
5719 return zone%A_Index%_name
5720 }
5721 }
5722
5723 ErrorLevel := ERROR_ZONE_NOT_FOUND
5724 return "Unknown"
5725}
5726
5727calculateCity(posX, posY, posZ) {
5728
5729 if ( bInitZaC == 0 )
5730 {
5731 initZonesAndCities()
5732 bInitZaC := 1
5733 }
5734 smallestCity := "Unknown"
5735 currentCitySize := 0
5736 smallestCitySize := 0
5737
5738 Loop % nCity-1
5739 {
5740 if (posX >= city%A_Index%_x1) && (posY >= city%A_Index%_y1) && (posZ >= city%A_Index%_z1) && (posX <= city%A_Index%_x2) && (posY <= city%A_Index%_y2) && (posZ <= city%A_Index%_z2)
5741 {
5742 currentCitySize := ((city%A_Index%_x2 - city%A_Index%_x1) * (city%A_Index%_y2 - city%A_Index%_y1) * (city%A_Index%_z2 - city%A_Index%_z1))
5743 if (smallestCity == "Unknown") || (currentCitySize < smallestCitySize)
5744 {
5745 smallestCity := city%A_Index%_name
5746 smallestCitySize := currentCitySize
5747 }
5748 }
5749 }
5750
5751 if(smallestCity == "Unknown") {
5752 ErrorLevel := ERROR_CITY_NOT_FOUND
5753 } else {
5754 ErrorLevel := ERROR_OK
5755 }
5756 return smallestCity
5757}
5758
5759/*
5760;do not work?
5761getCurrentZonecode() {
5762 if(!checkHandles())
5763 return ""
5764
5765 return readString(hGTA, ADDR_ZONECODE, 5)
5766}
5767*/
5768
5769AddZone(sName, x1, y1, z1, x2, y2, z2) {
5770 global
5771 zone%nZone%_name := sName
5772 zone%nZone%_x1 := x1
5773 zone%nZone%_y1 := y1
5774 zone%nZone%_z1 := z1
5775 zone%nZone%_x2 := x2
5776 zone%nZone%_y2 := y2
5777 zone%nZone%_z2 := z2
5778 nZone := nZone + 1
5779}
5780
5781AddCity(sName, x1, y1, z1, x2, y2, z2) {
5782 global
5783 city%nCity%_name := sName
5784 city%nCity%_x1 := x1
5785 city%nCity%_y1 := y1
5786 city%nCity%_z1 := z1
5787 city%nCity%_x2 := x2
5788 city%nCity%_y2 := y2
5789 city%nCity%_z2 := z2
5790 nCity := nCity + 1
5791}
5792
5793IsPlayerInRangeOfPoint(_posX, _posY, _posZ, _posRadius)
5794{
5795 GetPlayerPos(posX, posY, posZ)
5796 X := posX -_posX
5797 Y := posY -_posY
5798 Z := posZ -_posZ
5799 if(((X < _posRadius) && (X > -_posRadius)) && ((Y < _posRadius) && (Y > -_posRadius)) && ((Z < _posRadius) && (Z > -_posRadius)))
5800 return TRUE
5801 return FALSE
5802}
5803
5804IsPlayerInRangeOfPoint2D(_posX, _posY, _posRadius)
5805{
5806
5807 GetPlayerPos(posX, posY, posZ)
5808 X := posX - _posX
5809 Y := posY - _posY
5810 if(((X < _posRadius) && (X > -_posRadius)) && ((Y < _posRadius) && (Y > -_posRadius)))
5811 return TRUE
5812 return FALSE
5813}
5814
5815getPlayerZone()
5816{
5817 aktPos := getCoordinates()
5818 return calculateZone(aktPos[1], aktPos[2], aktPos[3])
5819}
5820
5821getPlayerCity()
5822{
5823 aktPos := getCoordinates()
5824 return calculateCity(aktPos[1], aktPos[2], aktPos[3])
5825}
5826AntiCrash(){
5827 If(!checkHandles())
5828 return false
5829
5830 cReport := ADDR_SAMP_CRASHREPORT
5831 writeMemory(hGTA, dwSAMP + cReport, 0x90909090, 4)
5832 cReport += 0x4
5833 writeMemory(hGTA, dwSAMP + cReport, 0x90, 1)
5834 cReport += 0x9
5835 writeMemory(hGTA, dwSAMP + cReport, 0x90909090, 4)
5836 cReport += 0x4
5837 writeMemory(hGTA, dwSAMP + cReport, 0x90, 1)
5838}
5839
5840writeMemory(hProcess,address,writevalue,length=4, datatype="int") {
5841 if(!hProcess) {
5842 ErrorLevel := ERROR_INVALID_HANDLE
5843 return false
5844 }
5845
5846 VarSetCapacity(finalvalue,length, 0)
5847 NumPut(writevalue,finalvalue,0,datatype)
5848 dwRet := DllCall( "WriteProcessMemory"
5849 ,"Uint",hProcess
5850 ,"Uint",address
5851 ,"Uint",&finalvalue
5852 ,"Uint",length
5853 ,"Uint",0)
5854 if(dwRet == 0) {
5855 ErrorLevel := ERROR_WRITE_MEMORY
5856 return false
5857 }
5858
5859 ErrorLevel := ERROR_OK
5860 return true
5861}
5862; ##### Sonstiges #####
5863checkHandles() {
5864 if(iRefreshHandles+500>A_TickCount)
5865 return true
5866 iRefreshHandles:=A_TickCount
5867 if(!refreshGTA() || !refreshSAMP() || !refreshMemory()) {
5868 return false
5869 } else {
5870 return true
5871 }
5872
5873 return true
5874}
5875
5876; internal stuff
5877refreshGTA() {
5878 newPID := getPID("GTA:SA:MP")
5879 if(!newPID) { ; GTA not found
5880 if(hGTA) { ; open handle
5881 virtualFreeEx(hGTA, pMemory, 0, 0x8000)
5882 closeProcess(hGTA)
5883 hGTA := 0x0
5884 }
5885 dwGTAPID := 0
5886 hGTA := 0x0
5887 dwSAMP := 0x0
5888 pMemory := 0x0
5889 return false
5890 }
5891
5892 if(!hGTA || (dwGTAPID != newPID)) { ; changed PID, closed handle
5893 hGTA := openProcess(newPID)
5894 if(ErrorLevel) { ; openProcess fail
5895 dwGTAPID := 0
5896 hGTA := 0x0
5897 dwSAMP := 0x0
5898 pMemory := 0x0
5899 return false
5900 }
5901 dwGTAPID := newPID
5902 dwSAMP := 0x0
5903 pMemory := 0x0
5904 return true
5905 }
5906 return true
5907}
5908
5909; internal stuff
5910refreshSAMP() {
5911 if(dwSAMP)
5912 return true
5913
5914 dwSAMP := getModuleBaseAddress("samp.dll", hGTA)
5915 if(!dwSAMP)
5916 return false
5917
5918 return true
5919}
5920
5921; internal stuff
5922refreshMemory() {
5923 if(!pMemory) {
5924 pMemory := virtualAllocEx(hGTA, 6144, 0x1000 | 0x2000, 0x40)
5925 if(ErrorLevel) {
5926 pMemory := 0x0
5927 return false
5928 }
5929 pParam1 := pMemory
5930 pParam2 := pMemory + 1024
5931 pParam3 := pMemory + 2048
5932 pParam4 := pMemory + 3072
5933 pParam5 := pMemory + 4096
5934 pInjectFunc := pMemory + 5120
5935 }
5936 return true
5937}
5938
5939; internal stuff
5940getPID(szWindow) {
5941 local dwPID := 0
5942 WinGet, dwPID, PID, %szWindow%
5943 return dwPID
5944}
5945
5946; internal stuff
5947openProcess(dwPID, dwRights = 0x1F0FFF) {
5948 hProcess := DllCall("OpenProcess"
5949 , "UInt", dwRights
5950 , "int", 0
5951 , "UInt", dwPID
5952 , "Uint")
5953 if(hProcess == 0) {
5954 ErrorLevel := ERROR_OPEN_PROCESS
5955 return 0
5956 }
5957
5958 ErrorLevel := ERROR_OK
5959 return hProcess
5960}
5961
5962; internal stuff
5963closeProcess(hProcess) {
5964 if(hProcess == 0) {
5965 ErrorLevel := ERROR_INVALID_HANDLE
5966 return 0
5967 }
5968
5969 dwRet := DllCall( "CloseHandle"
5970 , "Uint", hProcess
5971 , "UInt")
5972 ErrorLevel := ERROR_OK
5973}
5974
5975; internal stuff
5976getModuleBaseAddress(sModule, hProcess) {
5977 if(!sModule) {
5978 ErrorLevel := ERROR_MODULE_NOT_FOUND
5979 return 0
5980 }
5981
5982 if(!hProcess) {
5983 ErrorLevel := ERROR_INVALID_HANDLE
5984 return 0
5985 }
5986
5987 dwSize = 1024*4 ; 1024 * sizeof(HMODULE = 4)
5988 VarSetCapacity(hMods, dwSize)
5989 VarSetCapacity(cbNeeded, 4) ; DWORD = 4
5990 dwRet := DllCall( "Psapi.dll\EnumProcessModules"
5991 , "UInt", hProcess
5992 , "UInt", &hMods
5993 , "UInt", dwSize
5994 , "UInt*", cbNeeded
5995 , "UInt")
5996 if(dwRet == 0) {
5997 ErrorLevel := ERROR_ENUM_PROCESS_MODULES
5998 return 0
5999 }
6000
6001 dwMods := cbNeeded / 4 ; cbNeeded / sizeof(HMDOULE = 4)
6002 i := 0
6003 VarSetCapacity(hModule, 4) ; HMODULE = 4
6004 VarSetCapacity(sCurModule, 260) ; MAX_PATH = 260
6005 while(i < dwMods) {
6006 hModule := NumGet(hMods, i*4)
6007 DllCall("Psapi.dll\GetModuleFileNameEx"
6008 , "UInt", hProcess
6009 , "UInt", hModule
6010 , "Str", sCurModule
6011 , "UInt", 260)
6012 SplitPath, sCurModule, sFilename
6013 if(sModule == sFilename) {
6014 ErrorLevel := ERROR_OK
6015 return hModule
6016 }
6017 i := i + 1
6018 }
6019
6020 ErrorLevel := ERROR_MODULE_NOT_FOUND
6021 return 0
6022}
6023
6024; internal stuff
6025readString(hProcess, dwAddress, dwLen) {
6026 if(!hProcess) {
6027 ErrorLevel := ERROR_INVALID_HANDLE
6028 return 0
6029 }
6030
6031 VarSetCapacity(sRead, dwLen)
6032 dwRet := DllCall( "ReadProcessMemory"
6033 , "UInt", hProcess
6034 , "UInt", dwAddress
6035 , "Str", sRead
6036 , "UInt", dwLen
6037 , "UInt*", 0
6038 , "UInt")
6039 if(dwRet == 0) {
6040 ErrorLevel := ERROR_READ_MEMORY
6041 return 0
6042 }
6043
6044 ErrorLevel := ERROR_OK
6045 if A_IsUnicode
6046 return __ansiToUnicode(sRead)
6047 return sRead
6048}
6049
6050; internal stuff
6051readFloat(hProcess, dwAddress) {
6052 if(!hProcess) {
6053 ErrorLevel := ERROR_INVALID_HANDLE
6054 return 0
6055 }
6056
6057 VarSetCapacity(dwRead, 4) ; float = 4
6058 dwRet := DllCall( "ReadProcessMemory"
6059 , "UInt", hProcess
6060 , "UInt", dwAddress
6061 , "Str", dwRead
6062 , "UInt", 4
6063 , "UInt*", 0
6064 , "UInt")
6065 if(dwRet == 0) {
6066 ErrorLevel := ERROR_READ_MEMORY
6067 return 0
6068 }
6069
6070 ErrorLevel := ERROR_OK
6071 return NumGet(dwRead, 0, "Float")
6072}
6073
6074; internal stuff
6075readDWORD(hProcess, dwAddress) {
6076 if(!hProcess) {
6077 ErrorLevel := ERROR_INVALID_HANDLE
6078 return 0
6079 }
6080
6081 VarSetCapacity(dwRead, 4) ; DWORD = 4
6082 dwRet := DllCall( "ReadProcessMemory"
6083 , "UInt", hProcess
6084 , "UInt", dwAddress
6085 , "Str", dwRead
6086 , "UInt", 4
6087 , "UInt*", 0)
6088 if(dwRet == 0) {
6089 ErrorLevel := ERROR_READ_MEMORY
6090 return 0
6091 }
6092
6093 ErrorLevel := ERROR_OK
6094 return NumGet(dwRead, 0, "UInt")
6095}
6096
6097; internal stuff
6098readMem(hProcess, dwAddress, dwLen=4, type="UInt") {
6099 if(!hProcess) {
6100 ErrorLevel := ERROR_INVALID_HANDLE
6101 return 0
6102 }
6103
6104 VarSetCapacity(dwRead, dwLen)
6105 dwRet := DllCall( "ReadProcessMemory"
6106 , "UInt", hProcess
6107 , "UInt", dwAddress
6108 , "Str", dwRead
6109 , "UInt", dwLen
6110 , "UInt*", 0)
6111 if(dwRet == 0) {
6112 ErrorLevel := ERROR_READ_MEMORY
6113 return 0
6114 }
6115
6116 ErrorLevel := ERROR_OK
6117 return NumGet(dwRead, 0, type)
6118}
6119
6120; internal stuff
6121writeString(hProcess, dwAddress, wString) {
6122 if(!hProcess) {
6123 ErrorLevel := ERROR_INVALID_HANDLE
6124 return false
6125 }
6126
6127 sString := wString
6128 if A_IsUnicode
6129 sString := __unicodeToAnsi(wString)
6130
6131 dwRet := DllCall( "WriteProcessMemory"
6132 , "UInt", hProcess
6133 , "UInt", dwAddress
6134 , "Str", sString
6135 , "UInt", StrLen(wString) + 1
6136 , "UInt", 0
6137 , "UInt")
6138 if(dwRet == 0) {
6139 ErrorLEvel := ERROR_WRITE_MEMORY
6140 return false
6141 }
6142
6143 ErrorLevel := ERROR_OK
6144 return true
6145}
6146
6147; internal stuff
6148writeRaw(hProcess, dwAddress, pBuffer, dwLen) {
6149 if(!hProcess) {
6150 ErrorLevel := ERROR_INVALID_HANDLE
6151 return false
6152 }
6153
6154 dwRet := DllCall( "WriteProcessMemory"
6155 , "UInt", hProcess
6156 , "UInt", dwAddress
6157 , "UInt", pBuffer
6158 , "UInt", dwLen
6159 , "UInt", 0
6160 , "UInt")
6161 if(dwRet == 0) {
6162 ErrorLEvel := ERROR_WRITE_MEMORY
6163 return false
6164 }
6165
6166 ErrorLevel := ERROR_OK
6167 return true
6168}
6169
6170; internal stuff
6171Memory_ReadByte(process_handle, address) {
6172 VarSetCapacity(value, 1, 0)
6173 DllCall("ReadProcessMemory", "UInt", process_handle, "UInt", address, "Str", value, "UInt", 1, "UInt *", 0)
6174 return, NumGet(value, 0, "Byte")
6175}
6176
6177; internal stuff
6178callWithParams(hProcess, dwFunc, aParams, bCleanupStack = true) {
6179 if(!hProcess) {
6180 ErrorLevel := ERROR_INVALID_HANDLE
6181 return false
6182 }
6183 validParams := 0
6184
6185 i := aParams.MaxIndex()
6186
6187 ; i * PUSH + CALL + RETN
6188 dwLen := i * 5 + 5 + 1
6189 if(bCleanupStack)
6190 dwLen += 3
6191 VarSetCapacity(injectData, i * 5 + 5 + 3 + 1, 0)
6192
6193 i_ := 1
6194 while(i > 0) {
6195 if(aParams[i][1] != "") {
6196 dwMemAddress := 0x0
6197 if(aParams[i][1] == "p") {
6198 dwMemAddress := aParams[i][2]
6199 } else if(aParams[i][1] == "s") {
6200 if(i_>3)
6201 return false
6202 dwMemAddress := pParam%i_%
6203 writeString(hProcess, dwMemAddress, aParams[i][2])
6204 if(ErrorLevel)
6205 return false
6206 i_ += 1
6207 } else if(aParams[i][1] == "i") {
6208 dwMemAddress := aParams[i][2]
6209 } else {
6210 return false
6211 }
6212 NumPut(0x68, injectData, validParams * 5, "UChar")
6213 NumPut(dwMemAddress, injectData, validParams * 5 + 1, "UInt")
6214 validParams += 1
6215 }
6216 i -= 1
6217 }
6218
6219 offset := dwFunc - ( pInjectFunc + validParams * 5 + 5 )
6220 NumPut(0xE8, injectData, validParams * 5, "UChar")
6221 NumPut(offset, injectData, validParams * 5 + 1, "Int")
6222
6223 if(bCleanupStack) {
6224 NumPut(0xC483, injectData, validParams * 5 + 5, "UShort")
6225 NumPut(validParams*4, injectData, validParams * 5 + 7, "UChar")
6226
6227 NumPut(0xC3, injectData, validParams * 5 + 8, "UChar")
6228 } else {
6229 NumPut(0xC3, injectData, validParams * 5 + 5, "UChar")
6230 }
6231
6232 writeRaw(hGTA, pInjectFunc, &injectData, dwLen)
6233 if(ErrorLevel)
6234 return false
6235
6236 hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
6237 if(ErrorLevel)
6238 return false
6239
6240 waitForSingleObject(hThread, 0xFFFFFFFF)
6241
6242 closeProcess(hThread)
6243
6244 return true
6245}
6246
6247; internal stuff
6248virtualAllocEx(hProcess, dwSize, flAllocationType, flProtect) {
6249 if(!hProcess) {
6250 ErrorLevel := ERROR_INVALID_HANDLE
6251 return 0
6252 }
6253
6254 dwRet := DllCall( "VirtualAllocEx"
6255 , "UInt", hProcess
6256 , "UInt", 0
6257 , "UInt", dwSize
6258 , "UInt", flAllocationType
6259 , "UInt", flProtect
6260 , "UInt")
6261 if(dwRet == 0) {
6262 ErrorLEvel := ERROR_ALLOC_MEMORY
6263 return 0
6264 }
6265
6266 ErrorLevel := ERROR_OK
6267 return dwRet
6268}
6269
6270; internal stuff
6271virtualFreeEx(hProcess, lpAddress, dwSize, dwFreeType) {
6272 if(!hProcess) {
6273 ErrorLevel := ERROR_INVALID_HANDLE
6274 return 0
6275 }
6276
6277 dwRet := DllCall( "VirtualFreeEx"
6278 , "UInt", hProcess
6279 , "UInt", lpAddress
6280 , "UInt", dwSize
6281 , "UInt", dwFreeType
6282 , "UInt")
6283 if(dwRet == 0) {
6284 ErrorLEvel := ERROR_FREE_MEMORY
6285 return 0
6286 }
6287
6288 ErrorLevel := ERROR_OK
6289 return dwRet
6290}
6291
6292; internal stuff
6293createRemoteThread(hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId) {
6294 if(!hProcess) {
6295 ErrorLevel := ERROR_INVALID_HANDLE
6296 return 0
6297 }
6298
6299 dwRet := DllCall( "CreateRemoteThread"
6300 , "UInt", hProcess
6301 , "UInt", lpThreadAttributes
6302 , "UInt", dwStackSize
6303 , "UInt", lpStartAddress
6304 , "UInt", lpParameter
6305 , "UInt", dwCreationFlags
6306 , "UInt", lpThreadId
6307 , "UInt")
6308 if(dwRet == 0) {
6309 ErrorLEvel := ERROR_ALLOC_MEMORY
6310 return 0
6311 }
6312
6313 ErrorLevel := ERROR_OK
6314 return dwRet
6315}
6316
6317; internal stuff
6318waitForSingleObject(hThread, dwMilliseconds) {
6319 if(!hThread) {
6320 ErrorLevel := ERROR_INVALID_HANDLE
6321 return 0
6322 }
6323
6324 dwRet := DllCall( "WaitForSingleObject"
6325 , "UInt", hThread
6326 , "UInt", dwMilliseconds
6327 , "UInt")
6328 if(dwRet == 0xFFFFFFFF) {
6329 ErrorLEvel := ERROR_WAIT_FOR_OBJECT
6330 return 0
6331 }
6332
6333 ErrorLevel := ERROR_OK
6334 return dwRet
6335}
6336
6337; internal stuff
6338__ansiToUnicode(sString, nLen = 0) {
6339 If !nLen
6340 {
6341 nLen := DllCall("MultiByteToWideChar"
6342 , "Uint", 0
6343 , "Uint", 0
6344 , "Uint", &sString
6345 , "int", -1
6346 , "Uint", 0
6347 , "int", 0)
6348 }
6349
6350 VarSetCapacity(wString, nLen * 2)
6351
6352 DllCall("MultiByteToWideChar"
6353 , "Uint", 0
6354 , "Uint", 0
6355 , "Uint", &sString
6356 , "int", -1
6357 , "Uint", &wString
6358 , "int", nLen)
6359
6360 return wString
6361}
6362
6363; internal stuff
6364__unicodeToAnsi(wString, nLen = 0) {
6365 pString := wString + 1 > 65536 ? wString : &wString
6366
6367 If !nLen
6368 {
6369 nLen := DllCall("WideCharToMultiByte"
6370 , "Uint", 0
6371 , "Uint", 0
6372 , "Uint", pString
6373 , "int", -1
6374 , "Uint", 0
6375 , "int", 0
6376 , "Uint", 0
6377 , "Uint", 0)
6378 }
6379
6380 VarSetCapacity(sString, nLen)
6381
6382 DllCall("WideCharToMultiByte"
6383 , "Uint", 0
6384 , "Uint", 0
6385 , "Uint", pString
6386 , "int", -1
6387 , "str", sString
6388 , "int", nLen
6389 , "Uint", 0
6390 , "Uint", 0)
6391 return sString
6392}
6393Utf8ToAnsi(ByRef Utf8String, CodePage = 1251)
6394{
6395 If (NumGet(Utf8String) & 0xFFFFFF) = 0xBFBBEF
6396 BOM = 3
6397 Else
6398 BOM = 0
6399 UniSize := DllCall("MultiByteToWideChar", "UInt", 65001, "UInt", 0
6400 , "UInt", &Utf8String + BOM, "Int", -1
6401 , "Int", 0, "Int", 0)
6402 VarSetCapacity(UniBuf, UniSize * 2)
6403 DllCall("MultiByteToWideChar", "UInt", 65001, "UInt", 0
6404 , "UInt", &Utf8String + BOM, "Int", -1
6405 , "UInt", &UniBuf, "Int", UniSize)
6406 AnsiSize := DllCall("WideCharToMultiByte", "UInt", CodePage, "UInt", 0
6407 , "UInt", &UniBuf, "Int", -1
6408 , "Int", 0, "Int", 0
6409 , "Int", 0, "Int", 0)
6410 VarSetCapacity(AnsiString, AnsiSize)
6411 DllCall("WideCharToMultiByte", "UInt", CodePage, "UInt", 0
6412 , "UInt", &UniBuf, "Int", -1
6413 , "Str", AnsiString, "Int", AnsiSize
6414 , "Int", 0, "Int", 0)
6415 Return AnsiString
6416}
6417
6418Name := Array("Ronald", "Mikhail", "Gabriel", "Addison", "Julian", "Mateo", "Ellie", "Stella", "Natalie", "Leah", "Ryan", "Bella", "Brooklyn", "Theodore", "Caleb", "Savannah", "Audrey", "Asher", "Lincoln", "Hazel", "Shon", "Andrew" "Jack", "Harry", "Oliver", "Charlie", "Thomas", "William", "Ethan", "Harry", "Cooper", "Eliana", "Roman", "Quinn", "Ezekiel", "Xavier ", "Jace", "Alexa", "Parker", "Emery", "Everett", "Kayden", "Madeline", "Sophie", "Sawyer", "Jack", "James", "Daniel", "Harry", "Charlie", "Ethan", "Matthew", "Ryen", "Riley", "Macho", "Roberto", "Misha", "Richard", "Nathaniel", "Pasha", "Devin", "Kevin", "Lance", "Jackson", "Diego", "Caleb", "Alex", "Aaron", "Luke", "Nathan")
6419SurName := Array("Helper", "hbRAHMHELP", "veeTAHleeyHELP", "VLAHHELP", "vlahDEEmeeHELP", "vlahdeeSLAHVHELP", "vyachyesLAHHELP", "yevGYEneeyHELP", "eeOseefHELP", "yekSAHNDRHELP", "ahlyekSYEYHELP", "ahlBYERTHELP", "ahnTOleeyHELP", "anDRYEYHELP", "ahrKAHdeeyHELP", "ahrSneeyHELP", "ahfahNAHsyHELP", "vahlyenTEENHELP", "vahSEEleHELP", "VEKtorHELP", "Pomoshnik", "WhiteHelper", "Helperall", "help_you", "your_help", "GoodHelp", "beautifull_help", "beautifull_help", "besthelp", "best_help")
6420
6421
6422
6423
6424FileCreateDir, %A_MyDocuments%\GTA San Andreas User Files\SAMP\AutoReg
6425FileAppend, [autoreg]`npass=`npo4ta=`npolblyat=`nautoreg=`nvozrast=`npromokod=`nsvetkoji=`nnation=,options.ini
6426FileMove, options.ini, %A_MyDocuments%\GTA San Andreas User Files\SAMP\AutoReg\
6427FileDelete, options.ini
6428SetWorkingDir, %A_MyDocuments%\GTA San Andreas User Files\SAMP\AutoReg\
6429Fileinstall, C:\Users\Александр\Documents\GTA San Andreas User Files\SAMP\AutoReg\autoreg.png,%A_WorkingDir%\autoreg.png, 1
6430IniRead, pass, options.ini, autoreg, pass
6431IniRead, po4ta, options.ini, autoreg, po4ta
6432IniRead, pol, options.ini, autoreg, pol
6433IniRead, autoreg, options.ini, autoreg, autoreg
6434IniRead, vozrast, options.ini, autoreg, vozrast
6435IniRead, promokod, options.ini, autoreg, promokod
6436IniRead, polblyat, options.ini, autoreg, polblyat
6437IniRead, svetkoji, options.ini, autoreg, svetkoji
6438IniRead, nation, options.ini, autoreg, nation
6439global pass := pass
6440global po4ta := po4ta
6441global pol := pol
6442global autoreg := autoreg
6443global vozrast := vozrast
6444global promokod := promokod
6445global polblyat := polblyat
6446global svetkoji := svetkoji
6447global nation := nation
6448Gui, Color, FFFFFF
6449Gui, Add, Picture, x2 y-1 w470 h150 , %A_WorkingDir%\autoreg.png
6450Gui, Add, Text, x182 y139 w170 h20 , Клавиша авто регистрации:
6451Gui, Add, Hotkey, x182 y159 w150 h20 veautoreg, %autoreg%
6452Gui, Add, Text, x22 y169 w50 h20 , Пароль:
6453Gui, Add, Edit, x22 y191 w140 h20 vepass, %pass%
6454Gui, Add, Text, x22 y219 w50 h20 , Почта:
6455Gui, Add, Edit, x22 y239 w140 h20 vepo4ta, %po4ta%
6456Gui, Add, Text, x22 y264 w50 h20 , Возраст:
6457Gui, Add, Button, x342 y509 w110 h30 gsaveconfig, Сохранить
6458Gui, Add, Edit, x22 y283 w140 h20 vevozrast, %vozrast%
6459Gui, Add, Text, x22 y309 w60 h20 , Промокод:
6460Gui, Add, Edit, x22 y329 w140 h20 vepromokod, %promokod%
6461Gui, Add, Text, x22 y353 w40 h20 , Пол:
6462if ( polblyat == "Мужской" )
6463sex := "1"
6464else
6465sex := "2"
6466Gui, Add, DropDownList, x22 y372 w140 h80 vepolblyat Choose%sex%, Мужской|Женский
6467Gui, Add, Text, x22 y399 w80 h20 , Цвет кожи:
6468if ( svetkoji == "Черный" )
6469koja := "1"
6470else
6471koja := "2"
6472Gui, Add, DropDownList, x22 y419 w140 h90 vesvetkoji Choose%koja%, Черный|Светлый
6473Gui, Add, Text, x22 y449 w120 h20 , Национальность:
6474Gui, Add, DropDownList, x22 y469 w140 h200 venation, Американец|Японец|Итальянец|Мексиканец|Латиноамериканец|Испанец|Русский|Португалец|Француз
6475Gui, Show, w463 h550, Paradise Studio
6476Hotkey, %autoreg%, Off, UseErrorLevel
6477Hotkey, %autoreg%, autoregistration, On, UseErrorLevel
6478return
6479GuiClose:
6480ExitApp
6481return
6482saveconfig:
6483GuiControlGet, epass
6484GuiControlGet, epo4ta
6485GuiControlGet, eautoreg
6486GuiControlGet, evozrast
6487GuiControlGet, epromokod
6488GuiControlGet, epolblyat
6489GuiControlget, esvetkoji
6490GuiControlGet, enation
6491goto submitter
6492return
6493submitter:
6494IniWrite, %epass%, options.ini, autoreg, pass
6495IniWrite, %epo4ta%, options.ini, autoreg, po4ta
6496IniWrite, %eautoreg%, options.ini, autoreg, autoreg
6497IniWrite, %evozrast%, options.ini, autoreg, vozrast
6498IniWrite, %epromokod%, options.ini, autoreg, promokod
6499Iniwrite, %epolblyat%, options.ini, autoreg, polblyat
6500Iniwrite, %esvetkoji%, options.ini, autoreg, svetkoji
6501Iniwrite, %enation%, options.ini, autoreg, nation
6502reload
6503return
6504autoregistration:
6505SendMessage, 0x50,, 0x4190419,, A
6506Send, {enter}
6507Sleep 210
6508Send, %pass%{enter}
6509Sleep 210
6510Send, %pass%{enter}
6511Sleep 210
6512Send, %po4ta%{enter}
6513Sleep 210
6514if ( polblyat == "Мужской" )
6515{
6516Send, {enter}
6517}
6518else
6519{
6520Send, {left 1} {enter}
6521}
6522sleep 100
6523if ( svetkoji == "Черный" )
6524{
6525 sleep 100
6526Send, {enter}
6527}
6528else
6529{
6530 sleep 300
6531Send, {left 1} {enter}
6532}
6533Sleep 250
6534if ( nation == "Американец" )
6535Send, {down 1} {enter}
6536else if ( nation == "Японец" )
6537send, {down 2} {enter}
6538else if ( nation == "Итальянец" )
6539send, {down 3} {enter}
6540else if ( nation == "Мексиканец" )
6541send, {down 4} {enter}
6542else if ( nation == "Латиноамериканец" )
6543send, {down 5} {enter}
6544else if ( nation == "Испанец" )
6545send, {down 6} {enter}
6546else if ( nation == "Русский" )
6547send, {down 7} {enter}
6548else if ( nation == "Португалец" )
6549send, {down 8} {enter}
6550else if ( nation == "Француз" )
6551send, {down 9} {enter}
6552Sleep 210
6553Send, %vozrast%{enter}
6554Sleep 210
6555Send, %promokod% {enter}
6556sleep 1000
6557clipboard := "/rvset time=100 speed=100,50,0 spread=100,25"
6558Send, {F6}^v {enter}
6559sleep 500
6560clipboard := "/fbypass"
6561Send, {F6}^v {enter}
6562sleep 100
6563MouseClick, left, 932, 992
6564return
6565
6566!1::
6567Random, randomName, 1, 81
6568Random, randomSurName, 1, 30
6569clipboard := % Name[randomName] . "_" . SurName[randomSurName]
6570return