Я и PAWN | Изучаю, потому что интересно

Сообщения
702
Реакции
54
Тук тук. Я тут это, смотря на ребят, у которых уже есть такая тема, где им помогают и объясняют - себе тоже захотел такую :)

Я не могу сказать, что яро хочу изучать скриптинг, писать плагины и т.д. Просто хочется быть чутка более полезным + иногда себе нужно что-то сделать!
Собсна, создал тему, чтобы уточнить какие-то небольшие моменты, нюансы и чтобы не потерять их, создавая кучу тем.

То, что я хотел узнать и успешно узнал, будет храниться здесь, под спойлером, чтобы каждый, при нужде, смог ознакомиться и воспользоваться информацией :)
Вопрос:
Как можно получить id игрока, если же в паблике не указан изначально id или const id?

Ответ:
С помощью цикла ниже.
Код:
for(new id = 1; id <= g_iMaxPlayers; id++)
    {}
Или если в таске нужно, тогда создать его где-то в public'e, где изначально указан id и вписать его, как id таска:
Код:
public client_authorized(id)
    set_task(1.0, "TaskMain", id ,.flags = "b");

public TaskMain(id) {}
Вопрос:
Как можно поставить на паузу плагин на картах с префиксами?

Ответ:
С помощью цикла ниже.
Код:
    new szMapPrefix[][] = {"fy_", "35hp", "awp_", "aim_", "$"};
    new szMapName[32]; get_mapname( szMapName, charsmax(szMapName));

    for( new i; i < sizeof( szMapPrefix ); i++)
    {
        if(containi( szMapName, szMapPrefix[i] ) != -1)
        {
            pause("ad");
            break;
        }
    }
Вопрос:
Как можно выключить хук на картах с префиксами?

Ответ:
С помощью кода ниже
Код:
new HookChain: g_Spawn; // создаём переменную вкл/выкл хука

public plugin_init()
{
    register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);

    g_Spawn = RegisterHookChain(RG_CSGameRules_PlayerSpawn, "refwd_PlayerSpawn_Post", true); // регистрируем хук

    new szMapPrefix[][] = {"fy_", "35hp", "awp_", "aim_", "cs_deagle"};
    new szMapName[32]; get_mapname( szMapName, charsmax(szMapName));

    for( new i; i < sizeof( szMapPrefix ); i++)
    {
        if(containi( szMapName, szMapPrefix[i] ) != -1) // проверяем на наличие префикса в названии карты
        {
            DisableHookChain(g_Spawn); // выключаем хук
            break; // конец цикла
        }
    }
}
Вопрос:
Как можно выключить все хуки или их часть на конкретной карте?

Ответ:
С помощью кода ниже
Код:
public plugin_init()
{
    new mapName[32]; // создаём переменную. куда будет записано название карты
    get_mapname(mapName, charsmax(mapName)); // получаем название текущей карты в переменную mapName

    if (equal(mapName, "35hp_new")) // проверяем на полное название карты
        return; // если текущая карта совпадает с желаемой, тогда ретюрним и дальше код выполняться не будет, т.е зарегистрированные хуки работать не будут

    RegisterHookChain(RG_CSGameRules_PlayerSpawn, "refwd_PlayerSpawn_Post", true)
}
Вопрос:
В чём разница между rg_send_audio и rh_emit_sound?

Ответ:
rh_emit_sound - могут услышать игроки, которые находятся рядом!

Вопрос:
Как можно получить счётчики выигранных раундов СТ или ТТ ?

Ответ:
Мемберы: m_iNumCTWins и m_iNumTerroristWins

Вопрос:
Как можно получить координаты точки, которая находится через сто метров (сделать блинк там или ещё что) ?

Ответ:
Код:
#include <amxmodx>
#include <fakemeta>
#include <xs>

public test(player)
{
    // Угол напрления взгляда игрока
    new Float:vecViewAngle[3];
    pev(player, pev_v_angle, vecViewAngle);

    // Создаем вектора напраяления из ViewAngle
    // Рузультат будет сохранен в глобальные переменные glb_v_forward, glb_v_up, glb_v_right
    engfunc(EngFunc_MakeVectors, vecViewAngle);

    // Получем вектор направления 'вперед' из глобальной переменной
    new Float:vecForward[3];
    global_get(glb_v_forward, vecForward);

    // Умножаем вектор 'вперед' на необходимое значение (расстояние в юнитах)
    xs_vec_mul_scalar(vecForward, 100.0, vecForward);

    // Текущие координаты игрока
    new Float:vecOrigin[3];
    pev(player, pev_origin, vecOrigin);

    // Получем координаты точки в напраялении 100 юнитов вперед
    xs_vec_add(vecOrigin, vecForward, vecOrigin);
}
Вопрос:
Что делает натив?
Код:
server_exec();
Ответ:
Принудительное выполнение сервером введенной в консоль команды (server_cmd();)

Вопрос:
Как сохранить данные об игроке по STEAMID на одну карту?

Ответ:
Код:
#include <amxmodx>

enum _:Data {
    data_level,
    data_some_info[32]
};

new g_data[MAX_PLAYERS + 1][Data];
new Trie:g_trieData = Invalid_Trie;

public plugin_init()
{
    g_trieData = TrieCreate();
}

public client_authorized(id, const szAuthId[])
{
    arrayset(g_data[id], 0, Data);

    if (TrieGetArray(g_trieData, szAuthId, g_data[id], Data)) {
        return; // Data found and copied from g_trieData to g_data.
    }

    // Data isn't found. So let's create new entry.
    g_data[id][data_level] = 123;
    formatex(g_data[id][data_some_info], charsmax(g_data[][data_some_info]), "Some Info %d", 123);

    TrieSetArray(g_trieData, szAuthId, g_data[id], Data);
}
Вопрос:
Как скрыть худ конкретного элемента?

Ответ:
Код:
set_member(id, m_iHideHUD, get_member(id, m_iHideHUD) | CBasePlayer::m_iHideHUD);
Единственное, что таймер почему-то не скрывается сам по себе и радар скрывается вместе с жизнями, броней.

Вопрос:
Как удалить на карте 35хп триггер, который добивает до нужного значения хп?

Ответ:
Код:
new ent = -1;

while((ent = rg_find_ent_by_class(ent, "game_player_hurt")))
{
    set_entvar(ent, var_flags, FL_KILLME);
}

p.s. Да и мне интересно, какая функция, как используется и где используется))

UPD: Обновил первый пост. Залил всю инфу, которая накопилась!!!
 
Последнее редактирование:
Сообщения
2,751
Реакции
3,016
Помог
61 раз(а)
Коль каждый себе такую тему создаёт - в знак благодарности - оформляйте первый пост как заголовок, в котором будет собраны вопросы на ответы
 
Сообщения
702
Реакции
54
wopox1337, без проблем, по мере поступления информации, буду обновлять первый пост, вписывая туда вопрос и собсна ответ. (Заодно и самому будет удобнее)
 

hajimura

Е777КХ05
Сообщения
290
Реакции
228
Помог
6 раз(а)
Minni,
Ему бы в павне освоиться для начала
 
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
shadow, тогда ему лучше и вовсе с питона начать, а то павн ему дается плохо пока что)))
 
Сообщения
702
Реакции
54
Это конечно не совсем по теме, но разве может не работать простейший код, при игре с ботами?
Ну тип, запустил локалку, хотел кое что написать, да вот только функция убийства не воркает, от слова совсем :D
Код:
#include <amxmodx>
#include <reapi>

public plugin_unit()
{
    RegisterHookChain(RG_CBasePlayer_Killed, "@CBasePlayer__Killed_Post", true);
}

public client_putinserver(id)
{
    log_amx("id: %d", get_user_userid(id));
}

@CBasePlayer__Killed_Post(iVictim, iAttacker, iGib)
{
    log_amx("working");
    log_amx("id2: %d", get_user_userid(iAttacker));
}
В итоге создал отдельно такой код, запустил, айдишники на путине считались, а при любом убийстве, ничего не происходит :D
Код:
L 06/10/2020 - 01:27:56: [check.amxx] id: 19
L 06/10/2020 - 01:27:58: [check.amxx] id: 70
L 06/10/2020 - 01:27:58: [check.amxx] id: 71
L 06/10/2020 - 01:27:59: [check.amxx] id: 72
L 06/10/2020 - 01:27:59: [check.amxx] id: 73
L 06/10/2020 - 01:27:59: [check.amxx] id: 74
L 06/10/2020 - 01:28:00: [check.amxx] id: 75
L 06/10/2020 - 01:28:00: [check.amxx] id: 76
L 06/10/2020 - 01:28:01: [check.amxx] id: 77
L 06/10/2020 - 01:28:01: [check.amxx] id: 78
L 06/10/2020 - 01:28:01: [check.amxx] id: 79
Это как так-то?

UPD: Прикольно. Прописываю название плагину, версию и т.д. а он не реагирует

[ 24] unknown unknown unknown check.amxx debug
 
Последнее редактирование:
Сообщения
219
Реакции
184
Помог
3 раз(а)
ThePhoenix, потому что hook не зареган.
 
Последнее редактирование модератором:

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
Это конечно не совсем по теме, но разве может не работать простейший код, при игре с ботами?
Ну тип, запустил локалку, хотел кое что написать, да вот только функция убийства не воркает, от слова совсем :D
Разве RG_CBasePlayer_Killed вызывается для ботов?
 
Последнее редактирование:
Сообщения
702
Реакции
54
Как получить id игрока в паблике? Например, в паблике таска, где по дефолту не пишется public func(id) {}

Я всегда пользовался таким:
Код:
for(new id = 1; id < g_iMaxPlayers; id++)
    {}
Но, мне сказали, что условие id < g_iMaxPlayers = игнорирует последнего игрока. Это так?
И как вообще это работает? (получение IDшника)

p.s. я просто циклы никогда не любит и не особо в них понимал, как их правильно делать, хотя логика +- в голове была.
 
Сообщения
1,042
Реакции
206
Предупреждения
1
Помог
6 раз(а)
ThePhoenix, Достаточно посмотреть алгоритм работы цикла в блок-схемах.
В гугле их уйма, посмотри для интереса тогда м.б и будет понятнее
 
Сообщения
702
Реакции
54
А если без цикла, то каким образом получить id? Может стоком каким-нибудь?
 
Сообщения
1,042
Реакции
206
Предупреждения
1
Помог
6 раз(а)
ThePhoenix, Может меня поправят кнч, но можно так
Код:
set_task(1.0, "ShowHUD", id+INDEX_TASK, _, _, "b")
и передать в аргументы

Код:
public ShowHud(iTask){
    new id = iTask-INDEX_TASK
}
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
BiZaJe, необязательно для таска еще конкретный индекс задавать.
 
Сообщения
1,042
Реакции
206
Предупреждения
1
Помог
6 раз(а)
d3m37r4, Т.е достаточно просто id игрока передать?
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
BiZaJe, да, если не планируется более никаких тасков юзать.
 

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

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