From f7be586a4ca4a15e3b4777f52a921c15d65845ec Mon Sep 17 00:00:00 2001 From: TheBrokenRail Date: Tue, 23 Jan 2024 18:20:14 -0500 Subject: [PATCH 01/10] Build On Bullseye --- .gitea/workflows/build.yml | 12 +----------- CMakeLists.txt | 2 +- dependencies/glfw/src | 2 +- docs/INSTALL.md | 2 +- scripts/install-dependencies.sh | 20 +------------------- 5 files changed, 5 insertions(+), 33 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 72e0023..9db86f5 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -23,18 +23,13 @@ jobs: - ARMHF name: Build runs-on: ubuntu-latest - container: node:16-buster + container: node:lts-bullseye steps: - name: Checkout Repository uses: actions/checkout@v4 with: submodules: true # Dependencies - - name: Install CMake - run: | - echo 'deb http://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/backports.list - apt-get update - apt-get install --no-install-recommends -y -t buster-backports cmake - name: Install Dependencies run: ./scripts/install-dependencies.sh ${{ matrix.arch }} # Build @@ -62,11 +57,6 @@ jobs: with: submodules: true # Dependencies - - name: Install CMake - run: | - echo 'deb http://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/backports.list - apt-get update - apt-get install --no-install-recommends -y -t buster-backports cmake - name: Install Dependencies run: ./scripts/install-dependencies.sh - name: Install ARM Toolchain diff --git a/CMakeLists.txt b/CMakeLists.txt index 705ca51..350e8ec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,7 +70,7 @@ add_compile_options(-ffast-math) # Warnings add_compile_options(-Wall -Wextra -Werror -Wpointer-arith -Wshadow -Wnull-dereference) -if(CMAKE_C_COMPILER_ID STREQUAL \"GNU\") +if(CMAKE_C_COMPILER_ID STREQUAL "GNU") # Prevents False Positives if(CMAKE_C_COMPILER_VERSION VERSION_GREATER 10.0) add_compile_options(-Wno-stringop-overflow) diff --git a/dependencies/glfw/src b/dependencies/glfw/src index b4c3ef9..8e6c8d7 160000 --- a/dependencies/glfw/src +++ b/dependencies/glfw/src @@ -1 +1 @@ -Subproject commit b4c3ef9d0fdf46845f3e81e5d989dab06e71e6c1 +Subproject commit 8e6c8d7effc54f8aecd30eda17069588298f4ada diff --git a/docs/INSTALL.md b/docs/INSTALL.md index 1c36897..8d3ea58 100644 --- a/docs/INSTALL.md +++ b/docs/INSTALL.md @@ -4,7 +4,7 @@ Download packages [here](https://gitea.thebrokenrail.com/minecraft-pi-reborn/minecraft-pi-reborn/releases). ### System Requirements -* Debian Buster/Ubuntu 18.04 Or Higher +* Debian Bullseye/Ubuntu 20.04 Or Higher * FUSE 2 * Debian/Ubuntu: ``sudo apt install libfuse2`` * Arch: ``sudo pacman -S fuse2`` diff --git a/scripts/install-dependencies.sh b/scripts/install-dependencies.sh index 088d2b5..e40a9a4 100755 --- a/scripts/install-dependencies.sh +++ b/scripts/install-dependencies.sh @@ -20,9 +20,6 @@ run() { sudo apt-get update sudo apt-get dist-upgrade -y - # Architecture Detection - sudo apt-get install --no-install-recommends -y dpkg-dev - # Install Everything In One Go PKG_QUEUE='' queue_pkg() { @@ -44,22 +41,7 @@ run() { # Architecture-Specific Dependencies architecture_specific_pkg() { # Compiler - if [ "$(dpkg-architecture -qDEB_BUILD_ARCH)" = "$1" ]; then - queue_pkg \ - gcc \ - g++ - else - case "$1" in - 'armhf') GCC_TARGET='arm-linux-gnueabihf';; - 'arm64') GCC_TARGET='aarch64-linux-gnu';; - 'i386') GCC_TARGET='i686-linux-gnu';; - 'amd64') GCC_TARGET='x86-64-linux-gnu';; - esac - queue_pkg \ - "gcc-${GCC_TARGET}" \ - libc6-dev-$1-cross \ - "g++-${GCC_TARGET}" - fi + queue_pkg crossbuild-essential-$1 # Dependencies queue_pkg \ From 46241c9aa0258c635392e7f52fed9619057201d9 Mon Sep 17 00:00:00 2001 From: TheBrokenRail Date: Tue, 23 Jan 2024 20:51:36 -0500 Subject: [PATCH 02/10] Expose Some Properties --- mods/include/mods/server/server.h | 5 +++++ mods/include/mods/sound/sound.h | 6 ++++++ mods/src/server/server.cpp | 4 ++-- mods/src/sound/repository.cpp | 11 +++++------ 4 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 mods/include/mods/server/server.h create mode 100644 mods/include/mods/sound/sound.h diff --git a/mods/include/mods/server/server.h b/mods/include/mods/server/server.h new file mode 100644 index 0000000..a13b93b --- /dev/null +++ b/mods/include/mods/server/server.h @@ -0,0 +1,5 @@ +#pragma once + +#include "server_properties.h" + +ServerProperties &get_server_properties(); diff --git a/mods/include/mods/sound/sound.h b/mods/include/mods/sound/sound.h new file mode 100644 index 0000000..69f2fa0 --- /dev/null +++ b/mods/include/mods/sound/sound.h @@ -0,0 +1,6 @@ +#pragma once + +#include +#include + +extern std::unordered_map> sound_repository; diff --git a/mods/src/server/server.cpp b/mods/src/server/server.cpp index f07b6a3..31917cc 100644 --- a/mods/src/server/server.cpp +++ b/mods/src/server/server.cpp @@ -21,7 +21,7 @@ #include -#include +#include #include #include @@ -44,7 +44,7 @@ __attribute__((constructor)) static void _init_only_generate(int argc, char *arg } // Server Properties -static ServerProperties &get_server_properties() { +ServerProperties &get_server_properties() { static ServerProperties properties; return properties; } diff --git a/mods/src/sound/repository.cpp b/mods/src/sound/repository.cpp index ee271d8..d9d521f 100644 --- a/mods/src/sound/repository.cpp +++ b/mods/src/sound/repository.cpp @@ -1,5 +1,3 @@ -#include -#include #include #include #include @@ -8,9 +6,10 @@ #include #include "sound-internal.h" +#include // Sound Repository Extracted From MCPE 0.6.1 APK -static std::unordered_map> repository = { +std::unordered_map> sound_repository = { { { "step.cloth", @@ -355,9 +354,9 @@ __attribute__((constructor)) static void init_rand_seed() { } // Pick Sound std::string _sound_pick(std::string sound) { - if (repository.count(sound) > 0) { + if (sound_repository.count(sound) > 0) { // Sound Exists - std::vector &options = repository[sound]; + std::vector &options = sound_repository[sound]; return options[rand() % options.size()]; } else { // Invalid Sound @@ -370,7 +369,7 @@ std::string _sound_pick(std::string sound) { void _sound_resolve_all() { std::string source = _sound_get_source_file(); if (source.size() > 0) { - for (auto &it : repository) { + for (auto &it : sound_repository) { for (std::string &name : it.second) { // Zero Volume Prevents An OpenAL Source From Being Allocated While Still Resolving The Sound media_audio_play(source.c_str(), name.c_str(), 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f); From e95236023c66df61cd82ac786f6c27e008214703 Mon Sep 17 00:00:00 2001 From: Bigjango13 Date: Mon, 22 Jan 2024 01:39:43 -0500 Subject: [PATCH 03/10] A few more symbols --- symbols/CMakeLists.txt | 8 ++++++++ symbols/src/api/CommandServer.def | 3 ++- symbols/src/api/OffsetPosTranslator.def | 4 ++++ symbols/src/entity/Entity.def | 3 +++ symbols/src/entity/player/LocalPlayer.def | 1 + symbols/src/gui/components/IntRectangle.def | 6 ++++++ symbols/src/gui/components/RectangleArea.def | 8 ++++++++ symbols/src/gui/components/ScrollingPane.def | 16 ++++++++++++++++ symbols/src/input/IMoveInput.def | 1 + symbols/src/item/ArmorItem.def | 5 +++++ symbols/src/item/ArmorMaterial.def | 13 +++++++++++++ symbols/src/level/ChunkCache.def | 3 +++ symbols/src/level/ChunkSource.def | 2 ++ symbols/src/level/Level.def | 6 +++++- symbols/src/level/LevelSource.def | 7 ++++++- symbols/src/level/container/FillingContainer.def | 9 ++++++++- symbols/src/level/container/Inventory.def | 3 +++ symbols/src/network/NetEventCallback.def | 1 + symbols/src/network/packet/SignUpdatePacket.def | 7 +++++++ 19 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 symbols/src/gui/components/IntRectangle.def create mode 100644 symbols/src/gui/components/RectangleArea.def create mode 100644 symbols/src/gui/components/ScrollingPane.def create mode 100644 symbols/src/input/IMoveInput.def create mode 100644 symbols/src/item/ArmorItem.def create mode 100644 symbols/src/item/ArmorMaterial.def create mode 100644 symbols/src/level/ChunkCache.def create mode 100644 symbols/src/network/packet/SignUpdatePacket.def diff --git a/symbols/CMakeLists.txt b/symbols/CMakeLists.txt index 7b84c3e..13a127d 100644 --- a/symbols/CMakeLists.txt +++ b/symbols/CMakeLists.txt @@ -23,6 +23,7 @@ set(SRC src/network/ServerSideNetworkHandler.def src/network/packet/LoginPacket.def src/network/packet/PlayerEquipmentPacket.def + src/network/packet/SignUpdatePacket.def src/network/packet/Packet.def src/network/packet/StartGamePacket.def src/network/packet/ChatPacket.def @@ -59,6 +60,7 @@ set(SRC src/level/ExternalFileLevelStorageSource.def src/level/Biome.def src/level/ChunkSource.def + src/level/ChunkCache.def src/level/Level.def src/level/LevelRenderer.def src/level/LevelStorageSource.def @@ -72,6 +74,8 @@ set(SRC src/item/AuxDataTileItem.def src/item/ItemInstance.def src/item/Item.def + src/item/ArmorMaterial.def + src/item/ArmorItem.def src/item/TileItem.def src/api/OffsetPosTranslator.def src/api/CommandServer.def @@ -96,6 +100,9 @@ set(SRC src/gui/components/GuiComponent.def src/gui/components/Button.def src/gui/components/Gui.def + src/gui/components/IntRectangle.def + src/gui/components/RectangleArea.def + src/gui/components/ScrollingPane.def src/app-platform/AppPlatform.def src/app-platform/AppPlatform_linux.def src/app-platform/AppPlatform_readAssetFile_return_value.def @@ -124,6 +131,7 @@ set(SRC src/misc/SoundEngine.def src/misc/Common.def src/misc/Config.def + src/input/IMoveInput.def src/input/IBuildInput.def src/input/MouseBuildInput.def src/input/Mouse.def diff --git a/symbols/src/api/CommandServer.def b/symbols/src/api/CommandServer.def index b975027..950e41a 100644 --- a/symbols/src/api/CommandServer.def +++ b/symbols/src/api/CommandServer.def @@ -1,3 +1,4 @@ method std::string parse(ConnectedClient *client, std::string *command) = 0x6aa8c; -property Minecraft *minecraft = 0x18; \ No newline at end of file +property Minecraft *minecraft = 0x18; +property OffsetPosTranslator pos_translator = 0x1c; diff --git a/symbols/src/api/OffsetPosTranslator.def b/symbols/src/api/OffsetPosTranslator.def index 15d0d43..7278987 100644 --- a/symbols/src/api/OffsetPosTranslator.def +++ b/symbols/src/api/OffsetPosTranslator.def @@ -1 +1,5 @@ method void from(int *x, int *y, int *z) = 0x27c98; + +property float x = 0x4; +property float y = 0x8; +property float z = 0xc; diff --git a/symbols/src/entity/Entity.def b/symbols/src/entity/Entity.def index a004387..def2f3b 100644 --- a/symbols/src/entity/Entity.def +++ b/symbols/src/entity/Entity.def @@ -10,6 +10,9 @@ property int id = 0x1c; property float old_x = 0x28; property float old_y = 0x2c; property float old_z = 0x30; +property float vel_x = 0x34; +property float vel_y = 0x38; +property float vel_z = 0x3c; property float yaw = 0x40; property float pitch = 0x44; property float old_yaw = 0x48; diff --git a/symbols/src/entity/player/LocalPlayer.def b/symbols/src/entity/player/LocalPlayer.def index 4c09db4..b2efcdc 100644 --- a/symbols/src/entity/player/LocalPlayer.def +++ b/symbols/src/entity/player/LocalPlayer.def @@ -2,4 +2,5 @@ extends Player; vtable 0x106230; +property IMoveInput *input = 0xc88; property Minecraft *minecraft = 0xc90; diff --git a/symbols/src/gui/components/IntRectangle.def b/symbols/src/gui/components/IntRectangle.def new file mode 100644 index 0000000..0fbabd4 --- /dev/null +++ b/symbols/src/gui/components/IntRectangle.def @@ -0,0 +1,6 @@ +size 0x10; + +property int x = 0x0; +property int y = 0x4; +property int x_offset = 0x8; +property int y_offset = 0xc; diff --git a/symbols/src/gui/components/RectangleArea.def b/symbols/src/gui/components/RectangleArea.def new file mode 100644 index 0000000..d68dbb7 --- /dev/null +++ b/symbols/src/gui/components/RectangleArea.def @@ -0,0 +1,8 @@ +size 0x18; + +property float x1 = 0x8; +property float x2 = 0xc; +property float y1 = 0x10; +property float y2 = 0x14; + +method bool isInside(float x, float y) = 0x21aa4; diff --git a/symbols/src/gui/components/ScrollingPane.def b/symbols/src/gui/components/ScrollingPane.def new file mode 100644 index 0000000..f1442b8 --- /dev/null +++ b/symbols/src/gui/components/ScrollingPane.def @@ -0,0 +1,16 @@ +extends GuiComponent; + +constructor (int param_2, IntRectangle *bb, IntRectangle *itembb, int columns, int item_count, float scale, IntRectangle *itembb2) = 0x22b44; + +method void setContentOffset(float x, float y) = 0x220a0; +method void render(float param_1, float param_2, float alpha) = 0x22ee4; +method void adjustContentSize() = 0x21aa4; +method bool queryHoldTime(int *item_id, int *pressed_time) = 0x22ab4; + +property float scale = 0x2c; +property RectangleArea area = 0x60; +property Vec3 content_offset = 0xe4; +property float max_y = 0x130; +property float size_y = 0x170; +property float adjust_content_size_y = 0x1ec; + diff --git a/symbols/src/input/IMoveInput.def b/symbols/src/input/IMoveInput.def new file mode 100644 index 0000000..7b24b8b --- /dev/null +++ b/symbols/src/input/IMoveInput.def @@ -0,0 +1 @@ +property bool is_sneaking = 0xe; diff --git a/symbols/src/item/ArmorItem.def b/symbols/src/item/ArmorItem.def new file mode 100644 index 0000000..bc7749a --- /dev/null +++ b/symbols/src/item/ArmorItem.def @@ -0,0 +1,5 @@ +extends Item; + +size 0x34; + +constructor (int id, ArmorMaterial *material, int param_3, int slot) = 0x9362c; diff --git a/symbols/src/item/ArmorMaterial.def b/symbols/src/item/ArmorMaterial.def new file mode 100644 index 0000000..82bfe2a --- /dev/null +++ b/symbols/src/item/ArmorMaterial.def @@ -0,0 +1,13 @@ +size 0x14; + +property int health_for_slot_multiplier = 0x0; +property int feet_protection = 0x4; +property int leg_protection = 0x8; +property int body_protection = 0xc; +property int head_protection = 0x10; + +static-property ArmorMaterial cloth = 0x17a780; +static-property ArmorMaterial chain = 0x17a794; +static-property ArmorMaterial iron = 0x17a7a8; +static-property ArmorMaterial gold = 0x17a7bc; +static-property ArmorMaterial diamond = 0x17a7d0; diff --git a/symbols/src/level/ChunkCache.def b/symbols/src/level/ChunkCache.def new file mode 100644 index 0000000..599ce3f --- /dev/null +++ b/symbols/src/level/ChunkCache.def @@ -0,0 +1,3 @@ +extends ChunkSource; + +vtable 0x10fbc0; diff --git a/symbols/src/level/ChunkSource.def b/symbols/src/level/ChunkSource.def index 4c8f80c..64aa224 100644 --- a/symbols/src/level/ChunkSource.def +++ b/symbols/src/level/ChunkSource.def @@ -1 +1,3 @@ +vtable 0x10fb88; + virtual-method void postProcess(ChunkSource *chunk_source, int chunk_x, int chunk_y) = 0x14; diff --git a/symbols/src/level/Level.def b/symbols/src/level/Level.def index 5923df7..202af9c 100644 --- a/symbols/src/level/Level.def +++ b/symbols/src/level/Level.def @@ -9,5 +9,9 @@ method void addParticle(std::string *particle, float x, float y, float z, float method Entity *getEntity(int id) = 0xa45a4; method bool addEntity(Entity *entity) = 0xa7cbc; -property std::vector players = 0x60; +virtual-method void tick() = 0x28; +virtual-method void updateSleepingPlayerList() = 0x2c; +virtual-method ChunkCache *createChunkSource() = 0x30; + property std::vector entities = 0x20; +property std::vector players = 0x60; diff --git a/symbols/src/level/LevelSource.def b/symbols/src/level/LevelSource.def index ff7a855..e9162c2 100644 --- a/symbols/src/level/LevelSource.def +++ b/symbols/src/level/LevelSource.def @@ -1,3 +1,8 @@ virtual-method int getTile(int x, int y, int z) = 0x8; +virtual-method int isEmptyTile(int x, int y, int z) = 0xc; +virtual-method int getBrightness(int x, int y, int z) = 0x10; +virtual-method int getData(int x, int y, int z) = 0x14; virtual-method Material *getMaterial(int x, int y, int z) = 0x18; -virtual-method Biome *getBiome(int x, int z) = 0x24; \ No newline at end of file +virtual-method bool isSolidRenderTile(int x, int y, int z) = 0x1c; +virtual-method bool isSolidBlockingTile(int x, int y, int z) = 0x20; +virtual-method Biome *getBiome(int x, int z) = 0x24; diff --git a/symbols/src/level/container/FillingContainer.def b/symbols/src/level/container/FillingContainer.def index ed6e0f5..79a69c6 100644 --- a/symbols/src/level/container/FillingContainer.def +++ b/symbols/src/level/container/FillingContainer.def @@ -1,13 +1,20 @@ extends Container; method void addItem(ItemInstance *item_instance) = 0x92aa0; -virtual-method bool add(ItemInstance *item_instance) = 0x30; method void clearSlot(int slot) = 0x922f8; method void release(int slot) = 0x92058; method void compressLinkedSlotList(int slot) = 0x92280; method ItemInstance *getLinked(int slot) = 0x92230; +method bool linkEmptySlot(int slot) = 0x92590; +method int getFreeSlot() = 0x91ffc; +method int getSlot(int id) = 0x91ce0; +method int linkSlot(int linked_slot, int unlinked_slot, bool push_aside) = 0x92188; + virtual-method ItemInstance *getItem(int pos) = 0x8; +virtual-method void setItem(int pos, ItemInstance *item) = 0xc; +virtual-method bool add(ItemInstance *item_instance) = 0x30; property int *linked_slots = 0xc; property int linked_slots_length = 0x14; +property std::vector items = 0x18; property bool is_creative = 0x24; diff --git a/symbols/src/level/container/Inventory.def b/symbols/src/level/container/Inventory.def index 45e1d5c..1108f0b 100644 --- a/symbols/src/level/container/Inventory.def +++ b/symbols/src/level/container/Inventory.def @@ -1,6 +1,9 @@ extends FillingContainer; method void selectSlot(int slot) = 0x8d13c; +// It's just FillingContainer_getLinked but with selectedSlot as slot method ItemInstance *getSelected() = 0x8d134; +// It's just FillingContainer_linkSlot with selectedSlot as linked_slot +method bool moveToSelectedSlot(int unlinked_slot, bool push_aside) = 0x8d148; property int selectedSlot = 0x28; diff --git a/symbols/src/network/NetEventCallback.def b/symbols/src/network/NetEventCallback.def index b5a29c5..c8b7eeb 100644 --- a/symbols/src/network/NetEventCallback.def +++ b/symbols/src/network/NetEventCallback.def @@ -1,2 +1,3 @@ virtual-method void onDisconnect(RakNet_RakNetGUID *guid) = 0x18; +virtual-method void handle_SignUpdatePacket(RakNet_RakNetGUID *guid, SignUpdatePacket *packet) = 0xcc; virtual-method void handle_ChatPacket(RakNet_RakNetGUID *rak_net_guid, uchar *packet) = 0xc8; diff --git a/symbols/src/network/packet/SignUpdatePacket.def b/symbols/src/network/packet/SignUpdatePacket.def new file mode 100644 index 0000000..20665c2 --- /dev/null +++ b/symbols/src/network/packet/SignUpdatePacket.def @@ -0,0 +1,7 @@ +extends Packet; + +property int x = 0xc; +property int y = 0x10; +property int z = 0x14; +// std::string lines[4] +property std::string *lines = 0x18; From 118fc6f396b529458d02bc4b36becbfd83187351 Mon Sep 17 00:00:00 2001 From: Bigjango13 Date: Mon, 22 Jan 2024 03:13:54 -0500 Subject: [PATCH 04/10] Even more symbols from other projects --- symbols/CMakeLists.txt | 2 ++ symbols/src/entity/CameraEntity.def | 7 +++++++ symbols/src/entity/Entity.def | 2 ++ symbols/src/entity/EntityFactory.def | 1 + symbols/src/entity/Mob.def | 2 ++ symbols/src/game/Minecraft.def | 30 +++++++++++++++------------- symbols/src/level/Level.def | 2 ++ symbols/src/level/LightLayer.def | 2 ++ symbols/src/misc/Tesselator.def | 2 ++ 9 files changed, 36 insertions(+), 14 deletions(-) create mode 100644 symbols/src/entity/CameraEntity.def create mode 100644 symbols/src/level/LightLayer.def diff --git a/symbols/CMakeLists.txt b/symbols/CMakeLists.txt index 13a127d..53b2aff 100644 --- a/symbols/CMakeLists.txt +++ b/symbols/CMakeLists.txt @@ -29,6 +29,7 @@ set(SRC src/network/packet/ChatPacket.def src/entity/EntityFactory.def src/entity/PrimedTnt.def + src/entity/CameraEntity.def src/entity/EntityRenderer.def src/entity/Sheep.def src/entity/PathfinderMob.def @@ -61,6 +62,7 @@ set(SRC src/level/Biome.def src/level/ChunkSource.def src/level/ChunkCache.def + src/level/LightLayer.def src/level/Level.def src/level/LevelRenderer.def src/level/LevelStorageSource.def diff --git a/symbols/src/entity/CameraEntity.def b/symbols/src/entity/CameraEntity.def new file mode 100644 index 0000000..6f560af --- /dev/null +++ b/symbols/src/entity/CameraEntity.def @@ -0,0 +1,7 @@ +extends Entity; + +size 0xbe4; +vtable 0x108898; + +// -1 or an entity id +property int tracking_id = 0xbe0; \ No newline at end of file diff --git a/symbols/src/entity/Entity.def b/symbols/src/entity/Entity.def index def2f3b..e9cb294 100644 --- a/symbols/src/entity/Entity.def +++ b/symbols/src/entity/Entity.def @@ -18,5 +18,7 @@ property float pitch = 0x44; property float old_yaw = 0x48; property float old_pitch = 0x4c; property float head_height = 0x68; +property float hitbox_width = 0x6c; +property float hitbox_height = 0x70; property bool on_ground = 0xb2; property bool freeze_physics = 0xb9; diff --git a/symbols/src/entity/EntityFactory.def b/symbols/src/entity/EntityFactory.def index 2430dcf..b32cfbc 100644 --- a/symbols/src/entity/EntityFactory.def +++ b/symbols/src/entity/EntityFactory.def @@ -1 +1,2 @@ +// https://mcpirevival.miraheze.org/wiki/Minecraft:_Pi_Edition_Complete_Entity_List shows what id should be static-method Entity *CreateEntity(int id, Level *level) = 0x7d794; diff --git a/symbols/src/entity/Mob.def b/symbols/src/entity/Mob.def index 2555e94..c540f84 100644 --- a/symbols/src/entity/Mob.def +++ b/symbols/src/entity/Mob.def @@ -2,6 +2,8 @@ extends Entity; vtable 0x10ad60; +constructor (Level *level) = 0x81b80; + virtual-method void actuallyHurt(int damage) = 0x16c; virtual-method void die(Entity *cause) = 0x130; virtual-method ItemInstance *getCarriedItem() = 0x1ac; diff --git a/symbols/src/game/Minecraft.def b/symbols/src/game/Minecraft.def index 18303f7..b6440d8 100644 --- a/symbols/src/game/Minecraft.def +++ b/symbols/src/game/Minecraft.def @@ -1,12 +1,10 @@ vtable 0x102700; -virtual-method void init() = 0x38; method void tickInput() = 0x15ffc; method void setIsCreativeMode(int is_creative) = 0x16ec4; method int isTouchscreen() = 0x1639c; method void setScreen(Screen *screen) = 0x15d6c; method void tick(int param_1, int param_2) = 0x16934; -virtual-method void update() = 0x24; method void hostMultiplayer(int port) = 0x16664; method char *getProgressMessage() = 0x16e58; method uint isLevelGenerated() = 0x16e6c; @@ -14,30 +12,34 @@ method bool isCreativeMode() = 0x17270; method void releaseMouse() = 0x15d30; method void grabMouse() = 0x15d10; method void leaveGame(bool save_remote_level) = 0x15ea0; -virtual-method int handleBack(bool do_nothing) = 0x34; method uchar *getCreator() = 0x17538; method LevelStorageSource *getLevelSource() = 0x16e84; method void handleMouseDown(int param_1, bool can_destroy) = 0x1584c; method void handleBuildAction(uint *build_action_intention) = 0x15920; -virtual-method void selectLevel(std::string *level_dir, std::string *level_name, LevelSettings *settings) = 0x40; method void joinMultiplayer(PingedCompatibleServer *server) = 0x165f4; +virtual-method void update() = 0x24; +virtual-method int handleBack(bool do_nothing) = 0x34; +virtual-method void init() = 0x38; +virtual-method void selectLevel(std::string *level_dir, std::string *level_name, LevelSettings *settings) = 0x40; + property int screen_width = 0x20; property int screen_height = 0x24; -property NetEventCallback *network_handler = 0x174; -property RakNetInstance *rak_net_instance = 0x170; -property Level *level = 0x188; -property Textures *textures = 0x164; -property GameMode *game_mode = 0x160; -property LocalPlayer *player = 0x18c; property Options options = 0x3c; +property LevelRenderer *levelrenderer = 0x150; +property GameMode *game_mode = 0x160; +property Textures *textures = 0x164; +property RakNetInstance *rak_net_instance = 0x170; +property NetEventCallback *network_handler = 0x174; +property Level *level = 0x188; +property Mob *camera = 0x194; +property Gui gui = 0x198; +property LocalPlayer *player = 0x18c; +property Screen *screen = 0xc10; property HitResult hit_result = 0xc38; property int progress = 0xc60; -property CommandServer *command_server = 0xcc0; -property Screen *screen = 0xc10; -property Gui gui = 0x198; -property Mob *pov = 0x150; property PerfRenderer *perf_renderer = 0xcbc; +property CommandServer *command_server = 0xcc0; // Smooth Lighting static-property bool useAmbientOcclusion = 0x136b90; diff --git a/symbols/src/level/Level.def b/symbols/src/level/Level.def index 202af9c..852ad54 100644 --- a/symbols/src/level/Level.def +++ b/symbols/src/level/Level.def @@ -4,10 +4,12 @@ vtable 0x108de0; method void saveLevelData() = 0xa2e94; method void setTileAndData(int x, int y, int z, int id, int data) = 0xa38b4; +method void setTileAndDataNoUpdate(int x, int y, int z, int id, int data) = 0xa33d0; method HitResult clip(uchar *param_1, uchar *param_2, bool clip_liquids, bool param_3) = 0xa3db0; method void addParticle(std::string *particle, float x, float y, float z, float deltaX, float deltaY, float deltaZ, int count) = 0xa449c; method Entity *getEntity(int id) = 0xa45a4; method bool addEntity(Entity *entity) = 0xa7cbc; +method int getBrightness2(LightLayer *layer, int x, int y, int z) = 0xa3c70; virtual-method void tick() = 0x28; virtual-method void updateSleepingPlayerList() = 0x2c; diff --git a/symbols/src/level/LightLayer.def b/symbols/src/level/LightLayer.def new file mode 100644 index 0000000..0368ab1 --- /dev/null +++ b/symbols/src/level/LightLayer.def @@ -0,0 +1,2 @@ +static-property LightLayer *block = 0x17be94; +static-property LightLayer *sky = 0x17be90; diff --git a/symbols/src/misc/Tesselator.def b/symbols/src/misc/Tesselator.def index af9c4f1..b8f8c3a 100644 --- a/symbols/src/misc/Tesselator.def +++ b/symbols/src/misc/Tesselator.def @@ -2,3 +2,5 @@ method void begin(int mode) = 0x529d4; method void colorABGR(int color) = 0x52b54; method void color(int r, int g, int b, int a) = 0x52a48; method void vertexUV(float x, float y, float z, float u, float v) = 0x52d40; + +static-property Tesselator *instance = 0x137538; From 29b49ac70a0831b4626e28df71ab6443f8039f0d Mon Sep 17 00:00:00 2001 From: Bigjango13 Date: Mon, 22 Jan 2024 22:59:38 -0500 Subject: [PATCH 05/10] More symbols --- symbols/CMakeLists.txt | 3 +++ symbols/src/entity/Entity.def | 6 +++++- symbols/src/entity/EntityRenderDispatcher.def | 1 + symbols/src/entity/ItemSpriteRenderer.def | 5 +++++ symbols/src/entity/Throwable.def | 11 +++++++++++ symbols/src/entity/player/Player.def | 1 + symbols/src/item/Item.def | 7 +++++-- symbols/src/level/Level.def | 1 + symbols/src/misc/Random.def | 3 +++ 9 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 symbols/src/entity/ItemSpriteRenderer.def create mode 100644 symbols/src/entity/Throwable.def create mode 100644 symbols/src/misc/Random.def diff --git a/symbols/CMakeLists.txt b/symbols/CMakeLists.txt index 53b2aff..3ddaf4f 100644 --- a/symbols/CMakeLists.txt +++ b/symbols/CMakeLists.txt @@ -31,6 +31,7 @@ set(SRC src/entity/PrimedTnt.def src/entity/CameraEntity.def src/entity/EntityRenderer.def + src/entity/ItemSpriteRenderer.def src/entity/Sheep.def src/entity/PathfinderMob.def src/entity/HumanoidModel.def @@ -50,6 +51,7 @@ set(SRC src/entity/Entity.def src/entity/ItemEntity.def src/entity/Arrow.def + src/entity/Throwable.def src/level/container/FillingContainer.def src/level/container/Container.def src/level/container/ContainerMenu.def @@ -133,6 +135,7 @@ set(SRC src/misc/SoundEngine.def src/misc/Common.def src/misc/Config.def + src/misc/Random.def src/input/IMoveInput.def src/input/IBuildInput.def src/input/MouseBuildInput.def diff --git a/symbols/src/entity/Entity.def b/symbols/src/entity/Entity.def index e9cb294..096752e 100644 --- a/symbols/src/entity/Entity.def +++ b/symbols/src/entity/Entity.def @@ -1,12 +1,15 @@ +virtual-method void remove() = 0x10; virtual-method void tick() = 0x34; virtual-method bool hurt(Entity *attacker, int damage) = 0xa4; virtual-method int getEntityTypeId() = 0xdc; -method void moveTo(float x, float y, float z, float pitch, float yaw) = 0x7a834; + +method void moveTo(float x, float y, float z, float yaw, float pitch) = 0x7a834; property float x = 0x4; property float y = 0x8; property float z = 0xc; property int id = 0x1c; +property Level *level = 0x24; property float old_x = 0x28; property float old_y = 0x2c; property float old_z = 0x30; @@ -20,5 +23,6 @@ property float old_pitch = 0x4c; property float head_height = 0x68; property float hitbox_width = 0x6c; property float hitbox_height = 0x70; +property int renderer_id = 0xa8; property bool on_ground = 0xb2; property bool freeze_physics = 0xb9; diff --git a/symbols/src/entity/EntityRenderDispatcher.def b/symbols/src/entity/EntityRenderDispatcher.def index d811d71..d678fc4 100644 --- a/symbols/src/entity/EntityRenderDispatcher.def +++ b/symbols/src/entity/EntityRenderDispatcher.def @@ -1,2 +1,3 @@ constructor () = 0x6096c; + method void assign(uchar entity_id, EntityRenderer *renderer) = 0x6094c; diff --git a/symbols/src/entity/ItemSpriteRenderer.def b/symbols/src/entity/ItemSpriteRenderer.def new file mode 100644 index 0000000..e01309b --- /dev/null +++ b/symbols/src/entity/ItemSpriteRenderer.def @@ -0,0 +1,5 @@ +extends EntityRenderer; + +size 0x10; + +constructor (int texture) = 0x64078; diff --git a/symbols/src/entity/Throwable.def b/symbols/src/entity/Throwable.def new file mode 100644 index 0000000..a234f54 --- /dev/null +++ b/symbols/src/entity/Throwable.def @@ -0,0 +1,11 @@ +extends Entity; + +size 0xf4; +vtable 0x10dcb8; +vtable-size 0x13c; + +constructor (Level *level, Entity *thrower) = 0x8ccf0; + +virtual-method void onHit(HitResult *res) = 0x138; + +property int thrower_id = 0xd8; diff --git a/symbols/src/entity/player/Player.def b/symbols/src/entity/player/Player.def index 60cfb6d..87cc8a4 100644 --- a/symbols/src/entity/player/Player.def +++ b/symbols/src/entity/player/Player.def @@ -10,3 +10,4 @@ method ItemInstance *getArmor(int slot) = 0x8fda4; property std::string username = 0xbf4; property Inventory *inventory = 0xbe0; +property bool infinite_items = 0xbff; diff --git a/symbols/src/item/Item.def b/symbols/src/item/Item.def index aff1010..6c70872 100644 --- a/symbols/src/item/Item.def +++ b/symbols/src/item/Item.def @@ -14,10 +14,13 @@ virtual-method void setDescriptionId(std::string *name) = 0x6c; virtual-method std::string getDescriptionId(ItemInstance *item_instance) = 0x7c; property int id = 0x4; -property bool is_stacked_by_data = 0x19; -property int category = 0x10; property int max_damage = 0x8; +property int texture = 0xc; +property int category = 0x10; property int max_stack_size = 0x14; +property bool equipped = 0x18; +property bool is_stacked_by_data = 0x19; +property std::string description_id = 0x20; // Globals static-property-array Item *items = 0x17b250; diff --git a/symbols/src/level/Level.def b/symbols/src/level/Level.def index 852ad54..0411c97 100644 --- a/symbols/src/level/Level.def +++ b/symbols/src/level/Level.def @@ -10,6 +10,7 @@ method void addParticle(std::string *particle, float x, float y, float z, float method Entity *getEntity(int id) = 0xa45a4; method bool addEntity(Entity *entity) = 0xa7cbc; method int getBrightness2(LightLayer *layer, int x, int y, int z) = 0xa3c70; +method void playSound(Entity *entity, std::string *name, float volume, float pitch) = 0xa42a8; virtual-method void tick() = 0x28; virtual-method void updateSleepingPlayerList() = 0x2c; diff --git a/symbols/src/misc/Random.def b/symbols/src/misc/Random.def new file mode 100644 index 0000000..5ceca14 --- /dev/null +++ b/symbols/src/misc/Random.def @@ -0,0 +1,3 @@ +method int genrand_int32() = 0x42cf8; + +static-property Random random = 0x17a87c; From 83a282551dbd9664ccc677559d615e6b6300a906 Mon Sep 17 00:00:00 2001 From: Bigjango13 Date: Tue, 23 Jan 2024 20:35:57 -0500 Subject: [PATCH 06/10] Add packet related symbols --- mods/src/misc/misc.c | 2 +- symbols/CMakeLists.txt | 1 + symbols/src/network/packet/Packet.def | 8 +++++++- symbols/src/network/raknet/RakNet_BitStream.def | 4 ++++ 4 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 symbols/src/network/raknet/RakNet_BitStream.def diff --git a/mods/src/misc/misc.c b/mods/src/misc/misc.c index 9fc1eba..0063997 100644 --- a/mods/src/misc/misc.c +++ b/mods/src/misc/misc.c @@ -161,7 +161,7 @@ static void Screen_render_injection(Screen *screen, int32_t param_1, int32_t par // Sanitize Username #define MAX_USERNAME_LENGTH 16 -static void LoginPacket_read_injection(LoginPacket *packet, unsigned char *bit_stream) { +static void LoginPacket_read_injection(LoginPacket *packet, RakNet_BitStream *bit_stream) { // Call Original Method LoginPacket_read_non_virtual(packet, bit_stream); diff --git a/symbols/CMakeLists.txt b/symbols/CMakeLists.txt index 3ddaf4f..75341d0 100644 --- a/symbols/CMakeLists.txt +++ b/symbols/CMakeLists.txt @@ -20,6 +20,7 @@ set(SRC src/network/raknet/RakNet_StartupResult.h src/network/raknet/RakNet_RakNetGUID.def src/network/raknet/RakNet_RakPeer.def + src/network/raknet/RakNet_BitStream.def src/network/ServerSideNetworkHandler.def src/network/packet/LoginPacket.def src/network/packet/PlayerEquipmentPacket.def diff --git a/symbols/src/network/packet/Packet.def b/symbols/src/network/packet/Packet.def index abfa163..bcc587c 100644 --- a/symbols/src/network/packet/Packet.def +++ b/symbols/src/network/packet/Packet.def @@ -1,2 +1,8 @@ constructor () = 0x6fc18; -virtual-method void read(uchar *bit_stream) = 0xc; +size 0x10; +vtable 0x1024d8; +vtable-size 0x14; + +virtual-method void write(RakNet_BitStream *bit_stream) = 0x8; +virtual-method void read(RakNet_BitStream *bit_stream) = 0xc; +virtual-method void handle(RakNet_RakNetGUID *guid, NetEventCallback *callback) = 0x10; diff --git a/symbols/src/network/raknet/RakNet_BitStream.def b/symbols/src/network/raknet/RakNet_BitStream.def new file mode 100644 index 0000000..570c3be --- /dev/null +++ b/symbols/src/network/raknet/RakNet_BitStream.def @@ -0,0 +1,4 @@ +method void Write_uchar(uchar *i) = 0x18448; +method void Write_int(int *i) = 0x18454; + +method void Read_int(int *i) = 0x184ec; From 233e8d691bbaf7f815ae10ab39f62743e2869259 Mon Sep 17 00:00:00 2001 From: Bigjango13 Date: Tue, 23 Jan 2024 20:38:41 -0500 Subject: [PATCH 07/10] Fix Tesselator instance symbols --- symbols/src/misc/Tesselator.def | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/symbols/src/misc/Tesselator.def b/symbols/src/misc/Tesselator.def index b8f8c3a..dbe8612 100644 --- a/symbols/src/misc/Tesselator.def +++ b/symbols/src/misc/Tesselator.def @@ -3,4 +3,4 @@ method void colorABGR(int color) = 0x52b54; method void color(int r, int g, int b, int a) = 0x52a48; method void vertexUV(float x, float y, float z, float u, float v) = 0x52d40; -static-property Tesselator *instance = 0x137538; +static-property Tesselator instance = 0x137538; From 0b252faa5f4f1412c1ec35af00d48a9cc8bb2d1e Mon Sep 17 00:00:00 2001 From: TheBrokenRail Date: Tue, 23 Jan 2024 21:57:57 -0500 Subject: [PATCH 08/10] Simplify Some Code --- .gitea/workflows/build.yml | 6 +- docs/COMMAND_LINE.md | 3 + example-mods/chat-commands/CMakeLists.txt | 2 +- example-mods/expanded-creative/CMakeLists.txt | 2 +- example-mods/recipes/CMakeLists.txt | 2 +- launcher/CMakeLists.txt | 2 +- launcher/src/bootstrap.c | 191 ++------------ launcher/src/bootstrap.h | 2 + launcher/src/mods.c | 110 ++++++++ launcher/src/sdk.c | 67 +++++ mods/CMakeLists.txt | 248 ++++++++---------- 11 files changed, 322 insertions(+), 313 deletions(-) create mode 100644 launcher/src/mods.c create mode 100644 launcher/src/sdk.c diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 9db86f5..5af1cab 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -50,7 +50,7 @@ jobs: - Server name: Test runs-on: ubuntu-latest - container: node:16-buster + container: node:lts-bullseye steps: - name: Checkout Repository uses: actions/checkout@v4 @@ -71,7 +71,7 @@ jobs: needs: build name: Release runs-on: ubuntu-latest - container: node:16-buster + container: node:lts-bullseye steps: # Dependencies - name: Install Go @@ -87,7 +87,7 @@ jobs: - name: Create Release uses: https://gitea.com/actions/release-action@main with: - files: ./out + files: ./out api_key: ${{ secrets.RELEASE_TOKEN }} title: v${{ github.ref_name }} body: "[View Changelog](https://gitea.thebrokenrail.com/minecraft-pi-reborn/minecraft-pi-reborn/src/branch/master/docs/CHANGELOG.md)" diff --git a/docs/COMMAND_LINE.md b/docs/COMMAND_LINE.md index 8f322bc..4e1a28a 100644 --- a/docs/COMMAND_LINE.md +++ b/docs/COMMAND_LINE.md @@ -8,6 +8,9 @@ If you run MCPI-Reborn with ``--version`` it will print its version to ``stdout` ### ``--debug`` This sets ``MCPI_DEBUG``. +### ``--copy-sdk`` +This extracts the modding SDK and immediately exits. (This allows the SDK to be extracted without starting the game.) + ### Client Mode Only #### ``--print-available-feature-flags`` diff --git a/example-mods/chat-commands/CMakeLists.txt b/example-mods/chat-commands/CMakeLists.txt index b2c5cfe..90a8e93 100644 --- a/example-mods/chat-commands/CMakeLists.txt +++ b/example-mods/chat-commands/CMakeLists.txt @@ -14,4 +14,4 @@ include("$ENV{HOME}/.minecraft-pi/sdk/lib/minecraft-pi-reborn-client/sdk/sdk.cma # Build add_library(chat-commands SHARED chat-commands.cpp) -target_link_libraries(chat-commands mods-headers reborn-patch symbols chat misc) +target_link_libraries(chat-commands mods reborn-patch symbols) diff --git a/example-mods/expanded-creative/CMakeLists.txt b/example-mods/expanded-creative/CMakeLists.txt index c317ec4..524b11d 100644 --- a/example-mods/expanded-creative/CMakeLists.txt +++ b/example-mods/expanded-creative/CMakeLists.txt @@ -14,4 +14,4 @@ include("$ENV{HOME}/.minecraft-pi/sdk/lib/minecraft-pi-reborn-client/sdk/sdk.cma # Build add_library(expanded-creative SHARED expanded-creative.cpp) -target_link_libraries(expanded-creative mods-headers reborn-patch symbols misc) +target_link_libraries(expanded-creative mods reborn-patch symbols) diff --git a/example-mods/recipes/CMakeLists.txt b/example-mods/recipes/CMakeLists.txt index 9e39aed..b1be8ad 100644 --- a/example-mods/recipes/CMakeLists.txt +++ b/example-mods/recipes/CMakeLists.txt @@ -14,4 +14,4 @@ include("$ENV{HOME}/.minecraft-pi/sdk/lib/minecraft-pi-reborn-client/sdk/sdk.cma # Build add_library(recipes SHARED recipes.cpp) -target_link_libraries(recipes mods-headers reborn-util symbols misc) +target_link_libraries(recipes mods reborn-util symbols) diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 99386cf..ba796d3 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -1,7 +1,7 @@ project(launcher) # Launcher -add_executable(launcher src/bootstrap.c src/patchelf.cpp src/util.c src/crash-report.c) +add_executable(launcher src/bootstrap.c src/patchelf.cpp src/util.c src/crash-report.c src/sdk.c src/mods.c) if(MCPI_SERVER_MODE) target_sources(launcher PRIVATE src/server/launcher.c) else() diff --git a/launcher/src/bootstrap.c b/launcher/src/bootstrap.c index b5cc931..e5e9ee4 100644 --- a/launcher/src/bootstrap.c +++ b/launcher/src/bootstrap.c @@ -1,13 +1,5 @@ #define _FILE_OFFSET_BITS 64 -#include -#include -#include -#include -#include -#include -#include - #include #include "util.h" @@ -15,77 +7,6 @@ #include "patchelf.h" #include "crash-report.h" -// Get All Mods In Folder -static void load(char **ld_preload, char *folder) { - int folder_name_length = strlen(folder); - // Retry Until Successful - while (1) { - // Open Folder - DIR *dp = opendir(folder); - if (dp != NULL) { - // Loop Through Folder - struct dirent *entry = NULL; - errno = 0; - while (1) { - errno = 0; - entry = readdir(dp); - if (entry != NULL) { - // Check If File Is Regular - if (entry->d_type == DT_REG) { - // Get Full Name - int name_length = strlen(entry->d_name); - int total_length = folder_name_length + name_length; - char name[total_length + 1]; - - // Concatenate Folder Name And File Name - for (int i = 0; i < folder_name_length; i++) { - name[i] = folder[i]; - } - for (int i = 0; i < name_length; i++) { - name[folder_name_length + i] = entry->d_name[i]; - } - // Add Terminator - name[total_length] = '\0'; - - // Check If File Is Accessible - int result = access(name, R_OK); - if (result == 0) { - // Add To LD_PRELOAD - string_append(ld_preload, "%s%s", *ld_preload == NULL ? "" : ":", name); - } else if (result == -1 && errno != 0) { - // Fail - WARN("Unable To Access: %s: %s", name, strerror(errno)); - errno = 0; - } - } - } else if (errno != 0) { - // Error Reading Contents Of Folder - ERR("Error Reading Directory: %s: %s", folder, strerror(errno)); - } else { - // Done! - break; - } - } - // Close Folder - closedir(dp); - - // Exit Function - return; - } else if (errno == ENOENT) { - // Folder Doesn't Exists, Attempt Creation - int ret = mkdir(folder, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); - if (ret != 0) { - // Unable To Create Folder - ERR("Error Creating Directory: %s: %s", folder, strerror(errno)); - } - // Continue Retrying - } else { - // Unable To Open Folder - ERR("Error Opening Directory: %s: %s", folder, strerror(errno)); - } - } -} - #define MCPI_BINARY "minecraft-pi" #define QEMU_BINARY "qemu-arm" @@ -182,11 +103,11 @@ void pre_bootstrap(int argc, char *argv[]) { set_and_print_env("GTK_THEME", "Adwaita:dark"); #endif - // Get Binary Directory - char *binary_directory = get_binary_directory(); - // Configure PATH { + // Get Binary Directory + char *binary_directory = get_binary_directory(); + // Add Library Directory char *new_path = NULL; safe_asprintf(&new_path, "%s/bin", binary_directory); @@ -200,10 +121,21 @@ void pre_bootstrap(int argc, char *argv[]) { // Set And Free set_and_print_env("PATH", new_path); free(new_path); + + // Free Binary Directory + free(binary_directory); } - // Free Binary Directory - free(binary_directory); + // --copy-sdk + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "--copy-sdk") == 0) { + char *binary_directory = get_binary_directory(); + copy_sdk(binary_directory, 0); + free(binary_directory); + fflush(stdout); + exit(EXIT_SUCCESS); + } + } // Setup Crash Reports setup_crash_report(); @@ -242,56 +174,6 @@ void pre_bootstrap(int argc, char *argv[]) { print_debug_information(); } -// Copy SDK Into ~/.minecraft-pi -#define HOME_SUBDIRECTORY_FOR_SDK HOME_SUBDIRECTORY_FOR_GAME_DATA "/sdk" -static void copy_sdk(char *binary_directory) { - // Ensure SDK Directory - { - char *sdk_path = NULL; - safe_asprintf(&sdk_path, "%s" HOME_SUBDIRECTORY_FOR_SDK, getenv("HOME")); - const char *const command[] = {"mkdir", "-p", sdk_path, NULL}; - run_simple_command(command, "Unable To Create SDK Directory"); - } - - // Lock File - char *lock_file_path = NULL; - safe_asprintf(&lock_file_path, "%s" HOME_SUBDIRECTORY_FOR_SDK "/.lock", getenv("HOME")); - int lock_file_fd = lock_file(lock_file_path); - - // Output Directory - char *output = NULL; - safe_asprintf(&output, "%s" HOME_SUBDIRECTORY_FOR_SDK "/" MCPI_SDK_DIR, getenv("HOME")); - // Source Directory - char *source = NULL; - safe_asprintf(&source, "%s/sdk/.", binary_directory); - - // Clean - { - const char *const command[] = {"rm", "-rf", output, NULL}; - run_simple_command(command, "Unable To Clean SDK Output Directory"); - } - - // Make Directory - { - const char *const command[] = {"mkdir", "-p", output, NULL}; - run_simple_command(command, "Unable To Create SDK Output Directory"); - } - - // Copy - { - const char *const command[] = {"cp", "-ar", source, output, NULL}; - run_simple_command(command, "Unable To Copy SDK"); - } - - // Free - free(output); - free(source); - - // Unlock File - unlock_file(lock_file_path, lock_file_fd); - free(lock_file_path); -} - // Bootstrap void bootstrap(int argc, char *argv[]) { INFO("Configuring Game..."); @@ -301,7 +183,7 @@ void bootstrap(int argc, char *argv[]) { DEBUG("Binary Directory: %s", binary_directory); // Copy SDK - copy_sdk(binary_directory); + copy_sdk(binary_directory, 1); // Set MCPI_REBORN_ASSETS_PATH { @@ -432,44 +314,7 @@ void bootstrap(int argc, char *argv[]) { set_and_print_env("MCPI_NATIVE_LD_PRELOAD", host_ld_preload); // ARM Components - { - // Prepare - char *preload = NULL; - - // ~/.minecraft-pi/mods - { - // Get Mods Folder - char *mods_folder = NULL; - safe_asprintf(&mods_folder, "%s" HOME_SUBDIRECTORY_FOR_GAME_DATA "/mods/", getenv("HOME")); - // Load Mods From ./mods - load(&preload, mods_folder); - // Free Mods Folder - free(mods_folder); - } - - // Built-In Mods - { - // Get Mods Folder - char *mods_folder = NULL; - safe_asprintf(&mods_folder, "%s/mods/", binary_directory); - // Load Mods From ./mods - load(&preload, mods_folder); - // Free Mods Folder - free(mods_folder); - } - - // Add LD_PRELOAD - { - char *value = getenv("LD_PRELOAD"); - if (value != NULL && strlen(value) > 0) { - string_append(&preload, ":%s", value); - } - } - - // Set - set_and_print_env("MCPI_ARM_LD_PRELOAD", preload); - free(preload); - } + bootstrap_mods(binary_directory); } // Free Binary Directory diff --git a/launcher/src/bootstrap.h b/launcher/src/bootstrap.h index 6afe637..8245203 100644 --- a/launcher/src/bootstrap.h +++ b/launcher/src/bootstrap.h @@ -6,6 +6,8 @@ extern "C" { void pre_bootstrap(int argc, char *argv[]); void bootstrap(int argc, char *argv[]); +void copy_sdk(char *binary_directory, int log_with_debug); +void bootstrap_mods(char *binary_directory); #ifdef __cplusplus } diff --git a/launcher/src/mods.c b/launcher/src/mods.c new file mode 100644 index 0000000..418ab9a --- /dev/null +++ b/launcher/src/mods.c @@ -0,0 +1,110 @@ +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "bootstrap.h" + +// Get All Mods In Folder +static void load(char **ld_preload, const char *folder) { + int folder_name_length = strlen(folder); + // Open Folder + DIR *dp = opendir(folder); + if (dp != NULL) { + // Loop Through Folder + struct dirent *entry = NULL; + errno = 0; + while (1) { + errno = 0; + entry = readdir(dp); + if (entry != NULL) { + // Check If File Is Regular + if (entry->d_type == DT_REG) { + // Get Full Name + int name_length = strlen(entry->d_name); + int total_length = folder_name_length + name_length; + char name[total_length + 1]; + + // Concatenate Folder Name And File Name + for (int i = 0; i < folder_name_length; i++) { + name[i] = folder[i]; + } + for (int i = 0; i < name_length; i++) { + name[folder_name_length + i] = entry->d_name[i]; + } + // Add Terminator + name[total_length] = '\0'; + + // Check If File Is Accessible + int result = access(name, R_OK); + if (result == 0) { + // Add To LD_PRELOAD + string_append(ld_preload, "%s%s", *ld_preload == NULL ? "" : ":", name); + } else if (result == -1 && errno != 0) { + // Fail + WARN("Unable To Access: %s: %s", name, strerror(errno)); + errno = 0; + } + } + } else if (errno != 0) { + // Error Reading Contents Of Folder + ERR("Error Reading Directory: %s: %s", folder, strerror(errno)); + } else { + // Done! + break; + } + } + // Close Folder + closedir(dp); + } else if (errno == ENOENT) { + // Folder Doesn't Exist + } else { + // Unable To Open Folder + ERR("Error Opening Directory: %s: %s", folder, strerror(errno)); + } +} + +// Bootstrap Mods +void bootstrap_mods(char *binary_directory) { + // Prepare + char *preload = NULL; + + // ~/.minecraft-pi/mods + { + // Get Mods Folder + char *mods_folder = NULL; + safe_asprintf(&mods_folder, "%s" HOME_SUBDIRECTORY_FOR_GAME_DATA "/mods/", getenv("HOME")); + // Load Mods From ./mods + load(&preload, mods_folder); + // Free Mods Folder + free(mods_folder); + } + + // Built-In Mods + { + // Get Mods Folder + char *mods_folder = NULL; + safe_asprintf(&mods_folder, "%s/mods/", binary_directory); + // Load Mods From ./mods + load(&preload, mods_folder); + // Free Mods Folder + free(mods_folder); + } + + // Add LD_PRELOAD + { + char *value = getenv("LD_PRELOAD"); + if (value != NULL && strlen(value) > 0) { + string_append(&preload, ":%s", value); + } + } + + // Set + set_and_print_env("MCPI_ARM_LD_PRELOAD", preload); + free(preload); +} diff --git a/launcher/src/sdk.c b/launcher/src/sdk.c new file mode 100644 index 0000000..2547a90 --- /dev/null +++ b/launcher/src/sdk.c @@ -0,0 +1,67 @@ +#include + +#include "bootstrap.h" +#include "util.h" + +// Log +#define LOG(is_debug, ...) \ + { \ + if (is_debug) { \ + DEBUG(__VA_ARGS__); \ + } else { \ + INFO(__VA_ARGS__); \ + } \ + } + +// Copy SDK Into ~/.minecraft-pi +#define HOME_SUBDIRECTORY_FOR_SDK HOME_SUBDIRECTORY_FOR_GAME_DATA "/sdk" +void copy_sdk(char *binary_directory, int log_with_debug) { + // Ensure SDK Directory + { + char *sdk_path = NULL; + safe_asprintf(&sdk_path, "%s" HOME_SUBDIRECTORY_FOR_SDK, getenv("HOME")); + const char *const command[] = {"mkdir", "-p", sdk_path, NULL}; + run_simple_command(command, "Unable To Create SDK Directory"); + } + + // Lock File + char *lock_file_path = NULL; + safe_asprintf(&lock_file_path, "%s" HOME_SUBDIRECTORY_FOR_SDK "/.lock", getenv("HOME")); + int lock_file_fd = lock_file(lock_file_path); + + // Output Directory + char *output = NULL; + safe_asprintf(&output, "%s" HOME_SUBDIRECTORY_FOR_SDK "/" MCPI_SDK_DIR, getenv("HOME")); + // Source Directory + char *source = NULL; + safe_asprintf(&source, "%s/sdk/.", binary_directory); + + // Clean + { + const char *const command[] = {"rm", "-rf", output, NULL}; + run_simple_command(command, "Unable To Clean SDK Output Directory"); + } + + // Make Directory + { + const char *const command[] = {"mkdir", "-p", output, NULL}; + run_simple_command(command, "Unable To Create SDK Output Directory"); + } + + // Copy + { + const char *const command[] = {"cp", "-ar", source, output, NULL}; + run_simple_command(command, "Unable To Copy SDK"); + } + + // Log + LOG(log_with_debug, "Copied SDK To: %s", output); + + // Free + free(output); + free(source); + + // Unlock File + unlock_file(lock_file_path, lock_file_fd); + free(lock_file_path); +} diff --git a/mods/CMakeLists.txt b/mods/CMakeLists.txt index b9dac35..2931a92 100644 --- a/mods/CMakeLists.txt +++ b/mods/CMakeLists.txt @@ -1,141 +1,123 @@ project(mods) -## Headers -add_library(mods-headers INTERFACE) +# Common Sources +set(SRC + # compat + src/compat/compat.c + src/compat/egl.c + src/compat/x11.c + src/compat/bcm_host.c + # readdir + src/readdir/readdir.c + # feature + src/feature/feature.c + # version + src/version/version.cpp + # chat + src/chat/chat.cpp + src/chat/ui.c + # creative + src/creative/creative.cpp + # game-mode + src/game-mode/game-mode.c + src/game-mode/ui.cpp + # override + src/override/override.c + # death + src/death/death.cpp + # misc + src/misc/misc.c + src/misc/misc.cpp + src/misc/logging.cpp + src/misc/api.cpp + # options + src/options/options.c + src/options/options.cpp + # bucket + src/bucket/bucket.cpp + # home + src/home/home.c + # test + src/test/test.c + # init + src/init/init.c +) + +# Server-Only Sources +if(MCPI_SERVER_MODE) + list(APPEND SRC + # server + src/server/server.cpp + src/server/server_properties.cpp + ) +else() + list(APPEND SRC + # multiplayer + src/multiplayer/multiplayer.cpp + # benchmark + src/benchmark/benchmark.cpp + ) +endif() + +# Headless-Only Sources +if(MCPI_HEADLESS_MODE) + list(APPEND SRC + # textures + src/textures/headless.cpp + ) +else() + list(APPEND SRC + # sound + src/sound/sound.cpp + src/sound/repository.cpp + # camera + src/camera/camera.cpp + # input + src/input/input.cpp + src/input/bow.c + src/input/attack.c + src/input/toggle.c + src/input/misc.c + src/input/drop.cpp + src/input/crafting.cpp + # sign + src/sign/sign.cpp + # touch + src/touch/touch.cpp + # atlas + src/atlas/atlas.cpp + # title-screen + src/title-screen/title-screen.cpp + # skin + src/skin/skin.cpp + src/skin/loader.cpp + # screenshot + src/screenshot/screenshot.c + # textures + src/textures/textures.cpp + ) +endif() + +# Build +add_library(mods SHARED ${SRC}) + +# Install +install(TARGETS mods DESTINATION "${MCPI_INSTALL_DIR}/mods") +# SDK +install(TARGETS mods EXPORT sdk DESTINATION "${MCPI_SDK_LIB_DIR}") + +# Dependencies +target_link_libraries(mods symbols reborn-patch media-layer-core dl pthread) +if(NOT MCPI_HEADLESS_MODE) + target_link_libraries(mods stb_image) +endif() + +# Headers target_include_directories( - mods-headers - INTERFACE + mods + PUBLIC "$" "$" ) -target_link_libraries(mods-headers INTERFACE symbols) # SDK -install(TARGETS mods-headers EXPORT sdk DESTINATION "${MCPI_SDK_LIB_DIR}") install(DIRECTORY "include/" DESTINATION "${MCPI_SDK_INCLUDE_DIR}/mods") - -## Mods - -add_library(compat SHARED src/compat/compat.c src/compat/egl.c src/compat/x11.c src/compat/bcm_host.c) -target_link_libraries(compat mods-headers reborn-patch media-layer-core) -if(NOT MCPI_HEADLESS_MODE) - target_link_libraries(compat screenshot input sign chat home dl) -endif() - -add_library(readdir SHARED src/readdir/readdir.c) - -add_library(feature SHARED src/feature/feature.c) -target_link_libraries(feature mods-headers reborn-patch) - -add_library(version SHARED src/version/version.cpp) -target_link_libraries(version mods-headers reborn-patch symbols) - -add_library(chat SHARED src/chat/chat.cpp src/chat/ui.c) -target_link_libraries(chat mods-headers reborn-patch symbols feature) -if(NOT MCPI_HEADLESS_MODE) - target_link_libraries(chat input media-layer-core pthread) -endif() - -add_library(creative SHARED src/creative/creative.cpp) -target_link_libraries(creative mods-headers reborn-patch symbols feature misc) - -add_library(game-mode SHARED src/game-mode/game-mode.c src/game-mode/ui.cpp) -target_link_libraries(game-mode mods-headers reborn-patch symbols feature) -if(NOT MCPI_SERVER_MODE) - target_link_libraries(game-mode pthread media-layer-core) -endif() - -if(MCPI_SERVER_MODE) - add_library(server SHARED src/server/server.cpp src/server/server_properties.cpp) - target_link_libraries(server mods-headers reborn-patch symbols feature home misc compat dl media-layer-core pthread) -else() - add_library(multiplayer SHARED src/multiplayer/multiplayer.cpp) - target_link_libraries(multiplayer mods-headers reborn-patch symbols home feature) - - add_library(benchmark SHARED src/benchmark/benchmark.cpp) - target_link_libraries(benchmark mods-headers reborn-patch symbols compat misc media-layer-core) -endif() - -if(NOT MCPI_HEADLESS_MODE) - add_library(sound SHARED src/sound/sound.cpp src/sound/repository.cpp) - target_link_libraries(sound mods-headers reborn-patch symbols feature override media-layer-core) - - add_library(camera SHARED src/camera/camera.cpp) - target_link_libraries(camera mods-headers reborn-patch symbols feature home screenshot) - - add_library(input SHARED src/input/input.cpp src/input/bow.c src/input/attack.c src/input/toggle.c src/input/misc.c src/input/drop.cpp src/input/crafting.cpp) - target_link_libraries(input mods-headers reborn-patch symbols creative feature misc media-layer-core) - - add_library(sign SHARED src/sign/sign.cpp) - target_link_libraries(sign mods-headers reborn-patch symbols feature input media-layer-core) - - add_library(touch SHARED src/touch/touch.cpp) - target_link_libraries(touch mods-headers reborn-patch symbols feature) - - add_library(atlas SHARED src/atlas/atlas.cpp) - target_link_libraries(atlas mods-headers reborn-patch symbols feature media-layer-core) - - add_library(title-screen SHARED src/title-screen/title-screen.cpp) - target_link_libraries(title-screen mods-headers reborn-patch symbols feature compat) - - add_library(skin SHARED src/skin/skin.cpp src/skin/loader.cpp) - target_link_libraries(skin mods-headers reborn-patch symbols feature misc textures media-layer-core stb_image) - - add_library(screenshot SHARED src/screenshot/screenshot.c) - target_link_libraries(screenshot mods-headers reborn-util media-layer-core stb_image) -endif() - -if(NOT MCPI_HEADLESS_MODE) - add_library(textures SHARED src/textures/textures.cpp) -else() - add_library(textures SHARED src/textures/headless.cpp) -endif() -target_link_libraries(textures mods-headers reborn-patch symbols) -if(NOT MCPI_HEADLESS_MODE) - target_link_libraries(textures media-layer-core feature misc stb_image) -endif() - -add_library(override SHARED src/override/override.c) -target_link_libraries(override mods-headers reborn-patch symbols dl home) - -add_library(death SHARED src/death/death.cpp) -target_link_libraries(death mods-headers reborn-patch symbols feature) - -add_library(misc SHARED src/misc/misc.c src/misc/misc.cpp src/misc/logging.cpp src/misc/api.cpp) -target_link_libraries(misc mods-headers reborn-patch symbols media-layer-core feature) - -add_library(options SHARED src/options/options.c src/options/options.cpp) -target_link_libraries(options mods-headers reborn-patch symbols feature home) - -add_library(bucket SHARED src/bucket/bucket.cpp) -target_link_libraries(bucket mods-headers reborn-patch symbols feature misc) - -add_library(home SHARED src/home/home.c) -target_link_libraries(home mods-headers reborn-patch symbols) - -add_library(test SHARED src/test/test.c) -target_link_libraries(test mods-headers reborn-patch home) - -add_library(init SHARED src/init/init.c) -target_link_libraries(init symbols mods-headers reborn-util compat game-mode misc death options chat creative bucket textures home version test media-layer-core) -if(MCPI_SERVER_MODE) - target_link_libraries(init server) -else() - target_link_libraries(init multiplayer benchmark) -endif() -if(NOT MCPI_HEADLESS_MODE) - target_link_libraries(init sound camera input sign touch atlas title-screen skin) -endif() - -## Install Mods -set(MODS_TO_INSTALL init compat readdir feature game-mode misc override death options chat creative bucket textures home version test) -if(MCPI_SERVER_MODE) - list(APPEND MODS_TO_INSTALL server) -else() - list(APPEND MODS_TO_INSTALL multiplayer benchmark) -endif() -if(NOT MCPI_HEADLESS_MODE) - list(APPEND MODS_TO_INSTALL sound camera input sign touch atlas title-screen skin screenshot) -endif() -install(TARGETS ${MODS_TO_INSTALL} DESTINATION "${MCPI_INSTALL_DIR}/mods") -# SDK -install(TARGETS ${MODS_TO_INSTALL} EXPORT sdk DESTINATION "${MCPI_SDK_LIB_DIR}") From 49f56bd90db8a9991d98436eaccbc470255f3771 Mon Sep 17 00:00:00 2001 From: TheBrokenRail Date: Tue, 23 Jan 2024 23:00:22 -0500 Subject: [PATCH 09/10] Fix Benchmark --- mods/include/mods/init/init.h | 2 +- mods/src/benchmark/benchmark.cpp | 26 +++++++++++--------------- mods/src/init/init.c | 7 +++++-- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/mods/include/mods/init/init.h b/mods/include/mods/init/init.h index ea7b952..2809dd5 100644 --- a/mods/include/mods/init/init.h +++ b/mods/include/mods/init/init.h @@ -13,7 +13,7 @@ void init_compat(); void init_server(); #else void init_multiplayer(); -void init_benchmark(); +void init_benchmark(int argc, char *argv[]); #endif #ifndef MCPI_HEADLESS_MODE void init_sound(); diff --git a/mods/src/benchmark/benchmark.cpp b/mods/src/benchmark/benchmark.cpp index 3d8ca10..3c708c4 100644 --- a/mods/src/benchmark/benchmark.cpp +++ b/mods/src/benchmark/benchmark.cpp @@ -10,20 +10,6 @@ #include #include -// --benchmark: Activate Benchmark -static bool active = false; -__attribute__((constructor)) static void _init_active(int argc, char *argv[]) { - // Iterate Arguments - for (int i = 1; i < argc; i++) { - // Check Argument - if (strcmp(argv[i], "--benchmark") == 0) { - // Enabled - active = true; - break; - } - } -} - // Constants #define NANOSECONDS_IN_SECOND 1000000000ll @@ -172,7 +158,17 @@ static void Minecraft_update_injection(Minecraft *minecraft) { } // Init Benchmark -void init_benchmark() { +void init_benchmark(int argc, char *argv[]) { + // --benchmark: Activate Benchmark + bool active = false; + for (int i = 1; i < argc; i++) { + // Check Argument + if (strcmp(argv[i], "--benchmark") == 0) { + // Enabled + active = true; + break; + } + } if (active) { misc_run_on_update(Minecraft_update_injection); // Track Ticks diff --git a/mods/src/init/init.c b/mods/src/init/init.c index 5823111..100512b 100644 --- a/mods/src/init/init.c +++ b/mods/src/init/init.c @@ -3,7 +3,7 @@ #include #include -__attribute__((constructor)) static void init() { +__attribute__((constructor)) static void init(int argc, char *argv[]) { media_ensure_loaded(); run_tests(); init_symbols(); @@ -34,6 +34,9 @@ __attribute__((constructor)) static void init() { init_bucket(); init_home(); #ifndef MCPI_SERVER_MODE - init_benchmark(); + init_benchmark(argc, argv); +#else + (void) argc; + (void) argv; #endif } From 7c9d16d662d792db900371cfd6c1c08e40404837 Mon Sep 17 00:00:00 2001 From: TheBrokenRail Date: Sat, 27 Jan 2024 17:47:43 -0500 Subject: [PATCH 10/10] Fix Mistake --- mods/src/bucket/bucket.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/src/bucket/bucket.cpp b/mods/src/bucket/bucket.cpp index 1645bad..60b9638 100644 --- a/mods/src/bucket/bucket.cpp +++ b/mods/src/bucket/bucket.cpp @@ -6,7 +6,7 @@ #include // Items -Item *bucket = NULL; +static Item *bucket = NULL; // Description And Texture static std::string BucketItem_getDescriptionId(__attribute__((unused)) Item *item, ItemInstance *item_instance) {