diff --git a/include/reclasses/C_BasePlayer.hpp b/include/reclasses/C_BasePlayer.hpp index 6d78857d..6f742cf6 100644 --- a/include/reclasses/C_BasePlayer.hpp +++ b/include/reclasses/C_BasePlayer.hpp @@ -17,5 +17,15 @@ public: typedef Vector (*fn_t)(IClientEntity *); return vfunc(self, offsets::PlatformOffset(194, offsets::undefined, 194), 0)(self); } + inline static Vector &GetEyeAngles(IClientEntity *self) + { + typedef Vector &(*fn_t)(IClientEntity *); + return vfunc(self, offsets::PlatformOffset(195, offsets::undefined, 195), 0)(self); + } + inline static Vector &GetLocalEyeAngles(IClientEntity *self) + { + typedef Vector &(*fn_t)(IClientEntity *); + return vfunc(self, offsets::PlatformOffset(196, offsets::undefined, 196), 0)(self); + } }; } // namespace re diff --git a/src/nospread.cpp b/src/nospread.cpp index d3c0e640..38118584 100644 --- a/src/nospread.cpp +++ b/src/nospread.cpp @@ -132,18 +132,19 @@ void CreateMove() { case CL_CLASS(CTFSyringeGun): { + if (g_pLocalPlayer->v_OrigViewangles == current_user_cmd->viewangles) + g_pLocalPlayer->bUseSilentAngles = true; float spread = 1.5f; current_user_cmd->viewangles.x -= RandomFloat(-spread, spread); current_user_cmd->viewangles.y -= RandomFloat(-spread, spread); fClampAngle(current_user_cmd->viewangles); - g_pLocalPlayer->bUseSilentAngles = true; break; } case CL_CLASS(CTFCompoundBow): { - Vector view = current_user_cmd->viewangles; - if (g_pLocalPlayer->bUseSilentAngles) - view = g_pLocalPlayer->v_OrigViewangles; + Vector view = re::C_BasePlayer::GetLocalEyeAngles(RAW_ENT(LOCAL_E)); + if (g_pLocalPlayer->v_OrigViewangles == current_user_cmd->viewangles) + g_pLocalPlayer->bUseSilentAngles = true; Vector spread; Vector src; @@ -152,20 +153,18 @@ void CreateMove() spread -= view; current_user_cmd->viewangles -= spread; - g_pLocalPlayer->bUseSilentAngles = true; fClampAngle(current_user_cmd->viewangles); break; } default: - Vector view = current_user_cmd->viewangles; - if (g_pLocalPlayer->bUseSilentAngles) - view = g_pLocalPlayer->v_OrigViewangles; + Vector view = re::C_BasePlayer::GetLocalEyeAngles(RAW_ENT(LOCAL_E)); + if (g_pLocalPlayer->v_OrigViewangles == current_user_cmd->viewangles) + g_pLocalPlayer->bUseSilentAngles = true; Vector spread = re::C_TFWeaponBase::GetSpreadAngles(RAW_ENT(LOCAL_W)); spread -= view; current_user_cmd->viewangles -= spread; - g_pLocalPlayer->bUseSilentAngles = true; fClampAngle(current_user_cmd->viewangles); break; } @@ -514,6 +513,7 @@ bool DispatchUserMessage(bf_read *buf, int type) last_was_player_perf = true; should_call_original = false; bad_mantissa = true; + no_spread_synced = NOT_SYNCED; return should_call_original; } @@ -892,6 +892,14 @@ static InitRoutine init_bulletnospread([]() { // Register Event callbacks EC::Register(EC::CreateMove, CreateMove2, "nospread_createmove2"); EC::Register(EC::CreateMoveWarp, CreateMove2, "nospread_createmove2w"); + + bullet.installChangeCallback([](settings::VariableBase &, bool after) { + if (!after) + { + is_syncing = false; + no_spread_synced = NOT_SYNCED; + } + }); #if ENABLE_VISUALS EC::Register( EC::Draw,