Skip to content

Commit 6f3a74a

Browse files
authored
Merge pull request #230 from FozeSt/fixes
Added interion of weapons from SWM 3.0 and fix crash on CPHCall::check
2 parents 2c9d8de + b7f0d7e commit 6f3a74a

File tree

5 files changed

+110
-15
lines changed

5 files changed

+110
-15
lines changed

src/xrGame/HudItem.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ class CHudItem : public CHUDState
140140
virtual void on_b_hud_detach();
141141
IC BOOL HudInertionEnabled() const { return m_huditem_flags.test(fl_inertion_enable); }
142142
IC BOOL HudInertionAllowed() const { return m_huditem_flags.test(fl_inertion_allow); }
143+
virtual float GetInertionFactor() { return 1.f; }; //--#SM+#--
144+
virtual float GetInertionPowerFactor() { return 1.f; }; //--#SM+#--
143145
virtual void render_hud_mode(){};
144146
virtual bool need_renderable() { return true; };
145147
virtual void render_item_3d_ui() {}

src/xrGame/PHCommander.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ CPHCall::~CPHCall()
2222
bool CPHCall::obsolete() { return m_action->obsolete() || m_condition->obsolete(); }
2323
void CPHCall::check()
2424
{
25-
if (m_condition->is_true() && m_action)
25+
if (m_condition && m_condition->is_true() && m_action)
2626
m_action->run();
2727
}
2828

src/xrGame/Weapon.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1342,7 +1342,8 @@ void CWeapon::OnZoomIn()
13421342
else
13431343
m_zoom_params.m_fCurrentZoomFactor = CurrentZoomFactor();
13441344

1345-
EnableHudInertion(FALSE);
1345+
// Отключаем инерцию (Заменено GetInertionFactor())
1346+
// EnableHudInertion(FALSE);
13461347

13471348
if (m_zoom_params.m_bZoomDofEnabled && !IsScopeAttached())
13481349
GamePersistent().SetEffectorDOF(m_zoom_params.m_ZoomDof);
@@ -1372,7 +1373,9 @@ void CWeapon::OnZoomOut()
13721373
m_zoom_params.m_bIsZoomModeNow = false;
13731374
m_fRTZoomFactor = GetZoomFactor(); // store current
13741375
m_zoom_params.m_fCurrentZoomFactor = g_fov;
1375-
EnableHudInertion(TRUE);
1376+
1377+
// Включаем инерцию (также заменено GetInertionFactor())
1378+
// EnableHudInertion (TRUE);
13761379

13771380
GamePersistent().RestoreEffectorDOF();
13781381

src/xrGame/player_hud.cpp

Lines changed: 89 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "stdafx.h"
1+
#include "stdafx.h"
22
#include "player_hud.h"
33
#include "HudItem.h"
44
#include "ui_base.h"
@@ -14,6 +14,17 @@ player_hud* g_player_hud = nullptr;
1414
Fvector _ancor_pos;
1515
Fvector _wpn_root_pos;
1616

17+
// clang-format off
18+
static const float PITCH_OFFSET_R = 0.017f; // Насколько сильно ствол смещается вбок (влево) при вертикальных поворотах камеры --#SM+#--
19+
static const float PITCH_OFFSET_N = 0.012f; // Насколько сильно ствол поднимается\опускается при вертикальных поворотах камеры --#SM+#--
20+
static const float PITCH_OFFSET_D = 0.02f; // Насколько сильно ствол приближается\отдаляется при вертикальных поворотах камеры --#SM+#--
21+
static const float PITCH_LOW_LIMIT = -PI; // Минимальное значение pitch при использовании совместно с PITCH_OFFSET_N --#SM+#--
22+
static const float ORIGIN_OFFSET = -0.05f; // Фактор влияния инерции на положение ствола (чем меньше, тем маштабней инерция) --#SM+#--
23+
static const float ORIGIN_OFFSET_AIM = -0.03f; // (Для прицеливания) --#SM+#--
24+
static const float TENDTO_SPEED = 5.f; // Скорость нормализации положения ствола --#SM+#--
25+
static const float TENDTO_SPEED_AIM = 8.f; // (Для прицеливания) --#SM+#--
26+
// clang-format on
27+
1728
float CalcMotionSpeed(const shared_str& anim_name)
1829
{
1930
if (!IsGameTypeSingle() && (anim_name == "anm_show" || anim_name == "anm_hide"))
@@ -281,6 +292,19 @@ void hud_item_measures::load(const shared_str& sect_name, IKinematics* K)
281292
sect_name.c_str());
282293

283294
m_prop_flags.set(e_16x9_mode_now, is_16x9);
295+
296+
//Загрузка параметров инерции --#SM+# Begin--
297+
m_inertion_params.m_pitch_offset_r = READ_IF_EXISTS(pSettings, r_float, sect_name, "pitch_offset_right", PITCH_OFFSET_R);
298+
m_inertion_params.m_pitch_offset_n = READ_IF_EXISTS(pSettings, r_float, sect_name, "pitch_offset_up", PITCH_OFFSET_N);
299+
m_inertion_params.m_pitch_offset_d = READ_IF_EXISTS(pSettings, r_float, sect_name, "pitch_offset_forward", PITCH_OFFSET_D);
300+
m_inertion_params.m_pitch_low_limit = READ_IF_EXISTS(pSettings, r_float, sect_name, "pitch_offset_up_low_limit", PITCH_LOW_LIMIT);
301+
302+
m_inertion_params.m_origin_offset = READ_IF_EXISTS(pSettings, r_float, sect_name, "inertion_origin_offset", ORIGIN_OFFSET);
303+
m_inertion_params.m_origin_offset_aim = READ_IF_EXISTS(pSettings, r_float, sect_name, "inertion_origin_aim_offset", ORIGIN_OFFSET_AIM);
304+
m_inertion_params.m_tendto_speed = READ_IF_EXISTS(pSettings, r_float, sect_name, "inertion_tendto_speed", TENDTO_SPEED);
305+
m_inertion_params.m_tendto_speed_aim = READ_IF_EXISTS(pSettings, r_float, sect_name, "inertion_tendto_aim_speed", TENDTO_SPEED_AIM);
306+
//--#SM+# End--
307+
284308
}
285309

286310
attachable_hud_item::~attachable_hud_item()
@@ -598,22 +622,43 @@ void player_hud::update_additional(Fmatrix& trans)
598622
m_attached_items[1]->update_hud_additional(trans);
599623
}
600624

601-
static const float PITCH_OFFSET_R = 0.017f;
602-
static const float PITCH_OFFSET_N = 0.012f;
603-
static const float PITCH_OFFSET_D = 0.02f;
604-
static const float ORIGIN_OFFSET = -0.05f;
605-
static const float TENDTO_SPEED = 5.f;
606-
607625
void player_hud::update_inertion(Fmatrix& trans)
608626
{
609627
if (inertion_allowed())
610628
{
629+
attachable_hud_item* pMainHud = m_attached_items[0];
630+
611631
Fmatrix xform;
612632
Fvector& origin = trans.c;
613633
xform = trans;
614634

615635
static Fvector st_last_dir = {0, 0, 0};
616636

637+
// load params
638+
hud_item_measures::inertion_params inertion_data;
639+
if (pMainHud != NULL)
640+
{ // Загружаем параметры инерции из основного худа
641+
inertion_data.m_pitch_offset_r = pMainHud->m_measures.m_inertion_params.m_pitch_offset_r;
642+
inertion_data.m_pitch_offset_n = pMainHud->m_measures.m_inertion_params.m_pitch_offset_n;
643+
inertion_data.m_pitch_offset_d = pMainHud->m_measures.m_inertion_params.m_pitch_offset_d;
644+
inertion_data.m_pitch_low_limit = pMainHud->m_measures.m_inertion_params.m_pitch_low_limit;
645+
inertion_data.m_origin_offset = pMainHud->m_measures.m_inertion_params.m_origin_offset;
646+
inertion_data.m_origin_offset_aim = pMainHud->m_measures.m_inertion_params.m_origin_offset_aim;
647+
inertion_data.m_tendto_speed = pMainHud->m_measures.m_inertion_params.m_tendto_speed;
648+
inertion_data.m_tendto_speed_aim = pMainHud->m_measures.m_inertion_params.m_tendto_speed_aim;
649+
}
650+
else
651+
{ // Загружаем дефолтные параметры инерции
652+
inertion_data.m_pitch_offset_r = PITCH_OFFSET_R;
653+
inertion_data.m_pitch_offset_n = PITCH_OFFSET_N;
654+
inertion_data.m_pitch_offset_d = PITCH_OFFSET_D;
655+
inertion_data.m_pitch_low_limit = PITCH_LOW_LIMIT;
656+
inertion_data.m_origin_offset = ORIGIN_OFFSET;
657+
inertion_data.m_origin_offset_aim = ORIGIN_OFFSET_AIM;
658+
inertion_data.m_tendto_speed = TENDTO_SPEED;
659+
inertion_data.m_tendto_speed_aim = TENDTO_SPEED_AIM;
660+
}
661+
617662
// calc difference
618663
Fvector diff_dir;
619664
diff_dir.sub(xform.k, st_last_dir);
@@ -631,14 +676,46 @@ void player_hud::update_inertion(Fmatrix& trans)
631676
}
632677

633678
// tend to forward
634-
st_last_dir.mad(diff_dir, TENDTO_SPEED * Device.fTimeDelta);
635-
origin.mad(diff_dir, ORIGIN_OFFSET);
679+
float _tendto_speed, _origin_offset;
680+
if (pMainHud != NULL && pMainHud->m_parent_hud_item->GetCurrentHudOffsetIdx() > 0)
681+
{ // Худ в режиме "Прицеливание"
682+
float factor = pMainHud->m_parent_hud_item->GetInertionFactor();
683+
_tendto_speed = inertion_data.m_tendto_speed_aim - (inertion_data.m_tendto_speed_aim - inertion_data.m_tendto_speed) * factor;
684+
_origin_offset =
685+
inertion_data.m_origin_offset_aim - (inertion_data.m_origin_offset_aim - inertion_data.m_origin_offset) * factor;
686+
}
687+
else
688+
{ // Худ в режиме "От бедра"
689+
_tendto_speed = inertion_data.m_tendto_speed;
690+
_origin_offset = inertion_data.m_origin_offset;
691+
}
692+
693+
// Фактор силы инерции
694+
if (pMainHud != NULL)
695+
{
696+
float power_factor = pMainHud->m_parent_hud_item->GetInertionPowerFactor();
697+
_tendto_speed *= power_factor;
698+
_origin_offset *= power_factor;
699+
}
700+
701+
st_last_dir.mad(diff_dir, _tendto_speed * Device.fTimeDelta);
702+
origin.mad(diff_dir, _origin_offset);
636703

637704
// pitch compensation
638705
float pitch = angle_normalize_signed(xform.k.getP());
639-
origin.mad(xform.k, -pitch * PITCH_OFFSET_D);
640-
origin.mad(xform.i, -pitch * PITCH_OFFSET_R);
641-
origin.mad(xform.j, -pitch * PITCH_OFFSET_N);
706+
707+
if (pMainHud != NULL)
708+
pitch *= pMainHud->m_parent_hud_item->GetInertionFactor();
709+
710+
// Отдаление\приближение
711+
origin.mad(xform.k, -pitch * inertion_data.m_pitch_offset_d);
712+
713+
// Сдвиг в противоположную часть экрана
714+
origin.mad(xform.i, -pitch * inertion_data.m_pitch_offset_r);
715+
716+
// Подьём\опускание
717+
clamp(pitch, inertion_data.m_pitch_low_limit, PI);
718+
origin.mad(xform.j, -pitch * inertion_data.m_pitch_offset_n);
642719
}
643720
}
644721

src/xrGame/player_hud.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,19 @@ struct hud_item_measures
5555
Fvector m_hands_attach[2]; // pos,rot
5656

5757
void load(const shared_str& sect_name, IKinematics* K);
58+
59+
struct inertion_params
60+
{
61+
float m_pitch_offset_r;
62+
float m_pitch_offset_n;
63+
float m_pitch_offset_d;
64+
float m_pitch_low_limit;
65+
float m_origin_offset;
66+
float m_origin_offset_aim;
67+
float m_tendto_speed;
68+
float m_tendto_speed_aim;
69+
};
70+
inertion_params m_inertion_params; //--#SM+#--
5871
};
5972

6073
struct attachable_hud_item

0 commit comments

Comments
 (0)