Spawn Protection

Spawn Protection 1.5 + CS:GO Support

Artem Fett

Участник
Сообщения
21
Реакции
3

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Соответственно я залез в единственный файл который можно редачить. И нашел две вот эти строчки:
...
Заменил на вот это:
...
И соответственно после загрузки файла на сервер ничего не изменилось!
ты его хоть скомпилил и перезагрузил после заливки файла smx плагин/карту/сервак?
 

Zakhar Revin

Участник
Сообщения
218
Реакции
28
Хороший плагин. А мог бы кто добавить фишку, как в ксго. Если игрок двинулся, не только стрельнул, защита тоже снимается?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Zakhar Revin, в функции OnPlayerRunCmd() в проверке просто добавить клавиши перемещения
PHP:
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;
}
 

Zakhar Revin

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

#include <sourcemod>
#include <sdktools>
#define VERSION "1.5 [CS:GO Support]"
#pragma semicolon 1
new TeamSpec;
new TeamUna;
new bool:NoTeams = false;
new Handle:SpawnProtectionEnabled;
new Handle:SpawnProtectionTime;
new Handle:SpawnProtectionNotify;
new Handle:SpawnProtectionColor;
new RenderOffs;
enum FX
{
FxNone = 0,
FxPulseFast,
FxPulseSlowWide,
FxPulseFastWide,
FxFadeSlow,
FxFadeFast,
FxSolidSlow,
FxSolidFast,
FxStrobeSlow,
FxStrobeFast,
FxStrobeFaster,
FxFlickerSlow,
FxFlickerFast,
FxNoDissipation,
FxDistort, // Distort/scale/translate flicker
FxHologram, // kRenderFxDistort + distance fade
FxExplode, // Scale up really big!
FxGlowShell, // Glowing Shell
FxClampMinScale, // Keep this sprite from getting very small (SPRITES only!)
FxEnvRain, // for environmental rendermode, make rain
FxEnvSnow, // " " " , make snow
FxSpotlight,
FxRagdoll,
FxPulseFastWider,
};
enum Render
{
Normal = 0, // src
TransColor, // c*a+dest*(1-a)
TransTexture, // src*a+dest*(1-a)
Glow, // src*a+dest -- No Z buffer checks -- Fixed size in screen space
TransAlpha, // src*srca+dest*(1-srca)
TransAdd, // src*a+dest
Environmental, // not drawn, used for environmental effects
TransAddFrameBlend, // use a fractional frame value to blend between animation frames
TransAlphaAdd, // src + dest*(1-a)
WorldGlow, // Same as kRenderGlow but not fixed size in screen space
None, // Don't render.
};
public Plugin:myinfo =
{
name = "Spawn Protection [Added CS:GO Support]",
author = "Fredd",
description = "Adds spawn protection",
version = VERSION,
url = "www.sourcemod.net"
}
public OnPluginStart()
{
CreateConVar("spawnprotection_version", VERSION, "Spawn Protection Version", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);
SpawnProtectionEnabled = CreateConVar("sp_on", "1");
SpawnProtectionTime = CreateConVar("sp_time", "5");
SpawnProtectionNotify = CreateConVar("sp_notify", "1");
SpawnProtectionColor = CreateConVar("sp_color", "0 255 0 120");

AutoExecConfig(true, "spawn_protection");

RenderOffs = FindSendPropOffs("CBasePlayer", "m_clrRender");

decl String:ModName[21];
GetGameFolderName(ModName, sizeof(ModName));

if(StrEqual(ModName, "cstrike", false) || StrEqual(ModName, "dod", false) || StrEqual(ModName, "csgo", false) || StrEqual(ModName, "tf", false))
{
TeamSpec = 1;
TeamUna = 0;
NoTeams = false;

} else if(StrEqual(ModName, "Insurgency", false))
{
TeamSpec = 3;
TeamUna = 0;
NoTeams = false;
}
else if(StrEqual(ModName, "hl2mp", false))
{
NoTeams = true;
} else
{
SetFailState("%s is an unsupported mod", ModName);
}
HookEvent("player_spawn", OnPlayerSpawn);
}
public Action:OnPlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
{
if(GetConVarInt(SpawnProtectionEnabled) == 1)
{
new client = GetClientOfUserId(GetEventInt(event, "userid"));
new Team = GetClientTeam(client);

if(NoTeams == false)
{
if(Team == TeamSpec || Team == TeamUna)
return Plugin_Continue;
}
if(!IsPlayerAlive(client))
return Plugin_Continue;

decl String:SzColor[32];
decl String:Colors[4][4];
new Float:Time = float(GetConVarInt(SpawnProtectionTime));

GetConVarString(SpawnProtectionColor, SzColor, sizeof(SzColor));
ExplodeString(SzColor, " ", Colors, 4, 4);

SetEntProp(client, Prop_Data, "m_takedamage", 0, 1);
set_rendering(client, FX:FxDistort, StringToInt(Colors[0]),StringToInt(Colors[1]),StringToInt(Colors[2]), Render:RENDER_TRANSADD, StringToInt(Colors[3]));
CreateTimer(Time, RemoveProtection, client);
if(GetConVarInt(SpawnProtectionNotify) > 0)
PrintToChat(client, "\x04[SpawnProtection] \x01you will be spawn protected for \x04%i \x01seconds", RoundToNearest(Time));
}
return Plugin_Continue;
}
public Action:RemoveProtection(Handle:timer, any:client)
{
if(IsClientInGame(client))
{
SetEntProp(client, Prop_Data, "m_takedamage", 2, 1);
set_rendering(client);
if(GetConVarInt(SpawnProtectionNotify) > 0)
PrintToChat(client, "\x04[SpawnProtection] \x01spawn protection is now off..");
}
}
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;
}

stock set_rendering(index, FX:fx=FxNone, r=255, g=255, b=255, Render:render=Normal, amount=255)
{
SetEntProp(index, Prop_Send, "m_nRenderFX", _:fx, 1);
SetEntProp(index, Prop_Send, "m_nRenderMode", _:render, 1);
SetEntData(index, RenderOffs, r, 1, true);
SetEntData(index, RenderOffs + 1, g, 1, true);
SetEntData(index, RenderOffs + 2, b, 1, true);
SetEntData(index, RenderOffs + 3, amount, 1, true);
}
Естессно не компилится). Ну и классические варнинги компиляции:
FCVAR_PLUGIN и FindSendPropOffs

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

Вложения

  • SpawnProtection.sp
    4.7 КБ · Просмотры: 1
  • SpawnProtection+.sp
    4.7 КБ · Просмотры: 4
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980

Zakhar Revin

Участник
Сообщения
218
Реакции
28
Да, спасибо большое! С третей пробы подставил ваш код в эту версию (заменил точнее) и вроде все заработало.
Сейчас выглядит вот так:
C-подобный:
#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 (Раскраску тоже убирал), работает только сообщение об отключении защиты.
И где вот тут:
C-подобный:
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);
Шифт? Хотелось бы его исключить из условия отключения зашиты. Направления движения и присядку вижу.

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

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Zakhar Revin, попробуй поменять IN_FORWARD на IN_RUN
--- Добавлено позже ---
Пробовал заменить PrintToChat на PrintHintText (Раскраску тоже убирал), работает только сообщение об отключении защиты.
Странно: должны оба сообщения высвечиваться одинаково, если ты оба PrintToChat заменил
 

Ампутаге

Участник
Сообщения
84
Реакции
8
Можно ли сделать так, чтобы сообщение о защите показывалось только когда ты в команде Т или КТ? А то показывает даже тогда, когда ты зашёл на сервер
 

Innomeni

Участник
Сообщения
320
Реакции
42
Замечен баг (фича): если игрок берет бота, то на него вешается защита. Забавно, конечно, но наверное, так быть не должно.
 

Twenix

Участник
Сообщения
25
Реакции
1
Не подскажите как сделать чтобы при респавне защиты не было? Было бы очень полезно на surf серверах
 

Xummuk97

Programmer
Сообщения
309
Реакции
75
Не подскажите как сделать чтобы при респавне защиты не было? Было бы очень полезно на surf серверах
Держи =)
Будут проблемы с плагином, пиши, просто я его не протестил.
 

Вложения

  • SpawnProtection.rar
    9 КБ · Просмотры: 12
Сверху Снизу