diff --git a/BunnymodXT/modules/ClientDLL.cpp b/BunnymodXT/modules/ClientDLL.cpp index 4d33a99a..d73b8647 100644 --- a/BunnymodXT/modules/ClientDLL.cpp +++ b/BunnymodXT/modules/ClientDLL.cpp @@ -1505,6 +1505,10 @@ HOOK_DEF_1(ClientDLL, void, __cdecl, V_CalcRefdef, ref_params_t*, pparams) pparams->viewangles[1] = hwDLL.RenderYawOverrides[hwDLL.RenderYawOverrideIndex - 1]; } + if (hwDLL.RenderPitchOverrideIndex != 0 && hwDLL.RenderPitchOverrideIndex <= hwDLL.RenderPitchOverrides.size()) { + pparams->viewangles[0] = hwDLL.RenderPitchOverrides[hwDLL.RenderPitchOverrideIndex - 1]; + } + float forward_offset = CVars::bxt_viewmodel_ofs_forward.GetFloat(); float right_offset = CVars::bxt_viewmodel_ofs_right.GetFloat(); float up_offset = CVars::bxt_viewmodel_ofs_up.GetFloat(); diff --git a/BunnymodXT/modules/HwDLL.cpp b/BunnymodXT/modules/HwDLL.cpp index e5674483..5e3d08fa 100644 --- a/BunnymodXT/modules/HwDLL.cpp +++ b/BunnymodXT/modules/HwDLL.cpp @@ -814,6 +814,10 @@ void HwDLL::Clear() TargetYawOverrides.clear(); RenderYawOverrideIndex = 0; RenderYawOverrides.clear(); + PitchOverrideIndex = 0; + PitchOverrides.clear(); + RenderPitchOverrideIndex = 0; + RenderPitchOverrides.clear(); lastLoadedMap.clear(); isOverridingCamera = false; isOffsettingCamera = false; @@ -2557,6 +2561,10 @@ void HwDLL::ResetTASPlaybackState() TargetYawOverrides.clear(); RenderYawOverrideIndex = 0; RenderYawOverrides.clear(); + PitchOverrideIndex = 0; + PitchOverrides.clear(); + RenderPitchOverrideIndex = 0; + RenderPitchOverrides.clear(); } void HwDLL::StartTASPlayback() @@ -5607,6 +5615,8 @@ void HwDLL::SetTASEditorMode(TASEditorMode mode) } RenderYawOverrides.clear(); RenderYawOverrideIndex = 0; + RenderPitchOverrides.clear(); + RenderPitchOverrideIndex = 0; assert(movementFrameCounter >= 1); tas_editor_input.first_frame_counter_value = movementFrameCounter - 1; @@ -6135,6 +6145,25 @@ void HwDLL::InsertCommands() RenderYawOverrideIndex += 1; } + if (PitchOverrideIndex == PitchOverrides.size()) { + PitchOverrides.clear(); + PitchOverrideIndex = 0; + } + + if (PitchOverrides.empty()) { + StrafeState.PitchOverrideActive = false; + } else { + StrafeState.PitchOverride = PitchOverrides[PitchOverrideIndex++]; + StrafeState.PitchOverrideActive = true; + } + + if (RenderPitchOverrideIndex == RenderPitchOverrides.size()) { + RenderPitchOverrides.clear(); + RenderPitchOverrideIndex = 0; + } else { + RenderPitchOverrideIndex += 1; + } + f.ResetAutofuncs(); resulting_frame.SetPitch(p.Pitch); @@ -6555,6 +6584,14 @@ void HwDLL::InsertCommands() } else if (!f.RenderYawOverride.empty()) { RenderYawOverrides = f.RenderYawOverride; RenderYawOverrideIndex = 0; + } else if (!f.PitchOverride.empty()) { + PitchOverrides = f.PitchOverride; + StrafeState.PitchOverrideActive = true; + StrafeState.PitchOverride = PitchOverrides[0]; + PitchOverrideIndex = 1; + } else if (!f.RenderPitchOverride.empty()) { + RenderPitchOverrides = f.RenderPitchOverride; + RenderPitchOverrideIndex = 0; } currentFramebulk++; @@ -6587,6 +6624,8 @@ void HwDLL::InsertCommands() if (resetState == ResetState::NORMAL) { RenderYawOverrides.clear(); RenderYawOverrideIndex = 0; + RenderPitchOverrides.clear(); + RenderPitchOverrideIndex = 0; if (bxt_on_tas_playback_frame) { // We don't use the return value here because we stop anyway. diff --git a/BunnymodXT/modules/HwDLL.hpp b/BunnymodXT/modules/HwDLL.hpp index eefce738..0e57cfb8 100644 --- a/BunnymodXT/modules/HwDLL.hpp +++ b/BunnymodXT/modules/HwDLL.hpp @@ -670,10 +670,14 @@ class HwDLL : public IHookableNameFilterOrdered unsigned LoadingSeedCounter; size_t TargetYawOverrideIndex; std::vector TargetYawOverrides; + size_t PitchOverrideIndex; + std::vector PitchOverrides; float sensitivityToRestore = 0; public: size_t RenderYawOverrideIndex; std::vector RenderYawOverrides; + size_t RenderPitchOverrideIndex; + std::vector RenderPitchOverrides; bool ButtonsPresent; HLTAS::StrafeButtons Buttons; HLStrafe::CurrentState StrafeState;