Created
July 6, 2014 15:16
-
-
Save ifarbod/5177eb53a8e2449346d9 to your computer and use it in GitHub Desktop.
SetPlayerSpectatePlayer Function.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// We need some fuctions. | |
#include <a_samp> | |
// Declaring a var for checking a player is spectating which player. | |
new | |
gSpecTarget[MAX_PLAYERS] = INVALID_PLAYER_ID; | |
// An enum. For storing player pos (x, y, z) | |
enum E_PLAYER_POS | |
{ | |
Float:x, | |
Float:y, | |
Float:z | |
} | |
// Declaring a var for player pos, to checking is he moved from his pos or not. | |
new | |
gPlayerPos[MAX_PLAYERS][E_PLAYER_POS]; | |
// Is Player Pending for spectate? | |
new | |
gPendingSpec[MAX_PLAYERS] = 0; | |
CMD:spec(playerid, params[]) | |
{ | |
new | |
targetid; | |
if(sscanf(params, "u", targetid)) return SendClientMessage(playerid, ICLR_PRIMARY, "Syntax: /spec [Player]"); | |
if(!IsPlayerConnected(targetid)) return SendClientMessage(playerid, ICLR_WARNING, "Target player isn't connected!"); | |
if(!IsPlayerSpawned(targetid)) return SendClientMessage(playerid, ICLR_WARNING, "Target player isn't spawned!"); | |
GetPlayerPos(playerid, gPlayerPos[playerid][x], gPlayerPos[playerid][y], gPlayerPos[playerid][z]); | |
gPendingSpec[playerid] = 1; | |
SetTimerEx("BeginSpectate", 10000, 0, "iifff", playerid, targetid); | |
SendClientMessage(playerid, FWTC_YELLOW, "Entering Spectator Mode in 10 seconds, Please don't move."); | |
return 1; | |
} | |
// Our public funcion for starting the specate. | |
forward BeginSpectate(playerid, targetid); // forwarding the public function. | |
public BeginSpectate(playerid, targetid) | |
{ | |
new | |
Float:Pos[3]; | |
GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]); | |
if(!floatcmp(Pos[0], gPlayerPos[playerid][x]) && !floatcmp(Pos[1], gPlayerPos[playerid][y]) && !floatcmp(Pos[2], gPlayerPos[playerid][z])) | |
{ | |
SetPlayerSpectatePlayer(playerid, targetid); | |
gPendingSpec[playerid] = 0; | |
} | |
else | |
{ | |
SendClientMessage(playerid, FWTC_RED, "You have moved from your position or seems you are injured. Spectating Canceled."); | |
gPendingSpec[playerid] = 0; | |
} | |
} | |
public OnGameModeInit() | |
{ | |
return 1; | |
} | |
public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid) | |
{ | |
for(new i = 0; i != MAX_PLAYERS; ++i) | |
{ | |
if(gTargetSpec[i] == playerid) | |
{ | |
SyncSpectate(playerid, i); | |
} | |
} | |
#if defined SpecLib_OnPlayerInteriorChange | |
return SpecLib_OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid); | |
#else | |
return 1; | |
#endif | |
} | |
#if defined _ALS_OnPlayerInteriorChange | |
#undef OnPlayerInteriorChange | |
#else | |
#define _ALS_OnPlayerInteriorChange | |
#endif | |
#define OnPlayerInteriorChange SpecLib_OnPlayerInteriorChange | |
#if defined SpecLib_OnPlayerInteriorChange | |
forward SpecLib_OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid); | |
#endif | |
public OnPlayerStateChange(playerid, newstate, oldstate) | |
{ | |
for(new i = 0; i != MAX_PLAYERS; ++i) | |
{ | |
if(gTargetSpec[i] == playerid) | |
{ | |
SyncSpectate(playerid, i); | |
} | |
} | |
SpectateUpdate(playerid, i); | |
#if defined SpecLib_OnPlayerStateChange | |
return SpecLib_OnPlayerStateChange(playerid, newstate, oldstate); | |
#else | |
return 1; | |
#endif | |
} | |
#if defined _ALS_OnPlayerStateChange | |
#undef OnPlayerStateChange | |
#else | |
#define _ALS_OnPlayerStateChange | |
#endif | |
#define OnPlayerStateChange SpecLib_OnPlayerStateChange | |
#if defined SpecLib_OnPlayerStateChange | |
forward SpecLib_OnPlayerStateChange(playerid, newstate, oldstate); | |
#endif | |
public OnPlayerConnect(playerid) | |
{ | |
gSpecTarget[playerid] = INVALID_PLAYER_ID; | |
gPendingSpec[playerid] = 0; | |
return 1; | |
} | |
public OnPlayerDisconnect(playerid, reason) | |
{ | |
#pragma unused reason | |
gSpecTarget[playerid] = INVALID_PLAYER_ID; | |
gPendingSpec[playerid] = 0; | |
return 1; | |
} | |
stock SetPlayerSpectatePlayer(playerid, targetid, mode = SPECTATE_MODE_NORMAL) | |
{ | |
if(!IsPlayerConnected(playerid)) | |
{ | |
printf("*** SetPlayerSpectatePlayer Error: Function Unable to Execute because 'playerid' (%d) isn't connected.", playerid); | |
return 0; | |
} | |
if(!IsPlayerConnected(targetid)) | |
{ | |
printf("*** SetPlayerSpectatePlayer Error: Function Unable to Execute because 'targetid' (%d) isn't connected.", targetid); | |
return 0; | |
} | |
if(!IsPlayerSpawned(targetid)) | |
{ | |
printf("*** SetPlayerSpectatePlayer Error: 'targetid' (%d) isn't spawned.", targetid); | |
return 0; | |
} | |
new | |
worldid = GetPlayerVirtualWorld(targetid), | |
interiorid = GetPlayerInterior(targetid); | |
SetPlayerInterior(playerid, interiorid); | |
SetPlayerVirtualWorld(playerid, worldid); | |
gSpecTarget[playerid] = targetid; | |
TogglePlayerSpectating(playerid, 1); | |
if(IsPlayerInAnyVehicle(targetid)) | |
{ | |
PlayerSpectateVehicle(playerid, GetPlayerVehicleID(targetid), mode); | |
} | |
else | |
{ | |
PlayerSpectatePlayer(playerid, targetid, mode); | |
} | |
gPendingSpec[playerid] = 0; | |
return 1; | |
} | |
// Some useful functions. | |
stock IsPlayerSpectating(playerid) | |
{ | |
if(GetPlayerState(playerid) == PLAYER_STATE_SPECTATING) return 1; | |
return 0; | |
} | |
stock SyncSpectate(playerid, forplayerid) | |
{ | |
SetPlayerVirtualWorld(forplayerid, GetPlayerVirtualWorld(playerid)); | |
SetPlayerInterior(forplayerid, GetPlayerInterior(playerid)); | |
} | |
stock SpectateUpdate(playerid, forplayerid) | |
{ | |
if(!IsPlayerSpectating(forplayerid)) TogglePlayerSpectating(forplayerid, 1); | |
if(IsPlayerInAnyVehicle(playerid)) | |
{ | |
PlayerSpectateVehicle(forplayerid, GetPlayerVehicleID(playerid)); | |
} | |
else | |
{ | |
PlayerSpectatePlayer(forplayerid, playerid); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment