From c5f2f8de2ee64d85adb067b0fbdf08e1529f7060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Krupi=C5=84ski?= Date: Tue, 1 Oct 2024 21:54:28 +0200 Subject: [PATCH] Refactor PlantedC4 class --- .../Visuals/OutlineGlow/OutlineGlowContext.h | 2 +- Source/GameClasses/PlantedC4.h | 67 +++++++++++++------ Source/GameDependencies/DepsInstances.h | 5 -- Source/GameDependencies/PlantedC4Deps.h | 2 - Source/HookDependencies/HookDependencies.h | 5 +- 5 files changed, 48 insertions(+), 33 deletions(-) diff --git a/Source/Features/Visuals/OutlineGlow/OutlineGlowContext.h b/Source/Features/Visuals/OutlineGlow/OutlineGlowContext.h index 012dc8fd3f1..33cf1cb31f9 100644 --- a/Source/Features/Visuals/OutlineGlow/OutlineGlowContext.h +++ b/Source/Features/Visuals/OutlineGlow/OutlineGlowContext.h @@ -52,7 +52,7 @@ class OutlineGlowContext { void applyGlowToPlantedBomb(auto& entity) const noexcept { - hookContext.template make().applyGlowToPlantedBomb(PlantedC4{PlantedC4Base{static_cast(&entity)}, hookContext}); + hookContext.template make().applyGlowToPlantedBomb(hookContext.template make>(static_cast(&entity))); } void applyGlowToHostage(auto& entity) const noexcept diff --git a/Source/GameClasses/PlantedC4.h b/Source/GameClasses/PlantedC4.h index 6dc61cca978..ee0dd1b0ef9 100644 --- a/Source/GameClasses/PlantedC4.h +++ b/Source/GameClasses/PlantedC4.h @@ -8,77 +8,103 @@ #include #include -struct PlantedC4Base { +template +class PlantedC4Context { +public: + PlantedC4Context(HookContext& hookContext, cs2::CPlantedC4* plantedC4) noexcept + : hookContext{hookContext} + , plantedC4{plantedC4} + { + } + [[nodiscard]] auto blowTime() const noexcept { - return PlantedC4Deps::instance().blowTime.of(thisptr); + return deps().blowTime.of(plantedC4); } [[nodiscard]] auto defuser() const noexcept { - return PlantedC4Deps::instance().defuser.of(thisptr); + return deps().defuser.of(plantedC4); } [[nodiscard]] auto defuseEndTime() const noexcept { - return PlantedC4Deps::instance().defuseEndTime.of(thisptr); + return deps().defuseEndTime.of(plantedC4); } [[nodiscard]] auto bombSite() const noexcept { - return PlantedC4Deps::instance().bombSite.of(thisptr); + return deps().bombSite.of(plantedC4); } [[nodiscard]] auto ticking() const noexcept { - return PlantedC4Deps::instance().ticking.of(thisptr); + return deps().ticking.of(plantedC4); + } + + [[nodiscard]] decltype(auto) baseEntity() const noexcept + { + return hookContext.template make(plantedC4); + } + + [[nodiscard]] decltype(auto) curtime() const noexcept + { + return hookContext.globalVars().curtime(); + } + +private: + [[nodiscard]] const auto& deps() const noexcept + { + return hookContext.gameDependencies().plantedC4Deps; } - cs2::CPlantedC4* thisptr; + HookContext& hookContext; + cs2::CPlantedC4* plantedC4; }; -template -struct PlantedC4 { - explicit PlantedC4(PlantedC4Base base, Dependencies& dependencies) noexcept - : base{base} - , dependencies{dependencies} +template > +class PlantedC4 { +public: + template + explicit PlantedC4(Args&&... args) noexcept + : context{std::forward(args)...} { } [[nodiscard]] decltype(auto) baseEntity() const noexcept { - return dependencies.template make(base.thisptr); + return context.baseEntity(); } [[nodiscard]] auto getTimeToExplosion() const noexcept { - return base.blowTime().toOptional() - dependencies.globalVars().curtime(); + return context.blowTime().toOptional() - context.curtime(); } [[nodiscard]] auto isTicking() const noexcept { - return base.ticking().toOptional(); + return context.ticking().toOptional(); } [[nodiscard]] bool isBeingDefused() const noexcept { - return base.defuser().valueOr(cs2::INVALID_EHANDLE_INDEX) != cs2::INVALID_EHANDLE_INDEX; + return context.defuser().valueOr(cs2::INVALID_EHANDLE_INDEX) != cs2::INVALID_EHANDLE_INDEX; } [[nodiscard]] auto canBeDefused() const noexcept { - return base.defuseEndTime().toOptional().lessThan(base.blowTime().toOptional()); + return context.defuseEndTime().toOptional().lessThan(context.blowTime().toOptional()); } [[nodiscard]] auto getTimeToDefuseEnd() const noexcept { - return base.defuseEndTime().toOptional() - dependencies.globalVars().curtime(); + return context.defuseEndTime().toOptional() - context.curtime(); } [[nodiscard]] const char* getBombSiteIconUrl() const noexcept { constexpr auto INVALID_BOMBSITE_INDEX = -1; - switch (base.bombSite().valueOr(INVALID_BOMBSITE_INDEX)) { + switch (context.bombSite().valueOr(INVALID_BOMBSITE_INDEX)) { case cs2::BOMBSITE_A_INDEX: return cs2::kBombSiteAIconUrl; case cs2::BOMBSITE_B_INDEX: return cs2::kBombSiteBIconUrl; default: return nullptr; @@ -86,6 +112,5 @@ struct PlantedC4 { } private: - PlantedC4Base base; - Dependencies& dependencies; + Context context; }; diff --git a/Source/GameDependencies/DepsInstances.h b/Source/GameDependencies/DepsInstances.h index d8564a74fd8..40567068fb4 100644 --- a/Source/GameDependencies/DepsInstances.h +++ b/Source/GameDependencies/DepsInstances.h @@ -18,11 +18,6 @@ inline HudDeps& HudDeps::instance() noexcept return GlobalContext::instance().fullContext().gameDependencies.hudDeps; } -inline const PlantedC4Deps& PlantedC4Deps::instance() noexcept -{ - return GlobalContext::instance().fullContext().gameDependencies.plantedC4Deps; -} - inline const FileNameSymbolTableDeps& FileNameSymbolTableDeps::instance() noexcept { return GlobalContext::instance().fullContext().gameDependencies.fileNameSymbolTableDeps; diff --git a/Source/GameDependencies/PlantedC4Deps.h b/Source/GameDependencies/PlantedC4Deps.h index 2003e446f08..3785be0dc77 100644 --- a/Source/GameDependencies/PlantedC4Deps.h +++ b/Source/GameDependencies/PlantedC4Deps.h @@ -16,8 +16,6 @@ struct PlantedC4Deps { { } - [[nodiscard]] static const PlantedC4Deps& instance() noexcept; - cs2::CUtlVector* plantedC4s; BombSiteOffset bombSite; diff --git a/Source/HookDependencies/HookDependencies.h b/Source/HookDependencies/HookDependencies.h index fa4c51b5967..4e5ec033617 100644 --- a/Source/HookDependencies/HookDependencies.h +++ b/Source/HookDependencies/HookDependencies.h @@ -131,10 +131,7 @@ struct HookDependencies { [[nodiscard]] auto plantedC4() noexcept { - const auto base = PlantedC4Base{getPlantedC4()}; - if (base.thisptr) - return std::optional>{PlantedC4{base, *this}}; - return std::optional>{}; + return std::optional{make>(getPlantedC4())}; } [[nodiscard]] ConVarAccessor getConVarAccessor() noexcept