Eazy Spawn Protector 1.0.1

Простой плагин защиты игроков в начале раунда.

  1. jasmine

    jasmine

    Сообщения:
    234
    Симпатии:
    105
    Пользователь jasmine разместил новый ресурс:

    Eazy Spawn Protector - Простой плагин защиты игроков в начале раунда.

    Узнать больше об этом ресурсе...
     
  2. Kr1kuzya

    Kr1kuzya Костылизируя некостылизируемое Модератор

    Сообщения:
    3.140
    Симпатии:
    2.602
    PHP:
    public OnClientPostAdminCheck(int client)
    {
        
    SDKHook(clientSDKHook_OnTakeDamageOnTakeDamage); 
    }
    Есть вероятность того, что это событие никогда не вызовется, если какой-то плагин пытается вручную хандлить авторизации админов.

    И можно вообще без хуков.
    PHP:
    #include <sourcemod>

    #pragma newdecls required
    #pragma semicolon 1

    #define ForPlayer(%0)   for (int %0 = MaxClients; %0 != 0; --%0) if (IsClientInGame(%0))
    #define IntToFloat(%0)  (%0 * 1.0)

    /**
     * from shareddefs.h
     */
    enum {
        
    No          0,    /**< Block any damage */
        
    EventsOnly  1,    /**< Block any damage, but call damage functions */
        
    Yes         2,    /**< Do not block damage */
        
    AIM         3     /**< ??? */
    }

    /**
     * @section Global variables
     */
    int     g_iProtectTime;
    Handle  g_hProtectTime;

    /**
     * @section Plugin information
     */
    public Plugin myinfo = {
        
    description "Simple plugin for protect clients from any damage after round start",
        
    version     "1.0",
        
    author      "CrazyHackGUT aka Kruzya",
        
    name        "Spawn Protection",
        
    url         "https://kruzefag.ru/"
    };

    /**
     * @section SourceMod core events
     */
    public void OnPluginStart() {
        
    HookConVarChange((g_hProtectTime CreateConVar("sm_spawnprotect_time""7""Protect time")), OnCvarChanged);
        
    HookEvent("round_start"OnRoundStartEventHookMode_Post);
    }

    public 
    void OnConfigsExecuted() {
        
    g_iProtectTime GetConVarInt(g_hProtectTime);
    }

    /**
     * @section ConVar hook
     */
    public void OnCvarChanged(Handle hCvar, const char[] szOV, const char[] szNV) {
        
    g_iProtectTime GetConVarInt(g_hProtectTime);
    }

    /**
     * @section Game events hooks
     */
    public void OnRoundStart(Handle hEvent, const char[] szEventNamebool bDontBroadcast) {
        
    ForPlayer(iClient) {
            
    SetEntProp(iClientProp_Data"m_takedamage"No1);
            
    PrintToChat(iClient" \x04[SpawnProtection] \x01Now you protected from any damage on \x04%i \x01sec."g_iProtectTime);
        }

        
    CreateTimer(IntToFloat(g_iProtectTime), OnDisableProtect_TIMER_FLAG_NO_MAPCHANGE);
    }

    /**
     * @section Timers
     */
    public Action OnDisableProtect(Handle hTimer) {
        
    ForPlayer(iClient) {
            
    SetEntProp(iClientProp_Data"m_takedamage"Yes1);
            
    PrintToChat(iClient" \x04[SpawnProtection] \x01Protection from any damage \x04disabled\x01.");
        }
    }
     
    vadrozh, September, jasmine и 2 другим нравится это.
  3. diman1000w

    diman1000w

    Сообщения:
    375
    Симпатии:
    19
    вот так
    sm_spawnprotect_time "10"
    на 10 секунд
    в server.cfg
    --- Добавлено позже ---
    А можно сделать если ты двигаться начинаешь время сбрасывается. Это я хочу сделать кто стоит афк.
     
    Последнее редактирование: 30 ноя 2017
  4. Grey83

    Grey83

    Сообщения:
    1.173
    Симпатии:
    490
    @jasmine, вот так ещё проще, кмк
    только я не уверен что событие спавна происходит точно после начала раунда
    PHP:
    #include <sdktools>

    float fProtectTime;

    public 
    Plugin myinfo =
    {
        
    name        "EazySpawnProtector",
        
    description    "Spawn protection",
        
    author        "DUCK (vk.com/geliydaun)",
        
    version        "1.0.1",
        
    url            "http://crystals.pw/"
    };

    public 
    void OnPluginStart()
    {
        
    ConVar cvar;
        (
    cvar CreateConVar("sm_spawnprotect_time""7""Время защиты с начала раунда, сек."FCVAR_NOTIFYtrue_)).AddChangeHook(CVarChanged_ProtectTime);
        
    fProtectTime cvar.FloatValue;

        
    HookEvent("round_start"Event_RoundStartEventHookMode_Pre)
    }

    public 
    void CVarChanged_ProtectTime(ConVar cvarchar[] oldValuechar[] newValue)
    {
        
    fProtectTime cvar.FloatValue;
    }

    public 
    void Event_RoundStart(Handle hEventchar[] namebool dbc)
    {
        if(!
    fProtectTime) return;

        
    HookEvent("player_spawn"Event_PlayerSpawn);
        
    PrintToChatAll(" \x04[SpawnProtection] \x01Все игроки защищены от урона на\x04 %i \x01сек."fProtectTime);
        
    CreateTimer(fProtectTimeStopProtectTimer_TIMER_FLAG_NO_MAPCHANGE);
    }

    public 
    Action StopProtectTimer(Handle timer)
    {
        
    UnhookEvent("player_spawn"Event_PlayerSpawn);
        
    PrintToChatAll(" \x04[SpawnProtection] \x01Защита от урона снята!");
        for(
    int i 1<= MaxClientsi++) if(IsClientInGame(i) && IsPlayerAlive(i)) SetEntProp(iProp_Data"m_takedamage"2);

    }

    public 
    void Event_PlayerSpawn(Event event, const char[] namebool dontBroadcast)
    {
        static 
    int client;
        if((
    client GetClientOfUserId(event.GetInt("userid")))) SetEntProp(clientProp_Data"m_takedamage"0);
    }
     

    Вложения:

  5. jasmine

    jasmine

    Сообщения:
    234
    Симпатии:
    105
    Где-то читал, что сначала спавн игроков, а потом начало раунда.
     
  6. Grey83

    Grey83

    Сообщения:
    1.173
    Симпатии:
    490
    @jasmine, ну тогда надо ещё окончание раунда отлавливать и после него включать режим бессмертия
    а после начала раунда запускать таймер для отключения бессмертия
    PHP:
    #include <sdktools>

    float fProtectTime;
    bool bHooked;

    public 
    Plugin myinfo =
    {
        
    name        "EazySpawnProtector",
        
    description    "Spawn protection",
        
    author        "DUCK (vk.com/geliydaun)",
        
    version        "1.0.2",
        
    url            "http://crystals.pw/"
    };

    public 
    void OnPluginStart()
    {
        
    ConVar cvar;
        (
    cvar CreateConVar("sm_spawnprotect_time""7""Время защиты с начала раунда, сек."FCVAR_NOTIFYtrue_)).AddChangeHook(CVarChanged_ProtectTime);
        
    fProtectTime cvar.FloatValue;

        
    HookEvent("round_start"Event_RoundStart)
        
    HookEvent("round_end"Event_RoundEnd)
    }

    public 
    void CVarChanged_ProtectTime(ConVar cvarchar[] oldValuechar[] newValue)
    {
        
    fProtectTime cvar.FloatValue;
    }

    public 
    void OnMapStart()
    {
        if(
    fProtectTimebHooked HookEventEx("player_spawn"Event_PlayerSpawn);
    }

    public 
    void OnMapEnd()
    {
        if(
    bHookedUnhookEvent("player_spawn"Event_PlayerSpawn);
        
    bHooked false;
    }

    public 
    void Event_RoundStart(Handle hEventchar[] namebool dbc)
    {
        if(!
    fProtectTime || !bHooked) return;

        
    PrintToChatAll(" \x04[SpawnProtection] \x01Все игроки защищены от урона на\x04 %i \x01сек."fProtectTime);
        
    CreateTimer(fProtectTimeStopProtectTimer_TIMER_FLAG_NO_MAPCHANGE);
    }

    public 
    Action StopProtectTimer(Handle timer)
    {
        
    UnhookEvent("player_spawn"Event_PlayerSpawn);
        
    PrintToChatAll(" \x04[SpawnProtection] \x01Защита от урона снята!");
        for(
    int i 1<= MaxClientsi++) if(IsClientInGame(i) && IsPlayerAlive(i)) SetEntProp(iProp_Data"m_takedamage"2);
    }

    public 
    void Event_RoundEnd(Handle hEventchar[] namebool dbc)
    {
        if(
    fProtectTimebHooked HookEventEx("player_spawn"Event_PlayerSpawn);
    }

    public 
    void Event_PlayerSpawn(Event event, const char[] namebool dontBroadcast)
    {
        static 
    int client;
        if((
    client GetClientOfUserId(event.GetInt("userid")))) SetEntProp(clientProp_Data"m_takedamage"0);
    }
     

    Вложения:

    Последнее редактирование: 30 ноя 2017
    jasmine нравится это.
  7. Kr1kuzya

    Kr1kuzya Костылизируя некостылизируемое Модератор

    Сообщения:
    3.140
    Симпатии:
    2.602
    @Grey83, где-то читал, да и сам неоднократно сталкивался, что хук изменения переменной не вызывается, если эта переменная вбита в server.cfg или автоконфиг самого плагина. Потому в идеале нужен ещё OnConfigsExecuted()
     
    jasmine нравится это.
  8. Grey83

    Grey83

    Сообщения:
    1.173
    Симпатии:
    490
    @Kr1kuzya, м/б это если переменная меняется в конфиге, а не через консоль?
    Кстати, только что заметил:
    PrintToChatAll(" \x04[SpawnProtection] \x01Все игроки защищены от урона на\x04 %i \x01сек.", fProtectTime);
    нужно заменить на
    PrintToChatAll(" \x04[SpawnProtection] \x01Все игроки защищены от урона на\x04 %i \x01сек.", RoundToNearest(fProtectTime));
     
  9. Vit_ amin

    Vit_ amin BotManager001

    Сообщения:
    1.210
    Симпатии:
    420
    Вообще лучше создавать переменные типа integer, и потом их уже через view_as<float>(...) вставлять как надо. Все же CPU лучше работают с Integer значениями
     
  10. Grey83

    Grey83

    Сообщения:
    1.173
    Симпатии:
    490
    @Vit_ amin, ну ок
    PHP:
    #include <sdktools>

    int iProtectTime;
    bool bHooked;

    public 
    Plugin myinfo =
    {
        
    name        "EazySpawnProtector",
        
    description    "Spawn protection",
        
    author        "DUCK (vk.com/geliydaun)",
        
    version        "1.0.3",
        
    url            "http://crystals.pw/"
    };

    public 
    void OnPluginStart()
    {
        
    ConVar cvar;
        (
    cvar CreateConVar("sm_spawnprotect_time""7""Время защиты с начала раунда, сек."FCVAR_NOTIFYtrue_)).AddChangeHook(CVarChanged_ProtectTime);
        
    iProtectTime cvar.IntValue;

        
    HookEvent("round_start"Event_RoundStart)
        
    HookEvent("round_end"Event_RoundEnd)
    }

    public 
    void CVarChanged_ProtectTime(ConVar cvarchar[] oldValuechar[] newValue)
    {
        
    iProtectTime cvar.IntValue;
    }

    public 
    void OnMapStart()
    {
        if(
    iProtectTimebHooked HookEventEx("player_spawn"Event_PlayerSpawn);
    }

    public 
    void OnMapEnd()
    {
        if(
    bHookedUnhookEvent("player_spawn"Event_PlayerSpawn);
        
    bHooked false;
    }

    public 
    void Event_RoundStart(Handle hEventchar[] namebool dbc)
    {
        if(!
    iProtectTime || !bHooked) return;

        
    PrintToChatAll(" \x04[SpawnProtection] \x01Все игроки защищены от урона на\x04 %i \x01сек."iProtectTime);
        
    CreateTimer(view_as<float>(iProtectTime), StopProtectTimer_TIMER_FLAG_NO_MAPCHANGE);
    }

    public 
    Action StopProtectTimer(Handle timer)
    {
        
    UnhookEvent("player_spawn"Event_PlayerSpawn);
        
    PrintToChatAll(" \x04[SpawnProtection] \x01Защита от урона снята!");
        for(
    int i 1<= MaxClientsi++) if(IsClientInGame(i) && IsPlayerAlive(i)) SetEntProp(iProp_Data"m_takedamage"2);
    }

    public 
    void Event_RoundEnd(Handle hEventchar[] namebool dbc)
    {
        if(
    iProtectTimebHooked HookEventEx("player_spawn"Event_PlayerSpawn);
    }

    public 
    void Event_PlayerSpawn(Event event, const char[] namebool dontBroadcast)
    {
        static 
    int client;
        if((
    client GetClientOfUserId(event.GetInt("userid")))) SetEntProp(clientProp_Data"m_takedamage"0);
    }
     

    Вложения:

    Vit_ amin нравится это.
  11. Kr1kuzya

    Kr1kuzya Костылизируя некостылизируемое Модератор

    Сообщения:
    3.140
    Симпатии:
    2.602
    Это ничем хорошим не закончится, как минимум потому что Pawn хранит обычный инт в 4 байта, а float - в 8 байт.
    [​IMG]
     
  12. Vit_ amin

    Vit_ amin BotManager001

    Сообщения:
    1.210
    Симпатии:
    420
    Не знаю, все плагины так делаю, все нормально, и по дампам памяти и по частоте процессора
    --- Добавлено позже ---
    Естественно не все возможно так делать (я имею в виду), только что позволяется
     
  13. jasmine

    jasmine

    Сообщения:
    234
    Симпатии:
    105