Участник
Пользователь
- Сообщения
- 78
- Реакции
- 7
Всех приветствую! Решил продолжить копаться в коде КОРДа на оружие, дабы на его основе сделать себе приличный арсенал. Задумка в том чтобы сначала сделать первый эталонный образец оружия, отсекая лишнее, упрощая сложное (к примеру, прописать квары на отдачу, вместо поиска ее формул каждый раз в 1500 строках кода), оптимизируя старое по возможности. И на основе перекопанного кода продолжить в облегченном темпе делать другое оружие. Первым образцом по злой иронии оказался silver infinity, казалось бы обычный пистолет, но так как код переписывался с пп, я столкнулся с некоторыми багами, но это была мелочь, ВЕДЬ ЗАТВОР У ПИСТОЛЕТА НАХОДИТСЯ СПРАВА, а следовательно и гильзы летят ВПРАВО, а у всех оригинальных пистолетов гильзы летят влево. И тут пошли приколы, ни в русском, ни в английском сегменте интернета я не нашел ответа, искал на гитхабе в исходниках regamedll и также не нашел ничего. Единственная надежда - вы.
Отрывок Кордовского кода вылета гильз:
В чем суть:
vecOrigin это координаты точки появления гильзы, вычисляются, как понимаю, на векторе проходящем из глаз в сторону нулевых координат модели оружия с вносимыми нами корректировками, на сторону полета не влияют.
vecVelocity - задает скорость полета гильзы, при нулях гильзы почти сразу падают вниз, при негативных значениях гильзы незаметно падают с левого бока игрока. В любом случае это влияет на скорость и дальность, а не на направление полета гильзы.
vecAngle - это точка куда смотрит игрок, определяет угол полета гильзы, траектория должна же логично меняться в зависимости от того куда по вертикали смотрит игрок, при игре со значениями временами удавалось заставить гильзы лететь вправо, если смотреть под определенным углом в определенную сторону, но это стоило сломанной напрочь траектории полета гильз в 90 процентов остальных случаев.
Все остальные прописанные в мессаге моменты на полет гильзы не влияют.
Крупицы знаний, откопанные в интернете:
1) Место вылета гильз можно указать в v модели через кость и attachment с координатами в qc файле, однако, это будет ТОЧКА ВЫЛЕТА, а не ВЕКТОР ПОЛЕТА гильзы, более того вышеуказанный код не учитывает эти координаты, координаты вылета гильз прописываются непосредственно в самом отрывке кода.
2) Нашел старый альтернативный вариант прописывания гильз:
Отличие в том, что траектория гильз тут берется у оружия с которого переписывается плагин без учета attachment координат и прочего, то есть этот отрывок бесполезен.
3) Покопался в исходниках regamedll нашел такой же MSG с такими же расчетами координат как у КОРДа:
Координаты VecLeft ни на что не влияют)))
Я просто иссушен тремя днями безрезультатных поисков, и я бы давно забил, если бы понимал что это невозможно. Но это не так! На сервере у SISA гильзы того же пистолета прописаны ИДЕАЛЬНО, более того даже на парной версии пистолетов в зависимости от анимаций гильзы летят идеально влево, вверх, вниз. Если кто поможет буду дико рад.
Отрывок Кордовского кода вылета гильз:
Код:
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());
}
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 гильзы того же пистолета прописаны ИДЕАЛЬНО, более того даже на парной версии пистолетов в зависимости от анимаций гильзы летят идеально влево, вверх, вниз. Если кто поможет буду дико рад.