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

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
На некоторые картах открытие (дверей) разные,проще вписывать через config чем sp постоянно переделывать,и этот не работает притом.
Сообщения автоматически склеены:

Loco, Тип так,ноо А как же с другими поступать,на других открытие 65с. По разному крч
Можно конкретней для каких целей? Что бы я не слишком "углублялся", и почему не устраивает метод смены времени по конвару и плагина на настройки карт?
 

Black_

Участник
Сообщения
48
Реакции
5
Можно конкретней для каких целей? Что бы я не слишком "углублялся", и почему не устраивает метод смены времени по конвару и плагина на настройки карт?
Имеются прятки,мне нужно чтобы игроки знали когда выйдет террорист,то есть я посмотрю через сколько открывается дверь "45сек" и потом выставляю в конфиге. Бывает что не знают и бегают возле его Дома.
Стоит
Сообщения автоматически склеены:

Loco Поэтому попросил с hud, и config:
"MAPS"
"time"
 

wightjeck

Костыли заказывали?
Сообщения
472
Реакции
154
Имеются прятки,мне нужно чтобы игроки знали когда выйдет террорист,то есть я посмотрю через сколько открывается дверь "45сек" и потом выставляю в конфиге. Бывает что не знают и бегают возле его Дома.
Стоит
Сообщения автоматически склеены:

Loco Поэтому попросил с hud, и config:
"MAPS"
"time"
Проверь, должно работать. Сейчас конфиг сделаю
C++:
#pragma semicolon 1
#pragma newdecls required

public void OnPluginStart()
{
    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
}

public Action Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    CreateTimer(1.0, CallBack_Timer, 45, TIMER_FLAG_NO_MAPCHANGE);
}

public Action CallBack_Timer(Handle hTimer, any iT)
{
    for(int i = 1; i < MaxClients; i++)
    {
        if(--iT > 0)
        {
            if(IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(i) == 3)
            {
                PrintHintText(i, "Отсчет времени %i", iT);
                CreateTimer(1.0, CallBack_Timer, iT, TIMER_FLAG_NO_MAPCHANGE);
                continue;
            }
        }
        else if(iT == 0) return Plugin_Stop;
    }
    return Plugin_Stop;
}
 
Последнее редактирование:

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Проверь, должно работать. Сейчас конфиг сделаю
C++:
#pragma semicolon 1
#pragma newdecls required

public void OnPluginStart()
{
    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
}

public Action Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    CreateTimer(1.0, CallBack_Timer, 45, TIMER_FLAG_NO_MAPCHANGE);
}

public Action CallBack_Timer(Handle hTimer, any iT)
{
    for(int i = 1; i < MaxClients; i++)
    {
        if(--iT > 0)
        {
            if(IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(i) == 3)
            {
                PrintHintText(i, "Отсчет времени %i", iT);
                CreateTimer(1.0, CallBack_Timer, iT, TIMER_FLAG_NO_MAPCHANGE);
                continue;
            }
        }
        else if(iT == 0) return Plugin_Stop;
    }
    return Plugin_Stop;
}
Очень плохое у меня предчувствие на счёт отчёта времени "iT" в цикле...
 

Black_

Участник
Сообщения
48
Реакции
5
Проверь, должно работать. Сейчас конфиг сделаю
C++:
#pragma semicolon 1
#pragma newdecls required

public void OnPluginStart()
{
    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
}

public Action Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    CreateTimer(1.0, CallBack_Timer, 45, TIMER_FLAG_NO_MAPCHANGE);
}

public Action CallBack_Timer(Handle hTimer, any iT)
{
    for(int i = 1; i < MaxClients; i++)
    {
        if(--iT > 0)
        {
            if(IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(i) == 3)
            {
                PrintHintText(i, "Отсчет времени %i", iT);
                CreateTimer(1.0, CallBack_Timer, iT, TIMER_FLAG_NO_MAPCHANGE);
                continue;
            }
        }
        else if(iT == 0) return Plugin_Stop;
    }
    return Plugin_Stop;
}
Disconnect: "nick" overflowed reliable buffer
Такая дичь у всех
 

wightjeck

Костыли заказывали?
Сообщения
472
Реакции
154
Disconnect: "nick" overflowed reliable buffer
Такая дичь у всех
Попробуй. Добавил квар sm_timer_time - уст. времени для таймера.
C++:
#pragma semicolon 1
#pragma newdecls required

int iCooldown;

public void OnPluginStart()
{
    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
   
    ConVar hCvar;
    HookConVarChange((hCvar = CreateConVar("sm_timer_time", "45")), CvarChanged_TT);
    iCooldown = hCvar.IntValue;
}

public void CvarChanged_TT(ConVar hCvar, const char[] oldValue, const char[] newValue)
{
    iCooldown = hCvar.IntValue;
}

public Action Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    CreateTimer(1.0, CallBack_Timer, iCooldown, TIMER_FLAG_NO_MAPCHANGE);
}

public Action CallBack_Timer(Handle hTimer, any iT)
{
    for(int i = 1; i <= MaxClients; i--)
    {
        if(GetClientTeam(i) == 3)
        {
            if(--iT > 0) {
                PrintHintText(i, "Отсчет времени %i", iT);
                CreateTimer(1.0, CallBack_Timer, iT, TIMER_FLAG_NO_MAPCHANGE);
            }
            else {
                PrintHintText(i, "Время вышло!", iT);
                return Plugin_Stop;
            }
        }
    }
    return Plugin_Continue;
}
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Да, там не оч... Hint два раза выскакивает
для чего запускать таймер в цикле?
В таком случае сколько игроков на сервере, столько раз им и напишет в хинте (только вы это не заметите, т.к. цикл очень быстро работает)

А вот здесь нафига нужен параметр iT?
PrintHintText(i, "Время вышло!", iT);
 

wightjeck

Костыли заказывали?
Сообщения
472
Реакции
154
для чего запускать таймер в цикле?
В таком случае сколько игроков на сервере, столько раз им и напишет в хинте (только вы это не заметите, т.к. цикл очень быстро работает)

А вот здесь нафига нужен параметр iT?
PrintHintText(i, "Время вышло!", iT);
Как тогда добавить iClient or UserId в таймер, когда данные записаны в iT?
C++:
public Action CallBack_Timer(Handle hTimer, any iT)
{
    if(--iT > 0)
    {
        PrintHintText(iClient, "Отсчет времени %i", iT);
        CreateTimer(1.0, CallBack_Timer, iT, TIMER_FLAG_NO_MAPCHANGE);
    }
    else {
        PrintHintText(iClient, "Время вышло!");
        return Plugin_Stop;
    }
    return Plugin_Stop;
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Wightjeck, вот как-то так:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

int iCooldown,
    iEnd;

public void OnPluginStart()
{
    ConVar hCvar;
    HookConVarChange((hCvar = CreateConVar("sm_timer_time", "45")), CvarChanged_TT);
    iCooldown = hCvar.IntValue;

    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
}

public void CvarChanged_TT(ConVar hCvar, const char[] oldValue, const char[] newValue)
{
    iCooldown = hCvar.IntValue;
}

public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    CreateTimer(1.0, CallBack_Timer, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
    iEnd = GetTime() + iCooldown;    // устанавливаем время окончания отсчёта
}

public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
    iEnd = 0;    // сбрасываем время до окончания отсчёта
}

public Action CallBack_Timer(Handle hTimer)
{
    static int dif;    // получаем время до окончания отсчёта
    if((dif = iEnd - GetTime()) < 1)
    {
        // если время не было сброшено, то извещаем о том, что отсчёт времени завершён
        if(iEnd) for(int i = MaxClients; i > 0; i--) if(IsPlayerValid(i)) PrintHintText(i, "Время вышло!");
        return Plugin_Stop;
    }
    else for(int i = MaxClients; i > 0; i--) if(IsPlayerValid(i)) PrintHintText(i, "Осталось %iсек", dif);

    return Plugin_Continue;
}

stock bool IsPlayerValid(int client)
{
    return IsClientInGame(client) && !IsFakeClient(client) && GetClientTeam(client) == 3;
}
 
Последнее редактирование:

Black_

Участник
Сообщения
48
Реакции
5
Wightjeck, вот как-то так:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

int iCooldown,
    iEnd;

public void OnPluginStart()
{
    ConVar hCvar;
    HookConVarChange((hCvar = CreateConVar("sm_timer_time", "45")), CvarChanged_TT);
    iCooldown = hCvar.IntValue;

    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
}

public void CvarChanged_TT(ConVar hCvar, const char[] oldValue, const char[] newValue)
{
    iCooldown = hCvar.IntValue;
}

public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    CreateTimer(1.0, CallBack_Timer, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
    iEnd = GetTime() + iCooldown;    // устанавливаем время окончания отсчёта
}

public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
    iEnd = 0;    // сбрасываем время до окончания отсчёта
}

public Action CallBack_Timer(Handle hTimer)
{
    static int dif;    // получаем время до окончания отсчёта
    if((dif = iEnd - GetTime()) < 1)
    {
        // если время не было сброшено, то извещаем о том, что отсчёт времени завершён
        if(iEnd) for(int i = 1; i <= MaxClients; i--) if(IsPlayerValid(i)) PrintHintText(i, "Время вышло!");
        return Plugin_Stop;
    }
    else for(int i = 1; i <= MaxClients; i--) if(IsPlayerValid(i)) PrintHintText(i, "Осталось %iсек", dif);

    return Plugin_Continue;
}

stock bool IsPlayerValid(int client)
{
    return IsClientInGame(client) && !IsFakeClient(client) && GetClientTeam(client) == 3;
}
Кстати не показывает
 

Вложения

  • 121212.jpg
    121212.jpg
    37 КБ · Просмотры: 24

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Как обойти лимит в чате используя Chat Colors CSGO (Custom Chat Colors), а конкретней CGOPrintToChat внутри плагина? (буфер в плагине стоит на 2048 символов, но выводит в чате около 512).
46217

в консоли пишет больше
46218
 

Faya™

Жуестер
Сообщения
867
Реакции
457
Wightjeck, вот как-то так:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

int iCooldown,
    iEnd;

public void OnPluginStart()
{
    ConVar hCvar;
    HookConVarChange((hCvar = CreateConVar("sm_timer_time", "45")), CvarChanged_TT);
    iCooldown = hCvar.IntValue;

    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
}

public void CvarChanged_TT(ConVar hCvar, const char[] oldValue, const char[] newValue)
{
    iCooldown = hCvar.IntValue;
}

public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    CreateTimer(1.0, CallBack_Timer, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
    iEnd = GetTime() + iCooldown;    // устанавливаем время окончания отсчёта
}

public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
    iEnd = 0;    // сбрасываем время до окончания отсчёта
}

public Action CallBack_Timer(Handle hTimer)
{
    static int dif;    // получаем время до окончания отсчёта
    if((dif = iEnd - GetTime()) < 1)
    {
        // если время не было сброшено, то извещаем о том, что отсчёт времени завершён
        if(iEnd) for(int i = 1; i <= MaxClients; i--) if(IsPlayerValid(i)) PrintHintText(i, "Время вышло!");
        return Plugin_Stop;
    }
    else for(int i = 1; i <= MaxClients; i--) if(IsPlayerValid(i)) PrintHintText(i, "Осталось %iсек", dif);

    return Plugin_Continue;
}

stock bool IsPlayerValid(int client)
{
    return IsClientInGame(client) && !IsFakeClient(client) && GetClientTeam(client) == 3;
}
Мне кажется ты немного ошибся с циклопом
int i = 1; i <= MaxClients; i--
C-подобный:
int iEnd,
    iCooldown;

public void OnPluginStart()
{
    ConVar hCvar;

    HookConVarChange((hCvar = CreateConVar("sm_timer_time", "45")), CvarChanged_TT);
    iCooldown = hCvar.IntValue;

    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
}

public void CvarChanged_TT(ConVar hCvar, const char[] oldValue, const char[] newValue)
{
    iCooldown = hCvar.IntValue;
}

public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    CreateTimer(1.0, CallBack_Timer, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
    iEnd = GetTime() + iCooldown;
}

public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
    iEnd = 0;
}

public Action CallBack_Timer(Handle hTimer)
{
    static int dif;

    if((dif = iEnd - GetTime()) < 1)
    {
        if(iEnd)
        {
            for(int i = MaxClients + 1; --i;)
            {
                if(IsClientInGame(i) && !IsFakeClient(i) && GetClientTeam(i) == 3)
                {
                    PrintHintText(i, "Время вышло!");
                }
            }
        }

        return Plugin_Stop;
    }
    else
    {
        for(int i = MaxClients + 1; --i;)
        {
            if(IsClientInGame(i) && !IsFakeClient(i) && GetClientTeam(i) == 3)
            {
                PrintHintText(i, "Осталось %iсек", dif);
            }
        }
    }

    return Plugin_Continue;
}
Сообщения автоматически склеены:

Кстати не показывает
Пробуй это
 

wightjeck

Костыли заказывали?
Сообщения
472
Реакции
154
Мне кажется ты немного ошибся с циклопом
int i = 1; i <= MaxClients; i--
C-подобный:
int iEnd,
    iCooldown;

public void OnPluginStart()
{
    ConVar hCvar;

    HookConVarChange((hCvar = CreateConVar("sm_timer_time", "45")), CvarChanged_TT);
    iCooldown = hCvar.IntValue;

    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
}

public void CvarChanged_TT(ConVar hCvar, const char[] oldValue, const char[] newValue)
{
    iCooldown = hCvar.IntValue;
}

public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    CreateTimer(1.0, CallBack_Timer, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
    iEnd = GetTime() + iCooldown;
}

public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
    iEnd = 0;
}

public Action CallBack_Timer(Handle hTimer)
{
    static int dif;

    if((dif = iEnd - GetTime()) < 1)
    {
        if(iEnd)
        {
            for(int i = MaxClients + 1; --i;)
            {
                if(IsClientInGame(i) && !IsFakeClient(i) && GetClientTeam(i) == 3)
                {
                    PrintHintText(i, "Время вышло!");
                }
            }
        }

        return Plugin_Stop;
    }
    else
    {
        for(int i = MaxClients + 1; --i;)
        {
            if(IsClientInGame(i) && !IsFakeClient(i) && GetClientTeam(i) == 3)
            {
                PrintHintText(i, "Осталось %iсек", dif);
            }
        }
    }

    return Plugin_Continue;
}
Сообщения автоматически склеены:


Пробуй это
У меня все работает (версия от @Grey83)
P.S. Хотя я только на CS:GO проверял.
 
Последнее редактирование:

Black_

Участник
Сообщения
48
Реакции
5
Мне кажется ты немного ошибся с циклопом
int i = 1; i <= MaxClients; i--
C-подобный:
int iEnd,
    iCooldown;

public void OnPluginStart()
{
    ConVar hCvar;

    HookConVarChange((hCvar = CreateConVar("sm_timer_time", "45")), CvarChanged_TT);
    iCooldown = hCvar.IntValue;

    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
}

public void CvarChanged_TT(ConVar hCvar, const char[] oldValue, const char[] newValue)
{
    iCooldown = hCvar.IntValue;
}

public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    CreateTimer(1.0, CallBack_Timer, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
    iEnd = GetTime() + iCooldown;
}

public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
    iEnd = 0;
}

public Action CallBack_Timer(Handle hTimer)
{
    static int dif;

    if((dif = iEnd - GetTime()) < 1)
    {
        if(iEnd)
        {
            for(int i = MaxClients + 1; --i;)
            {
                if(IsClientInGame(i) && !IsFakeClient(i) && GetClientTeam(i) == 3)
                {
                    PrintHintText(i, "Время вышло!");
                }
            }
        }

        return Plugin_Stop;
    }
    else
    {
        for(int i = MaxClients + 1; --i;)
        {
            if(IsClientInGame(i) && !IsFakeClient(i) && GetClientTeam(i) == 3)
            {
                PrintHintText(i, "Осталось %iсек", dif);
            }
        }
    }

    return Plugin_Continue;
}
Сообщения автоматически склеены:


Пробуй это
Вота
Сообщения автоматически склеены:

У меня работает все работает (версия от @Grey83)
P.S. Хотя я только на CS:GO проверял.
Css v90 ля
 

Вложения

  • 90909.jpg
    90909.jpg
    117.7 КБ · Просмотры: 13

Black_

Участник
Сообщения
48
Реакции
5
Faya™
Кстати работает,а как конфиг сделать Который просил,м?
"name"
"time"
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323

Вложения

  • maptimer.txt
    62 байт · Просмотры: 9
  • t.smx
    4.9 КБ · Просмотры: 6
  • t.sp
    1.7 КБ · Просмотры: 10
Сверху Снизу