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

Kailo

Участник
Сообщения
194
Реакции
896
В CS:GO, в отличии от CS:S, событие 'flashbang_detonate' вызывается до, 'player_blind', а m_flFlashDuration еще не установлена. Для решения я добавил RequestFrame() в событие 'flashbang_detonate'.
P.S. Для теста писал маленький плагин, вот его код.
C-подобный:
#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, не наносился урон игроку.
  • Добавил русский перевод.
  • Немного оптимизации: Убрал лишний буфер для времени ослепления; Добавил константу длины имени.
 

Вложения

  • flashprotect.sp
    4.2 КБ · Просмотры: 20
  • flashprotect.smx
    6.4 КБ · Просмотры: 5
  • flashprotect.phrases.txt
    652 байт · Просмотры: 10

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #3
@Kailo,
PHP:
public void Event_PlayerBlind(Event event, const char[] name, bool dontBroadcast)
{
    if (!GetConVarBool(g_hCvarEnable))
        return;
А не оптимальней было бы анхукнуть события при отключении?

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

            if (i == 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(i, flashedName, sizeof(flashedName));
                GetClientName(client, flasherName, sizeof(flasherName));

                PrintToChat(i, "[SM] %t", "Flashed By", flasherName, flashTime);
                PrintToChat(client, "[SM] %t", "You Flashed", flashedName, flashTime);

                damage += RoundFloat(dps * flashTime);
            }

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

Kailo

Участник
Сообщения
194
Реакции
896
Исправил циклы и хуки.
 

Вложения

  • flashprotect.sp
    4.5 КБ · Просмотры: 21
  • flashprotect.smx
    6.6 КБ · Просмотры: 12
  • flashprotect.phrases.txt
    652 байт · Просмотры: 18

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #6
Оффтоп
 

wayLANder

Где AlmazON?
Сообщения
1,742
Реакции
577
Да, вродетвсе работает, слэпает когда ослепляешь, в чат все пишется)
Почему бы не создать тему плагина? Думаю, многим бы пригодился:)
 

AS TRO

Участник
Сообщения
1,159
Реакции
750
@Kailo, парнишка сверху дело говорит) выложи свое чудо в список плагинов :)
 

andrey19992

Участник
Сообщения
487
Реакции
101
поддерживаю, вечерком проверю а так давно искал такую штуку!!!
 

MFS

Участник
Сообщения
1,533
Реакции
787
Есть еще версия, которая не слапает, а просто не дает ослепить свою команду.
 

Вложения

  • csgo_anti_team_flash.smx
    8.7 КБ · Просмотры: 4
  • csgo_anti_team_flash.sp
    9.5 КБ · Просмотры: 9

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
а можно версию которая дает ослепить свою команду и не слэпает?)))
просто пишется кто ослепил
Держи мою версию...

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=
{
    name= PLUGIN_NAME,
    author= "Alican,Vdova",
    description= PLUGIN_DESCRIPTION,
    version= PLUGIN_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_NOTIFY, true, 0.0, true, 1.0);
    CreateConVar("whobangedmesource_tmonly", "1", "WhoBangedMe? Source | Tell to teammates only.", FCVAR_PLUGIN|FCVAR_NOTIFY, true, 0.0, true, 1.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_NOTIFY, true, -1.0, true, 20.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;}
    lastbanger= GetClientOfUserId(GetEventInt(event, "userid"));
}

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

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


public Action:TimerWhoBanged(Handle:timer, any:victim)
{
    if(!IsClientInGame(lastbanger))
        return;

    if(lastbanger == 0 || !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(ConVarName, 32, "whobangedmesource_%s", subcv);
    return GetConVarBool(FindConVar(ConVarName));
}

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

public TMbang(client)
{   
    new banglimit= IConVar("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;
}
 

andrey19992

Участник
Сообщения
487
Реакции
101
Держи мою версию...

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=
{
    name= PLUGIN_NAME,
    author= "Alican,Vdova",
    description= PLUGIN_DESCRIPTION,
    version= PLUGIN_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_NOTIFY, true, 0.0, true, 1.0);
    CreateConVar("whobangedmesource_tmonly", "1", "WhoBangedMe? Source | Tell to teammates only.", FCVAR_PLUGIN|FCVAR_NOTIFY, true, 0.0, true, 1.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_NOTIFY, true, -1.0, true, 20.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;}
    lastbanger= GetClientOfUserId(GetEventInt(event, "userid"));
}

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

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


public Action:TimerWhoBanged(Handle:timer, any:victim)
{
    if(!IsClientInGame(lastbanger))
        return;

    if(lastbanger == 0 || !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(ConVarName, 32, "whobangedmesource_%s", subcv);
    return GetConVarBool(FindConVar(ConVarName));
}

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

public TMbang(client)
{  
    new banglimit= IConVar("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;
}

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

Вложения

  • colors.inc
    11.9 КБ · Просмотры: 2
Последнее редактирование:

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748

andrey19992

Участник
Сообщения
487
Реакции
101
Как понимать без слепа?

Ты просил...



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

Вложения

  • flashprotect.phrases.txt
    897 байт · Просмотры: 6
  • flashprotect.smx
    7 КБ · Просмотры: 5
  • flashprotect.sp
    3.7 КБ · Просмотры: 7
Последнее редактирование:

wayLANder

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

andrey19992

Участник
Сообщения
487
Реакции
101
Забыл написать для тех кто будет перекомпилировать, у меня получилось нормально перекомпилировать с библиотеками от sm1.8.0 хотя плагин работает на 1.7.2
 
Сверху Снизу