Модератор форума
-
Автор темы
- #1
Суть заключается в том, что вы пишите в чат сообщение , а ваш (или не ваш ) чит переводит на нужный язык.
Пример:
Для начала пишем в чат: @ru-en
1 - Язык на котором пишем.
2 - На какой перевести.
После этого можем писать "Привет", а на выходе получим "Hello"
chat_translator.h
chat_translator.cpp
hooks.cpp
Добавить кусок кода в протобаф
P.s Прошу указать на ошибки в тексте, если таковые есть.
P.p.s Еще нам понадобится
Пример:
Для начала пишем в чат: @ru-en
1 - Язык на котором пишем.
2 - На какой перевести.
После этого можем писать "Привет", а на выходе получим "Hello"
chat_translator.h
C++:
class chat_translator : public singleton<chat_translator> {
public:
auto client_cmd(const char* cmd, std::string& buf) -> int;
auto dispatch_user_message(int entity_id, const std::string& msg) -> void;
auto thread_tick() -> void;
public:
auto translate(const std::string& text, const std::string& lang) -> std::string;
private:
std::string lang_me_{""};
std::string lang_other_{""};
struct msg_t {
int entity_id;
std::string msg;
};
std::deque<msg_t> msgs_;
};
enum EChatTranslatorResult {
ECTR_None,
ECTR_SetLang,
ECTR_Translate
};
C++:
#include "stdafx.h"
#include "chat_translator.h"
#include "json.hpp"
#include <wininet.h>
#pragma comment(lib, "wininet.lib")
auto chat_translator::client_cmd(const char* cmd, std::string& buf) -> int {
if (auto command = std::string_view(cmd); !command.compare(0, 3, "say") && strstr(cmd, "\"")) {
auto tmp = std::string(strstr(cmd, "\""));
auto msg = tmp.substr(1, tmp.size() - 2);
bool is_say_team = command[3] == '_';
bool set_lang_local = msg[0] == '@';
bool set_lang_other = msg[0] == '#';
if (set_lang_local || set_lang_other) {
auto lang = msg.substr(1);
auto& lang_ = set_lang_local ? lang_me_ : lang_other_;
lang_ = lang;
char print_msg[255];
sprintf_s(print_msg, "[Auto - Translator(%s)] %s",
set_lang_local ? "Me" : "Other",
lang.empty() ? "disabled" : lang.data());
chud_chat::get()->printf(print_msg);
return ECTR_SetLang;
}
if (auto translated = translate(msg.data(), lang_me_); !translated.empty()) {
buf = (is_say_team ? std::string("say_team \"") : std::string("say \"")) + translated + std::string("\"");
return ECTR_Translate;
}
}
return ECTR_None;
}
auto chat_translator::dispatch_user_message(int entity_id, const std::string& msg) -> void {
if (lang_other_.empty())
return;
if (entity_id != sdk::g_engine_client->get_local_player() - 1) {
msgs_.push_back(msg_t { entity_id, msg });
}
}
auto chat_translator::thread_tick() -> void {
while (!msgs_.empty()) {
auto msg = msgs_.front();
msgs_.pop_front();
if (auto ent = cplayer::get_player(msg.entity_id); ent) {
if (auto translated = translate(msg.msg, lang_other_); !translated.empty()) {
auto nick = ent->get_player_info().szName;
auto team = ent->m_iTeamNum();
if (team == TEAM_COUNTER_TERRORIST)
chud_chat::get()->printf(" \x03[%s]: \x0A%s", nick, translated.c_str());
else if (team == TEAM_TERRORIST)
chud_chat::get()->printf(" \x09[%s]: \x0A%s", nick, translated.c_str());
}
}
}
}
auto chat_translator::translate(const std::string& text, const std::string& lang) -> std::string {
// https://github.com/nlohmann/json
using json = nlohmann::json;
const std::string url = "https://translate.yandex.net/api/v1.5/tr.json/translate";
const std::string key = "Ваш апи ключ";
auto _url = url + std::string("?key=") + key;
_url += std::string("&text=") + text;
_url += std::string("&lang=") + lang;
if (auto connect = InternetOpenA("GoogleChrome", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); connect) {
if (auto address = InternetOpenUrlA(connect, _url.c_str(), NULL, 0, INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_KEEP_CONNECTION, 0); address) {
char data_received[1024];
DWORD number_of_bytes_read = 0;
if (InternetReadFile(address, data_received, 1024, &number_of_bytes_read) && number_of_bytes_read) {
std::string output(data_received, number_of_bytes_read);
InternetCloseHandle(address);
InternetCloseHandle(connect);
auto json = json::parse(output.c_str());
//std::cout << json.dump() << std::endl;
auto code = json["code"].get<int>();
if (code == 200)
return json["text"][0].get<std::string>();
}
}
else {
InternetCloseHandle(connect);
}
}
return std::string();
}
hooks.cpp
C++:
auto __fastcall hooks::hk_dispatch_user_message(void *thisptr, void*, unsigned int msg_type, unsigned int unk1, unsigned int nBytes, const void *msg_data) -> bool {
static const auto o_dispatch_user_message = mgr.get_original<dispatch_user_message_fn>("dispatch_user_message");
if (msg_type == CS_UM_SayText2) {
auto [entity_id, chat_msg] = protobuffs::parse_chat_message(nBytes, msg_data);
chat_translator::get().dispatch_user_message(entity_id, chat_msg);
}
return o_dispatch_user_message(thisptr, msg_type, unk1, nBytes, msg_data);
}
auto __fastcall hooks::hk_client_cmd(void* ecx, void*, const char* cmd) -> void {
static const auto o_client_cmd = mgr.get_original<client_cmd_fn>("client_cmd");
std::string buf;
if (auto result = chat_translator::get().client_cmd(cmd, buf); result == ECTR_Translate) {
return o_client_cmd(ecx, buf.c_str());
}
else if (result == ECTR_SetLang) {
return;
}
o_client_cmd(ecx, cmd);
}
C++:
//https://github.com/bananasss00/Protobuff-Parser-Writer
#define CS_UM_SayText2 6
make_struct(CCSUsrMsg_SayText2, 5)
make_field(ent_idx, 1, TYPE_INT32)
make_field(chat, 2, TYPE_BOOL)
make_field(msg_name, 3, TYPE_STRING)
make_field(params, 4, TYPE_STRING)
make_field(textallchat, 5, TYPE_BOOL)
};
auto parse_chat_message::parse_chat_message(unsigned int nBytes, const void* msg_data) -> std::tuple<int, std::string> { // return: [entity_id, chat_msg]
CCSUsrMsg_SayText2 msg((void*)msg_data, nBytes);
int ent_idx = msg.get_ent_idx().Int32() - 1;
auto text = msg.getAll_params().at(1).String();
auto textallchat = msg.get_textallchat().Bool();
return { ent_idx, text };
}
P.s Прошу указать на ошибки в тексте, если таковые есть.
P.p.s Еще нам понадобится
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Последнее редактирование: