да как бы всё ок только пока нету возможности поиском пробижаться по всей библиотеке в поиске кода прицела. ну я думаю он на клиенте а раз на клиенте, то тут небольшой ньюанс. Дядя Миша ты ведь вроде уже эксперементировал с прицелом в ксаше, вот скажи с ним получится такое?: еси скорость такая игрока юзается такой спрайт еси другая юзается другой спрайт
итак нашел где код прицела он оказывается в ammo.cpp (афигеть куда его засунули) и нашел код где он меняется:
if ( gHUD.m_iFOV >= 90 )
{ // normal crosshairs
if (fOnTarget && m_pWeapon->hAutoaim)
SetCrosshair(m_pWeapon->hAutoaim, m_pWeapon->rcAutoaim, 255, 255, 255);
else
SetCrosshair(m_pWeapon->hCrosshair, m_pWeapon->rcCrosshair, 255, 255, 255);
}
else
{ // zoomed crosshairs
if (fOnTarget && m_pWeapon->hZoomedAutoaim)
SetCrosshair(m_pWeapon->hZoomedAutoaim, m_pWeapon->rcZoomedAutoaim, 255, 255, 255);
else
SetCrosshair(m_pWeapon->hZoomedCrosshair, m_pWeapon->rcZoomedCrosshair, 255, 255, 255);
}
значит мне нужно прописать еще один Crosshair и топать на сервер а на сервере прописывать что типо m_fInZoom = 1; который будет юзать мой прицел при разной speed. Или можно как то на клиенте if (speed ) написать?
да не, на сервер топать необязательно.
Достаточно расшарить через глобальную переменную clientdata->velocity
например из функции HUD_TxferLocalOverrides.
Ну и там сделать sqrt( DotProduct( velocity, velocity )) и получить текущую скорость игрока.
И скорость эта будет обычно равна трём значениям: 320 - когда бежишь, 160 когда идешь и 0 когда стоишь. Ну и вот опираясь на эти значения и надо делать условия.
TrashBot тебе примерно объяснили, как найти скорость игрока на клиенте. В HUD_Redraw рисуй четыре полоски через FillRGBA и меняй их координаты в зависимости от скорости. Вот тут тутор по динамическому разбросу пуль. Правда он для HL2, но адаптировать под ХЛ думаю можно, функция GetDynamicSpread это то, что нужно. Если там есть специфичные для сорсСДК функции, то их можно заменить на родные из ХЛ.
Дядя Миша мне и самомму такой прицел нужен, только не сейчас, а как-нибудь попозже. Может сегодня попробую написать, а может потом...
Добавлено 23-09-2011 в 15:40:
Я думаю, лучше данные о размере прицела посылать с сервера, чтобы учитывать не только скорость игрока и то, сидит он или стоит, но ещё и вектор разброса оружия, который будем рассчитывать на сервере в зависимости от количества выстрелов.
Добавлено 23-09-2011 в 15:46:
А передавать это число можно через fuser4 или iuser4, они вроде как ни под что не заюзаны.
cross_size += gHUD.m_iCSize; // gHUD.m_iCSize - переменная, значение которой я увеличиваю при выстреле. у меня в эвенте.
6
7
if (gHUD.m_iCSize > 0.0f)
8
gHUD.m_iCSize -= (gHUD.m_flTimeDelta * CVAR_GET_FLOAT( "hud_crosshair_speed" )); // возвращаем прицелу изначальный размер. hud_crosshair_speed сами подбирайте, какая скорость больше нравится.
9
10
if (gHUD.m_iCSize > 32.0f)
11
gHUD.m_iCSize = 32.0f; // ограничиваем переменную
12
13
if (gHUD.m_iCSize < 0.0f)
14
gHUD.m_iCSize = 0.0f; // ограничиваем переменную
15
16
if( CVAR_GET_FLOAT( "hud_crosshair" ) ) // рисуем, если hud_crosshair 1
17
{
18
// левая полоска
19
iHeight = 1;
20
iWidth = -8;
21
x = (ScreenWidth/2)-cross_size+1;
22
y = (ScreenHeight/2);
23
FillRGBA(x, y, iWidth, iHeight, r, g, b, 255);
24
25
// правая полоска
26
iHeight = 1;
27
iWidth = 8;
28
x = (ScreenWidth/2)+cross_size;
29
y = (ScreenHeight/2);
30
FillRGBA(x, y, iWidth, iHeight, r, g, b, 255);
31
32
// верхняя полоска
33
iHeight = -8;
34
iWidth = 1;
35
x = (ScreenWidth/2);
36
y = (ScreenHeight/2)-cross_size+1;
37
FillRGBA(x, y, iWidth, iHeight, r, g, b, 255);
38
39
// нижняя полоска
40
iHeight = 8;
41
iWidth = 1;
42
x = (ScreenWidth/2);
43
y = (ScreenHeight/2)+cross_size;
44
FillRGBA(x, y, iWidth, iHeight, r, g, b, 255);
45
}
Основано на коде из паранойи.
Банальный клиентский прицел, но без изменения размера при передвижении.
Прибавляю единицу в подобном (cross_size+1) месте, для вида, можете её убрать и посмотреть что будет. На точность прицела почти не влияет.
И кстати! Никто не отменял вариант "посмотреть в арранжмоде". Там он больше на ксовский похож. Размер меняется при движении, прыжке, присядке, стрельбе.