Какая функция вызывается при спавне и смерти рошана? хочу их хукнуть и сделать оповещие о его возраждении и смерти.
typedef bool(*FireEventClientSideFn)(CGameEventManager*, CGameEvent*);
FireEventClientSideFn oFireEventClientSide;
bool hkFireEventClientSide(CGameEventManager* thisptr, CGameEvent* event) {
const char* eventName = event->GetName();
if (!eventName)
return oFireEventClientSide(thisptr, event);
else if (!strcmp(eventName, "dota_roshan_kill"))
GameData.RoshanKillTime = vmt.GameRules->GameTime();
...
возможно стоит перестать strcmp и const char* использовать в 2022 году.:)C++:typedef bool(*FireEventClientSideFn)(CGameEventManager*, CGameEvent*); FireEventClientSideFn oFireEventClientSide; bool hkFireEventClientSide(CGameEventManager* thisptr, CGameEvent* event) { const char* eventName = event->GetName(); if (!eventName) return oFireEventClientSide(thisptr, event); else if (!strcmp(eventName, "dota_roshan_kill")) GameData.RoshanKillTime = vmt.GameRules->GameTime(); ...
bool hkFireEventClientSide(CGameEventManager* thisptr, CGameEvent* event) {
if (const std::string_view eventName = event->GetName(); !eventName.empty())
{
if(eventName == "dota_roshan_kill")
GameData.RoshanKillTime = vmt.GameRules->GameTime();
...
}
return oFireEventClientSide(thisptr, event);
}
bool hkFireEventClientSide(CGameEventManager* thisptr, CGameEvent* event) {
if (const std::string_view eventName = event->GetName(); !eventName.empty())
{
if(EventManager.Dispatch(eventName))// =>
//bool consume = false;
//for each event in event_list {
// if(event.name == eventName) {
// event.callback();
// if(!consume)
// consume = event.ShouldConsume();
// }
//}
//return consume;
return true;
}
return oFireEventClientSide(thisptr, event);
}
...
class RoshanKillEventListener : public EventListener<RoshanKillEventListener, "dota_roshan_kill">
{
public:
static void callback() noexcept
{
GameData.RoshanKillTime = vmt.GameRules->GameTime();
}
static void ShouldConsume() noexcept { return true; }
}
...
И сейчас есть) благо апи гибкое достаточноА разве нельзя узнать когда он возродился? В hake.me вроде было такое, когда рошан возраждался писало, что он заспавнен
про точное время нельзя врроде быА разве нельзя узнать когда он возродился? В hake.me вроде было такое, когда рошан возраждался писало, что он заспавнен
И выглядит это все как кровь из глаз))))А разве нельзя узнать когда он возродился? В hake.me вроде было такое, когда рошан возраждался писало, что он заспавнен
наебашут хуйни из std а потом думают че код начинает крашить хуй знает из за чего умники млявозможно стоит перестать strcmp и const char* использовать в 2022 году.
std::string_view CGameEvent::GetName()//c++17
{
if(name_ptr_const_char) return {name_ptr_const_char};
return {};//нельзя из нуллптр конструировать, пустой возвращай если нуллптр
}
...
или еще лучше регай ивент листенеры и бегай в хуке по ним и давай ивенты тому кому они нужны(aka dispatch)C++:bool hkFireEventClientSide(CGameEventManager* thisptr, CGameEvent* event) { if (const std::string_view eventName = event->GetName(); !eventName.empty()) { if(eventName == "dota_roshan_kill") GameData.RoshanKillTime = vmt.GameRules->GameTime(); ... } return oFireEventClientSide(thisptr, event); }
C++:bool hkFireEventClientSide(CGameEventManager* thisptr, CGameEvent* event) { if (const std::string_view eventName = event->GetName(); !eventName.empty()) { if(EventManager.Dispatch(eventName))// => //bool consume = false; //for each event in event_list { // if(event.name == eventName) { // event.callback(); // if(!consume) // consume = event.ShouldConsume(); // } //} //return consume; return true; } return oFireEventClientSide(thisptr, event); } ... class RoshanKillEventListener : public EventListener<RoshanKillEventListener, "dota_roshan_kill"> { public: static void callback() noexcept { GameData.RoshanKillTime = vmt.GameRules->GameTime(); } static void ShouldConsume() noexcept { return true; } } ...
Действительно, ведь в Сишном коде так мало моментов когда может произойти утечка памяти. Что уж там. Нахуя С++ развивается. Давайте откатимся на С++98 и будем сидеть, хуи дрочить на нем?наебашут хуйни из std а потом думают че код начинает крашить хуй знает из за чего умники мля
Как я понял нужно сделать вотПожалуйста, авторизуйтесь для просмотра ссылки.GameEvents, добавляешь листенера на dota_roshan_kill. В момент убийства чекаешь внутреигровое время и считаешь от этого времени минимальное время возрождения и максимальное.
Профит?
Я не ебу, что у тебя там за паттерн, но я надеюсь ты не тупо пастишь откуда хуй пойми в надежде что все еще рабочее?Как я понял нужно сделать вотПожалуйста, авторизуйтесь для просмотра ссылки..
Паттерн находит, но получаю это исключение:
Пожалуйста, авторизуйтесь для просмотра ссылки.Cорян, шо так туплю)
const std::uintptr_t* player_info_changed = *reinterpret_cast<std::uintptr_t**>(sdk::g_client) + 13;
//13th function in Source2Client vtable
if (!player_info_changed)
throw std::runtime_error("Failed to obtain Interface #5:4");
addr_start = *player_info_changed + 0x5B;
sdk::g_gameeventmanager = *reinterpret_cast<CGameEventManager**>(g_tools->GetAbsoluteAddress(
addr_start));
if (!sdk::g_gameeventmanager)
throw std::runtime_error("Failed to obtain Interface #5:4.");
Нет, только класс взял оттуда, паттерн сам нашёлно я надеюсь ты не тупо пастишь откуда хуй пойми в надежде что все еще рабочее?
CGameEventListener2* gameEventListener;//отсутствие инита = дефолт инит = зеро инит т.к. нон-класс + статик = nullptrКак я понял нужно сделать вотПожалуйста, авторизуйтесь для просмотра ссылки..
Паттерн находит, но получаю это исключение:
Пожалуйста, авторизуйтесь для просмотра ссылки.Cорян, шо так туплю)
Чтобы что? Зачем переделывать 60к строк кода, чтобы там был не "си стайл", а всратый стрингвью, который во всем хуже конст чара?возможно стоит перестать strcmp и const char* использовать в 2022 году.
std::string_view CGameEvent::GetName()//c++17
{
if(name_ptr_const_char) return {name_ptr_const_char};
return {};//нельзя из нуллптр конструировать, пустой возвращай если нуллптр
}
...
или еще лучше регай ивент листенеры и бегай в хуке по ним и давай ивенты тому кому они нужны(aka dispatch)C++:bool hkFireEventClientSide(CGameEventManager* thisptr, CGameEvent* event) { if (const std::string_view eventName = event->GetName(); !eventName.empty()) { if(eventName == "dota_roshan_kill") GameData.RoshanKillTime = vmt.GameRules->GameTime(); ... } return oFireEventClientSide(thisptr, event); }
C++:bool hkFireEventClientSide(CGameEventManager* thisptr, CGameEvent* event) { if (const std::string_view eventName = event->GetName(); !eventName.empty()) { if(EventManager.Dispatch(eventName))// => //bool consume = false; //for each event in event_list { // if(event.name == eventName) { // event.callback(); // if(!consume) // consume = event.ShouldConsume(); // } //} //return consume; return true; } return oFireEventClientSide(thisptr, event); } ... class RoshanKillEventListener : public EventListener<RoshanKillEventListener, "dota_roshan_kill"> { public: static void callback() noexcept { GameData.RoshanKillTime = vmt.GameRules->GameTime(); } static void ShouldConsume() noexcept { return true; } } ...
ну лично я считаю наоборот - конст чар хуже стрингвью. конст чар это ваще прошлый век если порассуждать. стрингвью - это указатель на память и РАЗМЕР. конст чар же в себе никакой информации о размере не несёт. null-terminated строки это ваще мусор впринципе который просто тащится из прошлого столетия и токо для лоу-левел хуиты юзается. строки хранящие размер гораздо эффективнее, тебе не надо как дауну всякие strlen и тд юзать(+ ты заранее(не итерируя строку до конца пока 0 не встретишь как в случае с конст чаром) можешь память зарезервировать ибо ты знаешь сколько строка весит). ТАКЖЕ этот же самый string_view очень ахуенно используется и в компайл-тайм программировании. ТАКЖЕ есть operator== который позволяет сравнивать имена привычным синтаксисом a == "b". и вдобавок к этому operator== еще и работает так что если std::string_view пустой то он сразу false возвращаетЧтобы что? Зачем переделывать 60к строк кода, чтобы там был не "си стайл", а всратый стрингвью, который во всем хуже конст чара?
Нихуя не понимаю твоей притензии.
bool hkFireEventClientSide(CGameEventManager* thisptr, CGameEvent* event) {
if(event->GetName() == "dota_roshan_kill")//даже если name_ptr = нуллптр, то ваще похуй, вернётся пустой std::string_view(используя код в прошлом посте) и он сразу выдаст false в оператор==
GameData.RoshanKillTime = vmt.GameRules->GameTime();
...
return oFireEventClientSide(thisptr, event);
}
Эмм, а в чём их проблема?возможно стоит перестать strcmp и const char* использовать в 2022 году.
А, ладно, увидел.Эмм, а в чём их проблема?
так в том то и суть что разница с точки зрения имплементации небольшая(стрингвью это тот же самый старый добрый конст чар и еще размер)(= совместимость туда сюда и обратно), но при этом у тебя еще и новые плюхи. у тебя есть всё старое(ты можешь в апи передавать свои конст чары), и при этом можешь еще и новое что-то делать(substr например пиздец какая имба, легко быстро удобно и никакого копирования). но с другой стороны функциональная разница между ними очень большая хотя бы потому что конст чар это число а стрингвью это класс(две статьи на стаковерфлове тебе не объяснят всей сути, тем более что стрингвью активно используется и эволюционируется еще дальше в с++20 и в с++23 и становится еще лучше). стрингвью создан для того чтобы те же самые вещи которые ты делаешь конст чаром можно было бы сделать с такой же производительностью и гораздо удобнее и гибче. std::string тоже имеет всякие утилиты типа substr и тд но они нихуя не эффективные по производительности. string_view это просто коллекция все тех же самых утилит но которые ничем не уступают голому С(потому что они под колпаком этот голый С и юзают - это просто оберточка). просто не понимаю почему бы не задействовать полный потенциал языка который тебе дали специально чтобы ты не напрягался.А, ладно, увидел.
Странное и максимально токсичное мнение.
Я почитал буквально два тредда на стаковерфлоу, и, похоже, что разница между ними очень даже небольшая. И стандартный вариант с конст чаром иногда даже выигрывает.
Да... звучит убедительно. Ну, видимо настало время мне ебейшую кучу кода переписать и перестать уже быть консерватором.ну лично я считаю наоборот - конст чар хуже стрингвью. конст чар это ваще прошлый век если порассуждать. стрингвью - это указатель на память и РАЗМЕР. конст чар же в себе никакой информации о размере не несёт. null-terminated строки это ваще мусор впринципе который просто тащится из прошлого столетия и токо для лоу-левел хуиты юзается. строки хранящие размер гораздо эффективнее, тебе не надо как дауну всякие strlen и тд юзать(+ ты заранее(не итерируя строку до конца пока 0 не встретишь как в случае с конст чаром) можешь память зарезервировать ибо ты знаешь сколько строка весит). ТАКЖЕ этот же самый string_view очень ахуенно используется и в компайл-тайм программировании. ТАКЖЕ есть operator== который позволяет сравнивать имена привычным синтаксисом a == "b". и вдобавок к этому operator== еще и работает так что если std::string_view пустой то он сразу false возвращает
то есть по факту можно сделать даже так
ТАКЖЕ там есть substr(который не трогает память не копирует и нихуя не делает такого) find и прочая удобная хуита. ТАКЖЕ есть конструкция из рейнджей(c++23. то есть можно из std::vector сделать спокойно std::string_view) и интеграция со всякой рейндж хуитой(c++20. можно спокойно перевернуть строку например(std::ranges::views::reverse), или же перевести в верхний нижний регистр не трогая при этом саму память(std::ranges::views::transform) и тд и тп). блядь да там ваще всё есть, лол. конст чар это ваще мусор, он кроме апи нигде больше и не должен юзаться. в самом коде конкретно твоей приложухи(ну всмысле в компонентах которые не связаны напрямую с самим пространством игры) конст чар нахуй не нужен. и я уже не говорю про то что перед strcmp можно забыть восклицательный знак поставить( if (!strcmp()) ) и вот тебе халявный баг. с == такой хуйни уже не будетC++:bool hkFireEventClientSide(CGameEventManager* thisptr, CGameEvent* event) { if(event->GetName() == "dota_roshan_kill")//даже если name_ptr = нуллптр, то ваще похуй, вернётся пустой std::string_view(используя код в прошлом посте) и он сразу выдаст false в оператор== GameData.RoshanKillTime = vmt.GameRules->GameTime(); ... return oFireEventClientSide(thisptr, event); }
тебе взяли strcmp strstr и прочий шлак завернули красиво. нужен конст чар - ебашь .data() и вот он тебе. не забывай - конст чар это даже не строка. это просто число. работать с голым числом когда тебе нужна строка - это С. С говно по одной простой причине - если он не говно, зачем люди придумывают другие языки? я не говорю что с++ идеальный язык, он тоже дерьмо, но всяко лучше чем С
конечно код надо переписывать, а как ты думал? если ты не хочешь апдейтить свой продукт то получается что он говно. апдейт это не просто фичу добавить. апдейт это прежде всего перепись и модернизация основных и базовых компонентов и дизайнов ПО. выходят новые технологии, новые фичи. ты становишься более опытный как программист, находишь новые способы решения задач. я раньше тоже много вещей делал в С-стайле а потом стал понимать что есть варианты более эффективные более простые более мощные более гибкие более управляемые. как по мне, тупо сидеть на месте и мусолить старое говно это слишком консервативно. можно с тем же успехом комп из лампочек собрать пойти и на нем ебашить. или еще лучше на абаке сидеть высчитывать.
у меня например 90к строк именно чисто модулярного кода(.ixx, модули из с++20. то есть код написанный под самый современный манер), и абсолютно все что у меня там написано - я считаю мусором. код полностью рабочий, мощный, классный, но в нем все равно есть проблемы и есть места где нужны улучшения. и точно так же я всё это говно буду заново переписывать, получая на выходе всё более качественные либы и как следствее более корректный функционал. я бы мог сидеть и тупо дрочить его вечность, код то ведь рабочий. решает задачи успешно. но это вовсе не значит что он идеальный и его не надо улучшать.
в общем нихуя не понимаю почему стрингвью "всратый". и точно не понимаю где он хуже конст чара(ты в любой момент конст чар можешь достать обратно через .data()). еще скажи что ты std::string не юзаешь)) std::string_view - точно такой же std::string только не хранящий в себе сами символы, а ссылающийся на чужую память. из std::string_view можно в любой момент сконструировать std::string или же наоборот из std::string можно спокойно сделать std::string_view.
возможно ты просто как-то не так использовал string_view?
да и в конце концов, ты всегда можешь по-тихоньку переписывать(либо всё так оставить и последующий код уже на другой манер писать), начав с конкретно этого куска кода. не обязательно же весь код сразу переделывать.
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz