Loop MAX_PLAYERS dentro de OnGameModeInit - L10motos - 22/10/2023
como eu faço para carregar todos os veículos que estão em player-vehicles mesmo o jogador não estando online no servidor, por que do jeito que está o jogador precisa estar online no servidor ao ligar o servidor para caregar os veiculos dele, quero que carrega todos os veiculos mesmo o jogador estando offline.
Código PHP: public OnGameModeInit() { for(new i = 0; i < MAX_PLAYERS; ++i) { new file[70], key[128], string[256]; format(file, sizeof(file), "player-vehicles/%s-vehicles.ini", Name(i)); if(fexist(file)) { for(new slot = 0; slot < MAX_PLAYER_VEH; ++slot) { FORMAT_STR "%02d-player_car_model", slot); player_car_model[i][slot] = DOF2_Int(file, string); FORMAT_STR "%02d-player_car_pos_x", slot); player_car_pos[i][slot][0] = DOF2_Float(file, string); FORMAT_STR "%02d-player_car_pos_y", slot); player_car_pos[i][slot][1] = DOF2_Float(file, string); FORMAT_STR "%02d-player_car_pos_z", slot); player_car_pos[i][slot][2] = DOF2_Float(file, string); FORMAT_STR "%02d-player_car_pos_a", slot); player_car_pos[i][slot][3] = DOF2_Float(file, string); FORMAT_STR "%02d-player_car_color1", slot); player_car_color1[i][slot] = DOF2_Int(file, string); FORMAT_STR "%02d-player_car_color2", slot); player_car_color2[i][slot] = DOF2_Int(file, string); FORMAT_STR "%02d-player_car_interior", slot); player_car_interior[i][slot] = DOF2_Int(file, string); FORMAT_STR "%02d-player_car_world", slot); player_car_world[i][slot] = DOF2_Int(file, string); FORMAT_STR "%02d-player_car_forsale", slot); player_car_forsale[i][slot] = DOF2_Int(file, string); FORMAT_STR "%02d-player_car_health", slot); player_car_health[i][slot] = DOF2_Float(file, string); if(player_car_vehicle[i][slot] == 0) { new modelid = player_car_model[i][slot]; if(400 <= modelid <= 611) { player_car_vehicle[i][slot] = CreateVehicleEx(player_car_model[i][slot], player_car_pos[i][slot][0], player_car_pos[i][slot][1], player_car_pos[i][slot][2], player_car_pos[i][slot][3], player_car_color1[i][slot], player_car_color2[i][slot], -1);
new carid = player_car_vehicle[i][slot]; car_player_owned[carid] = slot; format(car_player_owner[carid], MAX_PLAYER_NAME, "%s", Name(i));
LinkVehicleToInterior(carid, player_car_interior[i][slot]); SetVehicleVirtualWorld(carid, player_car_world[i][slot]); if(player_car_health[playerid][slot] < 299) player_car_health[playerid][slot] = 299; SetVehicleHealth(carid, player_car_health[playerid][slot]); Alarme[carid] = 1; AlarmTriggered[carid] = 0; LockVehicle(carid); if(player_car_forsale[i][slot] > 0) { SetTimerEx("CreateForSaleText", 2000, false, "i", carid); Alarme[carid] = 0; } else RemoveForSaleText(carid); SetGVarInt("Gasolina", carid, 100);
LoadingTuning(carid); SetVehicleToRespawn(carid); } } } } } }
RE: Loop MAX_PLAYERS dentro de OnGameModeInit - leonardos08bt - 22/10/2023
Cara, isso requer um sistema de ID FIXO para o player e um salvamento em MYSQL pelo menos para os veículos.
Caso queira um código do que citei acima é só dizer.
(Cara, isso não seria nada legal pro seu servidor independentemente do modo de jogo. Carregar todos os veículos mesmo o jogador estando offline é uma tarefa complicada além de travar seu servidor com os veículos)
Uma sugestão: Em Vez de carregar os veículos com os players offline, deixa carregando com o jogador online, e cria um sistema para deixar o veículo lá sem ser deletado quando o jogador se desconecta. (Salva o dono no ID FIXO ou no NICKNAME, posso detalhar mais se quiser).
RE: Loop MAX_PLAYERS dentro de OnGameModeInit - L10motos - 22/10/2023
Do jeito que está quando eu entro no servidor cria um veiculo, depois cria mais outro e se eu entrar 5 vezes cria 5 veiculo do mesmo modelo....
Codigo inteiro
Código PHP: #define PLAYER_CAR_DESTROY_TIME 7200000 new car_player_destroytimer[MAX_VEHICLES]; new car_player_owned[MAX_VEHICLES]; new car_player_owner[MAX_VEHICLES][MAX_PLAYER_NAME];
forward OnPlayerLogin(playerid, password[]); public OnPlayerLogin(playerid, password[]) { player_cars_create(playerid); }
public OnPlayerDisconnect(playerid, reason) { player_cars_destroy(playerid); }
forward player_cars_create(playerid); public player_cars_create(playerid) { for(new slot = 0; slot < MAX_PLAYER_VEH; ++slot) { player_car_vehicle[playerid][slot] = 0; for(new carid = sizeof(CarInfo); carid < MAX_VEHICLES; ++carid) { if(!strcmp("AhjffgUio", car_player_owner[carid], false)) format(car_player_owner[carid], MAX_PLAYER_NAME, "nenhum"); if(car_player_owned[carid] == slot && !strcmp(Name(playerid), car_player_owner[carid], false)) { new modelid = player_car_model[playerid][slot]; if(400 <= modelid <= 611) { if(car_player_destroytimer[carid] != -1) { KillTimer(car_player_destroytimer[carid]); car_player_destroytimer[carid] = -1; } player_car_vehicle[playerid][slot] = carid; } else { DestroyVehicle(carid); player_car_vehicle[playerid][slot] = 0; KillTimer(car_player_destroytimer[carid]); car_player_destroytimer[carid] = -1; format(car_player_owner[carid], MAX_PLAYER_NAME, "nenhum"); car_player_owned[carid] = -1; } } } if(player_car_vehicle[playerid][slot] == 0) { 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);
new carid = player_car_vehicle[playerid][c]; car_player_owned[carid] = slot; format(car_player_owner[carid], MAX_PLAYER_NAME, "%s", Name(playerid)); if(car_player_destroytimer[carid] != -1) { KillTimer(car_player_destroytimer[carid]); car_player_destroytimer[carid] = -1; } // anti bug
LinkVehicleToInterior(carid, player_car_interior[playerid][slot]); SetVehicleVirtualWorld(carid, player_car_world[playerid][slot]); if(player_car_health[playerid][c] < 299) player_car_health[playerid][c] = 299; SetVehicleHealth(carid, player_car_health[playerid][c]); Alarme[carid] = 1; AlarmTriggered[carid] = 0; LockVehicle(carid); if(player_car_forsale[playerid][c] > 0) { SetTimerEx("CreateForSaleText", 2000, false, "i", carid); Alarme[carid] = 0; } else RemoveForSaleText(carid); SetGVarInt("Gasolina", carid, 100);
LoadingTuning(carid); SetVehicleToRespawn(carid); } } } return 1; }
forward player_cars_destroy(playerid); public player_cars_destroy(playerid) { for(new c = 0; c < MAX_PLAYER_CAR; ++c) { new modelid = player_car_model[playerid][c];
if(400 <= modelid <= 611) { new carid = player_car_vehicle[playerid][c]; if(player_car_forsale[playerid][c] == 0) { car_player_destroytimer[carid] = SetTimerEx("player_car_destroy", PLAYER_CAR_DESTROY_TIME, false, "i", carid); } } } return 1; }
forward player_car_destroy(carid); public player_car_destroy(carid) { if(car_player_destroytimer[carid] != -1) KillTimer(car_player_destroytimer[carid]); car_player_destroytimer[carid] = -1; car_player_owned[carid] = -1; format(car_player_owner[carid], MAX_PLAYER_NAME, "nenhum"); DestroyVehicle(carid); }
Se quiser detalhar mais.
RE: Loop MAX_PLAYERS dentro de OnGameModeInit - zBreno - 22/10/2023
você não precisa de loop pra fazer isso, já existe um exemplo simples de como fazer isso no gamemode grand larceny que vem nos arquivos do samp server e mesmo assim isso não é recomendado porque o servidor fica muito lento com um monte de veículo jogado pelo mapa, pra evitar essa lentidão crie uma quantidade limitada de veículo por profissão e adicione um temporizador pra deletar eles quando o jogador sair do veículo ou simplesmente delete quando ele sair é melhor assim um jeito simples de fazer seria esse
new carro[2];
se ele entrar em um checkpoint ou digitar um comando pra pegar um veículo você faz um dialog ou comando com id
if carro[0] == false
carro[0] = add static bla bla bla
carro[0] = true
if carro[1] == false
carro[1] = add static bla bla bla
carro[1] = true
se alguém for lá e tentar pegar o carro if carro[0] == true ) return já pegaram esse carro
RE: Loop MAX_PLAYERS dentro de OnGameModeInit - pushline - 23/10/2023
O loop de players não funciona no OnGameModeInit, por que não tem nenhum player conectado, logo qualquer coisa usando a variável i não vai funcionar, pq não tem nenhum player com esse id.
Deixe pra fazer quando o player loga, e coloque num timer talvez, para separar da public, e deixar mais organizado.
|