#include "func_payload"
#include "weapon_medigun"

void MapInit() {
  FuncPayload::Register();
  RegisterMedigun();
}

// Función: Todos MINI por 10 segundos
void HacerMini(CBaseEntity@ pActivator, CBaseEntity@ pCaller, USE_TYPE useType, float value)
{
    for (int i = 1; i <= g_Engine.maxClients; i++)
    {
        CBasePlayer@ pPlayer = g_PlayerFuncs.FindPlayerByIndex(i);
        
        if (pPlayer !is null && pPlayer.IsConnected())
        {
            // Aplicamos efecto
            pPlayer.pev.scale = 0.5f;
            pPlayer.pev.view_ofs = Vector(0, 0, 14); 
            
            // Programamos el reset automático en 10 segundos
            g_Scheduler.SetTimeout("ResetSize", 10.0f, EHandle(pPlayer));
        }
    }
    g_PlayerFuncs.ClientPrintAll(HUD_PRINTCENTER, "¡TODOS MINIS! (10 seg)\n");
}

// Función: Todos GIGANTES por 10 segundos
void HacerGigante(CBaseEntity@ pActivator, CBaseEntity@ pCaller, USE_TYPE useType, float value)
{
    for (int i = 1; i <= g_Engine.maxClients; i++)
    {
        CBasePlayer@ pPlayer = g_PlayerFuncs.FindPlayerByIndex(i);
        
        if (pPlayer !is null && pPlayer.IsConnected())
        {
            // Aplicamos efecto
            pPlayer.pev.scale = 2.0f;
            pPlayer.pev.view_ofs = Vector(0, 0, 56); 
            
            // Programamos el reset automático en 10 segundos
            g_Scheduler.SetTimeout("ResetSize", 10.0f, EHandle(pPlayer));
        }
    }
    g_PlayerFuncs.ClientPrintAll(HUD_PRINTCENTER, "¡TODOS GIGANTES! (10 seg)\n");
}

// Función auxiliar: Restaura el tamaño (Llamada automáticamente por el Scheduler)
void ResetSize(EHandle hPlayer)
{
    if (hPlayer.IsValid())
    {
        CBasePlayer@ pPlayer = cast<CBasePlayer@>(hPlayer.GetEntity());
        if (pPlayer !is null)
        {
            // Restauramos valores originales de Sven Co-op
            pPlayer.pev.scale = 1.0f;
            pPlayer.pev.view_ofs = Vector(0, 0, 28); 
            
            // Opcional: Sonido o mensaje pequeño
            // g_PlayerFuncs.ClientPrint(pPlayer, HUD_PRINTTALK, "Has vuelto a tu tamaño normal.\n");
        }
    }
}

// (Opcional) Función manual para volver a la normalidad si quisieras un botón de pánico
void HacerNormal(CBaseEntity@ pActivator, CBaseEntity@ pCaller, USE_TYPE useType, float value)
{
    for (int i = 1; i <= g_Engine.maxClients; i++)
    {
        CBasePlayer@ pPlayer = g_PlayerFuncs.FindPlayerByIndex(i);
        if (pPlayer !is null && pPlayer.IsConnected())
        {
            // Llamamos manualmente a la función de reset
            ResetSize(EHandle(pPlayer));
        }
    }
    g_PlayerFuncs.ClientPrintAll(HUD_PRINTCENTER, "Tamaño normal restaurado.\n");
}

// ----------------------------------------------------------------------
// SECCIÓN 2: DETECTOR DE FECHAS (HALLOWEEN)
// ----------------------------------------------------------------------

// Función: Chequea si es Octubre y dispara entidades del mapa
void ChequearHalloween(CBaseEntity@ pActivator, CBaseEntity@ pCaller, USE_TYPE useType, float value)
{
    // Obtenemos fecha del servidor
    DateTime fechaActual;
    bool modoDebug = false;
    // Mes 10 = Octubre
    if (modoDebug || fechaActual.GetMonth() == 10)
    {
        // CASO: SI ES OCTUBRE
        // Busca en el mapa una entidad llamada 'evento_es_halloween' y la activa
        g_EntityFuncs.FireTargets("evento_es_halloween", pActivator, pCaller, USE_TOGGLE);
        
        g_Game.AlertMessage(at_console, "Script Event: Detectado mes de Octubre. Activando Halloween.\n");
    }
    else
    {
        // CASO: NO ES OCTUBRE (Resto del año)
        // Busca en el mapa una entidad llamada 'evento_no_halloween' y la activa
        g_EntityFuncs.FireTargets("evento_no_halloween", pActivator, pCaller, USE_TOGGLE);
        
        g_Game.AlertMessage(at_console, "Script Event: No es Octubre. Modo normal.\n");
    }
}

// ----------------------------------------------------------------------
// SECCIÓN 3: PODERES TEMPORALES (10 SEGUNDOS)
// ----------------------------------------------------------------------

// --- SUPER VELOCIDAD GLOBAL ---
void ActivarSuperSpeed(CBaseEntity@ pActivator, CBaseEntity@ pCaller, USE_TYPE useType, float value)
{
    for (int i = 1; i <= g_Engine.maxClients; i++)
    {
        CBasePlayer@ pPlayer = g_PlayerFuncs.FindPlayerByIndex(i);
        if (pPlayer !is null && pPlayer.IsConnected())
        {
            pPlayer.SetMaxSpeed(800.0f);
            // Programamos el reset INDIVIDUALMENTE para cada jugador encontrado
            g_Scheduler.SetTimeout("ResetSpeed", 10.0f, EHandle(pPlayer));
        }
    }
    g_PlayerFuncs.ClientPrintAll(HUD_PRINTCENTER, "¡SUPER VELOCIDAD PARA TODOS! (10 seg)\n");
}

// (Esta función de reset se mantiene igual, ya que el Scheduler la llama por cada jugador individualmente)
void ResetSpeed(EHandle hPlayer)
{
    if (hPlayer.IsValid()) // Verificamos que el jugador siga conectado
    {
        CBasePlayer@ pPlayer = cast<CBasePlayer@>(hPlayer.GetEntity());
        if (pPlayer !is null)
        {
            // CORRECCIÓN: Usamos -1.0f. 
            // Esto le dice al motor: "Deja de forzar la velocidad y usa la normal del arma que lleva el jugador".
            pPlayer.SetMaxSpeed(270.0f); 
            
            // Si -1 no te funcionara (raro), cambia esa linea por: pPlayer.SetMaxSpeed(270.0f);
            
            // Opcional: Mensaje de confirmación
            // g_PlayerFuncs.ClientPrint(pPlayer, HUD_PRINTCENTER, "Velocidad normal restaurada.\n");
        }
    }
}

// --- LOW GRAVITY GLOBAL ---
void ActivarLowGravity(CBaseEntity@ pActivator, CBaseEntity@ pCaller, USE_TYPE useType, float value)
{
    for (int i = 1; i <= g_Engine.maxClients; i++)
    {
        CBasePlayer@ pPlayer = g_PlayerFuncs.FindPlayerByIndex(i);
        if (pPlayer !is null && pPlayer.IsConnected())
        {
            pPlayer.pev.gravity = 0.6f; 
            g_Scheduler.SetTimeout("ResetGravity", 10.0f, EHandle(pPlayer));
        }
    }
    g_PlayerFuncs.ClientPrintAll(HUD_PRINTCENTER, "¡GRAVEDAD BAJA GLOBAL! (10 seg)\n");
}

// --- SUPER JUMP GLOBAL ---
void ActivarSuperJump(CBaseEntity@ pActivator, CBaseEntity@ pCaller, USE_TYPE useType, float value)
{
    for (int i = 1; i <= g_Engine.maxClients; i++)
    {
        CBasePlayer@ pPlayer = g_PlayerFuncs.FindPlayerByIndex(i);
        if (pPlayer !is null && pPlayer.IsConnected())
        {
            pPlayer.pev.gravity = 0.25f;
            g_Scheduler.SetTimeout("ResetGravity", 10.0f, EHandle(pPlayer));
        }
    }
    g_PlayerFuncs.ClientPrintAll(HUD_PRINTCENTER, "¡SUPER SALTO GLOBAL! (10 seg)\n");
}

void ResetGravity(EHandle hPlayer)
{
    if (hPlayer.IsValid())
    {
        CBasePlayer@ pPlayer = cast<CBasePlayer@>(hPlayer.GetEntity());
        if (pPlayer !is null)
        {
            pPlayer.pev.gravity = 1.0f;
        }
    }
}
// --- GOD MODE GLOBAL (Invulnerabilidad) ---
void ActivarGodMode(CBaseEntity@ pActivator, CBaseEntity@ pCaller, USE_TYPE useType, float value)
{
    for (int i = 1; i <= g_Engine.maxClients; i++)
    {
        CBasePlayer@ pPlayer = g_PlayerFuncs.FindPlayerByIndex(i);
        
        // Verificamos que esté vivo, porque dar God Mode a un muerto no sirve de mucho
        if (pPlayer !is null && pPlayer.IsConnected() && pPlayer.IsAlive())
        {
            // 1. Activar Invulnerabilidad
            pPlayer.pev.takedamage = DAMAGE_NO;

            // 2. Efecto Visual: Brillo Dorado (Glow Shell)
            pPlayer.pev.renderfx = kRenderFxGlowShell; 
            pPlayer.pev.renderamt = 20; // Grosor del brillo
            pPlayer.pev.rendercolor = Vector(255, 215, 0); // Color Oro (RGB)
            pPlayer.pev.rendermode = kRenderNormal;

            // 3. Programar el fin del efecto en 10 segundos
            g_Scheduler.SetTimeout("ResetGodMode", 10.0f, EHandle(pPlayer));
        }
    }
    g_PlayerFuncs.ClientPrintAll(HUD_PRINTCENTER, "¡GOD MODE ACTIVADO! (10 seg)\n");
}

// Función para quitar el God Mode
void ResetGodMode(EHandle hPlayer)
{
    if (hPlayer.IsValid())
    {
        CBasePlayer@ pPlayer = cast<CBasePlayer@>(hPlayer.GetEntity());
        if (pPlayer !is null)
        {
            // 1. Restaurar daño normal (DAMAGE_AIM es el valor por defecto)
            pPlayer.pev.takedamage = DAMAGE_AIM;

            // 2. Quitar el brillo visual
            pPlayer.pev.renderfx = kRenderFxNone;
            pPlayer.pev.renderamt = 0;
            
            // Opcional: Avisar
            // g_PlayerFuncs.ClientPrint(pPlayer, HUD_PRINTCENTER, "God Mode terminado.\n");
        }
    }
}