Переписать FlashProtect под CS:GO

Тема в разделе "Программирование / Скриптинг", создана пользователем Иванчо Бальбовски, 24 июн 2016.

  1. Иванчо Бальбовски

    Иванчо Бальбовски Интернет в Норильск...Ну пожалуйста...

    Сообщения:
    487
    Симпатии:
    80
  2. Kailo

    Kailo

    Сообщения:
    28
    Симпатии:
    16
    В CS:GO, в отличии от CS:S, событие 'flashbang_detonate' вызывается до, 'player_blind', а m_flFlashDuration еще не установлена. Для решения я добавил RequestFrame() в событие 'flashbang_detonate'.
    P.S. Для теста писал маленький плагин, вот его код.
    Код:
    #include <sdkhooks>
    
    public void OnPluginStart()
    {
        HookEvent("player_blind", Event_Flash);
        HookEvent("flashbang_detonate", Event_Flash);
    }
    
    public void OnClientPutInServer(int client)
    {
        SDKHook(client, SDKHook_PostThinkPost, Hook_PostThinkPost);
    }
    
    public void Hook_PostThinkPost(int client)
    {
        PrintHintText(client, "m_flFlashDuration: %f", GetEntPropFloat(client, Prop_Send, "m_flFlashDuration"));
    }
    
    public void Event_Flash(Event event, const char[] name, bool dontBroadcast)
    {
        int client = GetClientOfUserId(event.GetInt("userid"));
        if (client != 0)
            PrintToChatAll("%s: userid %i, FlashDuration %f", name, event.GetInt("userid"), GetEntPropFloat(client, Prop_Send, "m_flFlashDuration"));
    }
    
    Изменения:
    • Теперь работает в CS:GO.
    • Переписал на новый синтаксис.
    • Нашел и исправил баг: при установке sm_flashprotect_message равной 0, не наносился урон игроку.
    • Добавил русский перевод.
    • Немного оптимизации: Убрал лишний буфер для времени ослепления; Добавил константу длины имени.
     

    Вложения:

    2 joints, 666FoX666, andrey19992 и ещё 1-му нравится это.
  3. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.000
    Симпатии:
    2.992
    @Kailo,
    PHP:
    public void Event_PlayerBlind(Event event, const char[] namebool dontBroadcast)
    {
        if (!
    GetConVarBool(g_hCvarEnable))
            return;
    А не оптимальней было бы анхукнуть события при отключении?

    PHP:
    for (int i 1<= MaxClientsi++)
            if (
    g_bFlashed[i] == true) {
                
    float flashTime GetEntPropFloat(iProp_Send"m_flFlashDuration");

                if (
    == client)
                    
    PrintToChat(client"[SM] %t""Self Flash"flashTime);
                else if (
    GetClientTeam(i) == GetClientTeam(client) && IsPlayerAlive(i)) {
                    
    count++;

                    
    char flashedName[MAX_NAME_LENGTH 1], flasherName[MAX_NAME_LENGTH 1];
                    
    GetClientName(iflashedNamesizeof(flashedName));
                    
    GetClientName(clientflasherNamesizeof(flasherName));

                    
    PrintToChat(i"[SM] %t""Flashed By"flasherNameflashTime);
                    
    PrintToChat(client"[SM] %t""You Flashed"flashedNameflashTime);

                    
    damage += RoundFloat(dps flashTime);
                }

                
    g_bFlashed[i] = false;
            }
    Зачем строки char flashedName[MAX_NAME_LENGTH + 1], flasherName[MAX_NAME_LENGTH + 1]; создавать в цикле, не очень оптимально.
     
  4. Kailo

    Kailo

    Сообщения:
    28
    Симпатии:
    16
    Исправил циклы и хуки.
     

    Вложения:

    andrey19992 нравится это.
  5. Иванчо Бальбовски

    Иванчо Бальбовски Интернет в Норильск...Ну пожалуйста...

    Сообщения:
    487
    Симпатии:
    80
    Благодарю, сейчас протестирую:)
     
  6. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.000
    Симпатии:
    2.992
    Оффтоп
     
  7. Иванчо Бальбовски

    Иванчо Бальбовски Интернет в Норильск...Ну пожалуйста...

    Сообщения:
    487
    Симпатии:
    80
    Да, вродетвсе работает, слэпает когда ослепляешь, в чат все пишется)
    Почему бы не создать тему плагина? Думаю, многим бы пригодился:)
     
  8. AS TRO

    AS TRO

    Сообщения:
    1.056
    Симпатии:
    509
    @Kailo, парнишка сверху дело говорит) выложи свое чудо в список плагинов :)
     
    Иванчо Бальбовски нравится это.
  9. andrey19992

    andrey19992

    Сообщения:
    301
    Симпатии:
    26
    поддерживаю, вечерком проверю а так давно искал такую штуку!!!
     
  10. MFS

    MFS

    Сообщения:
    1.310
    Симпатии:
    537
    Есть еще версия, которая не слапает, а просто не дает ослепить свою команду.
     

    Вложения:

  11. andrey19992

    andrey19992

    Сообщения:
    301
    Симпатии:
    26
    а можно версию которая дает ослепить свою команду и не слэпает?)))
    просто пишется кто ослепил
     
  12. Drumanid

    Drumanid Дилетант

    Сообщения:
    568
    Симпатии:
    194
    Держи мою версию...

    PHP:
    #pragma semicolon 1

    #include <sourcemod>
    #include <sdktools>
    #include <colors>

    new const String:PLUGIN_NAME[]= "WhoBangedMe?: Source";
    new const 
    String:PLUGIN_DESCRIPTION[]= "Tells who banged who,and ban";
    #define PLUGIN_VERSION "0.0.7.1"


    public Plugin:myinfo=
    {
        
    namePLUGIN_NAME,
        
    author"Alican,Vdova",
        
    descriptionPLUGIN_DESCRIPTION,
        
    versionPLUGIN_VERSION,
        
    url"http://www.sourcemod.net/"
    }

    new 
    Float:g_GameTime[MAXPLAYERS 1];
    new 
    tmbangcount[MAXPLAYERS+1];
    new 
    lastbanger;


    public 
    OnPluginStart()
    {   
        
    CreateConVar("whobangedmesource_version"PLUGIN_VERSION"WhoBangedMe?: Source Version"FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);
       
        
    CreateConVar("whobangedmesource_enable""1""WhoBangedMe? Source | Enable/disable."FCVAR_PLUGIN|FCVAR_NOTIFYtrue0.0true1.0);
        
    CreateConVar("whobangedmesource_tmonly""1""WhoBangedMe? Source | Tell to teammates only."FCVAR_PLUGIN|FCVAR_NOTIFYtrue0.0true1.0);
        
    CreateConVar("whobangedmesource_tmbanglimit""10""WhoBangedMe? Source | Punish player when bangs a teammate. 0: Off, 1: Instant slay, >=2: Slay after limit is reached"FCVAR_PLUGIN|FCVAR_NOTIFYtrue, -1.0true20.0);
       
        
    HookEvent("flashbang_detonate"Event_FlashbangDetonate);
        
    HookEvent("player_blind"Event_PlayerBlind);
    }


    public 
    OnClientPutInServer(client)
    {
        if(!
    Running()){return;}
        
    tmbangcount[client]= 0;
        return;
    }

    public 
    Event_FlashbangDetonate(Handle:event, const String:name[], bool:dontBroadcast)
    {
        if(!
    Running()){return;}
        
    lastbangerGetClientOfUserId(GetEventInt(event"userid"));
    }

    public 
    Event_PlayerBlind(Handle:event, const String:name[], bool:dontBroadcast)
    {
        if(!
    Running()){return;}
       
        new 
    victimGetClientOfUserId(GetEventInt(event"userid"));
        if(!
    IsPlayerAlive(victim))
            return;

        if(
    victim==0)
            return;
           
        if(
    IsFakeClient(victim))
            return;
           
        
    CreateTimer(0.01TimerWhoBangedvictim);   
    }


    public 
    Action:TimerWhoBanged(Handle:timerany:victim)
    {
        if(!
    IsClientInGame(lastbanger))
            return;

        if(
    lastbanger == || !IsPlayerAlive(lastbanger))
            return;
       
        if(
    victim==lastbanger)
        {
            return;
        }
        if(
    GetClientTeam(victim)==GetClientTeam(lastbanger))
            
    TMbang(lastbanger);
        if(!
    BConVar("tmonly") || (BConVar("tmonly") && GetClientTeam(victim)==GetClientTeam(lastbanger)))
            
    CPrintToChat(victim"Вас ослепил \x07%N!"lastbanger);
        return;
    }

    public 
    bool:Running()
    {
        return 
    GetConVarBool(FindConVar("whobangedmesource_enable"));
    }

    public 
    bool:BConVar(const String:subcv[])
    {
        new 
    String:ConVarName[32];
        
    Format(ConVarName32"whobangedmesource_%s"subcv);
        return 
    GetConVarBool(FindConVar(ConVarName));
    }

    public 
    IConVar(const String:subcv[])
    {
        new 
    String:ConVarName[32];
        
    Format(ConVarName32"whobangedmesource_%s"subcv);
        return 
    GetConVarInt(FindConVar(ConVarName));
    }

    public 
    TMbang(client)
    {   
        new 
    banglimitIConVar("tmbanglimit");
       
        if(
    banglimit==0)
        {
            return;
        }   
       
        if (!(
    GetUserFlagBits(client) & ADMFLAG_RESERVATION))
        {
            if(
    tmbangcount[client] != 0)
            {
                new 
    zzz RoundToFloor((GetGameTime() - g_GameTime[client]) / 30);
                
    tmbangcount[client] = tmbangcount[client] - zzz;
                if (
    tmbangcount[client] < 0)
                {
                    
    tmbangcount[client] = 0;
                }
            }
           
            
    tmbangcount[client]++;
           
            if(
    tmbangcount[client]>=banglimit)
            {   
                
    CPrintToChat(client"\x01Не слепи своих тиммейтов, а иначе получишь бан!");
            }
       
            
    g_GameTime[client] = GetGameTime();
        }
    }

    public 
    OnClientConnected(client)
    {
        
    g_GameTime[client] = 0.0;
    }
     
  13. andrey19992

    andrey19992

    Сообщения:
    301
    Симпатии:
    26
    Скомпилировал, ша попробую. Проблемки возникли с библиотекой color с её отсутствием :D, нашел, скомпилил, мож кому пригодится
    --- Добавлено позже ---
    не робит твой без слепа, робит от kailo
     

    Вложения:

    • colors.inc
      Размер файла:
      11,9 КБ
      Просмотров:
      1
    Последнее редактирование: 25 июн 2016
  14. Drumanid

    Drumanid Дилетант

    Сообщения:
    568
    Симпатии:
    194
    Как понимать без слепа?

    Ты просил...
    Игра какая? Если кс:го, то все отлично работает, стоит у меня на сервере.
     
  15. andrey19992

    andrey19992

    Сообщения:
    301
    Симпатии:
    26
    CSGO sm 1.7.2 то что Kailo скинул, плагин работает ток слепает аля отнимает HP при ослеплении
    --- Добавлено позже ---
    сам переделал плагин Kailo, терь хочу попробовать надпись красным цветом сделать
    --- Добавлено позже ---
    Вообщем переделал как хотел, работает, ошибок нет, но проблема то что в файле перевода постоянно выбирает анг. язык, В итоге кто с руками, переделайте нормально, я вообще не шарю как плагины писать, он работает но чувствую в плагине осталось много лишнего кода.
    (Убран слеп, добавлен цветной текс в сообщениях)
     

    Вложения:

    Последнее редактирование: 25 июн 2016
  16. Иванчо Бальбовски

    Иванчо Бальбовски Интернет в Норильск...Ну пожалуйста...

    Сообщения:
    487
    Симпатии:
    80
    Slap-"пнуть", когда ослепляешь своих, тебя пинает на опр.кол-во хп.
    По сабжу - может кто разовьет плагин до поддержки своего конфига? Чтобы можно было самому выбирать, что делать при ослеплении:
    А)Просто писать в чат, кто, кого и на сколько ослепил
    Б)Слэпать криворукого союзника, писать его в чат и на сколькл ослепил
    В)Не писать кто кого ослепил, просто пнуть виновника
    Так же квар, отвечающий за кол-во хп, отнимающее при ослеплении и максимальный порог хп у игрока, при котором его будет слэпать (сейчас в коде 20 хп, нужно вывести в конфиг)
    Предлагаю взять версию от Keilo в 4м посте (он более на оригинал похож), в нем уже покрасить чат.
    И создайте уже плагину топик)
     
  17. andrey19992

    andrey19992

    Сообщения:
    301
    Симпатии:
    26
    Забыл написать для тех кто будет перекомпилировать, у меня получилось нормально перекомпилировать с библиотеками от sm1.8.0 хотя плагин работает на 1.7.2