mirror of
https://github.com/iDisaster/GTAConnected.git
synced 2026-03-09 01:45:22 +00:00
2274 lines
80 KiB
C
2274 lines
80 KiB
C
/**
|
|
* @ MAJOR DISTRIBUTION EXTEND
|
|
* @ Version MDv13 TRIDENT Based on ESSENTIALS
|
|
* @ MADE BY - DEVILSDESIGN && IIV NATHAN VII
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
/* USAGE
|
|
|
|
#define GetBit(BitSet, bitIndex) IS_BIT_SET(BitSet, bitIndex)
|
|
|
|
#define SetBit(BitSet, bitIndex, bitValue) SetBitHelper(&BitSet, bitIndex, bitValue)
|
|
|
|
#define ToggleBit(BitSet, bitIndex) ToggleBitHelper(&BitSet, bitIndex)
|
|
*/
|
|
|
|
//int CarryAllWeaponsIndex = 0; //USE 0 as disabled, //should use a byte set, currently "int flymod;" can be byteset'd too, maybe some other things also..
|
|
|
|
void TOGGLE_SCRIPT(char* name){
|
|
if(!DOES_SCRIPT_EXIST(name)){
|
|
char * buffer[32];
|
|
Strcpy(buffer, "~b~MD: ");
|
|
Strcat(buffer, "~s~Request failed! ~n~Sco: ~y~"); //41
|
|
Strcat(buffer, name); //41
|
|
Strcat(buffer, "~s~ is missing from your image. "); //41
|
|
Alert(buffer,false);
|
|
return;
|
|
}
|
|
if(GET_NUMBER_OF_INSTANCES_OF_STREAMED_SCRIPT(name) > 0)TERMINATE_ALL_SCRIPTS_WITH_THIS_NAME(name);
|
|
else{
|
|
REQUEST_SCRIPT(name);
|
|
while(!HAS_SCRIPT_LOADED(name)) WAIT(0);
|
|
START_NEW_SCRIPT(name,1024);
|
|
MARK_SCRIPT_AS_NO_LONGER_NEEDED(name);
|
|
}
|
|
}
|
|
|
|
bool ARE_ALL_PLAYERS_MUTED(void){
|
|
int i;
|
|
for(i = 0; i < MAX_PLAYERS; i++){
|
|
if(Invalid_Player(i)) continue;
|
|
if(!NETWORK_IS_PLAYER_MUTED_BY_ME(i)) return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void SET_ALL_PLAYERS_MUTED(const bool value){
|
|
int i;
|
|
for(i = 0; i < MAX_PLAYERS; i++){
|
|
if(Invalid_Player(i)) continue;
|
|
NETWORK_SET_PLAYER_MUTED(i,value);
|
|
}
|
|
}
|
|
|
|
void Crossbrowser_Setself(void){
|
|
register int scanner;
|
|
for(scanner = 0; scanner < MAX_PLAYERS; scanner++){
|
|
//if(Player_Display_Selection(players[scanner].id))continue;
|
|
if(players[scanner].id != iPlayer)continue;
|
|
ChangeNetPlayer = scanner;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void MD_SET_WEATHER(const int weather){
|
|
if(GetByteInSet(WeatherTimeAutoLockByteSet, FREEZE_WEATHER) != 50){ //50 = disabled
|
|
SetByteSet(&WeatherTimeAutoLockByteSet, FREEZE_WEATHER, weather);
|
|
}
|
|
FORCE_WEATHER_NOW(weather);
|
|
}
|
|
|
|
void MD_SET_TIME(const int hour, const int minute){
|
|
if(GetByteInSet(WeatherTimeAutoLockByteSet, FREEZE_TIME_HOUR) != 25){ //25 = disabled
|
|
SetByteSet(&WeatherTimeAutoLockByteSet, FREEZE_TIME_HOUR, hour);
|
|
SetByteSet(&WeatherTimeAutoLockByteSet, FREEZE_TIME_MINUTE, minute);
|
|
}
|
|
SET_TIME_OF_DAY(hour,minute);
|
|
}
|
|
|
|
|
|
void Fix_Game_Before_Leaving(void){
|
|
if(!In_Network) return;
|
|
int i,tmp;
|
|
for(i = 0; i < MAX_PLAYERS; i++){
|
|
if(DOES_OBJECT_EXIST(drive_water[i]))
|
|
DELETE_OBJECT(&drive_water[i]);
|
|
}
|
|
if(GET_HOST_ID() == iPlayer){
|
|
MD_SET_WEATHER(WEATHER_SUNNY);
|
|
MD_SET_TIME(9,00); //to stop fancy up graphics weathers and shit fucking the lobby for normal players if your host
|
|
WAIT(1500);
|
|
}
|
|
}
|
|
|
|
void Player_Counter(void){
|
|
register int PlayerScan;
|
|
player_count = 0;
|
|
for(PlayerScan = 0; PlayerScan < MAX_PLAYERS; PlayerScan++){
|
|
if(Player_Display_Selection(PlayerScan))continue;//Skip Invalids - Count all that isnt invalid
|
|
players[player_count].id = PlayerScan;
|
|
player_count++;
|
|
}
|
|
}
|
|
|
|
|
|
//!Unused in the menu - Why leave it here ?
|
|
/*
|
|
void GET_CHAR_ACTUAL_COORDINATES_WITH_HEADING_NO_OFFSET(const int ped, float *x, float *y, float *z, float *h) //Why ur putting a * in front ? |Devils question
|
|
{
|
|
//it's actually set char coordinates that has offset, hence, SET_CHAR_COORDINATES_NO_OFFSET
|
|
if(DOES_CHAR_EXIST(ped))
|
|
{
|
|
GET_CHAR_COORDINATES(ped,&*x,&*y,&*z);
|
|
if(IS_CHAR_IN_ANY_CAR(ped)){
|
|
//need to figure offset in vehicles as it's random as fk - Nathan
|
|
}
|
|
else{
|
|
*z = (*z - 1);
|
|
}
|
|
GET_CHAR_HEADING(ped,&*h);
|
|
}
|
|
else{
|
|
*x = TO_FLOAT(0);
|
|
*y = TO_FLOAT(0);
|
|
*z = TO_FLOAT(0);
|
|
*h = TO_FLOAT(0);
|
|
}
|
|
}
|
|
*/
|
|
|
|
void MD_CarryAllweapons(void){
|
|
if(GET_NUMBER_OF_INSTANCES_OF_STREAMED_SCRIPT("menu_startup") != 0) return; // Prevent switching weapons when a menu is displayed! --> Needed cus it fucked with crossbrowser
|
|
if(IS_CHAR_ON_FOOT(pPlayer)){
|
|
int Weapons[25];
|
|
int max_weapons = 16;
|
|
Weapons[0] = WEAPON_UNARMED;
|
|
Weapons[1] = WEAPON_BASEBALLBAT;
|
|
Weapons[2] = WEAPON_POOLCUE;
|
|
Weapons[3] = WEAPON_KNIFE;
|
|
Weapons[4] = WEAPON_GRENADE;
|
|
Weapons[5] = WEAPON_MOLOTOV;
|
|
Weapons[6] = WEAPON_PISTOL;
|
|
Weapons[7] = WEAPON_DEAGLE;
|
|
Weapons[8] = WEAPON_SHOTGUN;
|
|
Weapons[9] = WEAPON_BARETTA;
|
|
Weapons[10] = WEAPON_MICRO_UZI;
|
|
Weapons[11] = WEAPON_MP5;
|
|
Weapons[12] = WEAPON_AK47;
|
|
Weapons[13] = WEAPON_M4;
|
|
Weapons[14] = WEAPON_SNIPERRIFLE;
|
|
Weapons[15] = WEAPON_M40A1;
|
|
Weapons[16] = WEAPON_RLAUNCHER;
|
|
|
|
if(Episode == 1)Weapons[17] = 0;
|
|
else if(Episode == 2)Weapons[17] = 0;
|
|
|
|
bool input;
|
|
if((IS_BUTTON_JUST_PRESSED(0, DPAD_RIGHT)) || IS_GAME_KEYBOARD_KEY_PRESSED(KEY_F6)){
|
|
if(CAW_Weapon < max_weapons)CAW_Weapon = (CAW_Weapon + 1);
|
|
else CAW_Weapon = 0;
|
|
input = true;
|
|
}
|
|
else if((IS_BUTTON_JUST_PRESSED(0, DPAD_LEFT)) || IS_GAME_KEYBOARD_KEY_PRESSED(KEY_F5)){
|
|
if(CAW_Weapon == 0)CAW_Weapon = max_weapons;
|
|
else CAW_Weapon = (CAW_Weapon - 1);
|
|
input = true;
|
|
}
|
|
|
|
if(input){
|
|
if(HAS_CHAR_GOT_WEAPON(pPlayer, Weapons[CAW_Weapon]))SET_CURRENT_CHAR_WEAPON(pPlayer, Weapons[CAW_Weapon], true);
|
|
else{
|
|
int max_ammo;
|
|
GET_MAX_AMMO(pPlayer, Weapons[CAW_Weapon], &max_ammo);
|
|
GIVE_WEAPON_TO_CHAR(pPlayer, Weapons[CAW_Weapon], max_ammo, false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void UPDATE_CHANGE_NET_PLAYER_WEAPON_INFO(void){
|
|
if(!PLAYER_HAS_CHAR(players[ChangeNetPlayer].id)) return;
|
|
int Weapon_Detect;
|
|
GET_CURRENT_CHAR_WEAPON(PLAYER_CHAR(players[ChangeNetPlayer].id), &Weapon_Detect);
|
|
NetPlayer_Weapon = "Unknown";
|
|
if(Weapon_Detect == WEAPON_UNARMED) NetPlayer_Weapon = "Unarmed";
|
|
else if(Weapon_Detect == WEAPON_BASEBALLBAT) NetPlayer_Weapon = "Baseball Bat";
|
|
else if(Weapon_Detect == WEAPON_POOLCUE) NetPlayer_Weapon = "Pool Cue";
|
|
else if(Weapon_Detect == WEAPON_KNIFE) NetPlayer_Weapon = "Knife";
|
|
else if(Weapon_Detect == WEAPON_GRENADE) NetPlayer_Weapon = "Grenades";
|
|
else if(Weapon_Detect == WEAPON_MOLOTOV) NetPlayer_Weapon = "Molotov";
|
|
else if(Weapon_Detect == WEAPON_ROCKET) NetPlayer_Weapon = "Freeze Gun";
|
|
else if(Weapon_Detect == WEAPON_PISTOL) NetPlayer_Weapon = "Glock";
|
|
else if(Weapon_Detect == WEAPON_DEAGLE) NetPlayer_Weapon = "Desert Eagle";
|
|
else if(Weapon_Detect == WEAPON_SHOTGUN) NetPlayer_Weapon = "Pump Shotgun";
|
|
else if(Weapon_Detect == WEAPON_BARETTA) NetPlayer_Weapon = "Baretta";
|
|
else if(Weapon_Detect == WEAPON_MICRO_UZI) NetPlayer_Weapon = "Micro Uzi";
|
|
else if(Weapon_Detect == WEAPON_MP5) NetPlayer_Weapon = "MP5";
|
|
else if(Weapon_Detect == WEAPON_AK47) NetPlayer_Weapon = "AK-47";
|
|
else if(Weapon_Detect == WEAPON_M4) NetPlayer_Weapon = "M4";
|
|
else if(Weapon_Detect == WEAPON_SNIPERRIFLE) NetPlayer_Weapon = "PSG-1 Sniper";
|
|
else if(Weapon_Detect == WEAPON_M40A1) NetPlayer_Weapon = "M40A1 Sniper";
|
|
else if(Weapon_Detect == WEAPON_RLAUNCHER) NetPlayer_Weapon = "RPG";
|
|
else if(Episode == 2)
|
|
{
|
|
if(Weapon_Detect == WEAPON_EPISODIC_1) NetPlayer_Weapon = "Grenade Launcher";
|
|
else if(Weapon_Detect == WEAPON_EPISODIC_9) NetPlayer_Weapon = ".44 Pistol";
|
|
else if(Weapon_Detect == WEAPON_EPISODIC_10) NetPlayer_Weapon = "Explosive AA12";
|
|
else if(Weapon_Detect == WEAPON_EPISODIC_11) NetPlayer_Weapon = "AA12";
|
|
else if(Weapon_Detect == WEAPON_EPISODIC_12) NetPlayer_Weapon = "P-90";
|
|
else if(Weapon_Detect == WEAPON_EPISODIC_13) NetPlayer_Weapon = "Uzi";
|
|
else if(Weapon_Detect == WEAPON_EPISODIC_14) NetPlayer_Weapon = "M249 LMG";
|
|
else if(Weapon_Detect == WEAPON_EPISODIC_15) NetPlayer_Weapon = "DSR-1 Sniper";
|
|
else if(Weapon_Detect == WEAPON_EPISODIC_16) NetPlayer_Weapon = "Sticky Bombs";
|
|
}
|
|
}
|
|
|
|
|
|
int GET_PLAYER_RANK_TEXTURE(const int playerindex){
|
|
|
|
//REQUEST_STREAMED_TXD("network", 1);
|
|
//int rank = GET_PLAYER_RANK_LEVEL_DURING_MP(playerindex);
|
|
|
|
char* ranks[11];
|
|
ranks[0] = "STAR_RATING_0";
|
|
ranks[1] = "STAR_RATING_1";
|
|
ranks[2] = "STAR_RATING_2";
|
|
ranks[3] = "STAR_RATING_3";
|
|
ranks[4] = "STAR_RATING_4";
|
|
ranks[5] = "STAR_RATING_5";
|
|
ranks[6] = "STAR_RATING_6";
|
|
ranks[7] = "STAR_RATING_7";
|
|
ranks[8] = "STAR_RATING_8";
|
|
ranks[9] = "STAR_RATING_9";
|
|
ranks[10] = "STAR_RATING_10";
|
|
return GET_TEXTURE_FROM_STREAMED_TXD("network", ranks[GET_PLAYER_RANK_LEVEL_DURING_MP(playerindex)]);
|
|
|
|
}
|
|
|
|
void Attach_Ped_To_Char (int Netplayer_PED, int Aped_model,char* set){
|
|
float Aped_x, Aped_y, Aped_z;
|
|
int Aped_ID;
|
|
int Aped_PED, Aped_OBJECT;
|
|
Aped_z += 0.0;
|
|
Aped_y += 1.0;
|
|
REQUEST_MODEL(Aped_model);
|
|
while (!HAS_MODEL_LOADED(Aped_model)) WAIT(0);
|
|
GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS(Netplayer_PED, 0, 2, 0, &Aped_x, &Aped_y, &Aped_z);
|
|
CREATE_CHAR(26, Aped_model, Aped_x,Aped_y,Aped_z, &Aped_PED, true);
|
|
MARK_MODEL_AS_NO_LONGER_NEEDED(Aped_model);
|
|
GET_NETWORK_ID_FROM_PED(Aped_PED,&Aped_ID);
|
|
REQUEST_CONTROL_OF_NETWORK_ID(Aped_ID);
|
|
int tick = 0;
|
|
while(!HAS_CONTROL_OF_NETWORK_ID(Aped_ID)){
|
|
tick++;
|
|
REQUEST_CONTROL_OF_NETWORK_ID(Aped_ID);
|
|
if(tick >= 10) break;
|
|
WAIT(0);
|
|
}
|
|
SET_NETWORK_ID_CAN_MIGRATE(Aped_ID,true);
|
|
SET_CHAR_INVINCIBLE(Aped_PED, true);
|
|
SET_CHAR_VISIBLE(Aped_PED, true);
|
|
FREEZE_CHAR_POSITION(Aped_PED, true);
|
|
CREATE_OBJECT(MODEL_CJ_GOLF_BALL,0.0,0.0,0.0,&Aped_OBJECT,true);
|
|
SET_OBJECT_VISIBLE(Aped_OBJECT, false);
|
|
ATTACH_OBJECT_TO_PED(Aped_OBJECT,Netplayer_PED,0,0.0,2,0,0.0,0.0,0.0,false);
|
|
WAIT(10);
|
|
ATTACH_PED_TO_OBJECT(Aped_PED,Aped_OBJECT,0,0.0,0.0,0,0,0,0,0);
|
|
MARK_OBJECT_AS_NO_LONGER_NEEDED(&Aped_OBJECT);
|
|
}
|
|
|
|
|
|
void Clone_Car(const int cveh, float x, float y, float z, float h, int *car_clone){
|
|
int model;
|
|
if(!DOES_VEHICLE_EXIST(cveh)) return;
|
|
GET_CAR_MODEL(cveh,&model);
|
|
REQUEST_MODEL(model);
|
|
int colour1,colour2,colourEXT1,colourEXT2,health,i;
|
|
float dirt_level;
|
|
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;
|
|
bool upgrade[10];
|
|
siren = IS_CAR_SIREN_ON(cveh);
|
|
for(i = 0;i<10;i++){
|
|
upgrade[i] = IS_VEHICLE_EXTRA_TURNED_ON(cveh,i);
|
|
}
|
|
while(!HAS_MODEL_LOADED(model)) WAIT(0);
|
|
CREATE_CAR(model,x,y,z,&*car_clone,true);
|
|
while(!DOES_VEHICLE_EXIST(*car_clone)) WAIT(0);
|
|
SET_CAR_CAN_BE_DAMAGED(*car_clone, !GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_INVINCIBLE));
|
|
SET_CAR_CAN_BE_VISIBLY_DAMAGED(*car_clone, !GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_INVINCIBLE));
|
|
SET_CAN_BURST_CAR_TYRES(*car_clone, !GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_INVINCIBLE));
|
|
SET_CAR_WATERTIGHT(*car_clone, GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_INVINCIBLE));
|
|
SET_CAR_HEADING(*car_clone,h);
|
|
if(!GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_INVINCIBLE))SET_CAR_HEALTH(*car_clone,health);
|
|
CHANGE_CAR_COLOUR(*car_clone,colour1,colour2);
|
|
SET_EXTRA_CAR_COLOURS(*car_clone,colourEXT1,colourEXT2);
|
|
SET_VEHICLE_DIRT_LEVEL(*car_clone,dirt_level);
|
|
SWITCH_CAR_SIREN(*car_clone,siren);
|
|
for(i = 0; i < 10; i++)
|
|
{
|
|
TURN_OFF_VEHICLE_EXTRA(*car_clone,i,!upgrade[i]);
|
|
}
|
|
}
|
|
|
|
bool network_control(const int Network_ID){
|
|
if(!In_Network || HAS_CONTROL_OF_NETWORK_ID(Network_ID)) return true;
|
|
if(!REQUEST_CONTROL_OF_NETWORK_ID(Network_ID)){
|
|
PRIORITIZE_STREAMING_REQUEST();
|
|
register int tick = 0;
|
|
while ( !HAS_CONTROL_OF_NETWORK_ID(Network_ID) && ++tick < 10 ) WAIT(100);
|
|
}
|
|
bool control = HAS_CONTROL_OF_NETWORK_ID(Network_ID);
|
|
#ifdef Premium
|
|
if(!control){
|
|
int i;
|
|
int ID_Controller = 1337;
|
|
for(i = 0; i < MAX_PLAYERS; i++){
|
|
if(!DOES_PLAYER_HAVE_CONTROL_OF_NETWORK_ID(i,Network_ID)) continue;
|
|
ID_Controller = i;
|
|
break;
|
|
}
|
|
char * buffer[32]; //128 characters
|
|
Strcpy(buffer, ((ID_Controller == 1337) ? "~b~MD: ~s~Unable to get control of Net ID: " : "~b~MD: ") ); //43 characters
|
|
if(ID_Controller != 1337){
|
|
PLAYER_NAME_WITH_COLOUR(ID_Controller, &buffer); //WORKS!
|
|
Strcat(buffer, "~s~ has control of Net ID: "); //27 characters + 27 = 54 // + first string = 61
|
|
PLAYERS_COLOUR(ID_Controller, &buffer); //we'll see.. just a test :P - Nathan
|
|
}
|
|
//PLAYERS_COLOUR(ID_Controller, &buffer); //Nah premium only :D
|
|
itoa(Network_ID, buffer); //like 50 characters total
|
|
Alert(buffer, false);
|
|
|
|
}
|
|
#else
|
|
if(!control){
|
|
char* buffer[16];
|
|
Strcpy(buffer, "~b~MD: ~s~Unable to get control of Net ID: "); //Telling you who has control is Premium and above Only! - Nathan
|
|
itoa( Network_ID, buffer);
|
|
Alert(buffer, false);
|
|
}
|
|
#endif
|
|
return control; // SHould this be here ? //yes....
|
|
}
|
|
|
|
void MD_Delete_Objects_On_Vehicle(const int Player_ID){ //!Devils Remake
|
|
//!**Player Char Check**//
|
|
Ped Player_PED;
|
|
Vehicle vehicle;
|
|
int C_Object,delObj;
|
|
if(!PLAYER_HAS_CHAR(Player_ID))return Alert_Abort(Error_Char_Missing,false);
|
|
else GET_PLAYER_CHAR(Player_ID,&Player_PED);
|
|
/**Vehicle Checker**/
|
|
if(!IS_CHAR_IN_ANY_CAR(Player_PED)){
|
|
if(Player_PED == pPlayer)Alert_Abort(Error_Personal_Vehicle,false);
|
|
else Alert_Abort(Error_NetPlayer_Vehicle,false);
|
|
}
|
|
else GET_CAR_CHAR_IS_USING(Player_PED,&vehicle);
|
|
bool Print_Once;
|
|
for(C_Object=16;C_Object<=9999;C_Object++){
|
|
if(!DOES_OBJECT_EXIST_WITH_NETWORK_ID(C_Object)) continue;
|
|
GET_OBJECT_FROM_NETWORK_ID(C_Object,&delObj);
|
|
if(!IS_OBJECT_ATTACHED(delObj)) continue;
|
|
if(!DOES_VEHICLE_EXIST(vehicle)) return;
|
|
if(GET_CAR_OBJECT_IS_ATTACHED_TO(delObj) != vehicle) continue;
|
|
if(!network_control(C_Object)) continue;
|
|
if(Print_Once){
|
|
char * buffer[32]; //gives me 128 chars to play with...
|
|
Strcpy(buffer, "~b~MD: ~s~Deleting objects attached to a "); //42 characters
|
|
int model;
|
|
GET_CAR_MODEL(vehicle,&model);
|
|
Strcat(buffer, GET_STRING_FROM_TEXT_FILE(GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(model)));
|
|
Strcat(buffer, model); //5 characters + 58 = 63. PERFECT!
|
|
Alert(buffer,false);
|
|
Print_Once = 0;
|
|
}
|
|
Run_Ptfx(C_Object);
|
|
DELETE_OBJECT(&delObj);
|
|
}
|
|
}
|
|
|
|
//!Might need to take this out
|
|
void delete_objects_on_vehicle(Vehicle vehicle){ //Old one freezes for some reason
|
|
if(!DOES_VEHICLE_EXIST(vehicle)) return;
|
|
int i,z,object;
|
|
bool printed;
|
|
for(z = 0; z < 5; z++){
|
|
for(i = 0; i < 8250; i++){
|
|
if(!DOES_OBJECT_EXIST_WITH_NETWORK_ID(i)) continue;
|
|
GET_OBJECT_FROM_NETWORK_ID(i,&object);
|
|
if(!IS_OBJECT_ATTACHED(object) || GET_CAR_OBJECT_IS_ATTACHED_TO(object) != vehicle) continue;
|
|
REQUEST_CONTROL_OF_NETWORK_ID(i);
|
|
if(!HAS_CONTROL_OF_NETWORK_ID(i)) continue;
|
|
if(!printed){
|
|
printed = true;
|
|
char * buffer[32]; //gives me 128 chars to play with...
|
|
Strcpy(buffer, "~b~MD: ~s~Deleting objects attached to a "); //42 characters
|
|
int model;
|
|
GET_CAR_MODEL(vehicle,&model);
|
|
Strcat(buffer, GET_STRING_FROM_TEXT_FILE(GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(model)));
|
|
Strcat(buffer, model); //5 characters + 58 = 63. PERFECT!
|
|
Alert(buffer,false);
|
|
}
|
|
Run_Ptfx(object);
|
|
DELETE_OBJECT(&object);
|
|
}
|
|
WAIT(60);
|
|
}
|
|
}
|
|
|
|
void delete_entitys_on_object(const int object) //for deleting attachments
|
|
{ //best to do this by distance! //Look into it for devil, spawn/find biggest rotation + then get distance from root object (right under you)
|
|
//using a 2D distance (birdsEyeViewDistance) is probably best bet for accuracy + that's what DRAW_SPHERE represents i believe so
|
|
if(!DOES_OBJECT_EXIST(object)) return;
|
|
int i, z;
|
|
float rootx,rooty,rootz;
|
|
float ex,ey,ez;
|
|
GET_OBJECT_COORDINATES(object,&rootx,&rooty,&rootz);
|
|
float birdsEyeDistance;
|
|
for(z = 0; z < 5; z++){
|
|
for(i = 0; i < 8250; i++){
|
|
if(DOES_OBJECT_EXIST_WITH_NETWORK_ID(i)){
|
|
int net_object;
|
|
GET_OBJECT_FROM_NETWORK_ID(i,&net_object);
|
|
if(!IS_OBJECT_ATTACHED(net_object)) continue; //works fine, just add distance for accuracy
|
|
GET_OBJECT_COORDINATES(net_object,&ex,&ey,&ez);
|
|
GET_DISTANCE_BETWEEN_COORDS_2D(rootx, rooty, ex, ey, &birdsEyeDistance);
|
|
if(birdsEyeDistance < 30){
|
|
REQUEST_CONTROL_OF_NETWORK_ID(i);
|
|
if(!HAS_CONTROL_OF_NETWORK_ID(i)) continue;
|
|
DELETE_OBJECT(&net_object);
|
|
}
|
|
}
|
|
else if(DOES_PED_EXIST_WITH_NETWORK_ID(i) && (i % 100) != 1){
|
|
int ped;
|
|
GET_PED_FROM_NETWORK_ID(i,&ped);
|
|
// if(IS_PED_ATTACHED_TO_OBJECT(ped, object)) //doesn't delete for some reason...
|
|
GET_CHAR_COORDINATES(ped,&ex,&ey,&ez);
|
|
GET_DISTANCE_BETWEEN_COORDS_2D(rootx, rooty, ex, ey, &birdsEyeDistance);
|
|
if(birdsEyeDistance < 30){ // make it < max rotation distance from root object.. will test
|
|
REQUEST_CONTROL_OF_NETWORK_ID(i); //eventually remove this and only use if has control
|
|
//easy enough to do just have to lock control of all attaches/rotations
|
|
///then we'll always HAS_CONTROL_OF_NETWORK_ID :P
|
|
if(!HAS_CONTROL_OF_NETWORK_ID(i)) continue;
|
|
DELETE_CHAR(&ped);
|
|
}
|
|
}
|
|
else if(DOES_VEHICLE_EXIST_WITH_NETWORK_ID(i)){
|
|
int veh;
|
|
GET_VEHICLE_FROM_NETWORK_ID(i,&veh);
|
|
GET_CAR_COORDINATES(veh,&ex,&ey,&ez);
|
|
GET_DISTANCE_BETWEEN_COORDS_2D(rootx, rooty, ex, ey, &birdsEyeDistance);
|
|
if(IS_CAR_ATTACHED(veh) && birdsEyeDistance < 30){
|
|
REQUEST_CONTROL_OF_NETWORK_ID(i);
|
|
if(!HAS_CONTROL_OF_NETWORK_ID(i)) continue;
|
|
DELETE_CAR(&veh);
|
|
}
|
|
}
|
|
}
|
|
WAIT(80);
|
|
}
|
|
int Rotation_Subject_ID;
|
|
for(Rotation_Subject_ID = 0; Rotation_Subject_ID < MAX_ROTATION_SUBJECTS; Rotation_Subject_ID++){
|
|
if (DOES_CHAR_EXIST(Rotation_Subject[Rotation_Subject_ID])){
|
|
DELETE_CHAR(&Rotation_Subject[Rotation_Subject_ID]);
|
|
WAIT(75);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void MUTE_ALL_PLAYERS(const bool mute){
|
|
int Netplayer_ID;
|
|
for( Netplayer_ID=0; Netplayer_ID < MAX_PLAYERS; Netplayer_ID++){
|
|
if(Player_Display_Selection(Netplayer_ID) || iPlayer == Netplayer_ID) continue;
|
|
NETWORK_SET_PLAYER_MUTED(Netplayer_ID,mute);
|
|
}
|
|
}
|
|
|
|
void Shuffle_Vehicle_Seat(void) {//Nathan's func, works on bikes too :D
|
|
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 clear_attachments(void){
|
|
int attach_id;
|
|
for(attach_id = 0; attach_id < MAX_ATTACH_OBJECTS ; attach_id++){
|
|
if (DOES_OBJECT_EXIST(Attach_object[attach_id]))DELETE_OBJECT(&Attach_object[attach_id]);
|
|
}
|
|
}
|
|
|
|
|
|
void clear_objects_on_car(const int veh){
|
|
if(!DOES_VEHICLE_EXIST(veh)) return;
|
|
int C_Object,delObj,nvid;
|
|
for(C_Object=16;C_Object<=9999;C_Object++){
|
|
if(!DOES_OBJECT_EXIST_WITH_NETWORK_ID(C_Object)) continue;
|
|
GET_OBJECT_FROM_NETWORK_ID(C_Object,&delObj);
|
|
if(!IS_OBJECT_ATTACHED(delObj)) continue;
|
|
if(!DOES_VEHICLE_EXIST(veh)) return;
|
|
if(GET_CAR_OBJECT_IS_ATTACHED_TO(delObj) != veh) continue;
|
|
if(!network_control(C_Object)) continue;
|
|
DELETE_OBJECT(&delObj);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void Universal_Delete(const int given_distance, const int type, const bool print){
|
|
const int current_type = (type - 1);
|
|
float desired_distance = TO_FLOAT(given_distance);
|
|
const char* types[12]; //this may not compile like this as i think you have to define const for every var upon creation, but lets see!
|
|
types[0] = "peds";
|
|
types[1] = "objects";
|
|
types[2] = "vehicles.all";
|
|
types[3] = "vehicles.abandoned";
|
|
types[4] = "cars.all";
|
|
types[5] = "cars.abandoned";
|
|
types[6] = "bikes.all";
|
|
types[7] = "bikes.abandoned";
|
|
types[8] = "boats.all";
|
|
types[9] = "boats.abandoned";
|
|
types[10] = "helis.all";
|
|
types[11] = "helis.abandoned";
|
|
char * buffer[16]; //64 characters
|
|
if(print){
|
|
Strcpy(buffer, "~b~MD: ~s~Deleting "); // 19 characters
|
|
Strcat(buffer, types[current_type]); //18 characters + 19 = 37
|
|
Strcat(buffer, "."); //38
|
|
Alert(buffer,false);
|
|
}
|
|
float distance,mx,my,mz;
|
|
//x = 1.0f; //leave this here!
|
|
GET_CHAR_COORDINATES(pPlayer,&mx,&my,&mz); // This needs to change to player coordinates me thinks...
|
|
int i,j,tmp,driver,model;
|
|
for(j = 0; j < 5; j++){
|
|
float x,y,z;
|
|
for(i = 0; i < 8251; i++){
|
|
switch(current_type)
|
|
{
|
|
case 0:
|
|
{
|
|
if(!DOES_PED_EXIST_WITH_NETWORK_ID(i) || (i % 100 == 1)) continue;
|
|
GET_PED_FROM_NETWORK_ID(i,&tmp);
|
|
GET_CHAR_COORDINATES(tmp,&x,&y,&z);
|
|
}
|
|
break;
|
|
case 1:
|
|
{
|
|
if(!DOES_OBJECT_EXIST_WITH_NETWORK_ID(i)) continue;
|
|
GET_OBJECT_FROM_NETWORK_ID(i,&tmp);
|
|
GET_OBJECT_COORDINATES(tmp,&x,&y,&z);
|
|
}
|
|
break;
|
|
default:
|
|
{
|
|
if(!DOES_VEHICLE_EXIST_WITH_NETWORK_ID(i))continue;
|
|
GET_VEHICLE_FROM_NETWORK_ID(i,&tmp);
|
|
float nx,ny,nz;
|
|
GET_CAR_COORDINATES(tmp,&nx,&ny,&nz); //attempt to stop keep deleting same vehicle
|
|
if(nx == x && ny == y && nz == z) continue; //this is different too but can't see how it would cause issues..
|
|
x = nx; y = ny; z = nz;
|
|
if(current_type % 2 == 1){ //if number is odd (abandoned only)
|
|
GET_DRIVER_OF_CAR(tmp,&driver);
|
|
int psngrs;
|
|
GET_NUMBER_OF_PASSENGERS(tmp, &psngrs); //only thing different to my protection, we check passengers
|
|
if(DOES_CHAR_EXIST(driver)|| (psngrs > 0) ) continue;
|
|
}
|
|
GET_CAR_MODEL(tmp,&model);
|
|
}
|
|
break;
|
|
}
|
|
switch(current_type)
|
|
{
|
|
case 4: case 5:{ if(!IS_THIS_MODEL_A_CAR(model)) continue; } break;
|
|
case 6: case 7:{ if(!IS_THIS_MODEL_A_BIKE(model)) continue; } break;
|
|
case 8: case 9:{ if(!IS_THIS_MODEL_A_BOAT(model)) continue; } break;
|
|
case 10: case 11:{ if(!IS_THIS_MODEL_A_HELI(model)) continue; } break;
|
|
}
|
|
|
|
GET_DISTANCE_BETWEEN_COORDS_3D(mx,my,mz,x,y,z,&distance);
|
|
if(distance > desired_distance) continue;
|
|
REQUEST_CONTROL_OF_NETWORK_ID(i);
|
|
if(!HAS_CONTROL_OF_NETWORK_ID(i)) continue;
|
|
//here should work fine!
|
|
Run_Ptfx(tmp); //leave this here, no need to have it 2 more times..
|
|
switch(current_type)
|
|
{
|
|
case 0:
|
|
{
|
|
delete_objects_on_ped(tmp);
|
|
DELETE_CHAR(&tmp);
|
|
}
|
|
break;
|
|
case 1:
|
|
{
|
|
DELETE_OBJECT(&tmp);
|
|
}
|
|
break;
|
|
default:
|
|
{
|
|
clear_objects_on_car(tmp);
|
|
Run_Ptfx(tmp);
|
|
DELETE_CAR(&tmp);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
WAIT(90); //1 sec for network control, this is about right, (it's gonna take like 10MS to do this, maybe longer aha)
|
|
}
|
|
if(print){
|
|
Strcpy(buffer, "~b~MD: ~s~Finished deleting "); // 39 characters
|
|
Strcat(buffer, types[current_type]); //18 characters + 39 = 57
|
|
Strcat(buffer, "."); //57+4 = 61
|
|
Alert(buffer,false);
|
|
}
|
|
}
|
|
|
|
void DISABLE_SPECTATE(const bool Telport_Tower){
|
|
if(DOES_CAM_EXIST(scriptedCam)){
|
|
SET_CAM_ACTIVE(scriptedCam,false);
|
|
SET_CAM_PROPAGATE(scriptedCam,false);
|
|
UNATTACH_CAM(scriptedCam);
|
|
DESTROY_CAM(scriptedCam);
|
|
while(DOES_CAM_EXIST(scriptedCam)) WAIT(0);
|
|
CAM_RESTORE();
|
|
//SET_CAM_BEHIND_PED(pPlayer); //didnt do fk all
|
|
scriptedCam = 0;
|
|
}
|
|
//wont be in a car cuz spectate trashes it..
|
|
FREEZE_CHAR_POSITION(pPlayer,false);
|
|
SET_CHAR_COLLISION(pPlayer,true);
|
|
SET_CHAR_VISIBLE(pPlayer,true);
|
|
SET_PLAYER_CONTROL(iPlayer,true);
|
|
int SpectatePlayerIndex, SpectatePreviousPlayerIndex, AttachPlayerIndex, AttachType;
|
|
GetByteSet(SpectateAndAttachByteSet,&SpectatePlayerIndex,&SpectatePreviousPlayerIndex,&AttachPlayerIndex,&AttachType);
|
|
SpectatePlayerIndex = MAX_PLAYERS;
|
|
SpectatePreviousPlayerIndex = MAX_PLAYERS;
|
|
AttachType = 0;
|
|
AttachPlayerIndex = MAX_PLAYERS;
|
|
CreateByteSet(SpectatePlayerIndex, SpectatePreviousPlayerIndex, AttachPlayerIndex, AttachType, &SpectateAndAttachByteSet);
|
|
if(Telport_Tower)SET_CHAR_COORDINATES(pPlayer,2635.00,415.0,79.00);
|
|
//MD_Teleport_ID_Heading(iPlayer,2635.00, 415, 79.00,0); //Tower Top
|
|
|
|
}
|
|
|
|
void Killfeed(void) //Nathan
|
|
{
|
|
//Please add who joined and left the game //Can't because messages would spam, we'd need 16/32 vars for blips to stop this - Nathan
|
|
//Please add who changed model //to stop this spamming we'd also have to store everyones model,, another 16/32 vars, I think it's best we put this in another .sco - Nathan
|
|
|
|
if(Print_Kill_Feed){
|
|
int i;
|
|
char * buffer[32];
|
|
Strcpy(buffer, "~b~MD: ~COL_NET_");
|
|
for(i = 0; i < MAX_PLAYERS; i++)
|
|
{
|
|
if(Player_Display_Selection(i) || !PLAYER_HAS_CHAR(i) || !NETWORK_PLAYER_HAS_DIED_RECENTLY(i)) continue;
|
|
int killerIndex = FIND_NETWORK_KILLER_OF_PLAYER(i);
|
|
if(killerIndex == i)
|
|
{
|
|
itoa( (i + 1), buffer);
|
|
Strcat(buffer, "~");
|
|
Strcat(buffer, GET_PLAYER_NAME(i));
|
|
Strcat(buffer, " ~s~died.");
|
|
}
|
|
else
|
|
{
|
|
itoa( (killerIndex + 1), buffer);
|
|
Strcat(buffer, "~");
|
|
Strcat(buffer, GET_PLAYER_NAME(killerIndex));
|
|
Strcat(buffer, " ~s~killed ~COL_NET_");
|
|
itoa( (i + 1), buffer);
|
|
Strcat(buffer, "~");
|
|
Strcat(buffer, GET_PLAYER_NAME(i));
|
|
Strcat(buffer, "~s~.");
|
|
}
|
|
Alert(buffer, false);
|
|
break;
|
|
//int FIND_NETWORK_KILLER_OF_PLAYER(Player playerIndex);
|
|
//if(FIND_NETWORK_KILLER_OF_PLAYER(i) == i) "DIED"
|
|
}
|
|
}
|
|
/*
|
|
for(NetPlayer_ID = 0;NetPlayer_ID <= 15;NetPlayer_ID++){
|
|
if(Player_Display_Selection(NetPlayer_ID))continue;
|
|
if(GET_PLAYER_ID() == NetPlayer_ID)continue;
|
|
if(!PLAYER_HAS_CHAR(NetPlayer_ID))continue;
|
|
if(NETWORK_PLAYER_HAS_DIED_RECENTLY(NetPlayer_ID)){
|
|
Alert_Two("~BLIP_76~ ~COL_NET_1~Player Died : ~w~",GET_PLAYER_NAME(NetPlayer_ID),false);
|
|
}
|
|
}
|
|
*/
|
|
}
|
|
|
|
|
|
|
|
bool Teleport_iPlayer_To_PlayerIndex(const int playerindex, const bool teleport_in_car)
|
|
{
|
|
bool pPlayer_is_in_car = IS_CHAR_IN_ANY_CAR(pPlayer);
|
|
char * buffer[32];
|
|
Strcpy(buffer, "~b~MD: ");
|
|
PLAYER_NAME_WITH_COLOUR(playerindex, &buffer); //WORKS!
|
|
|
|
int playerped;
|
|
GET_PLAYER_CHAR(playerindex,&playerped);
|
|
if(!DOES_CHAR_EXIST(playerped))
|
|
{
|
|
Strcat(buffer, " ~s~does not have a character, unable to teleport.");
|
|
Alert(buffer,false);
|
|
return false;
|
|
}
|
|
bool player_is_in_car = IS_CHAR_IN_ANY_CAR(playerped);
|
|
float x,y,z,h;
|
|
int rand;
|
|
GENERATE_RANDOM_INT_IN_RANGE(0,2,&rand);
|
|
GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS(playerped, (player_is_in_car ? ((rand == 1) ? 3 : -3) : 0), (player_is_in_car ? 0 : ( pPlayer_is_in_car ? -5 : -2 )), 0,&x,&y,&z);
|
|
z = (z - (player_is_in_car ? 0.5f : 1.0f)); //so you go to ground not up in the fkin air
|
|
GET_CHAR_HEADING(playerped,&h);
|
|
if(teleport_in_car)
|
|
{
|
|
if(DOES_VEHICLE_EXIST(Personal_Vehicle))
|
|
{
|
|
int driver;
|
|
GET_DRIVER_OF_CAR(Personal_Vehicle,&driver);
|
|
bool can_proceed; //false by default
|
|
if(driver == pPlayer)
|
|
{
|
|
can_proceed = true;
|
|
}
|
|
else
|
|
{
|
|
int NetID;
|
|
GET_NETWORK_ID_FROM_VEHICLE(Personal_Vehicle,&NetID);
|
|
if(network_control(NetID))
|
|
{
|
|
can_proceed = true;
|
|
}
|
|
else
|
|
{
|
|
return false; ///
|
|
//user gets net control error
|
|
}
|
|
}
|
|
if(can_proceed)
|
|
{
|
|
SET_CAR_COORDINATES(Personal_Vehicle,x,y,z);
|
|
SET_CAR_HEADING(Personal_Vehicle,h);
|
|
return true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Alert("~b~MD: ~s~You are not in a vehicle.",false);
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
WARP_CHAR_FROM_CAR_TO_COORD(pPlayer,x,y,z); //works on foot too i believe without issue
|
|
SET_CHAR_HEADING(pPlayer,h);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool MD_Teleport_ID_Heading(const int Player_ID, float x, float y, float z, float h){
|
|
Ped Player_PED;
|
|
int Player_VEHICLE, Player_VEHICLE_DRIVER, Player_VEHICLE_ID;
|
|
bool Is_iPlayer = (Player_ID == iPlayer);
|
|
GET_PLAYER_CHAR(Player_ID,&Player_PED);
|
|
if(!DOES_CHAR_EXIST(Player_PED)) return false; //just for safety
|
|
bool to_respawn = false;
|
|
Run_Ptfx(Player_PED); //do ID here if ptfx works
|
|
if(Is_iPlayer){
|
|
SET_CHAR_VISIBLE(pPlayer,!GetBit(pPlayerOptionsBitSet, PLAYER_OPTION_TELEPORT_INVISIBLE));
|
|
//DETACH_PED(pPlayer,true);
|
|
}
|
|
bool in_car = IS_CHAR_IN_ANY_CAR(Player_PED);
|
|
if(in_car){
|
|
GET_CAR_CHAR_IS_USING(Player_PED,&Player_VEHICLE);
|
|
GET_DRIVER_OF_CAR(Player_VEHICLE,&Player_VEHICLE_DRIVER); //why did you change all my var names!? - Nathan
|
|
FREEZE_CAR_POSITION(Player_VEHICLE, false);
|
|
GET_NETWORK_ID_FROM_VEHICLE(Player_VEHICLE, &Player_VEHICLE_ID);
|
|
if(Is_iPlayer) {
|
|
if(Player_VEHICLE_DRIVER == Player_PED) //pPlayer would make much more sense to read
|
|
{
|
|
SET_CAR_VISIBLE(Player_VEHICLE,!GetBit(pPlayerOptionsBitSet, PLAYER_OPTION_TELEPORT_INVISIBLE));
|
|
}
|
|
else
|
|
{
|
|
WARP_CHAR_FROM_CAR_TO_COORD(pPlayer,x,y,z); //not really good to tp other players for your sake, this is good//if everyone wants to be teleported -> you simply teleport the drver
|
|
SET_CHAR_HEADING(pPlayer,h);
|
|
return true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(!network_control(Player_VEHICLE_ID)) //if/when this returns true, it'll not run any code below and instantly
|
|
{ //start processing (!to_respawn), as you can see code here will have nothing
|
|
|
|
if(IS_THIS_MACHINE_THE_SERVER()) //to run if network_control is true..
|
|
{
|
|
to_respawn = true;
|
|
}
|
|
else
|
|
{
|
|
//ifdef superadmin to respawn = true //possibly
|
|
}
|
|
}
|
|
}
|
|
if(!to_respawn)
|
|
{
|
|
SET_CAR_FORWARD_SPEED(Player_VEHICLE,0.0f); //This will stop network control fucking people up
|
|
SET_CAR_COORDINATES(Player_VEHICLE,x,y,z);
|
|
SET_CAR_HEADING(Player_VEHICLE,h);
|
|
SET_CAR_ON_GROUND_PROPERLY(Player_VEHICLE); //can sometimes cause freezing..
|
|
return true;
|
|
}
|
|
}
|
|
if(Is_iPlayer) //this is unfortunately REQUIRED, as if you're not in a car, you won't get teleported by code above..
|
|
{
|
|
if(in_car) SET_CAR_COORDINATES(Player_VEHICLE,x,y,z);
|
|
else SET_CHAR_COORDINATES(pPlayer,x,y,z);
|
|
SET_CHAR_HEADING(pPlayer,h);
|
|
return true;
|
|
}
|
|
else if(to_respawn)
|
|
{
|
|
if(IS_THIS_MACHINE_THE_SERVER())
|
|
{
|
|
REGISTER_PLAYER_RESPAWN_COORDS(Player_ID,x,y,z); //DO NOT USE RESURRECT, IT CAUSES ALL SORTS OF GLITCHES! //seems to maybe not work on piss3
|
|
return true;
|
|
}
|
|
#ifdef SuperAdmin
|
|
else
|
|
{
|
|
REGISTER_PLAYER_RESPAWN_COORDS(Player_ID, x, y, z);
|
|
//REQUEST_COLLISION_AT_POSN( x, y, z );
|
|
RESURRECT_NETWORK_PLAYER(Player_ID,x,y,z,h);
|
|
REQUEST_COLLISION_AT_POSN( x, y, z );
|
|
return true;
|
|
}
|
|
#endif
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void MD_Teleport_ID(const int Player_ID,float x,float y,float z){
|
|
Ped Player_PED;
|
|
GET_PLAYER_CHAR(Player_ID,&Player_PED);
|
|
float land_x,land_y,land_z;
|
|
if(DOES_CHAR_EXIST(Player_PED) && PLAYER_HAS_CHAR(Player_ID)){
|
|
Vehicle vehicle;
|
|
if(!IS_CHAR_IN_ANY_CAR(Player_PED)){
|
|
if(Player_PED == pPlayer){ //Self start animation to run
|
|
DISABLE_SPECTATE(false);
|
|
SET_CHAR_VISIBLE(Player_PED,!GetBit(pPlayerOptionsBitSet, PLAYER_OPTION_TELEPORT_INVISIBLE));
|
|
DETACH_PED(Player_PED,true);
|
|
play_anims("move_gng@afro_c","sprint",0,0);
|
|
WAIT(600);
|
|
REQUEST_ANIMS("move_gng@afro_c");
|
|
SET_CHAR_COORDINATES_NO_OFFSET(Player_PED,x,y,z);
|
|
SWITCH_PED_TO_ANIMATED(pPlayer, 1);
|
|
FREEZE_CHAR_POSITION(pPlayer,false);
|
|
play_anims("move_gng@afro_c","sstop_l",0,1); //Animation when teleported
|
|
WAIT(25);
|
|
FREEZE_CHAR_POSITION(pPlayer,false);
|
|
}
|
|
else{
|
|
//Dev Only!!!!
|
|
REGISTER_PLAYER_RESPAWN_COORDS(Player_ID, x, y, z);
|
|
REQUEST_COLLISION_AT_POSN( x, y, z );
|
|
RESURRECT_NETWORK_PLAYER(Player_ID,x,y,z,0);
|
|
FREEZE_CHAR_POSITION(Player_PED,false);
|
|
//Else print cannot perform action unless as host
|
|
}
|
|
}
|
|
else{
|
|
int nvid;
|
|
GET_CAR_CHAR_IS_USING(Player_PED,&vehicle);
|
|
Run_Ptfx(vehicle);
|
|
GET_NETWORK_ID_FROM_VEHICLE(vehicle,&nvid);
|
|
if(!network_control(nvid) && Player_PED != pPlayer){
|
|
//Add bool to choose to do this
|
|
REGISTER_PLAYER_RESPAWN_COORDS(Player_ID, x, y, z);
|
|
REQUEST_COLLISION_AT_POSN( x, y, z );
|
|
RESURRECT_NETWORK_PLAYER(Player_ID,x,y,z,0);
|
|
FREEZE_CHAR_POSITION(Player_PED,false);
|
|
Alert("~b~MD: ~s~ Vehicle ID Controlled : Pulling them out",false);
|
|
}
|
|
else if(network_control(nvid) && Player_PED != pPlayer){
|
|
SET_CAR_COORDINATES(vehicle,x,y,z);
|
|
SET_CAR_FORWARD_SPEED(vehicle,0.0f);
|
|
SET_CAR_ON_GROUND_PROPERLY(vehicle);
|
|
}
|
|
else{
|
|
FREEZE_CHAR_POSITION(Player_PED,false);
|
|
if(IS_CHAR_IN_ANY_CAR(Player_PED)){
|
|
Run_Ptfx(vehicle);
|
|
SET_CAR_COORDINATES(vehicle, x, y, z);
|
|
SET_CAR_FORWARD_SPEED(vehicle,0.0f);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else Alert(Error_Char_Missing,false);
|
|
}
|
|
|
|
void MD_Teleport_Char(const int Player_PED,float x,float y,float z){ //Ped = int
|
|
float land_x,land_y,land_z;
|
|
if(DOES_CHAR_EXIST(Player_PED) && PLAYER_HAS_CHAR(Player_PED)){
|
|
Vehicle vehicle;
|
|
if(!IS_CHAR_IN_ANY_CAR(Player_PED)){
|
|
if(Player_PED == pPlayer){ //Self start animation to run
|
|
DISABLE_SPECTATE(false);
|
|
SET_CHAR_VISIBLE(Player_PED,!GetBit(pPlayerOptionsBitSet, PLAYER_OPTION_TELEPORT_INVISIBLE));
|
|
DETACH_PED(Player_PED,true);
|
|
play_anims("move_gng@afro_c","sprint",0,0);
|
|
WAIT(600);
|
|
REQUEST_ANIMS("move_gng@afro_c");
|
|
SET_CHAR_COORDINATES_NO_OFFSET(Player_PED,x,y,z);
|
|
SWITCH_PED_TO_ANIMATED(pPlayer, 1);
|
|
FREEZE_CHAR_POSITION(pPlayer,false);
|
|
play_anims("move_gng@afro_c","sstop_l",0,1); //Animation when teleported
|
|
WAIT(25);
|
|
FREEZE_CHAR_POSITION(pPlayer,false);
|
|
}
|
|
else{
|
|
|
|
}
|
|
}
|
|
else{
|
|
int nvid;
|
|
GET_CAR_CHAR_IS_USING(Player_PED,&vehicle);
|
|
Run_Ptfx(vehicle);
|
|
GET_NETWORK_ID_FROM_VEHICLE(vehicle,&nvid);
|
|
if(network_control(nvid) && Player_PED != pPlayer){
|
|
SET_CAR_COORDINATES(vehicle,x,y,z);
|
|
SET_CAR_FORWARD_SPEED(vehicle,0.0f);
|
|
SET_CAR_ON_GROUND_PROPERLY(vehicle);
|
|
}
|
|
else{
|
|
FREEZE_CHAR_POSITION(Player_PED,false);
|
|
if(IS_CHAR_IN_ANY_CAR(Player_PED)){
|
|
Run_Ptfx(vehicle);
|
|
SET_CAR_COORDINATES(vehicle, x, y, z);
|
|
SET_CAR_FORWARD_SPEED(vehicle,0.0f);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else Alert(Error_Char_Missing,false);
|
|
}
|
|
|
|
void Detach_pPlayer_On_Coord(void){ //most of this can prolly be removed..
|
|
float x,y,z;
|
|
if(IS_CHAR_IN_ANY_CAR(pPlayer)){
|
|
GET_CHAR_COORDINATES(pPlayer,&x,&y,&z);
|
|
WARP_CHAR_FROM_CAR_TO_COORD(pPlayer,x,y,z+1);
|
|
}
|
|
SET_PLAYER_CONTROL(iPlayer,true);
|
|
//if(is_driving(pPlayer)) SET_CAR_VISIBLE(GetPlayerVeh(),true);
|
|
SET_CAM_BEHIND_PED(pPlayer);
|
|
CAM_RESTORE();
|
|
SET_CHAR_COLLISION(pPlayer,true);
|
|
SET_CHAR_VISIBLE(pPlayer,!GetBit(pPlayerOptionsBitSet, PLAYER_OPTION_TELEPORT_INVISIBLE));
|
|
FREEZE_CHAR_POSITION(pPlayer,false);
|
|
DETACH_PED(pPlayer, true);
|
|
int SpectatePlayerIndex, SpectatePreviousPlayerIndex, AttachPlayerIndex, AttachType;
|
|
GetByteSet(SpectateAndAttachByteSet,&SpectatePlayerIndex,&SpectatePreviousPlayerIndex,&AttachPlayerIndex,&AttachType);
|
|
//if(AttachType == 3) MD_Teleport_ID_Heading(iPlayer,2635.00, 415, 79.00,0); //Tower Top
|
|
SpectatePlayerIndex = MAX_PLAYERS;
|
|
SpectatePreviousPlayerIndex = MAX_PLAYERS;
|
|
AttachType = 0;
|
|
AttachPlayerIndex = MAX_PLAYERS;
|
|
CreateByteSet(SpectatePlayerIndex, SpectatePreviousPlayerIndex, AttachPlayerIndex, AttachType, &SpectateAndAttachByteSet);
|
|
}
|
|
|
|
void Detach_pPlayer(void){ //most of this can prolly be removed..
|
|
|
|
float x,y,z;
|
|
if(IS_CHAR_IN_ANY_CAR(pPlayer)){
|
|
GET_CHAR_COORDINATES(pPlayer,&x,&y,&z);
|
|
WARP_CHAR_FROM_CAR_TO_COORD(pPlayer,x,y,z+1);
|
|
}
|
|
SET_PLAYER_CONTROL(iPlayer,true);
|
|
SET_CAM_BEHIND_PED(pPlayer);
|
|
CAM_RESTORE();
|
|
SET_CHAR_COLLISION(pPlayer,true);
|
|
SET_CHAR_VISIBLE(pPlayer,!GetBit(pPlayerOptionsBitSet, PLAYER_OPTION_TELEPORT_INVISIBLE));
|
|
FREEZE_CHAR_POSITION(pPlayer,false);
|
|
DETACH_PED(pPlayer, true);
|
|
int SpectatePlayerIndex, SpectatePreviousPlayerIndex, AttachPlayerIndex, AttachType;
|
|
GetByteSet(SpectateAndAttachByteSet,&SpectatePlayerIndex,&SpectatePreviousPlayerIndex,&AttachPlayerIndex,&AttachType);
|
|
SpectatePlayerIndex = MAX_PLAYERS;
|
|
SpectatePreviousPlayerIndex = MAX_PLAYERS;
|
|
AttachType = 0;
|
|
AttachPlayerIndex = MAX_PLAYERS;
|
|
CreateByteSet(SpectatePlayerIndex, SpectatePreviousPlayerIndex, AttachPlayerIndex, AttachType, &SpectateAndAttachByteSet);
|
|
//SpectatePlayerIndex = -1;
|
|
//Attach_Type = 0;
|
|
//SET_PED_ALPHA(pPlayer,0); //0 = invisible, 255 = solid //will slowly increment to 255 (fade in) when used.
|
|
}
|
|
|
|
bool WARP_PED_INTO_VEHICLE(const int ped, const int veh)
|
|
{
|
|
if(!DOES_CHAR_EXIST(ped) || !DOES_VEHICLE_EXIST(veh)) return false; //safety catch
|
|
int driver;
|
|
bool warped;
|
|
GET_DRIVER_OF_CAR(veh,&driver);
|
|
if(GetByteInSet(SpectateAndAttachByteSet, ATTACH_TYPE) == 3)
|
|
{
|
|
Detach_pPlayer();
|
|
}
|
|
if(DOES_CHAR_EXIST(driver))
|
|
{
|
|
int i;
|
|
for(i = 0; i < 3; i++)
|
|
{
|
|
if(!IS_CAR_PASSENGER_SEAT_FREE(veh,i)) continue;
|
|
WARP_CHAR_INTO_CAR_AS_PASSENGER(ped,veh,i);
|
|
warped = true;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
WARP_CHAR_INTO_CAR(ped,veh);
|
|
warped = true;
|
|
}
|
|
if(ped == pPlayer && warped)
|
|
{
|
|
SET_CHAR_VISIBLE(pPlayer,!GetBit(pPlayerOptionsBitSet, PLAYER_OPTION_TELEPORT_INVISIBLE));
|
|
}
|
|
return warped;
|
|
}
|
|
|
|
void GIVE_EPISODIC_WEAPONS_TO_CHAR(const int ped, const int episode){
|
|
int i, weapons[11];
|
|
REMOVE_ALL_CHAR_WEAPONS(ped);
|
|
weapons[0] = ( (episode == 2) ? WEAPON_EPISODIC_9 : WEAPON_PISTOL);
|
|
weapons[1] = ( (episode == 2) ? WEAPON_EPISODIC_10 : WEAPON_GRENADE);
|
|
weapons[2] = ( (episode == 2) ? WEAPON_EPISODIC_13 : WEAPON_RLAUNCHER);
|
|
weapons[3] = ( (episode == 2) ? WEAPON_EPISODIC_14 : WEAPON_MP5);
|
|
weapons[4] = ( (episode == 2) ? WEAPON_EPISODIC_15 : WEAPON_M4);
|
|
weapons[5] = ( (episode == 2) ? WEAPON_EPISODIC_1 : WEAPON_BARETTA);
|
|
weapons[6] = ( (episode == 2) ? WEAPON_EPISODIC_16 : WEAPON_SNIPERRIFLE);
|
|
weapons[7] = WEAPON_BASEBALLBAT;
|
|
weapons[8] = WEAPON_KNIFE;
|
|
weapons[9] = WEAPON_ARMOUR;
|
|
weapons[10] = WEAPON_UNARMED;
|
|
//GIVE_WEAPON_TO_CHAR(ped, WEAPON_UNARMED, 1, false);
|
|
WAIT(5);
|
|
for(i = 0; i < 11; i ++)
|
|
{
|
|
GIVE_WEAPON_TO_CHAR(ped,weapons[i], (i < 7 ? AMMO_MAX : 1),false);
|
|
WAIT(5);
|
|
//WAIT(10);
|
|
}
|
|
ADD_ARMOUR_TO_CHAR(ped,200);
|
|
Run_Ptfx(ped);
|
|
}
|
|
|
|
void block_net_control_of_object(Object Blocked_Object){
|
|
if(!In_Network)return;
|
|
int Blocked_Object_ID;
|
|
GET_NETWORK_ID_FROM_OBJECT(Blocked_Object, &Blocked_Object_ID);
|
|
SET_NETWORK_ID_CAN_MIGRATE(Blocked_Object_ID, false);
|
|
}
|
|
|
|
void Block_Net_Control_Of_Entity(int model,int Entity){
|
|
if(!In_Network)return;
|
|
int Entity_ID;
|
|
if(IS_THIS_MODEL_A_VEHICLE(model))GET_NETWORK_ID_FROM_VEHICLE(Entity, &Entity_ID);
|
|
else if(IS_THIS_MODEL_A_PED(model))GET_NETWORK_ID_FROM_PED(Entity, &Entity_ID);
|
|
else (GET_NETWORK_ID_FROM_OBJECT(Entity, &Entity_ID));
|
|
SET_NETWORK_ID_CAN_MIGRATE(Entity_ID, false);
|
|
}
|
|
|
|
void block_net_control_of_vehicle(Vehicle Blocked_Vehicle){
|
|
if(!In_Network)return;
|
|
int Blocked_Vehicle_ID;
|
|
GET_NETWORK_ID_FROM_VEHICLE(Blocked_Vehicle,&Blocked_Vehicle_ID);
|
|
SET_NETWORK_ID_CAN_MIGRATE(Blocked_Vehicle_ID,false);
|
|
}
|
|
|
|
void GetOffset(const int xPed, float distance, float *x, float *y, float *z){
|
|
Vector3 p;
|
|
GET_PED_BONE_POSITION(xPed, BONE_RIGHT_HAND, distance, distance * 0.042, distance * -0.113, &p);
|
|
*x = p.x;
|
|
*y = p.y;
|
|
*z = p.z;
|
|
}
|
|
|
|
|
|
void GIVE_CASH_PICKUP_TO_CHAR(const int ped, const int cash_amount){
|
|
int money_pickup = 0;
|
|
float x, y, z, sx, sy, sz, bearing;
|
|
GET_CHAR_COORDINATES(ped, &x, &y, &z);
|
|
for ( bearing = 0.0f; bearing < 271.0f; bearing += 90.0f ) {
|
|
x += 2.5f*SIN(bearing);
|
|
y += 2.5f*COS(bearing);
|
|
GET_SAFE_PICKUP_COORDS(x, y, z, &sx, &sy, &sz);
|
|
CREATE_MONEY_PICKUP( sx, sy, sz, cash_amount, TRUE, &money_pickup );
|
|
}
|
|
}
|
|
|
|
bool SPAWN_VEHICLE(const int model, float x, float y, float z, float h, int *spawned_veh)
|
|
{
|
|
//no deleting will take place here! we do that outside the function if needs be..
|
|
if(!IS_MODEL_IN_CDIMAGE(model))
|
|
{
|
|
Alert(Error_Model_Missing,false);
|
|
return false;
|
|
}
|
|
REQUEST_MODEL(model);
|
|
while(!HAS_MODEL_LOADED(model)) WAIT(0);
|
|
CREATE_CAR(model, x, y, z, &*spawned_veh, true); //if freeze use &*spawned_veh
|
|
SET_CAR_HEADING(*spawned_veh, h);
|
|
SET_CAR_CAN_BE_DAMAGED(*spawned_veh,!GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_INVINCIBLE));
|
|
SET_CAR_CAN_BE_VISIBLY_DAMAGED(*spawned_veh,!GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_INVINCIBLE));
|
|
MARK_MODEL_AS_NO_LONGER_NEEDED(model);
|
|
return true;
|
|
}
|
|
|
|
bool turn_car_into_heli(int veh) // SOmething wierd with this, heli doesnt get to be invisible + when transformer attached its a bumpy ride
|
|
{
|
|
|
|
|
|
if(!DOES_VEHICLE_EXIST(veh)) return false;
|
|
if(!IS_CHAR_IN_CAR(pPlayer,veh))
|
|
{
|
|
Alert("~b~MD: ~s~You can only perform this action on your own vehicle.", false);
|
|
return false;
|
|
}
|
|
float x,y,z,h,speed;
|
|
int spawned_heli;
|
|
GET_CHAR_COORDINATES_HEADING(pPlayer,&x,&y,&z,&h);
|
|
GET_CAR_SPEED(veh, &speed);
|
|
if(!SPAWN_VEHICLE(MODEL_ANNIHILATOR, x, y, z, h, &spawned_heli)) return false; //This doesnt make sence does it ?
|
|
WARP_CHAR_FROM_CAR_TO_CAR(pPlayer, spawned_heli, -1); //-1 = drivers seat
|
|
SET_CAR_COLLISION(veh,false);
|
|
ATTACH_CAR_TO_CAR(veh, spawned_heli, false, 0, 0, 0, 0, 0, 0);
|
|
SET_HELI_BLADES_FULL_SPEED(spawned_heli);
|
|
SET_CAR_FORWARD_SPEED(spawned_heli,speed);
|
|
SET_CAR_VISIBLE(spawned_heli,false);
|
|
SET_CHAR_VISIBLE(pPlayer,false); //won't this stop name above head showing?
|
|
SET_CAR_FORWARD_SPEED(spawned_heli,speed);
|
|
//MARK_CAR_AS_NO_LONGER_NEEDED(&spawned_heli); //make the game able to delete it if it's not used..
|
|
Alert("~b~MD: ~s~Transformation now able to fly",false);
|
|
return true;
|
|
}
|
|
|
|
void Delete_Attached_Cars(void){
|
|
Vehicle Attached_Vehicle;
|
|
int Search_Vehicle_id;
|
|
for(Search_Vehicle_id = 0; Search_Vehicle_id < 8000; Search_Vehicle_id++){
|
|
if(!DOES_VEHICLE_EXIST_WITH_NETWORK_ID(Search_Vehicle_id)) continue;
|
|
GET_VEHICLE_FROM_NETWORK_ID(Search_Vehicle_id,&Attached_Vehicle);
|
|
if(!IS_CAR_ATTACHED(Attached_Vehicle)) continue;
|
|
if(Attached_Vehicle == Personal_Vehicle) continue;
|
|
if(!HAS_CONTROL_OF_NETWORK_ID(Search_Vehicle_id)) continue;
|
|
DELETE_CAR(&Attached_Vehicle);
|
|
}
|
|
}
|
|
|
|
void Delete_Attached_Cars_New(int Player_ID){
|
|
Ped Player_PED;
|
|
if(PLAYER_HAS_CHAR(Player_ID)) GET_PLAYER_CHAR(Player_ID, &Player_PED);
|
|
else { Alert("~b~MD: ~s~Player has no character, failed.",false); return; }
|
|
if(Player_ID != iPlayer){
|
|
char * buffer[32];
|
|
Strcpy(buffer, "~b~MD: ~s~");
|
|
Strcat(buffer, "Deleting transformer vehicles on: ");
|
|
PLAYER_NAME_WITH_COLOUR(Player_ID, &buffer);
|
|
}
|
|
Vehicle Attached_Vehicle;
|
|
int Search_Vehicle_id, i;
|
|
float x,y,z,tx,ty,tz;
|
|
float distance;
|
|
GET_CHAR_COORDINATES(Player_PED,&x,&y,&z); //!OK : Get the coordinates
|
|
if(!IS_CHAR_IN_ANY_CAR(Player_PED)){
|
|
if(Player_ID == iPlayer){
|
|
Alert(Error_Personal_Vehicle,false);
|
|
return;
|
|
}
|
|
else{
|
|
char * buffer[32];
|
|
Strcpy(buffer, "~b~MD: ");
|
|
PLAYER_NAME_WITH_COLOUR(Player_ID, &buffer);
|
|
Strcat(buffer, "~s~is not in a vehicle.");
|
|
Alert(buffer, false);
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
for(i = 0; i < 7; i++){
|
|
for(Search_Vehicle_id = 0; Search_Vehicle_id < 8000; Search_Vehicle_id++){
|
|
if(!DOES_VEHICLE_EXIST_WITH_NETWORK_ID(Search_Vehicle_id)) continue;
|
|
GET_VEHICLE_FROM_NETWORK_ID(Search_Vehicle_id,&Attached_Vehicle);
|
|
if(!IS_CAR_ATTACHED(Attached_Vehicle)) continue;
|
|
GET_CAR_COORDINATES(Attached_Vehicle,&tx,&ty,&tz);
|
|
GET_DISTANCE_BETWEEN_COORDS_3D(x,y,z,tx,ty,tz,&distance);
|
|
if(distance > 25.0f) continue;
|
|
if(Attached_Vehicle == Personal_Vehicle) continue;
|
|
REQUEST_CONTROL_OF_NETWORK_ID(Search_Vehicle_id);
|
|
if(!HAS_CONTROL_OF_NETWORK_ID(Search_Vehicle_id)) continue;
|
|
DELETE_CAR(&Attached_Vehicle);
|
|
}
|
|
WAIT(80);
|
|
}
|
|
//Strcat(buffer, "~s~Succesfull!");
|
|
//Alert(buffer, false);
|
|
}
|
|
|
|
|
|
|
|
|
|
void Vehicle_Transformer(int Player_ID, const int Transformer_Mode){
|
|
Ped Player_Char;
|
|
Vehicle Spawn_Vehicle,Transformer_Vehicle;
|
|
Model Transformer_Model;
|
|
float Spawn_x, Spawn_y, Spawn_z, Spawn_h, Spawn_s;
|
|
if(PLAYER_HAS_CHAR(Player_ID))GET_PLAYER_CHAR(Player_ID, &Player_Char);
|
|
else{
|
|
Alert(Error_Char_Missing,false);
|
|
return;
|
|
}
|
|
if(!IS_CHAR_IN_ANY_CAR(Player_Char)){
|
|
if(Player_ID == iPlayer){
|
|
Alert(Error_Personal_Vehicle,false);
|
|
return;
|
|
}
|
|
else{
|
|
char * buffer[32];
|
|
Strcpy(buffer, "~b~MD: ~s~ ");
|
|
PLAYER_NAME_WITH_COLOUR(Player_ID, &buffer);
|
|
Strcat(buffer, "~s~is not in a vehicle.");
|
|
Alert(buffer, false);
|
|
return;
|
|
}
|
|
}
|
|
/**Get the data*/
|
|
if(Player_ID == iPlayer){
|
|
GET_CHAR_COORDINATES(pPlayer,&Spawn_x,&Spawn_y,&Spawn_z);
|
|
GET_CAR_CHAR_IS_USING(pPlayer,&Spawn_Vehicle);
|
|
}
|
|
else{
|
|
//Might need to use network control / Net players come later //nope wouldn't as only attaching, would only need that to set them invisi but meh
|
|
GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS(Player_Char, 0, 6, 0, &Spawn_x, &Spawn_y, &Spawn_z);
|
|
GET_CAR_CHAR_IS_USING(Player_Char,&Spawn_Vehicle);
|
|
}
|
|
GET_CAR_MODEL(Spawn_Vehicle,&Transformer_Model);
|
|
SET_CAR_VISIBLE(Spawn_Vehicle,false);
|
|
int i,upgrade[10];
|
|
for(i = 0;i<10;i++)
|
|
{
|
|
upgrade[i] = IS_VEHICLE_EXTRA_TURNED_ON(Spawn_Vehicle,i);
|
|
}
|
|
if(IS_MODEL_IN_CDIMAGE(Transformer_Model))REQUEST_MODEL(Transformer_Model);
|
|
else {
|
|
Alert(Error_Model_Missing,false);
|
|
return;
|
|
}
|
|
while(!HAS_MODEL_LOADED(Transformer_Model)) WAIT(0);
|
|
int Transformer_Num;
|
|
float rotation = 0.0f;
|
|
Delete_Attached_Cars_New(Player_ID);
|
|
//Delete_Attached_Cars();
|
|
//WAIT(100);
|
|
//MD_VEHICLE_SPAWNER_ON_ID(iPlayer ,Transformer_Model);
|
|
WAIT(80);
|
|
int netID;
|
|
for(Transformer_Num = 0; Transformer_Num < 12; Transformer_Num++) //Nathan wuz here
|
|
{
|
|
rotation += 30.0f;
|
|
CREATE_CAR(Transformer_Model,Spawn_x,Spawn_y,Spawn_z,&Transformer_Vehicle,true);
|
|
//WAIT(0);
|
|
GET_NETWORK_ID_FROM_VEHICLE(Transformer_Vehicle,&netID);
|
|
SET_NETWORK_ID_CAN_MIGRATE(Transformer_Vehicle,false);
|
|
SET_CAR_COLLISION(Transformer_Vehicle,false);
|
|
FORCE_CAR_LIGHTS(Transformer_Vehicle,2);
|
|
//WAIT(0);
|
|
SET_VEH_HAZARDLIGHTS(Transformer_Vehicle,true);
|
|
SET_VEH_INDICATORLIGHTS(Transformer_Vehicle,true);
|
|
SET_TAXI_LIGHTS(Transformer_Vehicle,true);
|
|
for(i = 0; i < 10; i++)
|
|
{
|
|
TURN_OFF_VEHICLE_EXTRA(Transformer_Vehicle,i,!upgrade[i]);
|
|
//if(i == 4) WAIT(0);
|
|
}
|
|
SWITCH_CAR_SIREN(Transformer_Vehicle,true);
|
|
switch(Transformer_Mode)
|
|
{
|
|
case 1: ATTACH_CAR_TO_CAR(Transformer_Vehicle,Spawn_Vehicle, 0, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, rotation); break;
|
|
case 2: ATTACH_CAR_TO_CAR(Transformer_Vehicle,Spawn_Vehicle, 0, 0.0f, 0.0f, 0.0f, 0.0f, rotation, 0.0f); break;
|
|
case 3: ATTACH_CAR_TO_CAR(Transformer_Vehicle,Spawn_Vehicle, 0, 0.0f, 0.0f, 0.0f, rotation, 0.0f, 0.0f); break;
|
|
}
|
|
//WAIT(0);
|
|
}
|
|
MARK_MODEL_AS_NO_LONGER_NEEDED(Transformer_Model);
|
|
}
|
|
|
|
void SPECTATE_FIND_NEW_PLAYER_OR_DISABLE(void){
|
|
int i,tmp_ped;
|
|
for(i = 0; i < MAX_PLAYERS; i++){
|
|
if(Player_Display_Selection(i)) continue;
|
|
|
|
GET_PLAYER_CHAR(i,&tmp_ped);
|
|
if(!DOES_CHAR_EXIST(tmp_ped)) continue;
|
|
|
|
SetByteSet(&SpectateAndAttachByteSet, SPECTATE_PLAYER_INDEX, i);
|
|
SetByteSet(&SpectateAndAttachByteSet, ATTACH_PLAYER_INDEX, i);
|
|
//SpectatePlayerIndex = i;
|
|
//Attach_Player_ID = i;
|
|
return;
|
|
}
|
|
|
|
SetByteSet(&SpectateAndAttachByteSet, ATTACH_TYPE, 0);
|
|
SetByteSet(&SpectateAndAttachByteSet, SPECTATE_PLAYER_INDEX, MAX_PLAYERS);
|
|
//SpectatePlayerIndex = -1;
|
|
//Attach_Type = 0;
|
|
DISABLE_SPECTATE(true);
|
|
//Detach_pPlayer();
|
|
}
|
|
|
|
void SPECTATE_PLAYER_LOOP(void)
|
|
{
|
|
int SpectatePlayerIndex, SpectatePreviousPlayerIndex, AttachPlayerIndex, AttachType;
|
|
GetByteSet(SpectateAndAttachByteSet,&SpectatePlayerIndex,&SpectatePreviousPlayerIndex,&AttachPlayerIndex,&AttachType);
|
|
#ifdef Admin
|
|
//if(AdminPlayerIndexActingUpon != -1)
|
|
if(GetByteInSet(AdminByteSet, ADMIN_BYTE_SET_INDEX_ACTING_UPON) != MAX_PLAYERS)
|
|
{
|
|
return;
|
|
}
|
|
#endif
|
|
if(SpectatePlayerIndex == MAX_PLAYERS) return; //disabled
|
|
//GET_PLAYER_CHAR(SpectatePlayerIndex,&spectate_ped);
|
|
//may need to move skip invalid above get player char if frez still occurs
|
|
if(Invalid_Player(SpectatePlayerIndex) || !PLAYER_HAS_CHAR(SpectatePlayerIndex) || SpectatePlayerIndex == iPlayer)
|
|
{
|
|
//SPECTATE_FIND_NEW_PLAYER_OR_DISABLE();
|
|
DISABLE_SPECTATE(true);
|
|
return; //yes return, will process again next loop :)
|
|
}
|
|
SET_CHAR_VISIBLE(pPlayer,false);
|
|
SET_CHAR_COLLISION(pPlayer,false);
|
|
if(IS_CHAR_IN_ANY_CAR(pPlayer))
|
|
{
|
|
REMOVE_CHAR_FROM_CAR_MAINTAIN_POSITION(pPlayer,GetPlayerVeh());
|
|
}
|
|
SET_PLAYER_CONTROL(iPlayer,false);
|
|
if(SpectatePreviousPlayerIndex != SpectatePlayerIndex) //used for THIS ONLY! //should prolly go off something else cuz if they spam change model streaming is gonna get spammed on/off too..
|
|
{
|
|
ALLOW_GAME_TO_PAUSE_FOR_STREAMING(true);
|
|
SWITCH_STREAMING(false);
|
|
//could use attach player id for comparison maybe.. hmm
|
|
SpectatePreviousPlayerIndex = SpectatePlayerIndex;
|
|
SetBit(MD_Misc_OptionsBitSet, MD_MISC_SPECTATE_STREAMING_BOOL, true);
|
|
}
|
|
else
|
|
{
|
|
if(GetBit(MD_Misc_OptionsBitSet, MD_MISC_SPECTATE_STREAMING_BOOL))
|
|
{
|
|
SWITCH_STREAMING(true);
|
|
SetBit(MD_Misc_OptionsBitSet, MD_MISC_SPECTATE_STREAMING_BOOL, false);
|
|
}
|
|
}
|
|
AttachType = 3;
|
|
AttachPlayerIndex = SpectatePlayerIndex;
|
|
//create quicker than setting individual as it gets and restores like i do here :) (better)
|
|
CreateByteSet(SpectatePlayerIndex, SpectatePreviousPlayerIndex, AttachPlayerIndex, AttachType, &SpectateAndAttachByteSet);
|
|
int spectate_ped = PLAYER_CHAR(SpectatePlayerIndex);
|
|
if(DOES_CAM_EXIST(scriptedCam))
|
|
{
|
|
uint pos[4];
|
|
GET_POSITION_OF_ANALOGUE_STICKS(0,&pos[0],&pos[1],&pos[2],&pos[3]);
|
|
zoom += 0.01f * pos[1];
|
|
angle += 0.035f * pos[2]; //maybe 0.04f (slightly faster than up/down due to players moving around n shit
|
|
//we could even probably increase the cams movement speed based on how fast the player you're spectating is going, idk, maybe in the future. - Nathan
|
|
angle2 = ( IS_LOOK_INVERTED() ? (angle2 - (0.035f * pos[3])) : (angle2 + (0.035f * pos[3])) );
|
|
|
|
if(zoom < 2) zoom = 2;
|
|
else if(zoom > 50) zoom = 50;
|
|
|
|
if(angle2 < 0) angle2 = 0;
|
|
else if(angle2 > 85) angle2 = 85;
|
|
|
|
UNATTACH_CAM(scriptedCam);
|
|
ATTACH_CAM_TO_PED(scriptedCam, spectate_ped);
|
|
SET_CAM_ATTACH_OFFSET(scriptedCam, zoom*SIN(angle)*COS(angle2), zoom*COS(angle)*COS(angle2), zoom*SIN(angle2));
|
|
POINT_CAM_AT_PED(scriptedCam, spectate_ped);
|
|
if(IS_BUTTON_PRESSED(0, BUTTON_L)) zoom += 0.3f;
|
|
if(IS_BUTTON_PRESSED(0, BUTTON_R)) zoom -= 0.3f;
|
|
}
|
|
else
|
|
{
|
|
CREATE_CAM(14, &scriptedCam);
|
|
SET_CAM_ACTIVE(scriptedCam, 1);
|
|
SET_CAM_PROPAGATE(scriptedCam, 1);
|
|
ACTIVATE_SCRIPTED_CAMS(1, 1);
|
|
ATTACH_CAM_TO_PED(scriptedCam, spectate_ped);
|
|
}
|
|
|
|
bool L1_IS_PRESSED = IS_BUTTON_PRESSED(0,BUTTON_L1);
|
|
if(L1_IS_PRESSED && IS_BUTTON_JUST_PRESSED(0,BUTTON_R1 ))
|
|
{
|
|
//Detach_pPlayer(); //works
|
|
DISABLE_SPECTATE(true);
|
|
return;
|
|
}
|
|
else if(L1_IS_PRESSED && IS_BUTTON_JUST_PRESSED(0,BUTTON_R2 ))
|
|
{
|
|
//Detach_pPlayer(); //Seems to freeze
|
|
Teleport_iPlayer_To_PlayerIndex(SpectatePlayerIndex, false);
|
|
DISABLE_SPECTATE(false);
|
|
return;
|
|
}
|
|
else if(L1_IS_PRESSED && IS_BUTTON_JUST_PRESSED(0,BUTTON_L2 ))
|
|
{
|
|
SetBit(pPlayerOptionsBitSet, PLAYER_OPTION_GODMODE, true);
|
|
SET_PLAYER_INVINCIBLE(iPlayer, true);
|
|
SetBit(VehicleOptionsBitSet, VEHICLE_OPTION_INVINCIBLE, true);
|
|
Detach_pPlayer();
|
|
MD_VEHICLE_SPAWNER_ON_ID(iPlayer,MODEL_ANNIHILATOR);
|
|
if(IS_CHAR_IN_ANY_HELI(pPlayer))
|
|
{
|
|
MD_Teleport_ID_Heading(iPlayer, 3706.1404, -2496.5984, 0.9329, 94.6);
|
|
Alert("~b~MD: ~s~You were teleported to the safe zone, explosions will not render out here.",false);
|
|
}
|
|
}
|
|
}
|
|
|
|
void Extended_Player_Scan(void){
|
|
int Ghost_Scan_ID;
|
|
float player_x, player_y, player_z;
|
|
Player Playerchar;
|
|
//player_count = 0;
|
|
for(Ghost_Scan_ID = 0;Ghost_Scan_ID < MAX_PLAYERS ;Ghost_Scan_ID++){
|
|
if(Invalid_Player(Ghost_Scan_ID))continue;
|
|
if(Ghost_Scan_ID == iPlayer)continue;
|
|
if(!IS_NETWORK_PLAYER_ACTIVE(Ghost_Scan_ID)){
|
|
if(PLAYER_HAS_CHAR(Ghost_Scan_ID)){
|
|
GET_PLAYER_CHAR(Ghost_Scan_ID,&Playerchar);
|
|
//MD_Spectate_Player(Playerchar);
|
|
Alert_Number(Ghost_Scan_ID,false);
|
|
WAIT(1000);
|
|
Alert_Two("~BLIP_76~ ~COL_NET_4~ Network Ghost Found ",GET_PLAYER_NAME(Ghost_Scan_ID),false);
|
|
WAIT(1000);
|
|
}
|
|
else{
|
|
Alert_Number(Ghost_Scan_ID,false);
|
|
WAIT(1000);
|
|
if(PLAYER_HAS_CHAR(Ghost_Scan_ID)){
|
|
GET_PLAYER_CHAR(Ghost_Scan_ID,&Playerchar);
|
|
//MD_Spectate_Player(Playerchar);
|
|
Alert_Two("~BLIP_76~ ~COL_NET_4~ Network Ghost Found ",GET_PLAYER_NAME(Ghost_Scan_ID),false);
|
|
}
|
|
if(!PLAYER_HAS_CHAR(Ghost_Scan_ID))Alert_Two("~BLIP_76~ ~COL_NET_4~ Invalid Player:~w~",GET_PLAYER_NAME(Ghost_Scan_ID),false);
|
|
WAIT(1000);
|
|
if (PLAYER_WANTS_TO_JOIN_NETWORK_GAME(Ghost_Scan_ID))Alert_Two("~BLIP_76~ ~COL_NET_3~ * Player is in Joining Game Status :~w~",GET_PLAYER_NAME(Ghost_Scan_ID),false);
|
|
else Alert_Two("~BLIP_76~ ~COL_NET_4~ Not Joining Game Status:~w~",GET_PLAYER_NAME(Ghost_Scan_ID),false);
|
|
WAIT(1000);
|
|
if(NETWORK_PLAYER_HAS_HEADSET(Ghost_Scan_ID))Alert_Two("~BLIP_76~ ~COL_NET_3~ Ghost Has Headset :~w~",GET_PLAYER_NAME(Ghost_Scan_ID),false);
|
|
else Alert_Two("~BLIP_76~ ~COL_NET_4~ No Headset Detected :~w~",GET_PLAYER_NAME(Ghost_Scan_ID),false);
|
|
//WAIT(1000);
|
|
//if(NETWORK_PLAYER_HAS_KEYBOARD(Ghost_Scan_ID))Alert_Two("~BLIP_76~ ~COL_NET_3~ Ghost Has Keyboard :~w~",GET_PLAYER_NAME(Ghost_Scan_ID),false);
|
|
//else Alert_Two("~BLIP_76~ ~COL_NET_4~ No Keyboard Detected :~w~",GET_PLAYER_NAME(Ghost_Scan_ID),false);
|
|
//if(HAS_PLAYER_DAMAGED_AT_LEAST_ONE_PED(Ghost_Scan_ID))Alert_Two("~BLIP_76~ ~COL_NET_4~ Damaged peds :~w~",GET_PLAYER_NAME(Ghost_Scan_ID),false); //Fucks the menu
|
|
//WAIT(1000);
|
|
//if(HAS_PLAYER_DAMAGED_AT_LEAST_ONE_VEHICLE(Ghost_Scan_ID))Alert_Two("~BLIP_76~ ~COL_NET_4~ Damaged vehicles :~w~",GET_PLAYER_NAME(Ghost_Scan_ID),false); //Fucks the menu
|
|
WAIT(1000);
|
|
if(IS_PLAYER_CONTROL_ON(Ghost_Scan_ID))Alert_Two("~BLIP_76~ ~COL_NET_4~ Player control on :~w~",GET_PLAYER_NAME(Ghost_Scan_ID),false);
|
|
WAIT(1000);
|
|
if(IS_PLAYER_TARGETTING_ANYTHING(Ghost_Scan_ID))Alert_Two("~BLIP_76~ ~COL_NET_4~ Targeting :~w~",GET_PLAYER_NAME(Ghost_Scan_ID),false);
|
|
WAIT(1000);
|
|
if(IS_PLAYER_SCRIPT_CONTROL_ON(Ghost_Scan_ID))Alert_Two("~BLIP_76~ ~COL_NET_4~ Script control on :~w~",GET_PLAYER_NAME(Ghost_Scan_ID),false);
|
|
WAIT(1000);
|
|
if(IS_PLAYER_READY_FOR_CUTSCENE(Ghost_Scan_ID))Alert_Two("~BLIP_76~ ~COL_NET_4~ Ready For cutscene :~w~",GET_PLAYER_NAME(Ghost_Scan_ID),false);
|
|
WAIT(1000);
|
|
if(IS_PLAYER_IN_REMOTE_MODE(Ghost_Scan_ID))Alert_Two("~BLIP_76~ ~COL_NET_4~ Remote mode :~w~",GET_PLAYER_NAME(Ghost_Scan_ID),false);
|
|
WAIT(1000);
|
|
//if(IS_PLAYER_VEHICLE_ENTRY_DISABLED(Ghost_Scan_ID))Alert_Two("~BLIP_76~ ~COL_NET_4~ Vehicle entry disabled :~w~",GET_PLAYER_NAME(Ghost_Scan_ID),false);;
|
|
//WAIT(1000);
|
|
if(IS_PLAYER_PLAYING(Ghost_Scan_ID))Alert_Two("~BLIP_76~ ~COL_NET_4~ IS_PLAYER_PLAYING NUB YOU MISSED A PRINT :D - Nathan :~w~",GET_PLAYER_NAME(Ghost_Scan_ID),false);
|
|
WAIT(5000);
|
|
}
|
|
}
|
|
}
|
|
Alert("~BLIP_76~ ~w~ Scan Performed",false);
|
|
}
|
|
|
|
void Vehicle_Color_Modification(const int player,const int vehicle,const int color1, const int color2, const int color3, const int color4){
|
|
if(GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_UNIFIED_COLOUR)){ //again makes no sense..
|
|
CHANGE_CAR_COLOUR(vehicle, color1, color2);
|
|
SET_EXTRA_CAR_COLOURS(vehicle, color3, color4);
|
|
}
|
|
else{
|
|
int rand;
|
|
GENERATE_RANDOM_INT_IN_RANGE(0,134,&rand);
|
|
CHANGE_CAR_COLOUR(vehicle,color1,rand);
|
|
SET_EXTRA_CAR_COLOURS(vehicle,rand,rand);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void create_big_explosion(float fX,float fY,float fZ){
|
|
ADD_EXPLOSION(fX,fY,fZ + 12.5,EXPLOSION_SHIP_DESTROY,10.0f,true,false,0.7f);
|
|
ADD_EXPLOSION(fX,fY,fZ,EXPLOSION_SHIP_DESTROY,10.0f,true,false,0.7f);
|
|
ADD_EXPLOSION(fX + 20.0,fY,fZ,EXPLOSION_SHIP_DESTROY,10.0f,true,false,0.7f);
|
|
ADD_EXPLOSION(fX + 40.0,fY,fZ,EXPLOSION_SHIP_DESTROY,10.0f,true,false,0.7f);
|
|
WAIT(100);
|
|
ADD_EXPLOSION(fX,fY + 20.0,fZ,EXPLOSION_SHIP_DESTROY,10.0f,true,false,0.7f);
|
|
ADD_EXPLOSION(fX,fY + 30.0,fZ,EXPLOSION_SHIP_DESTROY,10.0f,true,false,0.7f);
|
|
ADD_EXPLOSION(fX - 20.0,fY,fZ,EXPLOSION_SHIP_DESTROY,10.0f,true,false,0.7f);
|
|
ADD_EXPLOSION(fX - 40.0,fY,fZ,EXPLOSION_SHIP_DESTROY,10.0f,true,false,0.7f);
|
|
WAIT(100);
|
|
ADD_EXPLOSION(fX,fY + 20.0,fZ,EXPLOSION_SHIP_DESTROY,10.0f,true,false,0.7f);
|
|
ADD_EXPLOSION(fX,fY - 40.0,fZ,EXPLOSION_SHIP_DESTROY,10.0f,true,false,0.7f);
|
|
ADD_EXPLOSION(fX + 12.5,fY + 12.5,fZ,EXPLOSION_SHIP_DESTROY,10.0f,true,false,0.7f);
|
|
WAIT(100);
|
|
ADD_EXPLOSION(fX + 25.0,fY + 25.0,fZ,EXPLOSION_SHIP_DESTROY,10.0f,true,false,0.7f);
|
|
ADD_EXPLOSION(fX - 12.5,fY - 12.5,fZ,EXPLOSION_SHIP_DESTROY,10.0f,true,false,0.7f);
|
|
ADD_EXPLOSION(fX - 25.0,fY - 25.0,fZ,EXPLOSION_SHIP_DESTROY,10.0f,true,false,0.7f);
|
|
|
|
}
|
|
|
|
void spawn_car(uint model){
|
|
if(IS_MODEL_IN_CDIMAGE(model)){
|
|
//Check_Model(model);
|
|
REQUEST_MODEL(model);
|
|
int pveh,driver;
|
|
float x,y,z,h,s;
|
|
bool speed = false;
|
|
|
|
GET_CHAR_COORDINATES(pPlayer,&x,&y,&z);
|
|
GET_CHAR_HEADING(pPlayer,&h);
|
|
if(Menu_Ptfx){
|
|
int rand;
|
|
GENERATE_RANDOM_INT_IN_RANGE(0, 5, &rand);
|
|
char* effect[6];
|
|
effect[0] = "qub_lg_explode_blue";
|
|
effect[1] = "qub_lg_explode_yellow";
|
|
effect[2] = "qub_lg_explode_red";
|
|
effect[3] = "qub_lg_explode_purple";
|
|
effect[4] = "qub_lg_explode_orange";
|
|
effect[5] = "qub_lg_explode_green";
|
|
START_PTFX_ON_PED(effect[rand], pPlayer, 0, 0, 0, 0, 0, 0, 1);
|
|
}
|
|
if(IS_CHAR_IN_ANY_CAR(pPlayer)){
|
|
GET_CAR_CHAR_IS_USING(pPlayer,&pveh);
|
|
GET_CAR_SPEED(pveh,&s);
|
|
speed = true;
|
|
GET_DRIVER_OF_CAR(pveh,&driver);
|
|
WARP_CHAR_FROM_CAR_TO_COORD(pPlayer,x,y,z);
|
|
if(!DOES_CHAR_EXIST(driver) || pPlayer == driver || !IS_NETWORK_SESSION()){
|
|
clear_objects_on_car(pveh);
|
|
DELETE_CAR(&pveh);
|
|
}
|
|
}
|
|
while(!HAS_MODEL_LOADED(model)) WAIT(0);
|
|
CREATE_CAR(model,x,y,z,&pveh,true);
|
|
MARK_MODEL_AS_NO_LONGER_NEEDED(model);
|
|
#ifndef MasterMenu
|
|
if(GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_PERSONAL_COLOUR))
|
|
{
|
|
//BUDDY IF YOU WANT THIS BACK TELL ME AND I'LL CREATE A BYTESET FOR IT GIVEN ALL VALUES ARE FROM 0 - 255?
|
|
// CHANGE_CAR_COLOUR(pveh, Personalcol1,Personalcol1);
|
|
// SET_EXTRA_CAR_COLOURS(pveh, Personalcol2, Personalcol1);
|
|
}
|
|
|
|
if(GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_ALL_UPGRADES)){
|
|
int i;
|
|
for(i=0;i<10;i++){
|
|
TURN_OFF_VEHICLE_EXTRA(pveh, i, false);
|
|
}
|
|
}
|
|
#endif
|
|
SET_CAR_ENGINE_ON(pveh,true,true);
|
|
WARP_CHAR_INTO_CAR(pPlayer,pveh);
|
|
LOCK_CAR_DOORS(pveh,VEHICLE_DOOR_UNLOCKED);
|
|
SET_CAR_HEADING(pveh,h);
|
|
SET_VEHICLE_DIRT_LEVEL(pveh,0);
|
|
WASH_VEHICLE_TEXTURES(pveh,0);
|
|
SET_CAR_CAN_BE_DAMAGED(pveh,!GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_INVINCIBLE));
|
|
SET_CAR_CAN_BE_VISIBLY_DAMAGED(pveh,!GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_INVINCIBLE));
|
|
SET_CAN_BURST_CAR_TYRES(pveh,!GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_INVINCIBLE));
|
|
#ifndef MasterMenu
|
|
if(GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_DIRT)){
|
|
SET_VEHICLE_DIRT_LEVEL(pveh,15.9);
|
|
WASH_VEHICLE_TEXTURES(pveh,255);
|
|
}
|
|
SWITCH_CAR_SIREN(pveh,GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_SIREN));
|
|
#endif
|
|
if(speed){
|
|
SET_CAR_FORWARD_SPEED(pveh,s);
|
|
}
|
|
|
|
}
|
|
else Alert(Error_Model_Missing,false);
|
|
}
|
|
|
|
void spawn_eight_of_vehicle_model(int model1, int model2, int model3, int model4, int model5, int model6, int model7, int model8){ //USED IN CONTENT BUILDER
|
|
|
|
int j;
|
|
int INIT[9];
|
|
INIT[1] = model1;
|
|
INIT[2] = model2;
|
|
INIT[3] = model3;
|
|
INIT[4] = model4;
|
|
INIT[5] = model5;
|
|
INIT[6] = model6;
|
|
INIT[7] = model7;
|
|
INIT[8] = model8;
|
|
for(j=1;j<9;j++){
|
|
//Check_Model(INIT[j]);
|
|
REQUEST_MODEL(INIT[j]);
|
|
if(!IS_MODEL_IN_CDIMAGE(INIT[j])){
|
|
Alert(Error_Model_Missing,false);
|
|
return;
|
|
}
|
|
}
|
|
Car car;
|
|
Object lights;
|
|
float h,x,y,z;
|
|
int i;
|
|
if(!IS_THIS_MODEL_A_HELI(INIT[1])){
|
|
if(IS_CHAR_IN_ANY_CAR(pPlayer)) GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS(pPlayer, 9.5f, 4, 0, &x,&y,&z);
|
|
else GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS(pPlayer, 9.3, 4, 0, &x,&y,&z);
|
|
}
|
|
else GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS(pPlayer,24,16,0,&x,&y,&z);
|
|
GET_CHAR_HEADING(pPlayer,&h); //attempt uber l33t code here.
|
|
for(j=1;j<9;j++){
|
|
while(!HAS_MODEL_LOADED(INIT[j])) WAIT(0);
|
|
}
|
|
for(i = 1;i<9;i++){
|
|
CREATE_CAR(INIT[i],x,y,z,&car,true);
|
|
SET_CAR_HEADING(car,h);
|
|
|
|
int colours[14],rand;
|
|
colours[0] = 128; //yellow
|
|
colours[1] = 120; //cream
|
|
colours[2] = 107; //brown
|
|
colours[3] = 59; //green
|
|
colours[4] = 132; //yellow
|
|
colours[5] = 129; //lightblue
|
|
colours[6] = 125; //pink
|
|
colours[7] = 135; //white
|
|
colours[8] = 30; //red
|
|
colours[9] = 46;
|
|
colours[10] = 65; //blue
|
|
colours[11] = 71; //blue
|
|
colours[12] = 76; //blue
|
|
colours[13] = 103; //
|
|
|
|
|
|
GENERATE_RANDOM_INT_IN_RANGE(0,13,&rand);
|
|
|
|
if(INIT[i] == MODEL_SULTANRS){
|
|
CHANGE_CAR_COLOUR(car,0,colours[rand]);
|
|
SET_EXTRA_CAR_COLOURS(car,colours[rand],colours[rand]);
|
|
}
|
|
else{
|
|
int dick;
|
|
GENERATE_RANDOM_INT_IN_RANGE(0,13,&dick);
|
|
CHANGE_CAR_COLOUR(car,colours[rand],colours[dick]);
|
|
int cock;
|
|
GENERATE_RANDOM_INT_IN_RANGE(0,13,&rand);
|
|
GENERATE_RANDOM_INT_IN_RANGE(0,13,&cock);
|
|
SET_EXTRA_CAR_COLOURS(car,colours[rand],colours[cock]);
|
|
}
|
|
float dirt_level;
|
|
WASH_VEHICLE_TEXTURES(car,255);
|
|
|
|
for(j=0;j<=9;j++){
|
|
TURN_OFF_VEHICLE_EXTRA(car,j,false);
|
|
}
|
|
SET_CAR_ENGINE_ON(car,true,true);
|
|
SET_VEHICLE_DIRT_LEVEL(car,0);
|
|
WASH_VEHICLE_TEXTURES(car,0);
|
|
//SET_CAR_PROOFS(car, true, true, true, true, true);
|
|
SET_CAR_CAN_BE_DAMAGED(car, !GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_DAMAGE)); //var name here makes no sense to me buddy..
|
|
SET_CAR_CAN_BE_VISIBLY_DAMAGED(car, !GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_DAMAGE));
|
|
SET_CAN_BURST_CAR_TYRES(car,!GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_DAMAGE));
|
|
SET_CAR_STRONG(car,GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_DAMAGE));
|
|
SWITCH_CAR_SIREN(car,GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_SIREN));
|
|
if(GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_DIRT)){
|
|
SET_VEHICLE_DIRT_LEVEL(car,15.9f);
|
|
WASH_VEHICLE_TEXTURES(car,255);
|
|
}
|
|
//if(add_neons){
|
|
|
|
//if(i == 1 || i == 3 || i == 5 || i == 7)red_neon_on_vehicle(car);
|
|
//if(i == 2 || i == 4 || i == 6 || i == 8)blue_neon_on_vehicle(car);
|
|
//}
|
|
|
|
if(!IS_THIS_MODEL_A_HELI(INIT[i])){
|
|
if(i>4) GET_OFFSET_FROM_CAR_IN_WORLD_COORDS(car, 6, 0, 0, &x, &y, &z);
|
|
else if(i==4) GET_OFFSET_FROM_CAR_IN_WORLD_COORDS(car, 0, -10, 0, &x, &y, &z);
|
|
else if(i<4) GET_OFFSET_FROM_CAR_IN_WORLD_COORDS(car, -6, 0, 0, &x, &y, &z);
|
|
}
|
|
else if(INIT[i] == MODEL_AMBULANCE || INIT[i] == MODEL_STOCKADE || INIT[i] == MODEL_BUZZARD){
|
|
if(i>4) GET_OFFSET_FROM_CAR_IN_WORLD_COORDS(car, 10, 0, 0, &x, &y, &z);
|
|
else if(i==4) GET_OFFSET_FROM_CAR_IN_WORLD_COORDS(car, 0, -16, 0, &x, &y, &z);
|
|
else if(i<4) GET_OFFSET_FROM_CAR_IN_WORLD_COORDS(car, -10, 0, 0, &x, &y, &z);
|
|
}
|
|
else{
|
|
if(i>4) GET_OFFSET_FROM_CAR_IN_WORLD_COORDS(car, 17, 0, 0, &x, &y, &z);
|
|
else if(i==4) GET_OFFSET_FROM_CAR_IN_WORLD_COORDS(car, 0, -24, 0, &x, &y, &z);
|
|
else if(i<4) GET_OFFSET_FROM_CAR_IN_WORLD_COORDS(car, -17, 0, 0, &x, &y, &z);
|
|
}
|
|
|
|
}
|
|
for(j=1;j<9;j++){
|
|
MARK_MODEL_AS_NO_LONGER_NEEDED(INIT[j]);
|
|
}
|
|
}
|
|
|
|
|
|
void spawn_boat(void){
|
|
spawn_car(MODEL_SQUALO);
|
|
}
|
|
|
|
|
|
void delete_peds(const int desired_distance){
|
|
int i;
|
|
Ped networkPed;
|
|
float x, y, z, x2, y2, z2, distance;
|
|
for(i = 0; i < 3500; i++){
|
|
if(!DOES_PED_EXIST_WITH_NETWORK_ID(i)) continue;
|
|
if(i % 100 == 1) continue; //check for network players
|
|
GET_PED_FROM_NETWORK_ID(i, &networkPed);
|
|
GET_CHAR_COORDINATES(pPlayer, &x, &y, &z);
|
|
GET_CHAR_COORDINATES(networkPed, &x2, &y2, &z2);
|
|
GET_DISTANCE_BETWEEN_COORDS_3D(x2, y2, z2, x, y, z, &distance);
|
|
if(distance > desired_distance) continue;
|
|
if(network_control(i)){
|
|
DELETE_CHAR(&networkPed);
|
|
}
|
|
WAIT(10);
|
|
}
|
|
}
|
|
void delete_vehicles(const int desired_distance,const bool abandoned_only,const char* type){
|
|
int mode;
|
|
if(COMPARE_STRING(type,"all")) mode = 1;
|
|
else if(COMPARE_STRING(type,"cars")) mode = 2;
|
|
else if(COMPARE_STRING(type,"boats")) mode = 3;
|
|
else if(COMPARE_STRING(type,"helis")) mode = 4;
|
|
else if(COMPARE_STRING(type,"bikes")) mode = 5;
|
|
int i,vehicle;
|
|
float distance,x,y,z,mx,my,mz;
|
|
Ped driver;
|
|
int model;
|
|
GET_CHAR_COORDINATES(pPlayer,&mx,&my,&mz);
|
|
int DelObj;
|
|
for(DelObj = 0;DelObj < 9;DelObj++){
|
|
for(i=0;i<5001;i++){
|
|
if(!DOES_VEHICLE_EXIST_WITH_NETWORK_ID(i)) continue;
|
|
GET_VEHICLE_FROM_NETWORK_ID(i,&vehicle);
|
|
if(abandoned_only){
|
|
GET_DRIVER_OF_CAR(vehicle,&driver);
|
|
if(DOES_CHAR_EXIST(driver)) continue;
|
|
}
|
|
GET_DRIVER_OF_CAR(vehicle,&driver);
|
|
if(mode != 1){
|
|
GET_CAR_MODEL(vehicle,&model);
|
|
if(mode == 2){
|
|
if(!IS_THIS_MODEL_A_CAR(model)) continue;
|
|
}
|
|
else if(mode == 3){
|
|
if(!IS_THIS_MODEL_A_BOAT(model)) continue;
|
|
}
|
|
else if(mode == 4){
|
|
if(!IS_THIS_MODEL_A_HELI(model)) continue;
|
|
}
|
|
else if(mode == 5){
|
|
if(!IS_THIS_MODEL_A_BIKE(model)) continue;
|
|
}
|
|
}
|
|
GET_CAR_COORDINATES(vehicle,&x,&y,&z);
|
|
GET_DISTANCE_BETWEEN_COORDS_3D(x,y,z,mx,my,mz,&distance);
|
|
if(distance > desired_distance) continue;
|
|
REQUEST_CONTROL_OF_NETWORK_ID(i);
|
|
if(!HAS_CONTROL_OF_NETWORK_ID(i)) continue;
|
|
if(driver == pPlayer) continue;
|
|
Run_Ptfx(vehicle);
|
|
clear_objects_on_car(vehicle);
|
|
DELETE_CAR(&vehicle);
|
|
}
|
|
WAIT(30);
|
|
}
|
|
}
|
|
|
|
void teleport_on_foot(float x,float y,float z,float h){
|
|
FREEZE_CHAR_POSITION(pPlayer,false);
|
|
if(IS_CHAR_IN_ANY_CAR(pPlayer) && !is_driving(pPlayer)) WARP_CHAR_FROM_CAR_TO_COORD(pPlayer,x,y,z);
|
|
else{
|
|
if(!IS_CHAR_IN_ANY_CAR(pPlayer)) SET_CHAR_COORDINATES(pPlayer,x,y,z);
|
|
}
|
|
if(!IS_CHAR_IN_ANY_CAR(pPlayer)){
|
|
SET_CHAR_HEADING(pPlayer,h);
|
|
SET_GAME_CAM_HEADING(0.0); //whai not use h? - Nathan
|
|
LOAD_ALL_OBJECTS_NOW();
|
|
REQUEST_COLLISION_AT_POSN(x,y,z);
|
|
}
|
|
}
|
|
|
|
void delete_objects(const int desired_distance){
|
|
int i,object;
|
|
float distance,x,y,z,mx,my,mz;
|
|
GET_CHAR_COORDINATES(pPlayer,&mx,&my,&mz);
|
|
int DelObj;
|
|
for(DelObj = 0;DelObj < 9;DelObj++){
|
|
for(i=0;i<8000;i++){
|
|
if(!DOES_OBJECT_EXIST_WITH_NETWORK_ID(i)) continue;
|
|
GET_OBJECT_FROM_NETWORK_ID(i,&object);
|
|
GET_OBJECT_COORDINATES(object,&x,&y,&z);
|
|
GET_DISTANCE_BETWEEN_COORDS_3D(x,y,z,mx,my,mz,&distance);
|
|
if(distance > desired_distance) continue;
|
|
REQUEST_CONTROL_OF_NETWORK_ID(i);
|
|
if(!HAS_CONTROL_OF_NETWORK_ID(i)) continue;
|
|
DELETE_OBJECT(&object);
|
|
MARK_OBJECT_AS_NO_LONGER_NEEDED(&object);
|
|
}
|
|
WAIT(5);
|
|
}
|
|
}
|
|
|
|
void create_mobile_mapbase(const int player,const int model,float infront, float off_z, float off_h, const int visible, const int collision){ //HOOK for mobile maps --> First
|
|
float h, x, y, z,zz;
|
|
GET_CHAR_HEIGHT_ABOVE_GROUND(player, &zz);
|
|
GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS(player,0,0+ infront, off_z , &x,&y,&z);
|
|
GET_CHAR_HEADING(player,&h);
|
|
|
|
REQUEST_MODEL(model);
|
|
while (!HAS_MODEL_LOADED(model))WAIT(0);
|
|
|
|
CREATE_OBJECT_NO_OFFSET(model, x, y, z-zz, &mapbase_obj, true);
|
|
MARK_MODEL_AS_NO_LONGER_NEEDED(model);
|
|
|
|
SET_OBJECT_HEADING(mapbase_obj, h + off_h);
|
|
FREEZE_OBJECT_POSITION(mapbase_obj, true);
|
|
SET_OBJECT_LIGHTS(mapbase_obj, true);
|
|
SET_OBJECT_VISIBLE(mapbase_obj, visible);
|
|
SET_OBJECT_INVINCIBLE(mapbase_obj, true);
|
|
block_net_control_of_object(mapbase_obj);
|
|
SET_OBJECT_COLLISION(mapbase_obj, collision);
|
|
|
|
}
|
|
|
|
|
|
void save_current_location_for_tp1(void){
|
|
GET_CHAR_COORDINATES(pPlayer,&save_x,&save_y,&save_z);
|
|
create_mobile_mapbase(pPlayer,0xDD28B247,0,4,0, true, false);//blue cube
|
|
Alert("~BLIP_76~ ~c~Current location saved!",false);
|
|
}
|
|
//TASK_PLAY_ANIM( 0, "ground_attack", "missroman4", 8.00000000, 1, 0, 0, 0, -1 );
|
|
|
|
void Simple_Ped_Anim(int SimplePed, const char* set, const char* anim){
|
|
if(!HAVE_ANIMS_LOADED(set))REQUEST_ANIMS(set);
|
|
while(!HAVE_ANIMS_LOADED(set)) WAIT(0);
|
|
//TASK_PLAY_ANIM(SimplePed,anim,set,8.0, 1, 0, 0, 0, -1 ); //yes anim then set.
|
|
TASK_PLAY_ANIM_WITH_ADVANCED_FLAGS(SimplePed, anim, set, 1000.00000000, 0, 0, 0, 0, 0, 0, 0, -1 );
|
|
|
|
//REMOVE_ANIMS(set); //unload
|
|
}
|
|
|
|
/*
|
|
void Nathans_Rapid_Fire_Heli(void) //Need to te-make devils whacked load of shit.
|
|
{
|
|
if(!GetBit(MD_Misc_OptionsBitSet, MD_MISC_NATHANS_RAPID_FIRE_HELI)) return; //just for safety
|
|
int i;
|
|
if(!DOES_VEHICLE_EXIST(Personal_Vehicle))
|
|
{
|
|
Alert("~b~MD: ~s~This mod requires a helicopter.",false);
|
|
SetBit(MD_Misc_OptionsBitSet, MD_MISC_NATHANS_RAPID_FIRE_HELI, false);
|
|
Nathans_RapidHeli_Veh = 0;
|
|
for(i = 0; i < 4; i++)
|
|
{
|
|
if(DOES_CHAR_EXIST(Nathans_RapidHeli_Peds[i])) DELETE_CHAR(&Nathans_RapidHeli_Peds[i]);
|
|
}
|
|
return;
|
|
}
|
|
GET_CAR_CHAR_IS_USING(pPlayer,&Personal_Vehicle); //for safety..
|
|
if(Nathans_RapidHeli_Veh == 0) Nathans_RapidHeli_Veh = Personal_Vehicle;
|
|
else if(Personal_Vehicle != Nathans_RapidHeli_Veh)
|
|
{
|
|
Alert("~b~MD: ~s~Rapid heli disabled due to vehicle change.",false);
|
|
SetBit(MD_Misc_OptionsBitSet, MD_MISC_NATHANS_RAPID_FIRE_HELI, false);
|
|
Nathans_RapidHeli_Veh = 0;
|
|
for(i = 0; i < 4; i++)
|
|
{
|
|
if(DOES_CHAR_EXIST(Nathans_RapidHeli_Peds[i])) DELETE_CHAR(&Nathans_RapidHeli_Peds[i]);
|
|
}
|
|
return;
|
|
}
|
|
if(is_driving(pPlayer))
|
|
{
|
|
int VehModel;
|
|
GET_CAR_MODEL(Personal_Vehicle,&VehModel);
|
|
if(!IS_THIS_MODEL_A_HELI(VehModel))
|
|
{
|
|
Alert("~b~MD: ~s~This mod requires a helicopter.",false);
|
|
SetBit(MD_Misc_OptionsBitSet, MD_MISC_NATHANS_RAPID_FIRE_HELI, false);
|
|
return;
|
|
}
|
|
float mx, my, mz, x_offset[4];
|
|
x_offset[0] = -0.80f; x_offset[1] = -0.400f; x_offset[2] = 0.200f; x_offset[3] = 0.600f;
|
|
GET_CHAR_COORDINATES(pPlayer,&mx,&my,&mz);
|
|
int localgroup;
|
|
for(i = 0; i < 4; i++)
|
|
{
|
|
if(i == 0)
|
|
{
|
|
GET_PLAYER_GROUP(iPlayer,&localgroup);
|
|
if(!DOES_GROUP_EXIST(localgroup))
|
|
{
|
|
CREATE_GROUP(0, &localgroup, true);
|
|
SET_GROUP_LEADER(localgroup, pPlayer);
|
|
SET_GROUP_FORMATION(localgroup, 1);
|
|
SET_GROUP_FORMATION_SPACING(localgroup, 1);
|
|
}
|
|
}
|
|
if(!DOES_CHAR_EXIST(Nathans_RapidHeli_Peds[i]))
|
|
{
|
|
//SHOULD BE MODEL_M_Y_CLUBFIT WAS 1308302092
|
|
if(!HAS_MODEL_LOADED(MODEL_M_Y_CLUBFIT))
|
|
{
|
|
REQUEST_MODEL(MODEL_M_Y_CLUBFIT);
|
|
while(!HAS_MODEL_LOADED(MODEL_M_Y_CLUBFIT)) WAIT(0);
|
|
}
|
|
CREATE_CHAR(0, MODEL_M_Y_CLUBFIT, mx, my, mz, &Nathans_RapidHeli_Peds[i], true);
|
|
SET_CHAR_COLLISION(Nathans_RapidHeli_Peds[i], false);
|
|
WAIT(0);
|
|
SET_GROUP_MEMBER(localgroup, Nathans_RapidHeli_Peds[i]);
|
|
SET_CHAR_NEVER_LEAVES_GROUP(Nathans_RapidHeli_Peds[i], true);
|
|
SET_CHAR_INVINCIBLE(Nathans_RapidHeli_Peds[i], true);
|
|
int netID;
|
|
GET_NETWORK_ID_FROM_PED(Nathans_RapidHeli_Peds[i],&netID);
|
|
SET_NETWORK_ID_CAN_MIGRATE(netID, false);
|
|
WAIT(0);
|
|
ATTACH_PED_TO_CAR(Nathans_RapidHeli_Peds[i], Personal_Vehicle, 0, x_offset[i], 2.0f, 0.0f, 0.0f, 0.0f, 0, 0);
|
|
//SET_CHAR_COLLISION(Nathans_RapidHeli_Peds[i], false);
|
|
}
|
|
//if(i == 3 && HAS_MODEL_LOADED(1308302092)) MARK_MODEL_AS_NO_LONGER_NEEDED(1308302092); //who gives a shit for now
|
|
}
|
|
bool CURRENTLY_FIRING_HELI = false;
|
|
if(VehModel == MODEL_ANNIHILATOR) CURRENTLY_FIRING_HELI = IS_BUTTON_PRESSED(0, BUTTON_X);
|
|
else if(VehModel == MODEL_BUZZARD) CURRENTLY_FIRING_HELI = IS_BUTTON_PRESSED(0, BUTTON_A);
|
|
|
|
if(DOES_CHAR_EXIST(Nathans_RapidHeli_Peds[Nathans_RapidHeli_IndexToShoot]))
|
|
{
|
|
SET_CHAR_VISIBLE(Nathans_RapidHeli_Peds[Nathans_RapidHeli_IndexToShoot], CURRENTLY_FIRING_HELI);
|
|
}
|
|
if(CURRENTLY_FIRING_HELI)
|
|
{
|
|
for(i = 0; i < 4; i++)
|
|
{
|
|
if(!HAS_CHAR_GOT_WEAPON(Nathans_RapidHeli_Peds[i], WEAPON_MICRO_UZI))
|
|
{
|
|
GIVE_WEAPON_TO_CHAR(Nathans_RapidHeli_Peds[i], WEAPON_MICRO_UZI, AMMO_MAX, 0);
|
|
WAIT(0);
|
|
SET_CURRENT_CHAR_WEAPON(Nathans_RapidHeli_Peds[i], WEAPON_MICRO_UZI, true);
|
|
WAIT(0);
|
|
}
|
|
}
|
|
GET_OFFSET_FROM_CAR_IN_WORLD_COORDS(Personal_Vehicle, 0.0f, 200.0f, 0.0f, &mx, &my, &mz); //reuse vars
|
|
float h;
|
|
GET_CHAR_HEADING(pPlayer,&h);
|
|
for(i = 0; i < 4; i++)
|
|
{
|
|
SET_CHAR_HEADING(Nathans_RapidHeli_Peds[i],(h + 180));
|
|
FIRE_PED_WEAPON(Nathans_RapidHeli_Peds[i], mx, my, mz);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
void Rapid_Fire_Heli(void){ // Dont touch this pls!!
|
|
float WV_x, WV_y, WV_z;
|
|
Model model, Vehicle_Model;
|
|
bool in_car = IS_CHAR_IN_ANY_CAR(pPlayer);
|
|
if(in_car)
|
|
{
|
|
GET_CAR_MODEL(Personal_Vehicle,&Vehicle_Model);
|
|
GET_CAR_CHAR_IS_USING(pPlayer, &Personal_Vehicle);
|
|
}
|
|
if(in_car && (Vehicle_Model == MODEL_ANNIHILATOR || Vehicle_Model == MODEL_BUZZARD) && Devils_Rapid_Fire_Heli){
|
|
|
|
if(DOES_VEHICLE_EXIST(Personal_Vehicle)){
|
|
if(!DOES_CHAR_EXIST(WeaponVeh_ped[0])){
|
|
GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS(pPlayer, 0 ,0 , 0, &WV_x, &WV_y, &WV_z);
|
|
|
|
float x_Pos,Heading_Pos;
|
|
//Model Weaponped_Model = 1308302092;
|
|
Model Weaponped_Model = MODEL_M_Y_CLUBFIT; //For positioning
|
|
REQUEST_MODEL(Weaponped_Model);
|
|
while (!HAS_MODEL_LOADED(Weaponped_Model)) WAIT(0);
|
|
int Pednr;
|
|
for(Pednr = 0; Pednr < MAX_WEAPONPEDS; Pednr++){
|
|
if(DOES_CHAR_EXIST(WeaponVeh_ped[Pednr]))continue;
|
|
switch(Pednr)
|
|
{
|
|
case 0: x_Pos = -0.80f; break;
|
|
case 1: x_Pos = -0.400f; break;
|
|
case 2: x_Pos = 0.200f; break;
|
|
case 3: x_Pos = 0.600f; break;
|
|
}
|
|
|
|
CREATE_CHAR(0, Weaponped_Model, WV_x, WV_y, WV_z, &WeaponVeh_ped[Pednr], 1);
|
|
int texturesetting;
|
|
for(texturesetting = 0; texturesetting < 8; texturesetting++){
|
|
SET_CHAR_COMPONENT_VARIATION(WeaponVeh_ped[Pednr],texturesetting,0,0);
|
|
}
|
|
SET_PED_EXISTS_ON_ALL_MACHINES(WeaponVeh_ped[Pednr], true);
|
|
if(!IS_PED_ATTACHED_TO_ANY_CAR(WeaponVeh_ped[Pednr]))ATTACH_PED_TO_CAR(WeaponVeh_ped[Pednr], Personal_Vehicle,0, x_Pos,2,0, 0,0,0,0);
|
|
WAIT(0);
|
|
SET_GROUP_MEMBER(BG_Group, WeaponVeh_ped[Pednr]);
|
|
SET_CHAR_NEVER_LEAVES_GROUP(WeaponVeh_ped[Pednr], true);
|
|
SET_CHAR_INVINCIBLE(WeaponVeh_ped[Pednr], true);
|
|
FREEZE_CHAR_POSITION_AND_DONT_LOAD_COLLISION(WeaponVeh_ped[Pednr], true); //this fucks in multiplayer maybe me thinks..
|
|
if(IS_CHAR_VISIBLE(WeaponVeh_ped[Pednr]))SET_CHAR_VISIBLE(WeaponVeh_ped[Pednr],false);
|
|
ALLOW_REACTION_ANIMS(WeaponVeh_ped[Pednr], 0);
|
|
SET_CHAR_ALL_ANIMS_SPEED(WeaponVeh_ped[Pednr], 0);
|
|
|
|
}
|
|
MARK_MODEL_AS_NO_LONGER_NEEDED(Weaponped_Model);
|
|
|
|
}
|
|
else{
|
|
if(IS_CHAR_IN_ANY_CAR(pPlayer) ){
|
|
int Pednr;
|
|
float x_Pos,Heading_Pos,h;
|
|
Ped Target_Ped;
|
|
if(IS_BUTTON_PRESSED(0,(Vehicle_Model == MODEL_ANNIHILATOR) ? BUTTON_X : BUTTON_A)){
|
|
GET_CAR_CHAR_IS_USING(pPlayer, &Personal_Vehicle);
|
|
float off_x,off_y,off_z;
|
|
GET_OFFSET_FROM_CAR_IN_WORLD_COORDS(Personal_Vehicle, 0.00, 200.00, 0.00, &off_x, &off_y, &off_z); // Where 0,200,0 can be player coords (heatseekers LMAO)
|
|
for(Pednr = 0; Pednr < MAX_WEAPONPEDS; Pednr++){
|
|
if(!DOES_CHAR_EXIST(WeaponVeh_ped[Pednr]))continue;
|
|
switch(Pednr)
|
|
{
|
|
case 0: x_Pos = -0.80f; break;
|
|
case 1: x_Pos = -0.400f; break;
|
|
case 2: x_Pos = 0.200f; break;
|
|
case 3: x_Pos = 0.600f; break;
|
|
}
|
|
//SET_CAR_COLLISION(Personal_Vehicle,false);
|
|
GET_CHAR_HEADING(pPlayer,&h);
|
|
SET_CHAR_HEADING(WeaponVeh_ped[Pednr],h/2);
|
|
if(!IS_PED_ATTACHED_TO_ANY_CAR(WeaponVeh_ped[Pednr]))ATTACH_PED_TO_CAR(WeaponVeh_ped[Pednr], Personal_Vehicle,0, x_Pos,2,0, 0,0,0,0);
|
|
SET_CHAR_VISIBLE(WeaponVeh_ped[Pednr],true);
|
|
SET_CHAR_COLLISION( WeaponVeh_ped[Pednr], 0 );
|
|
GIVE_WEAPON_TO_CHAR(WeaponVeh_ped[Pednr],Vehicle_Weapon, AMMO_MAX, 0);
|
|
SET_CURRENT_CHAR_WEAPON(WeaponVeh_ped[Pednr], Vehicle_Weapon, true);
|
|
FIRE_PED_WEAPON(WeaponVeh_ped[Pednr], off_x, off_y , off_z);
|
|
REMOVE_WEAPON_FROM_CHAR(WeaponVeh_ped[Pednr], Vehicle_Weapon);
|
|
}
|
|
}
|
|
else{
|
|
for(Pednr = 0; Pednr < MAX_WEAPONPEDS; Pednr++){
|
|
if(!DOES_CHAR_EXIST(WeaponVeh_ped[Pednr]))continue;
|
|
GET_CAR_CHAR_IS_USING(pPlayer, &Personal_Vehicle);
|
|
switch(Pednr)
|
|
{
|
|
case 0: x_Pos = -0.80f; break;
|
|
case 1: x_Pos = -0.400f; break;
|
|
case 2: x_Pos = 0.200f; break;
|
|
case 3: x_Pos = 0.600f; break;
|
|
}
|
|
if(!IS_PED_ATTACHED_TO_ANY_CAR(WeaponVeh_ped[Pednr]))ATTACH_PED_TO_CAR(WeaponVeh_ped[Pednr], Personal_Vehicle,0, x_Pos,2,0, 0,0,0,0);
|
|
SET_CHAR_COLLISION( WeaponVeh_ped[Pednr], 0 );
|
|
if(!GetBit(VehicleOptionsBitSet, VEHICLE_OPTION_DESOLIDIFY)) SET_CAR_COLLISION(Personal_Vehicle,true);
|
|
if(IS_CHAR_VISIBLE(WeaponVeh_ped[Pednr]))SET_CHAR_VISIBLE(WeaponVeh_ped[Pednr],false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else{
|
|
if(Devils_Rapid_Fire_Heli){
|
|
int Pednr;
|
|
for(Pednr = 0; Pednr < MAX_WEAPONPEDS; Pednr++){
|
|
if(DOES_CHAR_EXIST(WeaponVeh_ped[Pednr])){
|
|
DELETE_CHAR(&WeaponVeh_ped[Pednr]);
|
|
}
|
|
}
|
|
}
|
|
Devils_Rapid_Fire_Heli = false;
|
|
}
|
|
}
|
|
|
|
void Weapon_Vehicle(void){ //Dont touch!
|
|
float WV_x, WV_y, WV_z;
|
|
Model model;
|
|
if(IS_CHAR_IN_ANY_CAR(pPlayer)&& MD_Weapon_Vehicle){
|
|
if(IS_CHAR_IN_ANY_HELI(pPlayer)){
|
|
Alert("~b~MD: ~s~Disabling Rocket vehicle mod ~n~This cannot be used in helis",false);
|
|
MD_Weapon_Vehicle = false;
|
|
return;
|
|
}
|
|
GET_CAR_CHAR_IS_USING(pPlayer, &Personal_Vehicle);
|
|
if(DOES_VEHICLE_EXIST(Personal_Vehicle) && MD_Weapon_Vehicle){
|
|
if(!DOES_CHAR_EXIST(WeaponVeh_ped[0])){
|
|
GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS(pPlayer, 0 ,0 , 0, &WV_x, &WV_y, &WV_z);
|
|
GET_PLAYER_GROUP(iPlayer,&BG_Group);
|
|
if(!DOES_GROUP_EXIST(BG_Group)){
|
|
CREATE_GROUP(0, &BG_Group, true);
|
|
SET_GROUP_LEADER(BG_Group, pPlayer);
|
|
SET_GROUP_FORMATION(BG_Group, 1);
|
|
SET_GROUP_FORMATION_SPACING(BG_Group, 1);
|
|
}
|
|
float x_Pos,Heading_Pos;
|
|
//Model Weaponped_Model = 1308302092; //Cutscene
|
|
Model Weaponped_Model = 558221221; // Roman W
|
|
//Model Weaponped_Model = MODEL_M_Y_CLUBFIT; //For positioning
|
|
REQUEST_MODEL(Weaponped_Model);
|
|
while (!HAS_MODEL_LOADED(Weaponped_Model)) WAIT(0);
|
|
int Pednr;
|
|
for(Pednr = 0; Pednr < MAX_WEAPONPEDS; Pednr++){
|
|
if(DOES_CHAR_EXIST(WeaponVeh_ped[Pednr]))continue;
|
|
if(Pednr == 0)x_Pos = -2.80f;
|
|
else if(Pednr == 1)x_Pos = -1.400f;
|
|
else if(Pednr == 2)x_Pos = 1.200f;
|
|
else if(Pednr == 3)x_Pos = 2.600f;
|
|
|
|
CREATE_CHAR(0, Weaponped_Model, WV_x, WV_y, WV_z, &WeaponVeh_ped[Pednr], 1);
|
|
int texturesetting;
|
|
for(texturesetting = 0; texturesetting < 8; texturesetting++){
|
|
SET_CHAR_COMPONENT_VARIATION(WeaponVeh_ped[Pednr],texturesetting,0,0);
|
|
}
|
|
SET_PED_EXISTS_ON_ALL_MACHINES(WeaponVeh_ped[Pednr], true);
|
|
if(!IS_PED_ATTACHED_TO_ANY_CAR(WeaponVeh_ped[Pednr]))ATTACH_PED_TO_CAR(WeaponVeh_ped[Pednr], Personal_Vehicle,0, x_Pos,3,0, 0,0,1,1);
|
|
WAIT(0);
|
|
SET_GROUP_MEMBER(BG_Group, WeaponVeh_ped[Pednr]);
|
|
SET_CHAR_NEVER_LEAVES_GROUP(WeaponVeh_ped[Pednr], true);
|
|
SET_CHAR_INVINCIBLE(WeaponVeh_ped[Pednr], true);
|
|
FREEZE_CHAR_POSITION_AND_DONT_LOAD_COLLISION(WeaponVeh_ped[Pednr], true); //this fucks in multiplayer maybe me thinks..
|
|
if(IS_CHAR_VISIBLE(WeaponVeh_ped[Pednr]))SET_CHAR_VISIBLE(WeaponVeh_ped[Pednr],false);
|
|
ALLOW_REACTION_ANIMS(WeaponVeh_ped[Pednr], 0);
|
|
SET_CHAR_ALL_ANIMS_SPEED(WeaponVeh_ped[Pednr], 0);
|
|
|
|
}
|
|
MARK_MODEL_AS_NO_LONGER_NEEDED(Weaponped_Model);
|
|
|
|
}
|
|
else{
|
|
if(IS_CHAR_IN_ANY_CAR(pPlayer) ){
|
|
int Pednr;
|
|
float x_Pos,Heading_Pos,h;
|
|
Ped Target_Ped;
|
|
Vehicle_Weapon = WEAPON_RLAUNCHER;
|
|
if(IS_BUTTON_PRESSED(0,BUTTON_X)){
|
|
GET_CAR_CHAR_IS_USING(pPlayer, &Personal_Vehicle);
|
|
float off_x,off_y,off_z;
|
|
GET_OFFSET_FROM_CAR_IN_WORLD_COORDS(Personal_Vehicle, 0.00, 200.00, 0.20, &off_x, &off_y, &off_z); // Where 0,200,0 can be player coords (heatseekers LMAO)
|
|
for(Pednr = 0; Pednr < MAX_WEAPONPEDS; Pednr++){
|
|
if(!DOES_CHAR_EXIST(WeaponVeh_ped[Pednr]))continue;
|
|
if(Pednr == 0)x_Pos = -2.80f;
|
|
else if(Pednr == 1)x_Pos = -1.400f;
|
|
else if(Pednr == 2)x_Pos = 1.200f;
|
|
else if(Pednr == 3)x_Pos = 2.600f;
|
|
GET_CHAR_HEADING(pPlayer,&h);
|
|
SET_CHAR_HEADING(WeaponVeh_ped[Pednr],h/2);
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(WeaponVeh_ped[Pednr], 1 );
|
|
if(!IS_PED_ATTACHED_TO_ANY_CAR(WeaponVeh_ped[Pednr]))ATTACH_PED_TO_CAR(WeaponVeh_ped[Pednr], Personal_Vehicle,0, x_Pos,3,0, 0,0,1,1);
|
|
SET_CHAR_COLLISION( WeaponVeh_ped[Pednr], 0 );
|
|
if(!HAS_CHAR_GOT_WEAPON(WeaponVeh_ped[Pednr],Vehicle_Weapon))GIVE_WEAPON_TO_CHAR(WeaponVeh_ped[Pednr],Vehicle_Weapon, AMMO_MAX, 0);
|
|
SET_CURRENT_CHAR_WEAPON(WeaponVeh_ped[Pednr], Vehicle_Weapon, true);
|
|
SET_CHAR_VISIBLE(WeaponVeh_ped[Pednr],true);
|
|
FIRE_PED_WEAPON(WeaponVeh_ped[Pednr], off_x, off_y , off_z);
|
|
SET_CHAR_VISIBLE(WeaponVeh_ped[Pednr],false);
|
|
REMOVE_WEAPON_FROM_CHAR(WeaponVeh_ped[Pednr], Vehicle_Weapon);
|
|
}
|
|
}
|
|
else{
|
|
for(Pednr = 0; Pednr < MAX_WEAPONPEDS; Pednr++){
|
|
if(!DOES_CHAR_EXIST(WeaponVeh_ped[Pednr]))continue;
|
|
GET_CAR_CHAR_IS_USING(pPlayer, &Personal_Vehicle);
|
|
if(Pednr == 0)x_Pos = -2.80f;
|
|
else if(Pednr == 1)x_Pos = -1.400f;
|
|
else if(Pednr == 2)x_Pos = 1.200f;
|
|
else if(Pednr == 3)x_Pos = 2.600f;
|
|
if(!IS_PED_ATTACHED_TO_ANY_CAR(WeaponVeh_ped[Pednr]))ATTACH_PED_TO_CAR(WeaponVeh_ped[Pednr], Personal_Vehicle,0, x_Pos,3,0, 0,0,1,1);
|
|
SET_CHAR_VISIBLE(WeaponVeh_ped[Pednr],false);
|
|
if(GetBit(VehicleOptionsBitSet, !VEHICLE_OPTION_DESOLIDIFY))SET_CAR_COLLISION(Personal_Vehicle,true);
|
|
if(HAS_CHAR_GOT_WEAPON(WeaponVeh_ped[Pednr],Vehicle_Weapon))REMOVE_WEAPON_FROM_CHAR(WeaponVeh_ped[Pednr], Vehicle_Weapon);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else{
|
|
if(MD_Weapon_Vehicle){
|
|
int Pednr;
|
|
for(Pednr = 0; Pednr < MAX_WEAPONPEDS; Pednr++){
|
|
if(DOES_CHAR_EXIST(WeaponVeh_ped[Pednr])){
|
|
DELETE_CHAR(&WeaponVeh_ped[Pednr]);
|
|
}
|
|
}
|
|
}
|
|
MD_Weapon_Vehicle = false;
|
|
}
|
|
}
|
|
|
|
void Ram_Player_Vehicle(const int Player_ID, Model Vehiclemodel){
|
|
Ped Player_PED;
|
|
Vehicle vehicle;
|
|
float Spawn_x, Spawn_y, Spawn_z, Spawn_h, Spawn_s;
|
|
if(PLAYER_HAS_CHAR(Player_ID))GET_PLAYER_CHAR(Player_ID, &Player_PED);
|
|
else{
|
|
Alert(Error_Char_Missing,false);
|
|
return;
|
|
}
|
|
if(IS_MODEL_IN_CDIMAGE(Vehiclemodel)){
|
|
REQUEST_MODEL(Vehiclemodel);
|
|
float heading;
|
|
float x,y,z;
|
|
GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS(Player_PED, 0, 25, 0, &x, &y, &z);
|
|
GET_CHAR_HEADING(Player_PED, &heading);
|
|
while(!HAS_MODEL_LOADED(Vehiclemodel)) WAIT(0);
|
|
CREATE_CAR(Vehiclemodel,x,y,z,&vehicle,true);
|
|
MARK_MODEL_AS_NO_LONGER_NEEDED(Vehiclemodel);
|
|
SET_CAR_ON_GROUND_PROPERLY(vehicle);
|
|
CHANGE_CAR_COLOUR(vehicle, 30, 30);//majorred
|
|
SET_EXTRA_CAR_COLOURS(vehicle, 30, 30);
|
|
SET_SIREN_WITH_NO_DRIVER(vehicle,true);
|
|
SWITCH_CAR_SIREN(vehicle,true);
|
|
SET_VEHICLE_DIRT_LEVEL(vehicle, 10);
|
|
WASH_VEHICLE_TEXTURES(vehicle, 255);
|
|
if(heading > 180.0) heading -= 180.0;
|
|
else heading += 180.0;
|
|
SET_CAR_HEADING(vehicle, heading);
|
|
FREEZE_CAR_POSITION(vehicle,false);
|
|
SET_CAR_COLLISION(vehicle, true);
|
|
SET_CAR_ENGINE_ON(vehicle,true,true);
|
|
SET_CAR_VISIBLE(vehicle,true);
|
|
SET_CAR_FORWARD_SPEED(vehicle,300);
|
|
WAIT(100);
|
|
EXPLODE_CAR(vehicle, true, false);
|
|
GET_CHAR_COORDINATES(Player_PED,&x,&y,&z);
|
|
ADD_EXPLOSION(x, y, z, EXPLOSION_SHIP_DESTROY, 10, true, false, 1);
|
|
|
|
//!Print
|
|
char * buffer[32]; //128 characters to play with
|
|
Strcpy(buffer, "~b~MD: ~s~An exploding "); //27 Characters
|
|
Strcat(buffer, VEHICLES_MODEL_NAME(vehicle));
|
|
Strcat(buffer, "~s~ was sent to: "); //27 Characters
|
|
PLAYER_NAME_WITH_COLOUR(Player_ID, &buffer); //WORKS! 47
|
|
Strcat(buffer, ".");
|
|
Alert(buffer,true);
|
|
}
|
|
}
|
|
|
|
|