#include code\file;

init()
{		
	thread code\events::addConnectEvent( ::onConnect );
}

onConnect()
{
	self endon( "disconnect" );

	if( self isVIP() )
		self.pers[ "vip" ] = true;
	
	self setClientDvar( "ui_ShowMenuOnly", "" ); // if admin rotates the map while in killcam
	
	
	// Carrega os dados do arquivo imediatamente ao conectar
	if( level.dvar[ "fs_players" ] )
		self FSLookup(); 

	self waittill( "spawned_player" );
	
	// Garante que o Promod tenha valor inicial se o arquivo for novo
	if( !isDefined( self.pers["promod"] ) )
		self.pers["promod"] = 0;

	waittillframeend;
	self thread userSettings();
	
	// Inicia o monitor que vigia a RAM e grava no arquivo
	self thread monitorStats(); 

	//if( level.dvar[ "reloadFix" ] )
	//	thread watchReload();

	self waittill( "spawned_player" );
	
	if( !isDefined( self.pers[ "firstSpawnTime" ] ) )
		self.pers[ "firstSpawnTime" ] = getTime();
	
	if( level.dvar[ "gun_position" ] )
		self setClientDvars( "cg_gun_move_u", "1.5",
							 "cg_gun_move_f", "-1",
							 "cg_gun_ofs_u", "1",
							 "cg_gun_ofs_r", "-1",
							 "cg_gun_ofs_f", "-2" );
							 
	waittillframeend;
						 
	if( level.dvar[ "promod_sniper" ] )
		self setClientDvars( "player_breath_gasp_lerp", "0",
						 	 "player_breath_gasp_time", "0",
							 "player_breath_gasp_scale", "0", 
							 "cg_drawBreathHint", "0" );
                            
							 

}

// CAPTURA DA RAM: Pega os dados do self.pers e prepara para o arquivo
/*
updateSaveBuffer()
{
	guid = self getGuid();
	
	// Failsafe para teste local/offline caso o GUID venha vazio ou "0"
	if( !isDefined(guid) || guid == "" || guid == "0" )
		guid = "test_" + self.name;

	// Inicializações de segurança na memória RAM para evitar crash de undefined
	if(!isDefined(self.pers["fullbright"]))   self.pers["fullbright"] = 0;
	if(!isDefined(self.pers["fov"]))          self.pers["fov"] = 0;
	if(!isDefined(self.pers["promod"]))       self.pers["promod"] = 1; // Padrão: 1 (PADRAO)
	if(!isDefined(self.pers["mu"]))          self.pers["mu"] = 25;
	if(!isDefined(self.pers["sigma"]))       self.pers["sigma"] = 8.33;
	if(!isDefined(self.pers["total_kills"]))  self.pers["total_kills"] = 0;
	if(!isDefined(self.pers["total_deaths"])) self.pers["total_deaths"] = 0;

	// Sincroniza a interface do Menu com o valor atual em cache do jogador
	self setClientDvar("ui_promod_vision", self.pers["promod"]);
	self setClientDvar("ui_fov_scale", self.pers["fov"]); // Adicionado para amarrar o menu dinamicamente

	// CORREÇÃO CRÍTICA DE PONTEIRO: Evita corromper a tabela na engine do CoD4
	if( !isDefined( level.FSCD[ guid ] ) )
	{
		level.FSCD[ guid ] = [];
	}

	// Estrutura exata de 7 linhas indexadas [0 a 6]
	level.FSCD[ guid ][ 0 ] = "fullbright;" + self.pers[ "fullbright" ];
	level.FSCD[ guid ][ 1 ] = "fov;" + self.pers[ "fov" ];
	level.FSCD[ guid ][ 2 ] = "promod;" + self.pers[ "promod" ];
	level.FSCD[ guid ][ 3 ] = "mu;" + self.pers[ "mu" ];
	level.FSCD[ guid ][ 4 ] = "sigma;" + self.pers[ "sigma" ];
	level.FSCD[ guid ][ 5 ] = "kills;" + self.pers["total_kills"];
	level.FSCD[ guid ][ 6 ] = "deaths;" + self.pers["total_deaths"];
}

// MONITOR EM TEMPO REAL LEVE: Sem loop duplo e com gravação instantânea
monitorStats()
{
    self endon("disconnect");
    
    // Captura os valores de referência iniciais
    oldK = self.kills;
    oldD = self.deaths;
    oldF = self.pers["fov"];
    oldP = self.pers["promod"];
    oldB = self.pers["fullbright"]; 

    for(;;)
    {
        wait 1.0; // Checagem estável a cada 1 segundo

        // Se o player pegou kill, morreu ou mudou alguma config no menu
        if(self.kills != oldK || self.deaths != oldD || self.pers["fov"] != oldF || self.pers["promod"] != oldP || self.pers["fullbright"] != oldB)
        {
            diffK = self.kills - oldK;
            diffD = self.deaths - oldD;

            if(diffK > 0) self.pers["total_kills"] += diffK;
            if(diffD > 0) self.pers["total_deaths"] += diffD;

            // Atualiza todas as referências de memória
            oldK = self.kills;
            oldD = self.deaths;
            oldF = self.pers["fov"];
            oldP = self.pers["promod"];
            oldB = self.pers["fullbright"];
         
            self updateSaveBuffer(); 
            self FSSave( self getGuid() );               
            self thread code\toprank::updateGlobalRanking(); 
        }
    }
}

FSSave( guid )
{
	if( !isDefined(guid) || guid == "" || guid == "0" )
	{
		guid = "test_" + self.name;
	}

	if( !isDefined( level.FSCD[ guid ] ) ) return;
		
	path = "ne_db/players/" + guid + ".db";
	
	// Gravação direta sem thread assíncrona para garantir a escrita física no disco
	code\file::writeToFile( path, level.FSCD[ guid ] );
}

FSDefault()
{
	self.pers[ "fullbright" ] = 0;
	self.pers[ "fov" ] = 0; 
	self.pers[ "promod" ] = 1; // Inicializa no index 1 (PADRAO)
	self.pers[ "mu" ] = 25;
	self.pers[ "sigma" ] = 8.33;
	self.pers[ "total_kills" ] = 0;
	self.pers[ "total_deaths" ] = 0;
    
    self updateSaveBuffer();
    
    // Cria o arquivo físico inicial na pasta na mesma hora
    self FSSave( self getGuid() );
}

FSLookup()
{
    self endon("disconnect");
    wait 0.5; // Delay necessário para a estabilização da engine na conexão

    guid = self getGuid();
    if( !isDefined(guid) || guid == "" || guid == "0" )
    {
        guid = "test_" + self.name;
    }

    path = "ne_db/players/" + guid + ".db"; 
    array = readFile( path );
    
    // CORREÇÃO CRÍTICA: Ajustado para checar 7 linhas [0 a 6], impedindo o reset infinito!
    if( !isDefined( array ) || !isArray( array ) || array.size < 7 )
    {
        self FSDefault();
        self thread monitorStats();
        return;
    }
    
    for( i = 0; i < array.size; i++ )
    {
        if( !isDefined( array[i] ) || array[i] == "" ) continue;
        tok = strTok( array[i], ";" ); 
        if(tok.size < 2) continue;

        key = tok[0];
        val = tok[1];

        if( key == "kills" )         self.pers["total_kills"] = int(val);
        else if( key == "deaths" )    self.pers["total_deaths"] = int(val);
        else if( key == "mu" )        self.pers["mu"] = float(val);
        else if( key == "sigma" )     self.pers["sigma"] = float(val);
        else if( key == "fov" )       self.pers["fov"] = int(val);
        else if( key == "promod" )    self.pers["promod"] = int(val);
        else if( key == "fullbright" )self.pers["fullbright"] = int(val);
        else if( key == "mapsave" )   self.pers["map_save_enabled"] = int(val);
    }

    // Inicializações de contingência pós-leitura
    if(!isDefined(self.pers["total_kills"]))  self.pers["total_kills"] = 0;
    if(!isDefined(self.pers["total_deaths"])) self.pers["total_deaths"] = 0;
    if(!isDefined(self.pers["promod"]))       self.pers["promod"] = 1;
    if(!isDefined(self.pers["fov"]))          self.pers["fov"] = 0;
    if(!isDefined(self.pers["fullbright"]))   self.pers["fullbright"] = 0;
    
    self.kills = 0; 
    self.deaths = 0;

    //self updateSaveBuffer();

    if(!isDefined(self.pers["promod"])) self.pers["promod"] = 0;

    // CRAVA O VALOR CARREGADO DO DISCO DIRETO NO MENU DO JOGADOR
    self setClientDvar("ui_promod_vision", int(self.pers["promod"]));

    // Dispara as threads de jogabilidade de forma assíncrona estável
    self thread monitorStats();
    self thread applyVisualsOnSpawn();
}
*/
updateSaveBuffer()
{
	guid = self getGuid();
	
	if( !isDefined(guid) || guid == "" || guid == "0" )
		guid = "test_" + self.name;

	if(!isDefined(self.pers["fullbright"]))   self.pers["fullbright"] = 0;
	if(!isDefined(self.pers["fov"]))          self.pers["fov"] = 0;
	if(!isDefined(self.pers["promod"]))       self.pers["promod"] = 0; // Alinhado: 0 = PADRAO, 5 = CRASH
	if(!isDefined(self.pers["mu"]))          self.pers["mu"] = 25;
	if(!isDefined(self.pers["sigma"]))       self.pers["sigma"] = 8.33;
	if(!isDefined(self.pers["total_kills"]))  self.pers["total_kills"] = 0;
	if(!isDefined(self.pers["total_deaths"])) self.pers["total_deaths"] = 0;

	// Sincroniza o menu gráfico
	self setClientDvar("ui_promod_vision", self.pers["promod"]);
	self setClientDvar("ui_fov_scale", self.pers["fov"]); 

	if( !isDefined( level.FSCD[ guid ] ) )
	{
		level.FSCD[ guid ] = [];
	}

	level.FSCD[ guid ][ 0 ] = "fullbright;" + self.pers[ "fullbright" ];
	level.FSCD[ guid ][ 1 ] = "fov;" + self.pers[ "fov" ];
	level.FSCD[ guid ][ 2 ] = "promod;" + self.pers[ "promod" ];
	level.FSCD[ guid ][ 3 ] = "mu;" + self.pers[ "mu" ];
	level.FSCD[ guid ][ 4 ] = "sigma;" + self.pers[ "sigma" ];
	level.FSCD[ guid ][ 5 ] = "kills;" + self.pers["total_kills"];
	level.FSCD[ guid ][ 6 ] = "deaths;" + self.pers["total_deaths"];
}

// --- SISTEMA COMPATÍVEL BASEADO EM EVENTOS NATIVOS (Substitui o monitor por loops) ---
// O CoD4x executa isso instantaneamente no frame do abate/morte
adicionarMorteBanco()
{
    if(!isDefined(self.pers["total_deaths"])) self.pers["total_deaths"] = 0;
    self.pers["total_deaths"]++;
    
    self updateSaveBuffer();
    self FSSave( self getGuid() );
    self thread code\toprank::updateGlobalRanking();
}

adicionarKillBanco()
{
    if(!isDefined(self.pers["total_kills"])) self.pers["total_kills"] = 0;
    self.pers["total_kills"]++;
    
    self updateSaveBuffer();
    self FSSave( self getGuid() );
    self thread code\toprank::updateGlobalRanking();
    
    if(isDefined(level.threadCheckMilestones))
        self thread checkMilestones(self.pers["total_kills"]);
}

FSSave( guid )
{
	if( !isDefined(guid) || guid == "" || guid == "0" )
	{
		guid = "test_" + self.name;
	}

	if( !isDefined( level.FSCD[ guid ] ) ) return;
		
	path = "ne_db/players/" + guid + ".db";
	code\file::writeToFile( path, level.FSCD[ guid ] );
}

FSDefault()
{
	self.pers[ "fullbright" ] = 0;
	self.pers[ "fov" ] = 0; 
	self.pers[ "promod" ] = 0; // Começa no index 0 (PADRAO)
	self.pers[ "mu" ] = 25;
	self.pers[ "sigma" ] = 8.33;
	self.pers[ "total_kills" ] = 0;
	self.pers[ "total_deaths" ] = 0;
    
    self updateSaveBuffer();
    self FSSave( self getGuid() );
}

FSLookup()
{
    self endon("disconnect");
    wait 0.5; 

    guid = self getGuid();
    if( !isDefined(guid) || guid == "" || guid == "0" )
    {
        guid = "test_" + self.name;
    }

    path = "ne_db/players/" + guid + ".db"; 
    array = readFile( path );
    
    if( !isDefined( array ) || !isArray( array ) || array.size < 7 )
    {
        self FSDefault();
        return;
    }
    
    for( i = 0; i < array.size; i++ )
    {
        if( !isDefined( array[i] ) || array[i] == "" ) continue;
        tok = strTok( array[i], ";" ); 
        if(tok.size < 2) continue;

        key = tok[0];
        val = tok[1];

        if( key == "kills" )         self.pers["total_kills"] = int(val);
        else if( key == "deaths" )    self.pers["total_deaths"] = int(val);
        else if( key == "mu" )        self.pers["mu"] = float(val);
        else if( key == "sigma" )     self.pers["sigma"] = float(val);
        else if( key == "fov" )       self.pers["fov"] = int(val);
        else if( key == "promod" )    self.pers["promod"] = int(val);
        else if( key == "fullbright" )self.pers["fullbright"] = int(val);
    }

    if(!isDefined(self.pers["total_kills"]))  self.pers["total_kills"] = 0;
    if(!isDefined(self.pers["total_deaths"])) self.pers["total_deaths"] = 0;
    if(!isDefined(self.pers["promod"]))       self.pers["promod"] = 0;
    if(!isDefined(self.pers["fov"]))          self.pers["fov"] = 0;
    if(!isDefined(self.pers["fullbright"]))   self.pers["fullbright"] = 0;
    
    self.kills = 0; 
    self.deaths = 0;

    self updateSaveBuffer();

    self thread applyVisualsOnSpawn();
}

monitorStats()
{
    self endon("disconnect");
    
    // Captura os valores de referência iniciais
    oldK = self.kills;
    oldD = self.deaths;
    oldF = self.pers["fov"];
    oldP = self.pers["promod"];
    oldB = self.pers["fullbright"]; 

    for(;;)
    {
        wait 1.0; // Checagem estável a cada 1 segundo

        // Se o player pegou kill, morreu ou mudou alguma config no menu
        if(self.kills != oldK || self.deaths != oldD || self.pers["fov"] != oldF || self.pers["promod"] != oldP || self.pers["fullbright"] != oldB)
        {
            diffK = self.kills - oldK;
            diffD = self.deaths - oldD;

            if(diffK > 0) self.pers["total_kills"] += diffK;
            if(diffD > 0) self.pers["total_deaths"] += diffD;

            // Atualiza todas as referências de memória
            oldK = self.kills;
            oldD = self.deaths;
            oldF = self.pers["fov"];
            oldP = self.pers["promod"];
            oldB = self.pers["fullbright"];
         
            self updateSaveBuffer(); 
            self FSSave( self getGuid() );               
            self thread code\toprank::updateGlobalRanking(); 
        }
    }
}

applyVisualsOnSpawn()
{
    self endon("disconnect");

    for(;;)
    {
        self waittill("spawned_player");
        
        // Aguarda 0.5 segundos para a engine processar os comandos de rede após nascer
        wait 0.5; 

        // --- 1. APLICAÇÃO DO FOV (Sincronizado de 0 a 3 com o Banco de 7 linhas) ---
        if(isDefined(self.pers["fov"]))
        {
            switch(int(self.pers["fov"]))
            {
                case 0: self setClientDvar("cg_fovscale", "1.0"); break;   // Padrao do Jogo
                case 1: self setClientDvar("cg_fovscale", "1.30"); break;  // Index 1 pucha o FOV Maximo (1.30)
                case 2: self setClientDvar("cg_fovscale", "1.25"); break;  // FOV Medio
                case 3: self setClientDvar("cg_fovscale", "1.125"); break; // FOV Baixo
                default: self setClientDvar("cg_fovscale", "1.0"); break;
            }
        }

        // --- 2. APLICAÇÃO DO FULLBRIGHT ISOLADO (Linha 0 do Banco) ---
        if(isDefined(self.pers["fullbright"]) && self.pers["fullbright"] == 1)
        {
            self setClientDvar("r_fullbright", "1");
        }
        else
        {
            self setClientDvar("r_fullbright", "0");
        }

    }
}

userSettings()
{
	self endon("disconnect");
    
	// --- 1. APLICAÇÃO DO FULLBRIGHT (Independente e Isolado) ---
	if(!isDefined(self.pers["fullbright"])) 
		self.pers["fullbright"] = 0;

	if(int(self.pers["fullbright"]) == 1)
		self setClientDvar("r_fullbright", "1");
	else
		self setClientDvar("r_fullbright", "0");

	// --- 2. APLICAÇÃO DO FOV (Sincronizado de 0 a 3 com os comandos/binds) ---
	if(!isDefined(self.pers["fov"])) 
		self.pers["fov"] = 0; // Padrão: 1.0 (Normal)

	switch(int(self.pers["fov"]))
	{
		case 0: self setClientDvar("cg_fovscale", "1.0"); break;
		case 1: self setClientDvar("cg_fovscale", "1.125"); break;
		case 2: self setClientDvar("cg_fovscale", "1.25"); break;
		case 3: self setClientDvar("cg_fovscale", "1.30"); break;
		default: self setClientDvar("cg_fovscale", "1.0"); break;
	}

	waittillframeend;

	// --- 3. APLICAÇÃO DO PROMOD (Sincronizado perfeitamente com a dvarFloatList do Menu) ---
	if(!isDefined(self.pers["promod"])) 
		self.pers["promod"] = 1; // Padrão: PADRAO (1)

	// Garante que o texto da caixinha do menu atualize no mesmo frame
	self setClientDvar("ui_promod_vision", self.pers["promod"]);

	switch(int(self.pers["promod"]))
	{
		case 0: // PADRAO DO JOGO
			self setClientDvars("r_filmTweakBrightness", "0", "r_filmTweakContrast", "1.4", "r_filmTweakDarkTint", "0.7 0.85 1","r_filmTweakDesaturation", "0.2","r_filmTweakInvert", "0","r_filmTweakLightTint", "1.1 1.05 0.85","r_filmtweaks", "0","r_filmUseTweaks", "0","r_lightTweakSunColor", "1 0.941177 0.8 1","r_lightTweakSunLight","1","r_glow_allowed","0","r_glow_enable", "0", "sm_maxLights", "4", "r_specularcolorscale", "1", "r_glowTweakBloomCutoff", "0.5","r_glowtweakbloomintensity0", "1", "r_blur", "0");
			self setClientDvar("r_filmusetweaks", 0);
			self setClientDvar("r_filmtweakenable", 0);
			self setClientDvar("r_blur", 0); 
			break;

		case 1: // TARDE (Tardezinha)
			self setClientDvars("r_filmTweakBrightness", "0.1", "r_filmTweakContrast", "1.1", "r_filmTweakDarkTint", "0.7 0.72 0.95", "r_filmTweakDesaturation", "0", "r_filmTweakInvert", "0", "r_filmTweakLightTint", "1 1.02 1.2", "r_filmtweaks", "1", "r_filmUseTweaks", "1", "r_lightTweakSunColor", "0.85098 0.45098 0.2 0", "r_lightTweakSunLight", "1.5", "r_glow_allowed", "0",  "r_glow_enable", "0", "sm_maxLights", "4", "r_specularcolorscale", "8", "r_glowTweakBloomCutoff", "0.8", "r_glowtweakbloomintensity0", "1", "r_blur", "0");
			self setClientDvar("r_filmusetweaks", 1);
			self setClientDvar("r_filmtweakenable", 1);
			self setClientDvar("r_blur", 0); 
			break;

		case 2: // Promod
			self setClientDvars("r_filmTweakInvert", "0", "r_filmTweakContrast", "0.5","r_filmTweakBrightness", "0", "r_filmtweakLighttint", "0.8 0.8 1",  "r_filmTweakContrast", "1.2", "r_filmTweakDesaturation", "0", "r_filmTweakDarkTint", "1.8 1.8 2", "r_lightTweakSunColor", "1 0.921569 0.878431 1", "r_lightTweakSunLight", "1.15", "r_glow_allowed", "0",  "r_glow_enable", "0", "sm_maxLights", "4", "r_specularcolorscale", "8", "r_glowTweakBloomCutoff", "0.8", "r_glowtweakbloomintensity0", "1", "r_blur", "0");
			self setClientDvar("r_filmusetweaks", 1);
			self setClientDvar("r_filmtweakenable", 1);
			self setClientDvar("r_blur", 0); 
			break;

		case 3: // SUNNY (Ensolarado)
			self setClientDvars("r_filmtweakLighttint","0.9 0.9 1","r_filmTweakContrast", "1.15", "r_filmtweakDarktint","1.1 1.05 0.85","r_filmtweakbrightness","0.1", "r_lightTweakSunColor", "1 0.941177 0.8 1", "r_lightTweakSunLight", "1.5", "r_glow_allowed", "0",  "r_glow_enable", "0", "sm_maxLights", "4", "r_specularcolorscale", "8", "r_glowTweakBloomCutoff", "0.8", "r_glowtweakbloomintensity0", "1", "r_blur", "0");
			self setClientDvar("r_filmusetweaks", 1);
			self setClientDvar("r_filmtweakenable", 1);
			self setClientDvar("r_blur", 0); 
			break;

		case 4: // Nublado
			self setClientDvars("r_filmtweakenable", 1, "r_filmtweakContrast", 1.15, "r_filmtweakLighttint", "1.1 1.1 1.1", "r_filmtweakDarktint", "1.8 1.8 1.8", "r_filmtweakDesaturation", 0, "r_filmTweakInvert", "0", "r_gamma", 1.1, "r_filmtweakbrightness", 0, "r_lightTweakSunLight", 0);
			self setClientDvar("r_filmusetweaks", 1);
			self setClientDvar("r_blur", 0); 
			break;

		case 5: // Crash
			self setClientDvar("r_filmusetweaks", 1);
			self setClientDvar("r_filmtweakenable", 1);
			self setClientDvars("r_filmtweakContrast","1.15","r_filmtweakLighttint","0.85 0.85 0.98","r_filmtweakDarktint","1.24 1.44 1.9","r_filmtweakDesaturation","0","r_filmtweakbrightness","0.1", "r_lightTweakSunColor", "1 0.921569 0.878431 1", "r_lightTweakSunLight", "1.15", "r_glow_allowed", "0",  "r_glow_enable", "0", "sm_maxLights", "4", "r_specularcolorscale", "8", "r_glowTweakBloomCutoff", "0.8", "r_glowtweakbloomintensity0", "1", "r_blur", "0");
			break;
	
	}
}

checkMilestones( total )
{
    // Declaração de array compatível com o compilador CoD4
    milestones = [];
    milestones[0] = 10;
    milestones[1] = 50;
    milestones[2] = 100;
    milestones[3] = 250;
    milestones[4] = 500;
    milestones[5] = 1000;
    milestones[6] = 2500;
    milestones[7] = 5000;
    milestones[8] = 10000;

    for( i = 0; i < milestones.size; i++ )
    {
        if( total == milestones[i] )
        {
            // Anúncio no Chat Global para todos
            exec( "say ^3[MARCO] ^7O jogador ^2" + self.name + " ^7atingiu ^3" + total + " ^7Kills totais!" );
            
            // Mensagem grande na tela do jogador
            self iPrintLnBold( "^2PARABENS! ^7Voce atingiu ^3" + total + " ^7Kills!" );
            break; 
        }
    }
}


isVIP()
{
	player = self getPlayerID();
	
	for( i = 0; i < 100; i++ )
	{
		vip = getDvar( "vip_" + i );
		if( vip == "" )
			break;

		else if( player == vip )
			return true;
	}
	
	return false;
}


watchReload()
{
	self endon( "disconnect" );
	for( ;; )
	{
		self waittill( "reload_start" );
		weap = self GetCurrentWeapon();
		if( weap == "none" || WeaponIsBoltAction( weap ) ) continue;

		AmmoClip = self GetWeaponAmmoClip( weap );
		self SetWeaponAmmoClip( weap, 0 );

		if( !level.dvar[ "realReload" ] )
		{
			AmmoStock = self GetWeaponAmmoStock( weap );
			self setWeaponAmmoStock( weap,( AmmoStock + AmmoClip ) );
		}
	}
}


/*

outros modelos

FSLookup()
{
    guid = self getGuid();
    path = "ne_db/players/" + guid + ".db"; 
    array = readFile( path );
    
    if( !isDefined( array ) || !isArray( array ) || array.size < 7 )
    {
        self FSDefault();
        return;
    }
    
    for( i = 0; i < array.size; i++ )
    {
        if( !isDefined( array[i] ) || array[i] == "" ) continue;
        tok = strTok( array[i], ";" ); 
        
        if(tok.size < 2) continue; // Proteção contra linhas corrompidas

        key = tok[0];
        val = tok[1];

        if( key == "kills" ) self.pers["total_kills"] = int(val);
        else if( key == "deaths" ) self.pers["total_deaths"] = int(val);
        else if( key == "mu" || key == "sigma" ) self.pers[ key ] = float( val );
        else self.pers[ key ] = int( val );
    }
	

    // --- CORREÇÃO AQUI ---
    // Garante que o placar do round comece do zero para não somar lixo no monitorStats
    self.kills = 0; 
    self.deaths = 0;
    
    if(!isDefined(self.pers["total_kills"])) self.pers["total_kills"] = 0;
    if(!isDefined(self.pers["total_deaths"])) self.pers["total_deaths"] = 0;
}


FSLookup()
{
    guid = self getGuid();
    path = "ne_db/players/" + guid + ".db"; 
    array = readFile( path );
    
    if( !isDefined( array ) || !isArray( array ) || array.size < 7 )
    {
        self FSDefault();
        return;
    }
    
    for( i = 0; i < array.size; i++ )
    {
        if( !isDefined( array[i] ) || array[i] == "" ) continue;
        tok = strTok( array[i], ";" ); 
        
        if(tok.size < 2) continue; // Proteção contra linhas corrompidas

        key = tok[0];
        val = tok[1];

        if( key == "kills" ) self.pers["total_kills"] = int(val);
        else if( key == "deaths" ) self.pers["total_deaths"] = int(val);
        else if( key == "mu" || key == "sigma" ) self.pers[ key ] = float( val );
        else self.pers[ key ] = int( val );
    }
	// ... final do seu FSLookup ...
    if(!isDefined(self.pers["total_deaths"])) self.pers["total_deaths"] = 0;

    // APLICAR CONFIGURAÇÕES CARREGADAS NA HORA
    if(isDefined(self.pers["fullbright"]) && self.pers["fullbright"] == 1)
        self setClientDvar("r_fullbright", 1);
    else
        self setClientDvar("r_fullbright", 0);

    // --- CORREÇÃO AQUI ---
    // Garante que o placar do round comece do zero para não somar lixo no monitorStats
    self.kills = 0; 
    self.deaths = 0;
    
    if(!isDefined(self.pers["total_kills"])) self.pers["total_kills"] = 0;
    if(!isDefined(self.pers["total_deaths"])) self.pers["total_deaths"] = 0;
}

FSLookup()
{
    guid = self getGuid();
    path = "ne_db/players/" + guid + ".db"; 
    array = readFile( path );
    
    if( !isDefined( array ) || !isArray( array ) || array.size < 7 )
    {
        self FSDefault();
        return;
    }
    
    for( i = 0; i < array.size; i++ )
    {
        if( !isDefined( array[i] ) || array[i] == "" ) continue;
        tok = strTok( array[i], ";" ); 
        
        if(tok.size < 2) continue; 

        key = tok[0];
        val = tok[1];

        if( key == "kills" ) self.pers["total_kills"] = int(val);
        else if( key == "deaths" ) self.pers["total_deaths"] = int(val);
        else if( key == "mu" || key == "sigma" ) self.pers[ key ] = float( val );
        else self.pers[ key ] = int( val );
    }

    // Garante que as variáveis de ranking existam
    if(!isDefined(self.pers["total_kills"])) self.pers["total_kills"] = 0;
    if(!isDefined(self.pers["total_deaths"])) self.pers["total_deaths"] = 0;

    // APLICAR CONFIGURAÇÕES VISUAIS CARREGADAS
    if(isDefined(self.pers["fullbright"]) && self.pers["fullbright"] == 1)
        self setClientDvar("r_fullbright", 1);
    else
        self setClientDvar("r_fullbright", 0);

    // Zera o placar do round atual para o monitorStats começar limpo
    self.kills = 0; 
    self.deaths = 0;
}
