Русское сообщество по скриптингу

Застревание объекта в карте

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Застревание объекта в карте

Сообщение Doc Batcon » 21 фев 2018, 08:05

Объект часто застревает на месте если его "закрутить".

Код: Выделить всё
public CreateOberon(Float:vOrigin[3], Float:vAngles[3])
{
    if(is_nullent(g_pEntityOberon))
    {
        g_pEntityOberon = rg_create_entity(OBERON_REFERENCE); //monster_hevsuit_dead
        set_entvar(g_pEntityOberon, var_classname, OBERON_CLASSNAME);

        engfunc(EngFunc_SetModel, g_pEntityOberon, OBERON_MODEL);
        set_entvar(g_pEntityOberon, var_modelindex, engfunc(EngFunc_ModelIndex, OBERON_MODEL));

        SetModelCollisionBox(g_pEntityOberon);
        ExecuteHamB(Ham_SetObjectCollisionBox, g_pEntityOberon);

        SetThink(g_pEntityOberon, "Oberon_Think");
    }
    if(is_nullent(g_pEntityEffect))
    {
        g_pEntityEffect = rg_create_entity(EFFECT_REFERENCE);
        set_entvar(g_pEntityEffect, var_classname, EFFECT_CLASSNAME);
        set_entvar(g_pEntityEffect, var_framerate, 1.0);
        SetThink(g_pEntityEffect, "Effect_Think");
    }

    set_entvar(g_pEntityEffect, var_effects, EF_NODRAW);

    set_entvar(g_pEntityOberon, var_takedamage, DAMAGE_NO);
    set_entvar(g_pEntityOberon, var_framerate, 1.0);
    set_entvar(g_pEntityOberon, var_solid, SOLID_BBOX);
    set_entvar(g_pEntityOberon, var_movetype, MOVETYPE_PUSHSTEP);
    set_entvar(g_pEntityOberon, var_gamestate, 0);
    set_entvar(g_pEntityOberon, var_deadflag, DEAD_NO);
    set_entvar(g_pEntityOberon, var_flags, FL_MONSTER);
    set_entvar(g_pEntityOberon, var_angles, vAngles);
    set_entvar(g_pEntityOberon, var_nextthink, get_gametime());

    set_entvar(g_pEntityOberon, var_health,     OBERON_HEALTH);
    set_entvar(g_pEntityOberon, var_max_health, OBERON_HEALTH);
    set_entvar(g_pEntityOberon, var_gravity,     OBERON_GRAVITY);
    set_member(g_pEntityOberon, m_bloodColor,     OBERON_BLOODCOLOR);

    engfunc(EngFunc_SetOrigin, g_pEntityOberon, vOrigin);
    
    SET_BOSS_ACT_ID
(OBERON_ACT_APPEAR);
    SET_BOSS_ACT_STAGE(0, false);
}

Код: Выделить всё
stock UTIL_MoveToOrigin2(const pEntity, Float:vTarget[3], Float:fSpeed, bitsCheck = 0)
{
    #define VEC_ANGLE_MOVE    2.5
    
    static Float
:vOrigin[3]; pev(pEntity, pev_origin, vOrigin);
    static Float:vAngles[3]; pev(pEntity, pev_angles, vAngles);
    static Float:vDir[3], Float:vAnglesDir[3];
    static iTemp[3];
    static iSectorEntity, iSectorTarget;
    static Float:vForward[3]
    static Float:vMove[3];
    static Float:flFraction;
    
    xs_vec_sub
(vTarget, vOrigin, vDir);
    
    vector_to_angle
(vDir, vAnglesDir);
    
    iTemp
[0] = floatround(vAnglesDir[0]);    
    iTemp
[1] = floatround(vAnglesDir[1]);    
    iTemp
[2] = floatround(vAnglesDir[2]);    
    vAnglesDir
[0] = vAnglesDir[0] - iTemp[0] + (iTemp[0] % 360);
    vAnglesDir[1] = vAnglesDir[1] - iTemp[1] + (iTemp[1] % 360);
    vAnglesDir[2] = vAnglesDir[2] - iTemp[2] + (iTemp[2] % 360);
            
    iTemp
[0] = floatround(vAngles[0]);    
    iTemp
[1] = floatround(vAngles[1]);    
    iTemp
[2] = floatround(vAngles[2]);    
    vAngles
[0] = vAngles[0] - iTemp[0] + (iTemp[0] % 360);
    vAngles[1] = vAngles[1] - iTemp[1] + (iTemp[1] % 360);
    vAngles[2] = vAngles[2] - iTemp[2] + (iTemp[2] % 360);
    
    switch
(floatround(vAngles[1])) 
    
{
        case 0..90:     iSectorEntity = 1;
        case 91..180:     iSectorEntity = 2;
        case 181..270:     iSectorEntity = 3;
        case 271..360:     iSectorEntity = 4;
    }
    switch(floatround(vAnglesDir[1])) 
    
{
        case 0..90:     iSectorTarget = 1;
        case 91..180:     iSectorTarget = 2;
        case 181..270:     iSectorTarget = 3;
        case 271..360:     iSectorTarget = 4;
    }

    static Float:fAngleYaw; fAngleYaw = vAnglesDir[1] - vAngles[1];
    
    if
(iSectorEntity == iSectorTarget) 
    
{
        if(VEC_ANGLE_MOVE >= fAngleYaw >= 0.0 || -VEC_ANGLE_MOVE <= fAngleYaw <= 0.0) 
            vAngles
[1] = vAnglesDir[1];
        else if(fAngleYaw > 0.0) 
            vAngles
[1] += VEC_ANGLE_MOVE;
        else 
            vAngles
[1] -= VEC_ANGLE_MOVE;
    }
    else 
    
{
        if((iSectorEntity + 1 == 5 ? 1 : iSectorEntity) == iSectorTarget || (iSectorEntity - 1 == 0 ? 4 : iSectorEntity) == iSectorTarget) 
        
{
            fAngleYaw = -vAnglesDir[1] + vAngles[1];

            if(VEC_ANGLE_MOVE >= fAngleYaw >= 0.0 || -VEC_ANGLE_MOVE <= fAngleYaw <= 0.0) 
                vAngles
[1] = vAnglesDir[1];
            else if(fAngleYaw > 0.0) 
                vAngles
[1] += VEC_ANGLE_MOVE;
            else 
                vAngles
[1] -= VEC_ANGLE_MOVE;
        }
        else 
        
{
            if(vAnglesDir[1] > vAngles[1] && (vAnglesDir[1] - vAngles[1] < 180.0)) 
                vAngles
[1] += VEC_ANGLE_MOVE;
            else 
                vAngles
[1] -= VEC_ANGLE_MOVE;
        }
    }
    
    angle_vector
(vAngles, ANGLEVECTOR_FORWARD, vForward);
    vMove[0] = vForward[0] * fSpeed;
    vMove[1] = vForward[1] * fSpeed;
    vMove[2] = vForward[2] * fSpeed;
    
    set_pev
(pEntity, pev_angles, vAngles);
    set_pev(pEntity, pev_velocity, vMove);

    if(bitsCheck & (1<<1))
    {
        xs_vec_mul_scalar(vForward, 64.0, vCheck);
        xs_vec_add(vCheck, vOrigin, vCheck);
        engfunc(EngFunc_TraceHull, vOrigin, vCheck, DONT_IGNORE_MONSTERS, HULL_HUMAN, pEntity, 0);
        get_tr2(0, TR_flFraction, flFraction);
        if(flFraction != 1.0)
            return 0;
    }

    return get_distance_f(vOrigin, vTarget) > (128) ? 1 : 0;
}
Аватара пользователя
Doc Batcon
 
Сообщения: 35
Зарегистрирован: 18 сен 2016, 12:36
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Опыт программирования: Меньше недели
Языки программирования: Pawn

Re: Застревание объекта в карте

Сообщение Hilarious » 21 фев 2018, 16:28

SOLID_BBOX - если объект не нужно уничтожать, можно это поменять на что-то другое, хотя бы на время кручения.

engfunc(EngFunc_SetOrigin - это надо ещё проверять на соприкосновение с "полами"

Потом у вас объект два раза меняет свой ориджин, ну это только то что я увидел
В матрице :-[
Аватара пользователя
Hilarious
 
Сообщения: 69
Зарегистрирован: 07 фев 2018, 08:46
Благодарил (а): 6 раз.
Поблагодарили: 29 раз.

Re: Застревание объекта в карте

Сообщение Doc Batcon » 23 фев 2018, 12:56

ап :shout:
Аватара пользователя
Doc Batcon
 
Сообщения: 35
Зарегистрирован: 18 сен 2016, 12:36
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Опыт программирования: Меньше недели
Языки программирования: Pawn


Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 12