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 = 0; slot < MAX_PLAYER_CAR; ++slot) { for(new i = LastVehicleCreated+1; i < MAX_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 c = slot; player_car_vehicle[playerid][slot] = CreateVehicleEx(modelid, player_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 f = 1; f < MAX_TEAMS; f++) { DestroyDynamicPickup(Org_Pickup[f]); Org_Pickup[f] = CreateDynamicPickup(1239, 1, Org_EntX[f], Org_EntY[f], Org_EntZ[f]);
DestroyDynamicPickup(Org_SafePickup[f]); Org_SafePickup[f] = CreateDynamicPickup(1239, 1, Org_X[f], Org_Y[f], Org_Z[f], Org_W[f]);
if(Org_GarageActived[f] == 1) { new org_str[128]; Org_GaragePickup[f] = CreateDynamicPickup(1239, 1, Org_GarageX[f], Org_GarageY[f], Org_GarageZ[f]); format(org_str, sizeof(org_str), "Garagem"); Org_GarageLabel[f] = Text3D:Create3DTextLabel(org_str, -1, Org_GarageX[f], Org_GarageY[f], Org_GarageZ[f], 30, 0, 1); } else Org_GaragePickup[f] = CreateDynamicPickup(1239, 1, Org_GarageX[f], Org_GarageY[f], Org_GarageZ[f]);
if(f >= 1 && f < MAX_TEAMS) { if(strcmp("Vazio", TeamName(f), true)) { for(new c = 0; c < MAX_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
|