Вопрос SendChat

Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
321
Реакции[?]
24
Поинты[?]
12K
1. Как вызвать функцию отправки сообщения в чат? (Связанна ли она с Игроком или Юнитом которым я управляю) ?

2. Как узнать кто из вражеских героев умер?
( Я думал типа сделать проверку if(entitylifestate == мёртв) то Действия, но оно будет вызыватся всегда ибо юнит мёртв. хотелось бы чтобы дейтсвие вызывалось один раз, как коллбэк.

3. Что можно с этим делать? Я всеравно не понял, как ИСПОЛЬЗОВАТЬ протобафы.
C++:
enum DOTA_CHAT_MESSAGE {
    CHAT_MESSAGE_INVALID = -1;
    CHAT_MESSAGE_HERO_KILL = 0;
    CHAT_MESSAGE_HERO_DENY = 1;
    CHAT_MESSAGE_BARRACKS_KILL = 2;
    CHAT_MESSAGE_TOWER_KILL = 3;
    CHAT_MESSAGE_TOWER_DENY = 4;
    CHAT_MESSAGE_FIRSTBLOOD = 5;
    CHAT_MESSAGE_STREAK_KILL = 6;
    CHAT_MESSAGE_BUYBACK = 7;
    CHAT_MESSAGE_AEGIS = 8;
    CHAT_MESSAGE_ROSHAN_KILL = 9;
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
775
Реакции[?]
331
Поинты[?]
63K
1.
как вери фаст костыль - юзай ExecuteCommand("say <shit>")
либо чекай сурсы ксго тф2 и чекай на юс в ксго разделе(в доте наверно так же) / либо чекай дилибы
2.
я тебе уже отвечал:
ну по сути когда пакет с сервака прилетел с изменением нетвара m_lifestate - это и есть момент смерти/оживания юнита. поищи какие-нибудь коллбеки на этот нетвар(как коллбек OnTeamVisibilityChanged это коллбек на пакет который меняет нетвар m_iTeamVisibility чето там, такой же поищи на m_lifestate) и кайфуй
как костыль сделай свою говносистему коллбеков. кешируй ласт значение(допустим юнит живой) и потом каждый кадр чекай новое значение(юнит мертвый) и сравнивай со старым. олд_юнит_живой != нью_юнит_мертвый -> коллбек(нью_юнит_мертвый)
3.
это нетчан(канал внутри матча клиент-сервер. то есть здесь непосредственное общения игрового сервера(сервак на котором матч) и тебя как игрока):
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
это координатор(ксго)(тут уже общение тебя как стим пользователя с координатором, он тебе ищет игры, отвечает за твой шмот со стима и тд и тп)
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
321
Реакции[?]
24
Поинты[?]
12K
Кароч пробовал вызвать вовт так SendMSG(CBaseEntity* ent, 1,ent->GetIndex(),"Hello there");
НЕ КРАШИТ, но ничего не произошло. В консоли тоже смотрел(в надежде поискать что либо типо tried to execute ..... но пусто тоже)1646421207186.png
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
775
Реакции[?]
331
Поинты[?]
63K
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
321
Реакции[?]
24
Поинты[?]
12K
C++:
 if (!SendMSG)
 {
 SendMSG = *(_SendMessageToChat*)(*(ui*)ent + 0x910); // *(ent*) это будет вмт таблица
     // 0x910 смотрел в дебаггере, .
 }
 SendMSG(ent, 1, ent->GetUnitIndex(), "Hello Mothrfuckers");
Я хз, ну вроде бы функция та если по скринам так смотреть. Ну я смотрел в ВМТ плеера на 910 там xor shit,shit ; retтоесть я уверен что это уентити есть
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
775
Реакции[?]
331
Поинты[?]
63K
C++:
 if (!SendMSG)
{
SendMSG = *(_SendMessageToChat*)(*(ui*)ent + 0x910); // *(ent*) это будет вмт таблица
     // 0x910 смотрел в дебаггере, .
}
SendMSG(ent, 1, ent->GetUnitIndex(), "Hello Mothrfuckers");
Я хз, ну вроде бы функция та если по скринам так смотреть. Ну я смотрел в ВМТ плеера на 910 там xor shit,shit ; retтоесть я уверен что это уентити есть
ent - ?
что такое откуда берется, фулл код в студию
ну и поставь бп там на то что ты заскринил в иде и чекни на какую энтити там +0x910 вызывается. мб ты функу вызываешь не на ту энтити.
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
321
Реакции[?]
24
Поинты[?]
12K
ent - ?
что такое откуда берется, фулл код в студию
ну и поставь бп там на то что ты заскринил в иде и чекни на какую энтити там +0x910 вызывается. мб ты функу вызываешь не на ту энтити.
Я ставил БП на функу которая вызывается ( +910) она вызывается каждую секунду и я не могу даже в доте чат открыть.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
775
Реакции[?]
331
Поинты[?]
63K
Я ставил БП на функу которая вызывается ( +910) она вызывается каждую секунду и я не могу даже в доте чат открыть.
так мб стоит поставить на нужное место где вызывается +0x910? а не на саму 0x910?
"ну и поставь бп там на то что ты заскринил в иде". ты скинул скрин. вот туда бряку и поставь. или я чето неправильно понял? или то что ты заскринил тоже каждую секунду вызывается?
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
321
Реакции[?]
24
Поинты[?]
12K
1646486444537.png
НО, вписав в дебаггер хреф просто say то у меня выскочило гдето 5 хрефов(а на сей-тим только 1 ) ну и кароч решил я посмотреть что там, потыкал и наткнулся на один где я поставил брекпоинт и когда я нажал шифт+ентер(глобалчат) у меня сработал брекпоинт.
Крч полазил в ИДЕ нашел это место, только это точно не оно(не связанное с отправкой сообщения в чат)1646487876226.png
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
321
Реакции[?]
24
Поинты[?]
12K
Пробовал я крч через ClientCMDUrnestricted только ничего не вышло( не крашит, не вылетает но ничего не происходит ) 1646492294727.png
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
775
Реакции[?]
331
Поинты[?]
63K
Пробовал я крч через ClientCMDUrnestricted только ничего не вышло( не крашит, не вылетает но ничего не происходит ) Посмотреть вложение 195071
там кроме анрестриктед другие(
Пожалуйста, авторизуйтесь для просмотра ссылки.
) есть почекай(
Пожалуйста, авторизуйтесь для просмотра ссылки.
).
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
321
Реакции[?]
24
Поинты[?]
12K
Окей, у меня работает норм 36-й индекс(это ExecuteClientCMD). Походу через него не получиться врубить sv_cheats 1. ( Пробовал делать вызов так CMD(this,1,"sv_cheats") u CMD(this,"sv_cheats 1") не работает.

Можно ли вывести в чат имя героя таким способом CMD("My hero is %s",ent->GetName() ) ; ?
Прост я пробовал но ничего не выводит, выводит только пустые сообщения типа (say Hello)

А и не работает еще почему-то через этот ExecuteClientCMD команда say_team
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
775
Реакции[?]
331
Поинты[?]
63K
Окей, у меня работает норм 36-й индекс(это ExecuteClientCMD). Походу через него не получиться врубить sv_cheats 1. ( Пробовал делать вызов так CMD(this,1,"sv_cheats") u CMD(this,"sv_cheats 1") не работает.

Можно ли вывести в чат имя героя таким способом CMD("My hero is %s",ent->GetName() ) ; ?
Прост я пробовал но ничего не выводит, выводит только пустые сообщения типа (say Hello)

А и не работает еще почему-то через этот ExecuteClientCMD команда say_team
а про форматирование строк ты не слышал?
C++:
void log(const std::string_view& str)
{
    std::cout << str << std::endl;
}

int main()
{
    log(std::format(R"(say "My hero name is {}")", "npc_dota_hero_shit"));
}
(принтф это двадцатый век.
с форматом больше фана(>=c++20 only)
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
C++:
struct Vector3
{
    float x{};
    float y{};
    float z{};
};

template <>
struct std::formatter<Vector3> : std::formatter<std::string> {//copypasta s interneta
    auto format(const Vector3& vec, format_context& ctx) {
        return formatter<string>::format(
            std::format("[x:{:.2f}, y:{:.2f}, z:{:.2f}]", vec.x, vec.y, vec.z), ctx);
    }
};

int main()
{
    constexpr Vector3 my_vec{1.234567f, 2.345678f, 3.456789f};
    std::cout << std::format("my vector: {}", my_vec) << std::endl;
}
гивает my vector: [x:1.23, y:2.35, z:3.46]
)
св читс можешь напрямую конвар просто поменять
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
321
Реакции[?]
24
Поинты[?]
12K
Не очень понял с твоим форматом, оно применимо на команду say ?
Я заметил что не работают команды с нижним подчеркиванием( тоесть say_team и другие)
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
775
Реакции[?]
331
Поинты[?]
63K
Не очень понял с твоим форматом, оно применимо на команду say ?
Я заметил что не работают команды с нижним подчеркиванием( тоесть say_team и другие)
...
формат делает из нескольких строк одну.
было
say "My hero name is {}" и npc_dota_hero_shit
стало
say "My hero name is npc_dota_hero_shit"
вот это говно ты уже передаешь в функу. кавычки нужны чтобы символизировать что дальше идет строка а не некст аргумент к команде(в доте когда пишешь say hello world токо hello напишет, нужно писать команду(в консоли прямо так и пишешь) say "hello world". ну по крайней мере я так помню. или это токо на бинды распространяется(bind x "say shit"). или я долбоёб. или это в другой игре на сурс движке такая проблема. бля кароче тести я не помню). эскейпишь их / юзаешь raw string literal
про формат это я к тому что ты там %s написал. это и есть форматирование.
 
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Походу через него не получиться врубить sv_cheats 1
Это вообще так не работает и не должно, иначе любой мог бы просто в паблике sv_cheats юзать.
Либо патчи, либо конвар напрямую меняй. Бери VEngineCvar007 из tier0.dll, это класс ICvar.

C++:
#include "IAppSystem.h"

class ConCommandBase {
public:
    virtual void DESTROY1() = 0;
    virtual void DESTROY2() = 0;
    virtual bool IsCommand(void) = 0;
    virtual bool IsBoundedVar(void) = 0;
    virtual bool IsFlagSet(long long) = 0;
    virtual void AddFlags(long long) = 0;
    virtual void RemoveFlags(long long) = 0;
    virtual long long GetFlags(void) = 0;
    virtual const char* GetName(void) = 0;
    virtual const char* GetHelpText(void) = 0;
    virtual bool IsRegistered(void) = 0;
    virtual void* GetDLLIdentifier(void) = 0;
    virtual void Create(char const*, char const*, long long) = 0;
    virtual void Init(void) = 0;
    virtual const char* GetBaseName(void) = 0;
    virtual int GetSplitScreenPlayerSlot(void) = 0;
    virtual void SetValue(char const*) = 0;
    virtual void SetValue(float) = 0;
    virtual void SetValue(int) = 0;
    virtual void SetValue(ColorRGBA) = 0;
    virtual float GetFloat(void) = 0;
    virtual int GetInt(void) = 0;
    virtual bool GetBool(void) = 0;
    virtual void InternalSetValue(char const*) = 0;
    virtual void InternalSetFloatValue(float) = 0;
    virtual void InternalSetIntValue(int) = 0;
    virtual void InternalSetColorValue(ColorRGBA) = 0;
    virtual void ClampValue(float&) = 0;
    virtual void ChangeStringValue(char const*, float) = 0;
    virtual void Create() = 0;
};

class ICvar : public IAppSystem {
public:
    virtual int AllocateDLLIdentifier(void) = 0;
    virtual void RegisterConCommand(ConCommandBase*) = 0;
    virtual void UnregisterConCommand(ConCommandBase*) = 0;
    virtual void UnregisterConCommands(int) = 0;
    virtual const char* GetCommandLineValue(char const*) = 0;
    virtual ConCommandBase* FindCommandBase(char const*) = 0;
    virtual const ConCommandBase* FindCommandBase2(char const*) = 0;
    virtual ConVar* FindVar(char const*) = 0;
    virtual const ConVar* FindVar2(char const*) = 0;
    virtual void* FindCommand(char const*) = 0;
    virtual const void* FindCommand2(char const*) = 0;
    virtual void InstallGlobalChangeCallback() = 0;
    virtual void RemoveGlobalChangeCallback() = 0;
    virtual void CallGlobalChangeCallbacks(ConVar*, char const*, float) = 0;
    virtual void RevertFlaggedConVars(long long) = 0;
    virtual void InstallCVarQuery(void* ICvarQuery) = 0;
    virtual void SetMaxSplitScreenSlots(int) = 0;
    virtual int GetMaxSplitScreenSlots(void) = 0;
    virtual void AddSplitScreenConVars(void) = 0;
    virtual void RemoveSplitScreenConVars(int) = 0;
    virtual void FactoryInternalIterator(void) = 0;
    virtual void InstallConVarListener(void* IConVarListener) = 0;
    virtual void RemoveConVarListener(void* IConVarListener) = 0;
    virtual void GetConVarDetails() = 0;
    virtual void ResetConVarsToDefaultValues(char const*) = 0;
    virtual void TakeConVarSnapshot(void) = 0;
    virtual void ResetConVarsToSnapshot(void* ConVarSnapshot_t__) = 0;
    virtual void DestroyConVarSnapshot(void* ConVarSnapshot_t__) = 0;
    virtual bool IsValid(void) = 0;
    virtual void* GetSomething(void) = 0;
};
После инжекта находи нужные конвары, потом когда в катку заходишь -- меняй значения.
Таким же образом камеру-хуямеру, партикли, че хочешь, короче.
C++:
ConCommandBase* sv_cheats = vmt.cvar->FindCommandBase("sv_cheats"); // Находим
sv_cheats->SetValue(1); // Меняем
Хотя партикли, конечно, прикольней через хук SetRenderingEnabled рисовать.
C++:
typedef void(*SetRenderingEnabledFn)(CParticleCollection*, bool);
SetRenderingEnabledFn oSetRenderingEnabled;

void hkSetRenderingEnabled(CParticleCollection* thisptr, bool state) {
    oSetRenderingEnabled(thisptr, true);
}
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
321
Реакции[?]
24
Поинты[?]
12K
Это вообще так не работает и не должно, иначе любой мог бы просто в паблике sv_cheats юзать.
Либо патчи, либо конвар напрямую меняй. Бери VEngineCvar007 из tier0.dll, это класс ICvar.

C++:
#include "IAppSystem.h"

class ConCommandBase {
public:
    virtual void DESTROY1() = 0;
    virtual void DESTROY2() = 0;
    virtual bool IsCommand(void) = 0;
    virtual bool IsBoundedVar(void) = 0;
    virtual bool IsFlagSet(long long) = 0;
    virtual void AddFlags(long long) = 0;
    virtual void RemoveFlags(long long) = 0;
    virtual long long GetFlags(void) = 0;
    virtual const char* GetName(void) = 0;
    virtual const char* GetHelpText(void) = 0;
    virtual bool IsRegistered(void) = 0;
    virtual void* GetDLLIdentifier(void) = 0;
    virtual void Create(char const*, char const*, long long) = 0;
    virtual void Init(void) = 0;
    virtual const char* GetBaseName(void) = 0;
    virtual int GetSplitScreenPlayerSlot(void) = 0;
    virtual void SetValue(char const*) = 0;
    virtual void SetValue(float) = 0;
    virtual void SetValue(int) = 0;
    virtual void SetValue(ColorRGBA) = 0;
    virtual float GetFloat(void) = 0;
    virtual int GetInt(void) = 0;
    virtual bool GetBool(void) = 0;
    virtual void InternalSetValue(char const*) = 0;
    virtual void InternalSetFloatValue(float) = 0;
    virtual void InternalSetIntValue(int) = 0;
    virtual void InternalSetColorValue(ColorRGBA) = 0;
    virtual void ClampValue(float&) = 0;
    virtual void ChangeStringValue(char const*, float) = 0;
    virtual void Create() = 0;
};

class ICvar : public IAppSystem {
public:
    virtual int AllocateDLLIdentifier(void) = 0;
    virtual void RegisterConCommand(ConCommandBase*) = 0;
    virtual void UnregisterConCommand(ConCommandBase*) = 0;
    virtual void UnregisterConCommands(int) = 0;
    virtual const char* GetCommandLineValue(char const*) = 0;
    virtual ConCommandBase* FindCommandBase(char const*) = 0;
    virtual const ConCommandBase* FindCommandBase2(char const*) = 0;
    virtual ConVar* FindVar(char const*) = 0;
    virtual const ConVar* FindVar2(char const*) = 0;
    virtual void* FindCommand(char const*) = 0;
    virtual const void* FindCommand2(char const*) = 0;
    virtual void InstallGlobalChangeCallback() = 0;
    virtual void RemoveGlobalChangeCallback() = 0;
    virtual void CallGlobalChangeCallbacks(ConVar*, char const*, float) = 0;
    virtual void RevertFlaggedConVars(long long) = 0;
    virtual void InstallCVarQuery(void* ICvarQuery) = 0;
    virtual void SetMaxSplitScreenSlots(int) = 0;
    virtual int GetMaxSplitScreenSlots(void) = 0;
    virtual void AddSplitScreenConVars(void) = 0;
    virtual void RemoveSplitScreenConVars(int) = 0;
    virtual void FactoryInternalIterator(void) = 0;
    virtual void InstallConVarListener(void* IConVarListener) = 0;
    virtual void RemoveConVarListener(void* IConVarListener) = 0;
    virtual void GetConVarDetails() = 0;
    virtual void ResetConVarsToDefaultValues(char const*) = 0;
    virtual void TakeConVarSnapshot(void) = 0;
    virtual void ResetConVarsToSnapshot(void* ConVarSnapshot_t__) = 0;
    virtual void DestroyConVarSnapshot(void* ConVarSnapshot_t__) = 0;
    virtual bool IsValid(void) = 0;
    virtual void* GetSomething(void) = 0;
};
После инжекта находи нужные конвары, потом когда в катку заходишь -- меняй значения.
Таким же образом камеру-хуямеру, партикли, че хочешь, короче.
C++:
ConCommandBase* sv_cheats = vmt.cvar->FindCommandBase("sv_cheats"); // Находим
sv_cheats->SetValue(1); // Меняем
Хотя партикли, конечно, прикольней через хук SetRenderingEnabled рисовать.
C++:
typedef void(*SetRenderingEnabledFn)(CParticleCollection*, bool);
SetRenderingEnabledFn oSetRenderingEnabled;

void hkSetRenderingEnabled(CParticleCollection* thisptr, bool state) {
    oSetRenderingEnabled(thisptr, true);
}
Не слышал о SetarenderingEnavled. Что такое? с чем едят? Не мог бы скрин кинуть как выглядит?
 
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Сверху Снизу