/*
 * Sourcemod War Plugin
 */

//includes
#include <cstrike>
#include <sourcemod>
#include <sdktools>
#include <morecolors>

//Compiler Options
#pragma semicolon 1

//defines
#define YELLOW 0x01
#define GREEN 0x04
#define LIGHTGREEN 0x03


new nochzeitfuercts;
new waffenstillstandtimer;
new maxzeit;
new votecount;
new WarRound;
new RoundLimits;

new Handle:LimitTimer;
new Handle:HideTimer;
new Handle:WeaponTimer;
new Handle:WarMenu;
new Handle:maxzeitc;
new Handle:nochzeitfuerctsc;
new Handle:waffenstillstandtimerc;
new Handle:RoundLimitsc;

new bool:IsWar;
new bool:StartWar;

new String:voted[1500];

new Float:Pos[3];

public OnPluginStart()
{
    CreateConVar("krieg_ver", "1.0", "Krieg Version by Floody.de", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);
    maxzeitc = CreateConVar("krieg_maxzeit", "200", "Maximum time for one round war");
    nochzeitfuerctsc = CreateConVar("krieg_verstecken", "45", "Time to hide");
    waffenstillstandtimerc = CreateConVar("krieg_waffenstillstand", "15", "Zeit nach Verstecken, wo Waffenstillstand ist");
    RoundLimitsc = CreateConVar("krieg_rundenlimit", "15", "Runden nach Krieg oder Mapstart bis Krieg gestartet werden kann");
    
    AutoExecConfig(true, "krieg");

    IsWar = false;
    StartWar = false;
    votecount = 0;
    WarRound = 0;
    
    HookEvent("round_start", RoundStart);
    HookEvent("player_say", PlayerSay);
    HookEvent("round_end", RoundEnd);
}

public OnMapStart()
{
    //new String:voted[1500];

    votecount = 0;
    WarRound = 0;
    IsWar = false;
    StartWar = false;
    RoundLimits = 0;
    
    nochzeitfuercts = GetConVarInt(nochzeitfuerctsc);
    waffenstillstandtimer = GetConVarInt(waffenstillstandtimerc);
    maxzeit = GetConVarInt(maxzeitc);
}

public OnConfigsExecuted()
{
    maxzeit = GetConVarInt(maxzeitc);
    nochzeitfuercts = GetConVarInt(nochzeitfuerctsc);
    waffenstillstandtimer = GetConVarInt(waffenstillstandtimerc);
    RoundLimits = 0;
}

public RoundEnd(Handle:event, String:name[], bool:dontBroadcast)
{
    new winner = GetEventInt(event, "winner");
    
    if (IsWar)
    {
        for(new client=1; client <= MaxClients; client++)
        {
            if (IsClientInGame(client)) SetEntData(client, FindSendPropOffs("CBaseEntity", "m_CollisionGroup"), 0, 4, true);
        }
        
        if (LimitTimer != INVALID_HANDLE) KillTimer(LimitTimer);
        if (HideTimer != INVALID_HANDLE) KillTimer(HideTimer);
        if (WeaponTimer != INVALID_HANDLE) KillTimer(WeaponTimer);
        
        maxzeit = GetConVarInt(maxzeitc);
        
        if (winner == 2) PrintCenterTextAll("Terroristen Gewinnen!!");
        if (winner == 3) PrintCenterTextAll("Counter-Terroristen Gewinnen!!");

        if (WarRound == 3)
        {
            IsWar = false;
            WarRound = 0;
            Format(voted, sizeof(voted), "");
            CPrintToChatAll("{azure}[GB]: {default}Krieg Ende", LIGHTGREEN, YELLOW, LIGHTGREEN, GREEN);
        }
    }
}

public RoundStart(Handle:event, String:name[], bool:dontBroadcast)
{
    if (StartWar || IsWar)
    {
        WarRound++;
        IsWar = true;
        StartWar = false;
        
        WarMenu = CreatePanel();
        DrawPanelText(WarMenu, "Krieg ist aktiv");
        if (WarRound == 1) DrawPanelText(WarMenu, "Runde 1 von 3");
        if (WarRound == 2) DrawPanelText(WarMenu, "Runde 2 von 3");
        if (WarRound == 3) DrawPanelText(WarMenu, "Runde 3 von 3");
        DrawPanelText(WarMenu, "Nicht wundern falls ihr in der Luft hängt");
        DrawPanelText(WarMenu, "-----------------------------------");
        DrawPanelText(WarMenu, "In Kriegrunden spielen CT's gegen T's");
        DrawPanelText(WarMenu, "                                ");
        DrawPanelText(WarMenu, "- In der Waffenstillstandsphase darf man schon aus der Waffenkammer!");
        DrawPanelText(WarMenu, "- Alle normalen Jailregeln sind dabei aufgehoben!");
        DrawPanelText(WarMenu, "- Buchstaben-, Yard- und Waffenkammercampen ist verboten!");
        DrawPanelText(WarMenu, "- Der letzte Terrorist hat keinen Wunsch!");
        DrawPanelText(WarMenu, "- Jeder darf überall hin wo er will!");
        DrawPanelText(WarMenu, "-----------------------------------");
        DrawPanelText(WarMenu, "0. Schließen");
        
        new RandomCT = 0;

        for(new client=1; client <= MaxClients; client++)
        {
            if (IsClientInGame(client))
            {
                if (GetClientTeam(client) == 3) 
                {
                    RandomCT = client;
                    break;
                }
            }
        }
        if (RandomCT)
        {    
            new Float:Pos1[3];
            
            GetClientAbsOrigin(RandomCT, Pos);
            GetClientAbsOrigin(RandomCT, Pos1);
            
            Pos[2] = Pos[2] + 45;
            
            if (WarRound == 1)
            {
                for(new client=1; client <= MaxClients; client++)
                {
                    if (IsClientInGame(client))
                    {
                        if (GetClientTeam(client) == 3)
                        {
                            GivePlayerItem(client, "weapon_m4a1");
                            GivePlayerItem(client, "weapon_deagle");
                            GivePlayerItem(client, "weapon_hegrenade");
                            TeleportEntity(client, Pos1, NULL_VECTOR, NULL_VECTOR);
                        }
                        if (GetClientTeam(client) == 2)
                        {
                            SetEntityMoveType(client, MOVETYPE_NONE);
                            TeleportEntity(client, Pos, NULL_VECTOR, NULL_VECTOR);
                        }
                    }
                }
                CPrintToChatAll("{azure}[GB]: {default}Runde {fullred}1 {default}von {fullred}3", LIGHTGREEN, YELLOW, LIGHTGREEN, GREEN, LIGHTGREEN, GREEN, LIGHTGREEN);
            }
            if (WarRound == 2)
            {
                for(new client=1; client <= MaxClients; client++)
                {
                    if (IsClientInGame(client))
                    {
                        if (GetClientTeam(client) == 2)
                        {
                            TeleportEntity(client, Pos1, NULL_VECTOR, NULL_VECTOR);
                            GivePlayerItem(client, "weapon_m4a1");
                            GivePlayerItem(client, "weapon_deagle");
                            GivePlayerItem(client, "weapon_hegrenade");
                        }
                        if (GetClientTeam(client) == 3)
                        {
                            SetEntityMoveType(client, MOVETYPE_NONE);
                            TeleportEntity(client, Pos, NULL_VECTOR, NULL_VECTOR);
                        }
                    }
                }
                CPrintToChatAll("{azure}[GB]: {default}Runde {fullred}2 {default}von {fullred}3", LIGHTGREEN, YELLOW, LIGHTGREEN, GREEN, LIGHTGREEN, GREEN, LIGHTGREEN);
            }
            
            if (WarRound == 3)
            {
                for(new client=1; client <= MaxClients; client++)
                {
                    if (IsClientInGame(client))
                    {
                        if (GetClientTeam(client) == 3)
                        {
                            GivePlayerItem(client, "weapon_m4a1");
                            GivePlayerItem(client, "weapon_deagle");
                            GivePlayerItem(client, "weapon_hegrenade");
                            TeleportEntity(client, Pos1, NULL_VECTOR, NULL_VECTOR);
                        }
                        if (GetClientTeam(client) == 2)
                        {
                            SetEntityMoveType(client, MOVETYPE_NONE);
                            TeleportEntity(client, Pos, NULL_VECTOR, NULL_VECTOR);
                        }
                    }
                }
                CPrintToChatAll("{azure}[GB]: {default}Runde {fullred}3 {default}von {fullred}3", LIGHTGREEN, YELLOW, LIGHTGREEN, GREEN, LIGHTGREEN, GREEN, LIGHTGREEN);
            }
            for(new client=1; client <= MaxClients; client++)
            {
                if (IsClientInGame(client)) 
                {
                    SetEntData(client, FindSendPropOffs("CBaseEntity", "m_CollisionGroup"), 2, 4, true);
                    SendPanelToClient(WarMenu, client, Pass, 30);
                    SetEntProp(client, Prop_Data, "m_takedamage", 0, 1);
                }
            }
            
            nochzeitfuercts--;
            maxzeit--;
            
            LimitTimer = CreateTimer(1.0, RestTime, _, TIMER_REPEAT);
            HideTimer = CreateTimer(1.0, Hide, _, TIMER_REPEAT);
        }
    }
    else
    {
        if (RoundLimits > 0) RoundLimits--;
    }
}

public Pass(Handle:menu, MenuAction:action, param1, param2)
{
}

public Action:RestTime(Handle:timer)
{
    maxzeit--;
    
    if (maxzeit == 60) PrintCenterTextAll("60 Sekunden verbleiben");
    if (maxzeit == 30) PrintCenterTextAll("30 Sekunden verbleiben");
    if (maxzeit == 10) PrintCenterTextAll("10 Sekunden verbleiben");
    if (maxzeit == 3) PrintCenterTextAll("3 Sekunden verbleiben");
    if (maxzeit == 2) PrintCenterTextAll("2 Sekunden verbleiben");
    if (maxzeit == 1) PrintCenterTextAll("1 Sekunde verbleibt");
    if (maxzeit == 0) 
    {
        new randomnumber = GetRandomInt(2, 3);
        CPrintToChatAll("{azure}[GB]: {default}Ende von Krieg ein zufälliges Team wird getötet!", LIGHTGREEN, YELLOW, LIGHTGREEN, GREEN, GREEN, LIGHTGREEN);
        
        for(new client=1; client <= MaxClients; client++)
        {
            if (IsClientInGame(client) && IsPlayerAlive(client) && GetClientTeam(client) == randomnumber) SlapPlayer(client, 500, false);    
        }
    }
    
    PrintHintTextToAll("%i Sekunden verbleiben", maxzeit);
    
    if (IsWar) return Plugin_Continue;
    
    maxzeit = GetConVarInt(maxzeitc);
    
    LimitTimer = INVALID_HANDLE;
    
    return Plugin_Stop;
}

public Action:Hide(Handle:timer)
{
    if (nochzeitfuercts > 1)
    {
        nochzeitfuercts--;
        
        PrintCenterTextAll("%i Sekunden Zeit zum verstecken", nochzeitfuercts);
        
        return Plugin_Continue;
    }
    
    Pos[2] = Pos[2] - 45;
    
    nochzeitfuercts = GetConVarInt(nochzeitfuerctsc);
    
    if (WarRound == 1)
    {
        for (new client=1; client <= MaxClients; client++)
        {
            if (IsClientInGame(client) && IsPlayerAlive(client))
            {
                if (GetClientTeam(client) == 2)
                {
                    SetEntityMoveType(client, MOVETYPE_WALK);
                    TeleportEntity(client, Pos, NULL_VECTOR, NULL_VECTOR);
                    GivePlayerItem(client, "weapon_m4a1");
                    GivePlayerItem(client, "weapon_deagle");
                    GivePlayerItem(client, "weapon_hegrenade");
                    GivePlayerItem(client, "weapon_knife");
                }
            }
        }
    }
    if (WarRound == 2)
    {
        for(new client=1; client <= MaxClients; client++)
        {
            if (IsClientInGame(client) && IsPlayerAlive(client))
            {
                if (GetClientTeam(client) == 3)
                {
                    SetEntityMoveType(client, MOVETYPE_WALK);
                    TeleportEntity(client, Pos, NULL_VECTOR, NULL_VECTOR);
                    GivePlayerItem(client, "weapon_m4a1");
                    GivePlayerItem(client, "weapon_deagle");
                    GivePlayerItem(client, "weapon_hegrenade");
                    GivePlayerItem(client, "weapon_knife");
                }
            }
        }
    }
    if (WarRound == 3)
    {
        for (new client=1; client <= MaxClients; client++)
        {
            if (IsClientInGame(client) && IsPlayerAlive(client))
            {
                if (GetClientTeam(client) == 2)
                {
                    SetEntityMoveType(client, MOVETYPE_WALK);
                    TeleportEntity(client, Pos, NULL_VECTOR, NULL_VECTOR);
                    GivePlayerItem(client, "weapon_m4a1");
                    GivePlayerItem(client, "weapon_deagle");
                    GivePlayerItem(client, "weapon_hegrenade");
                    GivePlayerItem(client, "weapon_knife");
                }
            }
        }
    }

    WeaponTimer = CreateTimer(1.0, NoWeapon, _, TIMER_REPEAT);
    
    HideTimer = INVALID_HANDLE;
    
    return Plugin_Stop;
}

public Action:NoWeapon(Handle:timer)
{
    if (waffenstillstandtimer > 1)
    {
        waffenstillstandtimer--;
        
        PrintCenterTextAll("%i Sekunden Waffenstillstand", waffenstillstandtimer);
        
        return Plugin_Continue;
    }
    
    waffenstillstandtimer = GetConVarInt(waffenstillstandtimerc);
    
    PrintCenterTextAll("Los Gehts!!");
    
    for(new client=1; client <= MaxClients; client++) 
    {
        if (IsClientInGame(client) && IsPlayerAlive(client)) SetEntProp(client, Prop_Data, "m_takedamage", 2, 1);
    }

    CPrintToChatAll("{azure}[GB]: {default}Los Gehts!", LIGHTGREEN, YELLOW, LIGHTGREEN, GREEN);
    
    WeaponTimer = INVALID_HANDLE;
    
    return Plugin_Stop;
}

public PlayerSay(Handle:event, String:name[], bool:dontBroadcast)
{
    decl String:text[256];
    decl String:steamid[64];
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    
    GetClientAuthString(client, steamid, sizeof(steamid));
    GetEventString(event, "text", text, sizeof(text));
    
    if (StrEqual(text, "!krieg"))
    {
        if (GetTeamClientCount(3) > 0)
        {
            if (RoundLimits == 0)
            {
                if (!IsWar && !StartWar)
                {
                    if (StrContains(voted, steamid, true) == -1)
                    {
                        new playercount = (GetClientCount(true) / 2);
                        
                        votecount++;
                        
                        new Missing = playercount - votecount + 1;
                        
                        Format(voted, sizeof(voted), "%s,%s", voted, steamid);
                        
                        if (votecount > playercount)
                        {
                            StartWar = true;
                            
                            RoundLimits = GetConVarInt(RoundLimitsc);
                            votecount = 0;
                            
                            CPrintToChatAll("{azure}[GB]: {default} Nächste Runde ist Krieg!", LIGHTGREEN, YELLOW, LIGHTGREEN, GREEN, LIGHTGREEN);
                        }
                        else CPrintToChatAll("{azure}[GB]: {default}Es fehlen noch {fullred}%i {default}Vote(s) bis Krieg beginnt!", LIGHTGREEN, YELLOW, LIGHTGREEN, GREEN, Missing, LIGHTGREEN);
                        
                    }
                    else CPrintToChat(client, "{azure}[GB]: {default}Du hast schon gevoted", LIGHTGREEN, YELLOW, LIGHTGREEN, GREEN, LIGHTGREEN);
                }
                else CPrintToChat(client, "{azure}[GB]: {default}Krieg hat schon begonnen", LIGHTGREEN, YELLOW, LIGHTGREEN, GREEN, LIGHTGREEN);
            }
            else CPrintToChat(client, "{azure}[GB]: {default}Du musst noch {fullred}%i {default}Runden warten", LIGHTGREEN, YELLOW, LIGHTGREEN, GREEN, LIGHTGREEN, RoundLimits);
        }
        else CPrintToChat(client, "{azure}[GB]: {default}Krieg braucht {fullred}1 {default}CT", LIGHTGREEN, YELLOW, LIGHTGREEN, GREEN, LIGHTGREEN);
    }
}

public OnMapEnd()
{
    IsWar = false;
    StartWar = false;
    votecount = 0;
    WarRound = 0;
    
    voted[0] = '\0';
}