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

NeLifeASkazka

Участник
Сообщения
128
Реакции
70
У меня в плагине пару десятков итемов с кулдауном на каждый, вот кроме как отдельными таймерами это делать, идей нет. Уж не знаю, разумный ли это предел)
Вместо handle, вы можете попробовать создать переменные int/float и сохранять время каждого игрока

Пример кода:
int iItem_1[MAXPLAYERS+1];
int iItem_2[MAXPLAYERS+1];

public void OnPluginStart(){
    RegConsoleCmd("sm_item1", cmd_item1);
    RegConsoleCmd("sm_item2", cmd_item2);
}
public void OnMapStart(){
    CreateTimer(0.1, GlobalTimer, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
}
public Action cmd_item1(int client, int args){
    if(iItem_1[client] == 0){ // если время действия предмета вышло
        iItem_1[client] = GetTime() + 10; // игрок покупает 1 предмет на 10 секунд
    }
}
public Action cmd_item2(int client, int args){
    if(iItem_2[client] == 0){
        iItem_2[client] = GetTime() + 5;
    }
}

public Action GlobalTimer(Handle timer){
    for(int client = 1; client <= MaxClients; client++){
        if(iItem_1[client] != 0 && (GetTime() - iItem_1[client]) <= 0){ // Если 1 предмет активен, и если время действия предмета уже равно 0
            iItem_1[client] = 0; // "выключаем" предмет
        }
        if(iItem_2[client] != 0 && (GetTime() - iItem_2[client]) <= 0){
            iItem_2[client] = 0;
        }
    }
}
 

Ice_Sochi

Участник
Сообщения
709
Реакции
413
Вместо handle, вы можете попробовать создать переменные int/float и сохранять время каждого игрока

Пример кода:
int iItem_1[MAXPLAYERS+1];
int iItem_2[MAXPLAYERS+1];

public void OnPluginStart(){
    RegConsoleCmd("sm_item1", cmd_item1);
    RegConsoleCmd("sm_item2", cmd_item2);
}
public void OnMapStart(){
    CreateTimer(0.1, GlobalTimer, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
}
public Action cmd_item1(int client, int args){
    if(iItem_1[client] == 0){ // если время действия предмета вышло
        iItem_1[client] = GetTime() + 10; // игрок покупает 1 предмет на 10 секунд
    }
}
public Action cmd_item2(int client, int args){
    if(iItem_2[client] == 0){
        iItem_2[client] = GetTime() + 5;
    }
}

public Action GlobalTimer(Handle timer){
    for(int client = 1; client <= MaxClients; client++){
        if(iItem_1[client] != 0 && (GetTime() - iItem_1[client]) <= 0){ // Если 1 предмет активен, и если время действия предмета уже равно 0
            iItem_1[client] = 0; // "выключаем" предмет
        }
        if(iItem_2[client] != 0 && (GetTime() - iItem_2[client]) <= 0){
            iItem_2[client] = 0;
        }
    }
}
Думал о таком, но кол-во настраивается в конфиге.
Придется, возможно, делать похожим образом, создав одну переменную g_iItem[65][32], но это наложит лимит, которого я не хочу)

Вопрос по лимиту хэндлов таки акутален
 

xstage

🏹
Сообщения
726
Реакции
754
Думал о таком, но кол-во настраивается в конфиге.
Придется, возможно, делать похожим образом, создав одну переменную g_iItem[65][32], но это наложит лимит, которого я не хочу)

Вопрос по лимиту хэндлов таки акутален
Глобальный лимит = 1 << 20 (1 048 576)
 

Ice_Sochi

Участник
Сообщения
709
Реакции
413
Глобальный лимит = 1 << 20 (1 048 576)
Благодарю
Выходит, ошибка «плагин создает более 1000 хэндлов» (когда создавал их циклом) - «защита» от кривых рук?
 

DENZEL519

Работаю с AI !
Сообщения
417
Реакции
198
Может кто подправить плагин [ZR] Zombie Class: Boomer добавив туда эффект плевка? Звук есть, игрока заблёвывает, а самого плевка не видно.
 

DarkerZ

Участник
Сообщения
395
Реакции
175

xstage

🏹
Сообщения
726
Реакции
754
Благодарю
Выходит, ошибка «плагин создает более 1000 хэндлов» (когда создавал их циклом) - «защита» от кривых рук?
Я сейчас пробовал делать и больше 1000 и все работает. Нашел только варнинг, если плагин превышает планку в 100к, но я думаю вы не должны уходить на столько далеко.
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Всем добрый день, дайте пожалуйста пример кода, который будет сразу менять ник игрока как в табе, так и в настройках игры того, кому ник сменили.
Игра Css v34
Пробовал такой вариант:
Код:
stock void CS_SetClientName(int client, const char[] name, bool silent)
{
    char oldname[MAX_NAME_LENGTH];
    GetClientName(client, oldname, sizeof(oldname));

    SetClientInfo(client, "name", name);
    //SetEntPropString(client, Prop_Data, "m_szNetname", name);

    Handle event = CreateEvent("player_changename");

    if (event != INVALID_HANDLE)
    {
        SetEventInt(event, "userid", GetClientUserId(client));
        SetEventString(event, "oldname", oldname);
        SetEventString(event, "newname", name);
        FireEvent(event);
    }

    if (silent) return;
    
    Handle msg = StartMessageAll("SayText2");

    if (msg != INVALID_HANDLE)
    {
        BfWriteByte(msg, client);
        BfWriteByte(msg, true);
        BfWriteString(msg, "Cstrike_Name_Change");
        BfWriteString(msg, oldname);
        BfWriteString(msg, name);
        EndMessage();
    }
}

Но в нем ник меняется раза со 2 и то после рестарта раунда и не всегда

SetClientInfo(iClient, "name", newname); Тоже не подходит, ник в настройках игры не меняется после смены ника + не меняется ник в табе если игрок повторно сменил ник
 

Kewn

Участник
Сообщения
321
Реакции
61
Всем добрый день, дайте пожалуйста пример кода, который будет сразу менять ник игрока как в табе, так и в настройках игры того, кому ник сменили.
Игра Css v34
Пробовал такой вариант:
Код:
stock void CS_SetClientName(int client, const char[] name, bool silent)
{
    char oldname[MAX_NAME_LENGTH];
    GetClientName(client, oldname, sizeof(oldname));

    SetClientInfo(client, "name", name);
    //SetEntPropString(client, Prop_Data, "m_szNetname", name);

    Handle event = CreateEvent("player_changename");

    if (event != INVALID_HANDLE)
    {
        SetEventInt(event, "userid", GetClientUserId(client));
        SetEventString(event, "oldname", oldname);
        SetEventString(event, "newname", name);
        FireEvent(event);
    }

    if (silent) return;
   
    Handle msg = StartMessageAll("SayText2");

    if (msg != INVALID_HANDLE)
    {
        BfWriteByte(msg, client);
        BfWriteByte(msg, true);
        BfWriteString(msg, "Cstrike_Name_Change");
        BfWriteString(msg, oldname);
        BfWriteString(msg, name);
        EndMessage();
    }
}

Но в нем ник меняется раза со 2 и то после рестарта раунда и не всегда

SetClientInfo(iClient, "name", newname); Тоже не подходит, ник в настройках игры не меняется после смены ника + не меняется ник в табе если игрок повторно сменил ник
То есть ты хочешь меня ник на стороне клиента при этом с сервера. Правильно понимаю?
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Вот тут глянь:
Спасибо, попробую,отпишусь
Сообщения автоматически склеены:

Вот тут глянь:
У вас в плагине смена ника через функцию SetClientInfo, работает замечательно, как выше писал, но после первой смены работает не правильно
 
Последнее редактирование:

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Добрый день, подскажите пожалуйста, есть ли готовая функция проверки на то, перешел ли игрок в спектора? На alliedmods готовую функцию не нашел, если такой нет, то прийдется проверять команду при старте карты и смерти игрока
 

NeLifeASkazka

Участник
Сообщения
128
Реакции
70
Добрый день, подскажите пожалуйста, есть ли готовая функция проверки на то, перешел ли игрок в спектора? На alliedmods готовую функцию не нашел, если такой нет, то прийдется проверять команду при старте карты и смерти игрока

code:
public void OnPluginStart(){
    RegConsoleCmd("joinclass", cmd_joinclass);
}
public Action cmd_class(int client, int args){
    if(GetClientTeam(client) == 1){
        //
    }
}

Или нужно проверять при заходе на сервер ?
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
code:
public void OnPluginStart(){
    RegConsoleCmd("joinclass", cmd_joinclass);
}
public Action cmd_class(int client, int args){
    if(GetClientTeam(client) == 1){
        //
    }
}

Или нужно проверять при заходе на сервер ?
И при заходе и при смене команды, к примеру игрок играл за 1 из сторон и вышел в спектора
 
Сверху Снизу