17.01.2019, 16:38
Quote:
Test it.
By the way, in the 'foreach' you must verify if all the 'id' traversed are in 'spectator' mode (variable 'IsSpecing' enabled). Another thing, when using 'foreach' it is not necessary to check if the player is connected or disconnected. PHP Code:
PHP Code:
|
If the admin is in a different world when using /spec, they see blueberry and not the player.
If the world updates whilst someone is spectating, blueberry appears again. Interior updating works fine.
PHP Code:
CMD:spec(playerid, params[])
{
if(PlayerInfo[playerid][pAdmin] >= 1)
{
new targetid;
if(GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)
{
TogglePlayerSpectating(playerid, 0);
SetPlayerPos(playerid,SpecX[playerid],SpecY[playerid],SpecZ[playerid]);
SetPlayerFacingAngle(playerid, SpecR[playerid]);
SetPlayerInterior(playerid, SpecI[playerid]);
SetPlayerVirtualWorld(playerid, SpecW[playerid]);
IsSpecing[playerid] = 0;
IsBeingSpeced[SpecID[playerid]] = 0;
new str[128];
format(str, sizeof(str), "%s %s(%i) has quit spectating %s(%i).", ReturnAdminLevel(playerid), ReturnICName(playerid), playerid, ReturnICName(SpecID[playerid]), SpecID[playerid]);
ABroadCast(COLOR_SADMIN, str, 1);
new action[20];
format(action, sizeof(action), "spec end");
new query[250];
mysql_format(g_SQL, query, sizeof(query), "INSERT INTO logs_punishments(acc_dbid, acc_name, ip_address, time, action, reason, by_acc_dbid, by_acc_name) VALUES('%i', '%e', '%e', UTC_TIMESTAMP(), '%e', '-1', '%i', '%e')", PlayerInfo[targetid][pDBID], ReturnName(targetid), ReturnIP(targetid), action, PlayerInfo[playerid][pDBID], ReturnName(playerid));
mysql_tquery(g_SQL, query);
}
else
{
if(sscanf(params, "u", targetid))
return SCM(playerid, COLOR_INFO, "/spec [name/id](leave blank to quit spectating)");
if(targetid == playerid)
return SCM(playerid, COLOR_ERROR, "You can not use this command on yourself.");
if(!IsPlayerConnected(targetid))
return SCM(playerid, COLOR_ERROR, "That account is not connected.");
if(!Spawned[targetid])
return SCM(playerid, COLOR_ERROR, "That player has not logged in or spawned yet.");
if(GetPlayerState(targetid) == PLAYER_STATE_SPECTATING)
return SCMEx(playerid, COLOR_ERROR, "%s(%i) is spectating %s(%i) right now. Try again later.", ReturnICName(targetid), targetid, ReturnICName(SpecID[targetid]), SpecID[targetid]);
OnPlayerSave(playerid); // saves the player data so that they don't get rollbacked for not being spawned if they quit in spec mode.
GetPlayerPos(playerid,SpecX[playerid],SpecY[playerid],SpecZ[playerid]);
GetPlayerFacingAngle(playerid, SpecR[playerid]);
SpecI[playerid] = GetPlayerInterior(playerid);
SpecW[playerid] = GetPlayerVirtualWorld(playerid);
if(IsPlayerInAnyVehicle(targetid))
{
TogglePlayerSpectating(playerid, 1);
SetPlayerInterior(playerid, GetPlayerInterior(targetid));
SetPlayerVirtualWorld(playerid, GetPlayerVirtualWorld(targetid));
PlayerSpectateVehicle(playerid, GetPlayerVehicleID(targetid));
}
else
{
TogglePlayerSpectating(playerid, 1);
SetPlayerInterior(playerid, GetPlayerInterior(targetid));
SetPlayerVirtualWorld(playerid, GetPlayerVirtualWorld(targetid));
PlayerSpectatePlayer(playerid, targetid);
}
IsSpecing[playerid] = 1;
IsBeingSpeced[targetid] = 1;
SpecID[playerid] = targetid;
new str[128];
format(str, sizeof(str), "%s %s(%i) is spectating %s(%i).", ReturnAdminLevel(playerid), ReturnICName(playerid), playerid, ReturnICName(targetid), targetid);
ABroadCast(COLOR_SADMIN, str, 1);
new action[20];
format(action, sizeof(action), "spec start");
new query[250];
mysql_format(g_SQL, query, sizeof(query), "INSERT INTO logs_punishments(acc_dbid, acc_name, ip_address, time, action, reason, by_acc_dbid, by_acc_name) VALUES('%i', '%e', '%e', UTC_TIMESTAMP(), '%e', '-1', '%i', '%e')", PlayerInfo[targetid][pDBID], ReturnName(targetid), ReturnIP(targetid), action, PlayerInfo[playerid][pDBID], ReturnName(playerid));
mysql_tquery(g_SQL, query);
}
}
else return SCM(playerid,COLOR_ERROR,"You do not have the required access to execute this command.");
return 1;
}