From 8e0ec44353193eb45c2745b82656121fe21eb995 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Krupi=C5=84ski?= Date: Tue, 24 Sep 2024 19:53:20 +0200 Subject: [PATCH] Add WeaponServices class --- Source/GameClasses/PlayerPawn.h | 17 +++++++-------- Source/GameClasses/WeaponServices.h | 34 +++++++++++++++++++++++++++++ Source/Osiris.vcxproj | 1 + Source/Osiris.vcxproj.filters | 3 +++ 4 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 Source/GameClasses/WeaponServices.h diff --git a/Source/GameClasses/PlayerPawn.h b/Source/GameClasses/PlayerPawn.h index 55827e6200f..6b512acbb59 100644 --- a/Source/GameClasses/PlayerPawn.h +++ b/Source/GameClasses/PlayerPawn.h @@ -11,6 +11,7 @@ #include "BaseEntity.h" #include "GameSceneNode.h" #include "PlayerWeapons.h" +#include "WeaponServices.h" class EntityFromHandleFinder; @@ -31,12 +32,14 @@ class PlayerPawn { return hookContext.template make(playerPawn); } + [[nodiscard]] decltype(auto) weaponServices() const noexcept + { + return hookContext.template make(hookContext.gameDependencies().playerPawnDeps.offsetToWeaponServices.of(playerPawn).valueOr(nullptr)); + } + [[nodiscard]] decltype(auto) weapons() const noexcept { - const auto weaponServices = hookContext.gameDependencies().playerPawnDeps.offsetToWeaponServices.of(playerPawn).valueOr(nullptr); - if (!weaponServices) - return hookContext.template make(nullptr); - return hookContext.template make(hookContext.gameDependencies().weaponServicesDeps.offsetToWeapons.of(weaponServices).get()); + return weaponServices().weapons(); } [[nodiscard]] TeamNumber teamNumber() const noexcept @@ -128,11 +131,7 @@ class PlayerPawn { [[nodiscard]] cs2::C_CSWeaponBase* getActiveWeapon() const noexcept { - const auto weaponServices = hookContext.gameDependencies().playerPawnDeps.offsetToWeaponServices.of(playerPawn).valueOr(nullptr); - if (!weaponServices) - return nullptr; - - return static_cast(hookContext.template make().getEntityFromHandle(hookContext.gameDependencies().weaponServicesDeps.offsetToActiveWeapon.of(weaponServices).valueOr(cs2::CEntityHandle{cs2::INVALID_EHANDLE_INDEX}))); + return weaponServices().getActiveWeapon(); } private: diff --git a/Source/GameClasses/WeaponServices.h b/Source/GameClasses/WeaponServices.h new file mode 100644 index 00000000000..a9be419a8f9 --- /dev/null +++ b/Source/GameClasses/WeaponServices.h @@ -0,0 +1,34 @@ +#pragma once + +#include +#include +#include "PlayerWeapons.h" + +template +class WeaponServices { +public: + WeaponServices(HookContext& hookContext, cs2::CCSPlayer_WeaponServices* weaponServices) noexcept + : hookContext{hookContext} + , weaponServices{weaponServices} + { + } + + [[nodiscard]] decltype(auto) weapons() const noexcept + { + return hookContext.template make(deps().offsetToWeapons.of(weaponServices).valueOr(nullptr)); + } + + [[nodiscard]] cs2::C_CSWeaponBase* getActiveWeapon() const noexcept + { + return static_cast(hookContext.template make().getEntityFromHandle(deps().offsetToActiveWeapon.of(weaponServices).valueOr(cs2::CEntityHandle{cs2::INVALID_EHANDLE_INDEX}))); + } + +private: + [[nodiscard]] const auto& deps() const noexcept + { + return hookContext.gameDependencies().weaponServicesDeps; + } + + HookContext& hookContext; + cs2::CCSPlayer_WeaponServices* weaponServices; +}; diff --git a/Source/Osiris.vcxproj b/Source/Osiris.vcxproj index aac919d90c5..9f9c672f451 100644 --- a/Source/Osiris.vcxproj +++ b/Source/Osiris.vcxproj @@ -281,6 +281,7 @@ + diff --git a/Source/Osiris.vcxproj.filters b/Source/Osiris.vcxproj.filters index a340690f4a4..4d6f3882fff 100644 --- a/Source/Osiris.vcxproj.filters +++ b/Source/Osiris.vcxproj.filters @@ -1562,6 +1562,9 @@ CS2\Constants + + GameClasses +