2022-06-10 21:59:57 -04:00
|
|
|
// Config Needs To Load First
|
|
|
|
#include <libreborn/libreborn.h>
|
|
|
|
|
2021-02-16 12:26:40 -05:00
|
|
|
#include <string>
|
2021-02-21 22:16:05 -05:00
|
|
|
#include <cstring>
|
2021-02-16 12:26:40 -05:00
|
|
|
#include <cstdio>
|
|
|
|
#include <vector>
|
|
|
|
|
2021-09-11 23:18:12 -04:00
|
|
|
#include <symbols/minecraft.h>
|
2023-11-13 10:25:57 -05:00
|
|
|
#ifndef MCPI_HEADLESS_MODE
|
2022-04-27 23:38:30 -04:00
|
|
|
#include <media-layer/core.h>
|
|
|
|
#endif
|
2021-02-16 12:26:40 -05:00
|
|
|
|
2022-06-25 17:30:08 -04:00
|
|
|
#include <mods/init/init.h>
|
|
|
|
#include <mods/feature/feature.h>
|
2023-11-13 10:25:57 -05:00
|
|
|
#ifndef MCPI_HEADLESS_MODE
|
2022-06-25 17:30:08 -04:00
|
|
|
#include <mods/input/input.h>
|
2022-03-14 19:09:25 -04:00
|
|
|
#endif
|
2022-06-25 17:30:08 -04:00
|
|
|
#include "chat-internal.h"
|
|
|
|
#include <mods/chat/chat.h>
|
2021-02-16 12:26:40 -05:00
|
|
|
|
|
|
|
// Send API Command
|
2024-01-06 06:30:23 -05:00
|
|
|
std::string chat_send_api_command(Minecraft *minecraft, std::string str) {
|
2021-02-16 12:26:40 -05:00
|
|
|
struct ConnectedClient client;
|
|
|
|
client.sock = -1;
|
|
|
|
client.str = "";
|
|
|
|
client.time = 0;
|
2024-01-06 06:30:23 -05:00
|
|
|
CommandServer *command_server = minecraft->command_server;
|
2021-02-16 12:26:40 -05:00
|
|
|
if (command_server != NULL) {
|
2024-01-07 03:23:43 -05:00
|
|
|
return CommandServer_parse(command_server, &client, &str);
|
2022-06-26 21:17:52 -04:00
|
|
|
} else {
|
|
|
|
return "";
|
2021-02-16 12:26:40 -05:00
|
|
|
}
|
|
|
|
}
|
2022-06-26 21:17:52 -04:00
|
|
|
|
2023-11-13 10:25:57 -05:00
|
|
|
#ifndef MCPI_HEADLESS_MODE
|
2021-02-16 12:26:40 -05:00
|
|
|
// Send API Chat Command
|
2024-01-06 06:30:23 -05:00
|
|
|
static void send_api_chat_command(Minecraft *minecraft, char *str) {
|
2021-02-16 12:26:40 -05:00
|
|
|
char *command = NULL;
|
2021-06-17 17:32:24 -04:00
|
|
|
safe_asprintf(&command, "chat.post(%s)\n", str);
|
2022-06-26 21:17:52 -04:00
|
|
|
chat_send_api_command(minecraft, command);
|
2021-02-16 12:26:40 -05:00
|
|
|
free(command);
|
|
|
|
}
|
2022-03-14 19:09:25 -04:00
|
|
|
#endif
|
2021-02-16 12:26:40 -05:00
|
|
|
|
|
|
|
// Send Message To Players
|
2024-02-02 04:20:34 -05:00
|
|
|
std::string _chat_get_prefix(char *username) {
|
|
|
|
return std::string("<") + username + "> ";
|
|
|
|
}
|
2024-01-06 06:30:23 -05:00
|
|
|
void chat_send_message(ServerSideNetworkHandler *server_side_network_handler, char *username, char *message) {
|
2021-02-16 12:26:40 -05:00
|
|
|
char *full_message = NULL;
|
2024-02-02 04:20:34 -05:00
|
|
|
safe_asprintf(&full_message, "%s%s", _chat_get_prefix(username).c_str(), message);
|
2021-02-21 22:51:01 -05:00
|
|
|
sanitize_string(&full_message, MAX_CHAT_MESSAGE_LENGTH, 0);
|
2024-01-06 06:30:23 -05:00
|
|
|
std::string cpp_string = full_message;
|
2021-02-16 12:26:40 -05:00
|
|
|
free(full_message);
|
2024-01-07 03:23:43 -05:00
|
|
|
ServerSideNetworkHandler_displayGameMessage(server_side_network_handler, &cpp_string);
|
2021-02-16 12:26:40 -05:00
|
|
|
}
|
2022-06-26 21:17:52 -04:00
|
|
|
// Handle Chat packet Send
|
2024-01-06 06:30:23 -05:00
|
|
|
void chat_handle_packet_send(Minecraft *minecraft, ChatPacket *packet) {
|
|
|
|
RakNetInstance *rak_net_instance = minecraft->rak_net_instance;
|
|
|
|
if (rak_net_instance->vtable->isServer(rak_net_instance)) {
|
2022-06-26 21:17:52 -04:00
|
|
|
// Hosting Multiplayer
|
2024-03-18 19:44:17 -04:00
|
|
|
const char *message = packet->message.c_str();
|
2024-01-06 06:30:23 -05:00
|
|
|
ServerSideNetworkHandler *server_side_network_handler = (ServerSideNetworkHandler *) minecraft->network_handler;
|
2024-03-18 19:44:17 -04:00
|
|
|
chat_send_message(server_side_network_handler, Strings_default_username, (char *) message);
|
2022-06-26 21:17:52 -04:00
|
|
|
} else {
|
|
|
|
// Client
|
2024-01-06 06:30:23 -05:00
|
|
|
rak_net_instance->vtable->send(rak_net_instance, (Packet *) packet);
|
2022-06-26 21:17:52 -04:00
|
|
|
}
|
|
|
|
}
|
2021-02-16 12:26:40 -05:00
|
|
|
|
|
|
|
// Manually Send (And Loopback) ChatPacket
|
2024-01-06 06:30:23 -05:00
|
|
|
static void CommandServer_parse_CommandServer_dispatchPacket_injection(CommandServer *command_server, Packet *packet) {
|
|
|
|
Minecraft *minecraft = command_server->minecraft;
|
2021-02-16 12:26:40 -05:00
|
|
|
if (minecraft != NULL) {
|
2024-01-06 06:30:23 -05:00
|
|
|
chat_handle_packet_send(minecraft, (ChatPacket *) packet);
|
2021-02-16 12:26:40 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Handle ChatPacket Server-Side
|
2024-01-06 06:30:23 -05:00
|
|
|
static void ServerSideNetworkHandler_handle_ChatPacket_injection(ServerSideNetworkHandler *server_side_network_handler, RakNet_RakNetGUID *rak_net_guid, ChatPacket *chat_packet) {
|
2024-01-07 03:23:43 -05:00
|
|
|
Player *player = ServerSideNetworkHandler_getPlayer(server_side_network_handler, rak_net_guid);
|
2021-02-16 12:26:40 -05:00
|
|
|
if (player != NULL) {
|
2024-01-06 06:30:23 -05:00
|
|
|
const char *username = player->username.c_str();
|
2024-03-18 19:44:17 -04:00
|
|
|
const char *message = chat_packet->message.c_str();
|
|
|
|
chat_send_message(server_side_network_handler, (char *) username, (char *) message);
|
2021-02-16 12:26:40 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-11-13 10:25:57 -05:00
|
|
|
#ifndef MCPI_HEADLESS_MODE
|
2021-02-16 12:26:40 -05:00
|
|
|
// Message Queue
|
|
|
|
static std::vector<std::string> queue;
|
|
|
|
// Add To Queue
|
2024-02-01 03:12:24 -05:00
|
|
|
void _chat_queue_message(const char *message) {
|
2021-02-16 12:26:40 -05:00
|
|
|
// Add
|
2024-02-01 03:12:24 -05:00
|
|
|
std::string str = message;
|
2021-02-16 12:26:40 -05:00
|
|
|
queue.push_back(str);
|
|
|
|
}
|
|
|
|
// Empty Queue
|
2021-02-16 17:08:43 -05:00
|
|
|
unsigned int old_chat_counter = 0;
|
2024-01-06 06:30:23 -05:00
|
|
|
static void send_queued_messages(Minecraft *minecraft) {
|
2021-02-16 12:26:40 -05:00
|
|
|
// Loop
|
|
|
|
for (unsigned int i = 0; i < queue.size(); i++) {
|
|
|
|
send_api_chat_command(minecraft, (char *) queue[i].c_str());
|
|
|
|
}
|
|
|
|
queue.clear();
|
|
|
|
}
|
2022-03-14 19:09:25 -04:00
|
|
|
#endif
|
2021-02-16 12:26:40 -05:00
|
|
|
|
|
|
|
// Init
|
|
|
|
void init_chat() {
|
2024-02-01 03:12:24 -05:00
|
|
|
if (feature_has("Implement Chat", server_enabled)) {
|
2021-07-04 19:02:45 -04: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
|
|
|
|
patch_address(ServerSideNetworkHandler_handle_ChatPacket_vtable_addr, (void *) ServerSideNetworkHandler_handle_ChatPacket_injection);
|
2023-11-13 10:25:57 -05:00
|
|
|
#ifndef MCPI_HEADLESS_MODE
|
2024-02-01 03:12:24 -05:00
|
|
|
// Send Messages On Input Tick
|
2021-07-04 19:02:45 -04:00
|
|
|
input_run_on_tick(send_queued_messages);
|
2024-02-01 03:12:24 -05:00
|
|
|
// Init UI
|
|
|
|
_init_chat_ui();
|
2022-03-14 19:09:25 -04:00
|
|
|
#endif
|
2024-02-02 04:20:34 -05:00
|
|
|
// 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 19:02:45 -04:00
|
|
|
}
|
|
|
|
}
|