/spec doesnt work with virtual world even though it changes
#1

The admin's world is 0.

The player's world is 5.

The admin proceeds to /spec the player.

The admin's world is set to 5, but regardless of that, I see blueberry.

If the world is the same prior to using /spec, it works fine.

Anyone knows why? All relevant code is below. Please help me fix this.

After this is fixed, I have other issues that need to be dealt with, but the above one is the main issue for now.
These other issues are, multiple people specing one person shouldnt reset the IsBeingSpeced, OnPlayerDeath you should re-spec again automatically, and if the world is updated, you should spec again so you don't see blueberry. But these are issues I will address later, the one above should be fixed first.

Before specing:


While specing:


After specing:


PHP код:
new Float:SpecX[MAX_PLAYERS], Float:SpecY[MAX_PLAYERS], Float:SpecZ[MAX_PLAYERS], Float:SpecR[MAX_PLAYERS], SpecW[MAX_PLAYERS], SpecI[MAX_PLAYERS], IsSpecing[MAX_PLAYERS], IsBeingSpeced[MAX_PLAYERS],SpecID[MAX_PLAYERS];
public 
OnPlayerStateChange(playeridnewstateoldstate)
{
    if(
newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER)
    {
        if(
IsBeingSpeced[playerid] == 1)
        {
            foreach(new 
i:Player)
            {
                if(
IsSpecing[i] != 1) continue;
                if(
SpecID[i] != playerid) continue;
                
SetPlayerVirtualWorld(iGetPlayerVirtualWorld(playerid));
                
PlayerSpectateVehicle(iGetPlayerVehicleID(playerid));
            }
        }
    }
    if(
oldstate == PLAYER_STATE_DRIVER || oldstate == PLAYER_STATE_PASSENGER)
    {
        if(
IsBeingSpeced[playerid] == 1)
        {
            foreach(new 
i:Player)
            {
                if(
IsSpecing[i] != 1) continue;
                if(
SpecID[i] != playerid) continue;
                
SetPlayerVirtualWorld(iGetPlayerVirtualWorld(playerid));
                
PlayerSpectatePlayer(iplayerid);
            }
        }
    }
    return 
1;
}
public 
OnPlayerInteriorChange(playeridnewinterioridoldinteriorid)
{
    if(
IsBeingSpeced[playerid] == 1)
    {
        foreach(new 
i:Player)
        {
            if(
IsSpecing[i] != 1) continue;
            if(
SpecID[i] != playerid) continue;
            
SetPlayerInterior(iGetPlayerInterior(playerid));
            
SetPlayerVirtualWorld(iGetPlayerVirtualWorld(playerid));
            if(
IsPlayerInAnyVehicle(playerid)) PlayerSpectateVehicle(iGetPlayerVehicleID(playerid));
            else 
PlayerSpectatePlayer(iplayerid);
        }
    }
    return 
1;
}
public 
OnPlayerDisconnect(playeridreason)
{
   if(
IsBeingSpeced[playerid] == 1// admins will stop specing the player if they log out.
    
{
        foreach(new 
i:Player)
        {
            if(
SpecID[i] == playerid)
            {
                
TogglePlayerSpectating(i0);
                
SetPlayerPos(iSpecX[i],SpecY[i],SpecZ[i]);
                
SetPlayerFacingAngle(iSpecR[i]);
                
SetPlayerInterior(iSpecI[i]);
                
SetPlayerVirtualWorld(iSpecW[i]);
                
IsSpecing[playerid] = 0;
                
IsBeingSpeced[SpecID[playerid]] = 0;
                new 
str2[128];
                
format(str2sizeof(str2), "%s %s(%i) has quit spectating ID %i."ReturnAdminLevel(i), ReturnICName(i), iSpecID[playerid]);
                
ABroadCast(COLOR_SADMINstr21);
                new 
action2[20];
                
format(action2sizeof(action2), "spec end (quit)");
                new 
query2[250];
                
mysql_format(g_SQLquery2sizeof(query2), "INSERT INTO logs_punishments(acc_dbid, acc_name, ip_address, time, action, reason, by_acc_dbid, by_acc_name) VALUES('%i', '%e', '-1', UTC_TIMESTAMP(), '%e', '-1', '%i', '%e')"PlayerInfo[playerid][pDBID], ReturnName(playerid), action2PlayerInfo[i][pDBID], ReturnName(i));
                
mysql_tquery(g_SQLquery2);
            }
        }
    }
    
ResetPlayer(playerid);
    return 
1;
}
function:
ResetPlayer(playerid)
{
    
IsSpecing[playerid] = 0;
    
IsBeingSpeced[SpecID[playerid]] = 0;
    return 
1;
}
public 
OnPlayerSpawn(playerid)
{
    if(
FirstSpawn[playerid]) // checks if a player just logged in or registered.
    
{
        
SetPlayerSpawn(playerid);
    }
    if(
IsSpecing[playerid] == 1)
    {
        
SetPlayerPos(playerid,SpecX[playerid],SpecY[playerid],SpecZ[playerid]);
        
SetPlayerFacingAngle(playeridSpecR[playerid]);
        
SetPlayerInterior(playeridSpecI[playerid]);
        
SetPlayerVirtualWorld(playeridSpecW[playerid]);
        
SetPlayerHealth(playeridPlayerInfo[playerid][pHealth]);
        
SetPlayerArmour(playeridPlayerInfo[playerid][pArmour]);
        
IsSpecing[playerid] = 0;
        new 
found_spectator isAnyoneSpecingTarget(playerid);
        if(!
found_spectator)
        {
        
IsBeingSpeced[SpecID[playerid]] = 0;
        }
    }
    return 
1;
}
CMD:spec(playeridparams[])
{
    if(
PlayerInfo[playerid][pAdmin] >= 1)
    {
        new 
targetid;
        if(
GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)
        {
            
TogglePlayerSpectating(playerid0);
            new 
str[128];
            
format(strsizeof(str), "%s %s(%i) has quit spectating %s(%i)."ReturnAdminLevel(playerid), ReturnICName(playerid), playeridReturnICName(SpecID[playerid]), SpecID[playerid]);
            
ABroadCast(COLOR_SADMINstr1);
            new 
action[20];
            
format(actionsizeof(action), "spec end");
            new 
query[250];
            
mysql_format(g_SQLquerysizeof(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), actionPlayerInfo[playerid][pDBID], ReturnName(playerid));
            
mysql_tquery(g_SQLquery);
        }
        else
        {
            if(
sscanf(params"u"targetid))
                return 
SCM(playeridCOLOR_INFO"/spec [name/id](leave blank to quit spectating)");
            if(
targetid == playerid)
                return 
SCM(playeridCOLOR_ERROR"You can not use this command on yourself.");
            if(!
IsPlayerConnected(targetid))
                return 
SCM(playeridCOLOR_ERROR"That account is not connected.");
            if(!
Spawned[targetid])
                return 
SCM(playeridCOLOR_ERROR"That player has not logged in or spawned yet.");
            if(
GetPlayerState(targetid) == PLAYER_STATE_SPECTATING)
                return 
SCMEx(playeridCOLOR_ERROR"%s(%i) is spectating %s(%i) right now. Try again later."ReturnICName(targetid), targetidReturnICName(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(playeridSpecR[playerid]);
            
SpecI[playerid] = GetPlayerInterior(playerid);
            
SpecW[playerid] = GetPlayerVirtualWorld(playerid);
            
            
SetPlayerVirtualWorld(playeridGetPlayerVirtualWorld(targetid));
            
SetPlayerInterior(playeridGetPlayerInterior(targetid));
            
            
TogglePlayerSpectating(playerid1);
            if(
IsPlayerInAnyVehicle(targetid)) PlayerSpectateVehicle(playeridGetPlayerVehicleID(targetid));
            else 
PlayerSpectatePlayer(playeridtargetid);
            
IsSpecing[playerid] = 1;
            
IsBeingSpeced[targetid] = 1;
            
SpecID[playerid] = targetid;
            new 
str[128];
            
format(strsizeof(str), "%s %s(%i) is spectating %s(%i)."ReturnAdminLevel(playerid), ReturnICName(playerid), playeridReturnICName(targetid), targetid);
            
ABroadCast(COLOR_SADMINstr1);
            new 
action[20];
            
format(actionsizeof(action), "spec start");
            new 
query[250];
            
mysql_format(g_SQLquerysizeof(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), actionPlayerInfo[playerid][pDBID], ReturnName(playerid));
            
mysql_tquery(g_SQLquery);
        }
    }
    else return 
SCM(playerid,COLOR_ERROR,"You do not have the required access to execute this command.");
    return 
1;

Reply


Messages In This Thread

Forum Jump:


Users browsing this thread: 1 Guest(s)