Написание плагинов

Felton

Участник
Сообщения
799
Реакции
59
C-подобный:
#include <sourcemod>
#include <sdkhooks>

#pragma semicolon 1

#define PLUGIN_VERSION "1.0"

new bool:gB_Enabled;
new Handle:gH_Enabled = INVALID_HANDLE;

public Plugin:myinfo =
{
    name = "[ANY] No Water Damage",
    author = "shavit",
    description = "Disable damaging from water idling.",
    version = PLUGIN_VERSION,
    url = "https://forums.alliedmods.net/member.php?u=163134"
}

public OnPluginStart()
{
    CreateConVar("sm_nowaterdamage_version", PLUGIN_VERSION, "Plugin version", FCVAR_NOTIFY|FCVAR_DONTRECORD|FCVAR_PLUGIN);
 
    gH_Enabled = CreateConVar("sm_nowaterdamage_enabled", "1", "Disabled damage received from water?", FCVAR_PLUGIN, true, 0.0, true, 1.0);
    gB_Enabled = GetConVarBool(gH_Enabled);
 
    HookConVarChange(gH_Enabled, OnConVarChanged);
 
    AutoExecConfig();
}

public OnConVarChanged(Handle:cvar, const String:oldVal[], const String:newVal[])
{
    if(cvar == gH_Enabled)
    {
        gB_Enabled = StringToInt(newVal)? true:false;
    }
}

public OnClientPutInServer(client)
{
    SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action:OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
    if(!gB_Enabled)
    {
        return Plugin_Continue;
    }
 
    if(damagetype == DMG_DROWN || damagetype == DMG_DROWNRECOVER)
    {
        damage = 0.0;
     
        return Plugin_Handled;
    }
 
    return Plugin_Continue;
}
Допишите пожалуйста в этот плагин админские права b
 
Последнее редактирование:

Almaz2512

Участник
Сообщения
9
Реакции
0
Привет! Можно как нибудь прицепить команду "sv_enablebunnyhopping 0" к плагину Map Zones как наказание?
Ну или как альтернатива квару этот плагин.
Надеюсь, что сделать это не сложно, и буду очень благодарен за любую помощь)
 

BenjaminPaul

Code is poetry
Сообщения
177
Реакции
220
ОТВЕТ 1 для Almaz2512
Привет! Можно как нибудь прицепить команду "sv_enablebunnyhopping 0" к плагину Map Zones как наказание?
Ну или как альтернатива квару этот плагин.
Надеюсь, что сделать это не сложно, и буду очень благодарен за любую помощь)
Квар ставить на юзеров внутри зоны, незнаю возможно ли такое или нет, но мой взгляд что это серверный квар и он 1 по идеи как.
Второй вариант более подходит, так как нужно всего лишь добавить +1 число к наказанию, и добавить блок из плагина AntiBhop на срабатывание. (Хоть мне и не нравится использование OnPlayerRunCmd)
Даже "кастомное" наказание можно сделать, зашёл ради интереса посмотреть)
DoD_Zones/sm_zones.sp at master · zadroot/DoD_Zones · GitHub // 710 строчка, та, что нужна тебе
C-подобный:
OnEnteredProtectedZone = CreateGlobalForward("OnEnteredProtectedZone", ET_Ignore, Param_Cell, Param_Cell, Param_String);
OnLeftProtectedZone = CreateGlobalForward("OnLeftProtectedZone", ET_Ignore, Param_Cell, Param_Cell, Param_String);

То есть по идеи ты можешь написать свой плагин, для этого плагина через SourceMod API.
Для этого надо написать .inc файлик если его нету.

Param_Cell, Param_Cell, Param_String - параметры

// файлик .inc
C-подобный:
#if defined _myinclude_file_prevent_double_include_
  #endinput
#endif
#define _myinclude_file_prevent_double_include_

native void OnEnteredProtectedZone(int client, int activator, char[] Prefix);
native void OnLeftProtectedZone(int client, int activator, char[] Prefix);

В теории вроде так, я незнаю пишу просто) без практики. Может где-то ошибку сделал.

Далее просто создаешь свой плагин с нуля.
И теперь все оч просто.
Инклудишь .inc файлик что ты создал.
Добавляешь событие OnEnteredProtectedZone
И обработку делаешь копируя код из AntiBhop.

(если хочешь ковырнуть плагин изначальный, (просто добавив блок в Switch)
который возможно поддерживается разработчиком,
то учти что дальнейшие обновления ты не поставишь этого плагина, так как ковырнул его сам)

Сделать можно всё что угодно) я думаю найдётся человечек который потратит на это пару минут.
--- Добавлено позже ---

ОТВЕТ 2 ДЛЯ Felton
Допишите пожалуйста в этот плагин админские права b
Как я понял у тебя плагин работает на всех игроков? Этот флаг b - GENERIC ADMIN.
Значит тебе по сути нужно для всех плагинов чтобы работало только.

Окей, смотришь строчку 54. Именно тут магия и происходит.
Для проверки флагов можно почитать тут - Checking Admin Flags (SourceMod Scripting) - AlliedModders Wiki (если тебе интересно)
Если тебе ничего не интересно, можешь не смотреть.

В целом мы имеем код:
C-подобный:
    if(damagetype == DMG_DROWN || damagetype == DMG_DROWNRECOVER)
    {
        damage = 0.0;
  
        return Plugin_Handled;
    }
Тут идёт проверка типа урона.
Установка урона на 0.

Для проверки флага добавляем строчку (можно удалить ADMFLAG_KICK)
C-подобный:
if (GetUserFlagBits(client) & (ADMFLAG_GENERIC | ADMFLAG_KICK) == (ADMFLAG_GENERIC | ADMFLAG_KICK))
{
    // User has both flags
}

ADMFLAG_GENERIC и есть по сути "b" только, "b" - упрощенный вариант записи для нубосиков.
C-подобный:
#define ADMFLAG_GENERIC                (1<<1)        /**< Convenience macro for Admin_Generic as a FlagBit */
#define ADMFLAG_KICK                (1<<2)        /**< Convenience macro for Admin_Kick as a FlagBit */

В итоге блок становится.
C-подобный:
    if(damagetype == DMG_DROWN || damagetype == DMG_DROWNRECOVER)
    {
         if (GetUserFlagBits(client) & (ADMFLAG_GENERIC | ADMFLAG_KICK) == (ADMFLAG_GENERIC | ADMFLAG_KICK))
        {
            damage = 0.0;
            return Plugin_Handled;
        }
    }

Вот и всё.
Можешь сам всё сделать в .sp файле.
Если сможешь :)
 
Последнее редактирование:

Almaz2512

Участник
Сообщения
9
Реакции
0
ОТВЕТ 1 для Almaz2512

Квар ставить на юзеров внутри зоны, незнаю возможно ли такое или нет, но мой взгляд что это серверный квар и он 1 по идеи как.
Второй вариант более подходит, так как нужно всего лишь добавить +1 число к наказанию, и добавить блок из плагина AntiBhop на срабатывание. (Хоть мне и не нравится использование OnPlayerRunCmd)
Даже "кастомное" наказание можно сделать, зашёл ради интереса посмотреть)
DoD_Zones/sm_zones.sp at master · zadroot/DoD_Zones · GitHub // 710 строчка, та, что нужна тебе
C-подобный:
OnEnteredProtectedZone = CreateGlobalForward("OnEnteredProtectedZone", ET_Ignore, Param_Cell, Param_Cell, Param_String);
OnLeftProtectedZone = CreateGlobalForward("OnLeftProtectedZone", ET_Ignore, Param_Cell, Param_Cell, Param_String);

То есть по идеи ты можешь написать свой плагин, для этого плагина через SourceMod API.
Для этого надо написать .inc файлик если его нету.

Param_Cell, Param_Cell, Param_String - параметры

// файлик .inc
C-подобный:
#if defined _myinclude_file_prevent_double_include_
  #endinput
#endif
#define _myinclude_file_prevent_double_include_

native void OnEnteredProtectedZone(int client, int activator, char[] Prefix);
native void OnLeftProtectedZone(int client, int activator, char[] Prefix);

В теории вроде так, я незнаю пишу просто) без практики. Может где-то ошибку сделал.

Далее просто создаешь свой плагин с нуля.
И теперь все оч просто.
Инклудишь .inc файлик что ты создал.
Добавляешь событие OnEnteredProtectedZone
И обработку делаешь копируя код из AntiBhop.

(если хочешь ковырнуть плагин изначальный, (просто добавив блок в Switch)
который возможно поддерживается разработчиком,
то учти что дальнейшие обновления ты не поставишь этого плагина, так как ковырнул его сам)

Сделать можно всё что угодно) я думаю найдётся человечек который потратит на это пару минут.
--- Добавлено позже ---

ОТВЕТ 2 ДЛЯ Felton

Как я понял у тебя плагин работает на всех игроков? Этот флаг b - GENERIC ADMIN.
Значит тебе по сути нужно для всех плагинов чтобы работало только.

Окей, смотришь строчку 54. Именно тут магия и происходит.
Для проверки флагов можно почитать тут - Checking Admin Flags (SourceMod Scripting) - AlliedModders Wiki (если тебе интересно)
Если тебе ничего не интересно, можешь не смотреть.

В целом мы имеем код:
C-подобный:
    if(damagetype == DMG_DROWN || damagetype == DMG_DROWNRECOVER)
    {
        damage = 0.0;
 
        return Plugin_Handled;
    }
Тут идёт проверка типа урона.
Установка урона на 0.

Для проверки флага добавляем строчку (можно удалить ADMFLAG_KICK)
C-подобный:
if (GetUserFlagBits(client) & (ADMFLAG_GENERIC | ADMFLAG_KICK) == (ADMFLAG_GENERIC | ADMFLAG_KICK))
{
    // User has both flags
}

ADMFLAG_GENERIC и есть по сути "b" только, "b" - упрощенный вариант записи для нубосиков.
C-подобный:
#define ADMFLAG_GENERIC                (1<<1)        /**< Convenience macro for Admin_Generic as a FlagBit */
#define ADMFLAG_KICK                (1<<2)        /**< Convenience macro for Admin_Kick as a FlagBit */

В итоге блок становится.
C-подобный:
    if(damagetype == DMG_DROWN || damagetype == DMG_DROWNRECOVER)
    {
         if (GetUserFlagBits(client) & (ADMFLAG_GENERIC | ADMFLAG_KICK) == (ADMFLAG_GENERIC | ADMFLAG_KICK))
        {
            damage = 0.0;
            return Plugin_Handled;
        }
    }

Вот и всё.
Можешь сам всё сделать в .sp файле.
Если сможешь :)
Благодарю за ответ. Жалко что я полный ноль и ничего не разберу из написанного, буду надеяться что кто-нибудь за это возьмется).
А что скажешь по поводу этого плагина?
 

SydikPro

Участник
Сообщения
1
Реакции
0
Здравствуйте, не мог бы кто-нибуть подкинуть код? Чтобы определённая команда выполнялась в определённое время?
(Учусь кодить).
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
Такое уже есть, и называется это Server Crontab.
Можете в нём посмотреть, как это реализовано.
 
Последнее редактирование:

Felton

Участник
Сообщения
799
Реакции
59
Где именно в этом планине [CS: Source] - WallHack Clients Death (с 7 поста от чела по имени Leckter Hannibal ) в исходнике поменять права с а на z(не нашол )
Помогите уже 2 дня мучаюсь и не получается.
 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
@Felton, тут вообще нигде права не прописаны.
C-подобный:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <sdkhooks>

#pragma tabsize 0




public Plugin:myinfo =
{
    name    = "WallHack",
    author    = "wS (World-Source.Ru)",
    version = "1.1"
};

new g_MySprite[MAXPLAYERS + 1];
new g_MySpriteRef[MAXPLAYERS + 1];

public OnPluginStart()
{
    
    HookEvent("player_spawn",    player_spawn);
    HookEvent("player_death",    ClearEvent);
    HookEvent("player_team",    ClearEvent);
}

public OnMapStart()
{
    AddFileToDownloadsTable("materials/sprites/player_blue_small33.vmt");
    AddFileToDownloadsTable("materials/sprites/player_blue_small33.vtf");
    AddFileToDownloadsTable("materials/sprites/player_red_small33.vmt");
    AddFileToDownloadsTable("materials/sprites/player_red_small33.vtf");

    PrecacheDecal("sprites/player_blue_small33.vmt",    true);
    PrecacheDecal("sprites/player_red_small33.vmt",    true);
}

public ClearEvent(Handle:event, const String:name[], bool:silent)
{
    wS_ClearSprite(GetClientOfUserId(GetEventInt(event, "userid")));
}

public player_spawn(Handle:event, const String:name[], bool:silent)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    CreateTimer(0.1, player_spawn_Timer, GetClientUserId(client), TIMER_FLAG_NO_MAPCHANGE);
}

public Action:player_spawn_Timer(Handle:timer, any:userid)
{
    new client = GetClientOfUserId(userid);
    if (client < 1) return Plugin_Stop;

    wS_ClearSprite(client);

    if (IsClientInGame(client) && !IsPlayerAlive(client)) return Plugin_Stop;

    new ent = CreateEntityByName("env_sprite");
    if (ent < 1)
    {
        LogError("env_sprite error");
        return Plugin_Stop;
    }

    g_MySprite[client] = ent;
    g_MySpriteRef[client] = EntIndexToEntRef(ent);

    decl Float:pos[3]; GetClientAbsOrigin(client, pos); pos[2] += 50.0;
    DispatchKeyValueVector(ent, "origin", pos);
    DispatchKeyValue(ent, "model", GetClientTeam(client) == 2 ? "sprites/player_red_small33.vmt" : "sprites/player_blue_small33.vmt");
    DispatchKeyValue(ent, "rendermode", "0");
    DispatchKeyValue(ent, "renderfx", "0");
    DispatchKeyValue(ent, "renderamt", "255");
    DispatchKeyValue(ent, "scale", "0.5");
    DispatchKeyValue(ent, "GlowProxySize", "61.0");
    DispatchSpawn(ent);

    SetVariantString("!activator");
    AcceptEntityInput(ent, "SetParent", client, ent);

    SDKHook(ent, SDKHook_SetTransmit, Hook_SetTransmit);

    return Plugin_Stop;
}

public Action:Hook_SetTransmit(entity, client)
{
    //return entity == g_MySprite[client] || IsPlayerAlive(client) ? Plugin_Handled : Plugin_Continue;
    if ((GetUserFlags(client) & ADMFLAG_ROOT) && IsClientInGame(client) && !IsPlayerAlive(client)) return Plugin_Continue; //Показываем
    else if (GetUserAdmin(client) == INVALID_ADMIN_ID || entity == g_MySprite[client] || IsPlayerAlive(client)) return Plugin_Handled; //Скрываем
    //return Plugin_Continue; //Показываем
    return Plugin_Continue;
}

stock wS_ClearSprite(client)
{
    if (g_MySprite[client] > 0)
    {
        new ent = EntRefToEntIndex(g_MySpriteRef[client]);
        if (ent > 0) AcceptEntityInput(ent, "Kill");
        g_MySprite[client] = 0;
        g_MySpriteRef[client] = 0;
    }
}

public OnClientDisconnect(client)
{
    wS_ClearSprite(client);
}
Попробуй, но я не уверен.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
@Felton, замени GetUserFlags на GetUserFlagBits
Слегка попутал название функции.
 

Felton

Участник
Сообщения
799
Реакции
59
Скомпелировал но плагин продолжает работать с флагом а
Проверил на домашнем снял с себя правва z и оставил только а и плагин как заботал с этими правами так и работает.Значит ковырять надо и в другом месте а где хз.
 

Leckter Hannibal

Участник
Сообщения
538
Реакции
182
@Kruzya, В том плагине прописано именно для флага А ,мне делал человечек .И работает он если у человека есть админский флаг А,тогда он видит метки на живом игроке.Я не скриптер не знаю что там не так .Но есть такой же только для всех игроков .
 

acik_traiks

Что нибудь напишем?)
Сообщения
770
Реакции
627
@Felton, вот вывел в отдельную stock тебе GetAdmin
#define ADMFLAG_RESERVATION (1<<0) /**< Convenience macro for Admin_Reservation as a FlagBit */
#define ADMFLAG_GENERIC (1<<1) /**< Convenience macro for Admin_Generic as a FlagBit */
#define ADMFLAG_KICK (1<<2) /**< Convenience macro for Admin_Kick as a FlagBit */
#define ADMFLAG_BAN (1<<3) /**< Convenience macro for Admin_Ban as a FlagBit */
#define ADMFLAG_UNBAN (1<<4) /**< Convenience macro for Admin_Unban as a FlagBit */
#define ADMFLAG_SLAY (1<<5) /**< Convenience macro for Admin_Slay as a FlagBit */
#define ADMFLAG_CHANGEMAP (1<<6) /**< Convenience macro for Admin_Changemap as a FlagBit */
#define ADMFLAG_CONVARS (1<<7) /**< Convenience macro for Admin_Convars as a FlagBit */
#define ADMFLAG_CONFIG (1<<8) /**< Convenience macro for Admin_Config as a FlagBit */
#define ADMFLAG_CHAT (1<<9) /**< Convenience macro for Admin_Chat as a FlagBit */
#define ADMFLAG_VOTE (1<<10) /**< Convenience macro for Admin_Vote as a FlagBit */
#define ADMFLAG_PASSWORD (1<<11) /**< Convenience macro for Admin_Password as a FlagBit */
#define ADMFLAG_RCON (1<<12) /**< Convenience macro for Admin_RCON as a FlagBit */
#define ADMFLAG_CHEATS (1<<13) /**< Convenience macro for Admin_Cheats as a FlagBit */
#define ADMFLAG_ROOT (1<<14) /**< Convenience macro for Admin_Root as a FlagBit */
#define ADMFLAG_CUSTOM1 (1<<15) /**< Convenience macro for Admin_Custom1 as a FlagBit */
#define ADMFLAG_CUSTOM2 (1<<16) /**< Convenience macro for Admin_Custom2 as a FlagBit */
#define ADMFLAG_CUSTOM3 (1<<17) /**< Convenience macro for Admin_Custom3 as a FlagBit */
#define ADMFLAG_CUSTOM4 (1<<18) /**< Convenience macro for Admin_Custom4 as a FlagBit */
#define ADMFLAG_CUSTOM5 (1<<19) /**< Convenience macro for Admin_Custom5 as a FlagBit */
#define ADMFLAG_CUSTOM6 (1<<20) /**< Convenience macro for Admin_Custom6 as a FlagBit */
C-подобный:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <sdkhooks>

#pragma tabsize 0




public Plugin:myinfo =
{
    name    = "WallHack",
    author    = "wS (World-Source.Ru)",
    version = "1.1"
};

new g_MySprite[MAXPLAYERS + 1];
new g_MySpriteRef[MAXPLAYERS + 1];

public OnPluginStart()
{
 
    HookEvent("player_spawn",    player_spawn);
    HookEvent("player_death",    ClearEvent);
    HookEvent("player_team",    ClearEvent);
}

public OnMapStart()
{
    AddFileToDownloadsTable("materials/sprites/player_blue_small22.vmt");
    AddFileToDownloadsTable("materials/sprites/player_blue_small22.vtf");
    AddFileToDownloadsTable("materials/sprites/player_red_small22.vmt");
    AddFileToDownloadsTable("materials/sprites/player_red_small22.vtf");

    PrecacheDecal("sprites/player_blue_small22.vmt",    true);
    PrecacheDecal("sprites/player_red_small22.vmt",    true);
}

public ClearEvent(Handle:event, const String:name[], bool:silent)
{
    wS_ClearSprite(GetClientOfUserId(GetEventInt(event, "userid")));
}

public player_spawn(Handle:event, const String:name[], bool:silent)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    CreateTimer(0.1, player_spawn_Timer, GetClientUserId(client), TIMER_FLAG_NO_MAPCHANGE);
}

public Action:player_spawn_Timer(Handle:timer, any:userid)
{
    new client = GetClientOfUserId(userid);
    if (client < 1) return Plugin_Stop;

    wS_ClearSprite(client);

    if (IsClientInGame(client) && !IsPlayerAlive(client)) return Plugin_Stop;

    new ent = CreateEntityByName("env_sprite");
    if (ent < 1)
    {
        LogError("env_sprite error");
        return Plugin_Stop;
    }

    g_MySprite[client] = ent;
    g_MySpriteRef[client] = EntIndexToEntRef(ent);

    decl Float:pos[3]; GetClientAbsOrigin(client, pos); pos[2] += 50.0;
    DispatchKeyValueVector(ent, "origin", pos);
    DispatchKeyValue(ent, "model", GetClientTeam(client) == 2 ? "sprites/player_red_small22.vmt" : "sprites/player_blue_small22.vmt");
    DispatchKeyValue(ent, "rendermode", "0");
    DispatchKeyValue(ent, "renderfx", "0");
    DispatchKeyValue(ent, "renderamt", "255");
    DispatchKeyValue(ent, "scale", "0.5");
    DispatchKeyValue(ent, "GlowProxySize", "61.0");
    DispatchSpawn(ent);

    SetVariantString("!activator");
    AcceptEntityInput(ent, "SetParent", client, ent);

    SDKHook(ent, SDKHook_SetTransmit, Hook_SetTransmit);

    return Plugin_Stop;
}

public Action:Hook_SetTransmit(entity, client)
{
    if(entity == g_MySprite[client])
    {
        return Plugin_Handled; //Скрываем
    }
    if(IsClientInGame(client) && GetAdmin(client))
    {
        if(!IsPlayerAlive(client))
        {
            return Plugin_Continue; //Показываем
        }
    }
    return Plugin_Handled; //Скрываем
}


stock bool:GetAdmin(client)
{
    new iFlags = GetUserFlagBits(client);
    if(iFlags & ADMFLAG_ROOT) return true;                      // Root
    if(iFlags & ADMFLAG_RESERVATION) return true;      // A
    if(iFlags & ADMFLAG_GENERIC ) return true;              // B
 
    return false;
}

stock wS_ClearSprite(client)
{
    if (g_MySprite[client] > 0)
    {
        new ent = EntRefToEntIndex(g_MySpriteRef[client]);
        if (ent > 0) AcceptEntityInput(ent, "Kill");
        g_MySprite[client] = 0;
        g_MySpriteRef[client] = 0;
    }
}

public OnClientDisconnect(client)
{
    wS_ClearSprite(client);
}
Удалишь Root и только будет показывать если у админа прописан флаг "a/b", а не чистый "z"
 
Последнее редактирование:

acik_traiks

Что нибудь напишем?)
Сообщения
770
Реакции
627
@Felton, в admin_simple
Если убирешь проверку на Root то
то у такого админа "Steam" "99:z" // не будет
а у такого "Steam" "99:abz" // будет
Понял? Нет то забей просто ROOT оставляй
 
Последнее редактирование:

Felton

Участник
Сообщения
799
Реакции
59
Мне надо чтобы на а не работал а на z он и так работает
 

acik_traiks

Что нибудь напишем?)
Сообщения
770
Реакции
627
Не работал
if(iFlags & ADMFLAG_RESERVATION) return false; // A
 

Felton

Участник
Сообщения
799
Реакции
59
@acik
Ну вроде разобраля.Мне надо было что бы этот плагин не работал на а и б.Сделал на d .Всё ок!
На "99:z" и на "1:abcdefgjhk" -работает.
На "ab" -не работает.
Это то что я хотел от этого плагина.
Спасибо всем кто откликнулся!

Единнсвенно есть одно но- сервер у меня Counter-Strike Source -DeathMatch и вот когда тебя убили плагин сразу включается (навернно так не должно)В исходнике есть параметр CreateTimer(0.1, player_spawn_Timer -может тут что то поменять что бы он включался чуть позже?(я в этом не силён а вдруг поможет)?

@acik
Установил CreateTimer(2.0, player_spawn_Timer но результат тот же.Как увеличить время что бы плагин сработал ну скажем через секунды 3 после того как тебя убили? и какой параметр в исходнике за это отвечает?
 
Последнее редактирование:
F

FBI

Люди помогите подобрать плагин, или правильно поставить через этот плагин http://hlmod.ru/threads/map-zones.22736/по возможности блокировку рампов на карте авп лего 2 (желательно с отнятием хп к примеру -99) игра ксго
 

Вложения

  • Снимок.PNG
    Снимок.PNG
    53.4 КБ · Просмотры: 72

acik_traiks

Что нибудь напишем?)
Сообщения
770
Реакции
627
@Felton, такого параметра нету в исходники, его надо делать самому
HookEvent("player_spawn", player_spawn); - это событие спаун игрока
после как игрок появится, через 0,1 (ты поставил 2,0) секунду создается эта текстура вх и хокуеться на невидимость "SDKHook(ent,SDKHook_SetTransmit,Hook_SetTransmit);"

тебе нужно добавить:
1) Дополнительную глобальную массивную переменную bool
2) И когда игрок умирает создать таймер, чтоб видимость была доступна, скажем через 5 сек.

Создаем новую переменную g_IsVisib отвечающие за видимость вх-текстур
C-подобный:
public Plugin:myinfo =
{
    name    = "WallHack",
    author    = "wS (World-Source.Ru)",
    version = "1.1"
};

new g_MySprite[MAXPLAYERS + 1];
new g_MySpriteRef[MAXPLAYERS + 1];

new bool:g_IsVisib[MAXPLAYERS + 1]; // Вот она
Создаем таймер для включения видимости, через 5,0 сек после смерти
C-подобный:
public ClearEvent(Handle:event, const String:name[], bool:silent)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    wS_ClearSprite(client);
    // Узнаем название Hook-a
    decl String:sNameEvent[128];
    GetEventName(event, sNameEvent, sizeof(sNameEvent));
    // Сверяем название Hook-a
    if(StrEqual(sNameEvent, "player_death"))
    {
        //Если Hook это player_death создаем таймер
        CreateTimer(5.0, OnVisib, client);
    }
}
Ниже создаем событие OnVisib которое запускается через 5 сек после смерти включает видимость
C-подобный:
public Action:OnVisib(Handle:timer, any:client)
{
    // Если он в игре включаем видимость вх-текстур
    if(IsClientInGame(client))
        IsVisib[client] = true;
}
Выключаем видимость:
1) Когда игрок спамиться
C-подобный:
public player_spawn(Handle:event, const String:name[], bool:silent)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    g_IsVisib[client] = false;
    CreateTimer(0.1, player_spawn_Timer, GetClientUserId(client), TIMER_FLAG_NO_MAPCHANGE);
}
2) Когда выходит с сервера
C-подобный:
public OnClientDisconnect(client)
{
    wS_ClearSprite(client);
    g_IsVisib[client] = false;
}
Здесь проверяем на видимость
C-подобный:
public Action:Hook_SetTransmit(entity, client)
{
    if(entity == g_MySprite[client])
    {
        return Plugin_Handled; //Скрываем
    }
    if(IsClientInGame(client) && GetAdmin(client))
    {
        // Игрок не живой и Видимость разрещена
        if(!IsPlayerAlive(client) && g_IsVisib[client])
        {
            return Plugin_Continue; //Показываем
        }
    }
    return Plugin_Handled; //Скрываем
}

Оффтоп

И покажи как ты сделал в этом событие "stock bool:GetAdmin(client)" флаги
--- Добавлено позже ---
@FBI, попробуй создай ее лесенкой
 
Последнее редактирование:
Сверху Снизу