diff --git a/data/menu/nullifiedcat/visuals.xml b/data/menu/nullifiedcat/visuals.xml index 6a59eac0..afc648cc 100755 --- a/data/menu/nullifiedcat/visuals.xml +++ b/data/menu/nullifiedcat/visuals.xml @@ -3,6 +3,7 @@ + diff --git a/data/menu/nullifiedcat/visuals/dominatemark.xml b/data/menu/nullifiedcat/visuals/dominatemark.xml new file mode 100644 index 00000000..2735019a --- /dev/null +++ b/data/menu/nullifiedcat/visuals/dominatemark.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/data/textures/atlas.png b/data/textures/atlas.png index c61a00cd..eb5618c3 100755 Binary files a/data/textures/atlas.png and b/data/textures/atlas.png differ diff --git a/data/textures/atlas.xcf b/data/textures/atlas.xcf index 3bc57526..010c90fc 100755 Binary files a/data/textures/atlas.xcf and b/data/textures/atlas.xcf differ diff --git a/include/reclasses/CTFPlayerShared.hpp b/include/reclasses/CTFPlayerShared.hpp index a19ed660..0d4c1d61 100644 --- a/include/reclasses/CTFPlayerShared.hpp +++ b/include/reclasses/CTFPlayerShared.hpp @@ -6,6 +6,13 @@ namespace re class CTFPlayerShared { public: + inline static bool IsDominatingPlayer(CTFPlayerShared *self, int ent_idx) + { + static auto signature = gSignatures.GetClientSignature("55 89 E5 56 53 83 EC ? 8B 5D ? E8 ? ? ? ? 89 C6 31 C0"); + typedef bool (*IsDominatingPlayer_t)(CTFPlayerShared *, int); + static IsDominatingPlayer_t IsDominatingPlayer_fn = IsDominatingPlayer_t(signature); + return IsDominatingPlayer_fn(self, ent_idx); + } inline static float GetCritMult(CTFPlayerShared *self) { return ((fminf(fmaxf(*(float *) (unsigned(self) + 672) * 0.0039215689f, 0.0f), 1.0f) * 3.0f) + 1.0f); diff --git a/src/hacks/CMakeLists.txt b/src/hacks/CMakeLists.txt index 60fc9468..4a021d3b 100755 --- a/src/hacks/CMakeLists.txt +++ b/src/hacks/CMakeLists.txt @@ -40,6 +40,7 @@ target_sources(cathook PRIVATE add_subdirectory(ac) if(EnableVisuals) target_sources(cathook PRIVATE + "${CMAKE_CURRENT_LIST_DIR}/DominateMark.cpp" "${CMAKE_CURRENT_LIST_DIR}/ESP.cpp" "${CMAKE_CURRENT_LIST_DIR}/Tracers.cpp" "${CMAKE_CURRENT_LIST_DIR}/Radar.cpp" diff --git a/src/hacks/DominateMark.cpp b/src/hacks/DominateMark.cpp new file mode 100644 index 00000000..1410b124 --- /dev/null +++ b/src/hacks/DominateMark.cpp @@ -0,0 +1,48 @@ +/* Made by BenCat07 + * + * On 30th of March + * 2019 + * + */ +#include "common.hpp" +static settings::Bool draw_dominate{ "dominatemark.enable", "false" }; +static settings::Float min_size{ "dominatemark.min-size", "15.0f" }; +static settings::Float max_size{ "dominatemark.max-size", "40.0f" }; + +static InitRoutine init([]() { + EC::Register(EC::Draw, + []() { + if (!*draw_dominate) + return; + if (CE_BAD(LOCAL_E)) + return; + re::CTFPlayerShared *shared_player = &re::C_BasePlayer::shared_(RAW_ENT(LOCAL_E)); + for (int i = 0; i < g_IEngine->GetMaxClients(); i++) + { + CachedEntity *ent = ENTITY(i); + if (CE_GOOD(ent) && ent->m_bAlivePlayer() && re::CTFPlayerShared::IsDominatingPlayer(shared_player, i)) + { + Vector draw_pos; + float size; + if (!ent->hitboxes.GetHitbox(0)) + continue; + // Calculate draw pos + auto c = ent->InternalEntity()->GetCollideable(); + draw_pos = ent->m_vecOrigin(); + draw_pos.z += c->OBBMaxs().z; + // Calculate draw size + size = *max_size * 1.5f - ent->m_flDistance() / 20.0f; + size = fminf(*max_size, size); + size = fmaxf(*min_size, size); + + Vector out; + if (draw::WorldToScreen(draw_pos, out)) + { + static textures::sprite sprite = textures::atlas().create_sprite(447, 257, 64, 64); + sprite.draw(int(out.x - size / 2.0f), int(out.y - size), int(size), int(size), colors::white); + } + } + } + }, + "dominatemark_draw"); +});