DETOUR_DECL_MEMBER(void, CTFBotMvMEngineerBuildSentryGun_ctor, CTFBotHintSentrygun *hint)
	{
		TRACE();
		
		hint_sg = hint;
		DETOUR_MEMBER_CALL(CTFBotMvMEngineerBuildSentryGun_ctor)(hint);
	}
	DETOUR_DECL_MEMBER(void, CTFBotMvMEngineerBuildTeleportExit_ctor, CTFBotHintTeleporterExit *hint)
	{
		TRACE();
		
		hint_te = hint;
		DETOUR_MEMBER_CALL(CTFBotMvMEngineerBuildTeleportExit_ctor)(hint);
	}
Exemplo n.º 3
0
	DETOUR_DECL_MEMBER(void, CTFTankBoss_TankBossThink)
	{
		static CountdownTimer ctNodes;
		
		if (ctNodes.IsElapsed()) {
			ctNodes.Start(0.5f);
			
			ForEachEntityByRTTI<CPathTrack>([](CPathTrack *node){
				NDebugOverlay::Box(node->GetAbsOrigin(), Vector(-10.0f, -10.0f, -10.0f), Vector(10.0f, 10.0f, 10.0f),
					0xff, 0xff, 0xff, 0x80, 0.5f);
				NDebugOverlay::EntityTextAtPosition(node->GetAbsOrigin(), 0, CFmtStrN<16>("#%d", i), 0.5f, 0xff, 0xff, 0xff, 0xff);
				
				CPathTrack *next = node->GetNext();
				if (next != nullptr) {
					NDebugOverlay::HorzArrow(node->GetAbsOrigin(), next->GetAbsOrigin(), 3.0f, 0xff, 0xff, 0xff, 0xff, true, 0.5f);
				}
			});
		}
		
		auto tank = reinterpret_cast<CTFTankBoss *>(this);
		
		NDebugOverlay::EntityText(ENTINDEX(tank), 0, CFmtStrN<256>("%.1f%%", GetTankProgress(tank) * 100.0f),
			gpGlobals->interval_per_tick, 0xff, 0xff, 0xff, 0xff);
		
	//	NDebugOverlay::EntityText(ENTINDEX(tank), 0, CFmtStrN<256>("m_hCurrentNode:    #%d", ENTINDEX(*m_hCurrentNode)),
	//		gpGlobals->interval_per_tick, 0xff, 0xff, 0xff, 0xff);
	//	NDebugOverlay::EntityText(ENTINDEX(tank), 1, CFmtStrN<256>("m_iCurrentNode:    %d", *m_iCurrentNode),
	//		gpGlobals->interval_per_tick, 0xff, 0xff, 0xff, 0xff);
	//	NDebugOverlay::EntityText(ENTINDEX(tank), 2, CFmtStrN<256>("m_flTotalDistance: %.0f", *m_flTotalDistance),
	//		gpGlobals->interval_per_tick, 0xff, 0xff, 0xff, 0xff);
	//	NDebugOverlay::EntityText(ENTINDEX(tank), 3, CFmtStrN<256>("m_NodeDists[i]:    %.0f", (*m_NodeDists)[*m_iCurrentNode]),
	//		gpGlobals->interval_per_tick, 0xff, 0xff, 0xff, 0xff);
		
		DETOUR_MEMBER_CALL(CTFTankBoss_TankBossThink)();
	}
	DETOUR_DECL_MEMBER(bool, CFontTextureCache_GetTextureForChars, vgui::HFont font, vgui::FontDrawType_t type, wchar_t *wch, int *textureID, float **texCoords, int numChars)
	{
		SCOPED_INCREMENT_IF(rc_CFontTextureCache_GetTextureForChars_FG, font == hFontFG);
		SCOPED_INCREMENT_IF(rc_CFontTextureCache_GetTextureForChars_BG, font == hFontBG);
		
		return DETOUR_MEMBER_CALL(CFontTextureCache_GetTextureForChars)(font, type, wch, textureID, texCoords, numChars);
	}
	DETOUR_DECL_MEMBER(void, CTFBotHintEngineerNest_HintTeleporterThink)
	{
		DETOUR_MEMBER_CALL(CTFBotHintEngineerNest_HintTeleporterThink)();
		
		auto nest = reinterpret_cast<CTFBotHintEngineerNest *>(this);
		nest->m_bHasActiveTeleporter = false;
	}
Exemplo n.º 6
0
	DETOUR_DECL_MEMBER(void, CTFBotMissionSuicideBomber_StartDetonate, CTFBot *actor, bool reached_goal, bool lost_all_health)
	{
		DevMsg("  StartDetonate(reached_goal:%s lost_all_health:%s)\n",
			(reached_goal ? "YES" : "NO"),
			(lost_all_health ? "YES" : "NO"));
		DETOUR_MEMBER_CALL(CTFBotMissionSuicideBomber_StartDetonate)(actor, reached_goal, lost_all_health);
	}
Exemplo n.º 7
0
DETOUR_DECL_MEMBER1(SetInWaitingForPlayers, void, bool, bWaitingForPlayers)
{
	DETOUR_MEMBER_CALL(SetInWaitingForPlayers)(bWaitingForPlayers);

	if (bWaitingForPlayers)
	{
		if (!g_waitingPlayersStartForward)
		{
			g_pSM->LogMessage(myself, "Invalid Forward");
		}
		else
		{
			g_waitingPlayersStartForward->Execute(NULL);
		}
	}
	else
	{
		if (!g_waitingPlayersEndForward)
		{
			g_pSM->LogMessage(myself, "Invalid Forward");
		}
		else
		{
			g_waitingPlayersEndForward->Execute(NULL);
		}
	}
}
Exemplo n.º 8
0
	DETOUR_DECL_MEMBER(void, CObjectTeleporter_RecieveTeleportingPlayer, CTFPlayer *player)
	{
		NDebugOverlay::Clear();
		
		SCOPED_INCREMENT(rc_CObjectTeleporter_RecieveTeleportingPlayer);
		DETOUR_MEMBER_CALL(CObjectTeleporter_RecieveTeleportingPlayer)(player);
	}
Exemplo n.º 9
0
	DETOUR_DECL_MEMBER(void, CTFPlayer_ApplyAbsVelocityImpulse, const Vector& impulse)
	{
		if (rc_CTFPlayer_ApplyPushFromDamage > 0) {
			auto player = reinterpret_cast<CTFPlayer *>(this);
			if (player->IsBot()) {
				if (dmginfo->GetAttacker() == player) {
					float magnitude = impulse.Length();
					
					QAngle angles;
					VectorAngles(impulse, angles);
					
					DevMsg("IMPULSE: mag %.1f, dir [ %.1f %.1f %.1f ]\n",
						magnitude, angles.x, angles.y, angles.z);
					
					constexpr float duration = 3.0f;
					char buf[1024];
					
					NDebugOverlay::VertArrow(player->GetAbsOrigin(), player->GetAbsOrigin() + impulse,
						5.0f, 0x00, 0xff, 0x00, 0xff, false, duration);
					
					snprintf(buf, sizeof(buf), "Mag: %.1f", magnitude);
					NDebugOverlay::EntityTextAtPosition(player->GetAbsOrigin(), 0,
						buf, duration, 0xff, 0xff, 0xff, 0xff);
					
					snprintf(buf, sizeof(buf), "Dir: [ %.1f %.1f %.1f ]", angles.x, angles.y, angles.z);
					NDebugOverlay::EntityTextAtPosition(player->GetAbsOrigin(), 1,
						buf, duration, 0xff, 0xff, 0xff, 0xff);
				}
			}
		}
		
		DETOUR_MEMBER_CALL(CTFPlayer_ApplyAbsVelocityImpulse)(impulse);
	}
Exemplo n.º 10
0
	DETOUR_DECL_MEMBER(int, CBaseEntity_TakeDamage, const CTakeDamageInfo& info)
	{
		auto ent = reinterpret_cast<CBaseEntity *>(this);
		
		if (ent->IsBaseObject() && info.GetDamageType() == DMG_BLAST && info.GetDamageCustom() == TF_DMG_CUSTOM_NONE) {
			if (rc_CTFBotMainAction_OnContact > 0 && bot_contact != nullptr && info.GetInflictor() == bot_contact && info.GetAttacker() == bot_contact) {
				if (cvar_contact_addknown.GetBool()) {
					AddKnownToBot(bot_contact, ent);
				}
				
				if (cvar_contact_nodamage.GetBool()) {
					DevMsg("Preventing damage due to giant-robot-vs-building instant stomp from CTFBotMainAction::OnContact\n");
					return 0;
				}
			}
			
			if (rc_CTFBotMainAction_OnStuck > 0 && bot_stuck != nullptr && info.GetInflictor() == bot_stuck && info.GetAttacker() == bot_stuck) {
				if (cvar_stuck_addknown.GetBool()) {
					AddKnownToBot(bot_stuck, ent);
				}
				
				if (cvar_stuck_nodamage.GetBool()) {
					DevMsg("Preventing damage due to robot-vs-building delayed stomp from CTFBotMainAction::OnStuck\n");
					return 0;
				}
			}
		}
		
		return DETOUR_MEMBER_CALL(CBaseEntity_TakeDamage)(info);
	}
Exemplo n.º 11
0
/**
 * void CBasePlayer::Observer_SetMode(int mode)
 *
 * @param mode        Observer mode.
 * @noreturn
 */
DETOUR_DECL_MEMBER1(Observer_SetMode, void, int, mode)
{
	auto pvPlayer = reinterpret_cast<void*>(this);

	#if defined(KE_LINUX)

		asm volatile
		(
			"movl %%edx, %0;"
			"movl %%eax, %1;"
			: "=d" (mode), "=a" (pvPlayer) : :
		);

	#endif

	if (Util::ShouldRunCode())
	{
		auto pPlayer = TypeConversion.cbase_to_edict(pvPlayer);

		if (Util::IsAdmin(pPlayer))
		{
			g_pengfuncsTable->pfnCVarGetFloat = CVarGetFloat;
		}
		else
		{
			auto numFlags = 0;
			auto userFlags = Util::GetUserMode(&numFlags);

			if (numFlags)
			{
				g_pengfuncsTable->pfnCVarGetFloat = CVarGetFloat;

				mode = (numFlags == 1) ? Util::GetFlagPosition(userFlags) : Util::GetNextUserMode(pPlayer, userFlags);

				if (pPlayer->v.iuser1 == OBS_NONE) // When starting to observe, force to update target.
				{
					get_pdata<EHANDLE>(pPlayer, m_hObserverTarget).Set(nullptr);
				}
			}
		}
	}

#if defined(KE_WINDOWS) || defined(KE_MACOSX)

	DETOUR_MEMBER_CALL(Observer_SetMode)(mode);

#elif defined(KE_LINUX)

	ObserverSetModeDetour->DisableDetour();
	SetModePart2(reinterpret_cast<void*>(pvPlayer), mode);
	ObserverSetModeDetour->EnableDetour();

#endif

	if (g_pengfuncsTable->pfnCVarGetFloat)
	{
		g_pengfuncsTable->pfnCVarGetFloat = nullptr;
	}
}
Exemplo n.º 12
0
	DETOUR_DECL_MEMBER(float, CTFBot_GetTimeLeftToCapture)
	{
		if (TFGameRules()->IsMannVsMachineMode()) {
			return FLT_MAX;
		}
		
		return DETOUR_MEMBER_CALL(CTFBot_GetTimeLeftToCapture)();
	}
Exemplo n.º 13
0
	DETOUR_DECL_MEMBER(EventDesiredResult<CTFBot>, CTFBotMissionSuicideBomber_OnKilled, CTFBot *actor, const CTakeDamageInfo& info)
	{
		DevMsg("\n[OnKilled]\n");
		auto result = DETOUR_MEMBER_CALL(CTFBotMissionSuicideBomber_OnKilled)(actor, info);
		
		DevMsg("  result: %s\n", ActionResult_ToString(result));
		return result;
	}
Exemplo n.º 14
0
	DETOUR_DECL_MEMBER(EventDesiredResult<CTFBot>, CTFBotMissionSuicideBomber_OnStuck, CTFBot *actor)
	{
		DevMsg("\n[OnStuck]\n");
		auto result = DETOUR_MEMBER_CALL(CTFBotMissionSuicideBomber_OnStuck)(actor);
		
		DevMsg("  result: %s\n", ActionResult_ToString(result));
		return result;
	}
Exemplo n.º 15
0
	DETOUR_DECL_MEMBER(void, CRConClient_SendCmd, const char *cmd)
	{
		DevMsg("CRConClient::SendCmd detour!\n");
		DevMsg("  this = %08x\n", (uintptr_t)this);
		DevMsg("  cmd  = \"%s\"\n", cmd);
		
		DETOUR_MEMBER_CALL(CRConClient_SendCmd)(cmd);
	}
Exemplo n.º 16
0
	DETOUR_DECL_MEMBER(void, CViewRender_Render, vrect_t *rect)
	{
	//	DevMsg("CViewRender::Render\n");
		
		TrackPlayers();
		
		DETOUR_MEMBER_CALL(CViewRender_Render)(rect);
	}
Exemplo n.º 17
0
	DETOUR_DECL_MEMBER(void, CWaveDataStreamAsync_dtor, uint32_t i1)
	{
		std::lock_guard<std::mutex> lock(m_CWaveDataStreamAsync);
		
		--num_CWaveDataStreamAsync;
		LOGMEM("--- CWaveDataStreamAsync @ 0x%08x [total: %d]\n", (uintptr_t)this, num_CWaveDataStreamAsync);
		DETOUR_MEMBER_CALL(CWaveDataStreamAsync_dtor)(i1);
	}
Exemplo n.º 18
0
	DETOUR_DECL_MEMBER(Action<CTFBot> *, CTFBotTacticalMonitor_InitialContainedAction, CTFBot *actor)
	{
		if (TFGameRules()->IsMannVsMachineMode() && actor->GetTeamNumber() == TF_TEAM_RED) {
			return new CTFBotMvMDefender();
		}
		
		return DETOUR_MEMBER_CALL(CTFBotTacticalMonitor_InitialContainedAction)(actor);
	}
Exemplo n.º 19
0
	DETOUR_DECL_MEMBER(void, CAudioMixerWaveMP3_dtor, uint32_t i1)
	{
		std::lock_guard<std::mutex> lock(m_CAudioMixerWaveMP3);
		
		--num_CAudioMixerWaveMP3;
		LOGMEM("--- CAudioMixerWaveMP3 @ 0x%08x [total: %d]\n", (uintptr_t)this, num_CAudioMixerWaveMP3);
		DETOUR_MEMBER_CALL(CAudioMixerWaveMP3_dtor)(i1);
	}
Exemplo n.º 20
0
	DETOUR_DECL_MEMBER(void, CWaveDataStreamAsync_ctor, uint32_t r1, uint32_t p1, const char *s1, int i1, int i2, uint32_t p2, int i3)
	{
		std::lock_guard<std::mutex> lock(m_CWaveDataStreamAsync);
		
		++num_CWaveDataStreamAsync;
		LOGMEM("+++ CWaveDataStreamAsync @ 0x%08x [total: %d]\n", (uintptr_t)this, num_CWaveDataStreamAsync);
		DETOUR_MEMBER_CALL(CWaveDataStreamAsync_ctor)(r1, p1, s1, i1, i2, p2, i3);
	}
Exemplo n.º 21
0
DETOUR_DECL_MEMBER2(DetourHLTVStartRecording, void, const char *, filename, bool, bContinuously)
{
	// Call the original first.
	DETOUR_MEMBER_CALL(DetourHLTVStartRecording)(filename, bContinuously);
	
	IDemoRecorder *recorder = (IDemoRecorder *)this;
	g_pSTVForwards.CallOnStartRecording(recorder, filename, bContinuously);
}
Exemplo n.º 22
0
	DETOUR_DECL_MEMBER(bool, CTFPlayer_SpeakConceptIfAllowed, int iConcept, const char *modifiers, char *pszOutResponseChosen, size_t bufsize, IRecipientFilter *filter)
	{
		if (suppress_speak) {
			return false;
		}
		
		return DETOUR_MEMBER_CALL(CTFPlayer_SpeakConceptIfAllowed)(iConcept, modifiers, pszOutResponseChosen, bufsize, filter);
	}
Exemplo n.º 23
0
	DETOUR_DECL_MEMBER(bool, Path_Compute_vec_CTFBotPathCost, INextBot *nextbot, const Vector& vec, CTFBotPathCost& cost_func, float maxPathLength, bool b1)
	{
		auto result = DETOUR_MEMBER_CALL(Path_Compute_vec_CTFBotPathCost)(nextbot, vec, cost_func, maxPathLength, b1);
		
		if (rc_CTFBotMissionSuicideBomber_Update > 0) {
			DevMsg("  Path::Compute: %s\n", (result ? "SUCCESS" : "FAIL"));
		}
		return result;
	}
Exemplo n.º 24
0
	DETOUR_DECL_MEMBER(void, CTFPlayerShared_OnConditionAdded, ETFCond cond)
	{
		auto shared = reinterpret_cast<CTFPlayerShared *>(this);
		auto player = shared->GetOuter();
		
		ClientMsg("[CondDebug] #%d \"%s\" +++ %d %s\n", ENTINDEX(player), player->GetPlayerName(), (int)cond, GetTFConditionName(cond));
		
		DETOUR_MEMBER_CALL(CTFPlayerShared_OnConditionAdded)(cond);
	}
Exemplo n.º 25
0
	DETOUR_DECL_MEMBER(void, CTFBot_Spawn)
	{
		DETOUR_MEMBER_CALL(CTFBot_Spawn)();
		
		auto bot = reinterpret_cast<CTFBot *>(this);
		if (bot->GetTeamNumber() == TF_TEAM_RED) {
			GiveLoadout(bot);
		}
	}
Exemplo n.º 26
0
	DETOUR_DECL_MEMBER(void, CTFGameRules_DropHalloweenSoulPack, int i1, const Vector& vec1, CBaseEntity *ent1, int i2)
	{
		if (TFGameRules()->IsMannVsMachineMode()) {
			/* don't spawn "halloween_souls_pack" entities in MvM mode */
			return;
		}
		
		DETOUR_MEMBER_CALL(CTFGameRules_DropHalloweenSoulPack)(i1, vec1, ent1, i2);
	}
Exemplo n.º 27
0
	DETOUR_DECL_MEMBER(ActionResult<CTFBot>, CTFBotMainAction_Update, CTFBot *actor, float dt)
	{
		constexpr int OFF_CTFBotMainAction_m_itUnderground = 0x70;
		auto m_itUnderground = (IntervalTimer *)((uintptr_t)this + OFF_CTFBotMainAction_m_itUnderground);
		
		m_itUnderground->Reset();
		
		return DETOUR_MEMBER_CALL(CTFBotMainAction_Update)(actor, dt);
	}
DETOUR_DECL_MEMBER1(RemoveEntity, void, CBaseHandle, handle)
{
	CEntity *cent = CEntity::Instance(handle);
	if(cent)
	{
		cent->Destroy();
	}
	DETOUR_MEMBER_CALL(RemoveEntity)(handle);
}
Exemplo n.º 29
0
	DETOUR_DECL_MEMBER(void, CTFBotProxy_C1)
	{
		static uintptr_t prev = 0x00000000;
		
		uintptr_t diff = Max((uintptr_t)this, prev) - Min((uintptr_t)this, prev);
		ConColorMsg(Color(0x00, 0xff, 0xff, 0xff), "CTFBotProxy constructed @ 0x%08x (diff: 0x%08x)\n", (uintptr_t)this, diff);
		prev = (uintptr_t)this;
		
		DETOUR_MEMBER_CALL(CTFBotProxy_C1)();
	}
Exemplo n.º 30
0
DETOUR_DECL_MEMBER0(DetourWeaponPrice, int)
{
	int price = DETOUR_MEMBER_CALL(DetourWeaponPrice)();

	if (lastclient == -1)
		return price;

	const char *weapon_name = reinterpret_cast<char *>(this+weaponNameOffset);

	return CallPriceForward(lastclient, weapon_name, price);
}