AdvancedFilter.h 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #pragma once
  2. #include "IEntityFilter.h"
  3. #include <vector>
  4. #include "../il2cpp/il2cpp-appdata.h"
  5. namespace cheat::game
  6. {
  7. namespace filter::mode {
  8. inline bool whitelist(const std::vector<std::string>& names, cheat::game::Entity* entity) {
  9. const auto& name = entity->name();
  10. bool name_found = std::any_of(names.cbegin(), names.cend(),
  11. [&name](const std::string& pattern) { return name.find(pattern) != std::string::npos; });
  12. return name_found;
  13. }
  14. inline bool blacklist(const std::vector<std::string>& names, cheat::game::Entity* entity) {
  15. bool name_not_found = !whitelist(names, entity);
  16. return name_not_found;
  17. }
  18. }
  19. template <auto nameFilterFn = &filter::mode::whitelist>
  20. class AdvancedFilter :
  21. public IEntityFilter
  22. {
  23. public:
  24. AdvancedFilter(std::initializer_list<app::EntityType__Enum_1> types = {}, std::initializer_list<std::string> names = {}) : m_Names(names), m_Types(types) {}
  25. AdvancedFilter(std::initializer_list<app::EntityType__Enum_1> types, const std::string& name) : AdvancedFilter(types, { name }) {}
  26. AdvancedFilter(const app::EntityType__Enum_1 type, std::initializer_list<std::string> name) : AdvancedFilter({ type }, name) {}
  27. AdvancedFilter(const app::EntityType__Enum_1 type, const std::string& name) : AdvancedFilter({ type }, { name }) {}
  28. friend AdvancedFilter operator+(AdvancedFilter lFilter, const AdvancedFilter& rFilter);
  29. bool IsValid(Entity* entity) const override {
  30. if (entity == nullptr)
  31. return false;
  32. bool type_found = m_Types.size() == 0 || std::any_of(m_Types.cbegin(), m_Types.cend(),
  33. [entity](const app::EntityType__Enum_1& type) { return entity->type() == type; });
  34. if (!type_found)
  35. return false;
  36. return m_Names.empty() || nameFilterFn(m_Names, entity);
  37. }
  38. private:
  39. std::vector<app::EntityType__Enum_1> m_Types;
  40. std::vector<std::string> m_Names;
  41. };
  42. template<auto Fn>
  43. AdvancedFilter<Fn> operator+(AdvancedFilter<Fn> lFilter, const AdvancedFilter<Fn>& rFilter)
  44. {
  45. lFilter.m_Names.insert(lFilter.m_Names.end(), rFilter.m_Names.begin(), rFilter.m_Names.end());
  46. lFilter.m_Types.insert(lFilter.m_Types.end(), rFilter.m_Types.begin(), rFilter.m_Types.end());
  47. return lFilter;
  48. }
  49. using WhitelistFilter = AdvancedFilter<&filter::mode::whitelist>;
  50. using BlacklistFilter = AdvancedFilter<&filter::mode::blacklist>;
  51. }