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");
+});