minecraft-pi-reborn/mods/src/chat/chat.cpp

102 lines
3.8 KiB
C++
Raw Permalink Normal View History

2021-02-16 17:26:40 +00:00
#include <string>
2021-02-22 03:16:05 +00:00
#include <cstring>
2021-02-16 17:26:40 +00:00
#include <cstdio>
#include <vector>
2024-05-09 05:25:53 +00:00
#include <libreborn/libreborn.h>
2021-09-12 03:18:12 +00:00
#include <symbols/minecraft.h>
2021-02-16 17:26:40 +00:00
2022-06-25 21:30:08 +00:00
#include <mods/init/init.h>
#include <mods/feature/feature.h>
#include "chat-internal.h"
#include <mods/chat/chat.h>
2021-02-16 17:26:40 +00:00
// Send API Command
2024-01-06 11:30:23 +00:00
std::string chat_send_api_command(Minecraft *minecraft, std::string str) {
2024-04-03 07:19:12 +00:00
ConnectedClient client;
2021-02-16 17:26:40 +00:00
client.sock = -1;
client.str = "";
client.time = 0;
2024-01-06 11:30:23 +00:00
CommandServer *command_server = minecraft->command_server;
2024-04-02 23:22:01 +00:00
if (command_server != nullptr) {
2024-05-15 09:02:19 +00:00
return command_server->parse(&client, &str);
2022-06-27 01:17:52 +00:00
} else {
return "";
2021-02-16 17:26:40 +00:00
}
}
2022-06-27 01:17:52 +00:00
2021-02-16 17:26:40 +00:00
// Send API Chat Command
2024-01-06 11:30:23 +00:00
static void send_api_chat_command(Minecraft *minecraft, char *str) {
2024-04-02 23:22:01 +00:00
char *command = nullptr;
2021-06-17 21:32:24 +00:00
safe_asprintf(&command, "chat.post(%s)\n", str);
2022-06-27 01:17:52 +00:00
chat_send_api_command(minecraft, command);
2021-02-16 17:26:40 +00:00
free(command);
}
// Send Message To Players
std::string _chat_get_prefix(char *username) {
return std::string("<") + username + "> ";
}
2024-01-06 11:30:23 +00:00
void chat_send_message(ServerSideNetworkHandler *server_side_network_handler, char *username, char *message) {
2024-04-02 23:22:01 +00:00
char *full_message = nullptr;
safe_asprintf(&full_message, "%s%s", _chat_get_prefix(username).c_str(), message);
2021-02-22 03:51:01 +00:00
sanitize_string(&full_message, MAX_CHAT_MESSAGE_LENGTH, 0);
2024-01-06 11:30:23 +00:00
std::string cpp_string = full_message;
2021-02-16 17:26:40 +00:00
free(full_message);
2024-05-15 09:02:19 +00:00
server_side_network_handler->displayGameMessage(&cpp_string);
2021-02-16 17:26:40 +00:00
}
2022-06-27 01:17:52 +00:00
// Handle Chat packet Send
2024-01-06 11:30:23 +00:00
void chat_handle_packet_send(Minecraft *minecraft, ChatPacket *packet) {
RakNetInstance *rak_net_instance = minecraft->rak_net_instance;
2024-05-15 09:02:19 +00:00
if (rak_net_instance->isServer()) {
2022-06-27 01:17:52 +00:00
// Hosting Multiplayer
const char *message = packet->message.c_str();
2024-01-06 11:30:23 +00:00
ServerSideNetworkHandler *server_side_network_handler = (ServerSideNetworkHandler *) minecraft->network_handler;
2024-05-17 06:52:55 +00:00
chat_send_message(server_side_network_handler, Strings::default_username, (char *) message);
2022-06-27 01:17:52 +00:00
} else {
// Client
2024-05-15 09:02:19 +00:00
rak_net_instance->send((Packet *) packet);
2022-06-27 01:17:52 +00:00
}
}
2021-02-16 17:26:40 +00:00
// Manually Send (And Loopback) ChatPacket
2024-01-06 11:30:23 +00:00
static void CommandServer_parse_CommandServer_dispatchPacket_injection(CommandServer *command_server, Packet *packet) {
Minecraft *minecraft = command_server->minecraft;
2024-04-02 23:22:01 +00:00
if (minecraft != nullptr) {
2024-01-06 11:30:23 +00:00
chat_handle_packet_send(minecraft, (ChatPacket *) packet);
2021-02-16 17:26:40 +00:00
}
}
// Handle ChatPacket Server-Side
2024-01-06 11:30:23 +00:00
static void ServerSideNetworkHandler_handle_ChatPacket_injection(ServerSideNetworkHandler *server_side_network_handler, RakNet_RakNetGUID *rak_net_guid, ChatPacket *chat_packet) {
2024-05-15 09:02:19 +00:00
Player *player = server_side_network_handler->getPlayer(rak_net_guid);
2024-04-02 23:22:01 +00:00
if (player != nullptr) {
2024-01-06 11:30:23 +00:00
const char *username = player->username.c_str();
const char *message = chat_packet->message.c_str();
chat_send_message(server_side_network_handler, (char *) username, (char *) message);
2021-02-16 17:26:40 +00:00
}
}
2024-05-09 05:25:53 +00:00
// Send Message
void _chat_send_message(Minecraft *minecraft, const char *message) {
send_api_chat_command(minecraft, (char *) message);
2021-02-16 17:26:40 +00:00
}
// Init
void init_chat() {
2024-02-01 08:12:24 +00:00
if (feature_has("Implement Chat", server_enabled)) {
2021-07-04 23:02:45 +00:00
// Disable Original ChatPacket Loopback
unsigned char disable_chat_packet_loopback_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
patch((void *) 0x6b490, disable_chat_packet_loopback_patch);
// Manually Send (And Loopback) ChatPacket
overwrite_call((void *) 0x6b518, (void *) CommandServer_parse_CommandServer_dispatchPacket_injection);
// Re-Broadcast ChatPacket
2024-05-05 00:46:15 +00:00
patch_vtable(ServerSideNetworkHandler_handle_ChatPacket, ServerSideNetworkHandler_handle_ChatPacket_injection);
2024-02-01 08:12:24 +00:00
// Init UI
_init_chat_ui();
// Disable Built-In Chat Message Limiting
unsigned char message_limit_patch[4] = {0x03, 0x00, 0x53, 0xe1}; // "cmp r4, r4"
patch((void *) 0x6b4c0, message_limit_patch);
2021-07-04 23:02:45 +00:00
}
}