Вопросы по созданию от CLUQA

Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
ну, судя по описаниям этого форварда, то он слишком нагружает сервер
Вы делайте свои замеры, а не слепо верьте всему что написано в интернете. Да форвард часто вызывается и это факт. Но также факт то, что вы не на микроволновке же запускаете сервер. Есть вещи, где не обойтись без данного хука. Также присмотритесь к rg_set_animation и RG_CBasePlayer_SetAnimation.
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
CLUQA, ну из наивных оптимизаций это чекнуть кто обрабатывается в фуллпаке (аргумент player) до вызова каких-либо нативов. Будет почти PreThink.

Будет ли ощутима в данном случае существенная разница?
Нагрузка будет меньше из-за отсутствия амхх. Насколько - делай тесты.
 
Сообщения
169
Реакции
462
Помог
2 раз(а)
CLUQA,
C++:
#pragma semicolon 1

#include <amxmodx>
#include <reapi>

public plugin_init()
{
    RegisterHookChain(RG_CBasePlayer_SetAnimation, "on_player_set_animation", false);
}

public on_player_set_animation(player, PLAYER_ANIM:playerAnim)
{
    if (playerAnim == PLAYER_WALK) {
        // playerAnim подменяем на не сущесвующий
        SetHookChainArg(2, ATYPE_INTEGER, 123123);

        // m_IdealActivity ставим что нам нужно
        set_member(player, m_IdealActivity, ACT_SWIM);
    }
}
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
the_hunter, а если сразу подставить?
 
Сообщения
169
Реакции
462
Помог
2 раз(а)
fl0wer, не, там чеакется через свитч playerAnim и выствялется m_IdealActivity.
То есть m_IdealActivity будет выставлять сам рейгейм. А если подменить на не существующим playerAnim, то свитч попадает в блок default и проигрывает анимацию.
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
fl0wer, понял, позже как-нибудь протестирую нагрузку.
@fantom,спасибо за CBasePlayer_SetAnimation и rg_set_animation.
the_hunter, спасибо за предоставленный способ замены анимации.

Этот вариант был бы самым благоприятным, но к сожалению, здесь не предусмотрено замены именно для бегущего игрока.

Код:
enum PLAYER_ANIM
{
    PLAYER_IDLE,
    PLAYER_WALK,
    PLAYER_JUMP,
    PLAYER_SUPERJUMP,
    PLAYER_DIE,
    PLAYER_ATTACK1,
    PLAYER_ATTACK2,
    PLAYER_FLINCH,
    PLAYER_LARGE_FLINCH,
    PLAYER_RELOAD,
    PLAYER_HOLDBOMB
};
Придется остаться на FullPack :sad:

Ах да, проясните насчет rg_set_animation, недопонимаю, похоже.

Код:
public plugin_init() {
    RegisterHookChain(RG_CBasePlayer_SetAnimation, "@CBasePlayer_SetAnimation", .post = false)
}

@CBasePlayer_SetAnimation(const id, const PLAYER_ANIM:playerAnim)
{
    if(playerAnim == PLAYER_JUMP) {
        client_print(id, print_chat, "jump")
        
        rg_set_animation(id, PLAYER_WALK)
    }
    return HC_CONTINUE
}
native rg_set_animation(const index, PLAYER_WALK:playerAnim);

playerAnimSpecific animation number

То есть, требует номер модели, верно? Он же и хранится в PLAYER_WALK?!
P.S. сообщение выводит)
Не прокатило, пробовал уже по-разному тыкать :crazy:
post также на true пробовал.
6 Авг 2020
Animation IDs for RG_CBasePlayer_SetAnimation, rg_set_animation
В заголовке для enum PLAYER_ANIM указано, что и для rg_set_animation эти индексы используются.
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
CLUQA, все ответы в исходах регейма. Каждый раз тыкать носом в готовое решение не всем интересно. В даном случае подсказка HC_SUPERCEDE. Но я не до конца уверен, что блочить вызов хука, и вызывать свое лучше, чем заменить аргумент.
 
Сообщения
169
Реакции
462
Помог
2 раз(а)
CLUQA, а если так?
C++:
#pragma semicolon 1

#include <amxmodx>
#include <reapi>

public plugin_init()
{
    RegisterHookChain(RG_CBasePlayer_SetAnimation, "on_player_set_animation_post", true);
}

public on_player_set_animation_post(player, PLAYER_ANIM:playerAnim)
{
    const SEQ_WALK = 3;

    if (playerAnim == PLAYER_WALK && get_member(player, m_Activity) == ACT_RUN) {
        set_entvar(player, var_sequence, SEQ_WALK);
    }
}
 
Последнее редактирование:
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
fantom, нашел наконец-то где это

Код:
enum PLAYER_ANIM
{
    PLAYER_IDLE,
    PLAYER_WALK,
    PLAYER_JUMP,
    PLAYER_SUPERJUMP,
    PLAYER_DIE,
    PLAYER_ATTACK1,
    PLAYER_ATTACK2,
    PLAYER_FLINCH,
    PLAYER_LARGE_FLINCH,
    PLAYER_RELOAD,
    PLAYER_HOLDBOMB
};
https://github.com/s1lentq/ReGameDLL_CS/blob/master/regamedll/dlls/player.cpp#L2446

Но мне это ничего не дало.

set_member(player, m_IdealActivity, ACT_SWIM);

Решил немного поменять условие и получилось так:

Код:
public on_player_set_animation(player, PLAYER_ANIM:playerAnim)
{
    if (playerAnim == get_member(player, m_IdealActivity, ACT_RUN)) {
        // playerAnim подменяем на не сущесвующий
        SetHookChainArg(2, ATYPE_INTEGER, 123123);

        // m_IdealActivity ставим что нам нужно
        set_member(player, m_IdealActivity, ACT_SWIM);
    }
}
Что это дало? Игроку устанавливается анимация ACT_SWIM, он прыгает с этой анимацией, садится с этой анимацией, поворачивается с этой анимацией, но если игрок шагнет куда-либо, то воспроизводит стандартную анимацию. То есть, в движении данный способ у меня не срабатывает.
6 Авг 2020
the_hunter, сейчас попробую и отпишусь
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
the_hunter, в общем, смотрите, как получается...

Результат вашего варианта в post: игрок бежит - руки в стороны, но когда стоит на месте, то стандартная анимация.
Результат моего варианта в pre: игрок стоит - анимация выполняется, но при движении она сбрасывается.

Сейчас я пробовал по-разному добиться желаемого, но увы и ах)
Я зарегистрировал post и pre вашего, и своего вариантов.

При мое варианте, анимация WALK не проигрывалась.
При вашем - все хорошо.

Поменял анимацию в своем варианте на SWIM и в вашем на SWIM, указав const SEQ_WALK = 6;, индекс равный ACT_SWIM
В моем варианте - все хорошо.
В вашем - не проигрывается.

Пробовал объединить оба кода в post - что-то одно работало, не помню уже, а также в pre - тоже самое, что и с предыдущим.
Игрался по-разному.

Почему-то SWIM не хочет срабатывать в pre, а WALK в post. И поэтому к одной единой замены придти не могу.
 
Сообщения
169
Реакции
462
Помог
2 раз(а)
Результат вашего варианта в post: игрок бежит - руки в стороны, но когда стоит на месте, то стандартная анимация.
Не совсем понимаю что требуется. Вы говорили что хотите заменить RUN анимацию. Так в моем примере она как раз и заменятся.
Когда игрок стоит - это IDLE анимация.
Что бы поменять run и idle просто изменить условие:
C++:
- if (playerAnim == get_member(player, m_IdealActivity, ACT_RUN))

+ if (playerAnim == PLAYER_IDLE || playerAnim == PLAYER_WALK && get_member(player, m_Activity) == ACT_RUN)
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
the_hunter, извиняюсь, совсем уже запутался, что хочу в итоге)

Поменял условие, все отлично работает, благодарю.
Непрерывность сделать в данном способе между сменой анимациями возможно?
Я успеваю сделать шаг и примерно на секунду руки игрока опускаются.

Попробовал с этим условием в обоих вариантах, а также в post и pre - аналогично анимация на секунду сбрасывается.

Попробовал выставить такие значения, но мне это ничего не дало.

Код:
public on_player_set_animation_post(player, PLAYER_ANIM:playerAnim)
{
    const SEQ_WALK = 3;

   if (playerAnim == PLAYER_IDLE || playerAnim == PLAYER_WALK && get_member(player, m_Activity) == ACT_RUN) {
        set_entvar(player, var_sequence, SEQ_WALK);
        set_entvar(player, var_frame, 0.1);
        set_entvar(player, var_framerate, 0.1);
        set_entvar(player, var_animtime, 0.1);
    }
}
 
Сообщения
169
Реакции
462
Помог
2 раз(а)
Непрерывность сделать в данном способе между сменой анимациями возможно?
Возможно. Когда игрок стоит - анимация idle, когда двигается медленно - walk, кода бежит с максимальной скоростью - run.
Сейчас меняются анимации idle и run. Между ними walk, поэтому "на секунду руки игрока опускаются". Нужно так же заменить walk анимацию.
Все что требуется, убрать из условия && get_member(player, m_Activity) == ACT_RUN
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
the_hunter, вы чертов Гений! Спасибо за огромную помощь и проделанную работу с вашей стороны.
Спасибо за подробные разъяснения. Очень много нового узнал благодаря вам, а также fl0wer и fantom, за что им также отдельное спасибо.

На форуме aghl один из пользователей в 2014 году написал:

Этот способ работает на верхние анимации, либо на анимации типо swim, run. На добавленные анимации после 111 выдаётся первая анимация и она же зависает.

Собственно, есть такое понятие, как верхняя часть и нижняя часть анимации у игрока.
Например, анимация стойки с ножом, когда игрок стоит и когда игрок сидит - меняется лишь нижняя часть анимации, а верхняя часть остается нетронутой. Насколько не шарился в исходниках всяких боссов, никаких наталкивающих функций не увидел.
the_hunter, вы сталкивались с таким? Как можно проводить манипуляции с верхней частью и нижней, и где это может быть использовано?
 
Сообщения
169
Реакции
462
Помог
2 раз(а)
Например, анимация стойки с ножом, когда игрок стоит и когда игрок сидит - меняется лишь нижняя часть анимации, а верхняя часть остается нетронутой.
Это не совсем так. Все анимации находятся в модели игрока. Когда игрок стоит с ножом, проигрывается анимация "ref_anim_knife"
set_entvar(player, var_sequence, 75).

Когда игрок сидит с ножом - анимация "crouch_aim_knife"
set_entvar(player, var_sequence, 73).
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
the_hunter, понял. Спасибо еще раз огромное!
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Код:
#
!@#
Я вывожу игрокам в чат символ '#' - пустота.
Вывожу '!@#' - отображается только '!@'
Вывожу '!@##' - отображается полностью.
Вывожу '!@#$%^&*(' - решетка отображается.

С чем это может быть связано?
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
CLUQA, с правилами форматирования.
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
fl0wer, это не критично, просто возник вопрос) Спасибо за ответ)
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Код:
#include <amxmodx>

#include <fakemeta>



#define FOG_DENSITY            "0.0005"    // Плотность тумана

#define FOG_COLOR            "128 128 128"    // Цвет RGB тумана



public plugin_precache()

{

    new pEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_fog"))

  

    if (pEnt)

    {

        set_kvd(0, KV_ClassName, "env_fog");

        set_kvd(0, KV_KeyName, "density");

        set_kvd(0, KV_Value, FOG_DENSITY);

        set_kvd(0, KV_fHandled, 0);

      

        dllfunc(DLLFunc_KeyValue, pEnt, 0);

      

        set_kvd(0, KV_KeyName, "rendercolor");

        set_kvd(0, KV_Value, FOG_COLOR);

      

        dllfunc(DLLFunc_KeyValue, pEnt, 0);

    }

}
Нашел на форуме туман от Алексеич
Такой вопрос, можно ли реализовать туман по всей карте, кроме отдельного "островка" ?)
 

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

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