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

Сообщения
21
Реакции
2
Всех приветствую! Решил продолжить копаться в коде КОРДа на оружие, дабы на его основе сделать себе приличный арсенал. Задумка в том чтобы сначала сделать первый эталонный образец оружия, отсекая лишнее, упрощая сложное (к примеру, прописать квары на отдачу, вместо поиска ее формул каждый раз в 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
Сообщения
203
Реакции
324
Помог
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 вектор умножается на отрицательное рандомное значение, а не положительное. Сначала попробуй так.
 
Сообщения
21
Реакции
2
Xelson, уже пробовал как мог, в том числе вроде и так, но попробую и сейчас, отпишусь через пару минут
27 Фев 2024
Xelson, попробовал, гильзы летят влево-вверх
 

Вложения

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

я так понял в клиенте этим занимается спец.оффсет, который создает вылет гильзы, но опять же без учета направления (хардкодом)
 
Сообщения
203
Реакции
324
Помог
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));
а если так?
 
Сообщения
21
Реакции
2
Xelson, попробовал, гильзы вообще не вылетают.

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

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

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
Теперь я заметил, что при выборе левой руки траектория гильз не зеркалится, а как-то криво копирует зеркальное отражение траектории оригинального оружия, на котором написан плагин. Можно ли это как-то исправить?
 
Сообщения
705
Реакции
475
Помог
10 раз(а)
Только спрашивать клиента какой у него квар сейчас. Но есть шанс что на клиенте стоит протектор, который будет блочить получение значения, но там малая вероятность такого исхода.

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

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

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

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

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

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