Spect info

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
36
Реакции
1
Всем привет, делаю плагин который будет выводить инфу за наблюдателей, столкнулся с такой проблемой когда люди бегают то не пропадает меню, а когда просто стоят то пропадает, не подскажите в чем проблема?


C++:
#include <amxmodx>
#include <fakemeta>
#include <cstrike>
#include <geoip>
#include <csx>

new name[33],ip[32], authid[33], city[64], country[33], region[64]
 
public plugin_init()
{
        register_plugin("SpecInfo", "1.0", "Fast")

    register_event("StatusValue", "show_spec", "b");
}
 
public show_spec()
{
        static iuser2
        static players[32], num, id, i
        get_players(players, num, "bch")
 
        for(i = 0; i < num; i++)
        {
                id = players[i]
                iuser2 = pev(id, pev_iuser2)
 
                if(iuser2 && id != iuser2)
                {
            if(get_user_flags(id) & ADMIN_LEVEL_F)
            {
                
                new msg[512], len
                new osef[8];
                new rank = get_user_stats(iuser2, osef, osef);
                new maxrank = get_statsnum();
                if (is_user_bot(id)) return;
                if (is_user_hltv(id)) return;
                if (is_user_alive(id)) return;
                get_user_name(iuser2,name,32), get_user_ip(iuser2,ip,31,0), get_user_authid(iuser2,authid,32), geoip_city(ip,city,64,1), geoip_country_ex(ip,country,32,2), geoip_region_name(ip,region, 64,2);
    
                len += formatex(msg[len], charsmax(msg) - len, "^t^t^t\wНик: \r%s^n", name);
                len += formatex(msg[len], charsmax(msg) - len, "^t^t^t\wСтрана: \r%s^n", country);
                len += formatex(msg[len], charsmax(msg) - len, "^t^t^t\wГород: \r%s ^n", city);
                len += formatex(msg[len], charsmax(msg) - len, "^t^t^t\wМесто в ранке: \r%d-е \wиз \r%d^n", rank, maxrank);
                len += formatex(msg[len], charsmax(msg) - len, "^t^t^t\y|\w%s\y|^n",is_user_steam(iuser2) ? "STEAM":"Non Steam");

                show_menu(id, 1023, msg, 4);
            }
                }
        }
}

stock bool:is_user_steam(id)
{
// Author Sh0oter
        static dp_pointer
        if(dp_pointer || (dp_pointer = get_cvar_pointer("dp_r_id_provider")))
        {
            server_cmd("dp_clientinfo %d", id)
            server_exec()
            return (get_pcvar_num(dp_pointer) == 2) ? true : false
        }
        return false
}
 
Сообщения
36
Реакции
1
Получилось сделать то что хотел но теперь при переключении игрока выкидывает с сервера с ошибкой reliable channel overflowed
Не подскажите что не так?

Код:
#include <amxmodx>
#include <fakemeta>
#include <engine>
#include <geoip>
#include <csx>

new name[33],ip[32], authid[33], city[64], country[33], region[64]

 
public plugin_init()
{
    register_plugin("SpecInfo", "1.9.0", "LK")
}

public client_PreThink(id)
{   
        if(!is_user_connected(id))
        return
        
        static iuser2
        static players[32], num, i
        get_players(players, num, "bch")
 
        for(i = 0; i < num; i++)
        {
            id = players[i]
            iuser2 = pev(id, pev_iuser2)
 
            if(iuser2 && id != iuser2)
            {   
                if((entity_get_int(id,EV_INT_button) & IN_ATTACK) || (entity_get_int(id,EV_INT_button) & IN_ATTACK2))
                {
                    if(get_user_flags(id) & ADMIN_LEVEL_F)
                    {
                        new msg[512], len
                        new osef[8];
                        new rank = get_user_stats(iuser2, osef, osef);
                        new maxrank = get_statsnum();
                        new player_ip[23];
                        get_user_ip(iuser2, player_ip, 22,1);

                        get_user_name(iuser2,name,32), get_user_ip(iuser2,ip,31,0), get_user_authid(iuser2,authid,32), geoip_city(ip,city,64,1), geoip_country_ex(ip,country,32,2), geoip_region_name(ip,region, 64,2);
    
                        len += formatex(msg[len], charsmax(msg) - len, "^t^t^t\wНик: \r%s^n", name);
                        len += formatex(msg[len], charsmax(msg) - len, "^t^t^t\wМесто в ранке: \r%d-е \wиз \r%d^n", rank, maxrank);
                        len += formatex(msg[len], charsmax(msg) - len, "^t^t^t\wСтрана: \r%s^n", country);
                        len += formatex(msg[len], charsmax(msg) - len, "^t^t^t\wГород: \r%s ^n", city);
                        len += formatex(msg[len], charsmax(msg) - len, "^t^t^t\wИп: \r%s ^n", player_ip);
                        len += formatex(msg[len], charsmax(msg) - len, "^t^t^t\y|\w%s\y|^n",is_user_steam(iuser2) ? "STEAM":"Non Steam");

                        show_menu(id, 1023, msg, 4);
                        return;
                    }
                }
            }
        }
        return;
}

stock bool:is_user_steam(id)
{
    static dp_pointer
    if(dp_pointer || (dp_pointer = get_cvar_pointer("dp_r_id_provider")))
    {
        server_cmd("dp_clientinfo %d", id)
        server_exec()
        return (get_pcvar_num(dp_pointer) == 2) ? true : false
    }
    return false
}
 

Ayk

Сообщения
763
Реакции
478
Помог
19 раз(а)
public client_PreThink(id)
Это оверкилл.
Ты отправляешь игроку меню 100 раз в секунду (если ФПС = 100). Это забивает канал связи.
Если ты не хочешь менять логику плагина, отказавшись от синка, то хотя бы добавь счетчик и фильтр.

Должно быть так:
- происходит синк, увеличиваем счетчик на 1
- проверяем счетчик, если значение меньше 100 (1 секунда при 100 ФПС) ничего не делаем
- если больше, показываем меню, сбрасываем счетчик

Таким образом, 99 синка увеличивают счетчик, а сотый синк показывает меню.
Если ФПС = 100 то меню будет обновляться 1 раз в секунду.
 
Последнее редактирование:
Сообщения
36
Реакции
1
Это оверкилл.
Ты отправляешь игроку меню 100 раз в секунду (если ФПС = 100). Это забивает канал связи.
Если ты не хочешь менять логику плагина, отказавшись от синка, то хотя бы добавь счетчик и фильтр.

Должно быть так:
- происходит синк, увеличиваем счетчик на 1
- проверяем счетчик, если значение меньше 100 (1 секунда при 100 ФПС) ничего не делаем
- если больше, показываем меню, сбрасываем счетчик

Таким образом, 99 синка увеличивают счетчик, а сотый синк показывает меню.
Если ФПС = 100 то меню будет обновляться 1 раз в секунду.
я извиняюсь, а есть пример этого?
 
Сообщения
271
Реакции
348
Помог
15 раз(а)
Ayk, а нельзя просто таск сделать, не трогая синк?

И обычно спек инфо делают ввиде худа, а если я захочу менюшку открыть какую-то?
 

d3m37r4

111111
Сообщения
1,454
Реакции
1,194
Помог
10 раз(а)
Denzer, чел хочет чтобы выводимая инфа была максимально актуальной, скорее всего.
 
Сообщения
1,055
Реакции
212
Предупреждения
9
Помог
6 раз(а)
А если отловить убийство игрока? и через такс сообщение показывать
 
Сообщения
278
Реакции
137
Can you try that? I didn't try.
If it works, you can edit that as you want.

PHP:
#include <amxmodx>
#include <fakemeta>
#include <geoip>
#include <csx>

new TaskEnt;
new city[33][32], country[33][32];

public plugin_init() {
    register_plugin("SpecInfo", "1.0", "PurposeLess");

    register_forward(FM_Think, "Think");

    TaskEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
    set_pev(TaskEnt, pev_classname, "think");
    set_pev(TaskEnt, pev_nextthink, get_gametime() + 1.01);
}

public client_connectex(id, const name[], const ip[], reason[128])
{
    geoip_city(ip, city[id], charsmax(city[]), 1);
    geoip_country_ex(ip, country[id], charsmax(country[]), 2);
}

public Think(ent)
{
    if(ent == TaskEnt)
    {
        Task();
        set_pev(ent, pev_nextthink,  get_gametime() + 0.1);
    }
}

Task()
{
    static players[32], inum, id, target;
    static msg[512], len;
    static rank, maxrank, osef[8];
    get_players(players, inum, "bch");
    for(new i; i<inum; i++)
    {
        id = players[i];
        target = pev(id, pev_iuser1) == 4 ? pev(id, pev_iuser2) : id;

        if(id == target)
        {
            continue;
        }

        //optimization
        msg[0] = '^0';

        rank = get_user_stats(target, osef, osef);
        maxrank = get_statsnum();

        len += formatex(msg[len], charsmax(msg) - len, "^t^t^t\wНик: \r%n^n", target);
        len += formatex(msg[len], charsmax(msg) - len, "^t^t^t\wСтрана: \r%s^n", country[id]);
        len += formatex(msg[len], charsmax(msg) - len, "^t^t^t\wГород: \r%s ^n", city[id]);
        len += formatex(msg[len], charsmax(msg) - len, "^t^t^t\wМесто в ранке: \r%d-е \wиз \r%d^n", rank, maxrank);
        len += formatex(msg[len], charsmax(msg) - len, "^t^t^t\y|\w%s\y|^n", is_user_steam(target) ? "STEAM":"Non Steam");

        show_menu(id, 1023, msg, 4);
    }
}

bool:is_user_steam(id)
{
    static dp_pointer
    if(dp_pointer || (dp_pointer = get_cvar_pointer("dp_r_id_provider")))
    {
        server_cmd("dp_clientinfo %d", id)
        server_exec()
        return (get_pcvar_num(dp_pointer) == 2) ? true : false
    }
    return false
}
 
Последнее редактирование:
Сообщения
271
Реакции
348
Помог
15 раз(а)
d3m37r4, я говорю про бесконечный таск в 1 секунду и с худом holdtime = 1.0, так и выводить всю инфу)
 

Ayk

Сообщения
763
Реакции
478
Помог
19 раз(а)
Ayk, а нельзя просто таск сделать, не трогая синк?
Можно. Только вот тема немного про другое. Я дал человеку подсказку по решению проблемы конкретно в его реализации.
 
Сообщения
1,055
Реакции
212
Предупреждения
9
Помог
6 раз(а)
d3m37r4, Вывести то, что он хочет, но придется отлавливать спавн игрока для снятия таска.
Но нужно учесть, что выводить только жертве, а не жертве и атакующему
 

eac

Сообщения
2
Реакции
0
Неверный раздел форума
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
PurposeLess, строки 21-22 при компиляции ошибки.
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу