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

DarkerZ

Участник
Сообщения
395
Реакции
175
@Grey83, Я не думаю так, чтоб за одну карту умерло 65 человек и все пытались перезайти. =)) Это не контра где большая масса народа может быть. Я проверил свой вариант вроде работает. Но я не делал отладка после удаление steam idов. Так будет очищаться?
в чём проблема использовать например ArrayList для хранения SteamID?
 

dr lex

Участник
Сообщения
22
Реакции
5
Игра L4D. Это недостаточная проверка. Зачем я буду записывать туда всех зараженных ещё?
Сообщения автоматически склеены:

@Grey83, Я не думаю так, чтоб за одну карту умерло 65 человек и все пытались перезайти. =)) Это не контра где большая масса народа может быть. Я проверил свой вариант вроде работает. Но я не делал отладка после удаление steam idов. Так будет очищаться?
Я так понимаю пытаешься сделать свои анти-реконект?
У себя я делал путем записывания steam ip в файл (KeyValues) с временем. Если игрок подключается раньше этого времени его кикает с сообщением когда он может зайти сново. При смене карты делаю чистку файла и по новой.
 
Последнее редактирование:

Dragokas

Добрая душа
Сообщения
229
Реакции
213
Вот так вот у меня получилось. Что думаете?
Это вряд ли будет работать надёжно, т.к. при перезаходе индекс клиента может поменяться (если я правильно понял по этому несвязному кусочку кода).

Зачем записывать его заранее, если возможно игрок не умрёт и просто выйдет сервера?
В целом, это делается, чтобы не получить проблему, как в этой теме: Фикс от STEAM_ID_STOP_IGNORING_RETVALS
и чтобы не звать каждый раз функцию получения SteamId (экономия проца).
При входе вы просто ловите готовый SteamId через форвард OnClientAuthorized() и кешируете его в массив для последующего использования. Очистка выполняется в событии player_disconnect.

Лишний раз будет занимать память по мне так и всё.
< 1 KB из 2 GB свободных (или сколько у вас). При этом экономятся циклы процессора, что более важно.

Я бы задачу решил иначе, ставил бы pre-хук на player_disconnect и проверял IsPlayerAlive(). Если мёртв, заносил SteamId в StringMap. Я не проверял это, так что нужен тест. Возможно, для этого хука будет слишком поздно получать статус игрока, тогда делать как у вас, - ловить через player_death и хранить флаг в bool массиве, затем очищать в player_spawn и round_start.
StringMap можно очищать, например, в round_start.
При заходе в OnClientAuthorized() поиск в StringMap, если найден, делать отсрочку или что у вас по логике.
 

alexmy

Участник
Сообщения
284
Реакции
13
@dr lex, По индексу игрока смысла нету проверять. Он постоянно меняется... А вот по steam id вообще нормально. Без отказно работает.
Сообщения автоматически склеены:

@Dragokas, Причём тут индекс игрока? Я про него даже слова не написал. Проверка при подключение по Steam id, steam id не когда не меняется.
 

Harsh USSR ☭

Участник
Сообщения
104
Реакции
2
Привет ребят помогите исправить плагин ноублока мне нужно добавить в исходник что бы ноублок работал и для заложников что бы можно было проходить сквозь них (другой ноублок не предлагать) сервер cs source steam
C-подобный:
#include <sourcemod>

int g_offsCollisionGroup;
ConVar sm_noblock;
ConVar sm_noblock_nade;

public void OnPluginStart()
{
    g_offsCollisionGroup = FindSendPropInfo("CBaseEntity", "m_CollisionGroup");
    if (g_offsCollisionGroup == -1) {
        PrintToServer("* FATAL ERROR: Failed to get offset for CBaseEntity::m_CollisionGroup");
    }
    else {
        HookEvent("player_spawn", OnSpawn, EventHookMode_Post);
        sm_noblock = CreateConVar("sm_noblock", "1", "Removes player vs. player collisions", 0|FCVAR_NOTIFY, true, 0.0, true, 1.0);
        sm_noblock_nade = CreateConVar("sm_noblock_nade", "0", "Removes player vs. nade collisions", 0|FCVAR_NOTIFY, true, 0.0, true, 1.0);
        HookConVarChange(sm_noblock, OnConVarChange);
    }
}

public void OnConVarChange(Handle cvar, const char[] oldValue, const char[] newValue)
{
    switch (StringToInt(newValue))
    {
        case 0:
        {
            UnhookEvent("player_spawn", OnSpawn, EventHookMode_Post);
            Setblock();
        }
        case 1:
        {
            HookEvent("player_spawn", OnSpawn, EventHookMode_Post);
            Setblock();
        }
    }
}

public void OnEntityCreated(int entity, const char[] classname)
{
    if(GetConVarBool(sm_noblock) && GetConVarBool(sm_noblock_nade))
    {
        if (StrEqual(classname, "hegrenade_projectile") ||
            StrEqual(classname, "flashbang_projectile") ||
            StrEqual(classname, "knife_projectile")     ||
            StrEqual(classname, "smokegrenade_projectile")) {
            SetEntData(entity, g_offsCollisionGroup, 2, 4, true);
        }
    }
}

void Setblock()
{
    for (int i = 1; i <= MaxClients; i++)
    {
        if(IsClientInGame(i) && IsPlayerAlive(i))
        {
            if(!GetConVarBool(sm_noblock)) {
                SetEntData(i, g_offsCollisionGroup, 5, 4, true);
            }
            if(GetConVarBool(sm_noblock)) {
                SetEntData(i, g_offsCollisionGroup, 2, 4, true);
            }
        }
    }
}

public Action OnSpawn(Event event, const char[] name, bool dontBroadcast)
{
    int entity = GetClientOfUserId(event.GetInt("userid"));
    SetEntData(entity, g_offsCollisionGroup, 2, 4, true);
    return Plugin_Continue;
}
 

dr lex

Участник
Сообщения
22
Реакции
5
@dr lex, По индексу игрока смысла нету проверять. Он постоянно меняется... А вот по steam id вообще нормально. Без отказно работает.

Вот пример, по сути готовый плагин

Death Disconnect:
#pragma semicolon 1
#pragma newdecls required
#include <sourcemod>
#include <sdktools>

char sg_ar_file[160];

int ig_deadplay[MAXPLAYERS + 1];

public Plugin myinfo =
{
    name = "Death Disconnect",
    author = "dr lex",
    description = "",
    version = "1.0",
    url = "http://steamcommunity.com/id/dr_lex"
}

public void OnPluginStart()
{
    HookEvent("player_death", Event_PlayerDeath);
    HookEvent("player_disconnect", Event_PlayerDisconnect);
}

public void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    if (!IsFakeClient(client))
    {
        if (GetClientTeam(client) == 2)
        {
            ig_deadplay[client] = 1;
        }
    }
}

public void Event_PlayerDisconnect(Event event, const char[] name, bool dontBroadcast)
{
    if (!event.GetBool("bot"))
    {
        int client = GetClientOfUserId(event.GetInt("userid"));
        if (client && IsClientInGame(client))
        {
            if (ig_deadplay[client])
            {
                char s1[32];
                event.GetString("networkid", s1, sizeof(s1));
               
                KeyValues h1 = new KeyValues("ban_connect");
                h1.ImportFromFile(sg_ar_file);
                h1.JumpToKey(s1, true);
               
                int iBan = h1.GetNum("ban_connect", 0);
                if (iBan < GetTime())
                {
                    int iTimeBan = GetTime() + 60*3;
                    h1.SetNum("ban_connect", iTimeBan);
                    h1.Rewind();
                    h1.ExportToFile(sg_ar_file);
                }
                delete h1;
            }
        }
    }
}

public void OnConfigsExecuted()
{
    BuildPath(Path_SM, sg_ar_file, sizeof(sg_ar_file)-1, "data/Anti_Reconnect.txt");
}

public void OnMapStart()
{
    HXdeletFile(sg_ar_file);
}

public void OnClientPostAdminCheck(int client)
{
    if (!IsFakeClient(client))
    {
        ig_deadplay[client] = 0;
       
        char s1[24];
        GetClientAuthId(client, AuthId_Steam2, s1, sizeof(s1)-1);
       
        KeyValues h1 = new KeyValues("ban_connect");
        h1.ImportFromFile(sg_ar_file);
        h1.JumpToKey(s1, true);
       
        int iBan = h1.GetNum("ban_connect", 0);
        if (iBan > GetTime())
        {
            char sTime[24];
            FormatTime(sTime, sizeof(sTime)-1, "%Y-%m-%d %H:%M:%S", iBan);
            KickClient(client,"Banned connect(%s)", sTime);
        }
        delete h1;
    }
}

public void HXdeletFile(char [] sFile)
{
    File hFile = OpenFile(sFile, "w");
    if (hFile != null)
    {
        delete hFile;
    }
}
 

alexmy

Участник
Сообщения
284
Реакции
13
@dr lex, Спс. Но у меня совсем другая идея. Я реализовал плагин bebop. Теперь при каждом подключение. Создается новый бот и телепортируется к выжившим. Я особа не парился, многие знали перезаходили на сервер ну там чуть-чуть раз два и не более. Теперь многие это просекли и дрочат сервер постоянно перезаходят. Кикать я не хочу у меня есть анти-рекконект с киканием игрока при перезаходи. Суть заключается, если помер и перезаходит на сервер. Сидит также мёртв и ждёт пока спасут. Да я уже выше вариантов реализовал, работает чётко. Записывать в массив, очистка массива только при смене карты и проигрыше и всё.
 

Madness aka null138

Участник
Сообщения
713
Реакции
734
не обязательно каждый раз записывать и прочитать файл. можно просто сделать глобальный keyvalue и работать без файла, только на памяти.
 

dr lex

Участник
Сообщения
22
Реакции
5
не обязательно каждый раз записывать и прочитать файл. можно просто сделать глобальный keyvalue и работать без файла, только на памяти.
Есть много вариантов решения. По мне лучше записать в файл и забыть про него, а когда нужно прочитать. И память свободная будет от лишней информации и проблем меньше
 

DarkerZ

Участник
Сообщения
395
Реакции
175
Есть много вариантов решения. По мне лучше записать в файл и забыть про него, а когда нужно прочитать. И память свободная будет от лишней информации и проблем меньше
проблемы как раз есть и большие - быстродействие и оптимизация. запись и чтение в ОЗУ происходит гораздо быстрее, чем на HDD/SSD + ты в любом случае данные загружаешь в память(лишние действия, как по мне)
 

dr lex

Участник
Сообщения
22
Реакции
5
проблемы как раз есть и большие - быстродействие и оптимизация. запись и чтение в ОЗУ происходит гораздо быстрее, чем на HDD/SSD + ты в любом случае данные загружаешь в память(лишние действия, как по мне)
Оптимизация именно в том что они используются только тогда когда нужно и закрываются (освобождаются) после использования тем самым не засоряя память сервера.
В плане записи то смотря как реализовать чтение. Если запись не большую информацию то по сути разницы не заметишь) А держать её постоянно в памяти то что может не понадобится (не когда) как-то глупо.

Я заметил что в плане оптимизации в CS плагинах особо некто не парится тут. Загружают все в память а потом пишут что у них утечка памяти, сервера падают и много жрут железа). Для меня это лично дикость)

Для примера вот мой l4d2 сервер dump handles нечего лишнего в памяти нет) Сборка сама по себе огромная и сложная с постоянным он-лайном.
Файл сделан при Он-лайне 12 человек и временем работы сервера UpTime: 17:32:40
 

Вложения

  • handles_coop.txt
    49.3 КБ · Просмотры: 4

Madness aka null138

Участник
Сообщения
713
Реакции
734
ну при смене карт как раз и будет заметна оптимизация. у тебя оно будет за количество мертвых игроков выполнять функцию с открытием файла при смене карты каждый раз, в конце и в начале карты.
а так если тебя реально оптимизация важна до такого уровня, то после проверки времени игрока из файла, его лучше удалить в том случае, когда игрока пускает. ты же файл все равно открываешь, можешь просто добавить строку на удаление секции. а еще, я вижу на массивах лишний размер, например у глобальной пути, ип адреса игрока и т.д. ну и создавать int с практически неограниченным размером, чтобы использовать его как boolean(false, true) лишнее.

мой тебе совет, никогда не используй открытие файла при заходе/выходе игрока, либо на функциях которые часто вызываются. вот поэтому я и предложил вариант без использование файла. забивать память оно точно не будет так жестко, ибо там размер вообще в байтах, да и все равно ты его будешь грузить в память, хоть и на время.
-
как реальная ситуация, если за одну карту зайдут по несколько сотен разных игроков, а такое может быть как никак, то при следующих попытках открывать файл, будет микролаги на время, а то и большие лаги, когда игроки заходят - выходят.
 
Последнее редактирование:

lesha

Участник
Сообщения
84
Реакции
7
Добрый вечер! Помогите пожалуйста в плагин добавить таймер, или как это назвать по другому, я не знаю.

Что бы команда работала только после 13-ти секунд после старта раунда.
 

Вложения

  • noblocktrigger_2.sp
    3.2 КБ · Просмотры: 10

Doker0909

Участник
Сообщения
105
Реакции
3
CSS v34.
CW сервер.
SM 1.11
Здравствуйте. Очень прошу помощи. Ситуация такая: стоит "WarMod GameTech 3.0.15" + "Voice Users v1.1.1" (myarena), в плагине "Voice Users" есть несколько вариаций разделения голосового чата, в зависимости какой стоит "sv_alltalk" и мне нужно, чтоб когда матч не начат или закончился, то применялся квар "sv_alltalk 1" , но когда мачт запущен и идёт, то применялся квар "sv_alltalk 4".
Заранее спасибо.
Если такой плагин не пишется за "спасибо", то можем договориться за деньги.
 

lesha

Участник
Сообщения
84
Реакции
7
Помогите пожалуйста в плагин добавить таймер, или как это назвать по другому, я не знаю.

Что бы команда работала только после 13-ти секунд после старта раунда. Что сделал выше dr lex - перестал работать вообще
 

Вложения

  • noblocktrigger_2.sp
    3.2 КБ · Просмотры: 2
Последнее редактирование:

G.R.I.L.F.I.K.S

Участник
Сообщения
219
Реакции
60
Помогите пожалуйста в плагин добавить таймер, или как это назвать по другому, я не знаю.

Что бы команда работала только после 13-ти секунд после старта раунда. Что сделал выше dr lex - перестал работать вообще
Если ты для CSGO сервера то уже есть такой плагин. (Но думаю и на CSS будет работать, протестить думаю не будет сложно)
Юзаю я его уже как 1 год, но только в нем есть только одна проблема...
Иногда игроки застряют в друг друге... Если кто то может сделать отталкивания сильный, или как то это пофиксить...

У меня есть одна идея, но реально это или нет я хз просто пока ноу блок вкл и потом он офф а ты находишься в столкновения с игроком, то пока ты с него не выйдешь чтоб для тебя ноу блок не оффался...
Буду очень благодарен кто эту проблемы пофиксить.

Сам плагин работает хорошо на SM 10 и на старых версиях.

Установка:
1. Cfg закинуть в cfg/sourcemod
2. Транслит в addons/sourcemod/translations
 

Вложения

  • spawn_noblock_csgo.smx
    4.6 КБ · Просмотры: 1
  • spawn_noblock_csgo.sp
    3.8 КБ · Просмотры: 3
  • sm_spawn_noblock.cfg
    393 байт · Просмотры: 3
  • snb.phrases.txt
    201 байт · Просмотры: 2

lesha

Участник
Сообщения
84
Реакции
7
Если ты для CSGO сервера то уже есть такой плагин. (Но думаю и на CSS будет работать, протестить думаю не будет сложно)
Юзаю я его уже как 1 год, но только в нем есть только одна проблема...
Иногда игроки застряют в друг друге... Если кто то может сделать отталкивания сильный, или как то это пофиксить...

У меня есть одна идея, но реально это или нет я хз просто пока ноу блок вкл и потом он офф а ты находишься в столкновения с игроком, то пока ты с него не выйдешь чтоб для тебя ноу блок не оффался...
Буду очень благодарен кто эту проблемы пофиксить.

Сам плагин работает хорошо на SM 10 и на старых версиях.

Установка:
1. Cfg закинуть в cfg/sourcemod
2. Транслит в addons/sourcemod/translations
не это не то. У меня стоит noblock при спавне и начале раунда на 12 секунд. А эта команда !zstuck нужна для того что бы когда застял или нужно пройти кого то. И в нем люди не застревают пока что не выйдут из человека. Ну мне нужно что бы эта команда действовала только после 13 секунд от начала раунда
 

Envy

Участник
Сообщения
49
Реакции
2
Доброго времени суток! Кто сможет сделать быструю перезарядку на vip от r1ko с рабочей анимацией (как у WS). CSS v34
Готов заплатить!
 
Сверху Снизу