Невалидные координаты

Сообщения
846
Реакции
526
Помог
13 раз(а)
Приветствую, нужна ваша помощь
Не правильно сохраняются/обрабатываются координаты
принтую в чат и не понимаю в чем причина, записываю одни координаты, получаю совсем другие (близкие к коодинатам с трейслайна)

PHP:
public zp_grenade_primaryattack(id, iWeapon, grenadetype, activegrenade, bZombie)
{
    if (bZombie != g_bZombie)
        return PLUGIN_CONTINUE;

    if (grenadetype == g_iGrenadeType)
    {
        if (g_iGrenadeID == activegrenade)
        {
            static Float:flGameTime; flGameTime = get_gametime();

            if (get_ced(iWeapon, ced_float, ced_weapon_float_BunkerBuster_SelfCooldown) > flGameTime)
                return PLUGIN_HANDLED;

            if (get_ced(iWeapon, ced_int, ced_weapon_int_BunkerBuster_Scoped))
            {
                new iEnt, iSearchIndex, iTrace;
                new Float:flOrigin[3], Float:flViewOfs[3], Float:flAngles[3], Float:flStart[3], Float:flForward[3], Float:flForwardCustom[3], Float:flUp[3], Float:flRight[3], Float:flEnd[3], Float:flAnglesCustom[3];

                if (get_ced(iWeapon, ced_int, ced_weapon_int_BunkerBuster_Started)) // инициация делея для сброса
                {
                    iTrace = create_tr2();

                    set_entvar(id, var_viewmodel, g_szViewModel);
                    set_member(id, m_iFOV, 90);
                    SendWeaponAnim(id, ANIM_BUSTER_ZOOM_OUT, zp_get_user_hands(id));
                    set_ced(iWeapon, ced_int, ced_weapon_int_BunkerBuster_Scoped, false);

                    set_member(iWeapon, m_Weapon_flTimeWeaponIdle, 0.2);
                    set_member(iWeapon, m_Weapon_flNextPrimaryAttack, 0.2);
                    set_member(iWeapon, m_Weapon_flNextSecondaryAttack, 0.2);

                    get_entvar(id, var_origin, flOrigin);
                    get_entvar(id, var_view_ofs, flViewOfs);
                    get_entvar(id, var_v_angle, flAngles);

                    for (new i; i<3; i++)
                        flOrigin[i] += flViewOfs[i];

                    angle_vector(flAngles, ANGLEVECTOR_FORWARD, flForward);

                    xs_vec_mul_scalar(flForward, 4096.0, flForward);
                   // xs_vec_normalize(flForward, flForward);
                    xs_vec_add(flOrigin, flForward, flEnd);

                    engfunc(EngFunc_TraceLine, flOrigin, flEnd, IGNORE_MONSTERS, id, iTrace);

                    get_tr2(iTrace, TR_vecEndPos, flEnd);
                    free_tr2(iTrace);

                    get_entvar(iWeapon, var_origin, flStart);

                    client_print(id, print_chat, "flStart: %.2f %.2f %.2f", flStart[0], flStart[1], flStart[2]);

                    new iMarksNum = floatround(get_distance_f(flStart, flEnd)/400.0);
                   
                    client_print(id, print_chat, "flEnd: %.2f %.2f %.2f | Distance: %.2f | %d", flEnd[0], flEnd[1], flEnd[2], get_distance_f(flStart, flEnd), iMarksNum);

                    new Float:flCustomVector[3];
                    xs_vec_add(flStart, flEnd, flCustomVector);

                    for (new i; i<iMarksNum; i++)
                    {
                        xs_vec_mul_scalar(flCustomVector, 400.0, flCustomVector);
                        xs_vec_add(flStart, flCustomVector, flEnd);

                        iEnt = CreateMark(id, flEnd);
                        xs_vec_copy(flEnd, flStart);
                    }

                    set_ced(iWeapon, ced_int, ced_weapon_int_BunkerBuster_Started, false);
                    set_ced(iWeapon, ced_float, ced_weapon_float_BunkerBuster_SelfCooldown, flGameTime + 5.0);
               
                   
                }
                else
                {
                    iTrace = create_tr2();

                    set_member(iWeapon, m_Weapon_flNextPrimaryAttack, ANIM_MARK_TIME);
                    set_member(iWeapon, m_Weapon_flNextSecondaryAttack, ANIM_MARK_TIME);
                    set_member(iWeapon, m_Weapon_flTimeWeaponIdle, ANIM_MARK_TIME);
                    //set_member(id, m_flNextAttack, ANIM_MARK_TIME);
                    set_ced(iWeapon, ced_int, ced_weapon_int_BunkerBuster_Started, true);

                    get_entvar(id, var_origin, flOrigin);
                    get_entvar(id, var_view_ofs, flViewOfs);
                    get_entvar(id, var_v_angle, flAngles);

                    for (new i; i<3; i++)
                        flOrigin[i] += flViewOfs[i];

                    angle_vector(flAngles, ANGLEVECTOR_FORWARD, flForward);

                    //for (new i; i<3; i++)
                    //    flEnd[i] = flOrigin[i] + flForward[i] * 4096.0;

                    xs_vec_mul_scalar(flForward, 4096.0, flForward);
                   // xs_vec_normalize(flForward, flForward);
                    xs_vec_add(flEnd, flForward, flEnd);

                    engfunc(EngFunc_TraceLine, flOrigin, flEnd, IGNORE_MONSTERS, id, iTrace);

                    get_tr2(iTrace, TR_vecPlaneNormal, flUp);
                    xs_vec_cross(flForward, flUp, flRight);
                    xs_vec_cross(flUp, flRight, flForwardCustom);

                    vector_to_angle(flForwardCustom, flAngles);
                    vector_to_angle(flRight, flAnglesCustom);

                    flAngles[2] = -1.0 * flAnglesCustom[0];

                    get_tr2(iTrace, TR_vecEndPos, flEnd);

                    iEnt = CreateMark(id, flEnd);
                    client_print(id, print_chat, "flStart pre: %.2f %.2f %.2f", flEnd[0], flEnd[1], flEnd[2]);
                    set_entvar(iWeapon, var_origin, flEnd);
                    get_entvar(iWeapon, var_origin, flEnd);
                    client_print(id, print_chat, "flStart pre: %.2f %.2f %.2f", flEnd[0], flEnd[1], flEnd[2]);

                    set_entvar(iEnt, var_angles, flAngles);

                    free_tr2(iTrace);
                }

                set_member(iWeapon, m_flStartThrow, 1337.0);
            }

            return PLUGIN_HANDLED;
        }
    }

    return PLUGIN_CONTINUE;
}
Первые два значения - Начальные координаты и проверка того, что находится в pev'е, куда сохранены координаты
Далее идут координаты, которые уже получаю с этого же pev'а, но чуть позднее
Последними идут координаты с трейслайна

20691
4 Фев 2020
Возможно я где-то не внимательно что-то сделал или же какая заморская магия
в общем ищу помощи
 
Последнее редактирование:
Сообщения
59
Реакции
28
Помог
1 раз(а)
На всех картах такое? Встречал такое, на одной карте, на других было норм, возможно это не связано, но все же
 
Сообщения
212
Реакции
334
Помог
3 раз(а)
Видимо, сохранять координаты в pev->origin даже для предметов не безопасно:
https://github.com/s1lentq/ReGameDLL_CS/blob/master/regamedll/dlls/weapons.cpp#L1106
На сколько я знаю, объектам с aiment свойственно изменять свои координаты за прикрепленным объектом. Оно так, скорее всего, чтобы они не пропадали из PVS в результате.
 
Сообщения
846
Реакции
526
Помог
13 раз(а)

Для наглядности вообще что происходит
+Добавил для видимости метку конца авиабомбардировки, чтобы проверить трейс
по идее между первой и второй точкой должно добавиться еще в зависимости от общего расстояния / на радиус атаки для 1 метки = 400.0

Код обновил вот так
разницы нет


Код:
public zp_grenade_primaryattack(id, iWeapon, grenadetype, activegrenade, bZombie)
{
    if (bZombie != g_bZombie)
        return PLUGIN_CONTINUE;

    if (grenadetype == g_iGrenadeType)
    {
        if (g_iGrenadeID == activegrenade)
        {
            static Float:flGameTime; flGameTime = get_gametime();

            if (get_ced(iWeapon, ced_float, ced_weapon_float_BunkerBuster_SelfCooldown) > flGameTime)
                return PLUGIN_HANDLED;

            if (get_ced(iWeapon, ced_int, ced_weapon_int_BunkerBuster_Scoped))
            {
                new iEnt, iSearchIndex, iTrace;
                new Float:flOrigin[3], Float:flViewOfs[3], Float:flAngles[3], Float:flStart[3], Float:flForward[3], Float:flForwardCustom[3], Float:flUp[3], Float:flRight[3], Float:flEnd[3], Float:flAnglesCustom[3];

                if (get_ced(iWeapon, ced_int, ced_weapon_int_BunkerBuster_Started)) // инициация делея для сброса
                {
                    iTrace = create_tr2();

                    set_entvar(id, var_viewmodel, g_szViewModel);
                    set_member(id, m_iFOV, 90);
                    SendWeaponAnim(id, ANIM_BUSTER_ZOOM_OUT, zp_get_user_hands(id));
                    set_ced(iWeapon, ced_int, ced_weapon_int_BunkerBuster_Scoped, false);
                    

                    set_member(iWeapon, m_Weapon_flTimeWeaponIdle, 0.2);
                    set_member(iWeapon, m_Weapon_flNextPrimaryAttack, 0.2);
                    set_member(iWeapon, m_Weapon_flNextSecondaryAttack, 0.2);

                    get_entvar(id, var_origin, flOrigin);
                    get_entvar(id, var_view_ofs, flViewOfs);
                    get_entvar(id, var_v_angle, flAngles);

                    xs_vec_add(flOrigin, flViewOfs, flOrigin);

                    angle_vector(flAngles, ANGLEVECTOR_FORWARD, flForward);

                    xs_vec_mul_scalar(flForward, 4096.0, flForward);
                    xs_vec_add(flOrigin, flForward, flEnd);

                    engfunc(EngFunc_TraceLine, flOrigin, flEnd, IGNORE_MONSTERS, id, iTrace);

                    get_tr2(iTrace, TR_vecEndPos, flEnd);
                    free_tr2(iTrace);

                    CreateMark(id, flEnd); // test end

                    get_entvar(iWeapon, var_origin, flStart);
                    client_print(id, print_chat, "flStart: %.2f %.2f %.2f", flStart[0], flStart[1], flStart[2]);

                    new iMarksNum = floatround(get_distance_f(flStart, flEnd)/400.0);
                    
                    client_print(id, print_chat, "flEnd: %.2f %.2f %.2f | Distance: %.2f | %d", flEnd[0], flEnd[1], flEnd[2], get_distance_f(flStart, flEnd), iMarksNum);

                    new Float:flCustomVector[3];
                    xs_vec_add(flStart, flEnd, flCustomVector);

                    for (new i; i<iMarksNum; i++)
                    {
                        xs_vec_mul_scalar(flCustomVector, 400.0, flCustomVector);
                        xs_vec_add(flStart, flCustomVector, flEnd);

                        iEnt = CreateMark(id, flEnd);
                        xs_vec_copy(flEnd, flStart);
                    }

                    set_ced(iWeapon, ced_int, ced_weapon_int_BunkerBuster_Started, false);
                    set_ced(iWeapon, ced_float, ced_weapon_float_BunkerBuster_SelfCooldown, flGameTime + 5.0);
                }
                else
                {
                    iTrace = create_tr2();

                    set_member(iWeapon, m_Weapon_flNextPrimaryAttack, ANIM_MARK_TIME);
                    set_member(iWeapon, m_Weapon_flNextSecondaryAttack, ANIM_MARK_TIME);
                    set_member(iWeapon, m_Weapon_flTimeWeaponIdle, ANIM_MARK_TIME);
                    //set_member(id, m_flNextAttack, ANIM_MARK_TIME);
                    set_ced(iWeapon, ced_int, ced_weapon_int_BunkerBuster_Started, true);

                    get_entvar(id, var_origin, flOrigin);
                    get_entvar(id, var_view_ofs, flViewOfs);
                    get_entvar(id, var_v_angle, flAngles);

                    for (new i; i<3; i++)
                        flOrigin[i] += flViewOfs[i];

                    angle_vector(flAngles, ANGLEVECTOR_FORWARD, flForward);

                    //for (new i; i<3; i++)
                    //    flEnd[i] = flOrigin[i] + flForward[i] * 4096.0;

                    xs_vec_mul_scalar(flForward, 4096.0, flForward);
                    //xs_vec_normalize(flForward, flForward);
                    xs_vec_add(flOrigin, flForward, flEnd);

                    engfunc(EngFunc_TraceLine, flOrigin, flEnd, IGNORE_MONSTERS, id, iTrace);

                    get_tr2(iTrace, TR_vecPlaneNormal, flUp);
                    xs_vec_cross(flForward, flUp, flRight);
                    xs_vec_cross(flUp, flRight, flForwardCustom);

                    vector_to_angle(flForwardCustom, flAngles);
                    vector_to_angle(flRight, flAnglesCustom);

                    flAngles[2] = -1.0 * flAnglesCustom[0];

                    get_tr2(iTrace, TR_vecEndPos, flEnd);

                    iEnt = CreateMark(id, flEnd);
                    client_print(id, print_chat, "flStart pre: %.2f %.2f %.2f", flEnd[0], flEnd[1], flEnd[2]);
                    set_entvar(iWeapon, var_origin, flEnd);
                    get_entvar(iWeapon, var_origin, flEnd);
                    client_print(id, print_chat, "flStart pre: %.2f %.2f %.2f", flEnd[0], flEnd[1], flEnd[2]);

                    set_entvar(iEnt, var_angles, flAngles);

                    free_tr2(iTrace);
                }

                set_member(iWeapon, m_flStartThrow, 1337.0);
            }

            return PLUGIN_HANDLED;
        }
    }

    return PLUGIN_CONTINUE;
}
4 Фев 2020
Видимо, сохранять координаты в pev->origin даже для предметов не безопасно:
https://github.com/s1lentq/ReGameDLL_CS/blob/master/regamedll/dlls/weapons.cpp#L1106
На сколько я знаю, объектам с aiment свойственно изменять свои координаты за прикрепленным к ним объектам. Оно так, скорее всего, чтобы они не пропадали из PVS в результате.
до этого у меня хранилось в другом месте, так же косило координаты
хранилось в спец.модуле, как сейчас хранятся int'ы (в коде это видно). Сначала подумал на этот самый модуль, но как оказалось нет, в других pev'ах такая же картина
 
Сообщения
212
Реакции
334
Помог
3 раз(а)
Даже pev-fuserX перезаписывается так? Очень странно. Предлагаю для теста сделать клиентскую команду чтобы следить за изменением координат в тех полях. Может быть, удастся установить какую-то зависимость. Подвигаться там и сравнить результаты, может еще что-то.
 
Сообщения
289
Реакции
251
Помог
7 раз(а)
попробуй entity_set_origin
 

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

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