Spawn Protection

Spawn Protection 1.5 + CS:GO Support

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

Grey83

похухоль
Сообщения
2,664
Реакции
1,449
@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;
}
 
Сообщения
165
Реакции
17
Я извиняюсь, но такой функции нету в коде, ее как раз и надо же добавить? Есть 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(а), не повредит ли? И шифта нажатие тоже бы исключить.
(на всякий случай оригинальный плагин из шапки)
--- Добавлено позже ---
Вот в этом сообщении нашел нечто похожее.. Но чет не то.
--- Добавлено позже ---
Что-то скомпилилось с Вашим примером, вроде даже работает. (Последний файл, который с +). Никак не смог перенести текст в Хинт.
 

Вложения

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

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

Grey83

похухоль
Сообщения
2,664
Реакции
1,449
@Zakhar Revin, попробуй поменять IN_FORWARD на IN_RUN
--- Добавлено позже ---
Пробовал заменить PrintToChat на PrintHintText (Раскраску тоже убирал), работает только сообщение об отключении защиты.
Странно: должны оба сообщения высвечиваться одинаково, если ты оба PrintToChat заменил
 
Сообщения
73
Реакции
7
Можно ли сделать так, чтобы сообщение о защите показывалось только когда ты в команде Т или КТ? А то показывает даже тогда, когда ты зашёл на сервер
 
Сообщения
120
Реакции
14
Замечен баг (фича): если игрок берет бота, то на него вешается защита. Забавно, конечно, но наверное, так быть не должно.
 
Сверху