Portal SAMP
[Ajuda] Loop MAX_PLAYERS dentro de OnGameModeInit - 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] Loop MAX_PLAYERS dentro de OnGameModeInit (/showthread.php?tid=4111)



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 
0MAX_PLAYERS; ++i)
{
    new file[70], key[128], string[256];
    
format(filesizeof(file), "player-vehicles/%s-vehicles.ini"Name(i));
    if(
fexist(file))
    {
    
    for(new slot 0slot MAX_PLAYER_VEH; ++slot)
        {
            
FORMAT_STR "%02d-player_car_model"slot); player_car_model[i][slot] = DOF2_Int(filestring);
            
FORMAT_STR "%02d-player_car_pos_x"slot); player_car_pos[i][slot][0] = DOF2_Float(filestring);
            
FORMAT_STR "%02d-player_car_pos_y"slot); player_car_pos[i][slot][1] = DOF2_Float(filestring);
            
FORMAT_STR "%02d-player_car_pos_z"slot); player_car_pos[i][slot][2] = DOF2_Float(filestring);
            
FORMAT_STR "%02d-player_car_pos_a"slot); player_car_pos[i][slot][3] = DOF2_Float(filestring);
            
FORMAT_STR "%02d-player_car_color1"slot); player_car_color1[i][slot] = DOF2_Int(filestring);
            
FORMAT_STR "%02d-player_car_color2"slot); player_car_color2[i][slot] = DOF2_Int(filestring);
    
        FORMAT_STR "%02d-player_car_interior"slot); player_car_interior[i][slot] = DOF2_Int(filestring);
               FORMAT_STR "%02d-player_car_world"slot); player_car_world[i][slot] = DOF2_Int(filestring);
    
        FORMAT_STR "%02d-player_car_forsale"slot); player_car_forsale[i][slot] = DOF2_Int(filestring);
    
        FORMAT_STR "%02d-player_car_health"slot); player_car_health[i][slot] = DOF2_Float(filestring);
    
        
                
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] = slotformat(car_player_owner[carid], MAX_PLAYER_NAME"%s"Name(i));

                
    LinkVehicleToInterior(caridplayer_car_interior[i][slot]);
                
    SetVehicleVirtualWorld(caridplayer_car_world[i][slot]);
                
    if(player_car_health[playerid][slot] < 299player_car_health[playerid][slot] = 299;
                
    SetVehicleHealth(caridplayer_car_health[playerid][slot]);
                
    Alarme[carid] = 1AlarmTriggered[carid] = 0;
                
    LockVehicle(carid);
                
    if(player_car_forsale[i][slot] > 0)
                
    {
                
        SetTimerEx("CreateForSaleText"2000false"i"carid);
                    
    Alarme[carid] = 0;
                
    }
                
    else RemoveForSaleText(carid);
                
    SetGVarInt("Gasolina"carid100);

                
    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(playeridpassword[]);
public 
OnPlayerLogin(playeridpassword[])
{
        
player_cars_create(playerid);
        }

public 
OnPlayerDisconnect(playeridreason)
{
    
player_cars_destroy(playerid);
}

forward player_cars_create(playerid);
public 
player_cars_create(playerid)
{
    for(new slot 0slot 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 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);

                   new carid player_car_vehicle[playerid][c];
                
car_player_owned[carid] = slotformat(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(caridplayer_car_interior[playerid][slot]);
                
SetVehicleVirtualWorld(caridplayer_car_world[playerid][slot]);
                if(
player_car_health[playerid][c] < 299player_car_health[playerid][c] = 299;
                
SetVehicleHealth(caridplayer_car_health[playerid][c]);
                
Alarme[carid] = 1AlarmTriggered[carid] = 0;
                
LockVehicle(carid);
                if(
player_car_forsale[playerid][c] > 0)
                {
                
    SetTimerEx("CreateForSaleText"2000false"i"carid);
                    
Alarme[carid] = 0;
                }
                else 
RemoveForSaleText(carid);
                
SetGVarInt("Gasolina"carid100);

                
LoadingTuning(carid);
                
SetVehicleToRespawn(carid);
            }
    
    }
     }
    return 
1;
}

forward player_cars_destroy(playerid);
public 
player_cars_destroy(playerid)
{
    for(new 0MAX_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_TIMEfalse"i"carid);
            }
        }
     }
    return 
1;
}

forward player_car_destroy(carid);
public 
player_car_destroy(carid)
{
    if(car_player_destroytimer[carid] != -1KillTimer(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.