Начинающий
-
Автор темы
- #1
Здравствуйте! Хочу получить account id всех 10х человек с которыми я попался в катке. Раньше можно было через server_log уже как год это не работает
ну наверное сделать свой аналог овервульфаА зач тебе оно
class CDOTAPlayerController : public VClass {
public:
GETTER(uint64_t, GetSteamID, Netvars::Offsets.m_steamID);
};
bool IsPlayer() {
const char* typeName = SchemaDynamicBinding()->bindingName;
if (!typeName)
return false;
if (!strcmp(typeName, "C_DOTAPlayerController"))
return true;
return false;
}
я предпочитаю IsInstanceOfClass, который чекает сам класс, и всех его родителей и проверяет есть ли там нужныйКакой-то ты странненький. Инфа же на поверхности лежит. Сдампи C_DOTAPlayerController и посмотри.
Чтобы его (их) найти, можно просто по энтити листу пробежаться после загрузки карты (ну или хукнуть OnAddEntity и себе куда-то в map сохранять плееров).C++:class CDOTAPlayerController : public VClass { public: GETTER(uint64_t, GetSteamID, Netvars::Offsets.m_steamID); };
Внимание, экстремальный говнокод (Либералист, не стукай). Добавляешь его в CBaseEntity, ну и в хуке OnAddEntity чекаешь.
C++:bool IsPlayer() { const char* typeName = SchemaDynamicBinding()->bindingName; if (!typeName) return false; if (!strcmp(typeName, "C_DOTAPlayerController")) return true; return false; }
bool helper_check_hierarchy_for_name(const CSchemaClassBinding& binding, std::string_view name) noexcept
{
for (const auto& parent_node : binding.GetParents())
{
if (const auto* parent = parent_node.GetParent(); parent)
{
if (parent->GetName() == name || helper_check_hierarchy_for_name(*parent, name))
return true;
}
}
return false;
}
//C_BaseEntity vvv
const CSchemaClassBinding& GetBinding() const
{
const auto* result = CallVFunc<0, CSchemaClassBinding*>();
if (!result)
throw std::runtime_error{ "C_BaseEntity::GetBinding returned nullptr!" };
return *result;
}
bool IsInstanceOfClass(std::string_view cls) const
{
const auto& binding = GetBinding();
if (binding.GetName() == cls)
return true;
else
return helper_check_hierarchy_for_name(binding, cls);
return false;
}
Что значит vvv?//C_BaseEntity vvv
^^^ вверхуЧто значит vvv?
#if !_HAS_EXCEPTIONS
const bool _Zero_uncaught_exceptions = true;
#elif _HAS_DEPRECATED_UNCAUGHT_EXCEPTION
const bool _Zero_uncaught_exceptions = !_STD uncaught_exception(); // TRANSITION, ArchivedOS-12000909
#else // ^^^ _HAS_DEPRECATED_UNCAUGHT_EXCEPTION / !_HAS_DEPRECATED_UNCAUGHT_EXCEPTION vvv
const bool _Zero_uncaught_exceptions = _STD uncaught_exceptions() == 0;
#endif // !_HAS_DEPRECATED_UNCAUGHT_EXCEPTION
Ну попросил же не стукатья предпочитаю IsInstanceOfClass, который чекает сам класс, и всех его родителей и проверяет есть ли там нужный
(разумеется ниже == это std::string_view::operator== а не pointer::operator==, мало ли у кого GetName возвращает конст чар*)
C++:bool helper_check_hierarchy_for_name(const CSchemaClassBinding& binding, std::string_view name) noexcept { for (const auto& parent_node : binding.GetParents()) { if (const auto* parent = parent_node.GetParent(); parent) { if (parent->GetName() == name || helper_check_hierarchy_for_name(*parent, name)) return true; } } return false; } //C_BaseEntity vvv const CSchemaClassBinding& GetBinding() const { const auto* result = CallVFunc<0, CSchemaClassBinding*>(); if (!result) throw std::runtime_error{ "C_BaseEntity::GetBinding returned nullptr!" }; return *result; } bool IsInstanceOfClass(std::string_view cls) const { const auto& binding = GetBinding(); if (binding.GetName() == cls) return true; else return helper_check_hierarchy_for_name(binding, cls); return false; }
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz