예제 #1
0
void CtrlDetours_Natives(bool set)
{
	if (set)
	{
		void *address = nullptr;

		if (MainConfig->GetMemSig("CreateNamedEntity", &address)) // cs_create_entity()
		{
			CS_CreateNamedEntity = reinterpret_cast<CreateNamedEntityFunc>(address);
		}

		if (MainConfig->GetMemSig("FindEntityByString", &address)) // cs_find_ent_by_class()
		{
			CS_UTIL_FindEntityByString = reinterpret_cast<UTIL_FindEntityByStringFunc>(address);
		}

		if (!CS_CreateNamedEntity)
		{
			MF_Log("CREATE_NAMED_ENITTY is not available - native cs_create_entity() has been disabled");
		}

		if (!CS_UTIL_FindEntityByString)
		{
			MF_Log("UTIL_FindEntByString is not available - native cs_find_ent_by_class() has been disabled");
		}

		if (MainConfig->GetMemSig("GiveDefaultItems", &address))
		{
			GiveDefaultItemsDetour = DETOUR_CREATE_MEMBER_FIXED(GiveDefaultItems, address);
		}

		if (!GiveDefaultItemsDetour)
		{
			MF_Log("GiveDefaultItems is not available - native cs_set_no_knives has been disabled");
		}
	}
	else
	{
		if (GiveDefaultItemsDetour)
		{
			GiveDefaultItemsDetour->Destroy();
		}
	}
}
예제 #2
0
void CtrlDetours_BuyCommands(bool set)
{
	if (set)
	{
		void *address = nullptr;

		if (MainConfig->GetMemSig("GiveShield", &address))
		{
			GiveShieldDetour = DETOUR_CREATE_MEMBER_FIXED(GiveShield, address);
		}

		if (MainConfig->GetMemSig("GiveNamedItem", &address))
		{
			GiveNamedItemDetour = DETOUR_CREATE_MEMBER_FIXED(GiveNamedItem, address);
		}

		if (MainConfig->GetMemSig("AddAccount", &address))
		{
			AddAccountDetour = DETOUR_CREATE_MEMBER_FIXED(AddAccount, address);
		}
		
		if (!GiveShieldDetour || !GiveNamedItemDetour || !AddAccountDetour)
		{
			if (!GiveShieldDetour)
			{
				MF_Log("GiveShield is not available");
			}

			if (!GiveNamedItemDetour)
			{
				MF_Log("GiveNamedItem is not available");
			}

			if (!AddAccountDetour)
			{
				MF_Log("AddAccount is not available");
			}

			MF_Log("Some functions are not available - forward CS_OnBuyAttempt and CS_OnBuy have been disabled");
		}
	}
	else
	{
		if (GiveShieldDetour)
		{
			GiveShieldDetour->Destroy();
		}

		if (GiveNamedItemDetour)
		{
			GiveNamedItemDetour->Destroy();
		}

		if (AddAccountDetour)
		{
			AddAccountDetour->Destroy();
		}

		ItemAliasList.clear();
	}
}
예제 #3
0
void InitDetours()
{
	IsValidTargetDetour   = DETOUR_CREATE_MEMBER_FIXED(Observer_IsValidTarget, Util::FindAddress(FUNC_ISVALIDTARGET));
	ObserverSetModeDetour = DETOUR_CREATE_MEMBER_FIXED(Observer_SetMode      , Util::FindAddress(FUNC_SETMODE));

#if defined(KE_LINUX)

	void *SetModePart2Address = Util::FindAddress(FUNC_SETMODE2);

	if (ObserverSetModeDetour && IsValidTargetDetour && SetModePart2Address)
	{
		SetModePart2 = reinterpret_cast<SetModePart2Fn>(SetModePart2Address);

#elif defined(KE_WINDOWS) || defined(KE_MACOSX)

	if (ObserverSetModeDetour && IsValidTargetDetour)
	{
#endif
		IsValidTargetDetour->EnableDetour();
		ObserverSetModeDetour->EnableDetour();
	}
	else
	{
		if (!IsValidTargetDetour)
		{
			ErrorLogs.append("CBasePlayer::Observer_IsValidTarget is not available.");
		}

		if (!ObserverSetModeDetour)
		{
			ErrorLogs.append("CBasePlayer::Observer_SetMode is not available.");
		}

	#if defined(KE_LINUX)

		if (!SetModePart2Address)
		{
			ErrorLogs.append("CBasePlayer::Observer_SetMode (second part) is not available.");
		}
	#endif

		ErrorLogs.append("Some functions are not availble, module has been disabled.");

		DestroyDetours();
	}
}

void DestroyDetours()
{
	if (IsValidTargetDetour)
	{
		IsValidTargetDetour->Destroy();
		IsValidTargetDetour = nullptr;
	}

	if (ObserverSetModeDetour)
	{
		ObserverSetModeDetour->Destroy();
		ObserverSetModeDetour = nullptr;
	}
}