Skip to content

Instantly share code, notes, and snippets.

@ifarbod
Created July 6, 2014 15:16
Show Gist options
  • Save ifarbod/5177eb53a8e2449346d9 to your computer and use it in GitHub Desktop.
Save ifarbod/5177eb53a8e2449346d9 to your computer and use it in GitHub Desktop.
SetPlayerSpectatePlayer Function.
// 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