BLOG [WEB-BLOG] Просто о Ethernet`е

Сообщения
65
Реакции
12
bizon,

C++:
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
#include <reapi>

new const g_DecalsShot[] = { 41, 42, 43, 44, 45 } // Декали
// Объекты для прорисовки декалей
new const g_ArrFunc[][] = { "worldspawn", "func_breakable", "func_wall",
                        "func_door", "func_door_rotating", "func_plat", "func_rotating"};

new g_WpnKeyCustom
#define CustomItem(%0) (get_entvar(%0, var_impulse) == g_WpnKeyCustom)

public plugin_init(){
    register_forward(FM_UpdateClientData, "UpdateClientData", true);
    // Решил использовать момент атаки, вроде как есть метод через TraceLine, но пока не разобрался с ним
    for(new i = 0; i < sizeof(g_ArrFunc); i++){
        RegisterHam(Ham_TraceAttack, g_ArrFunc[i], "TraceAttack", true);
    }
    register_forward(FM_PlaybackEvent, "PlayBackEvent"); // Событие для отдачи оружия
}

public UpdateClientData(const pPlayer, const SendWeapons, const CD){
    static iItem; iItem = get_member(pPlayer, m_pActiveItem);
    if(iItem <= 0 || !CustomItem(iItem) || !CD || !is_user_alive(pPlayer)){
        return FMRES_IGNORED;
    }
    set_cd(CD, CD_flNextAttack, get_gametime() + 0.001);
    return FMRES_HANDLED;
}

public PlayBackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
    if (!(1 <= invoker <= MAX_CLIENTS)){
        return FMRES_IGNORED;
    }

    playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
    return FMRES_SUPERCEDE;
}

public TraceAttack(this, iAttacker, Float:flDamage, Float:direction[3], traceresult, damagebits)
{
    if(!is_user_alive(iAttacker))
        return;

    static Float:flEnd[3]
    get_tr2(traceresult, TR_vecEndPos, flEnd)
   
    if(this){
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(TE_DECAL)
        write_coord_f(flEnd[0])
        write_coord_f(flEnd[1])
        write_coord_f(flEnd[2])
        write_byte(g_DecalsShot[random_num (0, sizeof(g_DecalsShot) -1)])
        write_short(this)
        message_end()
    }else{
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(TE_WORLDDECAL)
        write_coord_f(flEnd[0])
        write_coord_f(flEnd[1])
        write_coord_f(flEnd[2])
        write_byte(g_DecalsShot[random_num (0, sizeof(g_DecalsShot) -1)])
        message_end()
    }

    message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    write_byte(TE_GUNSHOTDECAL)
    write_coord_f(flEnd[0])
    write_coord_f(flEnd[1])
    write_coord_f(flEnd[2])
    write_short(iAttacker)
    write_byte(g_DecalsShot[random_num (0, sizeof(g_DecalsShot) -1)])
    message_end()
}
 
Сообщения
491
Реакции
339
Помог
11 раз(а)
Georg, выше дело говорят.
Примеры можно посмотреть в пушках зм (от того же Корда).
Модуль engine по возможности нужно исключать. Реализован давно и не самым лучшим образом, часто вызывает падение сервера своими функциями.
Никто и не говорит делать простой копипаст, но реализацию всегда подсмотреть можно, чтобы не делать велосипед из костылей.
 
Сообщения
65
Реакции
12
@bizon,Тогда чем заменить playback_event? Engine только из-за нее подключил
 
Сообщения
578
Реакции
338
Предупреждения
2
Помог
9 раз(а)
Georg, EngFunc_PlaybackEvent
 
  • Нравится
Реакции: ssx
Сообщения
65
Реакции
12
steelzzz, bizon,

C++:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <reapi>

new const g_DecalsShot[] = { 41, 42, 43, 44, 45 } // Декали
// Объекты для прорисовки декалей
new const g_ArrFunc[][] = { "worldspawn", "func_breakable", "func_wall",
                        "func_door", "func_door_rotating", "func_plat", "func_rotating"};

new g_WpnKeyCustom
#define CustomItem(%0) (get_entvar(%0, var_impulse) == g_WpnKeyCustom)

public plugin_init(){
    register_forward(FM_UpdateClientData, "UpdateClientData", true);
    // Решил использовать момент атаки, вроде как есть метод через TraceLine, но пока не разобрался с ним
    for(new i = 0; i < sizeof(g_ArrFunc); i++){
        RegisterHam(Ham_TraceAttack, g_ArrFunc[i], "TraceAttack", true);
    }
    register_forward(FM_PlaybackEvent, "PlayBackEvent"); // Событие для отдачи оружия
}

public UpdateClientData(const pPlayer, const SendWeapons, const CD){
    static iItem; iItem = get_member(pPlayer, m_pActiveItem);
    if(iItem <= 0 || !CustomItem(iItem) || !CD || !is_user_alive(pPlayer)){
        return FMRES_IGNORED;
    }
    set_cd(CD, CD_flNextAttack, get_gametime() + 0.001);
    return FMRES_HANDLED;
}

public PlayBackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
    if (!(1 <= invoker <= MAX_CLIENTS)){
        return FMRES_IGNORED;
    }

    engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);
    return FMRES_SUPERCEDE;
}

public TraceAttack(this, iAttacker, Float:flDamage, Float:direction[3], traceresult, damagebits)
{
    if(!is_user_alive(iAttacker))
        return;

    static Float:flEnd[3]
    get_tr2(traceresult, TR_vecEndPos, flEnd)
    
    if(this){
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(TE_DECAL)
        write_coord_f(flEnd[0])
        write_coord_f(flEnd[1])
        write_coord_f(flEnd[2])
        write_byte(g_DecalsShot[random_num (0, sizeof(g_DecalsShot) -1)])
        write_short(this)
        message_end()
    }else{
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(TE_WORLDDECAL)
        write_coord_f(flEnd[0])
        write_coord_f(flEnd[1])
        write_coord_f(flEnd[2])
        write_byte(g_DecalsShot[random_num (0, sizeof(g_DecalsShot) -1)])
        message_end()
    }

    message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    write_byte(TE_GUNSHOTDECAL)
    write_coord_f(flEnd[0])
    write_coord_f(flEnd[1])
    write_coord_f(flEnd[2])
    write_short(iAttacker)
    write_byte(g_DecalsShot[random_num (0, sizeof(g_DecalsShot) -1)])
    message_end()
}
Пока все успешно, буду продвигаться дальше, прорисовка спрайтов выстрела и поправить бог в Reload моментом.
 
  • Нравится
Реакции: ssx

RockTheStreet

Саппорт года
Сообщения
1,744
Реакции
349
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Georg, Ты бы хоть спасибо сказал, ей богу.
 
Сообщения
491
Реакции
339
Помог
11 раз(а)
d3m37r4, обращались люди с проблемами в некоторых плагинах (лазерные мина, какие-то мини-npc собаки, revenant ice/fire), где при работе с энтити (создание, задание свойств и think-обработка), используя engine, люди ловили краши (краш-логи указывали на моменты, где управление прерывалось на обработке функций от engine).
Я не стал глубоко копать, заменил аналогичными функциями reapi/fm - проблема ушла.
Возможно, дело в какой-то несовместимости версий сборок, модулей, ОС. Просто даю ориентир на всякий случай, что если будут такие проблемы, будет вариант в какую сторону копать.
 

RockTheStreet

Саппорт года
Сообщения
1,744
Реакции
349
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
bizon, Тут дело не в модуле. На любом модуле можно вызвать краши(я то уж узнаю), будь то реапи или ФМ.
 
Сообщения
491
Реакции
339
Помог
11 раз(а)
RockTheStreet, всё возможно. Тревожный звоночек всё же был, я счёл нужным упомянуть и потенциально возможной проблеме.
 

RockTheStreet

Саппорт года
Сообщения
1,744
Реакции
349
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован

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

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