mirror of
https://github.com/iDisaster/GTAConnected.git
synced 2026-03-08 09:25:23 +00:00
867 lines
29 KiB
C
867 lines
29 KiB
C
/**
|
|
* @ MD Trident
|
|
* @ MD Series: Version 13, January 2017 //#ifdef Premium IS USED HERE!
|
|
* @ Copyright (C) 2017 IIV NATHAN VII / DEVILSDESIGN
|
|
*/
|
|
|
|
//#ifdef Premium IS USED HERE! /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
//Created by IIV NATHAN VII
|
|
// IF ISSUES ARISE because of button priorities or something (shouldn't do) LET ME KNOW! (Nathan) I should be able to sort it!
|
|
//Controls currently at line: 205!
|
|
//COPY_ANIMATIONS(Ped ped, Ped pednext, float speed); //Put ped in water and copy anims.. SwimWalk?
|
|
//#include <natives.h>
|
|
//#include <inccommon.h>
|
|
//#include <strings.h>
|
|
//#include <types.h>
|
|
//#include <consts.h>
|
|
|
|
//PUT THESE FUNCTIONS IN SHARED!
|
|
/*
|
|
void Shuffle_Vehicle_Seat(void) //WORKS ON BIKES TOO!
|
|
{
|
|
int tmp_veh;
|
|
if(!IS_CHAR_IN_ANY_CAR(pPlayer)) return;
|
|
GET_CAR_CHAR_IS_USING(pPlayer,&tmp_veh);
|
|
if(IS_CHAR_ON_ANY_BIKE(pPlayer))
|
|
{
|
|
int driver;
|
|
GET_DRIVER_OF_CAR(tmp_veh,&driver);
|
|
if(!DOES_CHAR_EXIST(driver))
|
|
WARP_CHAR_INTO_CAR(pPlayer,tmp_veh);
|
|
else if(driver == pPlayer && IS_CAR_PASSENGER_SEAT_FREE(tmp_veh,0))
|
|
WARP_CHAR_INTO_CAR_AS_PASSENGER(pPlayer,tmp_veh,0);
|
|
}
|
|
TASK_SHUFFLE_TO_NEXT_CAR_SEAT(pPlayer,tmp_veh);
|
|
}
|
|
|
|
void Clone_Car( int cveh, float x, float y, float z, float h, int *car_clone)
|
|
{
|
|
int model;
|
|
if(!DOES_VEHICLE_EXIST(cveh)) return;
|
|
int colour1,colour2,colourEXT1,colourEXT2;
|
|
int health;
|
|
float dirt_level;
|
|
GET_CAR_MODEL(cveh,&model);
|
|
GET_CAR_COLOURS(cveh, &colour1, &colour2);
|
|
GET_EXTRA_CAR_COLOURS(cveh, &colourEXT1, &colourEXT2);
|
|
GET_CAR_HEALTH(cveh, &health);
|
|
GET_VEHICLE_DIRT_LEVEL(cveh, &dirt_level);
|
|
bool siren = IS_CAR_SIREN_ON(cveh);
|
|
////////////////
|
|
CREATE_CAR(model,x,y,z,&cveh,true);
|
|
SET_VEHICLE_ALPHA(cveh,0); //should make vehicle transparent and appear slowly...
|
|
SET_CAR_HEADING(cveh,h);
|
|
SET_CAR_ON_GROUND_PROPERLY(cveh);
|
|
SET_CAR_HEALTH(cveh,health);
|
|
CHANGE_CAR_COLOUR(cveh,colour1,colour2);
|
|
SET_EXTRA_CAR_COLOURS(cveh,colourEXT1,colourEXT2);
|
|
SET_VEHICLE_DIRT_LEVEL(cveh,dirt_level); //can adjust dirt level and health based on vehicle helper being on..
|
|
SWITCH_CAR_SIREN(cveh,siren);
|
|
//If Vehicle helper looped (we can do this on tick delay!)
|
|
//SET_CAR_CAN_BE_DAMAGED(cveh,!vehicle_helper);
|
|
//SET_CAR_CAN_BE_VISIBLY_DAMAGED(cveh,!vehicle_helper);
|
|
//if doesn't work use SET_CAR_PROOFS(cveh,bool bulletproof, bool fireproof, bool explosionproof, bool colissionproof, bool meleeproof);
|
|
|
|
car_clone = cveh;
|
|
}
|
|
|
|
|
|
*/
|
|
|
|
|
|
#ifdef Premium //This is for the enum and loop voids
|
|
|
|
enum eKeyboardAntiPauseActions{
|
|
ACTION_COMPLETE_AND_DISABLED = 0,
|
|
ACTION_NETWORK_SPY_PLAYER = 1,
|
|
ACTION_NETWORK_MUTE_PLAYER = 2,
|
|
ACTION_NETWORK_KICK_PLAYER = 3,
|
|
ACTION_NETWORK_VIEW_PLAYER_PROFILE = 4,
|
|
};
|
|
|
|
void VerifyKeyboardSelectedNetworkIndex(void)
|
|
{
|
|
register int i;
|
|
if(Player_Display_Selection(KeyboardSelectedPlayerIndex)) //Skips developers :P
|
|
{
|
|
for(i = 0; i < MAX_PLAYERS; i++)
|
|
{
|
|
if(Player_Display_Selection(i)) continue;
|
|
KeyboardSelectedPlayerIndex = i;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
void MC_Keyboard_Network_Anti_Wait_Loop(void)
|
|
{
|
|
if(KeyboardAntiWaitAction == ACTION_COMPLETE_AND_DISABLED) return;
|
|
VerifyKeyboardSelectedNetworkIndex();
|
|
if(IS_GAME_KEYBOARD_KEY_JUST_PRESSED(KEY_ESC))
|
|
{
|
|
KeyboardAntiWaitAction = ACTION_COMPLETE_AND_DISABLED;
|
|
CLEAR_PRINTS();
|
|
return;
|
|
}
|
|
else if(IS_GAME_KEYBOARD_KEY_JUST_PRESSED(KEY_RIGHT_ARROW))
|
|
{
|
|
KeyboardSelectedPlayerIndex++;
|
|
if(Player_Display_Selection(KeyboardSelectedPlayerIndex))
|
|
{
|
|
register int i;
|
|
for(i = KeyboardSelectedPlayerIndex; i < MAX_PLAYERS; i++)
|
|
{
|
|
if(Player_Display_Selection(i)) continue;
|
|
KeyboardSelectedPlayerIndex = i;
|
|
break;
|
|
}
|
|
if(Player_Display_Selection(KeyboardSelectedPlayerIndex)) //unable to increase
|
|
{
|
|
VerifyKeyboardSelectedNetworkIndex(); //will re-scan
|
|
}
|
|
}
|
|
}
|
|
else if(IS_GAME_KEYBOARD_KEY_JUST_PRESSED(KEY_LEFT_ARROW))
|
|
{
|
|
KeyboardSelectedPlayerIndex--;
|
|
if(Player_Display_Selection(KeyboardSelectedPlayerIndex))
|
|
{
|
|
register int i;
|
|
for(i = KeyboardSelectedPlayerIndex; i > -1; i--) //MAY NEED CHANGING TO 0, not sure, think this is correct! - Nathan
|
|
{
|
|
if(Player_Display_Selection(i)) continue;
|
|
KeyboardSelectedPlayerIndex = i;
|
|
break;
|
|
}
|
|
if(Player_Display_Selection(KeyboardSelectedPlayerIndex))
|
|
{
|
|
VerifyKeyboardSelectedNetworkIndex(); //will re-scan
|
|
}
|
|
}
|
|
}
|
|
|
|
char * buffer[32];
|
|
Strcpy(buffer, "~b~MD: ~PAD_LEFT~ "); //27
|
|
PLAYER_NAME_WITH_COLOUR(KeyboardSelectedPlayerIndex, &buffer); //WORKS! //45
|
|
Strcat(buffer, "~s~ ~PAD_RIGHT~~n~"); //63
|
|
if(KeyboardAntiWaitAction == ACTION_NETWORK_SPY_PLAYER)
|
|
{
|
|
Strcat(buffer, keyboard_close_on_network_selection ? "Spy = ENTER" : "Spy = ENTER, Exit = ESC");
|
|
if(IS_GAME_KEYBOARD_KEY_JUST_PRESSED(KEY_ENTER))
|
|
{
|
|
if(Is_Whitelisted(KeyboardSelectedPlayerIndex))
|
|
{
|
|
PLAY_AUDIO_EVENT("FRONTEND_MENU_MP_UNREADY");
|
|
}
|
|
else
|
|
{
|
|
if(PLAYER_HAS_CHAR(KeyboardSelectedPlayerIndex))
|
|
{
|
|
int tmp_ped;
|
|
GET_PLAYER_CHAR(KeyboardSelectedPlayerIndex,&tmp_ped);
|
|
//Spectate_Char = tmp_ped;
|
|
//SpectatePlayerIndex = KeyboardSelectedPlayerIndex;
|
|
SetByteSet(&SpectateAndAttachByteSet, SPECTATE_PLAYER_INDEX, KeyboardSelectedPlayerIndex);
|
|
//MD_Spectate_Player(tmp_ped); pretty sure the loop will trigger this
|
|
if(keyboard_close_on_network_selection)
|
|
{
|
|
char * nigger[32];
|
|
Strcpy(nigger, "~b~MD: ~s~Spectating: "); //31
|
|
PLAYER_NAME_WITH_COLOUR(KeyboardSelectedPlayerIndex, &nigger); //WORKS! = 40
|
|
Strcat(nigger, "~s~.~n~Hold ~PAD_LB~ & Press ~PAD_RB~ to disable."); //74
|
|
Alert(nigger, false);
|
|
KeyboardAntiWaitAction = ACTION_COMPLETE_AND_DISABLED;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if(KeyboardAntiWaitAction == ACTION_NETWORK_MUTE_PLAYER)
|
|
{
|
|
Strcat(buffer, NETWORK_IS_PLAYER_MUTED_BY_ME(KeyboardSelectedPlayerIndex) ? "UnMute" : "Mute");
|
|
Strcat(buffer, keyboard_close_on_network_selection ? " = ENTER" : " = ENTER, Exit = ESC");
|
|
if(IS_GAME_KEYBOARD_KEY_JUST_PRESSED(KEY_ENTER))
|
|
{
|
|
if(Is_Whitelisted(KeyboardSelectedPlayerIndex))
|
|
{
|
|
NETWORK_SET_PLAYER_MUTED(KeyboardSelectedPlayerIndex,false);
|
|
PLAY_AUDIO_EVENT("FRONTEND_MENU_MP_UNREADY");
|
|
}
|
|
else
|
|
{
|
|
NETWORK_SET_PLAYER_MUTED(KeyboardSelectedPlayerIndex, !NETWORK_IS_PLAYER_MUTED_BY_ME(KeyboardSelectedPlayerIndex));
|
|
if(keyboard_close_on_network_selection)
|
|
{
|
|
KeyboardAntiWaitAction = ACTION_COMPLETE_AND_DISABLED;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if(KeyboardAntiWaitAction == ACTION_NETWORK_KICK_PLAYER)
|
|
{
|
|
Strcat(buffer, keyboard_close_on_network_selection ? "Kick = ENTER" : "Kick = ENTER, Exit = ESC");
|
|
if(IS_GAME_KEYBOARD_KEY_JUST_PRESSED(KEY_ENTER))
|
|
{
|
|
if(Is_Whitelisted(KeyboardSelectedPlayerIndex))
|
|
{
|
|
PLAY_AUDIO_EVENT("FRONTEND_MENU_MP_UNREADY");
|
|
}
|
|
else
|
|
{
|
|
NETWORK_KICK_PLAYER(KeyboardSelectedPlayerIndex);
|
|
if(keyboard_close_on_network_selection)
|
|
{
|
|
KeyboardAntiWaitAction = ACTION_COMPLETE_AND_DISABLED;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if(KeyboardAntiWaitAction == ACTION_NETWORK_VIEW_PLAYER_PROFILE)
|
|
{
|
|
Strcat(buffer, keyboard_close_on_network_selection ? "Profile = ENTER" : "Profile = ENTER, Exit = ESC");
|
|
//gt spoofers, lets allow people to view all profiles (no whitelist)
|
|
if(IS_GAME_KEYBOARD_KEY_JUST_PRESSED(KEY_ENTER))
|
|
{
|
|
NETWORK_SHOW_PLAYER_PROFILE_UI(KeyboardSelectedPlayerIndex);
|
|
if(keyboard_close_on_network_selection)
|
|
{
|
|
KeyboardAntiWaitAction = ACTION_COMPLETE_AND_DISABLED;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
CLEAR_PRINTS();
|
|
ADD_NEXT_MESSAGE_TO_PREVIOUS_BRIEFS(false);
|
|
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", buffer, 300,true);
|
|
|
|
}
|
|
#endif
|
|
|
|
//bool keyboard_delete_abandoned_vehicles_only = true; //Has to be global!
|
|
void MC_Keyboard(void) //LOOP THIS ALWAYS!
|
|
{
|
|
#ifdef Premium
|
|
MC_Keyboard_Network_Anti_Wait_Loop();
|
|
#endif
|
|
#ifdef VERSION_PC
|
|
if(NETWORK_IS_PLAYER_TYPING(iPlayer)) return;
|
|
#endif
|
|
/*
|
|
//Controls
|
|
//HOLD W: (Weather)
|
|
//Press:
|
|
//S for Sunny
|
|
//T for thunder
|
|
//D for drizzle
|
|
//C for cloudy
|
|
//M for Misty
|
|
//B for breeze (windy)
|
|
//E for extra sunny
|
|
//F for Freeze weather toggle
|
|
/////
|
|
//HOLD T: (Time)
|
|
//Press:
|
|
//M for morning
|
|
//D for day
|
|
//N for night
|
|
//E for evening
|
|
//A for afternoon
|
|
//C for cycle time
|
|
//F for freeze time toggle
|
|
/////
|
|
//Hold V: (Vehicle)
|
|
//Press:
|
|
//F to flip
|
|
//S to shuffle seats (also works on bikes)
|
|
//R to repair
|
|
//D to delete
|
|
//C for clone
|
|
//E to eject yourself
|
|
//L to toggle door locks
|
|
//K to kick out passengers (respawns your car)
|
|
//I to set invincible
|
|
/////
|
|
//Hold D: (Delete)
|
|
//Press:
|
|
//P for peds
|
|
//O for objects
|
|
//V for vehicles (basically every type of vehicle)
|
|
//C for cars
|
|
//M for motorbikes
|
|
//B for boats
|
|
//H for helicopters
|
|
//A for abandoned vehicles only toggle
|
|
/////
|
|
//Hold P: (Player)
|
|
//Press:
|
|
//G for god mode toggle
|
|
//A for auto-aim toggle
|
|
//I for infinite ammo toggle
|
|
//W for give weapons
|
|
//V for Visibility toggle
|
|
//F for forcefield toggle
|
|
//N for never wanted toggle
|
|
//J for super jump toggle
|
|
//R for super run toggle
|
|
//K for Kill
|
|
//D for Detach
|
|
//E for Explosion (premium only)
|
|
/////
|
|
//Hold N: (Network) (premium only)
|
|
//Press:
|
|
//S for Spy (Player selection)
|
|
//M for mute (Player selection)
|
|
//K for kick (Player selection)
|
|
//P for profile
|
|
//C for Close on player selection toggle
|
|
////////////////
|
|
|
|
*/
|
|
//register int i;
|
|
int i;
|
|
//W (weather)
|
|
if(IS_GAME_KEYBOARD_KEY_PRESSED(KEY_W)) //Weather options
|
|
{
|
|
int weathers[8];
|
|
weathers[0] = WEATHER_SUNNY;
|
|
weathers[1] = WEATHER_LIGHTNING;
|
|
weathers[2] = WEATHER_RAINING;
|
|
weathers[3] = WEATHER_DRIZZLE;
|
|
weathers[4] = WEATHER_CLOUDY;
|
|
weathers[5] = WEATHER_FOGGY;
|
|
weathers[6] = WEATHER_SUNNY_WINDY;
|
|
weathers[7] = WEATHER_EXTRA_SUNNY;
|
|
int keys[9];
|
|
keys[0] = KEY_S; //weather sunny
|
|
keys[1] = KEY_T; //weather thunder
|
|
keys[2] = KEY_R; //weather raining
|
|
keys[3] = KEY_D; //weather drizzle
|
|
keys[4] = KEY_C; //weather cloudy
|
|
keys[5] = KEY_M; //weather misty (foggy)
|
|
keys[6] = KEY_B; //weather breeze (windy)
|
|
keys[7] = KEY_E; //weather extra_sunny
|
|
keys[8] = KEY_F; //freeze weather
|
|
char* messages[9];
|
|
messages[0] = "sunny.";
|
|
messages[1] = "thunder.";
|
|
messages[2] = "raining.";
|
|
messages[3] = "drizzle.";
|
|
messages[4] = "cloudy.";
|
|
messages[5] = "misty/foggy.";
|
|
messages[6] = "breezy/windy";
|
|
messages[7] = "extra sunny";
|
|
messages[8] = (GetByteInSet(WeatherTimeAutoLockByteSet, FREEZE_WEATHER) == 50 ? "un-freeze." : "freeze.");
|
|
for(i = 0; i < 9; i++)
|
|
{
|
|
if(!IS_GAME_KEYBOARD_KEY_JUST_PRESSED(keys[i])) continue;
|
|
|
|
if(i >= 0 && i < 8)
|
|
{
|
|
MD_SET_WEATHER(weathers[i]);
|
|
}
|
|
else if(i == 8)
|
|
{
|
|
if(GetByteInSet(WeatherTimeAutoLockByteSet, FREEZE_WEATHER) == 50)
|
|
{
|
|
int weatha;
|
|
GET_CURRENT_WEATHER(&weatha);
|
|
SetByteSet(&WeatherTimeAutoLockByteSet, FREEZE_WEATHER, weatha);
|
|
}
|
|
else
|
|
{
|
|
SetByteSet(&WeatherTimeAutoLockByteSet, FREEZE_WEATHER, 50);
|
|
}
|
|
}
|
|
Alert_Two("~b~MD: ~s~Weather command accepted",messages[i],false);
|
|
break;
|
|
//If using freeze weather set freeze weather here to weathers[i]
|
|
|
|
}
|
|
//Can make admin commands to force time and weather!
|
|
}
|
|
else if(IS_GAME_KEYBOARD_KEY_PRESSED(KEY_T)) //Time options //this is host only unless you enable freeze time! (could implement admin commands to force weather/time also)
|
|
{
|
|
//time
|
|
int keys[7];
|
|
keys[0] = KEY_M; //time morning
|
|
keys[1] = KEY_D; //time day
|
|
keys[2] = KEY_N; //time night
|
|
keys[3] = KEY_E; //time evening
|
|
keys[4] = KEY_A; //afternoon
|
|
keys[5] = KEY_F; //freeze time
|
|
keys[6] = KEY_C; //Cycle time
|
|
int times[5];
|
|
times[0] = 9; //9AM (morning)
|
|
times[1] = 12; //12 //day
|
|
times[2] = 24; //2400, midnight
|
|
times[3] = 18; //6PM //evening
|
|
times[4] = 15; //3PM Afternoon
|
|
char* messages[7];
|
|
messages[0] = "morning.";
|
|
messages[1] = "day.";
|
|
messages[2] = "midnight.";
|
|
messages[3] = "evening.";
|
|
messages[4] = "afternoon.";
|
|
messages[5] = (GetByteInSet(WeatherTimeAutoLockByteSet, FREEZE_TIME_HOUR) == 25 ? "un-freeze." : "freeze."); //Pretty sure these should be flipped as it's before process!
|
|
messages[6] = (GetBit(MD_Misc_OptionsBitSet, MD_MISC_TIME_CYCLE) ? "time cycle off." : "time cycle on."); //flipped!
|
|
for(i = 0; i < 7; i++)
|
|
{
|
|
if(!IS_GAME_KEYBOARD_KEY_JUST_PRESSED(keys[i])) continue;
|
|
|
|
if( i < 5 )
|
|
{
|
|
SET_TIME_OF_DAY(times[i],00);
|
|
if(GetByteInSet(WeatherTimeAutoLockByteSet, FREEZE_TIME_HOUR) != 25)
|
|
{
|
|
SetByteSet(&WeatherTimeAutoLockByteSet, FREEZE_TIME_HOUR, times[i]);
|
|
}
|
|
}
|
|
else if(i == 5)
|
|
{
|
|
if(GetByteInSet(WeatherTimeAutoLockByteSet, FREEZE_TIME_HOUR) == 25)
|
|
{
|
|
int houa, minuta;
|
|
GET_TIME_OF_DAY(&houa,&minuta);
|
|
SetByteSet(&WeatherTimeAutoLockByteSet, FREEZE_TIME_HOUR, houa);
|
|
SetByteSet(&WeatherTimeAutoLockByteSet, FREEZE_TIME_MINUTE, minuta);
|
|
}
|
|
else
|
|
{
|
|
SetByteSet(&WeatherTimeAutoLockByteSet, FREEZE_TIME_HOUR, 25);
|
|
SetByteSet(&WeatherTimeAutoLockByteSet, FREEZE_TIME_MINUTE, 0);
|
|
}
|
|
}
|
|
else if(i == 6)
|
|
{
|
|
ToggleBit(MD_Misc_OptionsBitSet, MD_MISC_TIME_CYCLE);
|
|
}
|
|
Alert_Two("~b~MD: ~s~Time command accepted",messages[i],false);
|
|
break;
|
|
}
|
|
|
|
}
|
|
else if(IS_GAME_KEYBOARD_KEY_PRESSED(KEY_V)) //Vehicle options
|
|
{
|
|
int tmp_veh,nvid,driver;
|
|
if(IS_CHAR_IN_ANY_CAR(pPlayer))
|
|
{
|
|
GET_CAR_CHAR_IS_USING(pPlayer,&tmp_veh);
|
|
GET_DRIVER_OF_CAR(tmp_veh,&driver);
|
|
GET_NETWORK_ID_FROM_VEHICLE(tmp_veh,&nvid);
|
|
int keys[9];
|
|
keys[0] = KEY_F; //Flip vehicle
|
|
keys[1] = KEY_S; //shuffle seats
|
|
keys[2] = KEY_R; //repair vehicle
|
|
keys[3] = KEY_C; //Clone Vehicle //use KEY_C (clone) and KEY_D for Delete
|
|
keys[4] = KEY_E; //Eject from vehicle
|
|
keys[5] = KEY_L; //Lock vehicle
|
|
keys[6] = KEY_K; //kick out passengers
|
|
keys[7] = KEY_D; //Delete vehicle
|
|
keys[8] = KEY_I; //Invincibility
|
|
char* second_string = "";
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
if(!IS_GAME_KEYBOARD_KEY_JUST_PRESSED(keys[i])) continue;
|
|
|
|
if( (i == 0 || i == 2 || i == 5 || i == 8 || i == 6 || i == 7 ) && (driver != pPlayer)) //works always and avoids fcar protection net id glitch
|
|
{
|
|
if(!network_control(nvid)) continue;
|
|
}
|
|
float x,y,z,h;
|
|
GET_CHAR_COORDINATES(pPlayer,&x,&y,&z);
|
|
GET_CHAR_HEADING(pPlayer,&h);
|
|
|
|
if(i == 0) //KEY_F (flip)
|
|
{
|
|
SET_CAR_ON_GROUND_PROPERLY(tmp_veh);
|
|
second_string = "flip vehicle.";
|
|
}
|
|
else if(i == 1) //KEY_S (shuffle seats)
|
|
{
|
|
Shuffle_Vehicle_Seat();
|
|
second_string = "shuffle seats.";
|
|
}
|
|
else if(i == 2) //KEY_R //repair
|
|
{
|
|
FIX_CAR(tmp_veh);
|
|
SET_VEHICLE_DIRT_LEVEL(tmp_veh,0.0);
|
|
second_string = "repair vehicle.";
|
|
}
|
|
else if(i == 3) //KEY_C //clone vehicle
|
|
{
|
|
int rand,tmp;
|
|
GET_CAR_HEADING(tmp_veh,&h);
|
|
GENERATE_RANDOM_INT_IN_RANGE(0,1,&rand);
|
|
GET_OFFSET_FROM_CAR_IN_WORLD_COORDS(tmp_veh,(rand == 1 ? +3 : -3),0,0,&x,&y,&z);
|
|
Clone_Car(tmp_veh,x,y,z,h,&tmp);
|
|
OPEN_CAR_DOOR(tmp,(rand == 1 ? 0 : 1)); //if spawned on right, open drivers door, if spawned on left, open passenger door
|
|
second_string = "clone vehicle.";
|
|
}
|
|
else if(i == 4) //KEY_E //Eject from vehicle
|
|
{
|
|
REMOVE_CHAR_FROM_CAR_MAINTAIN_POSITION(pPlayer,tmp_veh); //TEST THIS! - Nathan --> this works!
|
|
second_string = "eject from vehicle.";
|
|
}
|
|
else if(i == 5) //KEY_L //Lock vehicle
|
|
{
|
|
int lock;
|
|
GET_CAR_DOOR_LOCK_STATUS(tmp_veh,&lock);
|
|
LOCK_CAR_DOORS(tmp_veh, ( (lock == VEHICLE_DOOR_UNLOCKED) ? VEHICLE_DOOR_LOCKED_BOTH_SIDES : VEHICLE_DOOR_UNLOCKED) );
|
|
second_string = (lock == VEHICLE_DOOR_UNLOCKED ? "doors locked." : "doors unlocked.");
|
|
}
|
|
else if(i == 6) //KEY_K //kick out passengers
|
|
{
|
|
#ifdef Premium
|
|
int tmp;
|
|
float speed;
|
|
GET_CAR_SPEED(tmp_veh,&speed);
|
|
Clone_Car(tmp_veh,x,y,z,h,&tmp);
|
|
DELETE_CAR(&tmp_veh);
|
|
WARP_CHAR_INTO_CAR(pPlayer,tmp);
|
|
SET_CAR_FORWARD_SPEED(tmp,speed);
|
|
second_string = "eject passengers.";
|
|
#else
|
|
Alert(PREMIUM_ONLY_STRING,true);
|
|
return;
|
|
#endif
|
|
|
|
}
|
|
else if(i == 7) //KEY_D //delete vehicle
|
|
{
|
|
DELETE_CAR(&tmp_veh);
|
|
second_string = "delete vehicle.";
|
|
}
|
|
else if(i == 8)
|
|
{
|
|
SET_CAR_CAN_BE_DAMAGED(tmp_veh,false);
|
|
SET_CAR_CAN_BE_VISIBLY_DAMAGED(tmp_veh,false);
|
|
SET_CAN_BURST_CAR_TYRES(tmp_veh,false);
|
|
SET_CAR_PROOFS(tmp_veh,true,true,true,true,true);
|
|
second_string = "set invincible.";
|
|
}
|
|
|
|
Alert_Two("~b~MD: ~s~Vehicle command accepted",second_string,false);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else if(IS_GAME_KEYBOARD_KEY_PRESSED(KEY_D)) //Delete options
|
|
{
|
|
int keys[8];
|
|
keys[0] = KEY_P; //Peds
|
|
keys[1] = KEY_O; //Objects
|
|
keys[2] = KEY_V; //Vehicles //KEY_A for abandoned mode toggle
|
|
keys[3] = KEY_C; //Cars
|
|
keys[4] = KEY_M; //MotorBikes
|
|
keys[5] = KEY_B; //Boats
|
|
keys[6] = KEY_H; //Helicopters
|
|
keys[7] = KEY_A; //Abandoned vehicles only toggle
|
|
char deletes[7];
|
|
deletes[0] = 0;
|
|
deletes[1] = 1;
|
|
deletes[2] = (keyboard_delete_abandoned_vehicles_only ? 3 : 2);
|
|
deletes[3] = (keyboard_delete_abandoned_vehicles_only ? 5 : 4);
|
|
deletes[4] = (keyboard_delete_abandoned_vehicles_only ? 7 : 6);
|
|
deletes[5] = (keyboard_delete_abandoned_vehicles_only ? 9 : 8);
|
|
deletes[6] = (keyboard_delete_abandoned_vehicles_only ? 11 : 10);
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
if(!IS_GAME_KEYBOARD_KEY_JUST_PRESSED(keys[i])) continue;
|
|
if(i == 7)
|
|
{
|
|
keyboard_delete_abandoned_vehicles_only = !keyboard_delete_abandoned_vehicles_only;
|
|
Alert_Two("~b~MD: ~s~Keyboard's vehicle delete mode",(keyboard_delete_abandoned_vehicles_only ? "abandoned only." : "all."),false);
|
|
break;
|
|
}
|
|
Universal_Delete(325,deletes[i],true);
|
|
break;
|
|
}
|
|
}
|
|
else if(IS_GAME_KEYBOARD_KEY_PRESSED(KEY_P)) //Player options
|
|
{
|
|
int keys[12];
|
|
keys[0] = KEY_G; //God mode toggle
|
|
keys[1] = KEY_I; //Infinite ammo toggle
|
|
keys[2] = KEY_W; //Give weapons (must make function give_weapons(ped, episode))
|
|
keys[3] = KEY_K; //Kill self
|
|
keys[4] = KEY_N; //Never wanted
|
|
keys[5] = KEY_F; //Forcefield
|
|
keys[6] = KEY_V; //Visibility
|
|
keys[7] = KEY_J; //Super jump
|
|
keys[8] = KEY_R; //Super run
|
|
keys[9] = KEY_A; //Auto-aim
|
|
keys[10] = KEY_D; //Detach
|
|
keys[11] = KEY_E; //Explosion (premium only)
|
|
//keys[] = KEY_P; //Super punch (also known as super powers)
|
|
char* second_string = "";
|
|
for(i = 0; i < 12; i ++)
|
|
{
|
|
if(!IS_GAME_KEYBOARD_KEY_JUST_PRESSED(keys[i])) continue;
|
|
|
|
if(i == 0) //God mode toggle
|
|
{
|
|
ToggleBit(pPlayerOptionsBitSet, PLAYER_OPTION_GODMODE);
|
|
second_string = (GetBit(pPlayerOptionsBitSet, PLAYER_OPTION_GODMODE) ? "god mode on." : "god mode off.");
|
|
}
|
|
else if(i == 1)
|
|
{
|
|
ToggleBit(pPlayerOptionsBitSet, PLAYER_OPTION_INFINITE_AMMO);
|
|
second_string = (GetBit(pPlayerOptionsBitSet, PLAYER_OPTION_INFINITE_AMMO) ? "infinite ammo on." : "infinite ammo off.");
|
|
}
|
|
else if(i == 2)
|
|
{
|
|
GIVE_EPISODIC_WEAPONS_TO_CHAR(pPlayer,Episode);
|
|
second_string = "give weapons.";
|
|
}
|
|
else if(i == 3)
|
|
{
|
|
SET_CHAR_HEALTH(pPlayer,-1);
|
|
second_string = "kill.";
|
|
}
|
|
else if(i == 4)
|
|
{
|
|
ToggleBit(pPlayerOptionsBitSet, PLAYER_OPTION_NEVER_WANTED);
|
|
second_string = (GetBit(pPlayerOptionsBitSet, PLAYER_OPTION_NEVER_WANTED) ? "never wanted on." : "never wanted off.");
|
|
}
|
|
else if(i == 5)
|
|
{
|
|
ToggleBit(pPlayerOptionsBitSet, PLAYER_OPTION_FORCE_FIELD);
|
|
second_string = (GetBit(pPlayerOptionsBitSet, PLAYER_OPTION_FORCE_FIELD) ? "force field on." : "force field off.");
|
|
}
|
|
else if(i == 6)
|
|
{
|
|
SET_CHAR_VISIBLE(pPlayer,!IS_CHAR_VISIBLE(pPlayer));
|
|
second_string = (IS_CHAR_VISIBLE(pPlayer) ? "invisibility off." : "invisibility on.");
|
|
}
|
|
else if(i == 7)
|
|
{
|
|
ToggleBit(pPlayerOptionsBitSet, PLAYER_OPTION_SUPER_JUMP);
|
|
second_string = (GetBit(pPlayerOptionsBitSet, PLAYER_OPTION_SUPER_JUMP) ? "super jump on." : "super jump off.");
|
|
}
|
|
else if(i == 8)
|
|
{
|
|
ToggleBit(pPlayerOptionsBitSet, PLAYER_OPTION_SUPER_RUN);
|
|
second_string = (GetBit(pPlayerOptionsBitSet, PLAYER_OPTION_SUPER_RUN) ? "super run on." : "super run off.");
|
|
}
|
|
else if(i == 9)
|
|
{
|
|
ToggleBit(pPlayerOptionsBitSet, PLAYER_OPTION_INFINITE_AMMO);
|
|
second_string = (GetBit(pPlayerOptionsBitSet, PLAYER_OPTION_INFINITE_AMMO) ? "auto-aim on." : "auto-aim off.");
|
|
}
|
|
else if(i == 10)
|
|
{
|
|
Detach_pPlayer();
|
|
second_string = "detached.";
|
|
}
|
|
else if(i == 11) //explosion
|
|
{
|
|
#ifdef Premium
|
|
float x,y,z;
|
|
GET_CHAR_COORDINATES(pPlayer, &x, &y, &z);
|
|
ADD_EXPLOSION(x, y, z, EXPLOSION_SHIP_DESTROY, 10.0, true, false, 0.7f);
|
|
second_string = "explosion.";
|
|
#else
|
|
Alert(PREMIUM_ONLY_STRING,true);
|
|
return;
|
|
#endif
|
|
}
|
|
Alert_Two("~b~MD: ~s~Player command accepted",second_string,false);
|
|
break;
|
|
}
|
|
|
|
}
|
|
else if(IS_GAME_KEYBOARD_KEY_PRESSED(KEY_N)) //Network Options
|
|
{
|
|
#ifdef Premium
|
|
int keys[5];
|
|
keys[0] = KEY_S; //Spy on player
|
|
keys[1] = KEY_M; //Mute player
|
|
keys[2] = KEY_K; //kick player
|
|
keys[3] = KEY_C; //Close on network player selection toggle
|
|
keys[4] = KEY_P; //Open profile of player
|
|
//no second string needed here as loop handles it..
|
|
for(i = 0; i < 5; i++)
|
|
{
|
|
if(!IS_GAME_KEYBOARD_KEY_JUST_PRESSED(keys[i])) continue;
|
|
|
|
if(i == 0)
|
|
{
|
|
KeyboardAntiWaitAction = ACTION_NETWORK_SPY_PLAYER;
|
|
return; //YES THIS IS SUPPOSED TO BE HERE! INPUT IS NOW LISTENED FOR BY THE OTHER FUNCTION
|
|
}
|
|
else if(i == 1)
|
|
{
|
|
KeyboardAntiWaitAction = ACTION_NETWORK_MUTE_PLAYER;
|
|
return;
|
|
}
|
|
else if(i == 2)
|
|
{
|
|
if(IS_THIS_MACHINE_THE_SERVER())
|
|
{
|
|
KeyboardAntiWaitAction = ACTION_NETWORK_KICK_PLAYER;
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
Alert("~b~MD: ~s~You are not host.",false);
|
|
}
|
|
}
|
|
else if(i == 3)
|
|
{
|
|
keyboard_close_on_network_selection = !keyboard_close_on_network_selection;
|
|
if(KeyboardAntiWaitAction == ACTION_COMPLETE_AND_DISABLED)
|
|
{
|
|
Alert( keyboard_close_on_network_selection ? "~b~MD: ~s~Keyboard menu will now close on player selection." : "~b~MD: ~s~Keyboard menu will now stay open on player selection.",false);
|
|
}
|
|
}
|
|
else if(i == 4)
|
|
{
|
|
KeyboardAntiWaitAction = ACTION_NETWORK_VIEW_PLAYER_PROFILE;
|
|
return;
|
|
}
|
|
}
|
|
#else
|
|
Alert(PREMIUM_ONLY_STRING,true);
|
|
return;
|
|
#endif
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/* Invite stuff for future reference (Devil wants invites done through menu I think) - Nathan
|
|
|
|
extern boolean NETWORK_CHECK_INVITE_ARRIVAL(void);
|
|
extern boolean NETWORK_HAVE_ACCEPTED_INVITE(void);
|
|
extern boolean NETWORK_IS_INVITEE_ONLINE(void);
|
|
extern void NETWORK_CLEAR_INVITE_ARRIVAL(void);
|
|
extern void NETWORK_INVITE_FRIEND(char *friendname, char *ukn);//NETWORK_INVITE_FRIEND(NETWORK_GET_FRIEND_NAME(I), "");
|
|
|
|
NETWORK_GET_NUM_UNACCEPTED_INVITES(void);
|
|
extern int NETWORK_GET_UNACCEPTED_INVITE_EPISODE(int invite_id);
|
|
extern int NETWORK_GET_UNACCEPTED_INVITE_GAME_MODE(int invite_id);
|
|
*/
|
|
|
|
//GAME MODES v
|
|
/*
|
|
enum eGameMode{
|
|
GAME_MODE_BOMB_DA_BASE_II = 15,
|
|
GAME_MODE_CAR_JACK_CITY = 5,
|
|
GAME_MODE_COPS_AND_CROOKS = 10,
|
|
GAME_MODE_DEAL_BREAKER = 13,
|
|
GAME_MODE_DEATHMATCH = 0,
|
|
GAME_MODE_FREE_MODE = 0x10,
|
|
GAME_MODE_GTA_RACE = 7,
|
|
GAME_MODE_HANGMANS_NOOSE = 14,
|
|
GAME_MODE_MAFIYA_WORK = 2,
|
|
GAME_MODE_NONE = -1,
|
|
GAME_MODE_PARTY_MODE = 8,
|
|
GAME_MODE_RACE = 6,
|
|
GAME_MODE_TEAM_CAR_JACK_CITY = 4,
|
|
GAME_MODE_TEAM_DEATHMATCH = 1,
|
|
GAME_MODE_TEAM_MAFIYA_WORK = 3,
|
|
GAME_MODE_TURF_WAR = 12,
|
|
GAME_MODE_UNKNOWN_11 = 11,
|
|
GAME_MODE_UNKNOWN_9 = 9
|
|
};
|
|
*/
|
|
|
|
/* INVITE ALL FRIENDS TEST
|
|
int i;
|
|
for(i = 0; i < NETWORK_GET_FRIEND_COUNT(); i++)
|
|
{
|
|
if(NETWORK_DID_INVITE_FRIEND(NETWORK_GET_FRIEND_NAME(i))) continue;
|
|
NETWORK_INVITE_FRIEND(NETWORK_GET_FRIEND_NAME(i), "");
|
|
print_two(NETWORK_GET_FRIEND_NAME(i),"was sent an invite to the game");
|
|
int tick = 0;
|
|
do
|
|
{
|
|
if(!NETWORK_CHECK_INVITE_ARRIVAL(i))
|
|
{
|
|
tick++; //total of 3 seconds (30 times 100ms)
|
|
WAIT(100);
|
|
}
|
|
else
|
|
{
|
|
NETWORK_CLEAR_INVITE_ARRIVAL();
|
|
print_two("invite was successfully delivered to",NETWORK_GET_FRIEND_NAME(i));
|
|
break;
|
|
}
|
|
}
|
|
while(tick < 30);
|
|
WAIT(10);
|
|
}
|
|
*/
|
|
/*
|
|
PRINT ALL UNACCEPTED INVITE GAMERTAGS
|
|
int i;
|
|
char* episode[3]; episode[0] = "Original"; episode[1] = "TLaD"; episode[2] = "TBoGT";
|
|
for(i = 0; i < GET_NUM_UNACCEPTED_INVITES(); i++)
|
|
{
|
|
print_two(NETWORK_GET_UNACCEPTED_INVITER_NAME(i),episode[NETWORK_GET_UNACCEPTED_INVITE_EPISODE(i)]);
|
|
// NETWORK_ACCEPT_INVITE(i);
|
|
}
|
|
*/
|
|
|
|
/*
|
|
extern char *NETWORK_GET_UNACCEPTED_INVITER_NAME(int invite_id);
|
|
extern int NETWORK_ACCEPT_INVITE(int invite_id);
|
|
|
|
extern boolean NETWORK_DID_INVITE_FRIEND(char *friendname);//NETWORK_GET_FRIEND_NAME(I)
|
|
extern int NETWORK_ACCEPT_INVITE(int invite_id);//if (COMPARE_STRING( NETWORK_GET_FRIEND_NAME( uParam0 ), NETWORK_GET_UNACCEPTED_INVITER_NAME( Result ) )) return result;
|
|
//possibly
|
|
*/
|
|
|
|
/* GAME STUFF
|
|
|
|
NETWORK_FIND_GAME(int GameMode, int ukn0, int ukn1, int ukn2);
|
|
|
|
int i;
|
|
for(i = 0; i < NETWORK_GET_NUMBER_OF_GAMES(); i++)
|
|
{
|
|
if(NETWORK_FIND_GAME_PENDING() || NETWORK_JOIN_GAME_PENDING()) break; //FIND_ will be false a lil while after using NETWORK_FIND_GAME
|
|
if(!NETWORK_IS_FIND_RESULT_VALID(i) || !NETWORK_IS_FIND_RESULT_UPDATED(i)) continue;
|
|
//if(match_game_search_settings && NETWORK_RESULTS_MATCHES_SEARCH_CRITERIA(i)
|
|
if(NETWORK_RESULT_MATCHES_SEARCH_CRITERIA(i))
|
|
{
|
|
|
|
}
|
|
}
|
|
//if joining a game..
|
|
if(NETWORK_JOIN_GAME_SUCCEEDED())
|
|
NETWORK_CLEAR_SUMMONS();
|
|
|
|
///////////////////////////////////
|
|
NETWORK_FIND_GAME(int GameMode, int ukn0, int ukn1, int ukn2);
|
|
if(NETWORK_FIND_GAME_PENDING())
|
|
extern boolean NETWORK_JOIN_GAME_PENDING(void);
|
|
extern boolean NETWORK_JOIN_GAME_SUCCEEDED(void);
|
|
extern boolean NETWORK_LEAVE_GAME_PENDING(void);
|
|
extern boolean PLAYER_WANTS_TO_JOIN_NETWORK_GAME(int); //if we replace phone script we can choose to allow player into game yes or no
|
|
|
|
enum eGameMode{
|
|
GAME_MODE_BOMB_DA_BASE_II = 15,
|
|
GAME_MODE_CAR_JACK_CITY = 5,
|
|
GAME_MODE_COPS_AND_CROOKS = 10,
|
|
GAME_MODE_DEAL_BREAKER = 13,
|
|
GAME_MODE_DEATHMATCH = 0,
|
|
GAME_MODE_FREE_MODE = 0x10,
|
|
GAME_MODE_GTA_RACE = 7,
|
|
GAME_MODE_HANGMANS_NOOSE = 14,
|
|
GAME_MODE_MAFIYA_WORK = 2,
|
|
GAME_MODE_NONE = -1,
|
|
GAME_MODE_PARTY_MODE = 8,
|
|
GAME_MODE_RACE = 6,
|
|
GAME_MODE_TEAM_CAR_JACK_CITY = 4,
|
|
GAME_MODE_TEAM_DEATHMATCH = 1,
|
|
GAME_MODE_TEAM_MAFIYA_WORK = 3,
|
|
GAME_MODE_TURF_WAR = 12,
|
|
GAME_MODE_UNKNOWN_11 = 11,
|
|
GAME_MODE_UNKNOWN_9 = 9
|
|
};
|
|
*/ |