Spawn Protection 1.5 + CS:GO Support

Защита после рождения игрока

Метки:
  1. Zakhar Revin

    Zakhar Revin

    Сообщения:
    115
    Симпатии:
    11
    Хороший плагин. А мог бы кто добавить фишку, как в ксго. Если игрок двинулся, не только стрельнул, защита тоже снимается?
     
  2. Grey83

    Grey83 похухоль

    Сообщения:
    1.919
    Симпатии:
    929
    @Zakhar Revin, в функции OnPlayerRunCmd() в проверке просто добавить клавиши перемещения
    PHP:
    public Action:OnPlayerRunCmd(client, &buttons, &impulseFloat:velocity[3], Float:angles[3], &weapon, &weaponSub, &command, &tick, &randomSeedmouseDir[2])
    {
        if(
    bActive[client] && IsPlayerAlive(client) && (buttons IN_ATTACK || buttons IN_BACK || buttons IN_FORWARD || buttons IN_MOVELEFT || buttons IN_MOVERIGHT  || buttons IN_DUCK || buttons IN_JUMP)) RemoveProtection(client);
        return 
    Plugin_Continue;
    }
     
  3. Zakhar Revin

    Zakhar Revin

    Сообщения:
    115
    Симпатии:
    11
    Я извиняюсь, но такой функции нету в коде, ее как раз и надо же добавить? Есть public Action:RemoveProtection, есть Action:OnPlayerSpawn. Пробовал просто добавить в код функцию, чет не то).
    Не могли бы помочь?
    Добавлял новую функцию ниже: public Action:RemoveProtection(Handle:timer, any:client)

    Естессно не компилится). Ну и классические варнинги компиляции:
    FCVAR_PLUGIN и FindSendPropOffs

    Вопрос по Вашему коду, там mouseDir[2], это щелчки мыши или движение?
    Просто в идеале, во время защиты работает меню выбора пушки от cssdm Bailopan(а), не повредит ли? И шифта нажатие тоже бы исключить.
    (на всякий случай оригинальный плагин из шапки)
    --- Добавлено позже ---
    Вот в этом сообщении нашел нечто похожее.. Но чет не то.
    --- Добавлено позже ---
    Что-то скомпилилось с Вашим примером, вроде даже работает. (Последний файл, который с +). Никак не смог перенести текст в Хинт.
     

    Вложения:

    Последнее редактирование: 21 авг 2018
  4. Grey83

    Grey83 похухоль

    Сообщения:
    1.919
    Симпатии:
    929
    Это координаты мыши
    А изменения для вот этой версии были: Spawn Protection
    Она у тебя работает?
     
    Zakhar Revin нравится это.
  5. Zakhar Revin

    Zakhar Revin

    Сообщения:
    115
    Симпатии:
    11
    Да, спасибо большое! С третей пробы подставил ваш код в эту версию (заменил точнее) и вроде все заработало.
    Сейчас выглядит вот так:
    Код:
    #pragma semicolon 1
    #include <sdktools>
    
    #define VERSION "1.5.2"
    
    new RenderOffs;
    
    new bool:bEnabled,
        Float:fTime,
        bool:bNotify,
        iColor[4];
    
    new TeamSpec,
        TeamUna,
        bool:NoTeams,
        bActive[MAXPLAYERS+1];
    
    public Plugin:myinfo =
    {
        name        = "Spawn Protection",
        author        = "Fredd (optimized by Grey83)",
        description    = "Adds spawn protection",
        version        = VERSION,
        url            = "www.sourcemod.net"
    }
    
    public OnPluginStart()
    {
        decl String:buffer[16];
        GetGameFolderName(buffer, sizeof(buffer));
        if(StrEqual(buffer, "cstrike", false) || StrEqual(buffer, "dod", false) || StrEqual(buffer, "csgo", false) || StrEqual(buffer, "tf", false))
        {
            TeamSpec = 1;
            TeamUna = 0;
            NoTeams = false;
        }
        else if(StrEqual(buffer, "Insurgency", false))
        {
            TeamSpec = 3;
            TeamUna = 0;
            NoTeams = false;
        }
        else if(StrEqual(buffer, "hl2mp", false))
            NoTeams = true;
        else SetFailState("%s is an unsupported mod", buffer);
    
        CreateConVar("spawnprotection_version", VERSION, "Spawn Protection Version", FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);
    
        new Handle:CVar;
        HookConVarChange((CVar = CreateConVar("sp_on", "1", _, _, true, _, true, 1.0)), CVarChanged_Enabled);
        bEnabled = GetConVarBool(CVar);
    
        HookConVarChange((CVar = CreateConVar("sp_time", "10", _, _, true, 1.0)), CVarChanged_Time);
        fTime = GetConVarFloat(CVar);
    
        HookConVarChange((CVar = CreateConVar("sp_notify", "1", _, _, true, _, true, 1.0)), CVarChanged_Notify);
        bNotify = GetConVarBool(CVar);
    
        HookConVarChange((CVar = CreateConVar("sp_color", "255 0 0 120", _, FCVAR_PRINTABLEONLY)), CVarChanged_Color);
        GetColor(CVar);
    
        AutoExecConfig(true, "spawn_protection");
    
        RenderOffs = FindSendPropInfo("CBasePlayer", "m_clrRender");
    
        HookEvent("player_spawn", OnPlayerSpawn);
    }
    
    public CVarChanged_Enabled(Handle:CVar, const String:oldValue[], const String:newValue[])
    {
        bEnabled = GetConVarBool(CVar);
    }
    
    public CVarChanged_Time(Handle:CVar, const String:oldValue[], const String:newValue[])
    {
        fTime = GetConVarFloat(CVar);
    }
    
    public CVarChanged_Notify(Handle:CVar, const String:oldValue[], const String:newValue[])
    {
        bNotify = GetConVarBool(CVar);
    }
    
    public CVarChanged_Color(Handle:CVar, const String:oldValue[], const String:newValue[])
    {
        GetColor(CVar);
    }
    
    GetColor(Handle:CVar)
    {
        new String:buffer[16], String:s_color[4][4];
        GetConVarString(CVar, buffer, sizeof(buffer));
        ExplodeString(buffer, " ", s_color, 4, 4);
        for(new i, color; i < 4; i++)
        {
            color = StringToInt(s_color[i]);
            if(color < 0) iColor[i] = 0;
            else if(color > 255) iColor[i] = 255;
            else iColor[i] = color;
        }
    }
    
    public Action:OnPlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
    {
        if(bEnabled)
        {
            new client    = GetClientOfUserId(GetEventInt(event, "userid"));
            new team    = GetClientTeam(client);
    
            if(NoTeams && (team == TeamSpec || team == TeamUna))
                return Plugin_Continue;
            if(!IsPlayerAlive(client))
                return Plugin_Continue;
    
            bActive[client] = true;
            SetEntProp(client, Prop_Data, "m_takedamage", 0, 1);
            CreateTimer(fTime, Timer_RemoveProtection, GetClientUserId(client), TIMER_FLAG_NO_MAPCHANGE);
            if(RenderOffs != -1)
                set_rendering(client, RENDERFX_DISTORT, iColor[0], iColor[1], iColor[2], RENDER_TRANSADD, iColor[3]);
            if(bNotify) PrintToChat(client, "\x04[Защита] \x01Ты \x04неуязвим \x01еще \x04%i \x01секунд (не шевелись)", RoundFloat(fTime));
        }
        return Plugin_Continue;
    }
    
    public Action:Timer_RemoveProtection(Handle:timer, any:client)
    {
        if((client = GetClientOfUserId(client)) && bActive[client]) RemoveProtection(client);
    }
    
    public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:velocity[3], Float:angles[3], &weapon, &weaponSub, &command, &tick, &randomSeed, mouseDir[2])
    {
        if(bActive[client] && IsPlayerAlive(client) && (buttons & IN_ATTACK || buttons & IN_BACK || buttons & IN_FORWARD || buttons & IN_MOVELEFT || buttons & IN_MOVERIGHT || buttons & IN_DUCK || buttons & IN_JUMP)) RemoveProtection(client);
        return Plugin_Continue;
    }
    
    RemoveProtection(client)
    {
        bActive[client] = false;
        SetEntProp(client, Prop_Data, "m_takedamage", 2, 1);
        if(RenderOffs != -1) set_rendering(client);
        if(bNotify) PrintToChat(client, "\x04[Защита] \x01Неуязвимость \x04отключена");
    }
    
    stock set_rendering(client, RenderFx:fx=RENDERFX_NONE, r=255, g=255, b=255, RenderMode:render=RENDER_NORMAL, amount=255)
    {
        SetEntProp(client, Prop_Send, "m_nRenderFX", fx, 1);
        SetEntProp(client, Prop_Send, "m_nRenderMode", render, 1);
        SetEntData(client, RenderOffs, r, 1, true);
        SetEntData(client, RenderOffs + 1, g, 1, true);
        SetEntData(client, RenderOffs + 2, b, 1, true);
        SetEntData(client, RenderOffs + 3, amount, 1, true);
    }
    Пробовал заменить PrintToChat на PrintHintText (Раскраску тоже убирал), работает только сообщение об отключении защиты.
    И где вот тут:
    Код:
    if(bActive[client] && IsPlayerAlive(client) && (buttons & IN_ATTACK || buttons & IN_BACK || buttons & IN_FORWARD || buttons & IN_MOVELEFT || buttons & IN_MOVERIGHT || buttons & IN_DUCK || buttons & IN_JUMP)) RemoveProtection(client);
    Шифт? Хотелось бы его исключить из условия отключения зашиты. Направления движения и присядку вижу.

    Еще раз огромное спасибо за помощь!
     
  6. Grey83

    Grey83 похухоль

    Сообщения:
    1.919
    Симпатии:
    929
    @Zakhar Revin, попробуй поменять IN_FORWARD на IN_RUN
    --- Добавлено позже ---
    Странно: должны оба сообщения высвечиваться одинаково, если ты оба PrintToChat заменил
     
    Zakhar Revin нравится это.
  7. Zakhar Revin

    Zakhar Revin

    Сообщения:
    115
    Симпатии:
    11
    Попробую, гранд мерси!
     
  8. Ампутаге

    Ампутаге

    Сообщения:
    67
    Симпатии:
    7
    Можно ли сделать так, чтобы сообщение о защите показывалось только когда ты в команде Т или КТ? А то показывает даже тогда, когда ты зашёл на сервер
     
  9. Xummuk97

    Xummuk97

    Сообщения:
    249
    Симпатии:
    27
    Сделай проверку живой/нет.
     
  10. Ампутаге

    Ампутаге

    Сообщения:
    67
    Симпатии:
    7
    не умею, я не кодер
     
  11. Xummuk97

    Xummuk97

    Сообщения:
    249
    Симпатии:
    27
    Уроки R1KO надо смотреть)
    Можешь вот как сделать

    Код:
    // Если игрок жив
    if (IsPlayerAlive(iClient))
    {
    // CODE
    }
     
  12. Innomeni

    Innomeni

    Сообщения:
    22
    Симпатии:
    1
    Замечен баг (фича): если игрок берет бота, то на него вешается защита. Забавно, конечно, но наверное, так быть не должно.
     
  13. hirowatch

    hirowatch хтьфу

    Сообщения:
    1.123
    Симпатии:
    364
  14. Innomeni

    Innomeni

    Сообщения:
    22
    Симпатии:
    1
    CS GO. Вчера только проверил.