Better Examples
This commit is contained in:
parent
a94708a1ae
commit
bfa0567ac9
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -1,7 +1,7 @@
|
|||
out
|
||||
debian/tmp
|
||||
.vscode
|
||||
build
|
||||
build*
|
||||
CMakeLists.txt.user
|
||||
*.autosave
|
||||
AppImageBuilder.yml
|
||||
|
|
1
example-mod/.gitignore
vendored
1
example-mod/.gitignore
vendored
|
@ -1 +0,0 @@
|
|||
build
|
|
@ -1,7 +1,8 @@
|
|||
# Example Mod
|
||||
# Example Mods
|
||||
This is an example of a mod that cane be built using the modding SDK.
|
||||
|
||||
This specific mod adds even more items and blocks to the Creative Inventory. It was originally by [@Bigjango13](https://github.com/bigjango13).
|
||||
* **Expanded Creative Mod**: This specific mod adds even more items and blocks to the Creative Inventory. It was originally by [@Bigjango13](https://github.com/bigjango13).
|
||||
* **Chat Commands Mod**: This specific mod makes an chat message starting with a ``/`` handled by the MCPI API.
|
||||
|
||||
## The SDK
|
||||
The modding SDK is a collection of exported CMake targets that allows anyone to create their own MCPI mod!
|
14
example-mods/chat-commands/.gitignore
vendored
Normal file
14
example-mods/chat-commands/.gitignore
vendored
Normal file
|
@ -0,0 +1,14 @@
|
|||
out
|
||||
debian/tmp
|
||||
.vscode
|
||||
build*
|
||||
CMakeLists.txt.user
|
||||
*.autosave
|
||||
AppImageBuilder.yml
|
||||
appimage-builder-cache
|
||||
appimage-build
|
||||
AppDir
|
||||
*.zsync
|
||||
*.AppImage
|
||||
core*
|
||||
qemu_*
|
15
example-mods/chat-commands/CMakeLists.txt
Normal file
15
example-mods/chat-commands/CMakeLists.txt
Normal file
|
@ -0,0 +1,15 @@
|
|||
cmake_minimum_required(VERSION 3.16.0)
|
||||
|
||||
# Build For ARM
|
||||
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
|
||||
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
|
||||
|
||||
# Start Project
|
||||
project(chat-commands)
|
||||
|
||||
# Include SDK
|
||||
include("$ENV{HOME}/.minecraft-pi/sdk/lib/minecraft-pi-reborn-client/sdk/sdk.cmake")
|
||||
|
||||
# Build
|
||||
add_library(chat-commands SHARED chat-commands.cpp)
|
||||
target_link_libraries(chat-commands mods-headers reborn-patch symbols chat misc)
|
25
example-mods/chat-commands/chat-commands.cpp
Normal file
25
example-mods/chat-commands/chat-commands.cpp
Normal file
|
@ -0,0 +1,25 @@
|
|||
// Headers
|
||||
|
||||
#include <libreborn/libreborn.h>
|
||||
#include <symbols/minecraft.h>
|
||||
#include <mods/chat/chat.h>
|
||||
#include <mods/misc/misc.h>
|
||||
|
||||
// The Actual Mod
|
||||
HOOK(chat_handle_packet_send, void, (unsigned char *minecraft, unsigned char *packet)) {
|
||||
// Get Message
|
||||
char *message = *(char **) (packet + ChatPacket_message_property_offset);
|
||||
if (message[0] == '/') {
|
||||
// API Command
|
||||
unsigned char *gui = minecraft + Minecraft_gui_property_offset;
|
||||
std::string out = chat_send_api_command(minecraft, &message[1]);
|
||||
if (out.length() > 0 && out[out.length() - 1] == '\n') {
|
||||
out[out.length() - 1] = '\0';
|
||||
}
|
||||
misc_add_message(gui, out.c_str());
|
||||
} else {
|
||||
// Call Original Method
|
||||
ensure_chat_handle_packet_send();
|
||||
(*real_chat_handle_packet_send)(minecraft, packet);
|
||||
}
|
||||
}
|
14
example-mods/expanded-creative/.gitignore
vendored
Normal file
14
example-mods/expanded-creative/.gitignore
vendored
Normal file
|
@ -0,0 +1,14 @@
|
|||
out
|
||||
debian/tmp
|
||||
.vscode
|
||||
build*
|
||||
CMakeLists.txt.user
|
||||
*.autosave
|
||||
AppImageBuilder.yml
|
||||
appimage-builder-cache
|
||||
appimage-build
|
||||
AppDir
|
||||
*.zsync
|
||||
*.AppImage
|
||||
core*
|
||||
qemu_*
|
|
@ -2,6 +2,12 @@
|
|||
|
||||
#include <libreborn/libreborn.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
#include <string>
|
||||
// Send API Command
|
||||
std::string chat_send_api_command(unsigned char *minecraft, char *str);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
@ -13,6 +19,7 @@ unsigned int chat_get_counter();
|
|||
|
||||
// Override using the HOOK() macro to provide customized chat behavior.
|
||||
void chat_send_message(unsigned char *server_side_network_handler, char *username, char *message);
|
||||
void chat_handle_packet_send(unsigned char *minecraft, unsigned char *packet);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -10,6 +10,9 @@ void misc_run_on_tick(misc_update_function_t function);
|
|||
|
||||
void Level_saveLevelData_injection(unsigned char *level);
|
||||
|
||||
// Use this instead of directly calling Gui::addMessage(), it has proper logging!
|
||||
void misc_add_message(unsigned char *gui, const char *text);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -29,22 +29,25 @@ int _chat_enabled = 0;
|
|||
#define MAX_CHAT_MESSAGE_LENGTH 512
|
||||
|
||||
// Send API Command
|
||||
#ifndef MCPI_SERVER_MODE
|
||||
static void send_api_command(unsigned char *minecraft, char *str) {
|
||||
std::string chat_send_api_command(unsigned char *minecraft, char *str) {
|
||||
struct ConnectedClient client;
|
||||
client.sock = -1;
|
||||
client.str = "";
|
||||
client.time = 0;
|
||||
unsigned char *command_server = *(unsigned char **) (minecraft + Minecraft_command_server_property_offset);
|
||||
if (command_server != NULL) {
|
||||
(*CommandServer_parse)(command_server, client, str);
|
||||
return (*CommandServer_parse)(command_server, client, str);
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef MCPI_SERVER_MODE
|
||||
// Send API Chat Command
|
||||
static void send_api_chat_command(unsigned char *minecraft, char *str) {
|
||||
char *command = NULL;
|
||||
safe_asprintf(&command, "chat.post(%s)\n", str);
|
||||
send_api_command(minecraft, command);
|
||||
chat_send_api_command(minecraft, command);
|
||||
free(command);
|
||||
}
|
||||
#endif
|
||||
|
@ -57,24 +60,28 @@ void chat_send_message(unsigned char *server_side_network_handler, char *usernam
|
|||
(*ServerSideNetworkHandler_displayGameMessage)(server_side_network_handler, std::string(full_message));
|
||||
free(full_message);
|
||||
}
|
||||
// Handle Chat packet Send
|
||||
void chat_handle_packet_send(unsigned char *minecraft, unsigned char *packet) {
|
||||
unsigned char *rak_net_instance = *(unsigned char **) (minecraft + Minecraft_rak_net_instance_property_offset);
|
||||
unsigned char *rak_net_instance_vtable = *(unsigned char **) rak_net_instance;
|
||||
RakNetInstance_isServer_t RakNetInstance_isServer = *(RakNetInstance_isServer_t *) (rak_net_instance_vtable + RakNetInstance_isServer_vtable_offset);
|
||||
if ((*RakNetInstance_isServer)(rak_net_instance)) {
|
||||
// Hosting Multiplayer
|
||||
char *message = *(char **) (packet + ChatPacket_message_property_offset);
|
||||
unsigned char *server_side_network_handler = *(unsigned char **) (minecraft + Minecraft_network_handler_property_offset);
|
||||
chat_send_message(server_side_network_handler, *default_username, message);
|
||||
} else {
|
||||
// Client
|
||||
RakNetInstance_send_t RakNetInstance_send = *(RakNetInstance_send_t *) (rak_net_instance_vtable + RakNetInstance_send_vtable_offset);
|
||||
(*RakNetInstance_send)(rak_net_instance, packet);
|
||||
}
|
||||
}
|
||||
|
||||
// Manually Send (And Loopback) ChatPacket
|
||||
static void CommandServer_parse_CommandServer_dispatchPacket_injection(unsigned char *command_server, unsigned char *packet) {
|
||||
unsigned char *minecraft = *(unsigned char **) (command_server + CommandServer_minecraft_property_offset);
|
||||
if (minecraft != NULL) {
|
||||
unsigned char *rak_net_instance = *(unsigned char **) (minecraft + Minecraft_rak_net_instance_property_offset);
|
||||
unsigned char *rak_net_instance_vtable = *(unsigned char **) rak_net_instance;
|
||||
RakNetInstance_isServer_t RakNetInstance_isServer = *(RakNetInstance_isServer_t *) (rak_net_instance_vtable + RakNetInstance_isServer_vtable_offset);
|
||||
if ((*RakNetInstance_isServer)(rak_net_instance)) {
|
||||
// Hosting Multiplayer
|
||||
char *message = *(char **) (packet + ChatPacket_message_property_offset);
|
||||
unsigned char *server_side_network_handler = *(unsigned char **) (minecraft + Minecraft_network_handler_property_offset);
|
||||
chat_send_message(server_side_network_handler, *default_username, message);
|
||||
} else {
|
||||
// Client
|
||||
RakNetInstance_send_t RakNetInstance_send = *(RakNetInstance_send_t *) (rak_net_instance_vtable + RakNetInstance_send_vtable_offset);
|
||||
(*RakNetInstance_send)(rak_net_instance, packet);
|
||||
}
|
||||
chat_handle_packet_send(minecraft, packet);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -35,6 +35,9 @@ static void Gui_addMessage_injection(unsigned char *gui, std::string const& text
|
|||
// Free
|
||||
free(new_message);
|
||||
}
|
||||
void misc_add_message(unsigned char *gui, const char *text) {
|
||||
Gui_addMessage_injection(gui, text);
|
||||
}
|
||||
|
||||
// Print Progress Reports
|
||||
static int last_progress = -1;
|
||||
|
|
Loading…
Reference in New Issue
Block a user