Portal SAMP
[Ajuda] admin spec em outro player - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] admin spec em outro player (/showthread.php?tid=2380)



admin spec em outro player - hiwyn - 11/05/2022

Eu queria fazer um script pra ficar olhando os outros players jogar, até tentei funciona, mas tá uma merda....

1- quando um cara troca de interior ou virtual world (um dos dois ou os dois ainda não consegui indentificar) fica tudo branco
2- quando um cara entra num carro eu vejo de dentro do carro como se tivesse em primeira pessoa

Código:
CMD:tv(playerid, params[]) {
        if(admin[playerid] < 1) return 0;
        new id, string[80], lvlaviso;
        lvlaviso = admin[playerid];
        if(sscanf(params,"u", id) && gSpectateID[playerid] == 65535) return SendClientMessage(playerid, -1, "Use: /tv [id]");
        else if(sscanf(params,"u", id) && gSpectateID[playerid] != 65535) {
            SetPlayerInteriorEx(playerid,0);
            SetPlayerVirtualWorldEx(playerid,0);
            inttype[playerid] = 0;
            TogglePlayerSpectating(playerid, 0);
            gSpectateID[playerid] = INVALID_PLAYER_ID;
            gSpectateType[playerid] = ADMIN_SPEC_TYPE_NONE;
            format(string, sizeof(string), "AdmCmd: %s saiu do modo TV.", PlayerName(playerid));
            ABroadCast(COLOR_LIGHTRED, string, lvlaviso);
            SpawnPlayer(playerid);
            return 1;
        }
        if(id == playerid) return SendClientMessage(playerid, -1, "You can not use this command for yourself!");
        else if(!IsPlayerConnected(id)) return SendClientMessage(playerid, COLOR_GREY, "Jogador não conectado");
        else if(id == INVALID_PLAYER_ID) return SendClientMessage(playerid, -1, "[ERROR] You have entered an invalid playername/playerid!");
        else {
            DoingTv(playerid, id);
            format(string, sizeof(string), "AdmCmd: %s está de TV no jogador %s.", PlayerName(playerid), PlayerName(id) );
            ABroadCast(COLOR_LIGHTRED, string, lvlaviso);
        }
        return 1;
    }


public DoingTv(playerid, targetid) {
  //
  SetPlayerInteriorEx(playerid, GetPlayerInterior(targetid));
  SetPlayerVirtualWorldEx(playerid, GetPlayerVirtualWorld(targetid));
  inttype[playerid] = inttype[targetid];
  //
  gSpectateType[playerid] = ADMIN_SPEC_TYPE_PLAYER;
  TogglePlayerSpectating(playerid, 1);
  PlayerSpectatePlayer(playerid, targetid);
  gSpectateID[playerid] = targetid;
}

public SetPlayerVirtualWorldEx(playerid, vwid) {
    // set vw
    SetPlayerVirtualWorld(playerid, vwid);
    // update tv
    foreach(new x : Player) {
        if(IsPlayerConnected(x)
            && GetPlayerState(x) == PLAYER_STATE_SPECTATING
            && gSpectateID[x] == playerid
            && gSpectateType[x] == ADMIN_SPEC_TYPE_PLAYER
        )
        {
            DoingTv(x, playerid);
            break;
        }
    }
}
public SetPlayerInteriorEx(playerid, intid) {
    // set interior
    SetPlayerInterior(playerid, intid);
    // reset tv
    foreach(new x : Player) {
        if(IsPlayerConnected(x)
            && GetPlayerState(x) == PLAYER_STATE_SPECTATING
            && gSpectateID[x] == playerid
            && gSpectateType[x] == ADMIN_SPEC_TYPE_PLAYER
        )
        {
            DoingTv(x, playerid);
            break;
        }
    }
}



RE: admin spec em outro player - White_Blue - 11/05/2022

No caso do interior pode ser resolvido na callback OnPlayerInteriorChange colocando o código lá, e creio que quando o player entra em um carro poderia ser resolvido na callback OnPlayerEnterVehicle

https://open.mp/docs/scripting/callbacks/OnPlayerInteriorChange
https://open.mp/docs/scripting/callbacks/OnPlayerEnterVehicle


RE: admin spec em outro player - hiwyn - 11/05/2022

(11/05/2022 11:38)White_Blue Escreveu: No caso do interior pode ser resolvido na callback OnPlayerInteriorChange colocando o código lá, e creio que quando o player entra em um carro poderia ser resolvido na callback OnPlayerEnterVehicle

https://open.mp/docs/scripting/callbacks/OnPlayerInteriorChange
https://open.mp/docs/scripting/callbacks/OnPlayerEnterVehicle

Eu sobreescrevi os setinterior pra
Código:
SetPlayerInteriorEx

com o código que eu mandei acima

mas do jeito que eu fiz não funcionou bem
como eu deveria fazer? e nas callbacks de entrar e sair do veiculo, o que eu deveria mudar?


RE: admin spec em outro player - k2bi_YT - 11/05/2022

Teste isso:
Código PHP:
forward AtualizarTV(playerid);
new 
TimerSpec[MAX_PLAYERS];
new 
SpecVeh[MAX_PLAYERS];
CMD:tv(playeridparams[])
{
    if(
admin[playerid] < 1) return 0;
    new 
idstring[80], lvlaviso;
    
lvlaviso admin[playerid];
    if(
sscanf(params,"u"id) && gSpectateID[playerid] == 65535) return SendClientMessage(playerid, -1"Use: /tv [id]");
    else if(
sscanf(params,"u"id) && gSpectateID[playerid] != 65535)
    {
        
SetPlayerInterior(playerid,0);
        
SetPlayerVirtualWorld(playerid,0);
        
inttype[playerid] = 0;
        
TogglePlayerSpectating(playerid0);
        
KillTimer(TimerSpec[playerid]);
        
gSpectateID[playerid] = INVALID_PLAYER_ID;
        
gSpectateType[playerid] = ADMIN_SPEC_TYPE_NONE;
        
SpecVeh[playerid] = 0;
        
format(stringsizeof(string), "AdmCmd: %s saiu do modo TV."PlayerName(playerid));
        
ABroadCast(COLOR_LIGHTREDstringlvlaviso);
        
SpawnPlayer(playerid);
        return 
1;
    }
    if(
id == playerid) return SendClientMessage(playerid, -1"You can not use this command for yourself!");
    if(!
IsPlayerConnected(id)) return SendClientMessage(playeridCOLOR_GREY"Jogador não conectado");
    if(
id == INVALID_PLAYER_ID) return SendClientMessage(playerid, -1"[ERROR] You have entered an invalid playername/playerid!");
    
format(stringsizeof(string), "AdmCmd: %s está de TV no jogador %s."PlayerName(playerid), PlayerName(id) );
    
ABroadCast(COLOR_LIGHTREDstringlvlaviso);
    
TogglePlayerSpectating(playerid1);
    
PlayerSpectatePlayer(playeridid);
    
gSpectateID[playerid] = id;
    
SpecVeh[playerid] = 0;
    
TimerSpec[playerid] = SetTimerEx("AtualizarTV"1000true"i"playerid);
    return 
1;
}

public 
AtualizarTV(playerid)
{
    if(
gSpectateID[playerid] != INVALID_PLAYER_ID)
    {
        if(
IsPlayerConnected(gSpectateID[playerid]))
        {
            new 
id gSpectateID[playerid];
            if(
GetPlayerInterior(playerid) != GetPlayerInterior(id)) SetPlayerInterior(playeridGetPlayerInterior(id));
            if(
GetPlayerVirtualWorld(playerid) != GetPlayerVirtualWorld(id)) SetPlayerVirtualWorld(playeridGetPlayerVirtualWorld(id));
            if(
IsPlayerInAnyVehicle(id) && SpecVeh[playerid] == 0)
            {
                
SpecVeh[playerid] = 1;
                
PlayerSpectateVehicle(playeridGetPlayerVehicleID(playerid));
                return 
true;
            }
            else if(
SpecVeh[playerid] == 1)
            {
                
SpecVeh[playerid] = 0;
                
PlayerSpectatePlayer(playeridid);
            }
            return 
true;
        }
        
KillTimer(TimerSpec[playerid]);
        
SendClientMessage(playerid, -1"O jogador que você estava assistindo desconectou.");
        
SpecVeh[playerid] = 0;
        
TogglePlayerSpectating(playerid0);
        
SetPlayerInterior(playerid,0);
        
SetPlayerVirtualWorld(playerid,0);
        
inttype[playerid] = 0;
        
gSpectateID[playerid] = INVALID_PLAYER_ID;
        
gSpectateType[playerid] = ADMIN_SPEC_TYPE_NONE;
        
format(stringsizeof(string), "AdmCmd: %s saiu do modo TV."PlayerName(playerid));
        
ABroadCast(COLOR_LIGHTREDstringlvlaviso);
        
SpawnPlayer(playerid);
        return 
true;
    }
    return 
true;




RE: admin spec em outro player - xbruno1000x - 11/05/2022

Essa FS tem textdraws muito bonitos e atende muito bem ao spectate.
https://github.com/Agneese-Saini/SA-MP/blob/master/filterscripts/spectate.pwn


RE: admin spec em outro player - hiwyn - 16/05/2022

Com os códigos que vcs mandaram aqui eu consegui fazer o meu, obrigado +rep