Grenade Mode

Grenade Mode 0.2

Нет прав для скачивания
Сообщения
315
Реакции
104
Помог
2 раз(а)
Flymic24, тестируем код, который вы прислали выше

Когда остается 1 ТТ и бомба поставлена, убийство ТТ вызывает взрыв бомбы
 
Сообщения
13
Реакции
-1
Приветсвую.А не подскажите,при установке сенсорной мины,при убийстве владельца,чтобы мина не исчезала.
29 Июн 2023
И почему то при выборе карты de_dust2 сервер ложится,а другие карты ,всё нором(.В логах ничего нет.
 

ifx

Сообщения
330
Реакции
149
Помог
4 раз(а)
@Flymic24,все работает просто отлично, большое спасибо!

подскажи только, раньше в 01 версии мины, лежащие на земле, можно было маскировать под другие оружия, сейчас этот функционал выпилен
ожидать возвращения или подшаманить самому?)

]И почему то при выборе карты de_dust2 сервер ложится,а другие карты ,всё нором(.В логах ничего нет.
нет такой проблемы, вчера тестил на многих картах, в тч и даст2, все четко
 
Сообщения
68
Реакции
79
Помог
3 раз(а)
ifx, Держи, возвращение не планируется, не соответствует оригиналу
Код:
#include < amxmodx >
#include < fakemeta >
#include < hamsandwich >
#include < reapi >
#include < xs >

#define FAKE_MODEL                //    Менять ли модели грнаты в режиме мины
#define REMOVE_NOT_CONNECT        //    Удалять или активировать при выходе/смерти владельца гранаты

#define RADIUS_SENSOR        100.0    //    Радиус срабатывания сенсорной мины
#define MOTION_SPEED        150.0    //    Порог скорости срабатывания датчика движения

#define HOMING_TIME            3.0        //    Время приследования
#define RADIUS_HOMING        500.0    //    Радиус приследования
#define SPEED_HOMING        400.0    //    скорость приследования

#if defined FAKE_MODEL
new const szFakeModels[][] = {    // здесь можно настроить оружие, под которое будет замаскирована мина
    "models/w_scout.mdl",    "models/w_hegrenade.mdl",    "models/w_usp.mdl",
    "models/w_awp.mdl",    "models/w_m4a1.mdl",    "models/w_deagle.mdl",    "models/w_ak47.mdl"
};
#endif

enum _:eExpType    {
    Norm,    Touch,    Mine, Sensor, InpulseE, Motion, Homing
};

new szExpName[eExpType][] = {
    "Нормальный", "Столкновение", "Мина", "Сенсорная", "Взрыв на Е", "Датчик движения", "Преследование"
};

new g_iSensorSpr;

new const GrenadeClassNames[][] = {
    "weapon_flashbang", "weapon_hegrenade", "weapon_smokegrenade"
};

public plugin_init()
{
    register_plugin
    (
        "[AMXX] Grenade Mode",
        "0.2",
        "Flymic24"
    );
    
    for(new i; i < sizeof GrenadeClassNames; i++) {
        RegisterHam(Ham_Item_Deploy,    GrenadeClassNames[i],    "HamHook_Item_Deploy", .Post = true);
        RegisterHam(Ham_Weapon_SecondaryAttack,    GrenadeClassNames[i],     "HamHook_Item_SecondaryAttack", .Post = false);
        RegisterHam(Ham_Spawn,            GrenadeClassNames[i],    "HamHook_Item_Spawn", .Post = false);
    }
    
    RegisterHookChain(RG_CBasePlayer_ThrowGrenade, "CBasePlayer_ThrowGrenade", .post = true);
    
    RegisterHam(Ham_Think, "grenade", "HamHook_ThinkGrenade", .Post = false);
    RegisterHam(Ham_Touch, "grenade", "HamHook_TouchGrenade", .Post = false);
}

public plugin_precache()    {
    g_iSensorSpr = precache_model("sprites/shockwave.spr");
}

public HamHook_Item_Deploy(const pItem)    {
    new iPlayer = get_member(pItem, m_pPlayer);
    new iType = get_entvar(pItem, var_weapons);   
    
    client_print(iPlayer, print_center, "Режим: %s", szExpName[iType]);
}

public HamHook_Item_SecondaryAttack(const pItem)    {
    if (get_member(pItem, m_Weapon_flNextSecondaryAttack) > 0.0)
        return HAM_IGNORED;
    
    set_member(pItem, m_Weapon_flNextSecondaryAttack, 0.3);
    
    new iPlayer = get_member(pItem, m_pPlayer);
    new iType = get_entvar(pItem, var_weapons);
    
    if (++iType >= eExpType)    iType = Norm;
    set_entvar(pItem, var_weapons, iType);
    
    client_print(iPlayer, print_center, "Режим: %s", szExpName[iType]);
    
    return HAM_IGNORED;
}

public CBasePlayer_ThrowGrenade(const pPlayer, const pWeapon, Float:vecSrc[3], Float:vecThrow[3], Float:time, const usEvent)    {
    new pGrenade = GetHookChainReturn(ATYPE_INTEGER);
    
    if (is_nullent(pGrenade))
        return HC_CONTINUE;
    
    new iType = get_entvar(pWeapon, var_weapons);
    set_entvar(pGrenade, var_weapons, iType);
    
    new Float:fGameTime = get_gametime();
    
    switch(iType)    {
        case Mine:    {
            set_entvar(pGrenade, var_solid, SOLID_TRIGGER);
            set_entvar(pGrenade, var_dmgtime, fGameTime + 9999.0);
            
            new Float:flAngles[3];    flAngles[1] = random_float(-360.0, 360.0);
            set_entvar(pGrenade, var_angles, flAngles);
        #if defined FAKE_MODEL   
            engfunc(EngFunc_SetModel, pGrenade, szFakeModels[random_num(0, charsmax(szFakeModels))]);
        #endif
        }
        case InpulseE, Sensor, Motion:    {
            set_entvar(pGrenade, var_dmgtime, fGameTime + 9999.0);
            set_entvar(pGrenade, var_teleport_time, fGameTime + 1.0);
        }
        case Homing:    {
            set_entvar(pGrenade, var_dmgtime, fGameTime + HOMING_TIME);
        }
    }
    
    return HC_CONTINUE;
}

public HamHook_Item_Spawn(const pItem)    {
    set_entvar(pItem, var_weapons, Norm);
}

public HamHook_TouchGrenade(const iEnt, const iToucher)    {
    if (get_member(iEnt, m_Grenade_bIsC4))
        return HAM_IGNORED;
    
    new iType = get_entvar(iEnt, var_weapons);
    new iOwner = get_entvar(iEnt, var_owner);
    
    switch(iType)    {
        case Touch:    {
            return ActiveGrenade(iEnt);
        }
        case Mine, Homing:    {
            if (!is_user_alive(iToucher) || !is_user_alive(iOwner))
                return HAM_IGNORED;
            
            if (get_member(iToucher, m_iTeam) == get_member(iOwner, m_iTeam))
                return HAM_IGNORED;
            
            if (iType == Mine && !(get_entvar(iEnt, var_flags) & FL_ONGROUND))
                return HAM_IGNORED;
            
            return ActiveGrenade(iEnt);
        }
    }
    
    return HAM_IGNORED;
}

public HamHook_ThinkGrenade(iEnt)    {
    if (get_member(iEnt, m_Grenade_bIsC4))
        return HAM_IGNORED;
    
    new iType = get_entvar(iEnt, var_weapons);
    new iOwner = get_entvar(iEnt, var_owner);
    
    if(!is_user_alive(iOwner))    {
#if defined REMOVE_NOT_CONNECT
        set_entvar(iEnt, var_flags, get_entvar(iEnt, var_flags) | FL_KILLME);
        return HAM_IGNORED;
#else
        return ActiveGrenade(iEnt);
#endif
    }
    
    if (get_member(iEnt, m_Grenade_bDetonated))
        return HAM_IGNORED;
    
    new iOwnerTeam = get_member(iOwner, m_iTeam);
    new _Victim = NULLENT;
    new Float:fVecOrigin[3];    get_entvar(iEnt, var_origin, fVecOrigin);
    
    switch(iType)    {
        case InpulseE:    {
            if (get_entvar(iOwner, var_button) & IN_USE)    {
                return ActiveGrenade(iEnt);
            }
        }
        case Sensor, Motion:    {
            if (get_entvar(iEnt, var_flags) & FL_ONGROUND)    {
                new Float:fGameTime = get_gametime();
                new Float:fVecVelocity[3];
                while ((_Victim = engfunc(EngFunc_FindEntityInSphere, _Victim, fVecOrigin, RADIUS_SENSOR)) != 0)    {
                    if(!is_user_alive(_Victim))    continue;
                    if (get_member(_Victim, m_iTeam) == iOwnerTeam)    continue;
                    
                    if (iType == Motion)    {
                        get_entvar(_Victim, var_velocity, fVecVelocity);
                        if (xs_vec_len(fVecVelocity) < MOTION_SPEED)    continue;
                    }
                    
                    return ActiveGrenade(iEnt);
                }
                if(get_entvar(iEnt, var_teleport_time) < fGameTime)    {
                    MSG_TE_BEAMCYLINDER(fVecOrigin, iType != Motion ? {255, 100, 255} : {255, 0, 0});
                    
                    set_entvar(iEnt, var_teleport_time, fGameTime + 1.0);
                }
            }
        }
        case Homing:    {
            _Victim = get_entvar(iEnt, var_enemy);
            
            if (!is_nullent(_Victim))
                entity_set_follow(iEnt, _Victim, SPEED_HOMING);
            else {
                _Victim = NULLENT;
                new Float:fDistance = RADIUS_HOMING;
                new Float:fNewDistance;
                new Float:fVecOriginTarget[3];
                
                while ((_Victim = engfunc(EngFunc_FindEntityInSphere, _Victim, fVecOrigin, fDistance)) != 0)    {
                    if(!is_user_alive(_Victim))    continue;
                    if (get_member(_Victim, m_iTeam) == iOwnerTeam)    continue;
                    
                    get_entvar(_Victim, var_origin, fVecOriginTarget);
                    
                    fNewDistance = vector_distance(fVecOriginTarget, fVecOrigin);
                    
                    if(fNewDistance < fDistance)    {
                        fDistance = fNewDistance
                        set_entvar(iEnt, var_enemy, _Victim);
                    }
                }
            }
        }
    }
    
    return HAM_IGNORED;
}

MSG_TE_BEAMCYLINDER(Float: fVecOrigin[3], RGB[3])    {
    message_begin_f(MSG_BROADCAST, SVC_TEMPENTITY, fVecOrigin, 0);
    write_byte(TE_BEAMCYLINDER);
    write_coord_f(fVecOrigin[0]);
    write_coord_f(fVecOrigin[1]);
    write_coord_f(fVecOrigin[2]);
    write_coord_f(fVecOrigin[0] + 30.0);
    write_coord_f(fVecOrigin[1]);
    write_coord_f(fVecOrigin[2] + RADIUS_SENSOR);
    write_short(g_iSensorSpr);
    write_byte(0);
    write_byte(1);
    write_byte(6);
    write_byte(1);//hight
    write_byte(1);
    write_byte(RGB[0]);//red
    write_byte(RGB[1]);//green
    write_byte(RGB[2]);//blue
    write_byte(255);
    write_byte(0);
    message_end();
}

ActiveGrenade(iEnt)    {
    if(get_member(iEnt, m_Grenade_bIsC4))    {
        set_member(iEnt, m_Grenade_flC4Blow, 0.0);
    }
    else    {
        if (GetGrenadeType(iEnt) == WEAPON_SMOKEGRENADE)
            set_entvar(iEnt, var_flags, get_entvar(iEnt, var_flags) | FL_ONGROUND);
        
        set_entvar(iEnt, var_dmgtime, 0.0);
    }
    
    set_member(iEnt, m_Grenade_bDetonated, true);
    
    dllfunc(DLLFunc_Think, iEnt);
    
    return HAM_SUPERCEDE;
}

stock entity_set_follow(entity, target, Float:fSpeed)
{
    if (is_nullent(entity) || !is_user_alive(target))
        return

    new Float:fl_Origin[3], Float:fl_EntOrigin[3]
    get_entvar(target, var_origin, fl_Origin)
    get_entvar(entity, var_origin, fl_EntOrigin)

    new Float:fl_InvTime = (fSpeed / vector_distance(fl_Origin, fl_EntOrigin))
    new Float:fl_Distance[3]; xs_vec_sub(fl_Origin, fl_EntOrigin, fl_Distance);
    new Float:fl_Velocity[3]; xs_vec_mul_scalar(fl_Distance, fl_InvTime, fl_Velocity);

    set_entvar(entity, var_velocity, fl_Velocity);

    new Float:fl_NewAngle[3];    vector_to_angle(fl_Velocity, fl_NewAngle);
    set_entvar(entity, var_angles, fl_NewAngle);
}
 
  • Like a Boss
Реакции: ifx
Сообщения
9
Реакции
1
1688104903874.png1688104983137.png
Maybe that solves it?
30 Июн 2023
30 Июн 2023
Please, if you have time, add the function to save the chosen grenade mode for the next grenade ☺
 
Последнее редактирование:
  • Нравится
Реакции: ifx
Сообщения
3
Реакции
0
А выдать по флагам разные мины можно? Сделать, так сказать, вип меню на разные флаги?
 
Сообщения
658
Реакции
230
Помог
11 раз(а)
@Lezhdei,да, все делается в хуке HamHook_Item_SecondaryAttack
 
Сообщения
207
Реакции
120
Помог
11 раз(а)
В режиме взрыва гранат при смерти или выходе //#define REMOVE_NOT_CONNECT мы будем попадать в рекурсию так как в синке гранаты вызывается ActiveGrenade, а в нем обратно вызывается синк гранаты.

Как вариант избавиться рекурсии :

Код:
#if defined REMOVE_NOT_CONNECT
        set_entvar(iEnt, var_flags, get_entvar(iEnt, var_flags) | FL_KILLME);
        return HAM_IGNORED;
#else
-       return ActiveGrenade(iEnt);
+        if (GetGrenadeType(iEnt) == WEAPON_SMOKEGRENADE)
+            set_entvar(iEnt, var_flags, get_entvar(iEnt, var_flags) | FL_ONGROUND);
+        set_entvar(iEnt, var_dmgtime, 0.0);
+        set_member(iEnt, m_Grenade_bDetonated, true)
#endif
 

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

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