Portal SAMP
[Ajuda] Veículos duplicados - 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] Veículos duplicados (/showthread.php?tid=4523)



Veículos duplicados - L10motos - 09/02/2024

Alguem sabe me informar o que fiz de errado nesse loop?

LastVehicleCreated = seria o ultimo veiculo criaado (ta certo)

Código PHP:
        

forward player_cars_create
(playerid);
public 
player_cars_create(playerid)
{
    for(new slot 0slot MAX_PLAYER_CAR; ++slot)
    {
        for(new LastVehicleCreated+1MAX_VEHICLES; ++i)
        {
            if(player_car_vehicle[playerid][slot] <= LastVehicleCreated || player_car_vehicle[playerid][slot] == player_car_vehicle[playerid][slot])
            {
                player_car_vehicle[playerid][slot] = i//aqui atualiza o id do veiculo
    
    }
        }
        if(!IsValidVehicle(player_car_vehicle[playerid][slot]))
    
    {
    
        new modelid player_car_model[playerid][slot];
            if(
400 <= modelid <= 611)
            {
    
            new slot;
        
        player_car_vehicle[playerid][slot] = CreateVehicleEx(modelidplayer_car_pos[playerid][c][0], player_car_pos[playerid][c][1], player_car_pos[playerid][c][2], player_car_pos[playerid][c][3], player_car_color1[playerid][c], player_car_color2[playerid][c], -1);



#undef MAX_VEHICLES
#define MAX_VEHICLES 1700 

@edit

LastVehicleCreated = é definido como o ultimo veiculo criado no servidor, apartir dai é os veiculos proprios...

Alguem sabe me informar como eu faço para parar de duplicar os veiculos toda vez que player_cars_create é executado?


RE: Veículos duplicados - L10motos - 09/02/2024

Tentei criar um script mais não tah funcionando

Código PHP:
                 if(VehicleOwnedCreated[i] == 0)
    
             player_car_vehicle[playerid][slot] = i;
    
             
                 VehicleOwnedCreated
[i] = 1

Parece que é pior e causa bugs


RE: Veículos duplicados - White_Blue - 09/02/2024

Esse trecho de código está incompleto e não faz nenhum sentido.

A variável "LastVehicleCreated" não está sendo definida no escopo do trecho de código que você compartilhou.


RE: Veículos duplicados - L10motos - 09/02/2024

Eu não sei se é uma gambiarra, mais funcionou, os veículos das orgs estavam saindo como veículo de inventario do jogador, veiculo proprio, LastVehicleCreated é definida na hora que liga o gamemode, por que é definida? para os veiculos das orgs não serem definidos como veiculo proprio de inventario.

Código PHP:
public OnGameModeInit()
{
   for(new 
1MAX_TEAMSf++)
    {
         
DestroyDynamicPickup(Org_Pickup[f]);
    
    Org_Pickup[f] = CreateDynamicPickup(12391Org_EntX[f], Org_EntY[f], Org_EntZ[f]);

        
DestroyDynamicPickup(Org_SafePickup[f]);
        
Org_SafePickup[f] = CreateDynamicPickup(12391Org_X[f], Org_Y[f], Org_Z[f], Org_W[f]);

        if(Org_GarageActived[f] == 1)
        {
            new org_str[128];
            Org_GaragePickup[f] = CreateDynamicPickup(12391Org_GarageX[f], Org_GarageY[f], Org_GarageZ[f]);
            format(org_strsizeof(org_str), "Garagem");
    
        Org_GarageLabel[f] = Text3D:Create3DTextLabel(org_str, -1Org_GarageX[f], Org_GarageY[f], Org_GarageZ[f], 3001);
        }
        else 
Org_GaragePickup[f] = CreateDynamicPickup(12391Org_GarageX[f], Org_GarageY[f], Org_GarageZ[f]);

    
    if(>= && MAX_TEAMS)
    
    {
    
        if(strcmp("Vazio"TeamName(f), true))
        
    {
        
           for(new 0MAX_ORG_CARS; ++c)
    
               {
    
                   if(400 <= ORG_vMODEL[f][c] <= 611)
    
                   {
    
                    ORG_VEHICLE[f][c] = CreateVehicleEx(ORG_vMODEL[f][c], ORG_VEHICLE_PX[f][c], ORG_VEHICLE_PY[f][c], ORG_VEHICLE_PZ[f][c], ORG_VEHICLE_PA[f][c], ORG_VEHICLE_C1[f][c], ORG_VEHICLE_C2[f][c], -1);
    
                    SetVehicleVirtualWorld(ORG_VEHICLE[f][c], ORG_VEHICLE_WORLD[f][c]);
    
                    LinkVehicleToInterior(ORG_VEHICLE[f][c], ORG_VEHICLE_INTERIOR[f][c]);
    
                    
                        LastVehicleCreated 
ORG_VEHICLE[f][c]; //aqui é definido a variavel 
                    
}
    
            }
            }
        }
    } 

Por que +1 na variavel LastVehicleCreated?

LastVehicleCreated+1

Por que o ID do ultimo veiculo de org criado é armazenado em LastVehicleCreated, adiciona +1 para que o proximo ID não ocupavel seja usado em player_car_vehicle,

Por que <= LastVehicleCreated?

Veiculos antes ou igual ao ID de veiculo de org ae se tiver algum veiculo (player_car_vehicle) que é veiculo proprio, com o ID definido igual LastVehicleCreated, é por que esta invalido o ID, funciona, senta o ID não ocupavel em player_car_vehicle.

O que eu preciso? Eu preciso descobrir um modo de que não faça com que os veiculos não se multipliquem, por que player_car_vehicle é veiculo proprio, se ele já existe não precisa ser criado novamente.


RE: Veículos duplicados - L10motos - 10/02/2024

Caralho, a board tah muito fraca estou ficando com raiva

https://imgur.com/a/48fyF6E

https://imgur.com/a/wztAcIC


RE: Veículos duplicados - Vel - 10/02/2024

Você está fazendo uma gambiarra sem lógica, por que não simplesmente atribuir o ID da organização ao veículo e ao jogador e verificar se ambos são iguais? O mesmo vale para veículos próprios, basta atribuir o ID/Nome do jogador ao veículo e verificar se ambos são iguais.

Código:
VehicleOrgID[ORG_VEHICLE[f][c]] = f;

Código:
public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger) {
  if (!ispassenger) {
    new orgid = VehicleOrgID[vehicleid];

    if (orgid != INVALID_ORG_ID) {
      if (PlayerOrgID[playerid] != orgid) {
        ClearAnimations(playerid);
      }
    } else {
      static vehicleOwnerName[MAX_PLAYER_NAME];

      format(vehicleOwnerName, MAX_PLAYER_NAME, VehicleOwnerName[vehicleid]);

      if (!IsNull(vehicleOwnerName)) {
        static name[MAX_PLAYER_NAME];

        GetPlayerName(playerid, name, MAX_PLAYER_NAME);

        if (strcmp(vehicleOwnerName, name)) {
          ClearAnimations(playerid);
        }
      }
    }
  }
}

public OnPlayerStateChange(playerid, newstate, oldstate) {
  new vehicleid = GetPlayerVehicleID(playerid);

  if (newstate == PLAYER_STATE_DRIVER) {
    new orgid = VehicleOrgID[vehicleid];

    if (orgid != INVALID_ORG_ID) {
      if (PlayerOrgID[playerid] != orgid) {
        RemovePlayerFromVehicle(playerid);
      }
    } else {
      static vehicleOwnerName[MAX_PLAYER_NAME];

      format(vehicleOwnerName, MAX_PLAYER_NAME, VehicleOwnerName[vehicleid]);

      if (!IsNull(vehicleOwnerName)) {
        static name[MAX_PLAYER_NAME];

        GetPlayerName(playerid, name, MAX_PLAYER_NAME);

        if (strcmp(vehicleOwnerName, name)) {
          RemovePlayerFromVehicle(playerid);
        }
      }
    }
  }
}

Carregue primeiro os dados de veículos de organização e depois os de veículos próprios.


RE: Veículos duplicados - L10motos - 11/02/2024

(10/02/2024 16:49)Vel Escreveu: Você está fazendo uma gambiarra sem lógica, por que não simplesmente atribuir o ID da organização ao veículo e ao jogador e verificar se ambos são iguais? O mesmo vale para veículos próprios, basta atribuir o ID/Nome do jogador ao veículo e verificar se ambos são iguais.

Código:
VehicleOrgID[ORG_VEHICLE[f][c]] = f;

Código:
public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger) {
  if (!ispassenger) {
    new orgid = VehicleOrgID[vehicleid];

    if (orgid != INVALID_ORG_ID) {
      if (PlayerOrgID[playerid] != orgid) {
        ClearAnimations(playerid);
      }
    } else {
      static vehicleOwnerName[MAX_PLAYER_NAME];

      format(vehicleOwnerName, MAX_PLAYER_NAME, VehicleOwnerName[vehicleid]);

      if (!IsNull(vehicleOwnerName)) {
        static name[MAX_PLAYER_NAME];

        GetPlayerName(playerid, name, MAX_PLAYER_NAME);

        if (strcmp(vehicleOwnerName, name)) {
          ClearAnimations(playerid);
        }
      }
    }
  }
}

public OnPlayerStateChange(playerid, newstate, oldstate) {
  new vehicleid = GetPlayerVehicleID(playerid);

  if (newstate == PLAYER_STATE_DRIVER) {
    new orgid = VehicleOrgID[vehicleid];

    if (orgid != INVALID_ORG_ID) {
      if (PlayerOrgID[playerid] != orgid) {
        RemovePlayerFromVehicle(playerid);
      }
    } else {
      static vehicleOwnerName[MAX_PLAYER_NAME];

      format(vehicleOwnerName, MAX_PLAYER_NAME, VehicleOwnerName[vehicleid]);

      if (!IsNull(vehicleOwnerName)) {
        static name[MAX_PLAYER_NAME];

        GetPlayerName(playerid, name, MAX_PLAYER_NAME);

        if (strcmp(vehicleOwnerName, name)) {
          RemovePlayerFromVehicle(playerid);
        }
      }
    }
  }
}

Carregue primeiro os dados de veículos de organização e depois os de veículos próprios.

Tem um outo exemplo por favor?


RE: Veículos duplicados - xbruno1000x - 12/02/2024

Citar:Por que <= LastVehicleCreated?

Veiculos antes ou igual ao ID de veiculo de org ae se tiver algum veiculo (player_car_vehicle) que é veiculo proprio, com o ID definido igual LastVehicleCreated, é por que esta invalido o ID, funciona, senta o ID não ocupavel em player_car_vehicle.

GetVehiclePoolSize não te serve?
Essa função pega o ID mais alto criado, e o servidor cria na ordem quando é ligado, então ele estaria pegando o último id.

Documentação:
https://www.open.mp/pt-BR/docs/scripting/functions/GetVehiclePoolSize