Изменение направления полета гильз (Это безумие не закончится)

Сообщения
78
Реакции
7
Всех приветствую! Решил продолжить копаться в коде КОРДа на оружие, дабы на его основе сделать себе приличный арсенал. Задумка в том чтобы сначала сделать первый эталонный образец оружия, отсекая лишнее, упрощая сложное (к примеру, прописать квары на отдачу, вместо поиска ее формул каждый раз в 1500 строках кода), оптимизируя старое по возможности. И на основе перекопанного кода продолжить в облегченном темпе делать другое оружие. Первым образцом по злой иронии оказался silver infinity, казалось бы обычный пистолет, но так как код переписывался с пп, я столкнулся с некоторыми багами, но это была мелочь, ВЕДЬ ЗАТВОР У ПИСТОЛЕТА НАХОДИТСЯ СПРАВА, а следовательно и гильзы летят ВПРАВО, а у всех оригинальных пистолетов гильзы летят влево. И тут пошли приколы, ни в русском, ни в английском сегменте интернета я не нашел ответа, искал на гитхабе в исходниках regamedll и также не нашел ничего. Единственная надежда - вы.

Отрывок Кордовского кода вылета гильз:

Код:
EjectBrass(const iPlayer, const iModelIndex, const iBounce, const Float:flUpScale = -9.0, const Float: flForwardScale = 16.0, const Float: flRightScale = 0.0)
{
    static i, msgBrass;
    
    static Float: vecUp[3];
    static Float: vecRight[3];
    static Float: vecForward[3];
    
    static Float: vecAngle[3];
    static Float: vecOrigin[3];
    static Float: vecViewOfs[3];
    static Float: vecVelocity[3];
    
    pev(iPlayer, pev_v_angle, vecAngle);
    pev(iPlayer, pev_punchangle, vecOrigin);
    
    xs_vec_add(vecAngle, vecOrigin, vecOrigin);
    engfunc(EngFunc_MakeVectors, vecOrigin);
    
    pev(iPlayer, pev_origin, vecOrigin);
    pev(iPlayer, pev_view_ofs, vecViewOfs);
    pev(iPlayer, pev_velocity, vecVelocity);
    
    global_get(glb_v_up, vecUp);
    global_get(glb_v_right, vecRight);
    global_get(glb_v_forward, vecForward);
    
    for (i = 0; i < 3; i++)
    {
        vecOrigin[i] = vecOrigin[i] + vecViewOfs[i] + vecForward[i] * flForwardScale + vecUp[i] * flUpScale + vecRight[i] * flRightScale;
        vecVelocity[i] = vecVelocity[i] + vecForward[i] * 25.0 + vecUp[i] * random_float(100.0, 150.0) + vecRight[i] * random_float(50.0, 70.0);
    }
    
    if (msgBrass || (msgBrass = get_user_msgid("Brass")))
    {
        MESSAGE_BEGIN(MSG_PVS, msgBrass, vecOrigin, 0);
        WRITE_BYTE(0 /* dummy */);
        WRITE_COORD(vecOrigin[0]);
        WRITE_COORD(vecOrigin[1]);
        WRITE_COORD(vecOrigin[2]);
        WRITE_COORD(0.0 /* dummy */);
        WRITE_COORD(0.0 /* dummy */);
        WRITE_COORD(0.0 /* dummy */);
        WRITE_COORD(vecVelocity[0]);
        WRITE_COORD(vecVelocity[1]);
        WRITE_COORD(vecVelocity[2]);
        WRITE_ANGLE(vecAngle[1]); // Спорная Хуйня
        WRITE_SHORT(iModelIndex);
        WRITE_BYTE(iBounce);
        WRITE_BYTE(0 /* dummy */);
        WRITE_BYTE(iPlayer);
        MESSAGE_END();
    }
}
В чем суть:

vecOrigin это координаты точки появления гильзы, вычисляются, как понимаю, на векторе проходящем из глаз в сторону нулевых координат модели оружия с вносимыми нами корректировками, на сторону полета не влияют.
vecVelocity - задает скорость полета гильзы, при нулях гильзы почти сразу падают вниз, при негативных значениях гильзы незаметно падают с левого бока игрока. В любом случае это влияет на скорость и дальность, а не на направление полета гильзы.
vecAngle - это точка куда смотрит игрок, определяет угол полета гильзы, траектория должна же логично меняться в зависимости от того куда по вертикали смотрит игрок, при игре со значениями временами удавалось заставить гильзы лететь вправо, если смотреть под определенным углом в определенную сторону, но это стоило сломанной напрочь траектории полета гильз в 90 процентов остальных случаев.
Все остальные прописанные в мессаге моменты на полет гильзы не влияют.



Крупицы знаний, откопанные в интернете:

1) Место вылета гильз можно указать в v модели через кость и attachment с координатами в qc файле, однако, это будет ТОЧКА ВЫЛЕТА, а не ВЕКТОР ПОЛЕТА гильзы, более того вышеуказанный код не учитывает эти координаты, координаты вылета гильз прописываются непосредственно в самом отрывке кода.

2) Нашел старый альтернативный вариант прописывания гильз:

Код:
#define m_iShellId 57
#define m_flEjectBrass 111

stock UTIL_EjectBrass(iWeapon, iPlayer, g_iszModelIndexShell)
{
    set_pdata_int(iWeapon, m_iShellId, g_iszModelIndexShell, 4);
    set_pdata_float(iPlayer, m_flEjectBrass, get_gametime());
}
Отличие в том, что траектория гильз тут берется у оружия с которого переписывается плагин без учета attachment координат и прочего, то есть этот отрывок бесполезен.

3) Покопался в исходниках regamedll нашел такой же MSG с такими же расчетами координат как у КОРДа:

Код:
void CBasePlayerWeapon::EjectBrassLate()
{
    int soundType;
    Vector vecUp, vecRight, vecShellVelocity;

    UTIL_MakeVectors(m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle);

    vecUp = RANDOM_FLOAT(100, 150) * gpGlobals->v_up;
    vecRight = RANDOM_FLOAT(50, 70) * gpGlobals->v_right;

    vecShellVelocity = (m_pPlayer->pev->velocity + vecRight + vecUp) + gpGlobals->v_forward * 25;
    soundType = (m_iId == WEAPON_XM1014 || m_iId == WEAPON_M3) ? 2 : 1;

    EjectBrass(pev->origin + m_pPlayer->pev->view_ofs + gpGlobals->v_up * -9 + gpGlobals->v_forward * 16, gpGlobals->v_right * -9,
        vecShellVelocity, pev->angles.y, m_iShellId, soundType, m_pPlayer->entindex());
}

void EjectBrass(const Vector &vecOrigin, const Vector &vecLeft, const Vector &vecVelocity, float rotation, int model, int soundtype, int entityIndex)
{
    bool useNewBehavior = AreRunningCZero();

    MESSAGE_BEGIN(MSG_PVS, gmsgBrass, vecOrigin);
        if (!useNewBehavior)
        {
            // noxref
            WRITE_BYTE(TE_MODEL);
        }
        WRITE_COORD(vecOrigin.x);    // origin
        WRITE_COORD(vecOrigin.y);
        WRITE_COORD(vecOrigin.z);
        if (!useNewBehavior)
        {
            // noxref
            // it parses the client side, but does not use it
            WRITE_COORD(vecLeft.x);
            WRITE_COORD(vecLeft.y);
            WRITE_COORD(vecLeft.z);
        }
        WRITE_COORD(vecVelocity.x);    // velocity
        WRITE_COORD(vecVelocity.y);
        WRITE_COORD(vecVelocity.z);
        WRITE_ANGLE(rotation);
        WRITE_SHORT(model);
        WRITE_BYTE(soundtype);
        if (!useNewBehavior)
        {
            // noxref
            WRITE_BYTE(25);// 2.5 seconds
        }
        WRITE_BYTE(entityIndex);
    MESSAGE_END();
}

Координаты VecLeft ни на что не влияют)))

Я просто иссушен тремя днями безрезультатных поисков, и я бы давно забил, если бы понимал что это невозможно. Но это не так! На сервере у SISA гильзы того же пистолета прописаны ИДЕАЛЬНО, более того даже на парной версии пистолетов в зависимости от анимаций гильзы летят идеально влево, вверх, вниз. Если кто поможет буду дико рад.
 
  • Нравится
Реакции: ssx
Сообщения
212
Реакции
334
Помог
3 раз(а)
vecVelocity - задает скорость полета гильзы, при нулях гильзы почти сразу падают вниз, при негативных значениях гильзы незаметно падают с левого бока игрока. В любом случае это влияет на скорость и дальность, а не на направление полета гильзы.
velocity — это ускорение. Оно влияет на направление и скорость.
C:
vecVelocity[i] = vecVelocity[i] + vecForward[i] * 25.0 + vecUp[i] * random_float(100.0, 150.0) + vecRight[i] * -random_float(50.0, 70.0);
Это отредактированная строка 31 из первого сниппета кода. Теперь vecRight вектор умножается на отрицательное рандомное значение, а не положительное. Сначала попробуй так.
 
Сообщения
78
Реакции
7
Xelson, уже пробовал как мог, в том числе вроде и так, но попробую и сейчас, отпишусь через пару минут
27 Фев 2024
Xelson, попробовал, гильзы летят влево-вверх
 

Вложения

Сообщения
857
Реакции
532
Помог
13 раз(а)
я тебе открою секрет - тебе придется еще учитывать код от третьего лица, т.к. сейчас ты пытаешься дописать код для первого
т.е. игроку от первого лица будет отсылаться один код, для третьего другого - иначе со стороны будет не менее забавная картинка (где-то из жопы будут гильзы лететь). Либо вообще другим не засылать ничего

я так понял в клиенте этим занимается спец.оффсет, который создает вылет гильзы, но опять же без учета направления (хардкодом)
 
Сообщения
212
Реакции
334
Помог
3 раз(а)
Ash Fever,
C:
vecVelocity[i] = -(vecVelocity[i] + vecForward[i] * 25.0 + vecUp[i] * random_float(100.0, 150.0) + vecRight[i] * random_float(50.0, 70.0));
а если так?
 
Сообщения
78
Реакции
7
Xelson, попробовал, гильзы вообще не вылетают.

BalbuR, разве другие игроки видят гильзы (кроме болтовок и вроде шотганов)? Да, сам подумал что полет в определенную предопределен заранее, но тот же p90 стреляет вверх и слегка вправо, более того при смене руки гильзы как-то зеркалятся, да и наличие у SISA на сервере отлично настроенных гильз дает понять, что как-то это настроить можно
 
Сообщения
857
Реакции
532
Помог
13 раз(а)
Xelson, попробовал, гильзы вообще не вылетают.

BalbuR, разве другие игроки видят гильзы (кроме болтовок и вроде шотганов)? Да, сам подумал что полет в определенную предопределен заранее, но тот же p90 стреляет вверх и слегка вправо, более того при смене руки гильзы как-то зеркалятся, да и наличие у SISA на сервере отлично настроенных гильз дает понять, что как-то это настроить можно
если захотеть можно в космос полететь
зеркалятся только через оффсет, иначе придется ловить квар у клиента и вручную выставлять координаты и направление (и снова привет третьему лицу ✌)
28 Фев 2024
как по мне это заморочка ради заморочки ИМХО
если уж больно надо, то пожалуйста, но это бесконечная трата времени ни за что
 
Сообщения
678
Реакции
579
Предупреждения
8
Помог
9 раз(а)
Где-то в 2019 году делал на заказ систему Weapon Maker его задача была облегчить написание пушек а эти пушки были не только с кастом моделей и дамаг а большими возможностями.
С этой проблемой я тоже сталкивался и благополучно решил. Конечно за спасибо не могу поделиться к сожалению.
Как сказали тут не стоит заморачиваться за эту мелочь.
 
Сообщения
78
Реакции
7
BalbuR, можешь подсказать что за оффсет или квар? Или хотя бы где я могу их найти? Знаю, что это заморочка, которую почти никто бы не заметил, но хочется сделать все по-людски.
28 Фев 2024
Vaqtincha, можешь тогда намекнуть в каком направлении копать?
 
Сообщения
78
Реакции
7
Мне удалось найти решение. По классике, оно мегапростое, но я пока не прошерстил остальные ХЛ форумы так и не думал даже об этом.
В том же отрывке кода что выше нужно в разы увеличить значение поправки к вектору правой плоскости в строке получения вектора ускорения.
К примеру тут:

vecVelocity = vecVelocity + vecForward * 1.5 + vecUp * random_float(80.0, 100.0) + vecRight * random_float(70.0, 90.0);

На:

vecVelocity = vecVelocity + vecForward * 1.5 + vecUp * random_float(80.0, 100.0) + vecRight * random_float(170.0, 190.0);
3 Мар 2024
После увеличения поправки к vecRight гильзы могут начать летать вправо немного криво, а место их появления может слегка измениться, это все можно поправить, корректируя origin и velocity.
3 Мар 2024
Теперь я заметил, что при выборе левой руки траектория гильз не зеркалится, а как-то криво копирует зеркальное отражение траектории оригинального оружия, на котором написан плагин. Можно ли это как-то исправить?
 
Сообщения
857
Реакции
532
Помог
13 раз(а)
Только спрашивать клиента какой у него квар сейчас. Но есть шанс что на клиенте стоит протектор, который будет блочить получение значения, но там малая вероятность такого исхода.

Вопрос только как часто ты его будешь опрашивать

3 Мар 2024
Соответственно от квара будешь менять направление для vecRight на противоположное
 
Сообщения
11
Реакции
2
В открытом доступе данную информацию не найти. Помнится мне, как-то давно я тоже хотел сделать по-людски. Было потрачено много времени и сил (перелопатил множество оффсетов + открытые исходники оружий) в попытках решить данный вопрос, но решение найти так и не удалось.

Не думаю, что с решением кто-либо поделится.
5 Мар 2024
точню помню, как уже потом выяснилось, оффсетов позволяющих выяснить в какой руке находится оружие не существует.

попробуй написать SISA напрямую, возможно, он поделится решением.
 
Сообщения
1,560
Реакции
1,573
Помог
2 раз(а)
попробуй написать SISA напрямую, возможно, он поделится решением.
Уже бессмысленно к сожалению
Сиса давно уже утошёл от своих дел и находится в отставке сейчас
Хостинг даже его в конце января закрылся
 
Сообщения
313
Реакции
21
Помог
7 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Сообщения
11
Реакции
2
MayroN, Да, хостинг закрыт, но сервера его живут. Переодически на свои сервера вносит что-то новое.
 
Сообщения
78
Реакции
7
Спасибо за ответы, покопался еще в коде, заметил, что гильзы перестают корректно зеркалиться только если указать значение vecRight настолько большое, что гильзы начинают лететь вправо, в исходниках оригинального оружия видно что в зависимости от ведущей руки меняется только RightScale с плюса на минус, а он влияет только на место вылета гильзы. Было бы идеально, если бы можно было выловить значение RightScale оригинального оружия и в зависимости от его значения прописать координаты вылета. Ловить вечно значение квара у клиента - мегакостыль.
 

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

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