@@ -523,62 +523,61 @@ class SequenceMap {
523523
524524extern std::map<sdk::C_BaseAttributableItem*, int > g_weapon_to_orgindex;
525525
526- static auto do_sequence_remapping (sdk::CRecvProxyData* data, sdk::C_BaseViewModel* entity ) -> void
526+ static auto do_sequence_remapping (sdk::C_BaseViewModel* entity, int nSequence ) -> int
527527{
528528 const auto owner = get_entity_from_handle<sdk::C_BasePlayer>(entity->GetOwner ());
529529
530530 if (!(owner && owner->IsPlayer () && static_cast <sdk::C_BasePlayer*>(owner)->GetLifeState () == sdk::LifeState::ALIVE))
531- return ;
531+ return nSequence ;
532532
533533 const auto view_model_weapon = get_entity_from_handle<sdk::C_BaseAttributableItem>(entity->GetWeapon ());
534534
535535 if (!view_model_weapon)
536- return ;
536+ return nSequence ;
537537
538538 const auto weapon_info = game_data::get_weapon_info (view_model_weapon->GetItemDefinitionIndex ());
539539
540540 if (!weapon_info)
541- return ;
541+ return nSequence ;
542542
543543 const auto definition_index = view_model_weapon->GetItemDefinitionIndex ();
544544
545545 if (!is_knife (definition_index))
546- return ;
546+ return nSequence ;
547547
548548 sdk::player_info_t player_info;
549549 if (!g_engine->GetPlayerInfo (owner->GetIndex (), &player_info))
550- return ;
550+ return nSequence ;
551551
552552 const auto active_conf = g_config.get_by_definition_index (player_info.userid , WEAPON_KNIFE);
553553 if (nullptr == active_conf || 0 == active_conf->definition_override_index )
554- return ;
554+ return nSequence ;
555555
556- auto & sequence = data->m_Value .m_Int ;
557556 int orgIndex = definition_index;
558557 auto it = g_weapon_to_orgindex.find (view_model_weapon);
559558 if (it != g_weapon_to_orgindex.end ())
560559 orgIndex = it->second ;
561- sequence = g_SequenceMap.MapSequence (orgIndex, sequence , active_conf->definition_override_index );
560+ return g_SequenceMap.MapSequence (orgIndex, nSequence , active_conf->definition_override_index );
562561}
563562
564- // Replacement function that will be called when the view model animation sequence changes.
565- auto __cdecl hooks::sequence_proxy_fn (const sdk::CRecvProxyData* proxy_data_const, void * entity, void * output) -> void
566- {
567- const auto view_model = static_cast <sdk::C_BaseViewModel*>(entity);
568563
569- // Ensure our other dynamic object hooks are in place.
570- // Must do this from a game thread.
571- ensure_dynamic_hooks ();
564+ static std::map<void *,vmt_multi_hook *> C_BaseViewModel_SetSequence_hooks;
572565
573- static auto original_fn = g_sequence_hook->get_original_function ();
566+ auto __fastcall hooks::C_BaseViewModel_SetSequence::hooked (sdk::C_BaseViewModel* This, void * Edx, int nSequence) -> void
567+ {
568+ auto &pHook = C_BaseViewModel_SetSequence_hooks[*(void **)This];
569+ pHook->get_original_function <void (__fastcall *)(sdk::C_BaseViewModel*, void *, int )>(219 )(This, Edx, do_sequence_remapping (This, nSequence));
570+ }
574571
575- // Remove the constness from the proxy data allowing us to make changes.
576- const auto proxy_data = const_cast <sdk::CRecvProxyData*>(proxy_data_const);
572+ void hook_C_BaseViewModel_SetSequence (sdk::C_BaseViewModel* thisptr) {
577573
578- do_sequence_remapping (proxy_data, view_model) ;
574+ if (C_BaseViewModel_SetSequence_hooks. contains (*( void **)thisptr)) return ;
579575
580- // Call the original function with our edited data.
581- original_fn (proxy_data_const, entity, output);
576+ vmt_multi_hook* pHook = new vmt_multi_hook ();
577+ if (pHook->initialize_and_hook_instance (thisptr)) {
578+ pHook->hook_function (&hooks::C_BaseViewModel_SetSequence::hooked, 219 );
579+ C_BaseViewModel_SetSequence_hooks[*(void **)thisptr] = pHook;
580+ }
582581}
583582
584583bool get_fixup_view_model_index (sdk::C_BaseViewModel* view_model, int & outNewIndex, int & outOrgIndex);
@@ -601,6 +600,8 @@ auto __cdecl hooks::weapon_proxy_fn(const sdk::CRecvProxyData* proxy_data_const,
601600 const auto view_model = static_cast <sdk::C_BaseViewModel*>(entity);
602601
603602 ensure_dynamic_hooks ();
603+ hook_C_BaseViewModel_SetSequence (view_model);
604+
604605 static auto original_fn = g_weapon_hook->get_original_function ();
605606
606607 original_fn (proxy_data_const, entity, output);
0 commit comments