Portal SAMP
[Ajuda] Deletar veiculos (deletando veiculos do spawn) - 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] Deletar veiculos (deletando veiculos do spawn) (/showthread.php?tid=1380)

Páginas: 1 2


Deletar veiculos (deletando veiculos do spawn) - fear - 11/07/2021

boa noite.

a função esta deletando não apenas veiculos desocupados mas tb os veiculos do spawn. só queria que deletasse os veiculos criados do /car

Código PHP:
forward DeletarVeiculos();
public 
DeletarVeiculos()
{
   new 
bool:vehicle[MAX_VEHICLES];
   for(new 
1GetVehicleModel(j); ++j)
   {
       
vehicle[j] = false;
       for(new 
iGetMaxPlayers(); p; ++i)
       {
           if(!
IsPlayerInAnyVehicle(i) || !IsPlayerConnected(i)) continue;
           if(
IsPlayerInVehicle(ij))
           {
               
vehicle[j] = true;
               break;
           }
       }
       if(!
vehicle[j]) DestroyVehicle(j);
   }
   
tMensagem(Cinza"{32CD32}» {F8F8FF}Veículos deletados{A9A9A9}.");
   return 
1;




RE: Deletar veiculos (deletando veiculos do spawn) - ipsLuan - 11/07/2021

Esse loop aí está totalmente errado.

Qual variável que você usa para identificar se um veículo foi criado pelo comando?

O certo é você percorrer o loop com MAX_VEHICLES e fazer a verificação se o ID do veículo foi criado pelo comando.


RE: Deletar veiculos (deletando veiculos do spawn) - fear - 11/07/2021

(11/07/2021 22:14)ipsLuan Escreveu: Esse loop aí está totalmente errado.

Qual variável que você usa para identificar se um veículo foi criado pelo comando?

O certo é você percorrer o loop com MAX_VEHICLES e fazer a verificação se o ID do veículo foi criado pelo comando.

Código PHP:
CMD:car(playeridparams[])
{
    if(
pAusente[playerid] == true) return pMensagem(playeridVermelho"-ERRO- Você está ausente.");
    if(
pPreso[playerid] == true) return pMensagem(playeridVermelho"-ERRO- Você está preso.");
    if(
EmArenaDM[playerid] == true) return pMensagem(playeridVermelho"-ERRO- Você não pode usar este comando em uma arena.");
    if(
pEvento[playerid] == true) return pMensagem(playeridVermelho"-ERRO- Você está no evento.");
    new 
vID[15], CorCor2;
    if(
sscanf(params"s[15]ii"vIDCorCor2)) return pMensagem(playeridLaranja"[INFO] Use: /Car [Nome] [Corid] [Corid]");
     new 
bool:existeVeiculoID;
    for(new 
0;212r++)
    {
        if(!
strcmp(vIDsCars[r],true))
         {
              
existe true;
        }
        if(!
strcmp(vIDsCars[r],true)) VeiculoID = (r+400);
       }
       if(!
existe) return pMensagem(playeridVermelho"[ERRO] Veículo não existe.");
       if(
pDMLiberado[playerid] == false && sCAdmin[playerid] < 5)
       {
        if(
VeiculoID == 520 || VeiculoID == 432 || VeiculoID == 592 || VeiculoID == 425 ||
        
VeiculoID == 464 || VeiculoID == 406 || VeiculoID == 476 || VeiculoID == 447) return pMensagem(playerid, -1"[INFO] Este veículo não é permitido neste mundo.");
    }
    
GetPlayerPos(playeridXYZ);
    
GetPlayerFacingAngle(playeridAngle);
     
CriarVeiculo(playeridVeiculoIDXYZ+1AngleCorCor20);
    return 
1;




RE: Deletar veiculos (deletando veiculos do spawn) - k2bi_YT - 12/07/2021

(11/07/2021 22:46)fear Escreveu:
(11/07/2021 22:14)ipsLuan Escreveu: Esse loop aí está totalmente errado.

Qual variável que você usa para identificar se um veículo foi criado pelo comando?

O certo é você percorrer o loop com MAX_VEHICLES e fazer a verificação se o ID do veículo foi criado pelo comando.

Código PHP:
CMD:car(playeridparams[])
{
    if(pAusente[playerid] == true) return pMensagem(playeridVermelho"-ERRO- Você está ausente.");
    if(
pPreso[playerid] == true) return pMensagem(playeridVermelho"-ERRO- Você está preso.");
    if(EmArenaDM[playerid] == true) return pMensagem(playeridVermelho"-ERRO- Você não pode usar este comando em uma arena.");
    if(pEvento[playerid] == true) return pMensagem(playeridVermelho"-ERRO- Você está no evento.");
    new 
vID[15], CorCor2;
    if(
sscanf(params"s[15]ii"vIDCorCor2)) return pMensagem(playeridLaranja"[INFO] Use: /Car [Nome] [Corid] [Corid]");
     new 
bool:existeVeiculoID;
    for(new 0;212r++)
    {
        if(!strcmp(vIDsCars[r],true))
         {
              existe true;
        }
        if(!strcmp(vIDsCars[r],true)) VeiculoID = (r+400);
       }
       if(!existe) return pMensagem(playeridVermelho"[ERRO] Veículo não existe.");
       if(pDMLiberado[playerid] == false && sCAdmin[playerid] < 5)
       {
        if(
VeiculoID == 520 || VeiculoID == 432 || VeiculoID == 592 || VeiculoID == 425 ||
        
VeiculoID == 464 || VeiculoID == 406 || VeiculoID == 476 || VeiculoID == 447) return pMensagem(playerid, -1"[INFO] Este veículo não é permitido neste mundo.");
    }
    
GetPlayerPos(playeridXYZ);
    
GetPlayerFacingAngle(playeridAngle);
     
CriarVeiculo(playeridVeiculoIDXYZ+1AngleCorCor20);
    return 
1;


Você deve criar uma variavel global para definir qual veiculo será criado por CMD, nesse meio você deve ver qual vai ser o melhor para o seu sistema, assim sendo criado veiculo salvando na variavel o jogador ou salvando o ID (ID MESMO E NÃO O MODELO_ID) do veiculo

Exemplo:
Código PHP:
new VeiculoPorCMD[MAX_VEHICLES];
VeiculoPorCMD[vehicleid//playerid] = CriarVeiculo(....); 



RE: Deletar veiculos (deletando veiculos do spawn) - xbruno1000x - 12/07/2021

Código:
stock CriarVeiculo(playerid, modelid, Float:posX, Float:posY, Float:posZ, Float:angle, Colour1, Colour2, respawn_delay)
{
    new world = GetPlayerVirtualWorld(playerid);
    new interior = GetPlayerInterior(playerid);
    if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
    {
        DestroyVehicle(GetPlayerVehicleID(playerid));
        GetPlayerPos(playerid, posX, posY, posZ);
        GetPlayerFacingAngle(playerid, angle);
        SDSCar[playerid] = CreateVehicle(modelid, posX, posY, posZ, angle, Colour1, Colour2, respawn_delay);
        LinkVehicleToInterior(SDSCar[playerid], interior);
        SetVehicleVirtualWorld(SDSCar[playerid], world);
        SetVehicleZAngle(SDSCar[playerid], angle);
        PutPlayerInVehicle(playerid, SDSCar[playerid], 0);
        SetPlayerInterior(playerid, interior);
    }
    if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT)
    {
        if(VeiculoOcupado(SDSCar[playerid])) {} else DestroyVehicle(SDSCar[playerid]);
        GetPlayerPos(playerid, posX, posY, posZ);
        GetPlayerFacingAngle(playerid, angle);
        SDSCar[playerid] = CreateVehicle(modelid, posX, posY, posZ, angle, Colour1, Colour2, respawn_delay);
        LinkVehicleToInterior(SDSCar[playerid], interior);
        SetVehicleVirtualWorld(SDSCar[playerid], world);
        SetVehicleZAngle(SDSCar[playerid], angle);
        PutPlayerInVehicle(playerid, SDSCar[playerid], 0);
        SetPlayerInterior(playerid, interior);
    }
    return 1;
}

Acredito que a stock seja essa, sendo assim o ID é SDSCar[playerid]. Caso não seja a mesma stock, basta procurar por ela e encontrar como está o ID no seu. Depois basta fazer o que os amigos acima recomendaram.


RE: Deletar veiculos (deletando veiculos do spawn) - fear - 12/07/2021

(12/07/2021 00:32)xbruno1000x Escreveu:
Código:
stock CriarVeiculo(playerid, modelid, Float:posX, Float:posY, Float:posZ, Float:angle, Colour1, Colour2, respawn_delay)
{
    new world = GetPlayerVirtualWorld(playerid);
    new interior = GetPlayerInterior(playerid);
    if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
    {
        DestroyVehicle(GetPlayerVehicleID(playerid));
        GetPlayerPos(playerid, posX, posY, posZ);
        GetPlayerFacingAngle(playerid, angle);
        SDSCar[playerid] = CreateVehicle(modelid, posX, posY, posZ, angle, Colour1, Colour2, respawn_delay);
        LinkVehicleToInterior(SDSCar[playerid], interior);
        SetVehicleVirtualWorld(SDSCar[playerid], world);
        SetVehicleZAngle(SDSCar[playerid], angle);
        PutPlayerInVehicle(playerid, SDSCar[playerid], 0);
        SetPlayerInterior(playerid, interior);
    }
    if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT)
    {
        if(VeiculoOcupado(SDSCar[playerid])) {} else DestroyVehicle(SDSCar[playerid]);
        GetPlayerPos(playerid, posX, posY, posZ);
        GetPlayerFacingAngle(playerid, angle);
        SDSCar[playerid] = CreateVehicle(modelid, posX, posY, posZ, angle, Colour1, Colour2, respawn_delay);
        LinkVehicleToInterior(SDSCar[playerid], interior);
        SetVehicleVirtualWorld(SDSCar[playerid], world);
        SetVehicleZAngle(SDSCar[playerid], angle);
        PutPlayerInVehicle(playerid, SDSCar[playerid], 0);
        SetPlayerInterior(playerid, interior);
    }
    return 1;
}

Acredito que a stock seja essa, sendo assim o ID é SDSCar[playerid]. Caso não seja a mesma stock, basta procurar por ela e encontrar como está o ID no seu. Depois basta fazer o que os amigos acima recomendaram.

Eu tentei fazer assim:

Código PHP:
stock IsVehicleOccupied(vehicleid)
{
    for(new 
0MAX_PLAYERSi++)
    if(
IsPlayerInVehicle(ivehicleid) && GetPlayerState(i) == PLAYER_STATE_DRIVER)
    return 
1;
    return 
0;

Código PHP:
CMD:dlc(playerid)
{
    for(new 
vv<MAX_VEHICLESv++) if(!IsVehicleOccupied(v)) DestroyVehicle(v);
    return 
1;


só que da isso...
Código PHP:
error 021symbol already defined"IsVehicleOccupied" 

A Maneira que você falaram acima não consegui entender.

a variavel do car é: sCar[playerid]

se puderem ajudar..


RE: Deletar veiculos (deletando veiculos do spawn) - xbruno1000x - 12/07/2021

(12/07/2021 05:53)fear Escreveu:
(12/07/2021 00:32)xbruno1000x Escreveu:
Código:
stock CriarVeiculo(playerid, modelid, Float:posX, Float:posY, Float:posZ, Float:angle, Colour1, Colour2, respawn_delay)
{
    new world = GetPlayerVirtualWorld(playerid);
    new interior = GetPlayerInterior(playerid);
    if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
    {
        DestroyVehicle(GetPlayerVehicleID(playerid));
        GetPlayerPos(playerid, posX, posY, posZ);
        GetPlayerFacingAngle(playerid, angle);
        SDSCar[playerid] = CreateVehicle(modelid, posX, posY, posZ, angle, Colour1, Colour2, respawn_delay);
        LinkVehicleToInterior(SDSCar[playerid], interior);
        SetVehicleVirtualWorld(SDSCar[playerid], world);
        SetVehicleZAngle(SDSCar[playerid], angle);
        PutPlayerInVehicle(playerid, SDSCar[playerid], 0);
        SetPlayerInterior(playerid, interior);
    }
    if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT)
    {
        if(VeiculoOcupado(SDSCar[playerid])) {} else DestroyVehicle(SDSCar[playerid]);
        GetPlayerPos(playerid, posX, posY, posZ);
        GetPlayerFacingAngle(playerid, angle);
        SDSCar[playerid] = CreateVehicle(modelid, posX, posY, posZ, angle, Colour1, Colour2, respawn_delay);
        LinkVehicleToInterior(SDSCar[playerid], interior);
        SetVehicleVirtualWorld(SDSCar[playerid], world);
        SetVehicleZAngle(SDSCar[playerid], angle);
        PutPlayerInVehicle(playerid, SDSCar[playerid], 0);
        SetPlayerInterior(playerid, interior);
    }
    return 1;
}

Acredito que a stock seja essa, sendo assim o ID é SDSCar[playerid]. Caso não seja a mesma stock, basta procurar por ela e encontrar como está o ID no seu. Depois basta fazer o que os amigos acima recomendaram.

Eu tentei fazer assim:

Código PHP:
stock IsVehicleOccupied(vehicleid)
{
    for(new 
0MAX_PLAYERSi++)
    if(
IsPlayerInVehicle(ivehicleid) && GetPlayerState(i) == PLAYER_STATE_DRIVER)
    return 
1;
    return 
0;

Código PHP:
CMD:dlc(playerid)
{
    for(new 
vv<MAX_VEHICLESv++) if(!IsVehicleOccupied(v)) DestroyVehicle(v);
    return 
1;


só que da isso...
Código PHP:
error 021symbol already defined"IsVehicleOccupied" 

A Maneira que você falaram acima não consegui entender.

a variavel do car é: sCar[playerid]

se puderem ajudar..

1° ponto:
Você colocou duas vezes a função IsVehicleOccupied no gamemode e por isso ocorreu um erro.
2° ponto:
Isso não resolveria seu problema, pois deletaria todos veículos que não estão ocupados. Isso deve ser feito utilizando a variável sCar, é a única maneira de deletar apenas veículos criados por comando.

Por fim, tente assim:
Código:
for(new i; i != MAX_PLAYERS; i++) DestroyVehicle(sCar[i]);



RE: Deletar veiculos (deletando veiculos do spawn) - fear - 12/07/2021

(12/07/2021 10:51)xbruno1000x Escreveu:
(12/07/2021 05:53)fear Escreveu:
(12/07/2021 00:32)xbruno1000x Escreveu:
Código:
stock CriarVeiculo(playerid, modelid, Float:posX, Float:posY, Float:posZ, Float:angle, Colour1, Colour2, respawn_delay)
{
    new world = GetPlayerVirtualWorld(playerid);
    new interior = GetPlayerInterior(playerid);
    if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
    {
        DestroyVehicle(GetPlayerVehicleID(playerid));
        GetPlayerPos(playerid, posX, posY, posZ);
        GetPlayerFacingAngle(playerid, angle);
        SDSCar[playerid] = CreateVehicle(modelid, posX, posY, posZ, angle, Colour1, Colour2, respawn_delay);
        LinkVehicleToInterior(SDSCar[playerid], interior);
        SetVehicleVirtualWorld(SDSCar[playerid], world);
        SetVehicleZAngle(SDSCar[playerid], angle);
        PutPlayerInVehicle(playerid, SDSCar[playerid], 0);
        SetPlayerInterior(playerid, interior);
    }
    if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT)
    {
        if(VeiculoOcupado(SDSCar[playerid])) {} else DestroyVehicle(SDSCar[playerid]);
        GetPlayerPos(playerid, posX, posY, posZ);
        GetPlayerFacingAngle(playerid, angle);
        SDSCar[playerid] = CreateVehicle(modelid, posX, posY, posZ, angle, Colour1, Colour2, respawn_delay);
        LinkVehicleToInterior(SDSCar[playerid], interior);
        SetVehicleVirtualWorld(SDSCar[playerid], world);
        SetVehicleZAngle(SDSCar[playerid], angle);
        PutPlayerInVehicle(playerid, SDSCar[playerid], 0);
        SetPlayerInterior(playerid, interior);
    }
    return 1;
}

Acredito que a stock seja essa, sendo assim o ID é SDSCar[playerid]. Caso não seja a mesma stock, basta procurar por ela e encontrar como está o ID no seu. Depois basta fazer o que os amigos acima recomendaram.

Eu tentei fazer assim:

Código PHP:
stock IsVehicleOccupied(vehicleid)
{
    for(new 
0MAX_PLAYERSi++)
    if(
IsPlayerInVehicle(ivehicleid) && GetPlayerState(i) == PLAYER_STATE_DRIVER)
    return 
1;
    return 
0;

Código PHP:
CMD:dlc(playerid)
{
    for(new 
vv<MAX_VEHICLESv++) if(!IsVehicleOccupied(v)) DestroyVehicle(v);
    return 
1;


só que da isso...
Código PHP:
error 021symbol already defined"IsVehicleOccupied" 

A Maneira que você falaram acima não consegui entender.

a variavel do car é: sCar[playerid]

se puderem ajudar..

1° ponto:
Você colocou duas vezes a função IsVehicleOccupied no gamemode e por isso ocorreu um erro.
2° ponto:
Isso não resolveria seu problema, pois deletaria todos veículos que não estão ocupados. Isso deve ser feito utilizando a variável sCar, é a única maneira de deletar apenas veículos criados por comando.

Por fim, tente assim:
Código:
for(new i; i != MAX_PLAYERS; i++) DestroyVehicle(sCar[i]);

Vai deletar os abandonados? Ou vai deletar todos independente se tem ocupante ou não?


RE: Deletar veiculos (deletando veiculos do spawn) - fear - 12/07/2021

(12/07/2021 10:51)xbruno1000x Escreveu:
(12/07/2021 05:53)fear Escreveu:
(12/07/2021 00:32)xbruno1000x Escreveu:
Código:
stock CriarVeiculo(playerid, modelid, Float:posX, Float:posY, Float:posZ, Float:angle, Colour1, Colour2, respawn_delay)
{
    new world = GetPlayerVirtualWorld(playerid);
    new interior = GetPlayerInterior(playerid);
    if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
    {
        DestroyVehicle(GetPlayerVehicleID(playerid));
        GetPlayerPos(playerid, posX, posY, posZ);
        GetPlayerFacingAngle(playerid, angle);
        SDSCar[playerid] = CreateVehicle(modelid, posX, posY, posZ, angle, Colour1, Colour2, respawn_delay);
        LinkVehicleToInterior(SDSCar[playerid], interior);
        SetVehicleVirtualWorld(SDSCar[playerid], world);
        SetVehicleZAngle(SDSCar[playerid], angle);
        PutPlayerInVehicle(playerid, SDSCar[playerid], 0);
        SetPlayerInterior(playerid, interior);
    }
    if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT)
    {
        if(VeiculoOcupado(SDSCar[playerid])) {} else DestroyVehicle(SDSCar[playerid]);
        GetPlayerPos(playerid, posX, posY, posZ);
        GetPlayerFacingAngle(playerid, angle);
        SDSCar[playerid] = CreateVehicle(modelid, posX, posY, posZ, angle, Colour1, Colour2, respawn_delay);
        LinkVehicleToInterior(SDSCar[playerid], interior);
        SetVehicleVirtualWorld(SDSCar[playerid], world);
        SetVehicleZAngle(SDSCar[playerid], angle);
        PutPlayerInVehicle(playerid, SDSCar[playerid], 0);
        SetPlayerInterior(playerid, interior);
    }
    return 1;
}

Acredito que a stock seja essa, sendo assim o ID é SDSCar[playerid]. Caso não seja a mesma stock, basta procurar por ela e encontrar como está o ID no seu. Depois basta fazer o que os amigos acima recomendaram.

Eu tentei fazer assim:

Código PHP:
stock IsVehicleOccupied(vehicleid)
{
    for(new 
0MAX_PLAYERSi++)
    if(
IsPlayerInVehicle(ivehicleid) && GetPlayerState(i) == PLAYER_STATE_DRIVER)
    return 
1;
    return 
0;

Código PHP:
CMD:dlc(playerid)
{
    for(new 
vv<MAX_VEHICLESv++) if(!IsVehicleOccupied(v)) DestroyVehicle(v);
    return 
1;


só que da isso...
Código PHP:
error 021symbol already defined"IsVehicleOccupied" 

A Maneira que você falaram acima não consegui entender.

a variavel do car é: sCar[playerid]

se puderem ajudar..

1° ponto:
Você colocou duas vezes a função IsVehicleOccupied no gamemode e por isso ocorreu um erro.
2° ponto:
Isso não resolveria seu problema, pois deletaria todos veículos que não estão ocupados. Isso deve ser feito utilizando a variável sCar, é a única maneira de deletar apenas veículos criados por comando.

Por fim, tente assim:
Código:
for(new i; i != MAX_PLAYERS; i++) DestroyVehicle(sCar[i]);

Funcionou. porem eu queria que deletasse somente os abandonados.. ele ta deletando mesmo os que tem player dentro.


RE: Deletar veiculos (deletando veiculos do spawn) - xbruno1000x - 12/07/2021

Código:
for(new i; i != MAX_PLAYERS; i++)
{
    if(!IsPlayerInVehicle(i, sCar[i]))
    {
        DestroyVehicle(sCar[i]);
    }
}