Skocz do zawartości
KoOsTeK

[Rozwiązane] BS Limiter lekka edycja.

Rekomendowane odpowiedzi

Cześć. Mam problem z pluginem od blokowania BS'ów.

Na serwerze podczas rozgrzewki wyskakują informacje o zablokowanym BS'ie. Często zdarza się tak że kończy się rozgrzewka i pokazuje komunikat, że gramy tylko B i za chwilę nowa runda i kolejny komunikat gramy tylko A i ludzie zdezorientowani...

Chciałbym się tego pozbyć i żeby blokowanie BS'a odpalane było dopiero przy starcie 1 rundy.

Ewentualnie czy ktoś może posiada inny plugin od blokowania bombsite'ów ?

 

Spoiler

#pragma semicolon 1
#include <sourcemod>    
#include <sdktools>
#include <cstrike>

#define    STANDARDMAPSMAX    7

new String:BSAL[1];
new EIBA = -1;
new EIBB = -1;
new Handle:Timer = INVALID_HANDLE;
new String:StandardMaps[STANDARDMAPSMAX][2][11] =
{    
    {
        "de_aztec","B"
    },
    {
        "de_chateau","A"
    },
    {
        "de_dust","A"
    },
    {
        "de_piranesi","A"
    },
    {
        "de_port","A"
    },
    {
        "de_prodigy","B"
    },
    {
        "de_tides","A"
    },
};

public Plugin:myinfo =
{
    name = "Bombsite Limiter",
    author = "Tomasz 'anacron' Motylinski",
    description = "Limiting Bomsites when due to low CT players.",
    version = "1.2.3",
    url = "http://anacron.pl/"
}
public OnPluginStart()
{
    HookEvent("round_freeze_end",Event_RoundFreezeEnd,EventHookMode_Post); 
    HookEvent("bomb_planted",Event_RoundEnd,EventHookMode_Post); 
    HookEvent("round_end",Event_RoundEnd,EventHookMode_Post); 
    CreateConVar("sm_bslimiter","1.2.3","Version Information",FCVAR_REPLICATED|FCVAR_NOTIFY);
}
stock bool:IsVecBetween(const Float:vecVector[3],const Float:vecMin[3],const Float:vecMax[3]) 

    return ( (vecMin[0] <= vecVector[0] <= vecMax[0]) && 
             (vecMin[1] <= vecVector[1] <= vecMax[1]) && 
             (vecMin[2] <= vecVector[2] <= vecMax[2])    ); 
}
public Message()
{
    PrintToChatAll(" \x04 [PZB]\x01 W drużynie CT jest za mało graczy - włączony tylko BombSite\x02 %s.",BSAL);
    PrintHintTextToAll("Podczas tej rundy włączony będzie tylko BombSite %s!",BSAL);
}
public Action:RepeatMessage(Handle:timer)
{
    Message();
}
public Action:Event_RoundFreezeEnd (Handle:event,const String:name[],bool:dontBroadcast)
{
    if(IsValidEntity(EIBA)) 
    {
        EIBA = -1;
    }
    if(IsValidEntity(EIBB)) 
    {
        EIBB = -1;
    }
    if(Timer != INVALID_HANDLE)
    {
        CloseHandle(Timer);
        Timer = INVALID_HANDLE;
    }

    new Float:VBCPA[3]; 
    new Float:VBCPB[3]; 
    new EI = -1;
    
    EI = FindEntityByClassname(EI,"cs_player_manager");
    
    if(IsValidEntity(EI)) 
    { 
        GetEntPropVector(EI,Prop_Send,"m_bombsiteCenterA",VBCPA); 
        GetEntPropVector(EI,Prop_Send,"m_bombsiteCenterB",VBCPB); 
    } 
    
    EI = -1; 
    EI = FindEntityByClassname(EI,"func_bomb_target");
    
    while(IsValidEntity(EI)) 
    { 
        new Float:VBMin[3]; 
        new Float:VBMax[3]; 
         
        GetEntPropVector(EI,Prop_Send,"m_vecMins",VBMin); 
        GetEntPropVector(EI,Prop_Send,"m_vecMaxs",VBMax); 
         
        if (IsVecBetween(VBCPA,VBMin,VBMax)) 
        { 
            EIBA = EI; 
        } 
        else if (IsVecBetween(VBCPB,VBMin,VBMax)) 
        { 
            EIBB = EI; 
        } 
        EI = FindEntityByClassname(EI,"func_bomb_target");
    }
    
    if(IsValidEntity(EIBA) && IsValidEntity(EIBB))
    {
        new CTPlayers = GetTeamClientCount(CS_TEAM_CT);
        new TTPlayers = GetTeamClientCount(CS_TEAM_T);

        if(((CTPlayers > TTPlayers) && (TTPlayers == 1 || CTPlayers > 3)) || CTPlayers > 4)
        {
            AcceptEntityInput(EIBB,"Enable");
            AcceptEntityInput(EIBA,"Enable");
            BSAL = "";
            PrintHintTextToAll("Wszystkie BombSite'y są dostępne w tej rundzie!");
            PrintCenterTextAll("Wszystkie BombSite'y są dostępne w tej rundzie!");
        }
        else
        {
            if(GetRandomInt(1,2) == 1)
            {
                AcceptEntityInput(EIBA,"Disable");
                AcceptEntityInput(EIBB,"Enable");
                BSAL = "B";
            }
            else
            {
                AcceptEntityInput(EIBB,"Disable");
                AcceptEntityInput(EIBA,"Enable");
                BSAL = "A";
            }
            decl String:CurrentMap[256];
            GetCurrentMap(CurrentMap,sizeof(CurrentMap));
            for(new i=0; i<STANDARDMAPSMAX; i++)
            {
                if(StrEqual(CurrentMap,StandardMaps[0],false)) 
                {
                    if(StrEqual(StandardMaps[1],"B",false))
                    {
                        AcceptEntityInput(EIBA,"Disable");
                        AcceptEntityInput(EIBB,"Enable");
                        BSAL = "B";
                    }
                    else
                    {
                        AcceptEntityInput(EIBB,"Disable");
                        AcceptEntityInput(EIBA,"Enable");
                        BSAL = "A";
                    }
                }
            }
            if(GetClientCount(true) > 1)
            {
                Message();
                Timer = CreateTimer(30.0,RepeatMessage, _,TIMER_REPEAT); 
            }
        }
    }
}
public Action:Event_RoundEnd (Handle:event,const String:name[],bool:dontBroadcast)
{
    if(Timer != INVALID_HANDLE)
    {
        CloseHandle(Timer);
        Timer = INVALID_HANDLE;
    }
    if(IsValidEntity(EIBA)) 
    {
        AcceptEntityInput(EIBA,"Enable");
        EIBA = -1;
    }
    if(IsValidEntity(EIBB)) 
    {
        AcceptEntityInput(EIBB,"Enable");
        EIBB = -1;
    }
}

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość
stock bool IsWarmup() {
    int warmup = GameRules_GetProp("m_bWarmupPeriod", 4, 0);
    if(warmup == 1) 
		return true;
	return false;
} 

 

Spróbuj sobie to dodać na sam spód, a potem wywołać if(!IsWarmup()) na początku funkcji, która ogarnia BS'y 🙂 Jak sobie nie poradzisz, to daj znaka 😉 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Napisano (edytowane)

A cholera nie mogę skminić 😄 sto tysięcy prób i nic mi nie wychodzi. Siedzę już nad tym trochę czasu ale nie mogę skminić.

Poczytałem co nieco ale jednak jestem mega zielony w te klocki. Need help ❤️

Edytowane przez KoOsTeK

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość
Napisano (edytowane)
Spoiler

 


#pragma semicolon 1
#include <sourcemod>    
#include <sdktools>
#include <cstrike>

#define    STANDARDMAPSMAX    7

new String:BSAL[1];
new EIBA = -1;
new EIBB = -1;
new Handle:Timer = INVALID_HANDLE;
new String:StandardMaps[STANDARDMAPSMAX][2][11] =
{    
    {
        "de_aztec","B"
    },
    {
        "de_chateau","A"
    },
    {
        "de_dust","A"
    },
    {
        "de_piranesi","A"
    },
    {
        "de_port","A"
    },
    {
        "de_prodigy","B"
    },
    {
        "de_tides","A"
    },
};

public Plugin:myinfo = {
    name = "Bombsite Limiter",
    author = "Tomasz 'anacron' Motylinski",
    description = "Limiting Bomsites when due to low CT players.",
    version = "1.2.3",
    url = "http://anacron.pl/"
}

public OnPluginStart() {
    HookEvent("round_freeze_end",Event_RoundFreezeEnd,EventHookMode_Post); 
    HookEvent("bomb_planted",Event_RoundEnd,EventHookMode_Post); 
    HookEvent("round_end",Event_RoundEnd,EventHookMode_Post); 
    CreateConVar("sm_bslimiter","1.2.3","Version Information",FCVAR_REPLICATED|FCVAR_NOTIFY);
}
stock bool:IsVecBetween(const Float:vecVector[3],const Float:vecMin[3],const Float:vecMax[3]) 
{ 
    return ( (vecMin[0] <= vecVector[0] <= vecMax[0]) && 
             (vecMin[1] <= vecVector[1] <= vecMax[1]) && 
             (vecMin[2] <= vecVector[2] <= vecMax[2])    ); 
}
public Message()
{
    PrintToChatAll(" \x04 [PZB]\x01 W drużynie CT jest za mało graczy - włączony tylko BombSite\x02 %s.",BSAL);
    PrintHintTextToAll("Podczas tej rundy włączony będzie tylko BombSite %s!",BSAL);
}
public Action:RepeatMessage(Handle:timer)
{
    Message();
}
public Action:Event_RoundFreezeEnd (Handle:event,const String:name[],bool:dontBroadcast)
{
    if(!IsWarmup()) {
        if(IsValidEntity(EIBA)) 
        {
            EIBA = -1;
        }
        if(IsValidEntity(EIBB)) 
        {
            EIBB = -1;
        }
        if(Timer != INVALID_HANDLE)
        {
            CloseHandle(Timer);
            Timer = INVALID_HANDLE;
        }
    
        new Float:VBCPA[3]; 
        new Float:VBCPB[3]; 
        new EI = -1;
        
        EI = FindEntityByClassname(EI,"cs_player_manager");
        
        if(IsValidEntity(EI)) 
        { 
            GetEntPropVector(EI,Prop_Send,"m_bombsiteCenterA",VBCPA); 
            GetEntPropVector(EI,Prop_Send,"m_bombsiteCenterB",VBCPB); 
        } 
        
        EI = -1; 
        EI = FindEntityByClassname(EI,"func_bomb_target");
        
        while(IsValidEntity(EI)) 
        { 
            new Float:VBMin[3]; 
            new Float:VBMax[3]; 
             
            GetEntPropVector(EI,Prop_Send,"m_vecMins",VBMin); 
            GetEntPropVector(EI,Prop_Send,"m_vecMaxs",VBMax); 
             
            if (IsVecBetween(VBCPA,VBMin,VBMax)) 
            { 
                EIBA = EI; 
            } 
            else if (IsVecBetween(VBCPB,VBMin,VBMax)) 
            { 
                EIBB = EI; 
            } 
            EI = FindEntityByClassname(EI,"func_bomb_target");
        }
        
        if(IsValidEntity(EIBA) && IsValidEntity(EIBB))
        {
            new CTPlayers = GetTeamClientCount(CS_TEAM_CT);
            new TTPlayers = GetTeamClientCount(CS_TEAM_T);
    
            if(((CTPlayers > TTPlayers) && (TTPlayers == 1 || CTPlayers > 3)) || CTPlayers > 4)
            {
                AcceptEntityInput(EIBB,"Enable");
                AcceptEntityInput(EIBA,"Enable");
                BSAL = "";
                PrintHintTextToAll("Wszystkie BombSite'y są dostępne w tej rundzie!");
                PrintCenterTextAll("Wszystkie BombSite'y są dostępne w tej rundzie!");
            }
            else
            {
                if(GetRandomInt(1,2) == 1)
                {
                    AcceptEntityInput(EIBA,"Disable");
                    AcceptEntityInput(EIBB,"Enable");
                    BSAL = "B";
                }
                else
                {
                    AcceptEntityInput(EIBB,"Disable");
                    AcceptEntityInput(EIBA,"Enable");
                    BSAL = "A";
                }
                char CurrentMap[256];
                GetCurrentMap(CurrentMap,sizeof(CurrentMap));
                for(new i=0; i<STANDARDMAPSMAX; i++)
                {
                    if(StrEqual(CurrentMap,StandardMaps[i][0],false))
                    {
                        if(StrEqual(StandardMaps[i][1],"B",false))
                        {
                            AcceptEntityInput(EIBA,"Disable");
                            AcceptEntityInput(EIBB,"Enable");
                            BSAL = "B";
                        }
                        else
                        {
                            AcceptEntityInput(EIBB,"Disable");
                            AcceptEntityInput(EIBA,"Enable");
                            BSAL = "A";
                        }
                    }
                }
                if(GetClientCount(true) > 1)
                {
                    Message();
                    Timer = CreateTimer(30.0,RepeatMessage, _,TIMER_REPEAT); 
                }
            }
        }
    }
}
public Action:Event_RoundEnd (Handle:event,const String:name[],bool:dontBroadcast)
{
    if(Timer != INVALID_HANDLE)
    {
        CloseHandle(Timer);
        Timer = INVALID_HANDLE;
    }
    if(IsValidEntity(EIBA)) 
    {
        AcceptEntityInput(EIBA,"Enable");
        EIBA = -1;
    }
    if(IsValidEntity(EIBB)) 
    {
        AcceptEntityInput(EIBB,"Enable");
        EIBB = -1;
    }
}

stock bool IsWarmup() {
    int warmup = GameRules_GetProp("m_bWarmupPeriod", 4, 0);
    if(warmup == 1) 
        return true;
    return false;
} 

 

 

 

Ale obiecaj, że nie użyjesz, do póki nie zrozumiesz o co w tym chodzi! 😄 

Edytowane przez Gość

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No nie inaczej! Od jutra nauka, nauka i jeszcze raz nauka.

Dzięki mistrzu! Działa jak należy.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wiadomość wygenerowana automatycznie

 

Problem został rozwiązany

Jeżeli się z tym nie zgadzasz, raportuj ten post

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.

×
×
  • Dodaj nową pozycję...