View difference between Paste ID: 6ZExSqF1 and nJZQU6DU
SHOW: | | - or go back to the newest paste.
1
#include "script.h"
2
#include "keyboard.h"
3
#include <string>
4
#include <ctime>
5
#pragma warning(disable : 4244 4305) // double <-> float conversions
6
7
namespace SUB{enum{
8
// Define submenu (enum) indices here.
9
			CLOSED,
10
			MAINMENU,
11
			SETTINGS,
12
			SETTINGS_COLOURS,
13
			SETTINGS_COLOURS2,
14
			SETTINGS_FONTS,
15
			SETTINGS_FONTS2,
16
	// Others:
17
			SAMPLE,
18
			YOURSUB,
19
20
21
};};
22
namespace{
23
// Declare/Initialise global variables here.
24
char str[50];
25
bool controllerinput_bool = 1, menujustopened = 1, null;
26
enum ControllerInputs
27
{
28
	INPUT_NEXT_CAMERA = 0,
29
	INPUT_LOOK_LR = 1,
30
	INPUT_LOOK_UD = 2,
31
	INPUT_LOOK_UP_ONLY = 3,
32
	INPUT_LOOK_DOWN_ONLY = 4,
33
	INPUT_LOOK_LEFT_ONLY = 5,
34
	INPUT_LOOK_RIGHT_ONLY = 6,
35
	INPUT_CINEMATIC_SLOWMO = 7,
36
	INPUT_SCRIPTED_FLY_UD = 8,
37
	INPUT_SCRIPTED_FLY_LR = 9,
38
	INPUT_SCRIPTED_FLY_ZUP = 10,
39
	INPUT_SCRIPTED_FLY_ZDOWN = 11,
40
	INPUT_WEAPON_WHEEL_UD = 12,
41
	INPUT_WEAPON_WHEEL_LR = 13,
42
	INPUT_WEAPON_WHEEL_NEXT = 14,
43
	INPUT_WEAPON_WHEEL_PREV = 15,
44
	INPUT_SELECT_NEXT_WEAPON = 16,
45
	INPUT_SELECT_PREV_WEAPON = 17,
46
	INPUT_SKIP_CUTSCENE = 18,
47
	INPUT_CHARACTER_WHEEL = 19,
48
	INPUT_MULTIPLAYER_INFO = 20,
49
	INPUT_SPRINT = 21,
50
	INPUT_JUMP = 22,
51
	INPUT_ENTER = 23,
52
	INPUT_ATTACK = 24,
53
	INPUT_AIM = 25,
54
	INPUT_LOOK_BEHIND = 26,
55
	INPUT_PHONE = 27,
56
	INPUT_SPECIAL_ABILITY = 28,
57
	INPUT_SPECIAL_ABILITY_SECONDARY = 29,
58
	INPUT_MOVE_LR = 30,
59
	INPUT_MOVE_UD = 31,
60
	INPUT_MOVE_UP_ONLY = 32,
61
	INPUT_MOVE_DOWN_ONLY = 33,
62
	INPUT_MOVE_LEFT_ONLY = 34,
63
	INPUT_MOVE_RIGHT_ONLY = 35,
64
	INPUT_DUCK = 36,
65
	INPUT_SELECT_WEAPON = 37,
66
	INPUT_PICKUP = 38,
67
	INPUT_SNIPER_ZOOM = 39,
68
	INPUT_SNIPER_ZOOM_IN_ONLY = 40,
69
	INPUT_SNIPER_ZOOM_OUT_ONLY = 41,
70
	INPUT_SNIPER_ZOOM_IN_SECONDARY = 42,
71
	INPUT_SNIPER_ZOOM_OUT_SECONDARY = 43,
72
	INPUT_COVER = 44,
73
	INPUT_RELOAD = 45,
74
	INPUT_TALK = 46,
75
	INPUT_DETONATE = 47,
76
	INPUT_HUD_SPECIAL = 48,
77
	INPUT_ARREST = 49,
78
	INPUT_ACCURATE_AIM = 50,
79
	INPUT_CONTEXT = 51,
80
	INPUT_CONTEXT_SECONDARY = 52,
81
	INPUT_WEAPON_SPECIAL = 53,
82
	INPUT_WEAPON_SPECIAL_TWO = 54,
83
	INPUT_DIVE = 55,
84
	INPUT_DROP_WEAPON = 56,
85
	INPUT_DROP_AMMO = 57,
86
	INPUT_THROW_GRENADE = 58,
87
	INPUT_VEH_MOVE_LR = 59,
88
	INPUT_VEH_MOVE_UD = 60,
89
	INPUT_VEH_MOVE_UP_ONLY = 61,
90
	INPUT_VEH_MOVE_DOWN_ONLY = 62,
91
	INPUT_VEH_MOVE_LEFT_ONLY = 63,
92
	INPUT_VEH_MOVE_RIGHT_ONLY = 64,
93
	INPUT_VEH_SPECIAL = 65,
94
	INPUT_VEH_GUN_LR = 66,
95
	INPUT_VEH_GUN_UD = 67,
96
	INPUT_VEH_AIM = 68,
97
	INPUT_VEH_ATTACK = 69,
98
	INPUT_VEH_ATTACK2 = 70,
99
	INPUT_VEH_ACCELERATE = 71,
100
	INPUT_VEH_BRAKE = 72,
101
	INPUT_VEH_DUCK = 73,
102
	INPUT_VEH_HEADLIGHT = 74,
103
	INPUT_VEH_EXIT = 75,
104
	INPUT_VEH_HANDBRAKE = 76,
105
	INPUT_VEH_HOTWIRE_LEFT = 77,
106
	INPUT_VEH_HOTWIRE_RIGHT = 78,
107
	INPUT_VEH_LOOK_BEHIND = 79,
108
	INPUT_VEH_CIN_CAM = 80,
109
	INPUT_VEH_NEXT_RADIO = 81,
110
	INPUT_VEH_PREV_RADIO = 82,
111
	INPUT_VEH_NEXT_RADIO_TRACK = 83,
112
	INPUT_VEH_PREV_RADIO_TRACK = 84,
113
	INPUT_VEH_RADIO_WHEEL = 85,
114
	INPUT_VEH_HORN = 86,
115
	INPUT_VEH_FLY_THROTTLE_UP = 87,
116
	INPUT_VEH_FLY_THROTTLE_DOWN = 88,
117
	INPUT_VEH_FLY_YAW_LEFT = 89,
118
	INPUT_VEH_FLY_YAW_RIGHT = 90,
119
	INPUT_VEH_PASSENGER_AIM = 91,
120
	INPUT_VEH_PASSENGER_ATTACK = 92,
121
	INPUT_VEH_SPECIAL_ABILITY_FRANKLIN = 93,
122
	INPUT_VEH_STUNT_UD = 94,
123
	INPUT_VEH_CINEMATIC_UD = 95,
124
	INPUT_VEH_CINEMATIC_UP_ONLY = 96,
125
	INPUT_VEH_CINEMATIC_DOWN_ONLY = 97,
126
	INPUT_VEH_CINEMATIC_LR = 98,
127
	INPUT_VEH_SELECT_NEXT_WEAPON = 99,
128
	INPUT_VEH_SELECT_PREV_WEAPON = 100,
129
	INPUT_VEH_ROOF = 101,
130
	INPUT_VEH_JUMP = 102,
131
	INPUT_VEH_GRAPPLING_HOOK = 103,
132
	INPUT_VEH_SHUFFLE = 104,
133
	INPUT_VEH_DROP_PROJECTILE = 105,
134
	INPUT_VEH_MOUSE_CONTROL_OVERRIDE = 106,
135
	INPUT_VEH_FLY_ROLL_LR = 107,
136
	INPUT_VEH_FLY_ROLL_LEFT_ONLY = 108,
137
	INPUT_VEH_FLY_ROLL_RIGHT_ONLY = 109,
138
	INPUT_VEH_FLY_PITCH_UD = 110,
139
	INPUT_VEH_FLY_PITCH_UP_ONLY = 111,
140
	INPUT_VEH_FLY_PITCH_DOWN_ONLY = 112,
141
	INPUT_VEH_FLY_UNDERCARRIAGE = 113,
142
	INPUT_VEH_FLY_ATTACK = 114,
143
	INPUT_VEH_FLY_SELECT_NEXT_WEAPON = 115,
144
	INPUT_VEH_FLY_SELECT_PREV_WEAPON = 116,
145
	INPUT_VEH_FLY_SELECT_TARGET_LEFT = 117,
146
	INPUT_VEH_FLY_SELECT_TARGET_RIGHT = 118,
147
	INPUT_VEH_FLY_VERTICAL_FLIGHT_MODE = 119,
148
	INPUT_VEH_FLY_DUCK = 120,
149
	INPUT_VEH_FLY_ATTACK_CAMERA = 121,
150
	INPUT_VEH_FLY_MOUSE_CONTROL_OVERRIDE = 122,
151
	INPUT_VEH_SUB_TURN_LR = 123,
152
	INPUT_VEH_SUB_TURN_LEFT_ONLY = 124,
153
	INPUT_VEH_SUB_TURN_RIGHT_ONLY = 125,
154
	INPUT_VEH_SUB_PITCH_UD = 126,
155
	INPUT_VEH_SUB_PITCH_UP_ONLY = 127,
156
	INPUT_VEH_SUB_PITCH_DOWN_ONLY = 128,
157
	INPUT_VEH_SUB_THROTTLE_UP = 129,
158
	INPUT_VEH_SUB_THROTTLE_DOWN = 130,
159
	INPUT_VEH_SUB_ASCEND = 131,
160
	INPUT_VEH_SUB_DESCEND = 132,
161
	INPUT_VEH_SUB_TURN_HARD_LEFT = 133,
162
	INPUT_VEH_SUB_TURN_HARD_RIGHT = 134,
163
	INPUT_VEH_SUB_MOUSE_CONTROL_OVERRIDE = 135,
164
	INPUT_VEH_PUSHBIKE_PEDAL = 136,
165
	INPUT_VEH_PUSHBIKE_SPRINT = 137,
166
	INPUT_VEH_PUSHBIKE_FRONT_BRAKE = 138,
167
	INPUT_VEH_PUSHBIKE_REAR_BRAKE = 139,
168
	INPUT_MELEE_ATTACK_LIGHT = 140,
169
	INPUT_MELEE_ATTACK_HEAVY = 141,
170
	INPUT_MELEE_ATTACK_ALTERNATE = 142,
171
	INPUT_MELEE_BLOCK = 143,
172
	INPUT_PARACHUTE_DEPLOY = 144,
173
	INPUT_PARACHUTE_DETACH = 145,
174
	INPUT_PARACHUTE_TURN_LR = 146,
175
	INPUT_PARACHUTE_TURN_LEFT_ONLY = 147,
176
	INPUT_PARACHUTE_TURN_RIGHT_ONLY = 148,
177
	INPUT_PARACHUTE_PITCH_UD = 149,
178
	INPUT_PARACHUTE_PITCH_UP_ONLY = 150,
179
	INPUT_PARACHUTE_PITCH_DOWN_ONLY = 151,
180
	INPUT_PARACHUTE_BRAKE_LEFT = 152,
181
	INPUT_PARACHUTE_BRAKE_RIGHT = 153,
182
	INPUT_PARACHUTE_SMOKE = 154,
183
	INPUT_PARACHUTE_PRECISION_LANDING = 155,
184
	INPUT_MAP = 156,
185
	INPUT_SELECT_WEAPON_UNARMED = 157,
186
	INPUT_SELECT_WEAPON_MELEE = 158,
187
	INPUT_SELECT_WEAPON_HANDGUN = 159,
188
	INPUT_SELECT_WEAPON_SHOTGUN = 160,
189
	INPUT_SELECT_WEAPON_SMG = 161,
190
	INPUT_SELECT_WEAPON_AUTO_RIFLE = 162,
191
	INPUT_SELECT_WEAPON_SNIPER = 163,
192
	INPUT_SELECT_WEAPON_HEAVY = 164,
193
	INPUT_SELECT_WEAPON_SPECIAL = 165,
194
	INPUT_SELECT_CHARACTER_MICHAEL = 166,
195
	INPUT_SELECT_CHARACTER_FRANKLIN = 167,
196
	INPUT_SELECT_CHARACTER_TREVOR = 168,
197
	INPUT_SELECT_CHARACTER_MULTIPLAYER = 169,
198
	INPUT_SAVE_REPLAY_CLIP = 170,
199
	INPUT_SPECIAL_ABILITY_PC = 171,
200
	INPUT_CELLPHONE_UP = 172,
201
	INPUT_CELLPHONE_DOWN = 173,
202
	INPUT_CELLPHONE_LEFT = 174,
203
	INPUT_CELLPHONE_RIGHT = 175,
204
	INPUT_CELLPHONE_SELECT = 176,
205
	INPUT_CELLPHONE_CANCEL = 177,
206
	INPUT_CELLPHONE_OPTION = 178,
207
	INPUT_CELLPHONE_EXTRA_OPTION = 179,
208
	INPUT_CELLPHONE_SCROLL_FORWARD = 180,
209
	INPUT_CELLPHONE_SCROLL_BACKWARD = 181,
210
	INPUT_CELLPHONE_CAMERA_FOCUS_LOCK = 182,
211
	INPUT_CELLPHONE_CAMERA_GRID = 183,
212
	INPUT_CELLPHONE_CAMERA_SELFIE = 184,
213
	INPUT_CELLPHONE_CAMERA_DOF = 185,
214
	INPUT_CELLPHONE_CAMERA_EXPRESSION = 186,
215
	INPUT_FRONTEND_DOWN = 187,
216
	INPUT_FRONTEND_UP = 188,
217
	INPUT_FRONTEND_LEFT = 189,
218
	INPUT_FRONTEND_RIGHT = 190,
219
	INPUT_FRONTEND_RDOWN = 191,
220
	INPUT_FRONTEND_RUP = 192,
221
	INPUT_FRONTEND_RLEFT = 193,
222
	INPUT_FRONTEND_RRIGHT = 194,
223
	INPUT_FRONTEND_AXIS_X = 195,
224
	INPUT_FRONTEND_AXIS_Y = 196,
225
	INPUT_FRONTEND_RIGHT_AXIS_X = 197,
226
	INPUT_FRONTEND_RIGHT_AXIS_Y = 198,
227
	INPUT_FRONTEND_PAUSE = 199,
228
	INPUT_FRONTEND_PAUSE_ALTERNATE = 200,
229
	INPUT_FRONTEND_ACCEPT = 201,
230
	INPUT_FRONTEND_CANCEL = 202,
231
	INPUT_FRONTEND_X = 203,
232
	INPUT_FRONTEND_Y = 204,
233
	INPUT_FRONTEND_LB = 205,
234
	INPUT_FRONTEND_RB = 206,
235
	INPUT_FRONTEND_LT = 207,
236
	INPUT_FRONTEND_RT = 208,
237
	INPUT_FRONTEND_LS = 209,
238
	INPUT_FRONTEND_RS = 210,
239
	INPUT_FRONTEND_LEADERBOARD = 211,
240
	INPUT_FRONTEND_SOCIAL_CLUB = 212,
241
	INPUT_FRONTEND_SOCIAL_CLUB_SECONDARY = 213,
242
	INPUT_FRONTEND_DELETE = 214,
243
	INPUT_FRONTEND_ENDSCREEN_ACCEPT = 215,
244
	INPUT_FRONTEND_ENDSCREEN_EXPAND = 216,
245
	INPUT_FRONTEND_SELECT = 217,
246
	INPUT_SCRIPT_LEFT_AXIS_X = 218,
247
	INPUT_SCRIPT_LEFT_AXIS_Y = 219,
248
	INPUT_SCRIPT_RIGHT_AXIS_X = 220,
249
	INPUT_SCRIPT_RIGHT_AXIS_Y = 221,
250
	INPUT_SCRIPT_RUP = 222,
251
	INPUT_SCRIPT_RDOWN = 223,
252
	INPUT_SCRIPT_RLEFT = 224,
253
	INPUT_SCRIPT_RRIGHT = 225,
254
	INPUT_SCRIPT_LB = 226,
255
	INPUT_SCRIPT_RB = 227,
256
	INPUT_SCRIPT_LT = 228,
257
	INPUT_SCRIPT_RT = 229,
258
	INPUT_SCRIPT_LS = 230,
259
	INPUT_SCRIPT_RS = 231,
260
	INPUT_SCRIPT_PAD_UP = 232,
261
	INPUT_SCRIPT_PAD_DOWN = 233,
262
	INPUT_SCRIPT_PAD_LEFT = 234,
263
	INPUT_SCRIPT_PAD_RIGHT = 235,
264
	INPUT_SCRIPT_SELECT = 236,
265
	INPUT_CURSOR_ACCEPT = 237,
266
	INPUT_CURSOR_CANCEL = 238,
267
	INPUT_CURSOR_X = 239,
268
	INPUT_CURSOR_Y = 240,
269
	INPUT_CURSOR_SCROLL_UP = 241,
270
	INPUT_CURSOR_SCROLL_DOWN = 242,
271
	INPUT_ENTER_CHEAT_CODE = 243,
272
	INPUT_INTERACTION_MENU = 244,
273
	INPUT_MP_TEXT_CHAT_ALL = 245,
274
	INPUT_MP_TEXT_CHAT_TEAM = 246,
275
	INPUT_MP_TEXT_CHAT_FRIENDS = 247,
276
	INPUT_MP_TEXT_CHAT_CREW = 248,
277
	INPUT_PUSH_TO_TALK = 249,
278
	INPUT_CREATOR_LS = 250,
279
	INPUT_CREATOR_RS = 251,
280
	INPUT_CREATOR_LT = 252,
281
	INPUT_CREATOR_RT = 253,
282
	INPUT_CREATOR_MENU_TOGGLE = 254,
283
	INPUT_CREATOR_ACCEPT = 255,
284
	INPUT_CREATOR_DELETE = 256,
285
	INPUT_ATTACK2 = 257,
286
	INPUT_RAPPEL_JUMP = 258,
287
	INPUT_RAPPEL_LONG_JUMP = 259,
288
	INPUT_RAPPEL_SMASH_WINDOW = 260,
289
	INPUT_PREV_WEAPON = 261,
290
	INPUT_NEXT_WEAPON = 262,
291
	INPUT_MELEE_ATTACK1 = 263,
292
	INPUT_MELEE_ATTACK2 = 264,
293
	INPUT_WHISTLE = 265,
294
	INPUT_MOVE_LEFT = 266,
295
	INPUT_MOVE_RIGHT = 267,
296
	INPUT_MOVE_UP = 268,
297
	INPUT_MOVE_DOWN = 269,
298
	INPUT_LOOK_LEFT = 270,
299
	INPUT_LOOK_RIGHT = 271,
300
	INPUT_LOOK_UP = 272,
301
	INPUT_LOOK_DOWN = 273,
302
	INPUT_SNIPER_ZOOM_IN = 274,
303
	INPUT_SNIPER_ZOOM_OUT = 275,
304
	INPUT_SNIPER_ZOOM_IN_ALTERNATE = 276,
305
	INPUT_SNIPER_ZOOM_OUT_ALTERNATE = 277,
306
	INPUT_VEH_MOVE_LEFT = 278,
307
	INPUT_VEH_MOVE_RIGHT = 279,
308
	INPUT_VEH_MOVE_UP = 280,
309
	INPUT_VEH_MOVE_DOWN = 281,
310
	INPUT_VEH_GUN_LEFT = 282,
311
	INPUT_VEH_GUN_RIGHT = 283,
312
	INPUT_VEH_GUN_UP = 284,
313
	INPUT_VEH_GUN_DOWN = 285,
314
	INPUT_VEH_LOOK_LEFT = 286,
315
	INPUT_VEH_LOOK_RIGHT = 287,
316
	INPUT_REPLAY_START_STOP_RECORDING = 288,
317
	INPUT_REPLAY_START_STOP_RECORDING_SECONDARY = 289,
318
	INPUT_SCALED_LOOK_LR = 290,
319
	INPUT_SCALED_LOOK_UD = 291,
320
	INPUT_SCALED_LOOK_UP_ONLY = 292,
321
	INPUT_SCALED_LOOK_DOWN_ONLY = 293,
322
	INPUT_SCALED_LOOK_LEFT_ONLY = 294,
323
	INPUT_SCALED_LOOK_RIGHT_ONLY = 295,
324
	INPUT_REPLAY_MARKER_DELETE = 296,
325
	INPUT_REPLAY_CLIP_DELETE = 297,
326
	INPUT_REPLAY_PAUSE = 298,
327
	INPUT_REPLAY_REWIND = 299,
328
	INPUT_REPLAY_FFWD = 300,
329
	INPUT_REPLAY_NEWMARKER = 301,
330
	INPUT_REPLAY_RECORD = 302,
331
	INPUT_REPLAY_SCREENSHOT = 303,
332
	INPUT_REPLAY_HIDEHUD = 304,
333
	INPUT_REPLAY_STARTPOINT = 305,
334
	INPUT_REPLAY_ENDPOINT = 306,
335
	INPUT_REPLAY_ADVANCE = 307,
336
	INPUT_REPLAY_BACK = 308,
337
	INPUT_REPLAY_TOOLS = 309,
338
	INPUT_REPLAY_RESTART = 310,
339
	INPUT_REPLAY_SHOWHOTKEY = 311,
340
	INPUT_REPLAY_CYCLEMARKERLEFT = 312,
341
	INPUT_REPLAY_CYCLEMARKERRIGHT = 313,
342
	INPUT_REPLAY_FOVINCREASE = 314,
343
	INPUT_REPLAY_FOVDECREASE = 315,
344
	INPUT_REPLAY_CAMERAUP = 316,
345
	INPUT_REPLAY_CAMERADOWN = 317,
346
	INPUT_REPLAY_SAVE = 318,
347
	INPUT_REPLAY_TOGGLETIME = 319,
348
	INPUT_REPLAY_TOGGLETIPS = 320,
349
	INPUT_REPLAY_PREVIEW = 321,
350
	INPUT_REPLAY_TOGGLE_TIMELINE = 322,
351
	INPUT_REPLAY_TIMELINE_PICKUP_CLIP = 323,
352
	INPUT_REPLAY_TIMELINE_DUPLICATE_CLIP = 324,
353
	INPUT_REPLAY_TIMELINE_PLACE_CLIP = 325,
354
	INPUT_REPLAY_CTRL = 326,
355
	INPUT_REPLAY_TIMELINE_SAVE = 327,
356
	INPUT_REPLAY_PREVIEW_AUDIO = 328,
357
	INPUT_VEH_DRIVE_LOOK = 329,
358
	INPUT_VEH_DRIVE_LOOK2 = 330,
359
	INPUT_VEH_FLY_ATTACK2 = 331,
360
	INPUT_RADIO_WHEEL_UD = 332,
361
	INPUT_RADIO_WHEEL_LR = 333,
362
	INPUT_VEH_SLOWMO_UD = 334,
363
	INPUT_VEH_SLOWMO_UP_ONLY = 335,
364
	INPUT_VEH_SLOWMO_DOWN_ONLY = 336,
365
	INPUT_MAP_POI = 337
366
};
367
int *settings_font, inull;
368
RGBA *settings_rgba;
369
RGBA titlebox = { 167, 23, 172, 255 };
370
RGBA BG = { 20, 20, 20, 200 };
371
RGBA titletext = { 255, 255, 255, 255 };
372
RGBA optiontext = { 255, 255, 255, 255 };
373
RGBA optioncount = { 255, 255, 255, 255 };
374
RGBA selectedtext = { 255, 255, 255, 255 };
375
RGBA optionbreaks = { 255, 255, 255, 240 };
376
RGBA selectionhi = { 255, 255, 255, 140 };
377
int font_title = 7, font_options = 4, font_selection = 4, font_breaks = 1;
378
float menuPos = 0, OptionY;
379
int screen_res_x, screen_res_y;
380
DWORD myVeh, cam_gta2;
381
float current_timescale = 1.0f;
382
383
384
385
// Booleans for loops go here:
386
bool loop_massacre_mode = 0, loop_RainbowBoxes = 0, loop_gravity_gun = 0, loop_gta2cam = 0;
387
}
388
namespace{
389
// Declare subroutines here.
390
391
392
393
}
394
namespace{
395
// Define subroutines here.
396
397
void VectorToFloat(Vector3 unk, float *Out)
398
{
399
	Out[0] = unk.x;
400
	Out[1] = unk.y;
401
	Out[2] = unk.z;
402
}
403
int RandomRGB()
404
{
405
	srand(GetTickCount());
406
	return (GET_RANDOM_INT_IN_RANGE(0, 255));
407
}
408
bool get_key_pressed(int nVirtKey)
409
{
410
	return (GetAsyncKeyState(nVirtKey) & 0x8000) != 0;
411
}
412
bool Check_self_in_vehicle()
413
{
414
	if (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), 0)) return true; else return false;
415
}
416
int FindFreeCarSeat(DWORD vehicle)
417
{
418
	int max = GET_VEHICLE_MAX_NUMBER_OF_PASSENGERS(vehicle) - 2;
419
	for (static int tick = -1; tick <= max; tick++)
420
	{
421
		if (IS_VEHICLE_SEAT_FREE(vehicle, tick))
422
		{
423
			return tick;
424
		}
425
	}
426
427
	return -1;
428
}
429
void offset_from_entity(int entity, float X, float Y, float Z, float * Out)
430
{
431
	VectorToFloat(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(entity, X, Y, Z), Out);
432
}
433
void RequestControlOfEnt(DWORD entity)
434
{
435
	int tick = 0;
436
437
	while (!NETWORK_HAS_CONTROL_OF_ENTITY(entity) && tick <= 12)
438
	{
439
		NETWORK_REQUEST_CONTROL_OF_ENTITY(entity);
440
		tick++;
441
	}
442
}
443
void RequestControlOfid(DWORD netid)
444
{
445
	int tick = 0;
446
447
	while (!NETWORK_HAS_CONTROL_OF_NETWORK_ID(netid) && tick <= 12)
448
	{
449
		NETWORK_REQUEST_CONTROL_OF_NETWORK_ID(netid);
450
		tick++;
451
	}
452
}
453
void RequestModel(DWORD Hash)
454
{
455
	REQUEST_MODEL(Hash);
456
	while (!(HAS_MODEL_LOADED(Hash)))
457
	{
458
		WAIT(5);
459
	}
460
}
461
int PlaceObject(DWORD Hash, float X, float Y, float Z, float Pitch, float Roll, float Yaw)
462
{
463
	RequestModel(Hash);
464
	static DWORD object = CREATE_OBJECT(Hash, X, Y, Z, 1, 1, 0);
465
	SET_ENTITY_ROTATION(object, Pitch, Roll, Yaw, 2, 1);
466
	FREEZE_ENTITY_POSITION(object, 1);
467
	SET_ENTITY_LOD_DIST(object, 696969);
468
	SET_MODEL_AS_NO_LONGER_NEEDED(Hash);
469
	SET_OBJECT_AS_NO_LONGER_NEEDED(&object);
470
471
	return object;
472
}
473
void setupdraw()
474
{
475
	SET_TEXT_FONT(0);
476
	SET_TEXT_SCALE(0.4f, 0.4f);
477
	SET_TEXT_COLOUR(255, 255, 255, 255);
478
	SET_TEXT_WRAP(0.0f, 1.0f);
479
	SET_TEXT_CENTRE(0);
480
	SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0);
481
	SET_TEXT_EDGE(0, 0, 0, 0, 0);
482
	SET_TEXT_OUTLINE();
483
}
484
void drawstring(char* text, float X, float Y)
485
{
486
	_SET_TEXT_ENTRY("STRING");
487
	_ADD_TEXT_COMPONENT_STRING(text);
488
	_DRAW_TEXT(X, Y);
489
}
490
void drawinteger(int text, float X, float Y)
491
{
492
	_SET_TEXT_ENTRY("NUMBER");
493
	ADD_TEXT_COMPONENT_INTEGER(text);
494
	_DRAW_TEXT(X, Y);
495
}
496
void drawfloat(float text, DWORD decimal_places, float X, float Y)
497
{
498
	_SET_TEXT_ENTRY("NUMBER");
499
	ADD_TEXT_COMPONENT_FLOAT(text, decimal_places);
500
	_DRAW_TEXT(X, Y);
501
}
502
void PlaySoundFrontend(char* sound_dict, char* sound_name)
503
{
504
	PLAY_SOUND_FRONTEND(-1, sound_name, sound_dict, 0);
505
}
506
void PlaySoundFrontend_default(char* sound_name)
507
{
508
	PLAY_SOUND_FRONTEND(-1, sound_name, "HUD_FRONTEND_DEFAULT_SOUNDSET", 0);
509
}
510
bool Check_compare_string_length(char* unk1, size_t max_length)
511
{
512
	if (strlen(unk1) <= max_length) return true; else return false;
513
}
514
char* AddStrings(char* string1, char* string2)
515
{
516
	memset(str, 0, sizeof(str));
517
	strcpy_s(str, "");
518
	strcpy_s(str, string1);
519
	strcat_s(str, string2);
520
	return str;
521
}
522
char* AddInt_S(char* string1, int int2)
523
{
524
	static char* Return;
525
	printf(Return, "%i", int2);
526
	Return = AddStrings(string1, Return);
527
	return Return;
528
529
	/*std::string string2 = string1;
530
	string2 += std::to_string(int2);
531
532
	char * Char = new char[string2.size() + 1];
533
	std::copy(string2.begin(), string2.end(), Char);
534
	Char[string2.size()] = '\0';
535
536
	static char* Return = Char;
537
	delete[] Char;
538
	return Return;*/
539
}
540
char* keyboard()
541
{
542
	float i = 2.0000f;
543
	while (i > 0.4750f)
544
	{
545
		WAIT(10);
546
		DRAW_RECT(i, 0.9389f, 0.3875f, 0.736f, titlebox.R, titlebox.G, titlebox.B, 120);
547
		i -= 0.0050f;
548
	}
549
550
	static char* tempChar;
551
	bool j;
552
	if (Check_self_in_vehicle()) j = true; else j = false;
553
554
	while (!IsKeyDown(VK_RETURN))
555
	{
556
		WAIT(5);
557
		DRAW_RECT(i, 0.9389f, 0.3875f, 0.736f, titlebox.R, titlebox.G, titlebox.B, 120);
558
		setupdraw();
559
		SET_TEXT_FONT(1);
560
		drawstring("INPUT:", 0.2836f, 0.9129f);
561
562
563
		if (IsKeyJustUp('1')) AddStrings(tempChar, "1");
564
		else if (IsKeyJustUp('2')) AddStrings(tempChar, "2");
565
		else if (IsKeyJustUp('3')) AddStrings(tempChar, "3");
566
		else if (IsKeyJustUp('4')) AddStrings(tempChar, "4");
567
		else if (IsKeyJustUp('5')) AddStrings(tempChar, "5");
568
		else if (IsKeyJustUp('6')) AddStrings(tempChar, "6");
569
		else if (IsKeyJustUp('7')) AddStrings(tempChar, "7");
570
		else if (IsKeyJustUp('8')) AddStrings(tempChar, "8");
571
		else if (IsKeyJustUp('9')) AddStrings(tempChar, "9");
572
		else if (IsKeyJustUp('0')) AddStrings(tempChar, "0");
573
		else if (IsKeyJustUp('A')) AddStrings(tempChar, "A");
574
		else if (IsKeyJustUp('B')) AddStrings(tempChar, "B");
575
		else if (IsKeyJustUp('C')) AddStrings(tempChar, "C");
576
		else if (IsKeyJustUp('D')) AddStrings(tempChar, "D");
577
		else if (IsKeyJustUp('E')) AddStrings(tempChar, "E");
578
		else if (IsKeyJustUp('F')){ AddStrings(tempChar, "F"); if (j) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), myVeh, FindFreeCarSeat(myVeh)); }
579
		else if (IsKeyJustUp('G')) AddStrings(tempChar, "G");
580
		else if (IsKeyJustUp('H')) AddStrings(tempChar, "H");
581
		else if (IsKeyJustUp('I')) AddStrings(tempChar, "I");
582
		else if (IsKeyJustUp('J')) AddStrings(tempChar, "J");
583
		else if (IsKeyJustUp('K')) AddStrings(tempChar, "K");
584
		else if (IsKeyJustUp('L')) AddStrings(tempChar, "L");
585
		else if (IsKeyJustUp('M')) AddStrings(tempChar, "M");
586
		else if (IsKeyJustUp('N')) AddStrings(tempChar, "N");
587
		else if (IsKeyJustUp('O')) AddStrings(tempChar, "O");
588
		else if (IsKeyJustUp('P')) AddStrings(tempChar, "P");
589
		else if (IsKeyJustUp('Q')) AddStrings(tempChar, "Q");
590
		else if (IsKeyJustUp('R')) AddStrings(tempChar, "R");
591
		else if (IsKeyJustUp('S')) AddStrings(tempChar, "S");
592
		else if (IsKeyJustUp('T')) AddStrings(tempChar, "T");
593
		else if (IsKeyJustUp('U')) AddStrings(tempChar, "U");
594
		else if (IsKeyJustUp('V')) AddStrings(tempChar, "V");
595
		else if (IsKeyJustUp('W')) AddStrings(tempChar, "W");
596
		else if (IsKeyJustUp('X')) AddStrings(tempChar, "X");
597
		else if (IsKeyJustUp('Y')) AddStrings(tempChar, "Y");
598
		else if (IsKeyJustUp('Z')) AddStrings(tempChar, "Z");
599
		else if (IsKeyJustUp(VK_ESCAPE)) return "";
600
		else if (IsKeyJustUp(VK_SPACE)) AddStrings(tempChar, " ");
601
		else if (IsKeyJustUp(VK_BACK) && strlen(tempChar) > 0)
602
		{ 
603
			std::string tempStr(tempChar); tempStr.pop_back();
604
			char *tempChar2 = new char[tempStr.length() + 1];
605
			std::strcpy(tempChar2, tempStr.c_str());
606
			tempChar = tempChar2;
607
			delete[] tempChar2;
608
		}
609
610
		setupdraw();
611
		SET_TEXT_FONT(14);
612
		SET_TEXT_CENTRE(1);
613
		drawstring(tempChar, 0.46, 0.9);
614
615
	}
616
	return tempChar;
617
}
618
int StringToInt(char* text)
619
{
620
	static DWORD tempp;
621
	if (text == "") return NULL;
622
	if (STRING_TO_INT((DWORD*)text, &tempp)) return NULL;
623
624
	return tempp;
625
}
626
void PrintStringBottomCentre(char* text)
627
{
628
	_0xB87A37EEB7FAA67D("STRING");
629
	_ADD_TEXT_COMPONENT_STRING(text);
630
	_0x9D77056A530643F6(2000, 1);
631
}
632
void PrintFloatBottomCentre(float text, __int8 decimal_places)
633
{
634
	_0xB87A37EEB7FAA67D("NUMBER");
635
	ADD_TEXT_COMPONENT_FLOAT(text, (DWORD)decimal_places);
636
	_0x9D77056A530643F6(2000, 1);
637
}
638
void PrintBottomLeft(char* text)
639
{
640
	_0x202709F4C58A0424("STRING");
641
	_ADD_TEXT_COMPONENT_STRING(text);
642
	_0x44FA03975424A0EE(0, 1); // Not sure if right native
643
}
644
void PrintError_InvalidInput()
645
{
646
	PrintStringBottomCentre("~r~Error:~s~ Invalid Input.");
647
}
648
class menu
649
{
650
public:
651
	static unsigned __int16 currentsub;
652
	static unsigned __int16 currentop;
653
	static unsigned __int16 currentop_w_breaks;
654
	static unsigned __int16 totalop;
655
	static unsigned __int16 printingop;
656
	static unsigned __int16 breakcount;
657
	static unsigned __int16 totalbreaks;
658
	static unsigned __int8 breakscroll;
659
	static __int16 currentsub_ar_index;
660
	static int currentsub_ar[20];
661
	static int currentop_ar[20];
662
	static int SetSub_delayed;
663
	static unsigned long int livetimer;
664
	static bool bit_centre_title, bit_centre_options, bit_centre_breaks;
665
666
	static void loops();
667
	static void sub_handler();
668
	static void submenu_switch();
669
	static void DisableControls()
670
	{
671
		HIDE_HELP_TEXT_THIS_FRAME();
672
		SET_CINEMATIC_BUTTON_ACTIVE(1);
673
		DISABLE_CONTROL_ACTION(0, INPUT_NEXT_CAMERA, controllerinput_bool);
674
		DISABLE_CONTROL_ACTION(0, INPUT_VEH_SELECT_NEXT_WEAPON, controllerinput_bool);
675
		DISABLE_CONTROL_ACTION(0, INPUT_VEH_CIN_CAM, controllerinput_bool);
676
		SET_INPUT_EXCLUSIVE(2, INPUT_FRONTEND_X);
677
		SET_INPUT_EXCLUSIVE(2, INPUT_FRONTEND_ACCEPT);
678
		SET_INPUT_EXCLUSIVE(2, INPUT_FRONTEND_CANCEL);
679
		DISABLE_CONTROL_ACTION(0, INPUT_HUD_SPECIAL, controllerinput_bool);
680
		SET_INPUT_EXCLUSIVE(2, INPUT_FRONTEND_DOWN);
681
		SET_INPUT_EXCLUSIVE(2, INPUT_FRONTEND_UP);
682
		DISABLE_CONTROL_ACTION(2, INPUT_FRONTEND_ACCEPT, controllerinput_bool);
683
		DISABLE_CONTROL_ACTION(2, INPUT_FRONTEND_CANCEL, controllerinput_bool);
684
		DISABLE_CONTROL_ACTION(2, INPUT_FRONTEND_LEFT, controllerinput_bool);
685
		DISABLE_CONTROL_ACTION(2, INPUT_FRONTEND_RIGHT, controllerinput_bool);
686
		DISABLE_CONTROL_ACTION(2, INPUT_FRONTEND_DOWN, controllerinput_bool);
687
		DISABLE_CONTROL_ACTION(2, INPUT_FRONTEND_UP, controllerinput_bool);
688
		DISABLE_CONTROL_ACTION(2, INPUT_FRONTEND_RDOWN, controllerinput_bool);
689
		DISABLE_CONTROL_ACTION(2, INPUT_FRONTEND_ACCEPT, controllerinput_bool);
690
		HIDE_HUD_COMPONENT_THIS_FRAME(10);
691
		HIDE_HUD_COMPONENT_THIS_FRAME(6);
692
		HIDE_HUD_COMPONENT_THIS_FRAME(7);
693
		HIDE_HUD_COMPONENT_THIS_FRAME(9);
694
		HIDE_HUD_COMPONENT_THIS_FRAME(8);
695
		SET_INPUT_EXCLUSIVE(2, INPUT_FRONTEND_LEFT);
696
		SET_INPUT_EXCLUSIVE(2, INPUT_FRONTEND_RIGHT);
697
		DISABLE_CONTROL_ACTION(0, INPUT_SELECT_WEAPON, controllerinput_bool);
698
		DISABLE_CONTROL_ACTION(0, INPUT_SELECT_WEAPON_UNARMED, controllerinput_bool);
699
		DISABLE_CONTROL_ACTION(0, INPUT_SELECT_WEAPON_MELEE, controllerinput_bool);
700
		DISABLE_CONTROL_ACTION(0, INPUT_SELECT_WEAPON_HANDGUN, controllerinput_bool);
701
		DISABLE_CONTROL_ACTION(0, INPUT_SELECT_WEAPON_SHOTGUN, controllerinput_bool);
702
		DISABLE_CONTROL_ACTION(0, INPUT_SELECT_WEAPON_SMG, controllerinput_bool);
703
		DISABLE_CONTROL_ACTION(0, INPUT_SELECT_WEAPON_AUTO_RIFLE, controllerinput_bool);
704
		DISABLE_CONTROL_ACTION(0, INPUT_SELECT_WEAPON_SNIPER, controllerinput_bool);
705
		DISABLE_CONTROL_ACTION(0, INPUT_SELECT_WEAPON_HEAVY, controllerinput_bool);
706
		DISABLE_CONTROL_ACTION(0, INPUT_SELECT_WEAPON_SPECIAL, controllerinput_bool);
707
		DISABLE_CONTROL_ACTION(0, INPUT_WEAPON_WHEEL_NEXT, controllerinput_bool);
708
		DISABLE_CONTROL_ACTION(0, INPUT_WEAPON_WHEEL_PREV, controllerinput_bool);
709
		DISABLE_CONTROL_ACTION(0, INPUT_WEAPON_SPECIAL_TWO, controllerinput_bool);
710
		DISABLE_CONTROL_ACTION(0, INPUT_DIVE, controllerinput_bool);
711
		DISABLE_CONTROL_ACTION(0, INPUT_MELEE_ATTACK_LIGHT, controllerinput_bool);
712
		DISABLE_CONTROL_ACTION(0, INPUT_MELEE_ATTACK_HEAVY, controllerinput_bool);
713
		DISABLE_CONTROL_ACTION(0, INPUT_MELEE_BLOCK, controllerinput_bool);
714
		DISABLE_CONTROL_ACTION(0, INPUT_ARREST, controllerinput_bool);
715
		DISABLE_CONTROL_ACTION(0, INPUT_VEH_HEADLIGHT, controllerinput_bool);
716
		DISABLE_CONTROL_ACTION(0, INPUT_VEH_RADIO_WHEEL, controllerinput_bool);
717
		DISABLE_CONTROL_ACTION(0, INPUT_CONTEXT, controllerinput_bool);
718
		DISABLE_CONTROL_ACTION(0, INPUT_RELOAD, controllerinput_bool);
719
		DISABLE_CONTROL_ACTION(0, INPUT_DIVE, controllerinput_bool);
720
		DISABLE_CONTROL_ACTION(0, INPUT_VEH_CIN_CAM, controllerinput_bool);
721
		DISABLE_CONTROL_ACTION(0, INPUT_JUMP, controllerinput_bool);
722
		DISABLE_CONTROL_ACTION(0, INPUT_VEH_SELECT_NEXT_WEAPON, controllerinput_bool);
723
		DISABLE_CONTROL_ACTION(0, INPUT_VEH_FLY_SELECT_NEXT_WEAPON, controllerinput_bool);
724
		DISABLE_CONTROL_ACTION(0, INPUT_SELECT_CHARACTER_FRANKLIN, controllerinput_bool);
725
		DISABLE_CONTROL_ACTION(0, INPUT_SELECT_CHARACTER_MICHAEL, controllerinput_bool);
726
		DISABLE_CONTROL_ACTION(0, INPUT_SELECT_CHARACTER_TREVOR, controllerinput_bool);
727
		DISABLE_CONTROL_ACTION(0, INPUT_SELECT_CHARACTER_MULTIPLAYER, controllerinput_bool);
728
		DISABLE_CONTROL_ACTION(0, INPUT_CHARACTER_WHEEL, controllerinput_bool);
729
	}
730
	static void base()
731
	{
732
		GET_SCREEN_RESOLUTION(&screen_res_x, &screen_res_y); // Get screen res
733
		if (menu::currentsub != SUB::CLOSED)
734
		{
735
			DWORD dword = (DWORD)("CommonMenu");
736
			if (!HAS_STREAMED_TEXTURE_DICT_LOADED(&dword)){ REQUEST_STREAMED_TEXTURE_DICT(&dword, 0); }
737
			background();
738
			optionhi();
739
		}
740
	}
741
	static void background()
742
	{
743
		float temp;
744
		if (totalop > 14) temp = 14; else temp = (float)totalop; // Calculate last option number to draw rect
745
746
		// Calculate Y Coord
747
		float bg_Y = ((temp * 0.035f) / 2.0f) + 0.159f;
748
		float bg_length = temp * 0.035f;
749
750
		// Draw titlebox
751
		DRAW_RECT(0.16f + menuPos, 0.1175f, 0.20f, 0.083f, titlebox.R, titlebox.G, titlebox.B, titlebox.A);
752
753
		// Draw background
754
		DRAW_RECT(0.16f + menuPos, bg_Y, 0.20f, bg_length, BG.R, BG.G, BG.B, BG.A);
755
756
		// Draw scroller indicator rect
757
		if (totalop > 14) temp = 14.0f; else temp = (float)totalop;
758
		float scr_rect_Y = ((temp + 1.0f) * 0.035f) + 0.1415f;
759
		DRAW_RECT(0.16f + menuPos, scr_rect_Y, 0.20f, 0.0345f, BG.R, BG.G, BG.B, BG.A);
760
761
		// Draw thin line over scroller indicator rect
762
		if (totalop < 14) DRAW_RECT(0.16f + menuPos, (float)(totalop)* 0.035f + 0.16f, 0.20f, 0.0022f, 255, 255, 255, 255);
763
		else DRAW_RECT(0.16f + menuPos, 14.0f * 0.035f + 0.16f, 0.20f, 0.0022f, 255, 255, 255, 255);
764
765
		// Draw scroller indicator
766
		DWORD dword = (DWORD)("CommonMenu");
767
		if ((totalop > 14) && HAS_STREAMED_TEXTURE_DICT_LOADED(&dword))
768
		{
769
			DWORD dword2 = (DWORD)"shop_arrows_upANDdown";
770
			DWORD dword3 = (DWORD)"arrowright";
771
			Vector3 texture_res = GET_TEXTURE_RESOLUTION(&dword, &dword2);
772
773
			temp = ((14.0f + 1.0f) * 0.035f) + 0.1259f;
774
775
			if (currentop == 1)	DRAW_SPRITE(dword, dword3, 0.16f + menuPos, temp, texture_res.x / (float)screen_res_x, texture_res.y / (float)screen_res_y, 270.0f, titlebox.R, titlebox.G, titlebox.B, 255);
776
			else if (currentop == totalop) DRAW_SPRITE(dword, dword3, 0.16f + menuPos, temp, texture_res.x / (float)screen_res_x, texture_res.y / (float)screen_res_y, 90.0f, titlebox.R, titlebox.G, titlebox.B, 255);
777
			else DRAW_SPRITE(dword, dword2, 0.16f + menuPos, temp, texture_res.x / (float)screen_res_x, texture_res.y / (float)screen_res_y, 0.0f, titlebox.R, titlebox.G, titlebox.B, 255);
778
779
		}
780
781
		// Draw option count
782
		temp = scr_rect_Y - 0.0124f;
783
		setupdraw();
784
		SET_TEXT_FONT(0);
785
		SET_TEXT_SCALE(0.0f, 0.26f);
786
		SET_TEXT_COLOUR(optioncount.R, optioncount.G, optioncount.B, optioncount.A);
787
788
		_SET_TEXT_ENTRY("CM_ITEM_COUNT");
789
		ADD_TEXT_COMPONENT_INTEGER(currentop); // ! currentop_w_breaks
790
		ADD_TEXT_COMPONENT_INTEGER(totalop); // ! totalop - totalbreaks
791
		_DRAW_TEXT(0.2205f + menuPos, temp);
792
	}
793
	static void optionhi()
794
	{
795
		float Y_coord;
796
		if (currentop > 14) Y_coord = 14.0f; else Y_coord = (float)currentop;
797
798
		Y_coord = (Y_coord * 0.035f) + 0.1415f;
799
		DRAW_RECT(0.16f + menuPos, Y_coord, 0.20f, 0.035f, selectionhi.R, selectionhi.G, selectionhi.B, selectionhi.A);
800
	}
801
	static bool isBinds()
802
	{
803
		// Open menu - RB + LB / NUM4 + NUM6
804
		return ((IS_DISABLED_CONTROL_PRESSED(2, INPUT_FRONTEND_RB) && IS_DISABLED_CONTROL_PRESSED(2, INPUT_FRONTEND_LB)) || (IsKeyDown(VK_NUMPAD4) && IsKeyDown(VK_NUMPAD6)));
805
	}
806
	static void while_closed()
807
	{
808
		if (isBinds())
809
		{
810
			PlaySoundFrontend("FocusIn", "HintCamSounds");
811
			currentsub = 1;
812
			currentsub_ar_index = 0;
813
			currentop = 1;
814
		}
815
	}
816
	static void while_opened()
817
	{
818
		totalop = printingop; printingop = 0;
819
		totalbreaks = breakcount; breakcount = 0; breakscroll = 0;
820
821
		if (IS_PAUSE_MENU_ACTIVE()) SetSub_closed();
822
823
		DISPLAY_AMMO_THIS_FRAME(0);
824
		DISPLAY_CASH(0);
825
		SET_RADAR_ZOOM(0);
826
827
		DisableControls();
828
829
		// Scroll up
830
		if (IS_DISABLED_CONTROL_JUST_PRESSED(2, INPUT_SCRIPT_PAD_UP) || IsKeyJustUp(VK_NUMPAD8))
831
		{
832
			if (currentop == 1) Bottom(); else Up();
833
		}
834
835
		// Scroll down
836
		if (IS_DISABLED_CONTROL_JUST_PRESSED(2, INPUT_SCRIPT_PAD_DOWN) || IsKeyJustUp(VK_NUMPAD2))
837
		{
838
			if (currentop == totalop) Top(); else Down();
839
		}
840
841
		// B press
842
		if (IS_DISABLED_CONTROL_JUST_PRESSED(2, INPUT_SCRIPT_RRIGHT) || IsKeyJustUp(VK_NUMPAD0))
843
		{
844
			if (currentsub == SUB::MAINMENU) SetSub_closed(); else SetSub_previous();
845
		}
846
847
		// Binds press
848
		if (currentsub != SUB::MAINMENU && isBinds())
849
		{
850
			SetSub_closed();
851
		}
852
	}
853
	static void Up()
854
	{
855
		currentop--; currentop_w_breaks--;
856
		PlaySoundFrontend_default("NAV_UP_DOWN");
857
		breakscroll = 1;
858
	}
859
	static void Down()
860
	{
861
		currentop++; currentop_w_breaks++;
862
		PlaySoundFrontend_default("NAV_UP_DOWN");
863
		breakscroll = 2;
864
	}
865
	static void Bottom()
866
	{
867
		currentop = totalop; currentop_w_breaks = totalop;
868
		PlaySoundFrontend_default("NAV_UP_DOWN");
869
		breakscroll = 3;
870
	}
871
	static void Top()
872
	{
873
		currentop = 1; currentop_w_breaks = 1;
874
		PlaySoundFrontend_default("NAV_UP_DOWN");
875
		breakscroll = 4;
876
	}
877
	static void SetSub_previous()
878
	{
879
		currentsub = currentsub_ar[currentsub_ar_index]; // Get previous submenu from array and set as current submenu
880
		currentop = currentop_ar[currentsub_ar_index]; // Get last selected option from array and set as current selected option
881
		currentsub_ar_index--; // Decrement array index by 1
882
		printingop = 0; // Reset option print variable
883
		PlaySoundFrontend_default("BACK"); // Play sound
884
	}
885
	static void SetSub_new(int sub_index)
886
	{
887
		currentsub_ar_index++; // Increment array index
888
		currentsub_ar[currentsub_ar_index] = currentsub; // Store current submenu index in array
889
		currentsub = sub_index; // Set new submenu as current submenu (Static_1)
890
891
		currentop_ar[currentsub_ar_index] = currentop; // Store currently selected option in array
892
		currentop = 1; currentop_w_breaks = 1; // Set new selected option as first option in submenu
893
894
		printingop = 0; // Reset currently printing option var
895
	}
896
	static void SetSub_closed()
897
	{
898
		ENABLE_ALL_CONTROL_ACTIONS(2);
899
		PlaySoundFrontend_default("BACK");
900
		currentsub = SUB::CLOSED;
901
	}
902
903
}; unsigned __int16 menu::currentsub = 0; unsigned __int16 menu::currentop = 0; unsigned __int16 menu::currentop_w_breaks = 0; unsigned __int16 menu::totalop = 0; unsigned __int16 menu::printingop = 0; unsigned __int16 menu::breakcount = 0; unsigned __int16 menu::totalbreaks = 0; unsigned __int8 menu::breakscroll = 0; __int16 menu::currentsub_ar_index = 0; int menu::currentsub_ar[20] = {}; int menu::currentop_ar[20] = {}; int menu::SetSub_delayed = 0; unsigned long int menu::livetimer; bool menu::bit_centre_title = 1, menu::bit_centre_options = 0, menu::bit_centre_breaks = 1;
904
bool CheckAJPressed()
905
{
906
	if (IS_DISABLED_CONTROL_JUST_PRESSED(2, INPUT_SCRIPT_RDOWN) || IsKeyJustUp(VK_NUMPAD5)) return true; else return false;
907
}
908
bool CheckRPressed()
909
{
910
	if (IS_DISABLED_CONTROL_PRESSED(2, INPUT_FRONTEND_RIGHT) || IsKeyDown(VK_NUMPAD6)) return true; else return false;
911
}
912
bool CheckRJPressed()
913
{
914
	if (IS_DISABLED_CONTROL_JUST_PRESSED(2, INPUT_FRONTEND_RIGHT) || IsKeyJustUp(VK_NUMPAD6)) return true; else return false;
915
}
916
bool CheckLPressed()
917
{
918
	if (IS_DISABLED_CONTROL_PRESSED(2, INPUT_FRONTEND_LEFT) || IsKeyDown(VK_NUMPAD4)) return true; else return false;
919
}
920
bool CheckLJPressed()
921
{
922
	if (IS_DISABLED_CONTROL_JUST_PRESSED(2, INPUT_FRONTEND_LEFT) || IsKeyJustUp(VK_NUMPAD4)) return true; else return false;
923
}
924
bool IsOptionPressed()
925
{
926
	if (CheckAJPressed())
927
	{
928
		PlaySoundFrontend_default("SELECT");
929
		return true;
930
	}
931
	else return false;
932
}
933
bool IsOptionRPressed()
934
{
935
	if (CheckRPressed())
936
	{
937
		PlaySoundFrontend_default("NAV_LEFT_RIGHT");
938
		return true;
939
	}
940
	else return false;
941
}
942
bool IsOptionRJPressed()
943
{
944
	if (CheckRJPressed())
945
	{
946
		PlaySoundFrontend_default("NAV_LEFT_RIGHT");
947
		return true;
948
	}
949
	else return false;
950
}
951
bool IsOptionLPressed()
952
{
953
	if (CheckLPressed())
954
	{
955
		PlaySoundFrontend_default("NAV_LEFT_RIGHT");
956
		return true;
957
	}
958
	else return false;
959
}
960
bool IsOptionLJPressed()
961
{
962
	if (CheckLJPressed())
963
	{
964
		PlaySoundFrontend_default("NAV_LEFT_RIGHT");
965
		return true;
966
	}
967
	else return false;
968
}
969
void AddTitle(char* text)
970
{
971
	setupdraw();
972
	SET_TEXT_FONT(font_title);
973
974
	SET_TEXT_COLOUR(titletext.R, titletext.G, titletext.B, titletext.A);
975
976
	if (menu::bit_centre_title)
977
	{
978
		SET_TEXT_CENTRE(1);
979
		OptionY = 0.16f + menuPos; // X coord
980
	}
981
	else OptionY = 0.066f + menuPos; // X coord
982
983
	if (Check_compare_string_length(text, 14))
984
	{
985
		SET_TEXT_SCALE(0.75f, 0.75f);
986
		drawstring(text, OptionY, 0.1f);
987
	}
988
	else drawstring(text, OptionY, 0.13f);
989
990
}
991
void nullFunc(){ return; }
992
void AddOption(char* text, bool &option_code_bool = null, void (&Func)() = nullFunc, int submenu_index = -1)
993
{
994
	char* tempChar;
995
	if (font_options == 2 || font_options == 7) tempChar = "  ------"; // Font unsafe
996
	else tempChar = "  ~b~>"; // Font safe
997
998
	if (menu::printingop + 1 == menu::currentop && (font_selection == 2 || font_selection == 7)) tempChar = "  ------"; // Font unsafe
999
	else tempChar = "  ~b~>"; // Font safe
1000
1001
	menu::printingop++;
1002
1003
	OptionY = 0.0f;
1004
	if (menu::currentop <= 14)
1005
	{
1006
		if (menu::printingop > 14) return;
1007
		else OptionY = ((float)(menu::printingop) * 0.035f) + 0.125f;
1008
	}
1009
	else
1010
	{
1011
		if (menu::printingop < (menu::currentop - 13) || menu::printingop > menu::currentop) return;
1012
		else OptionY = ((float)(menu::printingop - (menu::currentop - 14))* 0.035f) + 0.125f;
1013
	}
1014
1015
	setupdraw();
1016
	SET_TEXT_FONT(font_options);
1017
	SET_TEXT_COLOUR(optiontext.R, optiontext.G, optiontext.B, optiontext.A);
1018
	if (menu::printingop == menu::currentop)
1019
	{
1020
		SET_TEXT_FONT(font_selection);
1021
		SET_TEXT_COLOUR(selectedtext.R, selectedtext.G, selectedtext.B, selectedtext.A);
1022
		if (IsOptionPressed())
1023
		{
1024
			/*if (&option_code_bool != &null)*/ option_code_bool = true;
1025
			Func();
1026
			if (submenu_index != -1) menu::SetSub_delayed = submenu_index;
1027
		}
1028
	}
1029
1030
	if (submenu_index != -1) text = AddStrings(text, tempChar);
1031
	if (menu::bit_centre_options)
1032
	{
1033
		SET_TEXT_CENTRE(1);
1034
		drawstring(text, 0.16f + menuPos, OptionY);
1035
	}
1036
	else drawstring(text, 0.066f + menuPos, OptionY);
1037
}
1038
void OptionStatus(int status)
1039
{
1040
	if (OptionY < 0.6325f && OptionY > 0.1425f)
1041
	{
1042
		char* tempChar;
1043
		SET_TEXT_FONT(4);
1044
		SET_TEXT_SCALE(0.34f, 0.34f);
1045
		SET_TEXT_CENTRE(1);
1046
1047
		if (status == 0){
1048
			SET_TEXT_COLOUR(255, 102, 102, 250); //RED
1049
			tempChar = "OFF";
1050
		}
1051
		else if (status == 1){
1052
			SET_TEXT_COLOUR(102, 255, 102, 250); //GREEN
1053
			tempChar = "ON";
1054
		}
1055
		else{
1056
			SET_TEXT_COLOUR(255, 255, 102, 250); //YELLOW
1057
			tempChar = "??";
1058
		}
1059
1060
		drawstring(tempChar, 0.233f + menuPos, OptionY);
1061
1062
	}
1063
}
1064
void AddToggle(char* text, bool &loop_variable, bool &extra_option_code_ON = null, bool &extra_option_code_OFF = null)
1065
{
1066
	null = 0;
1067
	AddOption(text, null);
1068
1069
	if (null){
1070
			loop_variable = !loop_variable;
1071
			if (loop_variable != 0) extra_option_code_ON = true;
1072
			else extra_option_code_OFF = true;
1073
		}
1074
1075
	OptionStatus((int)loop_variable); // Display ON/OFF
1076
}
1077
void AddLocal(char* text, Void condition, bool &option_code_ON, bool &option_code_OFF)
1078
{
1079
	null = 0;
1080
	AddOption(text, null);
1081
	if (null)
1082
	{ if (condition == 0) option_code_ON = true; else option_code_OFF = true; }
1083
	
1084
	if (condition == 0) OptionStatus(0); // Display OFF
1085
	else				OptionStatus(1); // Display ON
1086
}
1087
void AddBreak(char* text)
1088
{
1089
	menu::printingop++; menu::breakcount++; 
1090
1091
	OptionY = 0.0f;
1092
	if (menu::currentop <= 14)
1093
	{
1094
		if (menu::printingop > 14) return;
1095
		else OptionY = ((float)(menu::printingop) * 0.035f) + 0.125f;
1096
	}
1097
	else
1098
	{
1099
		if (menu::printingop < (menu::currentop - 13) || menu::printingop > menu::currentop) return;
1100
		else OptionY = ((float)(menu::printingop - (menu::currentop - 14))* 0.035f) + 0.125f;
1101
	}
1102
1103
	setupdraw();
1104
	SET_TEXT_FONT(font_breaks);
1105
	SET_TEXT_COLOUR(optionbreaks.R, optionbreaks.G, optionbreaks.B, optionbreaks.A);
1106
	if (menu::printingop == menu::currentop)
1107
	{
1108
		switch (menu::breakscroll)
1109
		{
1110
		case 1:
1111
			menu::currentop_w_breaks = menu::currentop_w_breaks + 1;
1112
			menu::currentop--; break;
1113
		case 2:
1114
			menu::currentop_w_breaks = menu::currentop - menu::breakcount;
1115
			menu::currentop++; break;
1116
		case 3:
1117
			menu::currentop_w_breaks = menu::totalop - (menu::totalbreaks - 1);
1118
			menu::currentop--; break;
1119
		case 4:
1120
			menu::currentop_w_breaks = 1;
1121
			menu::currentop++; break;
1122
		}
1123
		
1124
	}
1125
	if (menu::bit_centre_breaks)
1126
	{
1127
		SET_TEXT_CENTRE(1);
1128
		drawstring(text, 0.16f + menuPos, OptionY);
1129
	}
1130
	else
1131
	{
1132
		drawstring(text, 0.066f + menuPos, OptionY);
1133
	}
1134
1135
}
1136
void AddNumber(char* text, long value, __int8 decimal_places, bool &A_PRESS = null, bool &RIGHT_PRESS = null, bool &LEFT_PRESS = null)
1137
{
1138
	null = 0;
1139
	AddOption(text, null);
1140
1141
	if (OptionY < 0.6325 && OptionY > 0.1425)
1142
	{
1143
		SET_TEXT_FONT(0);
1144
		SET_TEXT_SCALE(0.26f, 0.26f);
1145
		SET_TEXT_CENTRE(1);
1146
1147
		drawfloat(value, (DWORD)decimal_places, 0.233f + menuPos, OptionY);
1148
	}
1149
1150
	if (menu::printingop == menu::currentop)
1151
	{
1152
		if (null) A_PRESS = true;
1153
		else if (IsOptionRJPressed()) RIGHT_PRESS = true;
1154
		else if (IsOptionRPressed()) RIGHT_PRESS = true;
1155
		else if (IsOptionLJPressed()) LEFT_PRESS = true;
1156
		else if (IsOptionLPressed()) LEFT_PRESS = true;
1157
1158
	}
1159
1160
}
1161
void AddTele(char* text, float X, float Y, float Z, bool &extra_option_code = null)
1162
{
1163
	null = 0;
1164
	AddOption(text, null);
1165
	if (menu::printingop == menu::currentop)
1166
	{
1167
		if (null)
1168
		{
1169
			if (!Check_self_in_vehicle())
1170
			{
1171
				SET_ENTITY_COORDS(PLAYER_PED_ID(), X, Y, Z, 0, 0, 0, 1);
1172
			}
1173
			else
1174
			{
1175
				RequestControlOfEnt(myVeh);
1176
				SET_ENTITY_COORDS(myVeh, X, Y, Z, 0, 0, 0, 1);
1177
			}
1178
			LOAD_ALL_OBJECTS_NOW();
1179
			extra_option_code = true;
1180
		}
1181
	}
1182
1183
}
1184
1185
1186
// Hax functions:
1187
void set_massacre_mode()
1188
{
1189
	float tempCoords1[3];
1190
	DWORD tempHash;
1191
	DWORD tempPed = PLAYER_PED_ID();
1192
	DWORD tempVehicle;
1193
	bool tick = 0;
1194
1195
	offset_from_entity(tempPed, GET_RANDOM_FLOAT_IN_RANGE(5.0f, 25.0f), GET_RANDOM_FLOAT_IN_RANGE(5.0f, 25.0f), GET_RANDOM_FLOAT_IN_RANGE(0.4f, 20.0f), tempCoords1);
1196
1197
	// Kick away naughty players
1198
	for (int i = 0; i <= 29; i++)
1199
	{
1200
		if (IS_PLAYER_TARGETTING_ENTITY(i, tempPed) || IS_PLAYER_FREE_AIMING_AT_ENTITY(i, tempPed))
1201
		{
1202
			if (!tick)
1203
			{
1204
				PrintStringBottomCentre("~h~You~s~ are being aimed at. Taking care of it!");
1205
				tick = true;
1206
			}
1207
			APPLY_FORCE_TO_ENTITY(GET_PLAYER_PED(i), 1, 5.0f, 5.0f, 5.0f, 5.0f, 5.0f, 5.0f, 1, 1, 1, 1, 0, 1);
1208
		}
1209
	}
1210
1211
	// Kick away nearest vehicle
1212
	tempVehicle = GET_CLOSEST_VEHICLE(tempCoords1[0], tempCoords1[1], tempCoords1[2], 400.0f, 0, 4);
1213
	if (DOES_ENTITY_EXIST(tempVehicle)) APPLY_FORCE_TO_ENTITY(tempVehicle, 1, 5.0f, 5.0f, 5.0f, 5.0f, 13.0f, 6.5f, 1, 1, 1, 1, 0, 1);
1214
1215
	// Exploding vehicles
1216
	switch (GET_RANDOM_INT_IN_RANGE(1, 10))
1217
	{
1218
	case 1: tempHash = 3945366167; break;
1219
	case 2: tempHash = 92612664; break;
1220
	case 3: tempHash = 1488164764; break;
1221
	case 4: tempHash = 117401876; break;
1222
	case 5: tempHash = 408192225; break;
1223
	case 6: tempHash = 3863274624; break;
1224
	case 7: tempHash = 165154707; break;
1225
	case 8: tempHash = 1011753235; break;
1226
	case 9: tempHash = 941800958; break;
1227
	case 10: tempHash = 970385471; break;
1228
	}
1229
1230
	tempVehicle = CREATE_VEHICLE(tempHash, tempCoords1[0], tempCoords1[1], tempCoords1[2], GET_RANDOM_FLOAT_IN_RANGE(0.0f, 360.0f), 1, 1);
1231
	APPLY_FORCE_TO_ENTITY(tempVehicle, 1, 5.0f, 5.0f, 5.0f, 5.0f, 13.0f, 6.5f, 1, 1, 1, 1, 0, 1);
1232
	NETWORK_EXPLODE_VEHICLE(tempVehicle, 1, 1, 1);
1233
1234
	// Dying peds
1235
	switch (GET_RANDOM_INT_IN_RANGE(1, 10))
1236
	{
1237
	case 1: tempHash = 1682622302; break;
1238
	case 2: tempHash = 113504370; break;
1239
	case 3: tempHash = 4244282910; break;
1240
	case 4: tempHash = 808859815; break;
1241
	case 5: tempHash = 1004114196; break;
1242
	case 6: tempHash = 3696858125; break;
1243
	case 7: tempHash = 921110016; break;
1244
	case 8: tempHash = 880829941; break;
1245
	case 9: tempHash = 1462895032; break;
1246
	case 10: tempHash = 773063444; break;
1247
	}
1248
1249
	offset_from_entity(tempPed, GET_RANDOM_FLOAT_IN_RANGE(5.0f, 25.0f), GET_RANDOM_FLOAT_IN_RANGE(5.0f, 25.0f), GET_RANDOM_FLOAT_IN_RANGE(0.4f, 20.0f), tempCoords1);
1250
	tempPed = CREATE_PED(22, tempHash, tempCoords1[0], tempCoords1[1], tempCoords1[2], GET_RANDOM_FLOAT_IN_RANGE(0.0f, 360.0f), 1, 1);
1251
	APPLY_FORCE_TO_ENTITY(tempPed, 1, 5.0f, 5.0f, 5.0f, 5.0f, 13.0f, 6.5f, 1, 1, 1, 1, 0, 1);
1252
	EXPLODE_PED_HEAD(tempPed, 324506233);
1253
	ADD_EXPLOSION(tempCoords1[0], tempCoords1[1], tempCoords1[2], 26, 4.0f, 1, 0, 3.0f);
1254
1255
	// Water hydrants
1256
	offset_from_entity(tempPed, GET_RANDOM_FLOAT_IN_RANGE(5.0f, 25.0f), GET_RANDOM_FLOAT_IN_RANGE(5.0f, 25.0f), GET_RANDOM_FLOAT_IN_RANGE(0.4f, 20.0f), tempCoords1);
1257
	ADD_EXPLOSION(tempCoords1[0], tempCoords1[1], tempCoords1[2], 13, 8.0f, 1, 0, 3.0f);
1258
1259
	// Zombies
1260
	offset_from_entity(tempPed, GET_RANDOM_FLOAT_IN_RANGE(5.0f, 25.0f), GET_RANDOM_FLOAT_IN_RANGE(5.0f, 25.0f), GET_RANDOM_FLOAT_IN_RANGE(0.4f, 20.0f), tempCoords1);
1261
	tempPed = CREATE_PED(22, -1404353274, tempCoords1[0], tempCoords1[1], tempCoords1[2], GET_RANDOM_FLOAT_IN_RANGE(0.0f, 360.0f), 1, 1);
1262
	PED_TO_NET(tempPed);
1263
	SET_PED_COMBAT_ABILITY(tempPed, 100);
1264
	TASK_COMBAT_HATED_TARGETS_AROUND_PED(tempPed, 400.0f, 0);
1265
}
1266
void sample_createEscort()
1267
{
1268
	if (!IS_WAYPOINT_ACTIVE()) PrintStringBottomCentre("~r~Error:~s~ No waypoint set.");
1269
	else
1270
	{
1271
		float Pos[3];
1272
		Vector3 Coord = GET_BLIP_COORDS(GET_FIRST_BLIP_INFO_ID(_GET_BLIP_INFO_ID_ITERATOR()));
1273
		GET_GROUND_Z_FOR_3D_COORD(Coord.x, Coord.y, Coord.z, &Coord.z);
1274
		VectorToFloat(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), 0.0f, 5.0f, 1.0f), Pos);
1275
		WAIT(10);
1276
		DWORD tempPed = CREATE_PED(1, GET_HASH_KEY("A_C_CHIMP"), Pos[0], Pos[1], Pos[2], 0.0f, 1, 1);
1277
		DWORD tempVehicle = CREATE_VEHICLE(GET_HASH_KEY("KURUMA2"), Pos[0], Pos[1], Pos[2] + 2.0f, GET_ENTITY_HEADING(PLAYER_PED_ID()), 1, 1);
1278
		RequestControlOfEnt(tempVehicle);
1279
		SET_VEHICLE_COLOURS(tempVehicle, 0, 0);
1280
		SET_VEHICLE_NUMBER_PLATE_TEXT(tempVehicle, (DWORD*)"VIP");
1281
		for (int i = -1; i <= 20; i++)
1282
		{
1283
			if (!IS_VEHICLE_SEAT_FREE(tempVehicle, i)) continue;
1284
			TASK_WARP_PED_INTO_VEHICLE(PLAYER_PED_ID(), tempVehicle, i); break;
1285
		}
1286
		TASK_VEHICLE_MISSION_COORS_TARGET(tempPed, tempVehicle, Coord.x, Coord.y, Coord.z, 4, 20.0f, 786469, 20.0f, 10.0f, 1);
1287
	}
1288
}
1289
DWORD grav_partfx, grav_entity; bool grav_toggled = 0, grav_target_locked = 0;
1290
Vector3 get_coords_from_cam(float distance)
1291
{
1292
	Vector3 Rot = GET_GAMEPLAY_CAM_ROT(2);
1293
	static Vector3 Coord = GET_GAMEPLAY_CAM_COORD();
1294
1295
	Rot.y = distance * cos(Rot.x);
1296
	Coord.x = Coord.x + Rot.y * sin(Rot.z * -1.0f);
1297
	Coord.y = Coord.y + Rot.y * cos(Rot.z * -1.0f);
1298
	Coord.z = Coord.z + distance * sin(Rot.x);
1299
1300
	return Coord;
1301
}
1302
void set_gravity_gun()
1303
{
1304
	DWORD tempPed, tempWeap;
1305
1306
	if (!grav_target_locked) GET_PLAYER_TARGET_ENTITY(PLAYER_ID(), &grav_entity);
1307
1308
	tempPed = PLAYER_ID(); GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), &tempWeap, 1);
1309
	if ((IS_PLAYER_FREE_AIMING(tempPed) || IS_PLAYER_TARGETTING_ANYTHING(tempPed)) && DOES_ENTITY_EXIST(grav_entity) && tempWeap == 453432689)
1310
	{
1311
		if (!grav_target_locked) GET_PLAYER_TARGET_ENTITY(PLAYER_ID(), &grav_entity); grav_target_locked = true;
1312
		float Coord[3]; VectorToFloat(get_coords_from_cam(5.5f), Coord);
1313
1314
		if (!DOES_PARTICLE_FX_LOOPED_EXIST(grav_partfx))
1315
		{
1316
			REQUEST_PTFX_ASSET();
1317
			if (HAS_PTFX_ASSET_LOADED())
1318
			{
1319
				grav_partfx = START_PARTICLE_FX_LOOPED_AT_COORD((DWORD*)"scr_drug_traffic_flare_L", Coord[0], Coord[1], Coord[2], 0.0f, 0.0f, 0.0f, 0.5f, 0, 0, 0, 0);
1320
				SET_PARTICLE_FX_LOOPED_COLOUR(grav_partfx, 1.0f, 0.84f, 0.0f, 0);
1321
			}
1322
		}
1323
1324
		//RequestControlOfid(NETWORK_GET_NETWORK_ID_FROM_ENTITY(grav_entity));
1325
		RequestControlOfEnt(grav_entity);
1326
		SET_ENTITY_COORDS_NO_OFFSET(grav_entity, Coord[0], Coord[1], Coord[2], 0, 0, 0);
1327
		if (IS_ENTITY_A_VEHICLE(grav_entity)) SET_ENTITY_HEADING(grav_entity, GET_ENTITY_HEADING(PLAYER_PED_ID()) + 90.0f);
1328
1329
		if (IS_PED_SHOOTING(PLAYER_PED_ID()))
1330
		{
1331
			PLAY_SOUND_FROM_ENTITY(-1, (DWORD*)"Foot_Swish", grav_entity, (DWORD*)"docks_heist_finale_2a_sounds", 0, 0);
1332
			SET_ENTITY_HEADING(grav_entity, GET_ENTITY_HEADING(PLAYER_PED_ID()));
1333
			APPLY_FORCE_TO_ENTITY(grav_entity, 1, 0.0f, 350.0f, 2.0f, 2.0f, 0.0f, 0.0f, 0, 1, 1, 1, 0, 1);
1334
			grav_target_locked = false;
1335
		}
1336
	}
1337
	else if (DOES_PARTICLE_FX_LOOPED_EXIST(grav_partfx))
1338
	{
1339
		STOP_PARTICLE_FX_LOOPED(grav_partfx, 0);
1340
		REMOVE_PARTICLE_FX(grav_partfx, 0);
1341
		REMOVE_PTFX_ASSET();
1342
	}
1343
	if (!IS_PLAYER_FREE_AIMING_AT_ENTITY(tempPed, grav_entity) || !IS_PLAYER_TARGETTING_ENTITY(tempPed, grav_entity)) grav_target_locked = false;
1344
1345
}
1346
void set_gta2_cam_rot()
1347
{
1348
	Vector3 Rot = GET_GAMEPLAY_CAM_ROT(2);
1349
	if (!Check_self_in_vehicle()){
1350
		SET_ENTITY_ROTATION(PLAYER_PED_ID(), Rot.x, Rot.y, Rot.z, 2, 1);
1351
	}
1352
	else{
1353
		SET_ENTITY_ROTATION(myVeh, Rot.x, Rot.y, Rot.z, 2, 1);
1354
	}
1355
}
1356
1357
1358
}
1359
1360
1361
1362
namespace sub{
1363
// Define submenus here.
1364
1365
void MainMenu()
1366
{
1367
	AddTitle("Menya Baes");
1368
	AddOption("Sample Submenu", null, nullFunc, SUB::SAMPLE);
1369
	AddOption("Large Submenu", null, nullFunc, SUB::YOURSUB);
1370
	AddOption("Settings", null, nullFunc, SUB::SETTINGS);
1371
1372
	if (menujustopened)
1373
	{
1374
		PrintBottomLeft(AddStrings("Menya Base by ", "MAFINS.")); // Your opening message goes here.
1375
		menujustopened = false;
1376
	}
1377
}
1378
1379
void Settings()
1380
{
1381
	bool settings_pos_plus = 0, settings_pos_minus = 0;
1382
1383
	AddTitle("Settings");
1384
	AddOption("Menu Colours", null, nullFunc, SUB::SETTINGS_COLOURS);
1385
	AddOption("Menu Fonts", null, nullFunc, SUB::SETTINGS_FONTS);
1386
	AddToggle("Centre Title", menu::bit_centre_title);
1387
	AddToggle("Centre Options", menu::bit_centre_options);
1388
	AddToggle("Centre Breaks", menu::bit_centre_breaks);
1389
	AddNumber("Menu Position", (DWORD)menuPos / 100, 0, null, settings_pos_plus, settings_pos_minus);
1390
1391
	if (settings_pos_plus){
1392
		if (menuPos < 0.68f) menuPos += 0.01f;
1393
		return;
1394
	}
1395
	else if (settings_pos_minus){
1396
		if (menuPos > 0.0f) menuPos -= 0.01f;
1397
		return;
1398
	}
1399
1400
}
1401
void AddsettingscolOption(char* text, RGBA &feature)
1402
{
1403
	AddOption(text, null, nullFunc, SUB::SETTINGS_COLOURS2);
1404
1405
	if (menu::printingop == menu::currentop) settings_rgba = &feature;
1406
}
1407
void SettingsColours()
1408
{
1409
	AddTitle("Menu Colours");
1410
	AddsettingscolOption("Title Box", titlebox);
1411
	AddsettingscolOption("Background", BG);
1412
	AddsettingscolOption("Title Text", titletext);
1413
	AddsettingscolOption("Option Text", optiontext);
1414
	AddsettingscolOption("Selected Text", selectedtext);
1415
	AddsettingscolOption("Option Breaks", optionbreaks);
1416
	AddsettingscolOption("Option Count", optioncount);
1417
	AddsettingscolOption("Selection Box", selectionhi);
1418
	AddToggle("Rainbow", loop_RainbowBoxes);
1419
}
1420
void SettingsColours2()
1421
{
1422
	bool settings_r_input = 0, settings_r_plus = 0, settings_r_minus = 0;
1423
	int *settings_rgba2;
1424
1425
	AddTitle("Set Colour");
1426
	AddNumber("Red", settings_rgba->R, 0, settings_r_input, settings_r_plus, settings_r_minus);
1427
	AddNumber("Green", settings_rgba->G, 0, settings_r_input, settings_r_plus, settings_r_minus);
1428
	AddNumber("Blue", settings_rgba->B, 0, settings_r_input, settings_r_plus, settings_r_minus);
1429
	AddNumber("Opacity", settings_rgba->A, 0, settings_r_input, settings_r_plus, settings_r_minus);
1430
1431
	switch (menu::currentop)
1432
	{
1433
	case 1: settings_rgba2 = &settings_rgba->R; break;
1434
	case 2: settings_rgba2 = &settings_rgba->G; break;
1435
	case 3: settings_rgba2 = &settings_rgba->B; break;
1436
	case 4: settings_rgba2 = &settings_rgba->A; break;
1437
	}
1438
1439
	if (settings_r_input){
1440
		int tempHash = abs(StringToInt(keyboard()));
1441
		if (!(tempHash >= 0 && tempHash <= 255)) PrintError_InvalidInput();
1442
		else *settings_rgba2 = tempHash;
1443
		return;
1444
	}
1445
1446
	if (settings_r_plus){
1447
		if (*settings_rgba2 < 255) (*settings_rgba2)++;
1448
		else *settings_rgba2 = 0;
1449
		return;
1450
	}
1451
	else if (settings_r_minus){
1452
		if (*settings_rgba2 > 0) (*settings_rgba2)--;
1453
		else *settings_rgba2 = 255;
1454
		return;
1455
	}
1456
}
1457
void AddsettingsfonOption(char* text, int font_index = -1, int &feature = inull)
1458
{
1459
	bool bit_changefont = 0, bit_setfeature = 0;
1460
	if (font_index == -1) AddOption(text, bit_setfeature, nullFunc, SUB::SETTINGS_FONTS2);
1461
	else AddOption(text, bit_changefont);
1462
1463
	if (bit_setfeature) settings_font = &feature;
1464
	else if (bit_changefont) *settings_font = font_index;
1465
}
1466
void SettingsFonts()
1467
{
1468
	AddTitle("Menu Fonts");
1469
	AddsettingsfonOption("Title", -1, font_title);
1470
	AddsettingsfonOption("Options", -1, font_options);
1471
	AddsettingsfonOption("Selected Option", -1, font_selection);
1472
	AddsettingsfonOption("Option Breaks", -1, font_breaks);
1473
}
1474
void SettingsFonts2()
1475
{
1476
	bool fonts2_input = 0;
1477
1478
	AddTitle("Set Font");
1479
	AddsettingsfonOption("Normalish", 0);
1480
	AddsettingsfonOption("Impactish", 4);
1481
	AddsettingsfonOption("Italic", 1);
1482
	AddsettingsfonOption("Pricedown", 7);
1483
	AddsettingsfonOption("Caps", 2);
1484
	AddOption("Input Index", fonts2_input);
1485
1486
	if (fonts2_input){
1487
		int tempInt = abs(StringToInt(keyboard()));
1488
		*settings_font = tempInt;
1489
		return;
1490
	}
1491
}
1492
1493
1494
1495
void SampleSub()
1496
{
1497
	bool sample_mapmod = 0, hour_plus = 0, hour_minus = 0, timescale_plus = 0, timescale_minus = 0, sample_invisible = 0, sample_gravity_gun_on = 0,
1498
	sample_gta2cam = 0;
1499
1500
	int sample_hour = GET_CLOCK_HOURS();
1501
1502
	AddTitle("SHRUNKEN TITLE FEATURE");
1503
1504
	AddBreak("---Map---");
1505
	AddOption("Load Map Mod", sample_mapmod);
1506
	AddTele("Teleport to Map Mod", 509.8423f, 5589.2422f, 792.0000f);
1507
1508
	AddBreak("---Weather---");
1509
	AddNumber("Hour", GET_CLOCK_HOURS(), 0, null, hour_plus, hour_minus);
1510
	AddNumber("Time Scale", current_timescale, 2, null, timescale_plus, timescale_minus);
1511
1512
	AddBreak("---Others---");
1513
	AddLocal("Invisibility", !IS_ENTITY_VISIBLE(PLAYER_PED_ID()), sample_invisible, sample_invisible);
1514
	AddToggle("Gravity Gun", loop_gravity_gun, sample_gravity_gun_on);
1515
	AddToggle("GTA 2 Cam", loop_gta2cam, sample_gta2cam, sample_gta2cam);
1516
	AddToggle("Massacre Mode", loop_massacre_mode);
1517
	AddOption("Create Escort", null, sample_createEscort);
1518
1519
	AddBreak("---deez breaks r ugly---");
1520
1521
1522
	if (sample_mapmod){
1523
		Any tempHash = GET_HASH_KEY("prop_container_01a");
1524
		PlaceObject(tempHash, 509.8423f, 5589.2422f, 791.0656f, 0.1410f, 0.0f, 65.3998f);
1525
		PlaceObject(tempHash, 520.5002f, 5584.3774f, 790.5033f, 5.4410f, 0.0f, 65.3998f);
1526
		PlaceObject(tempHash, 531.0571f, 5579.5405f, 788.6912f, 12.4410f, 0.0f, 65.3998f);
1527
		PlaceObject(tempHash, 541.3253f, 5574.8403f, 785.4896f, 19.4409f, 0.0f, 65.3998f);
1528
		PlaceObject(tempHash, 551.0662f, 5570.3701f, 780.7990f, 27.5407f, 0.0f, 65.3998f);
1529
		PlaceObject(tempHash, 560.1738f, 5566.2046f, 774.6979f, 35.0403f, 0.0f, 65.3998f);
1530
		PlaceObject(tempHash, 568.6718f, 5562.3198f, 767.4281f, 40.7396f, 0.0f, 65.3998f);
1531
		PlaceObject(tempHash, 576.9716f, 5558.5269f, 759.5663f, 40.7396f, 0.0f, 65.3998f);
1532
		PlaceObject(tempHash, 585.2493f, 5554.7471f, 751.7451f, 40.7396f, 0.0f, 65.3998f);
1533
		PlaceObject(tempHash, 593.5072f, 5550.9722f, 743.9170f, 40.7396f, 0.0f, 65.3998f);
1534
		PlaceObject(tempHash, 601.7770f, 5547.1912f, 736.0764f, 40.7396f, 0.0f, 65.3998f);
1535
		PlaceObject(tempHash, 610.0651f, 5543.3994f, 728.2167f, 40.7396f, 0.0f, 65.3998f);
1536
		PlaceObject(tempHash, 618.3337f, 5539.6226f, 720.3861f, 40.7936f, 0.0f, 65.3998f);
1537
		PlaceObject(tempHash, 626.6017f, 5535.8477f, 712.5473f, 40.7396f, 0.0f, 65.3998f);
1538
		PlaceObject(tempHash, 634.8616f, 5532.0669f, 704.7252f, 40.7396f, 0.0f, 65.3998f);
1539
		PlaceObject(tempHash, 643.1213f, 5528.2861f, 696.8940f, 40.7936f, 0.0f, 65.3998f);
1540
		PlaceObject(tempHash, 651.3914f, 5524.5059f, 689.0526f, 40.7396f, 0.0f, 65.3998f);
1541
		PlaceObject(tempHash, 659.6512f, 5520.7275f, 681.2211f, 40.7396f, 0.0f, 65.3998f);
1542
		PlaceObject(tempHash, 667.9110f, 5516.9424f, 673.3893f, 40.7396f, 0.0f, 65.3998f);
1543
		PlaceObject(tempHash, 676.1708f, 5513.1670f, 665.5580f, 40.7396f, 0.0f, 65.3998f);
1544
		PlaceObject(tempHash, 684.4307f, 5509.3789f, 657.7266f, 40.7396f, 0.0f, 65.3998f);
1545
		PlaceObject(tempHash, 692.6906f, 5505.6079f, 649.9052f, 40.7396f, 0.0f, 65.3998f);
1546
		PlaceObject(tempHash, 700.9504f, 5501.8271f, 642.0737f, 40.7396f, 0.0f, 65.3998f);
1547
		PlaceObject(tempHash, 709.2201f, 5498.0464f, 634.2426f, 40.7396f, 0.0f, 65.3998f);
1548
		PlaceObject(tempHash, 717.4602f, 5494.2759f, 626.4309f, 40.7396f, 0.0f, 65.3998f);
1549
		PlaceObject(tempHash, 725.7202f, 5490.4980f, 618.5996f, 40.7396f, 0.0f, 65.3998f);
1550
		PlaceObject(tempHash, 733.9800f, 5486.7226f, 610.7783f, 40.7396f, 0.0f, 65.3998f);
1551
		PlaceObject(tempHash, 742.5997f, 5482.7764f, 603.1669f, 36.9395f, 0.0f, 65.3998f);
1552
		PlaceObject(tempHash, 751.8304f, 5478.5518f, 596.3347f, 31.0392f, 0.0f, 65.3998f);
1553
		PlaceObject(tempHash, 761.7103f, 5474.0220f, 590.6132f, 24.5989f, 0.0f, 65.3998f);
1554
		PlaceObject(tempHash, 772.0702f, 5469.2827f, 586.0803f, 18.9288f, 0.0f, 65.3998f);
1555
		PlaceObject(tempHash, 782.8400f, 5464.3433f, 582.8604f, 11.5788f, 0.0f, 65.3998f);
1556
		PlaceObject(tempHash, 793.8899f, 5459.2847f, 581.1174f, 5.0787f, 0.0f, 65.3998f);
1557
		PlaceObject(tempHash, 805.1001f, 5454.1479f, 580.8762f, -2.5212f, 0.0f, 65.3998f);
1558
		PlaceObject(tempHash, 816.1702f, 5449.0796f, 581.9746f, -7.6213f, 0.0f, 65.3998f);
1559
		PlaceObject(tempHash, 827.1907f, 5444.0405f, 584.5823f, -16.6212f, 0.0f, 65.3998f);
1560
		PlaceObject(tempHash, 837.6807f, 5439.2407f, 588.8990f, -24.4210f, 0.0f, 65.3998f);
1561
		PrintBottomLeft(AddStrings("Hax by ~b~", "XBLToothpik"));
1562
		return;
1563
	}
1564
1565
	if (hour_plus){
1566
		if (sample_hour + 1 == 24) NETWORK_OVERRIDE_CLOCK_TIME(0, 0, 0);
1567
		else NETWORK_OVERRIDE_CLOCK_TIME((sample_hour + 1), 0, 0);
1568
		return;
1569
	}
1570
	else if (hour_minus){
1571
		if ((sample_hour - 1) == -1) NETWORK_OVERRIDE_CLOCK_TIME(23, 0, 0);
1572
		else NETWORK_OVERRIDE_CLOCK_TIME((sample_hour - 1), 0, 0);
1573
		return;
1574
	}
1575
1576
	if (timescale_plus){
1577
		if (current_timescale < 2.0f) current_timescale += 0.1f;
1578
		SET_TIME_SCALE(current_timescale);
1579
		return;
1580
	}
1581
	else if (timescale_minus){
1582
		if (current_timescale > 0.0f) current_timescale -= 0.1f;
1583
		SET_TIME_SCALE(current_timescale);
1584
		return;
1585
	}
1586
1587
	if (sample_invisible){
1588
		if (IS_ENTITY_VISIBLE(PLAYER_PED_ID())) SET_ENTITY_VISIBLE(PLAYER_PED_ID(), 0);
1589
		else SET_ENTITY_VISIBLE(PLAYER_PED_ID(), 1);
1590
		return;
1591
	}
1592
1593
	if (sample_gravity_gun_on){
1594
		PrintStringBottomCentre("Use Mr ~b~Pistol~s~ for Hax!");
1595
		return;
1596
	}
1597
1598
	if (sample_gta2cam){
1599
		if (loop_gta2cam)
1600
		{
1601
			if (DOES_CAM_EXIST(cam_gta2)) SET_CAM_ACTIVE(cam_gta2, 1);
1602
			else
1603
			{
1604
				cam_gta2 = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", 1);
1605
				ATTACH_CAM_TO_ENTITY(cam_gta2, PLAYER_PED_ID(), 0.0f, 0.0f, 8.5f, 1);
1606
				Vector3 Pos = GET_ENTITY_COORDS(PLAYER_PED_ID(), 1);
1607
				POINT_CAM_AT_COORD(cam_gta2, Pos.x, Pos.y, -1000000);
1608
				SET_CAM_ACTIVE(cam_gta2, 1);
1609
			}
1610
			RENDER_SCRIPT_CAMS(1, 0, 3000, 1, 0);
1611
		}
1612
		else if (DOES_CAM_EXIST(cam_gta2))
1613
			{
1614
				SET_CAM_ACTIVE(cam_gta2, 0);
1615
				DESTROY_CAM(cam_gta2, 0);
1616
				RENDER_SCRIPT_CAMS(0, 0, 3000, 1, 0);
1617
			}
1618
		return;
1619
	}
1620
1621
1622
1623
}
1624
1625
void YourSub()
1626
1627
{
1628
	// Initialise local variables here:
1629
	bool print_deez_nuts = 0;
1630
1631
	// Options' text here:
1632
	AddTitle("Timone n Pumba");
1633
	AddOption("Option 1", print_deez_nuts);
1634
	AddOption("Option 2", print_deez_nuts);
1635
	AddOption("Option 3", print_deez_nuts);
1636
	AddOption("Option 4", print_deez_nuts);
1637
	AddOption("Option 5", print_deez_nuts);
1638
	AddOption("Option 6", print_deez_nuts);
1639
	AddOption("Option 7", print_deez_nuts);
1640
	AddOption("Option 8", print_deez_nuts);
1641
	AddOption("Option 9", print_deez_nuts);
1642
	AddOption("Option 10", print_deez_nuts);
1643
	AddOption("Option 11", print_deez_nuts);
1644
	AddOption("Option 12", print_deez_nuts);
1645
	AddOption("Option 13", print_deez_nuts);
1646
	AddOption("Option 14", print_deez_nuts);
1647
	AddOption("Option 15", print_deez_nuts);
1648
	AddOption("Option 16", print_deez_nuts);
1649
	AddOption("Option 17", print_deez_nuts);
1650
	AddOption("Option 18", print_deez_nuts);
1651
	AddOption("Option 19", print_deez_nuts);
1652
	AddOption("Option 20", print_deez_nuts);
1653
	AddOption("Option 21", print_deez_nuts);
1654
	AddOption("Option 22", print_deez_nuts);
1655
	AddOption("Option 23", print_deez_nuts);
1656
	AddOption("Option 24", print_deez_nuts);
1657
	AddOption("Option 25", print_deez_nuts);
1658
	AddOption("Option 26", print_deez_nuts);
1659
	AddOption("Option 27", print_deez_nuts);
1660
	AddOption("Option 28", print_deez_nuts);
1661
	AddOption("Option 29", print_deez_nuts);
1662
	AddOption("Option 30", print_deez_nuts);
1663
	AddOption("Option 31", print_deez_nuts);
1664
	AddOption("Option 32", print_deez_nuts);
1665
1666
	// Options' code here:
1667
	if (print_deez_nuts)
1668
	{
1669
		PrintStringBottomCentre( AddStrings( AddInt_S( "Option ", menu::currentop ), " ~b~selected!" ) );
1670
		return; // Either use return; to exit to the switch if you don't have code below that you want executed.
1671
	}
1672
1673
1674
}
1675
1676
1677
1678
1679
1680
1681
}
1682
1683
1684
1685
1686
1687
1688
void menu::loops()
1689
{ 
1690
	/*	Make calls to functions that you want looped over here, e.g. ambient lights, whale guns, explosions, checks, flying deers, etc.
1691
		Can also be used for (bool) options that are to be executed from many parts of the script. */
1692
1693
	myVeh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID(), 0); // Store current vehicle
1694
1695
	if (loop_massacre_mode) set_massacre_mode(); // Massacre mode
1696
1697
	if (loop_RainbowBoxes && GET_GAME_TIMER() >= livetimer)
1698
	{	titlebox.R = RandomRGB(); titlebox.G = RandomRGB(); titlebox.B = RandomRGB();
1699
		BG.R = RandomRGB(); BG.G = RandomRGB(); BG.B = RandomRGB();
1700
		selectedtext.R = RandomRGB(); selectedtext.G = RandomRGB(); selectedtext.B = RandomRGB();
1701
	}
1702
1703
1704
	if (loop_gravity_gun) set_gravity_gun();
1705
1706
	if (loop_gta2cam) set_gta2_cam_rot();
1707
1708
}
1709
1710
void menu::submenu_switch()
1711
{ // Make calls to submenus over here.
1712
1713
	switch (currentsub)
1714
	{
1715
	case SUB::MAINMENU:					sub::MainMenu(); break;
1716
	case SUB::SETTINGS:					sub::Settings(); break;
1717
	case SUB::SETTINGS_COLOURS:			sub::SettingsColours(); break;
1718
	case SUB::SETTINGS_COLOURS2:		sub::SettingsColours2(); break;
1719
	case SUB::SETTINGS_FONTS:			sub::SettingsFonts(); break;
1720
	case SUB::SETTINGS_FONTS2:			sub::SettingsFonts2(); break;
1721
	case SUB::SAMPLE:					sub::SampleSub(); break;
1722
	case SUB::YOURSUB:					sub::YourSub(); break;
1723
//	case SUB::NAME						sub::name(); break;
1724
1725
	}
1726
}
1727
1728
1729
void menu::sub_handler()
1730
{
1731
	if (currentsub == SUB::CLOSED){
1732
		while_closed();
1733
	}
1734
1735
	else{
1736
		submenu_switch();
1737
		if (SetSub_delayed != NULL)
1738
		{
1739
			SetSub_new(SetSub_delayed);
1740
			SetSub_delayed = NULL;
1741
		}
1742
1743
		while_opened();
1744
1745
		if (GET_GAME_TIMER() >= livetimer) livetimer = GET_GAME_TIMER() + 1800; // 1.8s delay for rainbow related loops
1746
	}
1747
}
1748
void main()
1749
{
1750
	srand(GetTickCount());
1751
	while (true)
1752
	{
1753
		WAIT(0);
1754
		menu::base();
1755
		menu::loops();
1756
		menu::sub_handler();
1757
	}
1758
}