Проблема с SetTouch

Сообщения
77
Реакции
1
Подскажите почему может не вызываться "PaladinExplode__Touch", когда "PaladinExplode__Think" отыгрывает всё хорошо и есть анимация, но тач даже не вызывается, пробовал с SOLID_TRIGGER, тоже не работает
Код:
public Create_Sphere(const id, const item)
{
    new ent = rg_create_entity(EntityPaladinReferance);
    if (is_nullent(ent))
        return;

    new Vector3(vecOrigin); UTIL_GetEyePosition(id, vecOrigin);
    new Vector3(vecDirection); UTIL_GetVectorAiming(id, vecDirection);

    xs_vec_add_scaled(vecOrigin, vecDirection, 20.0, vecOrigin);

    engfunc(EngFunc_SetOrigin, ent, vecOrigin);
    engfunc(EngFunc_SetModel, ent, EntityPaladinModel);
    engfunc(EngFunc_SetSize, ent, Float:{-1.0, -1.0, -1.0}, Float:{1.0, 1.0, 1.0});

    set_entvar(ent, var_classname, EntityPaladinClassNames[0]);
    set_entvar(ent, var_solid, SOLID_TRIGGER);
    set_entvar(ent, var_movetype, MOVETYPE_FLY);
    set_entvar(ent, var_owner, id);

    xs_vec_mul_scalar(vecDirection, EntityPaladinSpeed, vecDirection);
    set_entvar(ent, var_velocity, vecDirection);

    engfunc(EngFunc_VecToAngles, vecDirection, vecDirection);
    set_entvar(ent, var_angles, vecDirection);

    set_entvar(ent, var_scale, 0.05);
    set_entvar(ent, var_rendermode, kRenderTransAdd);
    set_entvar(ent, var_renderamt, 255.0);

    SetTouch(ent, "PaladinSphere__Touch");
}

public PaladinSphere__Touch(const ent, const toucher)
{
    if (toucher == get_entvar(ent, var_owner))
        return;

    new id = get_entvar(ent, var_owner);
    new Vector3(Origin); get_entvar(ent, var_origin, Origin);
    
    new expl = Create_Explode(id, Origin);
    client_print(0, print_chat, "1 - %d", expl);
    UTIL_KillEntity(ent);
}

public Create_Explode(const id, const Float:Origin[3])
{
    new exp = rg_create_entity(EntityPaladinReferance);
    if (is_nullent(exp))
        return NULLENT;

    static Vector3(vecMins), Vector3(vecMaxs);
    if (IsNullVector(vecMins) && IsNullVector(vecMaxs))
    {
        vecMins[0] = vecMins[1] = vecMins[2] = -EntityPaladinModelSize;
        vecMaxs[0] = vecMaxs[1] = vecMaxs[2] = EntityPaladinModelSize;
    }

    engfunc(EngFunc_SetOrigin, exp, Origin);
    engfunc(EngFunc_SetModel, exp, EntityPaladinModelExp);
    engfunc(EngFunc_SetSize, exp, vecMins, vecMaxs);

    set_entvar(exp, var_classname, EntityPaladinClassNames[1]);
    set_entvar(exp, var_movetype, MOVETYPE_NONE);
    set_entvar(exp, var_solid, SOLID_NOT);
    set_entvar(exp, var_owner, id);

    set_entvar(exp, var_frame, 0.0);
    set_entvar(exp, var_framerate, 0.075);
    set_entvar(exp, var_fuser1, 9.0);

    set_entvar(exp, var_scale, 0.5);
    set_entvar(exp, var_rendermode, kRenderTransAdd);
    set_entvar(exp, var_renderamt, 255.0);

    set_entvar(exp, var_nextthink, get_gametime());

    SetThink(exp, "PaladinExplode__Think");
    SetTouch(exp, "PaladinExplode__Touch");

    return exp;
}

public PaladinExplode__Think(const exp)
{
    if (is_nullent(exp))
        return;
    
    static Float:flFrame; get_entvar(exp, var_frame, flFrame);
    static Float:flFrameRate; get_entvar(exp, var_framerate, flFrameRate);
    static Float:flMaxFrame; flMaxFrame = get_entvar(exp, var_fuser1);
    
    if(flFrame < flMaxFrame)
    {
        flFrame += 1.0;
        
        set_entvar(exp, var_frame, flFrame);
        set_entvar(exp, var_nextthink, get_gametime() + flFrameRate);
        
        return;
    }
    
    UTIL_KillEntity(exp);
}

public PaladinExplode__Touch(const exp, const toucher)
{
    if (!IsUserValid(toucher))
        return;

    static pOwner; pOwner = get_entvar(exp, var_owner);
    if (toucher == pOwner)
        return;

    if (IsSimilarPlayersTeam(toucher, pOwner))
        return;

    static Float:flGameTime; flGameTime = get_gametime();
    static Float:flDamageTime; get_entvar(toucher, var_dmgtime, flDamageTime);
    if (flDamageTime < flGameTime)
    {
        set_member(toucher, m_LastHitGroup, HIT_GENERIC);
        ExecuteHamB(Ham_TakeDamage, toucher, exp, pOwner, EntityPaladinDamage, EntityPaladinDamageType);

        client_print(0, print_chat, "%d | %d", toucher, exp);

        set_entvar(toucher, var_dmgtime, flGameTime + EntityPaladinDamageTime);
    }
}
 
Сообщения
775
Реакции
291
Помог
11 раз(а)
Gre4a, а как вы определяете, что не вызывается?
 
Сообщения
77
Реакции
1
maFFyoZZyk, вставлял принт в начало кода, но ничего не выводилось
 
Сообщения
775
Реакции
291
Помог
11 раз(а)
Gre4a, ну судя по тому что вижу, вы вызываете уже посде проверок. Если это не то прошу прощения и я вижу два разных тача
11 Июн 2023
Какой из них не вызывается
 
Сообщения
77
Реакции
1
maFFyoZZyk, задумка такова, в 1 таче когда сфера чего либо касается, она удаляется и вызывается взрыв, да можно было это сделать просто через месагу, но я решил сделать это через энтити, во 2 таче происходит нанесения урона тем кто находится в радиусе тача
11 Июн 2023
для удобства могу скинуть полный код, если по требуеться
 
Сообщения
775
Реакции
291
Помог
11 раз(а)
Gre4a, ты скажи, какой из тачей не вызывается, если второй, то попробуй коммент на 82 строку
 
Сообщения
775
Реакции
291
Помог
11 раз(а)
Gre4a, ну значит попробуй то, что написал выше
 
Сообщения
77
Реакции
1
maFFyoZZyk, до этого я уже пробовал так делать, но для наглядности сейчас тоже попробовал, итог один и тот же, всё ровно тач не вызывается
 
Сообщения
775
Реакции
291
Помог
11 раз(а)
Gre4a, погоди, а как ты ловишь тач к взрыву, чего в этот момент у тебя касается игрок?
11 Июн 2023
Я понимаю если бы у тебя летели осколки и их касался игрок, но тут я чёт не понимаю логики
11 Июн 2023
А второе, ты удаляешь взрыв в синке и после вызываешь тач
 
Сообщения
77
Реакции
1
maFFyoZZyk, игрок может быть в воздухе и быть где угодно так же и касаться чего угодно, он выстрелил, сфера летит, касается чего либо, вызывая тач сферы, в этом таче вызывается создание взрыва этой сферы, а сама она удаляется, дальше идёт синк взрыва, там проигрывается анимация, а в таче наносится урон тем кто находится в размере взрыва(EngFunc_SetSize)
 
Сообщения
775
Реакции
291
Помог
11 раз(а)
Gre4a, 104 строка
11 Июн 2023
Из синка перенеси в тач
 
Сообщения
77
Реакции
1
maFFyoZZyk, хорошо, поробую такой способ
11 Июн 2023
maFFyoZZyk, не много изменил код, но даже так, тач не вызывается и энтити не удаляется даже(понял по принту который выводит ид энтити)
Код:
public PaladinExplode__Think(const exp)
{
    if (is_nullent(exp))
        return;
    
    static Float:flFrame; get_entvar(exp, var_frame, flFrame);
    static Float:flFrameRate; get_entvar(exp, var_framerate, flFrameRate);
    static Float:flMaxFrame; flMaxFrame = get_entvar(exp, var_fuser1);
    
    if(flFrame < flMaxFrame)
    {
        flFrame += 1.0;
        
        set_entvar(exp, var_frame, flFrame);
        set_entvar(exp, var_nextthink, get_gametime() + flFrameRate);
    }
}

public PaladinExplode__Touch(const exp, const toucher)
{
    client_print(0, print_chat, "%d | %d", toucher, exp);

    if (!IsUserValid(toucher))
        return;

    static pOwner; pOwner = get_entvar(exp, var_owner);
    if (toucher == pOwner)
        return;

    if (IsSimilarPlayersTeam(toucher, pOwner))
        return;
    set_member(toucher, m_LastHitGroup, HIT_GENERIC);
    ExecuteHamB(Ham_TakeDamage, toucher, exp, pOwner, EntityPaladinDamage, EntityPaladinDamageType);

    client_print(0, print_chat, "%d | %d", toucher, exp);

    UTIL_KillEntity(exp);
}
11 Июн 2023
из тача вообще ничего не происходит, ни принт ни урон
 
Сообщения
940
Реакции
188
Помог
4 раз(а)
Код:
    SetTouch(iEnt, "");
    set_entvar(iEnt, var_flags, get_entvar(iEnt, var_flags) | FL_KILLME);
 
Сообщения
77
Реакции
1
BiZaJe, вот сток который использую
Код:
stock UTIL_KillEntity(const pEntity)
{
    set_entvar(pEntity, var_flags, FL_KILLME);
    set_entvar(pEntity, var_nextthink, get_gametime());
}
11 Июн 2023
всё же попробовал с твоим кодом, но разницы нет
 
Сообщения
940
Реакции
188
Помог
4 раз(а)
Gre4a, rg_create_entity("info_target", false);
 
Сообщения
77
Реакции
1
BiZaJe, так же нет изменений, ставил false и в сфере и в взрыве, по отдельности и вместе
 
Сообщения
1,182
Реакции
2,147
Помог
57 раз(а)
можно попробовать мувтайп и солид засетать ДО SetOrigin / SetSize
ещё можно попробовать после создания (rg_create_entity) вызвать DLLFunc_Spawn
 

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

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