View difference between Paste ID: 4C6R0ZJS and Fd4w6FUh
SHOW: | | - or go back to the newest paste.
1
/*
2
	THIS FILE IS A PART OF GTA V SCRIPT HOOK SDK
3
				http://dev-c.com			
4
			(C) Alexander Blade 2015
5
*/
6
7
/*
8
	F4					activate
9
	NUM2/8/4/6			navigate thru the menus and lists (numlock must be on)
10
	NUM5 				select
11
	NUM0/BACKSPACE/F4 	back
12
	NUM9/3 				use vehicle boost when active
13
	NUM+ 				use vehicle rockets when active
14
*/
15
16
#include "script.h"
17
#include "keyboard.h"
18
19
#include <string>
20
#include <ctime>
21
22
#pragma warning(disable : 4244 4305) // double <-> float conversions
23
24
void draw_rect(float A_0, float A_1, float A_2, float A_3, int A_4, int A_5, int A_6, int A_7)
25
{
26
	GRAPHICS::DRAW_RECT((A_0 + (A_2 * 0.5f)), (A_1 + (A_3 * 0.5f)), A_2, A_3, A_4, A_5, A_6, A_7);
27
}
28
29
void draw_menu_line(std::string caption, float lineWidth, float lineHeight, float lineTop, float lineLeft, float textLeft, bool active, bool title, bool rescaleText = true)
30
{
31
	//If you use this design in a public menu, please credit me, The Crusader, for the design :)
32
33
	// default values
34
	int text_col[4] = { 255, 255, 255, 250.0f }, 
35
		rect_col[4] = { 0, 0, 0, 239.f };
36
	float text_scale = 0.35;
37
	int font = 0; 
38
	bool outline = false;   //your choice
39
	bool dropShadow = false; //your choice
40
41
	// correcting values for active line
42
	if (active)
43
	{
44
		text_col[0] = 0;
45
		text_col[1] = 0;
46
		text_col[2] = 0;
47
		text_col[3] = 240.f;
48
49
		rect_col[0] = 200;
50
		rect_col[1] = 9;
51
		rect_col[2] = 5;
52
		rect_col[3] = 220;
53
54
						 
55
56
		if (rescaleText) text_scale = 0.39; //37
57
58
	}
59
	else if (title)
60
	{
61
		text_col[0] = 255;
62
		text_col[1] = 255;
63
		text_col[2] = 255;
64
65
		rect_col[0] = 200;
66
		rect_col[1] = 9;
67
		rect_col[2] = 5;
68
		rect_col[3] = 220;
69
70
		if (rescaleText) text_scale = 0.75; 
71
		outline = true;
72
73
		font = 7; 
74
	}
75
	else
76
	{
77
		outline = true;
78
	}
79
80
81
	int screen_w, screen_h;
82
	GRAPHICS::GET_SCREEN_RESOLUTION(&screen_w, &screen_h);
83
84
	textLeft += lineLeft;
85
86
	float lineWidthScaled = lineWidth / (float)screen_w; // line width
87
	float lineTopScaled = lineTop / (float)screen_h; // line top offset
88
	float textLeftScaled = textLeft / (float)screen_w; // text left offset
89
	float lineHeightScaled = lineHeight / (float)screen_h; // line height
90
91
	float lineLeftScaled = lineLeft / (float)screen_w;
92
93
	// this is how it's done in original scripts
94
95
	// text upper part
96
	UI::SET_TEXT_FONT(font);
97
	UI::SET_TEXT_SCALE(0.0, text_scale);
98
	UI::SET_TEXT_COLOUR(text_col[0], text_col[1], text_col[2], text_col[3]);
99
	UI::SET_TEXT_CENTRE(0);
100
	UI::SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0);
101
	UI::SET_TEXT_EDGE(0, 0, 0, 0, 0);
102
	UI::_SET_TEXT_ENTRY("STRING");
103
	UI::_ADD_TEXT_COMPONENT_STRING((LPSTR)caption.c_str());
104
	UI::_DRAW_TEXT(textLeftScaled, (((lineTopScaled + 0.00278f) + lineHeightScaled) - 0.005f));
105
106
	// text lower part
107
	UI::SET_TEXT_FONT(font);
108
	UI::SET_TEXT_SCALE(0.0, text_scale);
109
	UI::SET_TEXT_COLOUR(text_col[0], text_col[1], text_col[2], text_col[3]);
110
	UI::SET_TEXT_CENTRE(0);
111
	UI::SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0);
112
	UI::SET_TEXT_EDGE(0, 0, 0, 0, 0);
113
	UI::_SET_TEXT_GXT_ENTRY("STRING");
114
	UI::_ADD_TEXT_COMPONENT_STRING((LPSTR)caption.c_str());
115
	int num25 = UI::_0x9040DFB09BE75706(textLeftScaled, (((lineTopScaled + 0.00278f) + lineHeightScaled) - 0.005f));
116
117
	// rect
118
	draw_rect(lineLeftScaled, lineTopScaled + (0.00278f),
119
		lineWidthScaled, ((((float)(num25)* UI::_0xDB88A37483346780(text_scale, 0)) + (lineHeightScaled * 1.5f)) + 0.006f),
120
		rect_col[0], rect_col[1], rect_col[2], rect_col[3]);
121
}
122
123
124
bool trainer_switch_pressed()
125
{
126
	return IsKeyJustUp(VK_F8);
127
}
128
129
void get_button_state(bool *a, bool *b, bool *up, bool *down, bool *l, bool *r)
130
{
131
	if (a) *a = IsKeyDown(VK_NUMPAD5);
132
	if (b) *b = IsKeyDown(VK_NUMPAD0) || trainer_switch_pressed() || IsKeyDown(VK_BACK);
133
	if (up) *up = IsKeyDown(VK_NUMPAD8);
134
	if (down) *down = IsKeyDown(VK_NUMPAD2);
135
	if (r) *r = IsKeyDown(VK_NUMPAD6);
136
	if (l) *l = IsKeyDown(VK_NUMPAD4);
137
}
138
139
void menu_beep()
140
{
141
	AUDIO::PLAY_SOUND_FRONTEND(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", 0);
142
}
143
144
std::string statusText;
145
DWORD statusTextDrawTicksMax;
146
bool statusTextGxtEntry;
147
148
void update_status_text()
149
{
150
	if (GetTickCount() < statusTextDrawTicksMax)
151
	{
152
		UI::SET_TEXT_FONT(0);
153
		UI::SET_TEXT_SCALE(0.55, 0.55);
154
		UI::SET_TEXT_COLOUR(255, 255, 255, 255);
155
		UI::SET_TEXT_WRAP(0.0, 1.0);
156
		UI::SET_TEXT_CENTRE(1);
157
		UI::SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0);
158
		UI::SET_TEXT_EDGE(1, 0, 0, 0, 205);
159
		if (statusTextGxtEntry)
160
		{
161
			UI::_SET_TEXT_ENTRY((char *)statusText.c_str());
162
		} else
163
		{
164
			UI::_SET_TEXT_ENTRY("STRING");
165
			UI::_ADD_TEXT_COMPONENT_STRING((char *)statusText.c_str());
166
		}
167
		UI::_DRAW_TEXT(0.5, 0.5);
168
	}
169
}
170
171
void set_status_text(std::string str, DWORD time = 2500, bool isGxtEntry = false)
172
{
173
	statusText = str;
174
	statusTextDrawTicksMax = GetTickCount() + time;
175
	statusTextGxtEntry = isGxtEntry;
176
}
177
178
// features
179
bool featurePlayerInvincible			=	false;
180
bool featurePlayerInvincibleUpdated		=	false;
181
bool featurePlayerNeverWanted			=	false;
182
bool featurePlayerIgnored				=	false;
183
bool featurePlayerIgnoredUpdated		=	false;
184
bool featurePlayerUnlimitedAbility		=	false;
185
bool featurePlayerNoNoise				=	false;
186
bool featurePlayerNoNoiseUpdated		=	false;
187
bool featurePlayerFastSwim				=	false;
188
bool featurePlayerFastSwimUpdated		=	false;
189
bool featurePlayerFastRun				=	false;
190
bool featurePlayerFastRunUpdated		=	false;
191
bool featurePlayerSuperJump				=	false;
192
bool featurePlayerUltraJump             =   false;
193
194
bool featureWeaponNoReload				=	false;
195
bool featureWeaponFireAmmo				=	false;
196
bool featureWeaponExplosiveAmmo			=	false;
197
bool featureWeaponExplosiveMelee		=	false;
198
bool featureWeaponVehRockets			=	false;
199
200
DWORD featureWeaponVehShootLastTime		=	0;
201
202
bool featureVehInvincible				=	false;
203
bool featureVehInvincibleUpdated		=	false;
204
bool featureVehInvincibleWheels			=	false;
205
bool featureVehInvincibleWheelsUpdated	=	false;
206
bool featureVehSeatbelt					=	false;
207
bool featureVehSeatbeltUpdated			=	false;
208
bool featureVehSpeedBoost				=	false;
209
bool featureVehWrapInSpawned			=	false;
210
211
bool featureWorldMoonGravity			=	false;
212
bool featureWorldRandomCops				=	true;
213
bool featureWorldRandomTrains			=	true;
214
bool featureWorldRandomBoats			=	true;
215
bool featureWorldGarbageTrucks			=	true;
216
217
bool featureTimePaused					=	false;
218
bool featureTimePausedUpdated			=	false;
219
bool featureTimeSynced					=	false;
220
221
bool featureWeatherWind					=	false;
222
bool featureWeatherPers					=	false;
223
224
bool featureMiscLockRadio				=	false;
225
bool featureMiscHideHud					=	false;
226
227
228
// player model control, switching on normal ped model when needed	
229
void check_player_model() 
230
{
231
	// common variables
232
	Player player = PLAYER::PLAYER_ID();
233
	Ped playerPed = PLAYER::PLAYER_PED_ID();	
234
235
	if (!ENTITY::DOES_ENTITY_EXIST(playerPed)) return;
236
237
	Hash model = ENTITY::GET_ENTITY_MODEL(playerPed);
238
	if (ENTITY::IS_ENTITY_DEAD(playerPed) || PLAYER::IS_PLAYER_BEING_ARRESTED(player, TRUE))
239
		if (model != GAMEPLAY::GET_HASH_KEY("player_zero") && 
240
			model != GAMEPLAY::GET_HASH_KEY("player_one") &&
241
			model != GAMEPLAY::GET_HASH_KEY("player_two"))
242
		{
243
			set_status_text("turning to normal");
244
			WAIT(1000);
245
246
			model = GAMEPLAY::GET_HASH_KEY("player_zero");
247
			STREAMING::REQUEST_MODEL(model);
248
			while (!STREAMING::HAS_MODEL_LOADED(model))
249
				WAIT(0);
250
			PLAYER::SET_PLAYER_MODEL(PLAYER::PLAYER_ID(), model);
251
			PED::SET_PED_DEFAULT_COMPONENT_VARIATION(PLAYER::PLAYER_PED_ID());
252
			STREAMING::SET_MODEL_AS_NO_LONGER_NEEDED(model);
253
254
			// wait until player is ressurected
255
			while (ENTITY::IS_ENTITY_DEAD(PLAYER::PLAYER_PED_ID()) || PLAYER::IS_PLAYER_BEING_ARRESTED(player, TRUE))
256
				WAIT(0);
257
258
		}
259
}
260
261
void update_vehicle_guns()
262
{
263
	Player player = PLAYER::PLAYER_ID();
264
	Ped playerPed = PLAYER::PLAYER_PED_ID();	
265
266
	if (!ENTITY::DOES_ENTITY_EXIST(playerPed) || !featureWeaponVehRockets) return;
267
268
	bool bSelect = IsKeyDown(0x6B); // num plus
269
	if (bSelect && featureWeaponVehShootLastTime + 150 < GetTickCount() &&
270
		PLAYER::IS_PLAYER_CONTROL_ON(player) &&	PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
271
	{
272
		Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
273
274
		Vector3 v0, v1;
275
		GAMEPLAY::GET_MODEL_DIMENSIONS(ENTITY::GET_ENTITY_MODEL(veh), &v0, &v1);
276
277
		Hash weaponAssetRocket = GAMEPLAY::GET_HASH_KEY("WEAPON_VEHICLE_ROCKET");
278
		if (!WEAPON::HAS_WEAPON_ASSET_LOADED(weaponAssetRocket))
279
		{
280
			WEAPON::REQUEST_WEAPON_ASSET(weaponAssetRocket, 31, 0);
281
			while (!WEAPON::HAS_WEAPON_ASSET_LOADED(weaponAssetRocket))
282
				WAIT(0);
283
		}
284
285
		Vector3 coords0from = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, -(v1.x + 0.25f), v1.y + 1.25f, 0.1);
286
		Vector3 coords1from = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh,  (v1.x + 0.25f), v1.y + 1.25f, 0.1);
287
		Vector3 coords0to = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, -v1.x, v1.y + 100.0f, 0.1f);
288
		Vector3 coords1to = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh,  v1.x, v1.y + 100.0f, 0.1f);
289
290
		GAMEPLAY::SHOOT_SINGLE_BULLET_BETWEEN_COORDS(coords0from.x, coords0from.y, coords0from.z, 
291
													 coords0to.x, coords0to.y, coords0to.z, 
292
													 250, 1, weaponAssetRocket, playerPed, 1, 0, -1.0);
293
		GAMEPLAY::SHOOT_SINGLE_BULLET_BETWEEN_COORDS(coords1from.x, coords1from.y, coords1from.z, 
294
													 coords1to.x, coords1to.y, coords1to.z, 
295
													 250, 1, weaponAssetRocket, playerPed, 1, 0, -1.0);
296
297
		featureWeaponVehShootLastTime = GetTickCount();
298
	}
299
}
300
301
bool skinchanger_used = false;
302
303
// Updates all features that can be turned off by the game, being called each game frame
304
void update_features() 
305
{
306
	update_status_text();
307
308
	update_vehicle_guns();
309
310
	// changing player model if died/arrested while being in another skin, since it can cause inf loading loop
311
	if (skinchanger_used)
312
		check_player_model();
313
314
	// wait until player is ready, basicly to prevent using the trainer while player is dead or arrested
315
	while (ENTITY::IS_ENTITY_DEAD(PLAYER::PLAYER_PED_ID()) || PLAYER::IS_PLAYER_BEING_ARRESTED(PLAYER::PLAYER_ID(), TRUE))
316
		WAIT(0);
317
318
	// read default feature values from the game
319
	featureWorldRandomCops = PED::CAN_CREATE_RANDOM_COPS() == TRUE;
320
321
	// common variables
322
	Player player = PLAYER::PLAYER_ID();
323
	Ped playerPed = PLAYER::PLAYER_PED_ID();	
324
	BOOL bPlayerExists = ENTITY::DOES_ENTITY_EXIST(playerPed);
325
326
	// player invincible
327
	if (featurePlayerInvincibleUpdated)
328
	{
329
		if (bPlayerExists && !featurePlayerInvincible)
330
			PLAYER::SET_PLAYER_INVINCIBLE(player, FALSE);
331
		featurePlayerInvincibleUpdated = false;
332
	}
333
	if (featurePlayerInvincible)
334
	{
335
		if (bPlayerExists)
336
			PLAYER::SET_PLAYER_INVINCIBLE(player, TRUE);
337
	}
338
339
	// player never wanted
340
	if (featurePlayerNeverWanted)
341
	{
342
		if (bPlayerExists)
343
			PLAYER::CLEAR_PLAYER_WANTED_LEVEL(player);
344
	}
345
346
	// police ignore player
347
	if (featurePlayerIgnoredUpdated)
348
	{
349
		if (bPlayerExists)
350
			PLAYER::SET_POLICE_IGNORE_PLAYER(player, featurePlayerIgnored);
351
		featurePlayerIgnoredUpdated = false;
352
	}
353
354
	// player special ability
355
	if (featurePlayerUnlimitedAbility)
356
	{
357
		if (bPlayerExists)
358
			PLAYER::SPECIAL_ABILITY_FILL_METER(player, 1);
359
	}
360
361
	// player no noise
362
	if (featurePlayerNoNoiseUpdated)
363
	{
364
		if (bPlayerExists && !featurePlayerNoNoise)
365
			PLAYER::SET_PLAYER_NOISE_MULTIPLIER(player, 1.0);
366
		featurePlayerNoNoiseUpdated = false;
367
	}
368
	if (featurePlayerNoNoise)
369
		PLAYER::SET_PLAYER_NOISE_MULTIPLIER(player, 0.0);
370
371
	// player fast swim
372
	if (featurePlayerFastSwimUpdated)
373
	{
374
		if (bPlayerExists && !featurePlayerFastSwim)
375
			PLAYER::SET_SWIM_MULTIPLIER_FOR_PLAYER(player, 1.0);
376
		featurePlayerFastSwimUpdated = false;
377
	}
378
	if (featurePlayerFastSwim)
379
		PLAYER::SET_SWIM_MULTIPLIER_FOR_PLAYER(player, 1.49);
380
381
	// player fast run
382
	if (featurePlayerFastRunUpdated)
383
	{
384
		if (bPlayerExists && !featurePlayerFastRun)
385
			PLAYER::SET_RUN_SPRINT_MULTIPLIER_FOR_PLAYER(player, 1.0);
386
		featurePlayerFastRunUpdated = false;
387
	}
388
	if (featurePlayerFastRun)
389
		PLAYER::SET_RUN_SPRINT_MULTIPLIER_FOR_PLAYER(player, 1.49);
390
391
	// player super jump
392
	if (featurePlayerSuperJump)
393
	{
394
		if (bPlayerExists)
395
			GAMEPLAY::SET_SUPER_JUMP_THIS_FRAME(player);
396
	}
397
398
	// weapon
399
	if (featureWeaponFireAmmo)
400
	{
401
		if (bPlayerExists)
402
			GAMEPLAY::SET_FIRE_AMMO_THIS_FRAME(player);
403
	}
404
	if (featureWeaponExplosiveAmmo)
405
	{
406
		if (bPlayerExists)
407
			GAMEPLAY::SET_EXPLOSIVE_AMMO_THIS_FRAME(player);
408
	}
409
	if (featureWeaponExplosiveMelee)
410
	{
411
		if (bPlayerExists)
412
			GAMEPLAY::SET_EXPLOSIVE_MELEE_THIS_FRAME(player);
413
	}
414
415
	// weapon no reload
416
	if (bPlayerExists && featureWeaponNoReload)
417
	{
418
		Hash cur;
419
		if (WEAPON::GET_CURRENT_PED_WEAPON(playerPed, &cur, 1))
420
		{
421
			if (WEAPON::IS_WEAPON_VALID(cur))
422
			{
423
				int maxAmmo;
424
				if (WEAPON::GET_MAX_AMMO(playerPed, cur, &maxAmmo))
425
				{
426
					WEAPON::SET_PED_AMMO(playerPed, cur, maxAmmo);
427
428
					maxAmmo = WEAPON::GET_MAX_AMMO_IN_CLIP(playerPed, cur, 1);
429
					if (maxAmmo > 0)
430
						WEAPON::SET_AMMO_IN_CLIP(playerPed, cur, maxAmmo);
431
				}
432
			}
433
		}
434
	}
435
436
	// player's vehicle invincible
437
	if (featureVehInvincibleUpdated)
438
	{
439
		if (bPlayerExists && !featureVehInvincible && PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
440
		{
441
			Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
442
			ENTITY::SET_ENTITY_INVINCIBLE(veh, FALSE);
443
			ENTITY::SET_ENTITY_PROOFS(veh, 0, 0, 0, 0, 0, 0, 0, 0);
444
			VEHICLE::SET_VEHICLE_TYRES_CAN_BURST(veh, 1);
445
			VEHICLE::SET_VEHICLE_WHEELS_CAN_BREAK(veh, 1);
446
			VEHICLE::SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(veh, 1);
447
		}
448
		featureVehInvincibleUpdated = false;
449
	}
450
	if (featureVehInvincible)
451
	{
452
		if (bPlayerExists && PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
453
		{
454
			Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
455
			ENTITY::SET_ENTITY_INVINCIBLE(veh, TRUE);
456
			ENTITY::SET_ENTITY_PROOFS(veh, 1, 1, 1, 1, 1, 1, 1, 1);	
457
			VEHICLE::SET_VEHICLE_TYRES_CAN_BURST(veh, 0);
458
			VEHICLE::SET_VEHICLE_WHEELS_CAN_BREAK(veh, 0);
459
			VEHICLE::SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(veh, 0);
460
		}
461
	}
462
463
	// player's vehicle invincible wheels, usefull with custom handling
464
	if (featureVehInvincibleWheelsUpdated)
465
	{
466
		if (bPlayerExists && !featureVehInvincibleWheels && PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
467
		{
468
			Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
469
			VEHICLE::SET_VEHICLE_TYRES_CAN_BURST(veh, TRUE);
470
			VEHICLE::SET_VEHICLE_WHEELS_CAN_BREAK(veh, TRUE);
471
			VEHICLE::SET_VEHICLE_HAS_STRONG_AXLES(veh, FALSE);
472
		}
473
		featureVehInvincibleWheelsUpdated = false;
474
	}
475
	if (featureVehInvincibleWheels)
476
	{
477
		if (bPlayerExists && PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
478
		{
479
			Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
480
			VEHICLE::SET_VEHICLE_TYRES_CAN_BURST(veh, FALSE);
481
			VEHICLE::SET_VEHICLE_WHEELS_CAN_BREAK(veh, FALSE);
482
			VEHICLE::SET_VEHICLE_HAS_STRONG_AXLES(veh, TRUE);
483
		}
484
	}
485
486
	if (featurePlayerUltraJump)
487
	{
488
		GAMEPLAY::SET_SUPER_JUMP_THIS_FRAME(player);
489
		WEAPON::REMOVE_WEAPON_FROM_PED(playerPed, GAMEPLAY::GET_HASH_KEY("GADGET_PARACHUTE"));
490
		if (PED::IS_PED_JUMPING(playerPed))
491
		{
492
			ENTITY::APPLY_FORCE_TO_ENTITY(playerPed, true, 0, 0, 5, 0, 0, 0, true, true, true, true, false, true);
493
		}
494
	}
495
496
	// seat belt
497
	const int PED_FLAG_CAN_FLY_THRU_WINDSCREEN = 32;
498
	if (featureVehSeatbeltUpdated)
499
	{
500
		if (bPlayerExists && !featureVehSeatbelt)
501
			PED::SET_PED_CONFIG_FLAG(playerPed, PED_FLAG_CAN_FLY_THRU_WINDSCREEN, TRUE);
502
		featureVehSeatbeltUpdated = false;
503
	}
504
	if (featureVehSeatbelt)
505
	{
506
		if (bPlayerExists)
507
		{
508
			if (PED::GET_PED_CONFIG_FLAG(playerPed, PED_FLAG_CAN_FLY_THRU_WINDSCREEN, TRUE))
509
				PED::SET_PED_CONFIG_FLAG(playerPed, PED_FLAG_CAN_FLY_THRU_WINDSCREEN, FALSE);
510
		}
511
	}
512
513
	// player's vehicle boost
514
	if (featureVehSpeedBoost && bPlayerExists && PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
515
	{
516
		Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
517
		DWORD model = ENTITY::GET_ENTITY_MODEL(veh);
518
519
		bool bUp = IsKeyDown(VK_NUMPAD9);
520
		bool bDown = IsKeyDown(VK_NUMPAD3);
521
522
		if (bUp || bDown)
523
		{			
524
			float speed = ENTITY::GET_ENTITY_SPEED(veh);
525
			if (bUp) 
526
			{
527
				if (speed < 3.0f) speed = 3.0f;
528
				speed += speed * 0.05f;
529
				VEHICLE::SET_VEHICLE_FORWARD_SPEED(veh, speed);
530
			} else
531
			if (ENTITY::IS_ENTITY_IN_AIR(veh) || speed > 5.0) 
532
				VEHICLE::SET_VEHICLE_FORWARD_SPEED(veh, 0.0);
533
		}
534
	}
535
536
	// time pause
537
	if (featureTimePausedUpdated)
538
	{
539
		TIME::PAUSE_CLOCK(featureTimePaused);
540
		featureTimePausedUpdated = false;
541
	}
542
543
	// time sync
544
	if (featureTimeSynced)
545
	{
546
		time_t now = time(0);
547
		tm t;
548
		localtime_s(&t, &now);
549
		TIME::SET_CLOCK_TIME(t.tm_hour, t.tm_min, t.tm_sec);
550
	}
551
552
	// hide hud
553
	if (featureMiscHideHud)
554
		UI::HIDE_HUD_AND_RADAR_THIS_FRAME();
555
}
556
557
LPCSTR pedModels[70][10] = {
558
	{"player_zero", "player_one", "player_two", "a_c_boar", "a_c_chimp", "a_c_cow", "a_c_coyote", "a_c_deer", "a_c_fish", "a_c_hen"},
559
	{ "a_c_cat_01", "a_c_chickenhawk", "a_c_cormorant", "a_c_crow", "a_c_dolphin", "a_c_humpback", "a_c_killerwhale", "a_c_pigeon", "a_c_seagull", "a_c_sharkhammer"},
560
	{"a_c_pig", "a_c_rat", "a_c_rhesus", "a_c_chop", "a_c_husky", "a_c_mtlion", "a_c_retriever", "a_c_sharktiger", "a_c_shepherd", "s_m_m_movalien_01"},
561
	{"a_f_m_beach_01", "a_f_m_bevhills_01", "a_f_m_bevhills_02", "a_f_m_bodybuild_01", "a_f_m_business_02", "a_f_m_downtown_01", "a_f_m_eastsa_01", "a_f_m_eastsa_02", "a_f_m_fatbla_01", "a_f_m_fatcult_01"},
562
	{"a_f_m_fatwhite_01", "a_f_m_ktown_01", "a_f_m_ktown_02", "a_f_m_prolhost_01", "a_f_m_salton_01", "a_f_m_skidrow_01", "a_f_m_soucentmc_01", "a_f_m_soucent_01", "a_f_m_soucent_02", "a_f_m_tourist_01"},
563
	{"a_f_m_trampbeac_01", "a_f_m_tramp_01", "a_f_o_genstreet_01", "a_f_o_indian_01", "a_f_o_ktown_01", "a_f_o_salton_01", "a_f_o_soucent_01", "a_f_o_soucent_02", "a_f_y_beach_01", "a_f_y_bevhills_01"},
564
	{"a_f_y_bevhills_02", "a_f_y_bevhills_03", "a_f_y_bevhills_04", "a_f_y_business_01", "a_f_y_business_02", "a_f_y_business_03", "a_f_y_business_04", "a_f_y_eastsa_01", "a_f_y_eastsa_02", "a_f_y_eastsa_03"},
565
	{"a_f_y_epsilon_01", "a_f_y_fitness_01", "a_f_y_fitness_02", "a_f_y_genhot_01", "a_f_y_golfer_01", "a_f_y_hiker_01", "a_f_y_hippie_01", "a_f_y_hipster_01", "a_f_y_hipster_02", "a_f_y_hipster_03"},
566
	{"a_f_y_hipster_04", "a_f_y_indian_01", "a_f_y_juggalo_01", "a_f_y_runner_01", "a_f_y_rurmeth_01", "a_f_y_scdressy_01", "a_f_y_skater_01", "a_f_y_soucent_01", "a_f_y_soucent_02", "a_f_y_soucent_03"},
567
	{"a_f_y_tennis_01", "a_f_y_topless_01", "a_f_y_tourist_01", "a_f_y_tourist_02", "a_f_y_vinewood_01", "a_f_y_vinewood_02", "a_f_y_vinewood_03", "a_f_y_vinewood_04", "a_f_y_yoga_01", "a_m_m_acult_01"},
568
	{"a_m_m_afriamer_01", "a_m_m_beach_01", "a_m_m_beach_02", "a_m_m_bevhills_01", "a_m_m_bevhills_02", "a_m_m_business_01", "a_m_m_eastsa_01", "a_m_m_eastsa_02", "a_m_m_farmer_01", "a_m_m_fatlatin_01"},
569
	{"a_m_m_genfat_01", "a_m_m_genfat_02", "a_m_m_golfer_01", "a_m_m_hasjew_01", "a_m_m_hillbilly_01", "a_m_m_hillbilly_02", "a_m_m_indian_01", "a_m_m_ktown_01", "a_m_m_malibu_01", "a_m_m_mexcntry_01"},
570
	{"a_m_m_mexlabor_01", "a_m_m_og_boss_01", "a_m_m_paparazzi_01", "a_m_m_polynesian_01", "a_m_m_prolhost_01", "a_m_m_rurmeth_01", "a_m_m_salton_01", "a_m_m_salton_02", "a_m_m_salton_03", "a_m_m_salton_04"},
571
	{"a_m_m_skater_01", "a_m_m_skidrow_01", "a_m_m_socenlat_01", "a_m_m_soucent_01", "a_m_m_soucent_02", "a_m_m_soucent_03", "a_m_m_soucent_04", "a_m_m_stlat_02", "a_m_m_tennis_01", "a_m_m_tourist_01"},
572
	{"a_m_m_trampbeac_01", "a_m_m_tramp_01", "a_m_m_tranvest_01", "a_m_m_tranvest_02", "a_m_o_acult_01", "a_m_o_acult_02", "a_m_o_beach_01", "a_m_o_genstreet_01", "a_m_o_ktown_01", "a_m_o_salton_01"},
573
	{"a_m_o_soucent_01", "a_m_o_soucent_02", "a_m_o_soucent_03", "a_m_o_tramp_01", "a_m_y_acult_01", "a_m_y_acult_02", "a_m_y_beachvesp_01", "a_m_y_beachvesp_02", "a_m_y_beach_01", "a_m_y_beach_02"},
574
	{"a_m_y_beach_03", "a_m_y_bevhills_01", "a_m_y_bevhills_02", "a_m_y_breakdance_01", "a_m_y_busicas_01", "a_m_y_business_01", "a_m_y_business_02", "a_m_y_business_03", "a_m_y_cyclist_01", "a_m_y_dhill_01"},
575
	{"a_m_y_downtown_01", "a_m_y_eastsa_01", "a_m_y_eastsa_02", "a_m_y_epsilon_01", "a_m_y_epsilon_02", "a_m_y_gay_01", "a_m_y_gay_02", "a_m_y_genstreet_01", "a_m_y_genstreet_02", "a_m_y_golfer_01"},
576
	{"a_m_y_hasjew_01", "a_m_y_hiker_01", "a_m_y_hippy_01", "a_m_y_hipster_01", "a_m_y_hipster_02", "a_m_y_hipster_03", "a_m_y_indian_01", "a_m_y_jetski_01", "a_m_y_juggalo_01", "a_m_y_ktown_01"},
577
	{"a_m_y_ktown_02", "a_m_y_latino_01", "a_m_y_methhead_01", "a_m_y_mexthug_01", "a_m_y_motox_01", "a_m_y_motox_02", "a_m_y_musclbeac_01", "a_m_y_musclbeac_02", "a_m_y_polynesian_01", "a_m_y_roadcyc_01"},
578
	{"a_m_y_runner_01", "a_m_y_runner_02", "a_m_y_salton_01", "a_m_y_skater_01", "a_m_y_skater_02", "a_m_y_soucent_01", "a_m_y_soucent_02", "a_m_y_soucent_03", "a_m_y_soucent_04", "a_m_y_stbla_01"},
579
	{"a_m_y_stbla_02", "a_m_y_stlat_01", "a_m_y_stwhi_01", "a_m_y_stwhi_02", "a_m_y_sunbathe_01", "a_m_y_surfer_01", "a_m_y_vindouche_01", "a_m_y_vinewood_01", "a_m_y_vinewood_02", "a_m_y_vinewood_03"},
580
	{"a_m_y_vinewood_04", "a_m_y_yoga_01", "u_m_y_proldriver_01", "u_m_y_rsranger_01", "u_m_y_sbike", "u_m_y_staggrm_01", "u_m_y_tattoo_01", "csb_abigail", "csb_anita", "csb_anton"},
581
	{"csb_ballasog", "csb_bride", "csb_burgerdrug", "csb_car3guy1", "csb_car3guy2", "csb_chef", "csb_chin_goon", "csb_cletus", "csb_cop", "csb_customer"},
582
	{"csb_denise_friend", "csb_fos_rep", "csb_g", "csb_groom", "csb_grove_str_dlr", "csb_hao", "csb_hugh", "csb_imran", "csb_janitor", "csb_maude"},
583
	{"csb_mweather", "csb_ortega", "csb_oscar", "csb_porndudes", "csb_porndudes_p", "csb_prologuedriver", "csb_prolsec", "csb_ramp_gang", "csb_ramp_hic", "csb_ramp_hipster"},
584
	{"csb_ramp_marine", "csb_ramp_mex", "csb_reporter", "csb_roccopelosi", "csb_screen_writer", "csb_stripper_01", "csb_stripper_02", "csb_tonya", "csb_trafficwarden", "cs_amandatownley"},
585
	{"cs_andreas", "cs_ashley", "cs_bankman", "cs_barry", "cs_barry_p", "cs_beverly", "cs_beverly_p", "cs_brad", "cs_bradcadaver", "cs_carbuyer"},
586
	{"cs_casey", "cs_chengsr", "cs_chrisformage", "cs_clay", "cs_dale", "cs_davenorton", "cs_debra", "cs_denise", "cs_devin", "cs_dom"},
587
	{"cs_dreyfuss", "cs_drfriedlander", "cs_fabien", "cs_fbisuit_01", "cs_floyd", "cs_guadalope", "cs_gurk", "cs_hunter", "cs_janet", "cs_jewelass"},
588
	{"cs_jimmyboston", "cs_jimmydisanto", "cs_joeminuteman", "cs_johnnyklebitz", "cs_josef", "cs_josh", "cs_lamardavis", "cs_lazlow", "cs_lestercrest", "cs_lifeinvad_01"},
589
	{"cs_magenta", "cs_manuel", "cs_marnie", "cs_martinmadrazo", "cs_maryann", "cs_michelle", "cs_milton", "cs_molly", "cs_movpremf_01", "cs_movpremmale"},
590
	{"cs_mrk", "cs_mrsphillips", "cs_mrs_thornhill", "cs_natalia", "cs_nervousron", "cs_nigel", "cs_old_man1a", "cs_old_man2", "cs_omega", "cs_orleans"},
591
	{"cs_paper", "cs_paper_p", "cs_patricia", "cs_priest", "cs_prolsec_02", "cs_russiandrunk", "cs_siemonyetarian", "cs_solomon", "cs_stevehains", "cs_stretch"},
592
	{"cs_tanisha", "cs_taocheng", "cs_taostranslator", "cs_tenniscoach", "cs_terry", "cs_tom", "cs_tomepsilon", "cs_tracydisanto", "cs_wade", "cs_zimbor"},
593
	{"g_f_y_ballas_01", "g_f_y_families_01", "g_f_y_lost_01", "g_f_y_vagos_01", "g_m_m_armboss_01", "g_m_m_armgoon_01", "g_m_m_armlieut_01", "g_m_m_chemwork_01", "g_m_m_chemwork_01_p", "g_m_m_chiboss_01"},
594
	{"g_m_m_chiboss_01_p", "g_m_m_chicold_01", "g_m_m_chicold_01_p", "g_m_m_chigoon_01", "g_m_m_chigoon_01_p", "g_m_m_chigoon_02", "g_m_m_korboss_01", "g_m_m_mexboss_01", "g_m_m_mexboss_02", "g_m_y_armgoon_02"},
595
	{"g_m_y_azteca_01", "g_m_y_ballaeast_01", "g_m_y_ballaorig_01", "g_m_y_ballasout_01", "g_m_y_famca_01", "g_m_y_famdnf_01", "g_m_y_famfor_01", "g_m_y_korean_01", "g_m_y_korean_02", "g_m_y_korlieut_01"},
596
	{"g_m_y_lost_01", "g_m_y_lost_02", "g_m_y_lost_03", "g_m_y_mexgang_01", "g_m_y_mexgoon_01", "g_m_y_mexgoon_02", "g_m_y_mexgoon_03", "g_m_y_mexgoon_03_p", "g_m_y_pologoon_01", "g_m_y_pologoon_01_p"},
597
	{"g_m_y_pologoon_02", "g_m_y_pologoon_02_p", "g_m_y_salvaboss_01", "g_m_y_salvagoon_01", "g_m_y_salvagoon_02", "g_m_y_salvagoon_03", "g_m_y_salvagoon_03_p", "g_m_y_strpunk_01", "g_m_y_strpunk_02", "hc_driver"},
598
	{"hc_gunman", "hc_hacker", "ig_abigail", "ig_amandatownley", "ig_andreas", "ig_ashley", "ig_ballasog", "ig_bankman", "ig_barry", "ig_barry_p"},
599
	{"ig_bestmen", "ig_beverly", "ig_beverly_p", "ig_brad", "ig_bride", "ig_car3guy1", "ig_car3guy2", "ig_casey", "ig_chef", "ig_chengsr"},
600
	{"ig_chrisformage", "ig_clay", "ig_claypain", "ig_cletus", "ig_dale", "ig_davenorton", "ig_denise", "ig_devin", "ig_dom", "ig_dreyfuss"},
601
	{"ig_drfriedlander", "ig_fabien", "ig_fbisuit_01", "ig_floyd", "ig_groom", "ig_hao", "ig_hunter", "ig_janet", "ig_jay_norris", "ig_jewelass"},
602
	{"ig_jimmyboston", "ig_jimmydisanto", "ig_joeminuteman", "ig_johnnyklebitz", "ig_josef", "ig_josh", "ig_kerrymcintosh", "ig_lamardavis", "ig_lazlow", "ig_lestercrest"},
603
	{"ig_lifeinvad_01", "ig_lifeinvad_02", "ig_magenta", "ig_manuel", "ig_marnie", "ig_maryann", "ig_maude", "ig_michelle", "ig_milton", "ig_molly"},
604
	{"ig_mrk", "ig_mrsphillips", "ig_mrs_thornhill", "ig_natalia", "ig_nervousron", "ig_nigel", "ig_old_man1a", "ig_old_man2", "ig_omega", "ig_oneil"},
605
	{"ig_orleans", "ig_ortega", "ig_paper", "ig_patricia", "ig_priest", "ig_prolsec_02", "ig_ramp_gang", "ig_ramp_hic", "ig_ramp_hipster", "ig_ramp_mex"},
606
	{"ig_roccopelosi", "ig_russiandrunk", "ig_screen_writer", "ig_siemonyetarian", "ig_solomon", "ig_stevehains", "ig_stretch", "ig_talina", "ig_tanisha", "ig_taocheng"},
607
	{"ig_taostranslator", "ig_taostranslator_p", "ig_tenniscoach", "ig_terry", "ig_tomepsilon", "ig_tonya", "ig_tracydisanto", "ig_trafficwarden", "ig_tylerdix", "ig_wade"},
608
	{"ig_zimbor", "mp_f_deadhooker", "mp_f_freemode_01", "mp_f_misty_01", "mp_f_stripperlite", "mp_g_m_pros_01", "mp_headtargets", "mp_m_claude_01", "mp_m_exarmy_01", "mp_m_famdd_01"},
609
	{"mp_m_fibsec_01", "mp_m_freemode_01", "mp_m_marston_01", "mp_m_niko_01", "mp_m_shopkeep_01", "mp_s_m_armoured_01", "", "", "", ""},
610
	{"", "s_f_m_fembarber", "s_f_m_maid_01", "s_f_m_shop_high", "s_f_m_sweatshop_01", "s_f_y_airhostess_01", "s_f_y_bartender_01", "s_f_y_baywatch_01", "s_f_y_cop_01", "s_f_y_factory_01"},
611
	{"s_f_y_hooker_01", "s_f_y_hooker_02", "s_f_y_hooker_03", "s_f_y_migrant_01", "s_f_y_movprem_01", "s_f_y_ranger_01", "s_f_y_scrubs_01", "s_f_y_sheriff_01", "s_f_y_shop_low", "s_f_y_shop_mid"},
612
	{"s_f_y_stripperlite", "s_f_y_stripper_01", "s_f_y_stripper_02", "s_f_y_sweatshop_01", "s_m_m_ammucountry", "s_m_m_armoured_01", "s_m_m_armoured_02", "s_m_m_autoshop_01", "s_m_m_autoshop_02", "s_m_m_bouncer_01"},
613
	{"s_m_m_chemsec_01", "s_m_m_ciasec_01", "s_m_m_cntrybar_01", "s_m_m_dockwork_01", "s_m_m_doctor_01", "s_m_m_fiboffice_01", "s_m_m_fiboffice_02", "s_m_m_gaffer_01", "s_m_m_gardener_01", "s_m_m_gentransport"},
614
	{"s_m_m_hairdress_01", "s_m_m_highsec_01", "s_m_m_highsec_02", "s_m_m_janitor", "s_m_m_lathandy_01", "s_m_m_lifeinvad_01", "s_m_m_linecook", "s_m_m_lsmetro_01", "s_m_m_mariachi_01", "s_m_m_marine_01"},
615
	{"s_m_m_marine_02", "s_m_m_migrant_01", "u_m_y_zombie_01", "s_m_m_movprem_01", "s_m_m_movspace_01", "s_m_m_paramedic_01", "s_m_m_pilot_01", "s_m_m_pilot_02", "s_m_m_postal_01", "s_m_m_postal_02"},
616
	{"s_m_m_prisguard_01", "s_m_m_scientist_01", "s_m_m_security_01", "s_m_m_snowcop_01", "s_m_m_strperf_01", "s_m_m_strpreach_01", "s_m_m_strvend_01", "s_m_m_trucker_01", "s_m_m_ups_01", "s_m_m_ups_02"},
617
	{"s_m_o_busker_01", "s_m_y_airworker", "s_m_y_ammucity_01", "s_m_y_armymech_01", "s_m_y_autopsy_01", "s_m_y_barman_01", "s_m_y_baywatch_01", "s_m_y_blackops_01", "s_m_y_blackops_02", "s_m_y_busboy_01"},
618
	{"s_m_y_chef_01", "s_m_y_clown_01", "s_m_y_construct_01", "s_m_y_construct_02", "s_m_y_cop_01", "s_m_y_dealer_01", "s_m_y_devinsec_01", "s_m_y_dockwork_01", "s_m_y_doorman_01", "s_m_y_dwservice_01"},
619
	{"s_m_y_dwservice_02", "s_m_y_factory_01", "s_m_y_fireman_01", "s_m_y_garbage", "s_m_y_grip_01", "s_m_y_hwaycop_01", "s_m_y_marine_01", "s_m_y_marine_02", "s_m_y_marine_03", "s_m_y_mime"},
620
	{"s_m_y_pestcont_01", "s_m_y_pilot_01", "s_m_y_prismuscl_01", "s_m_y_prisoner_01", "s_m_y_ranger_01", "s_m_y_robber_01", "s_m_y_sheriff_01", "s_m_y_shop_mask", "s_m_y_strvend_01", "s_m_y_swat_01"},
621
	{"s_m_y_uscg_01", "s_m_y_valet_01", "s_m_y_waiter_01", "s_m_y_winclean_01", "s_m_y_xmech_01", "s_m_y_xmech_02", "u_f_m_corpse_01", "u_f_m_miranda", "u_f_m_promourn_01", "u_f_o_moviestar"},
622
	{"u_f_o_prolhost_01", "u_f_y_bikerchic", "u_f_y_comjane", "u_f_y_corpse_01", "u_f_y_corpse_02", "u_f_y_hotposh_01", "u_f_y_jewelass_01", "u_f_y_mistress", "u_f_y_poppymich", "u_f_y_princess"},
623
	{"u_f_y_spyactress", "u_m_m_aldinapoli", "u_m_m_bankman", "u_m_m_bikehire_01", "u_m_m_fibarchitect", "u_m_m_filmdirector", "u_m_m_glenstank_01", "u_m_m_griff_01", "u_m_m_jesus_01", "u_m_m_jewelsec_01"},
624
	{"u_m_m_jewelthief", "u_m_m_markfost", "u_m_m_partytarget", "u_m_m_prolsec_01", "u_m_m_promourn_01", "u_m_m_rivalpap", "u_m_m_spyactor", "u_m_m_willyfist", "u_m_o_finguru_01", "u_m_o_taphillbilly"},
625
	{"u_m_o_tramp_01", "u_m_y_abner", "u_m_y_antonb", "u_m_y_babyd", "u_m_y_baygor", "u_m_y_burgerdrug_01", "u_m_y_chip", "u_m_y_cyclist_01", "u_m_y_fibmugger_01", "u_m_y_guido_01"},
626
	{"u_m_y_gunvend_01", "u_m_y_hippie_01", "u_m_y_imporage", "u_m_y_justin", "u_m_y_mani", "u_m_y_militarybum", "u_m_y_paparazzi", "u_m_y_party_01", "u_m_y_pogo_01", "u_m_y_prisoner_01"},
627
	{"ig_benny", "ig_g", "ig_vagspeak", "mp_m_g_vagfun_01", "mp_m_boatstaff_01", "mp_f_boatstaff_01", "", "", "", ""}
628
};
629
630
LPCSTR pedModelNames[70][10] = {
631
	{"MICHAEL", "FRANKLIN", "TREVOR", "BOAR", "CHIMP", "COW", "COYOTE", "DEER", "FISH", "HEN"},
632
	{ "CAT", "HAWK", "CORMORANT", "CROW", "DOLPHIN", "HUMPBACK", "WHALE", "PIGEON", "SEAGULL", "SHARKHAMMER" },
633
	{"PIG", "RAT", "RHESUS", "CHOP", "HUSKY", "MTLION", "RETRIEVER", "SHARKTIGER", "SHEPHERD", "ALIEN"},
634
	{"BEACH", "BEVHILLS", "BEVHILLS", "BODYBUILD", "BUSINESS", "DOWNTOWN", "EASTSA", "EASTSA", "FATBLA", "FATCULT"},
635
	{"FATWHITE", "KTOWN", "KTOWN", "PROLHOST", "SALTON", "SKIDROW", "SOUCENTMC", "SOUCENT", "SOUCENT", "TOURIST"},
636
	{"TRAMPBEAC", "TRAMP", "GENSTREET", "INDIAN", "KTOWN", "SALTON", "SOUCENT", "SOUCENT", "BEACH", "BEVHILLS"},
637
	{"BEVHILLS", "BEVHILLS", "BEVHILLS", "BUSINESS", "BUSINESS", "BUSINESS", "BUSINESS", "EASTSA", "EASTSA", "EASTSA"},
638
	{"EPSILON", "FITNESS", "FITNESS", "GENHOT", "GOLFER", "HIKER", "HIPPIE", "HIPSTER", "HIPSTER", "HIPSTER"},
639
	{"HIPSTER", "INDIAN", "JUGGALO", "RUNNER", "RURMETH", "SCDRESSY", "SKATER", "SOUCENT", "SOUCENT", "SOUCENT"},
640
	{"TENNIS", "TOPLESS", "TOURIST", "TOURIST", "VINEWOOD", "VINEWOOD", "VINEWOOD", "VINEWOOD", "YOGA", "ACULT"},
641
	{"AFRIAMER", "BEACH", "BEACH", "BEVHILLS", "BEVHILLS", "BUSINESS", "EASTSA", "EASTSA", "FARMER", "FATLATIN"},
642
	{"GENFAT", "GENFAT", "GOLFER", "HASJEW", "HILLBILLY", "HILLBILLY", "INDIAN", "KTOWN", "MALIBU", "MEXCNTRY"},
643
	{"MEXLABOR", "OG_BOSS", "PAPARAZZI", "POLYNESIAN", "PROLHOST", "RURMETH", "SALTON", "SALTON", "SALTON", "SALTON"},
644
	{"SKATER", "SKIDROW", "SOCENLAT", "SOUCENT", "SOUCENT", "SOUCENT", "SOUCENT", "STLAT", "TENNIS", "TOURIST"},
645
	{"TRAMPBEAC", "TRAMP", "TRANVEST", "TRANVEST", "ACULT", "ACULT", "BEACH", "GENSTREET", "KTOWN", "SALTON"},
646
	{"SOUCENT", "SOUCENT", "SOUCENT", "TRAMP", "ACULT", "ACULT", "BEACHVESP", "BEACHVESP", "BEACH", "BEACH"},
647
	{"BEACH", "BEVHILLS", "BEVHILLS", "BREAKDANCE", "BUSICAS", "BUSINESS", "BUSINESS", "BUSINESS", "CYCLIST", "DHILL"},
648
	{"DOWNTOWN", "EASTSA", "EASTSA", "EPSILON", "EPSILON", "GAY", "GAY", "GENSTREET", "GENSTREET", "GOLFER"},
649
	{"HASJEW", "HIKER", "HIPPY", "HIPSTER", "HIPSTER", "HIPSTER", "INDIAN", "JETSKI", "JUGGALO", "KTOWN"},
650
	{"KTOWN", "LATINO", "METHHEAD", "MEXTHUG", "MOTOX", "MOTOX", "MUSCLBEAC", "MUSCLBEAC", "POLYNESIAN", "ROADCYC"},
651
	{"RUNNER", "RUNNER", "SALTON", "SKATER", "SKATER", "SOUCENT", "SOUCENT", "SOUCENT", "SOUCENT", "STBLA"},
652
	{"STBLA", "STLAT", "STWHI", "STWHI", "SUNBATHE", "SURFER", "VINDOUCHE", "VINEWOOD", "VINEWOOD", "VINEWOOD"},
653
	{"VINEWOOD", "YOGA", "PROLDRIVER", "RSRANGER", "SBIKE", "STAGGRM", "TATTOO", "ABIGAIL", "ANITA", "ANTON"},
654
	{"BALLASOG", "BRIDE", "BURGERDRUG", "CAR3GUY1", "CAR3GUY2", "CHEF", "CHIN_GOON", "CLETUS", "COP", "CUSTOMER"},
655
	{"DENISE_FRIEND", "FOS_REP", "G", "GROOM", "DLR", "HAO", "HUGH", "IMRAN", "JANITOR", "MAUDE"},
656
	{"MWEATHER", "ORTEGA", "OSCAR", "PORNDUDES", "PORNDUDES_P", "PROLOGUEDRIVER", "PROLSEC", "GANG", "HIC", "HIPSTER"},
657
	{"MARINE", "MEX", "REPORTER", "ROCCOPELOSI", "SCREEN_WRITER", "STRIPPER", "STRIPPER", "TONYA", "TRAFFICWARDEN", "AMANDATOWNLEY"},
658
	{"ANDREAS", "ASHLEY", "BANKMAN", "BARRY", "BARRY_P", "BEVERLY", "BEVERLY_P", "BRAD", "BRADCADAVER", "CARBUYER"},
659
	{"CASEY", "CHENGSR", "CHRISFORMAGE", "CLAY", "DALE", "DAVENORTON", "DEBRA", "DENISE", "DEVIN", "DOM"},
660
	{"DREYFUSS", "DRFRIEDLANDER", "FABIEN", "FBISUIT", "FLOYD", "GUADALOPE", "GURK", "HUNTER", "JANET", "JEWELASS"},
661
	{"JIMMYBOSTON", "JIMMYDISANTO", "JOEMINUTEMAN", "JOHNNYKLEBITZ", "JOSEF", "JOSH", "LAMARDAVIS", "LAZLOW", "LESTERCREST", "LIFEINVAD"},
662
	{"MAGENTA", "MANUEL", "MARNIE", "MARTINMADRAZO", "MARYANN", "MICHELLE", "MILTON", "MOLLY", "MOVPREMF", "MOVPREMMALE"},
663
	{"MRK", "MRSPHILLIPS", "MRS_THORNHILL", "NATALIA", "NERVOUSRON", "NIGEL", "OLD_MAN1A", "OLD_MAN2", "OMEGA", "ORLEANS"},
664
	{"PAPER", "PAPER_P", "PATRICIA", "PRIEST", "PROLSEC", "RUSSIANDRUNK", "SIEMONYETARIAN", "SOLOMON", "STEVEHAINS", "STRETCH"},
665
	{"TANISHA", "TAOCHENG", "TAOSTRANSLATOR", "TENNISCOACH", "TERRY", "TOM", "TOMEPSILON", "TRACYDISANTO", "WADE", "ZIMBOR"},
666
	{"BALLAS", "FAMILIES", "LOST", "VAGOS", "ARMBOSS", "ARMGOON", "ARMLIEUT", "CHEMWORK", "CHEMWORK_P", "CHIBOSS"},
667
	{"CHIBOSS_P", "CHICOLD", "CHICOLD_P", "CHIGOON", "CHIGOON_P", "CHIGOON", "KORBOSS", "MEXBOSS", "MEXBOSS", "ARMGOON"},
668
	{"AZTECA", "BALLAEAST", "BALLAORIG", "BALLASOUT", "FAMCA", "FAMDNF", "FAMFOR", "KOREAN", "KOREAN", "KORLIEUT"},
669
	{"LOST", "LOST", "LOST", "MEXGANG", "MEXGOON", "MEXGOON", "MEXGOON", "MEXGOON_P", "POLOGOON", "POLOGOON_P"},
670
	{"POLOGOON", "POLOGOON_P", "SALVABOSS", "SALVAGOON", "SALVAGOON", "SALVAGOON", "SALVAGOON_P", "STRPUNK", "STRPUNK", "HC_DRIVER"},
671
	{"HC_GUNMAN", "HC_HACKER", "ABIGAIL", "AMANDATOWNLEY", "ANDREAS", "ASHLEY", "BALLASOG", "BANKMAN", "BARRY", "BARRY_P"},
672
	{"BESTMEN", "BEVERLY", "BEVERLY_P", "BRAD", "BRIDE", "CAR3GUY1", "CAR3GUY2", "CASEY", "CHEF", "CHENGSR"},
673
	{"CHRISFORMAGE", "CLAY", "CLAYPAIN", "CLETUS", "DALE", "DAVENORTON", "DENISE", "DEVIN", "DOM", "DREYFUSS"},
674
	{"DRFRIEDLANDER", "FABIEN", "FBISUIT", "FLOYD", "GROOM", "HAO", "HUNTER", "JANET", "JAY_NORRIS", "JEWELASS"},
675
	{"JIMMYBOSTON", "JIMMYDISANTO", "JOEMINUTEMAN", "JOHNNYKLEBITZ", "JOSEF", "JOSH", "KERRYMCINTOSH", "LAMARDAVIS", "LAZLOW", "LESTERCREST"},
676
	{"LIFEINVAD", "LIFEINVAD", "MAGENTA", "MANUEL", "MARNIE", "MARYANN", "MAUDE", "MICHELLE", "MILTON", "MOLLY"},
677
	{"MRK", "MRSPHILLIPS", "MRS_THORNHILL", "NATALIA", "NERVOUSRON", "NIGEL", "OLD_MAN1A", "OLD_MAN2", "OMEGA", "ONEIL"},
678
	{"ORLEANS", "ORTEGA", "PAPER", "PATRICIA", "PRIEST", "PROLSEC", "GANG", "HIC", "HIPSTER", "MEX"},
679
	{"ROCCOPELOSI", "RUSSIANDRUNK", "SCREEN_WRITER", "SIEMONYETARIAN", "SOLOMON", "STEVEHAINS", "STRETCH", "TALINA", "TANISHA", "TAOCHENG"},
680
	{"TAOSTRANSLATOR", "TAOSTRANSLATOR_P", "TENNISCOACH", "TERRY", "TOMEPSILON", "TONYA", "TRACYDISANTO", "TRAFFICWARDEN", "TYLERDIX", "WADE"},
681
	{"ZIMBOR", "DEADHOOKER", "FREEMODE", "MISTY", "STRIPPERLITE", "PROS", "MP_HEADTARGETS", "CLAUDE", "EXARMY", "FAMDD"},
682
	{"FIBSEC", "FREEMODE", "MARSTON", "NIKO", "SHOPKEEP", "ARMOURED", "NONE", "NONE", "NONE", "NONE"},
683
	{"NONE", "FEMBARBER", "MAID", "SHOP_HIGH", "SWEATSHOP", "AIRHOSTESS", "BARTENDER", "BAYWATCH", "COP", "FACTORY"},
684
	{"HOOKER", "HOOKER", "HOOKER", "MIGRANT", "MOVPREM", "RANGER", "SCRUBS", "SHERIFF", "SHOP_LOW", "SHOP_MID"},
685
	{"STRIPPERLITE", "STRIPPER", "STRIPPER", "SWEATSHOP", "AMMUCOUNTRY", "ARMOURED", "ARMOURED", "AUTOSHOP", "AUTOSHOP", "BOUNCER"},
686
	{"CHEMSEC", "CIASEC", "CNTRYBAR", "DOCKWORK", "DOCTOR", "FIBOFFICE", "FIBOFFICE", "GAFFER", "GARDENER", "GENTRANSPORT"},
687
	{"HAIRDRESS", "HIGHSEC", "HIGHSEC", "JANITOR", "LATHANDY", "LIFEINVAD", "LINECOOK", "LSMETRO", "MARIACHI", "MARINE"},
688
	{"MARINE", "MIGRANT", "ZOMBIE", "MOVPREM", "MOVSPACE", "PARAMEDIC", "PILOT", "PILOT", "POSTAL", "POSTAL"},
689
	{"PRISGUARD", "SCIENTIST", "SECURITY", "SNOWCOP", "STRPERF", "STRPREACH", "STRVEND", "TRUCKER", "UPS", "UPS"},
690
	{"BUSKER", "AIRWORKER", "AMMUCITY", "ARMYMECH", "AUTOPSY", "BARMAN", "BAYWATCH", "BLACKOPS", "BLACKOPS", "BUSBOY"},
691
	{"CHEF", "CLOWN", "CONSTRUCT", "CONSTRUCT", "COP", "DEALER", "DEVINSEC", "DOCKWORK", "DOORMAN", "DWSERVICE"},
692
	{"DWSERVICE", "FACTORY", "FIREMAN", "GARBAGE", "GRIP", "HWAYCOP", "MARINE", "MARINE", "MARINE", "MIME"},
693
	{"PESTCONT", "PILOT", "PRISMUSCL", "PRISONER", "RANGER", "ROBBER", "SHERIFF", "SHOP_MASK", "STRVEND", "SWAT"},
694
	{"USCG", "VALET", "WAITER", "WINCLEAN", "XMECH", "XMECH", "CORPSE", "MIRANDA", "PROMOURN", "MOVIESTAR"},
695
	{"PROLHOST", "BIKERCHIC", "COMJANE", "CORPSE", "CORPSE", "HOTPOSH", "JEWELASS", "MISTRESS", "POPPYMICH", "PRINCESS"},
696
	{"SPYACTRESS", "ALDINAPOLI", "BANKMAN", "BIKEHIRE", "FIBARCHITECT", "FILMDIRECTOR", "GLENSTANK", "GRIFF", "JESUS", "JEWELSEC"},
697
	{"JEWELTHIEF", "MARKFOST", "PARTYTARGET", "PROLSEC", "PROMOURN", "RIVALPAP", "SPYACTOR", "WILLYFIST", "FINGURU", "TAPHILLBILLY"},
698
	{"TRAMP", "ABNER", "ANTONB", "BABYD", "BAYGOR", "BURGERDRUG", "CHIP", "CYCLIST", "FIBMUGGER", "GUIDO"},
699
	{"GUNVEND", "HIPPIE", "IMPORAGE", "JUSTIN", "MANI", "MILITARYBUM", "PAPARAZZI", "PARTY", "POGO", "PRISONER"},
700
	{"BENNY", "G", "VAGSPEAK", "VAGFUN", "BOATSTAFF", "FEMBOATSTAFF", "", "", "", ""}
701
};
702
703
int skinchangerActiveLineIndex = 0;
704
int skinchangerActiveItemIndex = 0;
705
706
bool process_skinchanger_menu()
707
{
708
	DWORD waitTime = 150;
709
	const int lineCount = 70;
710
	const int itemCount = 10;
711
	const int itemCountLastLine = 6;
712
	while (true)
713
	{
714
		// timed menu draw, used for pause after active line switch
715
		DWORD maxTickCount = GetTickCount() + waitTime;
716
		do 
717
		{
718
			// draw menu
719
			char caption[32];
720
			sprintf_s(caption, "SKIN CHANGER   %d / %d", skinchangerActiveLineIndex + 1, lineCount);
721
			draw_menu_line(caption, 350.0, 15.0, 18.0, 0.0, 5.0, false, true);
722
			for (int i = 0; i < itemCount; i++)
723
				if (strlen(pedModels[skinchangerActiveLineIndex][i]) || strcmp(pedModelNames[skinchangerActiveLineIndex][i], "NONE") == 0)
724
					draw_menu_line(pedModelNames[skinchangerActiveLineIndex][i], 100.0f, 5.0f, 200.0f, 100.0f + i * 110.0f, 5.0f, i == skinchangerActiveItemIndex, false, false);
725
			
726
			update_features();
727
			WAIT(0);
728
		} while (GetTickCount() < maxTickCount);
729
		waitTime = 0;
730
731
		bool bSelect, bBack, bUp, bDown, bLeft, bRight;
732
		get_button_state(&bSelect, &bBack, &bUp, &bDown, &bLeft, &bRight);
733
		
734
		if (bSelect)
735
		{
736
			menu_beep();
737
			DWORD model = GAMEPLAY::GET_HASH_KEY((char *)pedModels[skinchangerActiveLineIndex][skinchangerActiveItemIndex]);
738
			if (STREAMING::IS_MODEL_IN_CDIMAGE(model) && STREAMING::IS_MODEL_VALID(model))
739
			{
740
				STREAMING::REQUEST_MODEL(model);				
741
				while (!STREAMING::HAS_MODEL_LOADED(model))	WAIT(0); 
742
				//STREAMING::LOAD_ALL_OBJECTS_NOW();
743
				PLAYER::SET_PLAYER_MODEL(PLAYER::PLAYER_ID(), model);
744
				//PED::SET_PED_RANDOM_COMPONENT_VARIATION(PLAYER::PLAYER_PED_ID(), FALSE);
745
				PED::SET_PED_DEFAULT_COMPONENT_VARIATION(PLAYER::PLAYER_PED_ID());				
746
				WAIT(0);
747
				for (int i = 0; i < 12; i++)
748
					for (int j = 0; j < 100; j++)
749
					{
750
						int drawable = rand() % 10;
751
						int texture = rand() % 10;
752
						if (PED::IS_PED_COMPONENT_VARIATION_VALID(PLAYER::PLAYER_PED_ID(), i, drawable, texture))
753
						{
754
							PED::SET_PED_COMPONENT_VARIATION(PLAYER::PLAYER_PED_ID(), i, drawable, texture, 0);
755
							break;
756
						}
757
					}
758
				skinchanger_used = true;
759
				WAIT(100);
760
				STREAMING::SET_MODEL_AS_NO_LONGER_NEEDED(model);				
761
				waitTime = 200;
762
			}
763
		} else
764
		if (bBack)
765
		{
766
			menu_beep();
767
			break;
768
		} else
769
		if (bRight)
770
		{
771
			menu_beep();
772
			skinchangerActiveItemIndex++;
773
			int itemsMax = (skinchangerActiveLineIndex == (lineCount - 1)) ? itemCountLastLine : itemCount;
774
			if (skinchangerActiveItemIndex == itemsMax) 
775
				skinchangerActiveItemIndex = 0;			
776
			waitTime = 100;
777
		} else
778
		if (bLeft)
779
		{
780
			menu_beep();
781
			if (skinchangerActiveItemIndex == 0) 
782
				skinchangerActiveItemIndex = (skinchangerActiveLineIndex == (lineCount - 1)) ? itemCountLastLine : itemCount;
783
			skinchangerActiveItemIndex--;
784
			waitTime = 100;
785
		} else
786
		if (bUp)
787
		{
788
			menu_beep();
789
			if (skinchangerActiveLineIndex == 0) 
790
				skinchangerActiveLineIndex = lineCount;
791
			skinchangerActiveLineIndex--;
792
			waitTime = 200;
793
		} else
794
		if (bDown)
795
		{
796
			menu_beep();
797
			skinchangerActiveLineIndex++;
798
			if (skinchangerActiveLineIndex == lineCount) 
799
				skinchangerActiveLineIndex = 0;			
800
			waitTime = 200;
801
		}
802
		if (skinchangerActiveLineIndex == (lineCount - 1))
803
			if (skinchangerActiveItemIndex >= itemCountLastLine)
804
				skinchangerActiveItemIndex = 0;
805
	}
806
	return false;
807
}
808
809
int teleportActiveLineIndex = 0;
810
811
bool process_teleport_menu()
812
{
813
	const float lineWidth = 250.0;
814
	const int lineCount	= 17;
815
816
	std::string caption = "TELEPORT";
817
818
	static struct {
819
		LPCSTR  text;
820
		float x;
821
		float y;
822
		float z;
823
	} lines[lineCount] = {
824
			{ "MARKER" },
825
			{ "MICHAEL'S HOUSE", -852.4f, 160.0f, 65.6f },
826
			{ "FRANKLIN'S HOUSE", 7.9f, 548.1f, 175.5f },
827
			{ "TREVOR'S TRAILER", 1985.7f, 3812.2f, 32.2f },
828
			{ "AIRPORT ENTRANCE", -1034.6f, -2733.6f, 13.8f },
829
			{ "AIRPORT FIELD", -1336.0f, -3044.0f, 13.9f },
830
			{ "ELYSIAN ISLAND", 338.2f, -2715.9f, 38.5f },
831
			{ "JETSAM", 760.4f, -2943.2f, 5.8f },
832
			{ "STRIPCLUB", 127.4f, -1307.7f, 29.2f },
833
			{ "ELBURRO HEIGHTS", 1384.0f, -2057.1f, 52.0f },
834
			{ "FERRIS WHEEL", -1670.7f, -1125.0f, 13.0f },
835
			{ "CHUMASH", -3192.6f, 1100.0f, 20.2f },
836
			{ "WINDFARM", 2354.0f, 1830.3f, 101.1f },
837
			{ "MILITARY BASE", -2047.4f, 3132.1f, 32.8f },
838
			{ "MCKENZIE AIRFIELD", 2121.7f, 4796.3f, 41.1f },
839
			{ "DESERT AIRFIELD", 1747.0f, 3273.7f, 41.1f },
840
			{ "CHILLIAD", 425.4f, 5614.3f, 766.5f }
841
	};
842
843
	DWORD waitTime = 150;
844
	while (true)
845
	{
846
		// timed menu draw, used for pause after active line switch
847
		DWORD maxTickCount = GetTickCount() + waitTime;
848
		do 
849
		{
850
			// draw menu
851
			draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
852
			for (int i = 0; i < lineCount; i++)
853
				if (i != teleportActiveLineIndex)
854
					draw_menu_line(lines[i].text, lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
855
			draw_menu_line(lines[teleportActiveLineIndex].text, lineWidth + 1.0, 11.0, 56.0 + teleportActiveLineIndex * 36.0, 0.0, 7.0, true, false);
856
857
			update_features();
858
			WAIT(0);
859
		} while (GetTickCount() < maxTickCount);
860
		waitTime = 0;
861
862
		// process buttons
863
		bool bSelect, bBack, bUp, bDown;
864
		get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
865
		if (bSelect)
866
		{
867
			menu_beep();
868
869
			// get entity to teleport
870
			Entity e = PLAYER::PLAYER_PED_ID();
871
			if (PED::IS_PED_IN_ANY_VEHICLE(e, 0)) 
872
				e = PED::GET_VEHICLE_PED_IS_USING(e);
873
874
			// get coords
875
			Vector3 coords;
876
			bool success = false;
877
			if (teleportActiveLineIndex == 0) // marker
878
			{			
879
				bool blipFound = false;
880
				// search for marker blip
881
				int blipIterator = UI::_GET_BLIP_INFO_ID_ITERATOR();
882
				for (Blip i = UI::GET_FIRST_BLIP_INFO_ID(blipIterator); UI::DOES_BLIP_EXIST(i) != 0; i = UI::GET_NEXT_BLIP_INFO_ID(blipIterator))
883
				{
884
					if (UI::GET_BLIP_INFO_ID_TYPE(i) == 4) 
885
					{
886
						coords = UI::GET_BLIP_INFO_ID_COORD(i);
887
						blipFound = true;
888
						break;
889
					}
890
				}	
891
				if (blipFound)
892
				{
893
					// load needed map region and check height levels for ground existence
894
					bool groundFound = false;
895
					static float groundCheckHeight[] = {
896
						100.0, 150.0, 50.0, 0.0, 200.0, 250.0, 300.0, 350.0, 400.0, 
897
						450.0, 500.0, 550.0, 600.0, 650.0, 700.0, 750.0, 800.0
898
					};					
899
					for (int i = 0; i < sizeof(groundCheckHeight) / sizeof(float); i++)
900
					{
901
						ENTITY::SET_ENTITY_COORDS_NO_OFFSET(e, coords.x, coords.y, groundCheckHeight[i], 0, 0, 1);
902
						WAIT(100);
903
						if (GAMEPLAY::GET_GROUND_Z_FOR_3D_COORD(coords.x, coords.y, groundCheckHeight[i], &coords.z, FALSE))
904
						{
905
							groundFound = true;
906
							coords.z += 3.0;
907
							break;
908
						}
909
					}
910
					// if ground not found then set Z in air and give player a parachute
911
					if (!groundFound)
912
					{
913
						coords.z = 1000.0;
914
						WEAPON::GIVE_DELAYED_WEAPON_TO_PED(PLAYER::PLAYER_PED_ID(), 0xFBAB5776, 1, 0);
915
					}
916
					success = true;
917
				} else
918
				{
919
					set_status_text("map marker isn't set");
920
				}
921
922
			} else // predefined coords
923
			{
924
				coords.x = lines[teleportActiveLineIndex].x;
925
				coords.y = lines[teleportActiveLineIndex].y;
926
				coords.z = lines[teleportActiveLineIndex].z;
927
				success = true;
928
			}
929
930
			// set player pos
931
			if (success)
932
			{
933
				ENTITY::SET_ENTITY_COORDS_NO_OFFSET(e, coords.x, coords.y, coords.z, 0, 0, 1);
934
				WAIT(0);
935
				set_status_text("teleported");
936
				return true;
937
			}
938
			
939
			waitTime = 200;
940
		} else
941
		if (bBack || trainer_switch_pressed())
942
		{
943
			menu_beep();
944
			break;
945
		} else
946
		if (bUp)
947
		{
948
			menu_beep();
949
			if (teleportActiveLineIndex == 0) 
950
				teleportActiveLineIndex = lineCount;
951
			teleportActiveLineIndex--;
952
			waitTime = 150;
953
		} else
954
		if (bDown)
955
		{
956
			menu_beep();
957
			teleportActiveLineIndex++;
958
			if (teleportActiveLineIndex == lineCount) 
959
				teleportActiveLineIndex = 0;			
960
			waitTime = 150;
961
		}
962
	}
963
	return false;
964
}
965
966
std::string line_as_str(std::string text, bool *pState)
967
{
968
	while (text.size() < 18) text += " ";
969
	return text + (pState ? (*pState ? " ~b~On" : " ~r~Off") : "");
970
}
971
972
int activeLineIndexPlayer = 0;
973
974
void process_player_menu()
975
{
976
	const float lineWidth = 250.0;
977
	const int lineCount = 16;
978
	
979
	std::string caption = "PLAYER  OPTIONS";
980
981
	static struct {
982
		LPCSTR		text;
983
		bool		*pState;
984
		bool		*pUpdated;
985
	} lines[lineCount] = {
986
		{"SKIN CHANGER", NULL, NULL}, //case 0
987
		{"TELEPORT", NULL, NULL},
988
		{"FIX PLAYER", NULL, NULL},
989
		{"RESET SKIN", NULL, NULL},
990
		{"ADD CASH", NULL, NULL},
991
		{"WANTED UP", NULL, NULL},
992
		{"WANTED DOWN", NULL, NULL},
993
		{"NEVER WANTED", &featurePlayerNeverWanted, NULL},
994
		{"INVINCIBLE", &featurePlayerInvincible, &featurePlayerInvincibleUpdated},
995
		{"POLICE IGNORED", &featurePlayerIgnored, &featurePlayerIgnoredUpdated},
996
		{"UNLIM ABILITY", &featurePlayerUnlimitedAbility, NULL},
997
		{"NOISELESS", &featurePlayerNoNoise, &featurePlayerNoNoiseUpdated},
998
		{"FAST SWIM", &featurePlayerFastSwim, &featurePlayerFastSwimUpdated},
999
		{"FAST RUN", &featurePlayerFastRun, &featurePlayerFastRunUpdated},
1000
		{"SUPER JUMP", &featurePlayerSuperJump, NULL},
1001
		{"ULTRA JUMP", &featurePlayerUltraJump, NULL },
1002
	};
1003
1004
	DWORD waitTime = 150;
1005
	while (true)
1006
	{
1007
		// timed menu draw, used for pause after active line switch
1008
		DWORD maxTickCount = GetTickCount() + waitTime;
1009
		do 
1010
		{
1011
			// draw menu
1012
			draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
1013
			for (int i = 0; i < lineCount; i++)
1014
				if (i != activeLineIndexPlayer)
1015
					draw_menu_line(line_as_str(lines[i].text, lines[i].pState), 
1016
								   lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
1017
			draw_menu_line(line_as_str(lines[activeLineIndexPlayer].text, lines[activeLineIndexPlayer].pState), 
1018
						   lineWidth + 1.0, 11.0, 56.0 + activeLineIndexPlayer * 36.0, 0.0, 7.0, true, false);
1019
1020
			update_features();
1021
			WAIT(0);
1022
		} while (GetTickCount() < maxTickCount);
1023
		waitTime = 0;
1024
1025
		// process buttons
1026
		bool bSelect, bBack, bUp, bDown;
1027
		get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
1028
		if (bSelect)
1029
		{
1030
			menu_beep();
1031
1032
			// common variables
1033
			BOOL bPlayerExists = ENTITY::DOES_ENTITY_EXIST(PLAYER::PLAYER_PED_ID());
1034
			Player player = PLAYER::PLAYER_ID();
1035
			Ped playerPed = PLAYER::PLAYER_PED_ID();
1036
1037
			switch (activeLineIndexPlayer)
1038
			{
1039
				// skin changer
1040
				case 0:
1041
					if (process_skinchanger_menu())	return;
1042
					break;
1043
				// teleport
1044
				case 1:
1045
					if (process_teleport_menu()) return;
1046
					break;
1047
				// fix player
1048
				case 2:
1049
					{
1050
						ENTITY::SET_ENTITY_HEALTH(playerPed, ENTITY::GET_ENTITY_MAX_HEALTH(playerPed));
1051
						PED::ADD_ARMOUR_TO_PED(playerPed, PLAYER::GET_PLAYER_MAX_ARMOUR(player) - PED::GET_PED_ARMOUR(playerPed));
1052
						if (PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
1053
						{
1054
							Vehicle playerVeh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
1055
							if (ENTITY::DOES_ENTITY_EXIST(playerVeh) && !ENTITY::IS_ENTITY_DEAD(playerVeh))
1056
								VEHICLE::SET_VEHICLE_FIXED(playerVeh);
1057
						}
1058
						set_status_text("player fixed");
1059
					}
1060
					break;
1061
				// reset model skin
1062
				case 3:
1063
					{
1064
						PED::SET_PED_DEFAULT_COMPONENT_VARIATION(playerPed);
1065
						set_status_text("using default model skin");
1066
					}
1067
					break;
1068
				// add cash
1069
				case 4: 
1070
					for (int i = 0; i < 3; i++)
1071
					{
1072
						char statNameFull[32];
1073
						sprintf_s(statNameFull, "SP%d_TOTAL_CASH", i);
1074
						Hash hash = GAMEPLAY::GET_HASH_KEY(statNameFull);
1075
						int val;
1076
						STATS::STAT_GET_INT(hash, &val, -1);
1077
						val += 1000000;
1078
						STATS::STAT_SET_INT(hash, val, 1);
1079
					}
1080
					set_status_text("cash added");
1081
					break;
1082
				// wanted up
1083
				case 5:	
1084
					if (bPlayerExists && PLAYER::GET_PLAYER_WANTED_LEVEL(player) < 5)
1085
					{
1086
						PLAYER::SET_PLAYER_WANTED_LEVEL(player, PLAYER::GET_PLAYER_WANTED_LEVEL(player) + 1, 0);
1087
						PLAYER::SET_PLAYER_WANTED_LEVEL_NOW(player, 0);
1088
						set_status_text("wanted up");
1089
					}
1090
					break;
1091
				// wanted down
1092
				case 6:	
1093
					if (bPlayerExists && PLAYER::GET_PLAYER_WANTED_LEVEL(player) > 0)
1094
					{
1095
						PLAYER::SET_PLAYER_WANTED_LEVEL(player, PLAYER::GET_PLAYER_WANTED_LEVEL(player) - 1, 0);
1096
						PLAYER::SET_PLAYER_WANTED_LEVEL_NOW(player, 0);
1097
						set_status_text("wanted down");
1098
					}
1099
					break;
1100
				// switchable features
1101
				default:
1102
					if (lines[activeLineIndexPlayer].pState)
1103
						*lines[activeLineIndexPlayer].pState = !(*lines[activeLineIndexPlayer].pState);
1104
					if (lines[activeLineIndexPlayer].pUpdated)
1105
						*lines[activeLineIndexPlayer].pUpdated = true;					
1106
			}
1107
			waitTime = 200;
1108
		} else
1109
		if (bBack || trainer_switch_pressed())
1110
		{
1111
			menu_beep();
1112
			break;
1113
		} else
1114
		if (bUp)
1115
		{
1116
			menu_beep();
1117
			if (activeLineIndexPlayer == 0) 
1118
				activeLineIndexPlayer = lineCount;
1119
			activeLineIndexPlayer--;
1120
			waitTime = 150;
1121
		} else
1122
		if (bDown)
1123
		{
1124
			menu_beep();
1125
			activeLineIndexPlayer++;
1126
			if (activeLineIndexPlayer == lineCount) 
1127
				activeLineIndexPlayer = 0;			
1128
			waitTime = 150;
1129
		}
1130
	}
1131
}
1132
1133
int activeLineIndexWeapon = 0;
1134
1135
void process_weapon_menu()
1136
{
1137
	const float lineWidth = 250.0;
1138
	const int lineCount = 6;
1139
1140
	std::string caption = "WEAPON  OPTIONS";
1141
1142
	static struct {
1143
		LPCSTR		text;
1144
		bool		*pState;
1145
		bool		*pUpdated;
1146
	} lines[lineCount] = {
1147
		{"GET ALL WEAPON",	NULL,						  NULL},
1148
		{"NO RELOAD",		&featureWeaponNoReload,		  NULL},
1149
		{"FIRE AMMO",		&featureWeaponFireAmmo,		  NULL},
1150
		{"EXPLOSIVE AMMO",  &featureWeaponExplosiveAmmo,  NULL},
1151
		{"EXPLOSIVE MELEE", &featureWeaponExplosiveMelee, NULL},
1152
		{"VEHICLE ROCKETS", &featureWeaponVehRockets,	  NULL}
1153
	};
1154
1155
	static LPCSTR weaponNames[] = {
1156
		"WEAPON_KNIFE", "WEAPON_NIGHTSTICK", "WEAPON_HAMMER", "WEAPON_BAT", "WEAPON_GOLFCLUB", "WEAPON_CROWBAR", 
1157
		"WEAPON_PISTOL", "WEAPON_COMBATPISTOL", "WEAPON_APPISTOL", "WEAPON_PISTOL50", "WEAPON_MICROSMG", "WEAPON_SMG", 
1158
		"WEAPON_ASSAULTSMG", "WEAPON_ASSAULTRIFLE", "WEAPON_CARBINERIFLE", "WEAPON_ADVANCEDRIFLE", "WEAPON_MG",
1159
		"WEAPON_COMBATMG", "WEAPON_PUMPSHOTGUN", "WEAPON_SAWNOFFSHOTGUN", "WEAPON_ASSAULTSHOTGUN", "WEAPON_BULLPUPSHOTGUN",
1160
		"WEAPON_STUNGUN", "WEAPON_SNIPERRIFLE", "WEAPON_HEAVYSNIPER", "WEAPON_GRENADELAUNCHER", "WEAPON_GRENADELAUNCHER_SMOKE",
1161
		"WEAPON_RPG", "WEAPON_MINIGUN", "WEAPON_GRENADE", "WEAPON_STICKYBOMB", "WEAPON_SMOKEGRENADE", "WEAPON_BZGAS",
1162
		"WEAPON_MOLOTOV", "WEAPON_FIREEXTINGUISHER", "WEAPON_PETROLCAN",
1163
		"WEAPON_SNSPISTOL", "WEAPON_SPECIALCARBINE", "WEAPON_HEAVYPISTOL", "WEAPON_BULLPUPRIFLE", "WEAPON_HOMINGLAUNCHER",
1164
		"WEAPON_PROXMINE", "WEAPON_SNOWBALL", "WEAPON_VINTAGEPISTOL", "WEAPON_DAGGER", "WEAPON_FIREWORK", "WEAPON_MUSKET",
1165
		"WEAPON_MARKSMANRIFLE", "WEAPON_HEAVYSHOTGUN", "WEAPON_GUSENBERG", "WEAPON_HATCHET", "WEAPON_RAILGUN",
1166
		"WEAPON_COMBATPDW", "WEAPON_KNUCKLE", "WEAPON_MARKSMANPISTOL",
1167
		"WEAPON_FLASHLIGHT", "WEAPON_MACHETE", "WEAPON_MACHINEPISTOL",
1168
		"WEAPON_SWITCHBLADE", "WEAPON_REVOLVER"
1169
	};
1170
1171
	DWORD waitTime = 150;
1172
	while (true)
1173
	{
1174
		// timed menu draw, used for pause after active line switch
1175
		DWORD maxTickCount = GetTickCount() + waitTime;
1176
		do 
1177
		{
1178
			// draw menu
1179
			draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
1180
			for (int i = 0; i < lineCount; i++)
1181
				if (i != activeLineIndexWeapon)
1182
					draw_menu_line(line_as_str(lines[i].text, lines[i].pState), 
1183
								   lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
1184
			draw_menu_line(line_as_str(lines[activeLineIndexWeapon].text, lines[activeLineIndexWeapon].pState), 
1185
						   lineWidth + 1.0, 11.0, 56.0 + activeLineIndexWeapon * 36.0, 0.0, 7.0, true, false);
1186
1187
			update_features();
1188
			WAIT(0);
1189
		} while (GetTickCount() < maxTickCount);
1190
		waitTime = 0;
1191
1192
		// process buttons
1193
		bool bSelect, bBack, bUp, bDown;
1194
		get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
1195
		if (bSelect)
1196
		{
1197
			menu_beep();
1198
1199
			// common variables
1200
			BOOL bPlayerExists = ENTITY::DOES_ENTITY_EXIST(PLAYER::PLAYER_PED_ID());
1201
			Player player = PLAYER::PLAYER_ID();
1202
			Ped playerPed = PLAYER::PLAYER_PED_ID();
1203
1204
			switch (activeLineIndexWeapon)
1205
			{
1206
				case 0:
1207
					for (int i = 0; i < sizeof(weaponNames) / sizeof(weaponNames[0]); i++)
1208
						WEAPON::GIVE_DELAYED_WEAPON_TO_PED(playerPed, GAMEPLAY::GET_HASH_KEY((char *)weaponNames[i]), 1000, 0);
1209
					set_status_text("all weapon added");
1210
					break;
1211
				// switchable features
1212
				default:
1213
					if (lines[activeLineIndexWeapon].pState)
1214
						*lines[activeLineIndexWeapon].pState = !(*lines[activeLineIndexWeapon].pState);
1215
					if (lines[activeLineIndexWeapon].pUpdated)
1216
						*lines[activeLineIndexWeapon].pUpdated = true;					
1217
			}
1218
			waitTime = 200;
1219
		} else
1220
		if (bBack || trainer_switch_pressed())
1221
		{
1222
			menu_beep();
1223
			break;
1224
		} else
1225
		if (bUp)
1226
		{
1227
			menu_beep();
1228
			if (activeLineIndexWeapon == 0) 
1229
				activeLineIndexWeapon = lineCount;
1230
			activeLineIndexWeapon--;
1231
			waitTime = 150;
1232
		} else
1233
		if (bDown)
1234
		{
1235
			menu_beep();
1236
			activeLineIndexWeapon++;
1237
			if (activeLineIndexWeapon == lineCount) 
1238
				activeLineIndexWeapon = 0;			
1239
			waitTime = 150;
1240
		}
1241
	}
1242
}
1243
1244
LPCSTR vehicleModels[40][10] = {
1245
	{"NINEF", "NINEF2", "BLISTA", "ASEA", "ASEA2", "BOATTRAILER", "BUS", "ARMYTANKER", "ARMYTRAILER", "ARMYTRAILER2"},
1246
	{"SUNTRAP", "COACH", "AIRBUS", "ASTEROPE", "AIRTUG", "AMBULANCE", "BARRACKS", "BARRACKS2", "BALLER", "BALLER2"},
1247
	{"BJXL", "BANSHEE", "BENSON", "BFINJECTION", "BIFF", "BLAZER", "BLAZER2", "BLAZER3", "BISON", "BISON2"},
1248
	{"BISON3", "BOXVILLE", "BOXVILLE2", "BOXVILLE3", "BOBCATXL", "BODHI2", "BUCCANEER", "BUFFALO", "BUFFALO2", "BULLDOZER"},
1249
	{"BULLET", "BLIMP", "BURRITO", "BURRITO2", "BURRITO3", "BURRITO4", "BURRITO5", "CAVALCADE", "CAVALCADE2", "POLICET"},
1250
	{"GBURRITO", "CABLECAR", "CADDY", "CADDY2", "CAMPER", "CARBONIZZARE", "CHEETAH", "COMET2", "COGCABRIO", "COQUETTE"},
1251
	{"CUTTER", "GRESLEY", "DILETTANTE", "DILETTANTE2", "DUNE", "DUNE2", "HOTKNIFE", "DLOADER", "DUBSTA", "DUBSTA2"},
1252
	{"DUMP", "RUBBLE", "DOCKTUG", "DOMINATOR", "EMPEROR", "EMPEROR2", "EMPEROR3", "ENTITYXF", "EXEMPLAR", "ELEGY2"},
1253
	{"F620", "FBI", "FBI2", "FELON", "FELON2", "FELTZER2", "FIRETRUK", "FLATBED", "FORKLIFT", "FQ2"},
1254
	{"FUSILADE", "FUGITIVE", "FUTO", "GRANGER", "GAUNTLET", "HABANERO", "HAULER", "HANDLER", "INFERNUS", "INGOT"},
1255
	{"INTRUDER", "ISSI2", "JACKAL", "JOURNEY", "JB700", "KHAMELION", "LANDSTALKER", "LGUARD", "MANANA", "MESA"},
1256
	{"MESA2", "MESA3", "CRUSADER", "MINIVAN", "MIXER", "MIXER2", "MONROE", "MOWER", "MULE", "MULE2"},
1257
	{"ORACLE", "ORACLE2", "PACKER", "PATRIOT", "PBUS", "PENUMBRA", "PEYOTE", "PHANTOM", "PHOENIX", "PICADOR"},
1258
	{"POUNDER", "POLICE", "POLICE4", "POLICE2", "POLICE3", "POLICEOLD1", "POLICEOLD2", "PONY", "PONY2", "PRAIRIE"},
1259
	{"PRANGER", "PREMIER", "PRIMO", "PROPTRAILER", "RANCHERXL", "RANCHERXL2", "RAPIDGT", "RAPIDGT2", "RADI", "RATLOADER"},
1260
	{"REBEL", "REGINA", "REBEL2", "RENTALBUS", "RUINER", "RUMPO", "RUMPO2", "RHINO", "RIOT", "RIPLEY"},
1261
	{"ROCOTO", "ROMERO", "SABREGT", "SADLER", "SADLER2", "SANDKING", "SANDKING2", "SCHAFTER2", "SCHWARZER", "SCRAP"},
1262
	{"SEMINOLE", "SENTINEL", "SENTINEL2", "ZION", "ZION2", "SERRANO", "SHERIFF", "SHERIFF2", "SPEEDO", "SPEEDO2"},
1263
	{"STANIER", "STINGER", "STINGERGT", "STOCKADE", "STOCKADE3", "STRATUM", "SULTAN", "SUPERD", "SURANO", "SURFER"},
1264
	{"SURFER2", "SURGE", "TACO", "TAILGATER", "TAXI", "TRASH", "TRACTOR", "TRACTOR2", "TRACTOR3", "GRAINTRAILER"},
1265
	{"BALETRAILER", "TIPTRUCK", "TIPTRUCK2", "TORNADO", "TORNADO2", "TORNADO3", "TORNADO4", "TOURBUS", "TOWTRUCK", "TOWTRUCK2"},
1266
	{"UTILLITRUCK", "UTILLITRUCK2", "UTILLITRUCK3", "VOODOO2", "WASHINGTON", "STRETCH", "YOUGA", "ZTYPE", "SANCHEZ", "SANCHEZ2"},
1267
	{"SCORCHER", "TRIBIKE", "TRIBIKE2", "TRIBIKE3", "FIXTER", "CRUISER", "BMX", "POLICEB", "AKUMA", "CARBONRS"},
1268
	{"BAGGER", "BATI", "BATI2", "RUFFIAN", "DAEMON", "DOUBLE", "PCJ", "VADER", "VIGERO", "FAGGIO2"},
1269
	{"HEXER", "ANNIHILATOR", "BUZZARD", "BUZZARD2", "CARGOBOB", "CARGOBOB2", "CARGOBOB3", "SKYLIFT", "POLMAV", "MAVERICK"},
1270
	{"NEMESIS", "FROGGER", "FROGGER2", "CUBAN800", "DUSTER", "STUNT", "MAMMATUS", "JET", "SHAMAL", "LUXOR"},
1271
	{"TITAN", "LAZER", "CARGOPLANE", "SQUALO", "MARQUIS", "DINGHY", "DINGHY2", "JETMAX", "PREDATOR", "TROPIC"},
1272
	{"SEASHARK", "SEASHARK2", "SUBMERSIBLE", "TRAILERS", "TRAILERS2", "TRAILERS3", "TVTRAILER", "RAKETRAILER", "TANKER", "TRAILERLOGS"},
1273
	{"TR2", "TR3", "TR4", "TRFLAT", "TRAILERSMALL", "VELUM", "ADDER", "VOLTIC", "VACCA", "BIFTA"},
1274
	{ "SPEEDER", "PARADISE", "KALAHARI", "JESTER", "TURISMOR", "VESTRA", "ALPHA", "HUNTLEY", "THRUST", "MASSACRO" },
1275
	{ "MASSACRO2", "ZENTORNO", "BLADE", "GLENDALE", "PANTO", "PIGALLE", "WARRENER", "RHAPSODY", "DUBSTA3", "MONSTER" },
1276
	{ "SOVEREIGN", "INNOVATION", "HAKUCHOU", "FUROREGT", "MILJET", "COQUETTE2", "BTYPE", "BUFFALO3", "DOMINATOR2", "GAUNTLET2" },
1277
	{ "MARSHALL", "DUKES", "DUKES2", "STALION", "STALION2", "BLISTA2", "BLISTA3", "DODO", "SUBMERSIBLE2", "HYDRA" },
1278
	{ "INSURGENT", "INSURGENT2", "TECHNICAL", "SAVAGE", "VALKYRIE", "KURUMA", "KURUMA2", "JESTER2", "CASCO", "VELUM2" },
1279
	{ "GUARDIAN", "ENDURO", "LECTRO", "SLAMVAN", "SLAMVAN2", "RATLOADER2", "SWIFT2", "LUXOR2", "FELTZER3", "OSIRIS" },
1280
	{ "VIRGO", "WINDSOR", "BESRA", "SWIFT", "BLIMP2", "VINDICATOR", "TORO", "T20", "COQUETTE3", "CHINO" },
1281
	{ "BRAWLER", "BUCCANEER2", "CHINO2", "FACTION", "FACTION2", "MOONBEAM", "MOONBEAM2", "PRIMO2", "VOODOO", "LURCHER" },
1282
	{ "BTYPE2", "BALLER3", "BALLER4", "BALLER5", "BALLER6", "CARGOBOB4", "COG55", "COG552", "COGNOSCENTI", "COGNOSCENTI2" },
1283
	{ "DINGHY4", "LIMO2", "MAMBA", "NIGHTSHADE", "SCHAFTER3", "SCHAFTER4", "SCHAFTER5", "SCHAFTER6", "SEASHARK3", "SPEEDER2" },
1284
	{ "SUPERVOLITO", "SUPERVOLITO2", "TORO2", "TROPIC2", "VALKYRIE2", "VERLIERER2", "TAMPA", "BANSHEE2", "SULTANRS", "BTYPE3" }
1285
};
1286
1287
int carspawnActiveLineIndex = 0;
1288
int carspawnActiveItemIndex = 0;
1289
1290
bool process_carspawn_menu()
1291
{
1292
	DWORD waitTime = 150;
1293
	const int lineCount = 40;
1294
	const int itemCount = 10;
1295
	const int itemCountLastLine = 10;
1296
	while (true)
1297
	{
1298
		// timed menu draw, used for pause after active line switch
1299
		DWORD maxTickCount = GetTickCount() + waitTime;
1300
		do 
1301
		{
1302
			// draw menu
1303
			char caption[32];
1304
			sprintf_s(caption, "CAR SPAWNER   %d / %d", carspawnActiveLineIndex + 1, lineCount);
1305
			draw_menu_line(caption, 350.0, 15.0, 18.0, 0.0, 5.0, false, true);
1306
			for (int i = 0; i < itemCount; i++)
1307
				if (strlen(vehicleModels[carspawnActiveLineIndex][i]))
1308
					draw_menu_line(vehicleModels[carspawnActiveLineIndex][i], 100.0, 5.0, 200.0, 100.0 + i * 110.0, 5.0, i == carspawnActiveItemIndex, false, false);
1309
			
1310
			update_features();
1311
			WAIT(0);
1312
		} while (GetTickCount() < maxTickCount);
1313
		waitTime = 0;
1314
1315
		bool bSelect, bBack, bUp, bDown, bLeft, bRight;
1316
		get_button_state(&bSelect, &bBack, &bUp, &bDown, &bLeft, &bRight);
1317
		
1318
		if (bSelect)
1319
		{
1320
			menu_beep();
1321
			LPCSTR modelName = vehicleModels[carspawnActiveLineIndex][carspawnActiveItemIndex];
1322
			DWORD model = GAMEPLAY::GET_HASH_KEY((char *)modelName);
1323
			if (STREAMING::IS_MODEL_IN_CDIMAGE(model) && STREAMING::IS_MODEL_A_VEHICLE(model))
1324
			{
1325
				STREAMING::REQUEST_MODEL(model);				
1326
				while (!STREAMING::HAS_MODEL_LOADED(model)) WAIT(0);
1327
				Vector3 coords = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER::PLAYER_PED_ID(), 0.0, 5.0, 0.0);
1328
				Vehicle veh = VEHICLE::CREATE_VEHICLE(model, coords.x, coords.y, coords.z, 0.0, 1, 1);
1329
				VEHICLE::SET_VEHICLE_ON_GROUND_PROPERLY(veh);
1330
1331
				if (featureVehWrapInSpawned)
1332
				{
1333
					ENTITY::SET_ENTITY_HEADING(veh, ENTITY::GET_ENTITY_HEADING(PLAYER::PLAYER_PED_ID()));
1334
					PED::SET_PED_INTO_VEHICLE(PLAYER::PLAYER_PED_ID(), veh, -1);
1335
				}
1336
1337
				WAIT(0);
1338
				STREAMING::SET_MODEL_AS_NO_LONGER_NEEDED(model);
1339
				ENTITY::SET_VEHICLE_AS_NO_LONGER_NEEDED(&veh);
1340
1341
				char statusText[32];
1342
				sprintf_s(statusText, "%s spawned", modelName);
1343
				set_status_text(statusText);
1344
1345
				return true;
1346
			}
1347
		} else
1348
		if (bBack)
1349
		{
1350
			menu_beep();
1351
			break;
1352
		} else
1353
		if (bRight)
1354
		{
1355
			menu_beep();
1356
			carspawnActiveItemIndex++;
1357
			int itemsMax = (carspawnActiveLineIndex == (lineCount - 1)) ? itemCountLastLine : itemCount;
1358
			if (carspawnActiveItemIndex == itemsMax) 
1359
				carspawnActiveItemIndex = 0;			
1360
			waitTime = 100;
1361
		} else
1362
		if (bLeft)
1363
		{
1364
			menu_beep();
1365
			if (carspawnActiveItemIndex == 0) 
1366
				carspawnActiveItemIndex = (carspawnActiveLineIndex == (lineCount - 1)) ? itemCountLastLine : itemCount;
1367
			carspawnActiveItemIndex--;
1368
			waitTime = 100;
1369
		} else
1370
		if (bUp)
1371
		{
1372
			menu_beep();
1373
			if (carspawnActiveLineIndex == 0) 
1374
				carspawnActiveLineIndex = lineCount;
1375
			carspawnActiveLineIndex--;
1376
			waitTime = 200;
1377
		} else
1378
		if (bDown)
1379
		{
1380
			menu_beep();
1381
			carspawnActiveLineIndex++;
1382
			if (carspawnActiveLineIndex == lineCount) 
1383
				carspawnActiveLineIndex = 0;			
1384
			waitTime = 200;
1385
		}
1386
		if (carspawnActiveLineIndex == (lineCount - 1))
1387
			if (carspawnActiveItemIndex >= itemCountLastLine)
1388
				carspawnActiveItemIndex = 0;
1389
	}
1390
	return false;
1391
}
1392
1393
int activeLineIndexVeh = 0;
1394
1395
void process_veh_menu()
1396
{
1397
	const float lineWidth = 250.0;
1398
	const int lineCount = 8;
1399
1400
	std::string caption = "VEHICLE  OPTIONS";
1401
1402
	static struct {
1403
		LPCSTR		text;
1404
		bool		*pState;
1405
		bool		*pUpdated;
1406
	} lines[lineCount] = {
1407
		{"CAR SPAWNER",		NULL, NULL},
1408
		{"PAINT RANDOM",	NULL, NULL},
1409
		{"FIX",				NULL, NULL},
1410
		{"SEAT BELT",		&featureVehSeatbelt, &featureVehSeatbeltUpdated},
1411
		{"WRAP IN SPAWNED",	&featureVehWrapInSpawned, NULL},
1412
		{"INVINCIBLE",		&featureVehInvincible, &featureVehInvincibleUpdated},
1413
		{"STRONG WHEELS",	&featureVehInvincibleWheels, &featureVehInvincibleWheelsUpdated},
1414
		{"SPEED BOOST",		&featureVehSpeedBoost, NULL}		
1415
	};
1416
1417
	DWORD waitTime = 150;
1418
	while (true)
1419
	{
1420
		// timed menu draw, used for pause after active line switch
1421
		DWORD maxTickCount = GetTickCount() + waitTime;
1422
		do 
1423
		{
1424
			// draw menu
1425
			draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
1426
			for (int i = 0; i < lineCount; i++)
1427
				if (i != activeLineIndexVeh)
1428
					draw_menu_line(line_as_str(lines[i].text, lines[i].pState), 
1429
								   lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
1430
			draw_menu_line(line_as_str(lines[activeLineIndexVeh].text, lines[activeLineIndexVeh].pState), 
1431
						   lineWidth + 1.0, 11.0, 56.0 + activeLineIndexVeh * 36.0, 0.0, 7.0, true, false);
1432
1433
			update_features();
1434
			WAIT(0);
1435
		} while (GetTickCount() < maxTickCount);
1436
		waitTime = 0;
1437
1438
		// process buttons
1439
		bool bSelect, bBack, bUp, bDown;
1440
		get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
1441
		if (bSelect)
1442
		{
1443
			menu_beep();
1444
1445
			// common variables
1446
			BOOL bPlayerExists = ENTITY::DOES_ENTITY_EXIST(PLAYER::PLAYER_PED_ID());
1447
			Player player = PLAYER::PLAYER_ID();
1448
			Ped playerPed = PLAYER::PLAYER_PED_ID();
1449
1450
			switch (activeLineIndexVeh)
1451
			{
1452
				case 0:
1453
					if (process_carspawn_menu()) return;				
1454
					break;
1455
				case 1:
1456
					if (bPlayerExists) 
1457
					{
1458
						if (PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
1459
						{
1460
							Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
1461
							VEHICLE::SET_VEHICLE_CUSTOM_PRIMARY_COLOUR(veh, rand() % 255, rand() % 255, rand() % 255);
1462
							if (VEHICLE::GET_IS_VEHICLE_PRIMARY_COLOUR_CUSTOM(veh))
1463
								VEHICLE::SET_VEHICLE_CUSTOM_SECONDARY_COLOUR(veh, rand() % 255, rand() % 255, rand() % 255);
1464
						} else
1465
						{
1466
							set_status_text("player isn't in a vehicle");
1467
						}
1468
					}
1469
					break;
1470
				case 2:
1471
					if (bPlayerExists) 
1472
						if (PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
1473
							VEHICLE::SET_VEHICLE_FIXED(PED::GET_VEHICLE_PED_IS_USING(playerPed));
1474
						else
1475
							set_status_text("player isn't in a vehicle");
1476
					break;
1477
				// switchable features
1478
				default:
1479
					if (lines[activeLineIndexVeh].pState)
1480
						*lines[activeLineIndexVeh].pState = !(*lines[activeLineIndexVeh].pState);
1481
					if (lines[activeLineIndexVeh].pUpdated)
1482
						*lines[activeLineIndexVeh].pUpdated = true;					
1483
			}
1484
			waitTime = 200;
1485
		} else
1486
		if (bBack || trainer_switch_pressed())
1487
		{
1488
			menu_beep();
1489
			break;
1490
		} else
1491
		if (bUp)
1492
		{
1493
			menu_beep();
1494
			if (activeLineIndexVeh == 0) 
1495
				activeLineIndexVeh = lineCount;
1496
			activeLineIndexVeh--;
1497
			waitTime = 150;
1498
		} else
1499
		if (bDown)
1500
		{
1501
			menu_beep();
1502
			activeLineIndexVeh++;
1503
			if (activeLineIndexVeh == lineCount) 
1504
				activeLineIndexVeh = 0;			
1505
			waitTime = 150;
1506
		}
1507
	}
1508
}
1509
1510
int activeLineIndexWorld = 0;
1511
1512
void process_world_menu()
1513
{
1514
	const float lineWidth = 250.0;
1515
	const int lineCount = 5;
1516
1517
	std::string caption = "WORLD  OPTIONS";
1518
1519
	static struct {
1520
		LPCSTR		text;
1521
		bool		*pState;
1522
		bool		*pUpdated;
1523
	} lines[lineCount] = {
1524
		{"MOON GRAVITY",	&featureWorldMoonGravity,	NULL},
1525
		{"RANDOM COPS",		&featureWorldRandomCops,	NULL},
1526
		{"RANDOM TRAINS",	&featureWorldRandomTrains,	NULL},
1527
		{"RANDOM BOATS",	&featureWorldRandomBoats,	NULL},
1528
		{"GARBAGE TRUCKS",	&featureWorldGarbageTrucks,	NULL}
1529
	};
1530
1531
	DWORD waitTime = 150;
1532
	while (true)
1533
	{
1534
		// timed menu draw, used for pause after active line switch
1535
		DWORD maxTickCount = GetTickCount() + waitTime;
1536
		do 
1537
		{
1538
			// draw menu
1539
			draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
1540
			for (int i = 0; i < lineCount; i++)
1541
				if (i != activeLineIndexWorld)
1542
					draw_menu_line(line_as_str(lines[i].text, lines[i].pState), 
1543
					lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
1544
			draw_menu_line(line_as_str(lines[activeLineIndexWorld].text, lines[activeLineIndexWorld].pState), 
1545
				lineWidth + 1.0, 11.0, 56.0 + activeLineIndexWorld * 36.0, 0.0, 7.0, true, false);
1546
1547
			update_features();
1548
			WAIT(0);
1549
		} while (GetTickCount() < maxTickCount);
1550
		waitTime = 0;
1551
1552
		// process buttons
1553
		bool bSelect, bBack, bUp, bDown;
1554
		get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
1555
		if (bSelect)
1556
		{
1557
			menu_beep();
1558
			switch (activeLineIndexWorld)
1559
			{
1560
				case 0: 
1561
					featureWorldMoonGravity = !featureWorldMoonGravity;
1562
					GAMEPLAY::SET_GRAVITY_LEVEL(featureWorldMoonGravity ? 2 : 0);
1563
					break;
1564
				case 1: 
1565
					// featureWorldRandomCops being set in update_features
1566
					PED::SET_CREATE_RANDOM_COPS(!featureWorldRandomCops);
1567
					break;
1568
				case 2:
1569
					featureWorldRandomTrains = !featureWorldRandomTrains;
1570
					VEHICLE::SET_RANDOM_TRAINS(featureWorldRandomTrains);
1571
					break;
1572
				case 3:
1573
					featureWorldRandomBoats = !featureWorldRandomBoats;
1574
					VEHICLE::SET_RANDOM_BOATS(featureWorldRandomBoats);
1575
					break;
1576
				case 4:
1577
					featureWorldGarbageTrucks = !featureWorldGarbageTrucks;
1578
					VEHICLE::SET_GARBAGE_TRUCKS(featureWorldGarbageTrucks);
1579
					break;
1580
			}
1581
			waitTime = 200;
1582
		} else
1583
		if (bBack || trainer_switch_pressed())
1584
		{
1585
			menu_beep();
1586
			break;
1587
		} else
1588
		if (bUp)
1589
		{
1590
			menu_beep();
1591
			if (activeLineIndexWorld == 0) 
1592
				activeLineIndexWorld = lineCount;
1593
			activeLineIndexWorld--;
1594
			waitTime = 150;
1595
		} else
1596
		if (bDown)
1597
		{
1598
			menu_beep();
1599
			activeLineIndexWorld++;
1600
			if (activeLineIndexWorld == lineCount) 
1601
				activeLineIndexWorld = 0;			
1602
			waitTime = 150;
1603
		}
1604
	}
1605
}
1606
1607
int activeLineIndexTime = 0;
1608
1609
void process_time_menu()
1610
{
1611
	const float lineWidth = 250.0;
1612
	const int lineCount = 4;
1613
1614
	std::string caption = "TIME  OPTIONS";
1615
1616
	static struct {
1617
		LPCSTR		text;
1618
		bool		*pState;
1619
		bool		*pUpdated;
1620
	} lines[lineCount] = {
1621
		{"HOUR FORWARD",	 NULL,				 NULL},
1622
		{"HOUR BACKWARD",	 NULL,				 NULL},
1623
		{"CLOCK PAUSED",	 &featureTimePaused, &featureTimePausedUpdated},
1624
		{"SYNC WITH SYSTEM", &featureTimeSynced, NULL}
1625
	};
1626
1627
	DWORD waitTime = 150;
1628
	while (true)
1629
	{
1630
		// timed menu draw, used for pause after active line switch
1631
		DWORD maxTickCount = GetTickCount() + waitTime;
1632
		do 
1633
		{
1634
			// draw menu
1635
			draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
1636
			for (int i = 0; i < lineCount; i++)
1637
				if (i != activeLineIndexTime)
1638
					draw_menu_line(line_as_str(lines[i].text, lines[i].pState), 
1639
					lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
1640
			draw_menu_line(line_as_str(lines[activeLineIndexTime].text, lines[activeLineIndexTime].pState), 
1641
				lineWidth + 1.0, 11.0, 56.0 + activeLineIndexTime * 36.0, 0.0, 7.0, true, false);
1642
1643
			update_features();
1644
			WAIT(0);
1645
		} while (GetTickCount() < maxTickCount);
1646
		waitTime = 0;
1647
1648
		// process buttons
1649
		bool bSelect, bBack, bUp, bDown;
1650
		get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
1651
		if (bSelect)
1652
		{
1653
			menu_beep();
1654
			switch (activeLineIndexTime)
1655
			{
1656
			// hour forward/backward
1657
			case 0: 
1658
			case 1:
1659
				{
1660
					int h = TIME::GET_CLOCK_HOURS();
1661
					if (activeLineIndexTime == 0) h = (h == 23) ? 0 : h + 1; else h = (h == 0) ? 23 : h - 1;
1662
					int m = TIME::GET_CLOCK_MINUTES();
1663
					TIME::SET_CLOCK_TIME(h, m, 0);
1664
					char text[32];
1665
					sprintf_s(text, "time %d:%d", h, m);
1666
					set_status_text(text);
1667
				}
1668
				break;
1669
			// switchable features
1670
			default:
1671
				if (lines[activeLineIndexTime].pState)
1672
					*lines[activeLineIndexTime].pState = !(*lines[activeLineIndexTime].pState);
1673
				if (lines[activeLineIndexTime].pUpdated)
1674
					*lines[activeLineIndexTime].pUpdated = true;	
1675
			}
1676
			waitTime = 200;
1677
		} else
1678
		if (bBack || trainer_switch_pressed())
1679
		{
1680
			menu_beep();
1681
			break;
1682
		} else
1683
		if (bUp)
1684
		{
1685
			menu_beep();
1686
			if (activeLineIndexTime == 0) 
1687
				activeLineIndexTime = lineCount;
1688
			activeLineIndexTime--;
1689
			waitTime = 150;
1690
		} else
1691
		if (bDown)
1692
		{
1693
			menu_beep();
1694
			activeLineIndexTime++;
1695
			if (activeLineIndexTime == lineCount) 
1696
				activeLineIndexTime = 0;			
1697
			waitTime = 150;
1698
		}
1699
	}
1700
}
1701
1702
int activeLineIndexWeather = 0;
1703
1704
void process_weather_menu()
1705
{
1706
	const float lineWidth = 250.0;
1707
	const int lineCount = 16;
1708
1709
	std::string caption = "WEATHER  OPTIONS";
1710
1711
	static struct {
1712
		LPCSTR		text;
1713
		bool		*pState;
1714
		bool		*pUpdated;
1715
	} lines[lineCount] = {
1716
		{"WIND",	 	 &featureWeatherWind,	NULL},
1717
		{"SET PERSIST",  &featureWeatherPers,	NULL},
1718
		{"EXTRASUNNY",	 NULL,					NULL},
1719
		{"CLEAR",		 NULL,					NULL},
1720
		{"CLOUDS",		 NULL,					NULL},
1721
		{"SMOG",		 NULL,					NULL},
1722
		{"FOGGY",	 	 NULL,					NULL},
1723
		{"OVERCAST",	 NULL,					NULL},
1724
		{"RAIN",		 NULL,					NULL},
1725
		{"THUNDER",		 NULL,					NULL},
1726
		{"CLEARING",	 NULL,					NULL},
1727
		{"NEUTRAL",		 NULL,					NULL},
1728
		{"SNOW",		 NULL,					NULL},
1729
		{"BLIZZARD",	 NULL,					NULL},
1730
		{"SNOWLIGHT",	 NULL,					NULL},
1731
		{"XMAS",		 NULL,					NULL}
1732
	};
1733
1734
1735
	DWORD waitTime = 150;
1736
	while (true)
1737
	{
1738
		// timed menu draw, used for pause after active line switch
1739
		DWORD maxTickCount = GetTickCount() + waitTime;
1740
		do 
1741
		{
1742
			// draw menu
1743
			draw_menu_line(caption, lineWidth, 7.0, 13.6, 5.0, 5.0, false, true);
1744
			for (int i = 0; i < lineCount; i++)
1745
				if (i != activeLineIndexWeather)
1746
					draw_menu_line(line_as_str(lines[i].text, lines[i].pState), 
1747
					lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
1748
			draw_menu_line(line_as_str(lines[activeLineIndexWeather].text, lines[activeLineIndexWeather].pState), 
1749
				lineWidth + 1.0, 11.0, 56.0 + activeLineIndexWeather * 36.0, 0.0, 7.0, true, false);
1750
1751
			update_features();
1752
			WAIT(0);
1753
		} while (GetTickCount() < maxTickCount);
1754
		waitTime = 0;
1755
1756
		// process buttons
1757
		bool bSelect, bBack, bUp, bDown;
1758
		get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
1759
		if (bSelect)
1760
		{
1761
			menu_beep();
1762
			switch (activeLineIndexWeather)
1763
			{
1764
			// wind
1765
			case 0: 
1766
				featureWeatherWind = !featureWeatherWind;
1767
				if (featureWeatherWind)
1768
				{
1769
					GAMEPLAY::SET_WIND(1.0);
1770
					GAMEPLAY::SET_WIND_SPEED(11.99);
1771
					GAMEPLAY::SET_WIND_DIRECTION(ENTITY::GET_ENTITY_HEADING(PLAYER::PLAYER_PED_ID()));
1772
				} else
1773
				{
1774
					GAMEPLAY::SET_WIND(0.0);
1775
					GAMEPLAY::SET_WIND_SPEED(0.0);
1776
				}
1777
				break;
1778
			// set persist
1779
			case 1:
1780
				featureWeatherPers = !featureWeatherPers;
1781
				break;
1782
			// set weather
1783
			default:
1784
				GAMEPLAY::CLEAR_OVERRIDE_WEATHER();
1785
				if (featureWeatherPers)
1786
				{
1787
					GAMEPLAY::SET_OVERRIDE_WEATHER((char *)lines[activeLineIndexWeather].text);
1788
				}
1789
				else
1790
				{
1791
					GAMEPLAY::SET_WEATHER_TYPE_NOW_PERSIST((char *)lines[activeLineIndexWeather].text);
1792
					GAMEPLAY::CLEAR_WEATHER_TYPE_PERSIST();
1793
				}				
1794
				set_status_text(lines[activeLineIndexWeather].text);
1795
			}
1796
			waitTime = 200;
1797
		} else
1798
		if (bBack || trainer_switch_pressed())
1799
		{
1800
			menu_beep();
1801
			break;
1802
		} else
1803
		if (bUp)
1804
		{
1805
			menu_beep();
1806
			if (activeLineIndexWeather == 0) 
1807
				activeLineIndexWeather = lineCount;
1808
			activeLineIndexWeather--;
1809
			waitTime = 150;
1810
		} else
1811
		if (bDown)
1812
		{
1813
			menu_beep();
1814
			activeLineIndexWeather++;
1815
			if (activeLineIndexWeather == lineCount) 
1816
				activeLineIndexWeather = 0;			
1817
			waitTime = 150;
1818
		}
1819
	}
1820
}
1821
1822
int activeLineIndexMisc = 0;
1823
1824
void process_misc_menu()
1825
{
1826
	const float lineWidth = 250.0;
1827
	const int lineCount = 2;
1828
1829
	std::string caption = "MISC  OPTIONS";
1830
1831
	static struct {
1832
		LPCSTR		text;
1833
		bool		*pState;
1834
		bool		*pUpdated;
1835
	} lines[lineCount] = {
1836
		{"NEXT RADIO TRACK",	NULL,					NULL},
1837
		{"HIDE HUD",			&featureMiscHideHud,	NULL}		
1838
	};
1839
1840
1841
	DWORD waitTime = 150;
1842
	while (true)
1843
	{
1844
		// timed menu draw, used for pause after active line switch
1845
		DWORD maxTickCount = GetTickCount() + waitTime;
1846
		do 
1847
		{
1848
			// draw menu
1849
			draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);
1850
			for (int i = 0; i < lineCount; i++)
1851
				if (i != activeLineIndexMisc)
1852
					draw_menu_line(line_as_str(lines[i].text, lines[i].pState), 
1853
					lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
1854
			draw_menu_line(line_as_str(lines[activeLineIndexMisc].text, lines[activeLineIndexMisc].pState), 
1855
				lineWidth + 1.0, 11.0, 56.0 + activeLineIndexMisc * 36.0, 0.0, 7.0, true, false);
1856
1857
			update_features();
1858
			WAIT(0);
1859
		} while (GetTickCount() < maxTickCount);
1860
		waitTime = 0;
1861
1862
		// process buttons
1863
		bool bSelect, bBack, bUp, bDown;
1864
		get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
1865
		if (bSelect)
1866
		{
1867
			menu_beep();
1868
			switch (activeLineIndexMisc)
1869
			{
1870
			// next radio track
1871
			case 0: 
1872
				if (ENTITY::DOES_ENTITY_EXIST(PLAYER::PLAYER_PED_ID()) && 
1873
					PED::IS_PED_IN_ANY_VEHICLE(PLAYER::PLAYER_PED_ID(), 0))
1874
						AUDIO::SKIP_RADIO_FORWARD();
1875
				break;
1876
			// switchable features
1877
			default:
1878
				if (lines[activeLineIndexMisc].pState)
1879
					*lines[activeLineIndexMisc].pState = !(*lines[activeLineIndexMisc].pState);
1880
				if (lines[activeLineIndexMisc].pUpdated)
1881
					*lines[activeLineIndexMisc].pUpdated = true;
1882
			}
1883
			waitTime = 200;
1884
		} else
1885
		if (bBack || trainer_switch_pressed())
1886
		{
1887
			menu_beep();
1888
			break;
1889
		} else
1890
		if (bUp)
1891
		{
1892
			menu_beep();
1893
			if (activeLineIndexMisc == 0) 
1894
				activeLineIndexMisc = lineCount;
1895
			activeLineIndexMisc--;
1896
			waitTime = 150;
1897
		} else
1898
		if (bDown)
1899
		{
1900
			menu_beep();
1901
			activeLineIndexMisc++;
1902
			if (activeLineIndexMisc == lineCount) 
1903
				activeLineIndexMisc = 0;			
1904
			waitTime = 150;
1905
		}
1906
	}
1907
}
1908
1909
int activeLineIndexMain = 0;
1910
1911
void process_main_menu()
1912
{
1913
	const float lineWidth = 300.0;
1914
	const int lineCount = 7;	
1915
1916
	std::string caption = "Crusaders Tutorial";
1917
1918
	static LPCSTR lineCaption[lineCount] = {
1919
		"Player Menu ~r~>>",
1920
		"Weapon Menu ~r~>>",
1921
		"Vehicle Menu ~r~>>",
1922
		"World Menu ~r~>>",
1923
		"Time Menu ~r~>>",
1924
		"Weather Menu ~r~>>",
1925
		"Misc Menu ~r~>>",
1926
	};
1927
1928
	DWORD waitTime = 150;
1929
	while (true)
1930
	{
1931
		// timed menu draw, used for pause after active line switch
1932
		DWORD maxTickCount = GetTickCount() + waitTime;
1933
		do 
1934
		{
1935
			
1936
			draw_menu_line(caption, lineWidth, 7.9, 14.0, 4.0, 4.0, false, true);   //If you use this design in a public menu, please credit me, The Crusader, for the design :)
1937
			for (int i = 0; i < lineCount; i++)
1938
				if (i != activeLineIndexMain)
1939
					draw_menu_line(lineCaption[i], lineWidth, 4.0, 60.0 + i * 22.8, 4.0, 9.0, false, false);
1940
1941
			draw_menu_line(lineCaption[activeLineIndexMain], lineWidth + 0.0, 2.0, 60.0 + activeLineIndexMain * 22.9, 4.0, 7.0, true, false);
1942
1943
			update_features();
1944
			WAIT(0);
1945
		} while (GetTickCount() < maxTickCount);
1946
		waitTime = 0;
1947
1948
		// process buttons
1949
		bool bSelect, bBack, bUp, bDown;
1950
		get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);
1951
		if (bSelect)
1952
		{
1953
			menu_beep();
1954
			switch (activeLineIndexMain)
1955
			{
1956
				case 0:
1957
					process_player_menu();					
1958
					break;
1959
				case 1:
1960
					process_weapon_menu();
1961
					break;
1962
				case 2:
1963
					process_veh_menu();
1964
					break;
1965
				case 3:
1966
					process_world_menu();
1967
					break;
1968
				case 4:
1969
					process_time_menu();
1970
					break;
1971
				case 5:
1972
					process_weather_menu();
1973
					break;
1974
				case 6:
1975
					process_misc_menu();
1976
					break;
1977
			}
1978
			waitTime = 200;
1979
		} else
1980
		if (bBack || trainer_switch_pressed())
1981
		{
1982
			menu_beep();
1983
			break;
1984
		} else
1985
		if (bUp)
1986
		{
1987
			menu_beep();
1988
			if (activeLineIndexMain == 0) 
1989
				activeLineIndexMain = lineCount;
1990
			activeLineIndexMain--;
1991
			waitTime = 150;
1992
		} else
1993
		if (bDown)
1994
		{
1995
			menu_beep();
1996
			activeLineIndexMain++;
1997
			if (activeLineIndexMain == lineCount) 
1998
				activeLineIndexMain = 0;			
1999
			waitTime = 150;
2000
		}
2001
	}
2002
}
2003
2004
void reset_globals()
2005
{
2006
	activeLineIndexMain			=
2007
	activeLineIndexPlayer		=
2008
	skinchangerActiveLineIndex	=
2009
	skinchangerActiveItemIndex	=
2010
	teleportActiveLineIndex		=
2011
	activeLineIndexWeapon		=
2012
	activeLineIndexVeh			=
2013
	carspawnActiveLineIndex		=
2014
	carspawnActiveItemIndex		=
2015
	activeLineIndexWorld		=
2016
	activeLineIndexWeather		=	0;
2017
2018
	featurePlayerInvincible				=
2019
	featurePlayerInvincibleUpdated		=
2020
	featurePlayerNeverWanted			=
2021
2022
	featurePlayerIgnored				=
2023
	featurePlayerIgnoredUpdated			=
2024
	featurePlayerUnlimitedAbility		=
2025
	featurePlayerNoNoise				=
2026
	featurePlayerNoNoiseUpdated			=
2027
	featurePlayerFastSwim				=
2028
	featurePlayerFastSwimUpdated		=
2029
	featurePlayerFastRun				=
2030
	featurePlayerUltraJump              =
2031
	featurePlayerFastRunUpdated			=
2032
	featurePlayerSuperJump				=
2033
	featureWeaponNoReload				=
2034
	featureWeaponFireAmmo				=
2035
	featureWeaponExplosiveAmmo			=
2036
	featureWeaponExplosiveMelee			=
2037
	featureWeaponVehRockets				=
2038
	featureVehInvincible				=
2039
	featureVehInvincibleUpdated			=
2040
	featureVehInvincibleWheels			=
2041
	featureVehInvincibleWheelsUpdated	=
2042
	featureVehSeatbelt					=
2043
	featureVehSeatbeltUpdated			=
2044
	featureVehSpeedBoost				=
2045
	featureVehWrapInSpawned				=
2046
	featureWorldMoonGravity				=
2047
	featureTimePaused					=
2048
	featureTimePausedUpdated			=
2049
	featureTimeSynced					=
2050
	featureWeatherWind					=
2051
	featureWeatherPers					=
2052
	featureMiscLockRadio				=
2053
	featureMiscHideHud					=	false;
2054
2055
	featureWorldRandomCops		=
2056
	featureWorldRandomTrains	=
2057
	featureWorldRandomBoats		=
2058
	featureWorldGarbageTrucks	=	true;
2059
2060
	skinchanger_used			=	false;
2061
}
2062
2063
void main()
2064
{	
2065
	reset_globals();
2066
2067
	while (true)
2068
	{
2069
		if (trainer_switch_pressed())
2070
		{
2071
			menu_beep();
2072
			process_main_menu();
2073
		}
2074
2075
		update_features();		
2076
		WAIT(0);
2077
	}
2078
}
2079
2080
void ScriptMain()
2081
{
2082
	srand(GetTickCount());
2083
	main();
2084
}