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

☠ ÄйӃи ☠

Добрая душа
Сообщения
220
Реакции
86
Прошу помощи.Вставьте в этот плагин квар на включение и выключение плагина.
C-подобный:
#pragma semicolon 1
#pragma tabsize 0
#include <sourcemod>
#include <sdktools>

public Plugin:myinfo =
{
    name = "No Scope",
    author = "",
    description = "No Scoping Plugin",
    version = "0.1b",
    url = ""
};

public OnPluginStart()
{
  CreateConVar("sm_noscope_version", "0.1b", "No Scope Version", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);
}

public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon)
{
    static iPrevButtons[66];
    if (buttons & 2048)
    {
        new active_weapon = GetEntPropEnt(client, PropType:0, "m_hActiveWeapon", 0);
        if (active_weapon != -1)
        {
            new String:g_szWeapon[32];
            GetEdictClassname(active_weapon, g_szWeapon, 32);
            if (StrEqual(g_szWeapon, "weapon_awp", false))
            {
                buttons = buttons & -2049;
            }
            if (StrEqual(g_szWeapon, "weapon_scout", false))
            {
                buttons = buttons & -2049;
            }
            if (StrEqual(g_szWeapon, "weapon_sg550", false))
            {
                buttons = buttons & -2049;
            }
            if (StrEqual(g_szWeapon, "weapon_g3sg1", false))
            {
                buttons = buttons & -2049;
            }
          
        }
    }
  
    iPrevButtons[client] = buttons;
    return Plugin_Continue;
}
Держи уже проверил =)
 

Вложения

  • nz.sp
    1.3 КБ · Просмотры: 13
  • nz.smx
    4.5 КБ · Просмотры: 3

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Держи уже проверил =)
привёл в божеский вид этот переделанный декомпил
PHP:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_hooks>

bool bEnabled;

public void OnPluginStart()
{
    ConVar CVar;
    (CVar = CreateConVar("sm_noscope_enable", "1", "On/Off block zoom for sniper rifles", FCVAR_NOTIFY, true, _, true, 1.0)).AddChangeHook(CVarChanged);
    bEnabled = CVar.BoolValue;

    AutoExecConfig(true, "noscope");
}

public void CVarChanged(ConVar CVar, const char[] oldValue, const char[] newValue)
{
    bEnabled = CVar.BoolValue;
}

public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon)
{
    if(bEnabled && (buttons & IN_ATTACK2))
    {
        static int active_weapon;
        if((active_weapon = GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon")) != -1)
        {
            static char wpn[32];
            GetEdictClassname(active_weapon, wpn, 32);
            if(StrEqual(wpn[7], "awp", false) || StrEqual(wpn[7], "scout", false)
            || StrEqual(wpn[7], "sg550", false) || StrEqual(wpn[7], "g3sg1", false))
                buttons &= ~IN_ATTACK2;
        }
    }

    return Plugin_Continue;
}
 

Вложения

  • noscope.sp
    1 КБ · Просмотры: 8
  • noscope.smx
    4.4 КБ · Просмотры: 2

edgar

Участник
Сообщения
139
Реакции
12
Прошу исправить код. При спавне появляется дигл, с которого нельзя стрелять) И при заходе в начале нового раунда дигл рабочий(не срабатывает плагин).
#pragma semicolon 1
#pragma newdecls required

ConVar hs_Weapon; char s_Weapon[22];

public void OnPluginStart()
{
hs_Weapon = CreateConVar("sm_weapondelete", "weapon_deagle", _);
hs_Weapon.AddChangeHook(Cvar_s_Weapon);
GetConVarString(hs_Weapon, s_Weapon, sizeof(s_Weapon));
HookEvent("round_start", Cleanup, EventHookMode_PostNoCopy);
AutoExecConfig(true, "weapondelete");
}

public void Cvar_s_Weapon(Handle convar, const char[] oldValue, const char[] newValue)
{
GetConVarString(hs_Weapon, s_Weapon, sizeof(s_Weapon));
}

public void Cleanup(Event event, const char[] name, bool dontBroadcast)
{
int maxEntitiesCout = GetEntityCount();
char SerWeapon[22];
for (int i = MaxClients + 1; i < maxEntitiesCout; ++i)
{
if (IsValidEdict(i) && GetEdictClassname(i, SerWeapon, sizeof(SerWeapon)))
{
if (strcmp(SerWeapon, s_Weapon) == 0)RemoveEdict(i);
}
}
}
 

Felton

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

public Plugin:myinfo =
{
    name    = "Spawn Protect",
    author    = "wS / Schmidt",
    version    = "1.1",
    url        = "http://world-source.ru/"
};

new Handle:spawn_protect_timer[MAXPLAYERS + 1];
new Handle:spawn_protect_sec;

public OnPluginStart()
{
    spawn_protect_sec = CreateConVar("spawn_protect_sec", "2", "Сколько сек защищать игрока после рождения", _, true, 1.0);
    HookEvent("player_spawn", player_spawn);
}


///


public player_spawn(Handle:event, const String:name[], bool:silent)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    Kill_Protect_Timer(client);
    SetEntProp(client, Prop_Data, "m_takedamage", 0);
    SetNewColor(client, 0, 255, 0, 75);
    spawn_protect_timer[client] = CreateTimer(GetConVarFloat(spawn_protect_sec), StopProtect, client);
}

SetNewColor(client, r, g, b, a)
{
    SetEntityRenderMode(client, RENDER_TRANSCOLOR);
    SetEntityRenderColor(client, r, g, b, a);
}

public Action:StopProtect(Handle:timer, any:client)
{
    spawn_protect_timer[client] = INVALID_HANDLE;
    if (IsPlayerAlive(client))
    {
        SetEntProp(client, Prop_Data, "m_takedamage", 2);
        SetNewColor(client, 255, 255, 255, 255);
    }
    return Plugin_Stop;
}


///


public OnClientDisconnect(client)
{
    Kill_Protect_Timer(client);
}

Kill_Protect_Timer(client)
{
    if (spawn_protect_timer[client] != INVALID_HANDLE)
    {
        KillTimer(spawn_protect_timer[client]);
        spawn_protect_timer[client] = INVALID_HANDLE;
    }
}
А можно в этом плагине переделать для каждой стороны задать свой цвет при рождении?для терроров один цвет а для кт другой.
@Райский
Не захотел на моём стареньком sourcemod компелироваться.Пришлась онлайн компилом воспользоваться.Всё ок.Ошибок нет.
@Grey83
А этот код даже онлайн компилом не компелиться.
Всем спасибо!
Да и вот еще можете ещё поправить плагин spawn_protect ?Заранее спасибо!
 

Felton

Участник
Сообщения
799
Реакции
59
@Grey83,
Ну это и понятно.У меня SM старенький вот и поэтому так.
А по вопросу spawn_protect сможеш помоч?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@edgar, для кода используй теги
HTML:
[PHP][/PHP]
При спавне появляется дигл, с которого нельзя стрелять)
Потому что неправильно удаляешь предмет.
И при заходе в начале нового раунда дигл рабочий(не срабатывает плагин).
А ты это событие и не отлавливаешь.

Пробуй вот так:
PHP:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_functions>
#include <sdktools_entinput>

int iWpnOffset = -1;
char sWeapon[22];

public void OnPluginStart()
{
    iWpnOffset = FindSendPropInfo("CCSPlayer", "m_hMyWeapons");

    ConVar CVar;
    (CVar = CreateConVar("sm_weapondelete", "weapon_deagle", _, FCVAR_PRINTABLEONLY)).AddChangeHook(CVarChanged);
    CVar.GetString(sWeapon, sizeof(sWeapon));
    TrimString(sWeapon);

    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("player_spawn", Event_PlayerSpawn);

    AutoExecConfig(true, "weapondelete");
}

public void CVarChanged(ConVar CVar, const char[] oldValue, const char[] newValue)
{
    strcopy(sWeapon, sizeof(sWeapon), newValue);
    TrimString(sWeapon);
}

public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    if(!sWeapon[0]) return;

    for(int i = MaxClients+1, max_ent = GetEntityCount(), client; i <= max_ent; ++i) if(IsWeaponValid(i))
    {
        if(0 < (client = GetEntPropEnt(i, Prop_Data, "m_hOwnerEntity")) <= MaxClients) RemovePlayerItem(client, i);
        AcceptEntityInput(i, "Kill");
    }
}

public void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
    static int client;
    if(!(client = GetClientOfUserId(event.GetInt("userid")))) return;

    static int i, ent;
    for(i = 0; i < 48; i++) if((ent = GetEntDataEnt2(client, iWpnOffset + i * 4)) != -1 && IsWeaponValid(i))
    {
        RemovePlayerItem(client, ent);
        AcceptEntityInput(ent, "Kill");
    }
}

stock bool IsWeaponValid(int entity)
{
    static char wpn[22];
    return IsValidEdict(entity) && GetEdictClassname(entity, wpn, sizeof(wpn)) && !strcmp(wpn, sWeapon);
}
 

Вложения

  • sm_weapondelete.sp
    1.7 КБ · Просмотры: 4
  • sm_weapondelete.smx
    5.1 КБ · Просмотры: 3

edgar

Участник
Сообщения
139
Реакции
12
@edgar, для кода используй теги
HTML:
[PHP][/PHP]
Потому что неправильно удаляешь предмет.А ты это событие и не отлавливаешь.

Пробуй вот так:
PHP:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_functions>
#include <sdktools_entinput>

int iWpnOffset = -1;
char sWeapon[22];

public void OnPluginStart()
{
    iWpnOffset = FindSendPropInfo("CCSPlayer", "m_hMyWeapons");

    ConVar CVar;
    (CVar = CreateConVar("sm_weapondelete", "weapon_deagle", _, FCVAR_PRINTABLEONLY)).AddChangeHook(CVarChanged);
    CVar.GetString(sWeapon, sizeof(sWeapon));
    TrimString(sWeapon);

    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("player_spawn", Event_PlayerSpawn);

    AutoExecConfig(true, "weapondelete");
}

public void CVarChanged(ConVar CVar, const char[] oldValue, const char[] newValue)
{
    strcopy(sWeapon, sizeof(sWeapon), newValue);
    TrimString(sWeapon);
}

public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    if(!sWeapon[0]) return;

    for(int i = MaxClients+1, max_ent = GetEntityCount(), client; i <= max_ent; ++i) if(IsWeaponValid(i))
    {
        if(0 < (client = GetEntPropEnt(i, Prop_Data, "m_hOwnerEntity")) <= MaxClients) RemovePlayerItem(client, i);
        AcceptEntityInput(i, "Kill");
    }
}

public void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
    static int client;
    if(!(client = GetClientOfUserId(event.GetInt("userid")))) return;

    static int i, ent;
    for(i = 0; i < 48; i++) if((ent = GetEntDataEnt2(client, iWpnOffset + i * 4)) != -1 && IsWeaponValid(i))
    {
        RemovePlayerItem(client, ent);
        AcceptEntityInput(ent, "Kill");
    }
}

stock bool IsWeaponValid(int entity)
{
    static char wpn[22];
    return IsValidEdict(entity) && GetEdictClassname(entity, wpn, sizeof(wpn)) && !strcmp(wpn, sWeapon);
}
Спасибо)
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Felton, ты про окрашивание игроков?
PHP:
#pragma semicolon 1

static const iColor[][] =
{
    {255, 64, 64},    // террористы
    {153, 204, 255}    // контр-террористы
};

public Plugin:myinfo =
{
    name    = "Spawn Protect",
    author    = "wS / Schmidt (mod by Grey83)",
    version    = "1.1.1",
    url        = "http://world-source.ru/"
};

new Handle:hProtectTimer[MAXPLAYERS+1],
    Float:fProtectTimer;

public OnPluginStart()
{
    new Handle:CVar;
    HookConVarChange((CVar = CreateConVar("spawn_protect_sec", "2", "Сколько сек защищать игрока после рождения (<1 - отключено)", _, true, 0.0)), CVarChanged);
    fProtectTimer = GetConVarFloat(CVar);

    HookEvent("player_spawn", Event_Spawn);
}

public CVarChanged(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    fProtectTimer = GetConVarFloat(CVar);
}

public Event_Spawn(Handle:event, const String:name[], bool:silent)
{
    if(fProtectTimer < 1) return;

    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    if(!client) return;

    new team = GetClientTeam(client);
    if(team < 2) return;

    team -= 2;
    SetNewColor(client, iColor[team][0], iColor[team][1], iColor[team][2], 75);
    Kill_Protect_Timer(client);
    SetEntProp(client, Prop_Data, "m_takedamage", 0);
    hProtectTimer[client] = CreateTimer(fProtectTimer, StopProtect, GetClientUserId(client));
}

public Action:StopProtect(Handle:timer, any:client)
{
    if((client = GetClientOfUserId(client)) && IsPlayerAlive(client))
    {
        SetEntProp(client, Prop_Data, "m_takedamage", 2);
        SetNewColor(client, 255, 255, 255, 255);
    }
    hProtectTimer[client] = INVALID_HANDLE;
}

SetNewColor(client, r, g, b, a)
{
    SetEntityRenderMode(client, RENDER_TRANSCOLOR);
    SetEntityRenderColor(client, r, g, b, a);
}

public OnClientDisconnect(client)
{
    Kill_Protect_Timer(client);
}

Kill_Protect_Timer(client)
{
    if(hProtectTimer[client] != INVALID_HANDLE)
    {
        KillTimer(hProtectTimer[client]);
        hProtectTimer[client] = INVALID_HANDLE;
    }
}
 

Вложения

  • spawn_protect.sp
    2 КБ · Просмотры: 10
  • spawn_protect.smx
    5.2 КБ · Просмотры: 2

Felton

Участник
Сообщения
799
Реакции
59
@Grey83,
Скомпелировалась бес проблем.Ошибки плагин не даёт.Всё ок!Ну не пойму как свой цвет добавить каждой команде.Тут они какието полу прозрачные а мне такого не надо.Почему в оригинале идет 4 цвета SetNewColor(client, 0, 255, 255, 250); а у тебя 3 {255, 64, 64}, // террористы.Возникает вопрос как установить свой цвет?За труды спасибо!
Я хотел теры красные-250 0 0 255
кт синие- 0 0 255 255
и как тут цвета менять не пойму.Тут то SetNewColor(client, 255, 255, 255, 255); а почему {153, 204, 255} // контр-террористы.
 
Последнее редактирование:

☠ ÄйӃи ☠

Добрая душа
Сообщения
220
Реакции
86
@Grey83,
Скомпелировалась бес проблем.Ошибки плагин не даёт.Всё ок!Ну не пойму как свой цвет добавить каждой команде.Тут они какието полу прозрачные а мне такого не надо.Почему в оригинале идет 4 цвета SetNewColor(client, 0, 255, 255, 250); а у тебя 3 {255, 64, 64}, // террористы.Возникает вопрос как установить свой цвет?За труды спасибо!
Я хотел теры красные-250 0 0 255
кт синие- 0 0 255 255
и как тут цвета менять не пойму.Тут то SetNewColor(client, 255, 255, 255, 255); а почему {153, 204, 255} // контр-террористы.
Тут цвета. Смотри колонку RGB
 

Felton

Участник
Сообщения
799
Реакции
59
@Райский,
И как мне это поможет?как были они поупрозрачные так и после смены цвета так и остались
{255, 0, 0}, // террористы
{0, 0, 255} // контр-террористы
Разные цвета устанавливал итог -они вообще не меняются.Мне нужно 4 цвета.
прбывал так
{255, 0, 0, 255 }, // террористы
{0, 0, 255, 255 } // контр-террористы
Цвета не меняются.
Вообщем поставил оригинал плагин с одним цветом SetNewColor(client, 0, 255, 255, 255)Жалкко что не получилось с двумя цветами.
 
Последнее редактирование:

☠ ÄйӃи ☠

Добрая душа
Сообщения
220
Реакции
86
@Райский,
И как мне это поможет?как были они поупрозрачные так и после смены цвета так и остались
{255, 0, 0}, // террористы
{0, 0, 255} // контр-террористы
Разные цвета устанавливал итог -они вообще не меняются.Мне нужно 4 цвета.
прбывал так
{255, 0, 0, 255 }, // террористы
{0, 0, 255, 255 } // контр-террористы
Цвета не меняются.
Вообщем поставил оригинал плагин с одним цветом SetNewColor(client, 0, 255, 255, 255)Жалкко что не получилось с двумя цветами.
Вот убрал RGBA , сделал RGB. Посмотри, то что тебе надо ?
 

Вложения

  • spawn_protect.smx
    6.4 КБ · Просмотры: 2
  • spawn_protect.sp
    1.9 КБ · Просмотры: 4

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Felton, в строке SetNewColor(client, iColor[team][0], iColor[team][1], iColor[team][2], 75); последний параметр отвечает за прозрачность.
Если хочешь сделать игрока полностью непрозрачным, то просто замени 75 на 255
А в массиве просто указаны значения для каналов: Красный, Зелёный и Синий
 

Felton

Участник
Сообщения
799
Реакции
59
@Райский
Твой код не захотел на моём стареньком sourcemod компелироваться -выдал много ошибокПришлась онлайн компилом воспользоваться.Закинул на домашний сервер.Выдаёт ошибку "spawn_protect.smx": Native "__FLOAT_LT__" was not found
@Grey83,
@Felton, в строке SetNewColor(client, iColor[team][0], iColor[team][1], iColor[team][2], 75); последний параметр отвечает за прозрачность.
Если хочешь сделать игрока полностью непрозрачным, то просто замени 75 на 255
А в массиве просто указаны значения для каналов: Красный, Зелёный и Синий
Сделал как написал всё работает как часики всё ок не эррорит.
Взял этот плагин от Grey83.Теперь работает как надо.Спасибо вам ребята за помощ!
 

☠ ÄйӃи ☠

Добрая душа
Сообщения
220
Реакции
86
@Райский
Твой код не захотел на моём стареньком sourcemod компелироваться -выдал много ошибокПришлась онлайн компилом воспользоваться.Закинул на домашний сервер.Выдаёт ошибку "spawn_protect.smx": Native "__FLOAT_LT__" was not found
@Grey83,

Сделал как написал всё работает как часики всё ок не эррорит.
Взял этот плагин от Grey83.Теперь работает как надо.Спасибо вам ребята за помощ!
То что я тебе кинул. Сам протестил и всё нормально smx приложил. Не каких Error нету компилю на SM 1.9 на сервере 1.8 и всё же проблем так и не обнаружил.
Ну ладно если что пиши еще поможем чем сможем =)
 

pashek71

Участник
Сообщения
232
Реакции
43
Подскажите как можно принудительно закончить раунд? игра cs:go
 

edgar

Участник
Сообщения
139
Реакции
12
@edgar, для кода используй теги
HTML:
[PHP][/PHP]
Потому что неправильно удаляешь предмет.А ты это событие и не отлавливаешь.

Пробуй вот так:
PHP:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_functions>
#include <sdktools_entinput>

int iWpnOffset = -1;
char sWeapon[22];

public void OnPluginStart()
{
    iWpnOffset = FindSendPropInfo("CCSPlayer", "m_hMyWeapons");

    ConVar CVar;
    (CVar = CreateConVar("sm_weapondelete", "weapon_deagle", _, FCVAR_PRINTABLEONLY)).AddChangeHook(CVarChanged);
    CVar.GetString(sWeapon, sizeof(sWeapon));
    TrimString(sWeapon);

    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("player_spawn", Event_PlayerSpawn);

    AutoExecConfig(true, "weapondelete");
}

public void CVarChanged(ConVar CVar, const char[] oldValue, const char[] newValue)
{
    strcopy(sWeapon, sizeof(sWeapon), newValue);
    TrimString(sWeapon);
}

public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    if(!sWeapon[0]) return;

    for(int i = MaxClients+1, max_ent = GetEntityCount(), client; i <= max_ent; ++i) if(IsWeaponValid(i))
    {
        if(0 < (client = GetEntPropEnt(i, Prop_Data, "m_hOwnerEntity")) <= MaxClients) RemovePlayerItem(client, i);
        AcceptEntityInput(i, "Kill");
    }
}

public void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
    static int client;
    if(!(client = GetClientOfUserId(event.GetInt("userid")))) return;

    static int i, ent;
    for(i = 0; i < 48; i++) if((ent = GetEntDataEnt2(client, iWpnOffset + i * 4)) != -1 && IsWeaponValid(i))
    {
        RemovePlayerItem(client, ent);
        AcceptEntityInput(ent, "Kill");
    }
}

stock bool IsWeaponValid(int entity)
{
    static char wpn[22];
    return IsValidEdict(entity) && GetEdictClassname(entity, wpn, sizeof(wpn)) && !strcmp(wpn, sWeapon);
}
Под определенный тайминт, если зайти со спеков за команду - дигл остается. Можно пофиксить это?
 
Сверху Снизу