Имитация взрыва гранаты

darkspice

Участник
Сообщения
21
Реакции
0
Возник вопрос по поводу имитации каких-либо событий.
В данном случае интересует событие взрыва.
Есть некий лазер, дотрагиваясь которого, враги(зомби) получают урон, но я хочу заменить урон и сделать, что бы когда враг дотрагивался лазера, рядом с ним происходил взрыв гранаты, ну или прям в нем, не суть.
Взял из кода функцию срабатывающую когда враг дотрагивается до лазера.Сделал поправки.Но вместо того, что бы был взрыв, враги просто замедляются на время прохождения лазера.(ну там идут тики лазера равные фреймам).
PHP:
//какой-то код выше 
public void EventBeamTouched(const char[] sOutput, int nEntity, int activatorIndex, float flDelay)
{
    #pragma unused activatorIndex
    float fClientPos[3];   
    GetClientEyePosition(activatorIndex, fClientPos);
 
    //Тут были всякие проверки.

    //Это то что было в коде, но мне это не нужно.
    // Apply damage
    //SDKHooks_TakeDamage(activatorIndex, nEntity, ownerIndex, GetConVarFloat(gCvarList[CVAR_LASERMINE_DAMAGE]), DMG_BURN);



    //Мой код
    SendDetonate(activatorIndex, activatorIndex, fClientPos[0], fClientPos[1], fClientPos[2] );

    
    
    // Emit hurt sound
    EmitSoundToAll("*/zbm3/mine/suitchargeok1.mp3", activatorIndex, SNDCHAN_VOICE, SNDLEVEL_NORMAL);
}

//Функция отлова события взрыва
void SendDetonate(int iVictim, int iEntity, float xVictim, float yVictim, float zVictim )
{
    Event hEvent = CreateEvent("hegrenade_detonate");
    if (hEvent != null)
    {
        hEvent.SetInt("userid", GetClientUserId(iVictim) );
        hEvent.SetInt("entityid", GetClientUserId(iEntity) );
        hEvent.SetFloat("x", xVictim);
        hEvent.SetFloat("y", yVictim);
        hEvent.SetFloat("z", zVictim);
        hEvent.Fire(true);
    }   
    
}
 

wayLANder

Где AlmazON?
Сообщения
1,742
Реакции
577
По коду не помогу, но в Deathmatch Goes Advanced вроде бы есть пример взрывов гранат, в разминке (вернее во время конца разминки/отсчёта до начала матча) по карте взрываются he, посмотри в коде как там это реализованной, может поможет:)
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
Сделал поправки.Но вместо того, что бы был взрыв, враги просто замедляются на время прохождения лазера.(ну там идут тики лазера равные фреймам).

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

Есть некий лазер, дотрагиваясь которого, враги(зомби) получают урон, но я хочу заменить урон и сделать, что бы когда враг дотрагивался лазера, рядом с ним происходил взрыв гранаты, ну или прям в нем, не суть.

А этот лазер после взрыва должен пропадать ?
 

darkspice

Участник
Сообщения
21
Реакции
0
@Someone,
Так вот я и не знал, как вызвать взрыв, думал событие вызовет взрыв, а оно просто походу отправляет серверу информацию, мол, вот только что было событие взрыва гранаты, но физического какого-либо явления не происходит.
Тогда, как вызвать взрыв, смерть игрока и тд?

Лазер не пропадает, но там это сделать можно.Мне главное сделать имитацию взрыва, что бы он был.
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
@Someone,
Мне главное сделать имитацию взрыва, что бы он был.

Много взрывов = много вылетов.


С оленей код брал:

PHP:
void DoExplosion(float vPos[3], int iAtker = 0, int iInflictor = -1, int iIgnoreEntity = -1, int iDamage = 0, int iRadius = 146, int iFlags = 0, float flDmgForce = 0.0, char[] szWepName = "")
{
    int iExplosion = CreateEntityByName("env_explosion");
    if (IsValidEntity(iExplosion))
    {

        if (iAtker != -1) // Suggested to make it a player or his weapon
        {
            SetEntPropEnt(iExplosion, Prop_Data, "m_hOwnerEntity", iAtker);
        }

        if (iInflictor != -1)
        {
            SetEntPropEnt(iExplosion, Prop_Data, "m_hInflictor", iInflictor);
        }

        if (iIgnoreEntity != -1)
        {
            SetEntPropEnt(iExplosion, Prop_Data, "m_hEntityIgnore", iIgnoreEntity);
        }
       
        SetEntProp(iExplosion, Prop_Data, "m_iMagnitude", iDamage);
        SetEntProp(iExplosion, Prop_Data, "m_iRadiusOverride", iRadius);

        DispatchKeyValueInt(iExplosion, "spawnflags", iFlags);

        if (flDmgForce > 0.0)
        {
            DispatchKeyValueFloat(iExplosion, "DamageForce", flDmgForce);
        }

        if (szWepName[0] != '\0')
        {
            DispatchKeyValue(iExplosion, "classname", szWepName);
           
            // if (iInflictor != -1)
            // {
            //     DispatchKeyValue(iInflictor, "classname", szWepName);
            // }
        }

        TeleportEntity(iExplosion, vPos, NULL_VECTOR, NULL_VECTOR);
        DispatchSpawn(iExplosion);
        //ActivateEntity(iExplosion);
        AcceptEntityInput(iExplosion, "Explode");
    }
}

Поставь его вместо SendDetonate. Может сработает.

Вместо GetClientEyePosition (указывает туда куда игрок смотрит) поставь GetClientAbsOrigin.
 

darkspice

Участник
Сообщения
21
Реакции
0
@Someone,
Убрал вот эту строку, на нее компил жаловался

PHP:
DispatchKeyValueInt(iExplosion, "spawnflags", iFlags);

А так работает, когда зомби проходил сквозь мину, происходит 3-4 взрыва(это из-за настройки мины), но вот зомби остается жив.Только иногда каким то мистическим образом умирает сам от себя, без понятия почему.
Вместо своего SendDetonate вставил :
PHP:
DoExplosion(fClientPos,activatorIndex,activatorIndex,1,100,146,0,100.0,"hegrenade");

Код, который у меня в функции, что ты скидывал.

PHP:
void DoExplosion(float vPos[3], int iAtker, int iInflictor, int iIgnoreEntity, int iDamage, int iRadius = 146, int iFlags = 0, float flDmgForce, char[] szWepName = "")
{
    int iExplosion = CreateEntityByName("env_explosion");
    if (IsValidEntity(iExplosion))
    {

        if (iAtker != -1) // Suggested to make it a player or his weapon
        {
            SetEntPropEnt(iExplosion, Prop_Data, "m_hOwnerEntity", iAtker);
        }

        if (iInflictor != -1)
        {
            SetEntPropEnt(iExplosion, Prop_Data, "m_hInflictor", iInflictor);
        }

        if (iIgnoreEntity != -1)
        {
            SetEntPropEnt(iExplosion, Prop_Data, "m_hEntityIgnore", iIgnoreEntity);
        }
    
        SetEntProp(iExplosion, Prop_Data, "m_iMagnitude", iDamage);
        SetEntProp(iExplosion, Prop_Data, "m_iRadiusOverride", iRadius);

    

        if (flDmgForce > 0.0)
        {
            DispatchKeyValueFloat(iExplosion, "DamageForce", flDmgForce);
        }

        if (szWepName[0] != '\0')
        {
            DispatchKeyValue(iExplosion, "classname", szWepName);
        
            // if (iInflictor != -1)
            // {
            //     DispatchKeyValue(iInflictor, "classname", szWepName);
            // }
        }

        TeleportEntity(iExplosion, vPos, NULL_VECTOR, NULL_VECTOR);
        DispatchSpawn(iExplosion);
        //ActivateEntity(iExplosion);
        AcceptEntityInput(iExplosion, "Explode");


    }
}
Зомби не умирал не до редактирования функции(как ты мне скинул, так я и вставил) не после(у зм я поставил специально 1 хп у всех)

Просто у меня на сервере стоит headshotonly, но стоит исключение на нож и гранату.И поэтому просто SDKHooks_TakeDamage не работает, поэтому и нужно имитировать взрыв гранаты.Через SDKHooks_TakeDamage пробовал вставлять разные виды урона, и с хедшотом, но не работает.С отключенным плагином headshotonly зм тоже не умирают от взрыва.

ПС
Если есть просто какой ни будь путь, убить игрока когда он касается мины, то тоже сойдет.По типу имитации админского кила или kill в консоль, ну или что-то вроде того.
 
Последнее редактирование:

Someone

Участник
Сообщения
1,933
Реакции
1,653
@Someone,
Убрал вот эту строку, на нее компил жаловался


А так работает, когда зомби проходил сквозь мину, происходит 3-4 взрыва(это из-за настройки мины), но вот зомби остается жив.Только иногда каким то мистическим образом умирает сам от себя, без понятия почему.
Вместо своего SendDetonate вставил :
PHP:
DoExplosion(fClientPos,activatorIndex,activatorIndex,1,100,146,0,100.0,"hegrenade");

Damage Force на 0.0 поставь

Если есть просто какой ни будь путь, убить игрока когда он касается мины, то тоже сойдет.По типу имитации админского кила или kill в консоль, ну или что-то вроде того.

ForcePlayerSuicide(iClient)
 

darkspice

Участник
Сообщения
21
Реакции
0
Damage Force на 0.0 поставь
С нетронутой функцией тоже не убивало.Я каждое изначальное значение менял поочередно, но эффект не изменялся.Да в принципе уже не нужно, если только для будущих задумок) , но думаю еще не скоро) , а так спасибо за код, очень полезен.

Спасибо большое, то что надо.Просто много каких стандартных функций не знаю, да что уж там, только ведь начал изучать,как-то не догадался через ключевое слово Suicide поискать функцию)) , поэтому всякие глупые костыли сразу в голову и лезут.Надо было сразу вопрос так и поставить))
 
Сверху Снизу