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

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
а толку рефреш делать?
Чтобы он помогал (да и простой перезагрузки только этого плагина должно хватать) в OnPluginStart() нужно добавть строку for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i)) OnClientPutInServer(i);
 
  • Мне нравится
Реакции: Deff

Deff

Участник
Сообщения
350
Реакции
137
for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i)) OnClientPutInServer(i);
После добавления данной строки - сервер крашит (при подключении GOTV бота)

Убрал данную строчку: for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i)) OnClientPutInServer(i); и перезапустил сервер,все работает,огромное спасибо
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
ну значит нужно ещё добавлять проверку является ли игрок SourceTV
 

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
Напишу по-приколу. Вдруг кто напишет.

Есть CS:S v34. В ней не существует Assist Kill.
Есть ClientMod - модифицированный клиент, собственно, CS:S v34.
У ClientMod есть API. Этот клиент поддерживает Assist Kill.
Разработчик дал пример. Нужен, соответственно, готовый плагин.

Что должно получиться? Я должен буду видеть иконки ассистов справа сверху.

ClientMod требует SM 1.7+. Я использую SM 1.9.

Ну, вроде бы, всё.
 
Последнее редактирование:

Mensi1337

Участник
Сообщения
242
Реакции
16
Ребят, как эту строчку можно написать на старом синтаксе(sm 1.6)?
PHP:
for(int i = 1; i != view_as<int>(LR_StatsType)-1; i++)
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
Ребят, как эту строчку можно написать на старом синтаксе(sm 1.6)?
PHP:
for(int i = 1; i != view_as<int>(LR_StatsType)-1; i++)
C++:
for (new i = 1; i != (_:LR_StatsType)-1; i++)
По идее так.
И, пожалуйста, на форуме есть поддержка C++ синтаксиса (наконец-то), используйте его вместо PHP. Намного нагляднее подсветка срабатывает.
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Что возвращает несуществующий натив?

Такая история: есть два плагина, один создаёт натив, а второй его обрабатывает (передаётся число, id[client]). Во втором плагине зазначено что натив является не обезательным, что будет возвращать натив, если первый плагин выключить?
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
Ничего. Ошибку будет возвращать.
Можно проверить существование натива.
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Как проверять наличие загруженного плагина по его названию файла?
Если плагин (его и проверяем на наявность), который создаёт натив (но не регистрирует библиотеку RegPluginLibrary()), как проверять наявность этого плагина через OnLibraryAdded / OnLibraryRemoved?
Или есть другие способы проверить статус натива когда выгружается/загружается плагин?
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
Как проверять наличие загруженного плагина по его названию файла?
C++:
if (FindPluginByFile("vip/VIP_Core.smx") != null)
{
    // плагин загружен
}

Если плагин (его и проверяем на наявность), который создаёт натив (но не регистрирует библиотеку RegPluginLibrary()), как проверять наявность этого плагина через OnLibraryAdded / OnLibraryRemoved?
Никак.

Или есть другие способы проверить статус натива когда выгружается/загружается плагин?
Я Вам постом выше ссылку дал на что?
C++:
if (GetFeatureStatus(FeatureType_Native, "VIP_IsClientVIP") == FeatureStatus_Available)
{
    // натив доступен ==> плагин загружен
}
 

September

Участник
Сообщения
5,238
Реакции
2,742
Может кто-то накидать скрипт для мута команды террористов в начале раунда на N секунд?
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
C++:
if (FindPluginByFile("vip/VIP_Core.smx") != null)
{
    // плагин загружен
}


Никак.


Я Вам постом выше ссылку дал на что?
C++:
if (GetFeatureStatus(FeatureType_Native, "VIP_IsClientVIP") == FeatureStatus_Available)
{
    // натив доступен ==> плагин загружен
}
Уже решил проблему, добавив в каждый модуль свою библиотеку...
C++:
public void OnAllPluginsLoaded()
{
    if(LibraryExists("FRS_Vip") || LibraryExists("FRS_VipFPS"))
        g_NativeVip    = !GetFeatureStatus(FeatureType_Native, "FRS_VIP_GetId");
    if(LibraryExists("FRS_cust"))
        g_NativeCust= !GetFeatureStatus(FeatureType_Native, "FRS_Cust_GetId");
    if(LibraryExists("FRS_lr") || LibraryExists("FRS_lrKento") || LibraryExists("FRS_lrFPS") || LibraryExists("FRS_lrRankme"))
        g_NativeLR    = !GetFeatureStatus(FeatureType_Native, "FRS_LR_GetId");
    if(LibraryExists("FRS_prime"))
        g_NativeLR    = !GetFeatureStatus(FeatureType_Native, "FRS_Prime_GetId");
    if(LibraryExists("FRS_shop"))
        g_NativeLR    = !GetFeatureStatus(FeatureType_Native, "FRS_Shop_GetId");
}

public void OnLibraryAdded(const char[] name)
{
    if(StrEqual(name, "FRS_Vip") || StrEqual(name, "FRS_VipFPS"))
        g_NativeVip    = true;
    else if(StrEqual(name, "FRS_lr") || StrEqual(name, "FRS_lrKento") || StrEqual(name, "FRS_lrFPS") || StrEqual(name, "FRS_lrRankme"))
        g_NativeLR    = true;
    else if(LibraryExists("FRS_prime"))
        g_NativePrime = true;  
    else if(StrEqual(name, "FRS_cust"))
        g_NativeCust = true;
    else if(StrEqual(name, "FRS_shop"))
        g_NativeShop = true;
}

public void OnLibraryRemoved(const char[] name)
{
    if(StrEqual(name, "FRS_Vip") || StrEqual(name, "FRS_VipFPS"))
        g_NativeVip    = false;
    else if(StrEqual(name, "FRS_lr") || StrEqual(name, "FRS_lrKento") || StrEqual(name, "FRS_lrFPS") || StrEqual(name, "FRS_lrRankme"))
        g_NativeLR    = false;
    else if(LibraryExists("FRS_prime"))
        g_NativePrime = false;
    else if(StrEqual(name, "FRS_cust"))
        g_NativeCust= false;
    else if(StrEqual(name, "FRS_shop"))
        g_NativeShop= false;
}
 
Последнее редактирование:

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Как округлить float число до ближайшей цифры у нуля? то-есть есть число 13,33333333, как его округлить до 13,3?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Loco, тебе для вывода куда-то в виде текста?
Сообщения автоматически склеены:

Запрашивал StrAnn1k, но, пока я писал плагин, тему потёрли. Так что выложу здесь.
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_functions>
#include <sdktools_entinput>

int iReplaces;
char sReplace[32];

public void OnPluginStart()
{
    ConVar cvar;
    (cvar = CreateConVar("sm_awp_replace", "weapon_ssg08", "The item that will replace the AWP. Leave blank if you want to disable the plugin", FCVAR_NOTIFY|FCVAR_PRINTABLEONLY)).AddChangeHook(CVarChanged);
    CVarChanged(cvar, NULL_STRING, NULL_STRING);

    AutoExecConfig(true, "awp_replace");
}

public void CVarChanged(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    cvar.GetString(sReplace, sizeof(sReplace));
    TrimString(sReplace);
    int num = FindCharInString(sReplace, ' ');
    if(num > 8) sReplace[num] = 0;
    else if(num != -1) sReplace[0] = 0;
}

public void OnMapStart()
{
    char map[8];
    GetCurrentMap(map, sizeof(map));
    bool hooked;
    if(hooked == !StrContains(map, "awp_", false)) return;

    if((hooked = !hooked))
        HookEvent("round_freeze_end", Event_FreezeEnd, EventHookMode_PostNoCopy);
    else UnhookEvent("round_freeze_end", Event_FreezeEnd, EventHookMode_PostNoCopy);
}

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

    iReplaces = 0;
    int ent = MaxClients + 1, wpn;
    float pos[3], ang[3];
    while((ent = FindEntityByClassname(ent, "weapon_awp")) > MaxClients + 1)
    {
        if(IsHaveOwner(ent)) continue;

        GetEntPropVector(ent, Prop_Send, "m_vecOrigin", pos);
        GetEntPropVector(ent, Prop_Data, "m_angRotation", ang);
        AcceptEntityInput(ent, "Kill");
        if((wpn = CreateEntityByName(sReplace)) == -1) continue;

        if(!DispatchSpawn(wpn)) continue;

        TeleportEntity(wpn, pos, ang, NULL_VECTOR);
        iReplaces++;
    }
    PrintToServer("\n%i entities 'weapon_awp' changed by '%s'\n", iReplaces, sReplace);
}

stock bool IsHaveOwner(int ent)
{
    static int owner;
    owner = GetEntPropEnt(ent, Prop_Data, "m_hOwnerEntity");
    if(owner > MaxClients || owner < 1 || !IsClientInGame(owner)) return false;

    RemovePlayerItem(owner, ent);
    AcceptEntityInput(ent, "Kill");
    if(GivePlayerItem(owner, sReplace) > MaxClients) iReplaces++;
    return true;
}
В начале раунда по завершению фризтайма заменяет все weapon_awp на твою энтити, которую ты пропишешь в квар sm_awp_replace (плагин автоматически создаёт файл конфига с именем awp_replace) на картах, имя которых начинается на awp_
По завершении замен плагин в консоль сервера сообщит о количестве удачных замен.
Если в кваре прописан несуществующий класс, то АВП просто удалятся, если имя класса для замены короче 8 символов, то плагин не будет удалять АВП
 

Вложения

  • 3.sp
    2.1 КБ · Просмотры: 6

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Loco, тебе для вывода куда-то в виде текста?
Сообщения автоматически склеены:

Запрашивал StrAnn1k, но, пока я писал плагин, тему потёрли. Так что выложу здесь.
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_functions>
#include <sdktools_entinput>

int iReplaces;
char sReplace[32];

public void OnPluginStart()
{
    ConVar cvar;
    (cvar = CreateConVar("sm_awp_replace", "weapon_ssg08", "The item that will replace the AWP. Leave blank if you want to disable the plugin", FCVAR_NOTIFY|FCVAR_PRINTABLEONLY)).AddChangeHook(CVarChanged);
    CVarChanged(cvar, NULL_STRING, NULL_STRING);

    AutoExecConfig(true, "awp_replace");
}

public void CVarChanged(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    cvar.GetString(sReplace, sizeof(sReplace));
    TrimString(sReplace);
    int num = FindCharInString(sReplace, ' ');
    if(num > 8) sReplace[num] = 0;
    else if(num != -1) sReplace[0] = 0;
}

public void OnMapStart()
{
    char map[8];
    GetCurrentMap(map, sizeof(map));
    bool hooked;
    if(hooked == !StrContains(map, "awp_", false)) return;

    if((hooked = !hooked))
        HookEvent("round_freeze_end", Event_FreezeEnd, EventHookMode_PostNoCopy);
    else UnhookEvent("round_freeze_end", Event_FreezeEnd, EventHookMode_PostNoCopy);
}

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

    iReplaces = 0;
    int ent = MaxClients + 1, wpn;
    float pos[3], ang[3];
    while((ent = FindEntityByClassname(ent, "weapon_awp")) > MaxClients + 1)
    {
        if(IsHaveOwner(ent)) continue;

        GetEntPropVector(ent, Prop_Send, "m_vecOrigin", pos);
        GetEntPropVector(ent, Prop_Data, "m_angRotation", ang);
        AcceptEntityInput(ent, "Kill");
        if((wpn = CreateEntityByName(sReplace)) == -1) continue;

        if(!DispatchSpawn(wpn)) continue;

        TeleportEntity(wpn, pos, ang, NULL_VECTOR);
        iReplaces++;
    }
    PrintToServer("\n%i entities 'weapon_awp' changed by '%s'\n", iReplaces, sReplace);
}

stock bool IsHaveOwner(int ent)
{
    static int owner;
    owner = GetEntPropEnt(ent, Prop_Data, "m_hOwnerEntity");
    if(owner > MaxClients || owner < 1 || !IsClientInGame(owner)) return false;

    RemovePlayerItem(owner, ent);
    AcceptEntityInput(ent, "Kill");
    if(GivePlayerItem(owner, sReplace) > MaxClients) iReplaces++;
    return true;
}
В начале раунда по завершению фризтайма заменяет все weapon_awp на твою энтити, которую ты пропишешь в квар sm_awp_replace (плагин автоматически создаёт файл конфига с именем awp_replace) на картах, имя которых начинается на awp_
По завершении замен плагин в консоль сервера сообщит о количестве удачных замен.
Если в кваре прописан несуществующий класс, то АВП просто удалятся, если имя класса для замены короче 8 символов, то плагин не будет удалять АВП
Мне для указания таймеру время нужно, типо там деления основного времени происходит, и бывают числа с большим хвостом (0,0000000)
44729


 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Смысл тогда округлять? Не заморачивайся: как не округляй всё равно в результате плагин увидит в результате что-то типа 3.2999999 вместо 3.3
 
Сверху Снизу