4ªU   �   nut scripts/vscripts omega_tankhp ÇØO·  ÿe    ÿÿdirector_base_addon %3$  ÿ5  0   ÿÿ  txt   addoninfo gÓqC  ÿ    5  ÿÿ   "AddonInfo"
{
	"addonTitle"		"TANKHP"
	"addonVersion"		"1.0"
	"addonAuthor"		"РОМАШКИ"
	"addonDescription"	":)"
	
	"addonauthorid"		"STEAM_0:0:82924304" 
	"addonContent_Script"	"1"
	"addonContent_Weapon"	"0"
	"addonContent_Boss"		"0"
	"addonContent_Map"		"0"
	"addonContent_Skin"		"0"
} 
IncludeScript("Omega_TankHP", getroottable());
// ===========================================================================
// [L4D2] TANK HP GAUGE - OMEGA TANK HP 
// ===========================================================================

local Root = getroottable();

// 1. Definición de Variables Globales en Root (Persistencia de datos)
if (!("Omega_TankState" in Root)) {
    Root.Omega_TankState <- { 
        TankData = {},
        TankCounter = 0,
        LastMessageTime = 0.0
    }
}

// ---------------------------------------------------------------------------
// 2. TABLA OMEGA TANK HP (Scope Global)
// ---------------------------------------------------------------------------
::OmegaTankHP <- {

    // --- MOTOR DE CONVERSIÓN ULTRA-ESPACIADO ---
    function ToFullWidth(text) {
        local normal = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+:/()- ";
        local full   = "０１２３４５６７８９ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ＋：／（）－　";
        local result = "";
        local str = text.tostring();
        
        foreach (char in str) {
            local c = char.tochar();
            local idx = normal.find(c);
            // Convertimos y añadimos un espacio físico después de cada caracter para separación total
            result += (idx != null) ? (full.slice(idx * 3, (idx * 3) + 3) + " ") : (c + " ");
        }
        return result;
    }

    // --- LÓGICA DE EVENTOS ---
    function OnGameEvent_player_hurt(params)
    {
        if (!("attacker" in params) || !("userid" in params)) return;
        
        local victim = GetPlayerFromUserID(params.userid);
        local attacker = GetPlayerFromUserID(params.attacker);

        // Filtro: Es un Player + Es un Tank (Type 8) + Atacante válido
        if (victim && victim.IsPlayer() && victim.GetZombieType() == 8 && attacker)
        {
            local state = ::Omega_TankState;
            local currentTime = Time();
            
            // Anti-Spam de mensajes
            if (currentTime - state.LastMessageTime < 0.1) return;
            state.LastMessageTime = currentTime;

            local entIndex = victim.GetEntityIndex();
            local currentHP = victim.GetHealth();
            if (currentHP <= 0) return;

            // Registro dinámico de IDs (TANK, TANK (2), etc.)
            if (!(entIndex in state.TankData)) {
                state.TankCounter++;
                if (state.TankCounter > 5) state.TankCounter = 1;

                local idTag = (state.TankCounter == 1) ? "" : " (" + state.TankCounter + ")";
                state.TankData[entIndex] <- { displayID = idTag };
            }

            local data = state.TankData[entIndex];
            
            // Construcción del label: TANK(ID):VIDA HP
            local rawLabel = "TANK" + data.displayID + ":" + currentHP + "HP";
            
            // Impresión ultra-espaciada al atacante
            ClientPrint(attacker, 4, this.ToFullWidth(rawLabel));
        }
    }

    function OnGameEvent_player_death(params)
    {
        if (!("userid" in params)) return;
        local victim = GetPlayerFromUserID(params.userid);
        
        if (victim) {
            local state = ::Omega_TankState;
            local idx = victim.GetEntityIndex();
            
            if (idx in state.TankData) {
                local id = state.TankData[idx].displayID;
                local deathMsg = "--- TANK" + id + ": ELIMINATED ---";
                
                // Notificación global de eliminación
                ClientPrint(null, 4, this.ToFullWidth(deathMsg));
                
                // Limpieza de memoria
                delete state.TankData[idx];
            }
            
            // Reset de contador si no hay más tanques
            if (state.TankData.len() == 0) state.TankCounter = 0;
        }
    }

    function OnGameEvent_round_start(params)
    {
        ::Omega_TankState.TankData.clear();
        ::Omega_TankState.TankCounter = 0;
    }
} 

// ---------------------------------------------------------------------------
// 3. Registro Final (Kernel Source)
// ---------------------------------------------------------------------------
__CollectEventCallbacks(::OmegaTankHP, "OnGameEvent_", "GameEventCallbacks", RegisterScriptGameEventListener);

// printl(">>> OmegaTankHP: Blindaje Root-Style aplicado y listo.");