diff --git a/LiteLoader/Header/MC/CommandOrigin.hpp b/LiteLoader/Header/MC/CommandOrigin.hpp index f879942..1c5b696 100644 --- a/LiteLoader/Header/MC/CommandOrigin.hpp +++ b/LiteLoader/Header/MC/CommandOrigin.hpp @@ -15,6 +15,7 @@ class CommandOrigin { #define AFTER_EXTRA // Add Member There + mce::UUID mUUID; public: LIAPI ServerPlayer* getPlayer() const; diff --git a/LiteLoader/Header/MC/Level.hpp b/LiteLoader/Header/MC/Level.hpp index b2e1327..cc43cb8 100644 --- a/LiteLoader/Header/MC/Level.hpp +++ b/LiteLoader/Header/MC/Level.hpp @@ -54,7 +54,7 @@ public: LIAPI static Block* getBlock(BlockPos* pos, BlockSource* blockSource); LIAPI static Block* getBlock(const BlockPos& pos, int dimId); LIAPI static Block* getBlock(const BlockPos& pos, BlockSource *blockSource); - //LIAPI static Block* getBlockEx(const BlockPos& pos, int dimId); + LIAPI static Block* getBlockEx(const BlockPos& pos, int dimId); LIAPI static BlockInstance getBlockInstance(BlockPos* pos, int dimId); LIAPI static BlockInstance getBlockInstance(BlockPos* pos, BlockSource* blockSource); LIAPI static BlockInstance getBlockInstance(const BlockPos& pos, int dimId); @@ -98,47 +98,47 @@ public: public: static void dummy() { ; } - struct ServerCommandOrigin { - void* myVTBL; - void* UUID[2]; - ServerLevel* lvl; - string Name; - unsigned char Perm; - static void* fake_vtbl[26]; +// struct ServerCommandOrigin { +// void* myVTBL; +// void* UUID[2]; +// ServerLevel* lvl; +// string Name; +// unsigned char Perm; +// static void* fake_vtbl[26]; +// +// [[deprecated]] +// ServerCommandOrigin() +// { +// if (fake_vtbl[1] == nullptr) { +// memcpy(fake_vtbl, (void**)(SYM("??_7ServerCommandOrigin@@6B@")) - 1, sizeof(fake_vtbl)); +// fake_vtbl[1] = (void*)dummy; +// } +// myVTBL = fake_vtbl + 1; +// Name = "Server"; +// Perm = 4; +// lvl = Global; +// } +// }; - [[deprecated]] - ServerCommandOrigin() - { - if (fake_vtbl[1] == nullptr) { - memcpy(fake_vtbl, (void**)(SYM("??_7ServerCommandOrigin@@6B@")) - 1, sizeof(fake_vtbl)); - fake_vtbl[1] = (void*)dummy; - } - myVTBL = fake_vtbl + 1; - Name = "Server"; - Perm = 4; - lvl = Global; - } - }; - -// LIAPI static bool executeCommandAs(Player* player, const string& cmd); -// LIAPI static std::pair executeCommandEx(const string& cmd); -// LIAPI static bool executeCommand(const string& cmd); + LIAPI static bool executeCommandAs(Player* player, const string& cmd); + LIAPI static std::pair executeCommandEx(const string& cmd); + LIAPI static bool executeCommand(const string& cmd); //For compatibility -// LIAPI static bool runcmdAs(Player* pl, const string& cmd) -// { -// return executeCommandAs(pl, cmd); -// } -// LIAPI static std::pair runcmdEx(const string& cmd) -// { -// return executeCommandEx(cmd); -// } -// LIAPI static bool runcmd(const string& cmd) -// { -// return executeCommand(cmd); -// } + LIAPI static bool runcmdAs(Player* pl, const string& cmd) + { + return executeCommandAs(pl, cmd); + } + LIAPI static std::pair runcmdEx(const string& cmd) + { + return executeCommandEx(cmd); + } + LIAPI static bool runcmd(const string& cmd) + { + return executeCommand(cmd); + } #undef AFTER_EXTRA #ifndef DISABLE_CONSTRUCTOR_PREVENTION_LEVEL diff --git a/LiteLoader/Header/MC/ServerCommandOrigin.hpp b/LiteLoader/Header/MC/ServerCommandOrigin.hpp index 4f8bc46..2d8d9f4 100644 --- a/LiteLoader/Header/MC/ServerCommandOrigin.hpp +++ b/LiteLoader/Header/MC/ServerCommandOrigin.hpp @@ -13,6 +13,9 @@ class ServerCommandOrigin : public CommandOrigin { #define AFTER_EXTRA + ServerLevel *mServerLevel; + std::string mRequestID; + CommandPermissionLevel mCommandPermissionLevel; #undef AFTER_EXTRA #ifndef DISABLE_CONSTRUCTOR_PREVENTION_SERVERCOMMANDORIGIN public: diff --git a/LiteLoader/Kernel/MC/LevelAPI.cpp b/LiteLoader/Kernel/MC/LevelAPI.cpp index 3de80fd..21bcb97 100644 --- a/LiteLoader/Kernel/MC/LevelAPI.cpp +++ b/LiteLoader/Kernel/MC/LevelAPI.cpp @@ -64,23 +64,23 @@ Block* Level::getBlock(const BlockPos& pos, BlockSource* blockSource) { // Return nullptr when failing to get block -// Block* Level::getBlockEx(const BlockPos& pos, int dimId) { -// auto dim = Global->getDimension(dimId); -// if (!dim) -// return nullptr; + Block* Level::getBlockEx(const BlockPos& pos, int dimId) { + auto dim = Global->getDimension(dimId); + if (!dim) + return nullptr; -// auto bs = &dim->getBlockSourceFromMainChunkSource(); -// auto lc = bs->getChunkAt(pos); -// if (!lc) -// return nullptr; + auto bs = &dim->getBlockSourceFromMainChunkSource(); + auto lc = bs->getChunkAt(pos); + if (!lc) + return nullptr; -// short minHeight = dim->getMinHeight(); -// if (pos.y < minHeight || pos.y > dim->getHeight()) -// return nullptr; + short minHeight = dim->getHeight(); + if (pos.y < minHeight || pos.y > dim->getHeight()) + return nullptr; -// ChunkBlockPos cbpos = ChunkBlockPos(pos, minHeight); -// return const_cast(&lc->getBlock(cbpos)); -// } + ChunkBlockPos cbpos = ChunkBlockPos(pos, minHeight); + return const_cast(&lc->getBlock(cbpos)); + } BlockInstance Level::getBlockInstance(BlockPos* pos, int dimId) { return {*pos, dimId}; @@ -158,7 +158,7 @@ Actor* Level::getDamageSourceEntity(ActorDamageSource* ads) { return Global->getEntity(v6); } -void* Level::ServerCommandOrigin::fake_vtbl[26]; +//void* Level::ServerCommandOrigin::fake_vtbl[26]; CompoundTag& getServerOriginTag() { static auto cached = CompoundTag::fromSNBT(R"({"CommandPermissionLevel":4b,"DimensionId":"Overworld","OriginType":7b,"RequestId":"00000000-0000-0000-0000-000000000000"})"); @@ -172,31 +172,35 @@ std::unique_ptr getPlayerOriginTag(Player& player) { return std::move(tag); } -// bool Level::executeCommand(const string& cmd) { -// auto origin = ::ServerCommandOrigin::load(getServerOriginTag(), *Global); -// return MinecraftCommands::_runcmd(std::move(origin), cmd); -// } + bool Level::executeCommand(const string& cmd) { + //auto origin = ::ServerCommandOrigin::load(getServerOriginTag(), *Global); + std::string requestID = "00000000-0000-0000-0000-000000000000"; + std::unique_ptr origin(new ServerCommandOrigin(requestID,*Global, CommandPermissionLevel(4))); + return MinecraftCommands::_runcmd(std::move(origin), cmd); + } std::unordered_map resultOfOrigin = {}; -// std::pair Level::executeCommandEx(const string& cmd) { -// auto origin = ::ServerCommandOrigin::load(getServerOriginTag(), *Global); -// string val; -// auto ptr = origin.get(); -// resultOfOrigin[ptr] = &val; -// bool rv = MinecraftCommands::_runcmd(std::move(origin), cmd); -// if (resultOfOrigin.count(ptr)) -// resultOfOrigin.erase(ptr); -// return {rv, std::move(val)}; -// } + std::pair Level::executeCommandEx(const string& cmd) { + //auto origin = ::ServerCommandOrigin::load(getServerOriginTag(), *Global); + const std::string requestID = "00000000-0000-0000-0000-000000000000"; + std::unique_ptr origin(new ServerCommandOrigin(requestID,*Global, CommandPermissionLevel(4))); + string val; + auto ptr = origin.get(); + resultOfOrigin[ptr] = &val; + bool rv = MinecraftCommands::_runcmd(std::move(origin), cmd); + if (resultOfOrigin.count(ptr)) + resultOfOrigin.erase(ptr); + return {rv, std::move(val)}; + } // static void* FAKE_PORGVTBL[26]; -// bool Level::executeCommandAs(Player* pl, const string& cmd) { -// auto tag = getPlayerOriginTag(*pl); -// auto origin = PlayerCommandOrigin::load(*tag, *Global); -// return MinecraftCommands::_runcmd(std::move(origin), cmd); -// } + bool Level::executeCommandAs(Player* pl, const string& cmd) { + auto tag = getPlayerOriginTag(*pl); + std::unique_ptr origin(new PlayerCommandOrigin(*pl)); + return MinecraftCommands::_runcmd(std::move(origin), cmd); + } std::vector Level::getAllPlayers() {