diff --git a/LiteLoader/Header/MC/Actor.hpp b/LiteLoader/Header/MC/Actor.hpp index 1549eb3..ef8c242 100644 --- a/LiteLoader/Header/MC/Actor.hpp +++ b/LiteLoader/Header/MC/Actor.hpp @@ -32,7 +32,7 @@ public: LIAPI std::string getTypeName() const; LIAPI Vec3 getFeetPosition() const; - //LIAPI BlockSource* getBlockSource() const; + LIAPI BlockSource* getBlockSource() const; LIAPI Vec2* getDirection() const; LIAPI ActorUniqueID getActorUniqueId() const; LIAPI Vec3 getCameraPos() const; @@ -79,6 +79,10 @@ public: inline bool isMoving() const{ return getStatusFlag(ActorFlags::MOVING); }; + inline bool hasCategory(enum ActorCategory actorCategory) const{ + // IDA Player::take Line123 + return (dAccess(this, 79) & actorCategory) !=0; + }; #undef AFTER_EXTRA #ifndef DISABLE_CONSTRUCTOR_PREVENTION_ACTOR diff --git a/LiteLoader/Header/MC/ActorDefinitionIdentifier.hpp b/LiteLoader/Header/MC/ActorDefinitionIdentifier.hpp index 2dd9a5c..b927c94 100644 --- a/LiteLoader/Header/MC/ActorDefinitionIdentifier.hpp +++ b/LiteLoader/Header/MC/ActorDefinitionIdentifier.hpp @@ -4,7 +4,7 @@ #include "../Global.h" #define BEFORE_EXTRA - +#include "MC/HashedString.hpp" #undef BEFORE_EXTRA struct ActorDefinitionIdentifier { diff --git a/LiteLoader/Header/MC/Bedrock.hpp b/LiteLoader/Header/MC/Bedrock.hpp index ec98c80..00c6d9e 100644 --- a/LiteLoader/Header/MC/Bedrock.hpp +++ b/LiteLoader/Header/MC/Bedrock.hpp @@ -10,7 +10,23 @@ namespace Bedrock { #define AFTER_EXTRA - +// Add Member There +struct PlatformRuntimeInfo { + PlatformRuntimeInfo() = delete; + PlatformRuntimeInfo(PlatformRuntimeInfo const&) = delete; + PlatformRuntimeInfo(PlatformRuntimeInfo const&&) = delete; +}; +class CrashTelemetryProcessor { +public: + CrashTelemetryProcessor() = delete; + CrashTelemetryProcessor(CrashTelemetryProcessor const&) = delete; + CrashTelemetryProcessor(CrashTelemetryProcessor const&&) = delete; +}; +struct CrashUploadStatus { + CrashUploadStatus() = delete; + CrashUploadStatus(CrashUploadStatus const&) = delete; + CrashUploadStatus(CrashUploadStatus const&&) = delete; +}; template class NonOwnerPointer { public: @@ -19,7 +35,71 @@ public: NonOwnerPointer(T0& a1) { mPtr = std::make_shared(a1); } - + +}; +struct StorageMigration { + enum StorageMigrationType; + StorageMigration() = delete; + StorageMigration(StorageMigration const&) = delete; + StorageMigration(StorageMigration const&&) = delete; +}; + + + + +namespace PubSub { +class Subscription { +public: + Subscription() = delete; + Subscription(Subscription const&) = delete; + Subscription(Subscription const&&) = delete; +}; +} // namespace PubSub +namespace Threading { +enum AsyncStatus; +template +class UniqueLock; + +class CountReference +{ +public: + CountReference() = delete; + CountReference(CountReference const&) = delete; + CountReference(CountReference const&&) = delete; +}; +template +class IAsyncResult { +public: + IAsyncResult() = delete; + IAsyncResult(IAsyncResult const&) = delete; + IAsyncResult(IAsyncResult const&&) = delete; +}; +template +class ThreadLocalObject { +public: + ThreadLocalObject() = delete; + ThreadLocalObject(ThreadLocalObject const&) = delete; + ThreadLocalObject(ThreadLocalObject const&&) = delete; +}; +//template +//class LockGuard +//{ +// MCAPI LockGuard(T); +// MCAPI ~LockGuard(); +//}; +} // namespace Threading + +class ScopeExit; +class Http { +public: + enum Implementation; +}; +class SessionInfo +{ +public: + SessionInfo() = delete; + SessionInfo(SessionInfo const&) = delete; + SessionInfo(SessionInfo const&&) = delete; }; #undef AFTER_EXTRA diff --git a/LiteLoader/Header/MC/BedrockLog.hpp b/LiteLoader/Header/MC/BedrockLog.hpp index 4a0e7c4..25603b7 100644 --- a/LiteLoader/Header/MC/BedrockLog.hpp +++ b/LiteLoader/Header/MC/BedrockLog.hpp @@ -5,13 +5,28 @@ #include "Core.hpp" #define BEFORE_EXTRA - +// Include Headers or Declare Types Here +enum LogAreaID; #undef BEFORE_EXTRA namespace BedrockLog { #define AFTER_EXTRA - +// Add Member There +class LogAreaFilter { +public: + LogAreaFilter() = delete; + LogAreaFilter(LogAreaFilter const&) = delete; + LogAreaFilter(LogAreaFilter const&&) = delete; +}; +enum LogChannel; +enum LogRule; +enum LogCategory; +struct LogDetails { + LogDetails() = delete; + LogDetails(LogDetails const&) = delete; + LogDetails(LogDetails const&&) = delete; +}; #undef AFTER_EXTRA MCAPI enum LogAreaID _areaFilterFromString(std::string const &); MCAPI bool _constructAreaFilterFromString(std::string const &, class BedrockLog::LogAreaFilter &); diff --git a/LiteLoader/Header/MC/BlockSource.hpp b/LiteLoader/Header/MC/BlockSource.hpp index 72f9473..0cd2939 100644 --- a/LiteLoader/Header/MC/BlockSource.hpp +++ b/LiteLoader/Header/MC/BlockSource.hpp @@ -8,7 +8,8 @@ #include "Dimension.hpp" #undef BEFORE_EXTRA - +#include "MC/LevelChunk.hpp" +#include "MC/ChunkPos.hpp" class BlockSource { #define AFTER_EXTRA @@ -20,11 +21,15 @@ public: // MCAPI static const std::function CHECK_ALL_BLOCKS; // }; LIAPI BlockInstance getBlockInstance(BlockPos); - inline AutomaticID getDimensionId(){ + AutomaticID getDimensionId(){ //Dimension::onBlockEvent Line24 Dimension* mDimension = dAccess< Dimension*>(this, 4); - return dAccess>(mDimension, 192); + return dAccess>(mDimension, 192); }; + LevelChunk * getChunkAt(BlockPos& pos) const{ + ChunkPos chunkPos = ChunkPos(pos.x>>4, pos.z>>4); + return getChunk(chunkPos); + } #undef AFTER_EXTRA #ifndef DISABLE_CONSTRUCTOR_PREVENTION_BLOCKSOURCE diff --git a/LiteLoader/Header/MC/ChunkPos.hpp b/LiteLoader/Header/MC/ChunkPos.hpp index 275e084..c881757 100644 --- a/LiteLoader/Header/MC/ChunkPos.hpp +++ b/LiteLoader/Header/MC/ChunkPos.hpp @@ -10,7 +10,15 @@ class ChunkPos { #define AFTER_EXTRA - + // Add Member There +public: + int x, z; + long long hash() { + return *((long long*)this); + } + ChunkPos(int ix, int iz) + : x(ix) + , z(iz){}; #undef AFTER_EXTRA #ifndef DISABLE_CONSTRUCTOR_PREVENTION_CHUNKPOS public: diff --git a/LiteLoader/Header/MC/ColorFormat.hpp b/LiteLoader/Header/MC/ColorFormat.hpp index 5e0c898..01f4672 100644 --- a/LiteLoader/Header/MC/ColorFormat.hpp +++ b/LiteLoader/Header/MC/ColorFormat.hpp @@ -4,7 +4,7 @@ #include "../Global.h" #define BEFORE_EXTRA - +using namespace mce; #undef BEFORE_EXTRA namespace ColorFormat { @@ -45,8 +45,8 @@ LIAPI std::string& transferColorCodeToConsole(std::string& str, bool keepColorCo MCAPI extern std::string const BLACK; MCAPI extern std::string const BLUE; MCAPI extern std::string const BOLD; - MCAPI std::string ColorCodeFromColor(class mce::Color const &); - MCAPI class mce::Color const * ColorFromColorCode(std::string const &); + MCAPI std::string ColorCodeFromColor(class Color const &); + MCAPI class Color const * ColorFromColorCode(std::string const &); MCAPI extern std::string const DARK_AQUA; MCAPI extern std::string const DARK_BLUE; MCAPI extern std::string const DARK_GRAY; diff --git a/LiteLoader/Header/MC/CommandRegistry.hpp b/LiteLoader/Header/MC/CommandRegistry.hpp index f50c762..699002a 100644 --- a/LiteLoader/Header/MC/CommandRegistry.hpp +++ b/LiteLoader/Header/MC/CommandRegistry.hpp @@ -4,13 +4,41 @@ #include "../Global.h" #define BEFORE_EXTRA - +template +class typeid_t { +public: + typeid_t& operator=(typeid_t const&) = delete; + typeid_t(typeid_t const&) = delete; +}; #undef BEFORE_EXTRA class CommandRegistry { #define AFTER_EXTRA +public: + struct ParseTable; + class Symbol { + Symbol& operator=(Symbol const&) = delete; + Symbol(Symbol const&) = delete; + }; + struct ParseToken { + ParseToken() = delete; + ParseToken(ParseToken const&) = delete; + ParseToken(ParseToken const&&) = delete; + }; + + struct Overload { + Overload() = delete; + Overload(Overload const&) = delete; + Overload(Overload const&&) = delete; + }; + + struct Signature { + Signature() = delete; + Signature(Signature const&) = delete; + Signature(Signature const&&) = delete; + }; #undef AFTER_EXTRA #ifndef DISABLE_CONSTRUCTOR_PREVENTION_COMMANDREGISTRY public: diff --git a/LiteLoader/Header/MC/DBStorage.hpp b/LiteLoader/Header/MC/DBStorage.hpp index 162c27f..5856e93 100644 --- a/LiteLoader/Header/MC/DBStorage.hpp +++ b/LiteLoader/Header/MC/DBStorage.hpp @@ -8,13 +8,20 @@ #include "LevelStorage.hpp" #define BEFORE_EXTRA - +// Include Headers or Declare Types Here +#include "third-party/leveldb/status.h" #undef BEFORE_EXTRA class DBStorage : public LevelStorage { #define AFTER_EXTRA - + // Add Member There +public: + struct PendingWriteResult { + PendingWriteResult() = delete; + PendingWriteResult(PendingWriteResult const&) = delete; + PendingWriteResult(PendingWriteResult const&&) = delete; + }; #undef AFTER_EXTRA #ifndef DISABLE_CONSTRUCTOR_PREVENTION_DBSTORAGE public: diff --git a/LiteLoader/Header/MC/Dimension.hpp b/LiteLoader/Header/MC/Dimension.hpp index afbb787..5ed6d2b 100644 --- a/LiteLoader/Header/MC/Dimension.hpp +++ b/LiteLoader/Header/MC/Dimension.hpp @@ -4,15 +4,15 @@ #include "../Global.h" #define BEFORE_EXTRA - +#include "MC/BlockSource.hpp" #undef BEFORE_EXTRA class Dimension { #define AFTER_EXTRA public: - LIAPI BlockSource& getBlockSourceFromMainChunkSource(){ - return dAccess(this, 96); + BlockSource& getBlockSourceFromMainChunkSource() const{ + return *dAccess(this, 96); }; #undef AFTER_EXTRA #ifndef DISABLE_CONSTRUCTOR_PREVENTION_DIMENSION diff --git a/LiteLoader/Header/MC/Level.hpp b/LiteLoader/Header/MC/Level.hpp index f60f964..b2e1327 100644 --- a/LiteLoader/Header/MC/Level.hpp +++ b/LiteLoader/Header/MC/Level.hpp @@ -120,25 +120,25 @@ public: } }; - 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/LevelChunk.hpp b/LiteLoader/Header/MC/LevelChunk.hpp index 69a89f0..7221ee7 100644 --- a/LiteLoader/Header/MC/LevelChunk.hpp +++ b/LiteLoader/Header/MC/LevelChunk.hpp @@ -39,6 +39,11 @@ struct HardcodedSpawningArea { class BoundingBox aabb; enum HardcodedSpawnAreaType type; }; +public: + struct Tick const & getLastTick() const{ + //CommandAreaFactory::_getArea Line156 + return *dAccess(this, 144); + }; #undef AFTER_EXTRA #ifndef DISABLE_CONSTRUCTOR_PREVENTION_LEVELCHUNK public: diff --git a/LiteLoader/Header/MC/LevelStorageWriteBatch.hpp b/LiteLoader/Header/MC/LevelStorageWriteBatch.hpp index 75dee83..e46f7bc 100644 --- a/LiteLoader/Header/MC/LevelStorageWriteBatch.hpp +++ b/LiteLoader/Header/MC/LevelStorageWriteBatch.hpp @@ -10,7 +10,13 @@ class LevelStorageWriteBatch { #define AFTER_EXTRA - + // Add Member There +public: + struct BatchEntry { + BatchEntry() = delete; + BatchEntry(BatchEntry const&) = delete; + BatchEntry(BatchEntry const&&) = delete; + }; #undef AFTER_EXTRA #ifndef DISABLE_CONSTRUCTOR_PREVENTION_LEVELSTORAGEWRITEBATCH public: diff --git a/LiteLoader/Header/MC/MapItemTrackedActor.hpp b/LiteLoader/Header/MC/MapItemTrackedActor.hpp index a1ec9ac..a4f68ad 100644 --- a/LiteLoader/Header/MC/MapItemTrackedActor.hpp +++ b/LiteLoader/Header/MC/MapItemTrackedActor.hpp @@ -10,7 +10,13 @@ class MapItemTrackedActor { #define AFTER_EXTRA - + // Add Member There +public: + struct UniqueId { + UniqueId() = delete; + UniqueId(UniqueId const&) = delete; + UniqueId(UniqueId const&&) = delete; + }; #undef AFTER_EXTRA #ifndef DISABLE_CONSTRUCTOR_PREVENTION_MAPITEMTRACKEDACTOR public: diff --git a/LiteLoader/Header/MC/NetworkPeer.hpp b/LiteLoader/Header/MC/NetworkPeer.hpp index 94e3dde..13aabb8 100644 --- a/LiteLoader/Header/MC/NetworkPeer.hpp +++ b/LiteLoader/Header/MC/NetworkPeer.hpp @@ -10,7 +10,41 @@ class NetworkPeer { #define AFTER_EXTRA + // Add Member There +public: + enum Reliability : int { + Reliable = 0x0, + ReliableOrdered = 0x1, + Unreliable = 0x2, + UnreliableSequenced = 0x3, + }; + enum DataStatus : int { + HasData = 0x0, + NoData = 0x1, + BrokenData = 0x2, + }; + + enum NetworkLoad : __int32 { + Unrestricted = 0x0, + Low = 0x1, + Medium = 0x2, + High = 0x3, + }; + + struct NetworkStatus { + NetworkLoad mLoad; + int mCurrentPing; + int mAveragePing; + int mApproximateMaxBps; + float mCurrentPacketLoss; + float mAveragePacketLoss; + unsigned __int64 mTotalBytesReceived; + unsigned __int64 mTotalBytesSent; + unsigned __int64 unk40; + int unk48; + bool unk52; + }; #undef AFTER_EXTRA #ifndef DISABLE_CONSTRUCTOR_PREVENTION_NETWORKPEER public: diff --git a/LiteLoader/Header/MC/PlayerActionPacket.hpp b/LiteLoader/Header/MC/PlayerActionPacket.hpp index ce44194..48ecc15 100644 --- a/LiteLoader/Header/MC/PlayerActionPacket.hpp +++ b/LiteLoader/Header/MC/PlayerActionPacket.hpp @@ -46,9 +46,9 @@ class PlayerActionPacket : public Packet { // Add Member There public: BlockPos position; // 48 - FaceID blockFace; // 72 - PlayerActionType actionType; // 76 - ActorRuntimeID runtimeID; // 80 + FaceID blockFace; // 60 + PlayerActionType actionType; // 64 + ActorRuntimeID runtimeID; // 72 inline std::string toDebugString() { return fmt::format("{}: position: ({}), blockFace: {}, actionType: {}, runtimeID: {}", diff --git a/LiteLoader/Header/MC/PropertiesSettings.hpp b/LiteLoader/Header/MC/PropertiesSettings.hpp index 4c50493..3a99e1a 100644 --- a/LiteLoader/Header/MC/PropertiesSettings.hpp +++ b/LiteLoader/Header/MC/PropertiesSettings.hpp @@ -10,7 +10,11 @@ class PropertiesSettings { #define AFTER_EXTRA - +public: + inline bool useOnlineAuthentication(){ + //PropertiesSettings::PropertiesSettings Line550; + return dAccess(this, 417); + } #undef AFTER_EXTRA #ifndef DISABLE_CONSTRUCTOR_PREVENTION_PROPERTIESSETTINGS public: diff --git a/LiteLoader/Header/MC/RakNet.hpp b/LiteLoader/Header/MC/RakNet.hpp index af30007..a38ab69 100644 --- a/LiteLoader/Header/MC/RakNet.hpp +++ b/LiteLoader/Header/MC/RakNet.hpp @@ -25,7 +25,7 @@ namespace RakNet { struct SystemAddress { char filler[17 * 8]; // uncertain? - MCAPI const char* ToString(bool, char) const; + MCAPI void ToString_New(bool, char, char*); }; struct RakNetGUID { uint64_t unk; diff --git a/LiteLoader/Header/MC/RakPeerHelper.hpp b/LiteLoader/Header/MC/RakPeerHelper.hpp index 4790a08..c19da56 100644 --- a/LiteLoader/Header/MC/RakPeerHelper.hpp +++ b/LiteLoader/Header/MC/RakPeerHelper.hpp @@ -11,6 +11,12 @@ class RakPeerHelper { #define AFTER_EXTRA +public: + struct IPSupportInterface{ + IPSupportInterface() = delete; + IPSupportInterface(struct IPSupportInterface&) = delete; + IPSupportInterface(struct IPSupportInterface&&) = delete; + }; #undef AFTER_EXTRA #ifndef DISABLE_CONSTRUCTOR_PREVENTION_RAKPEERHELPER diff --git a/LiteLoader/Header/MC/VarIntDataOutput.hpp b/LiteLoader/Header/MC/VarIntDataOutput.hpp index 976b26f..97e3be1 100644 --- a/LiteLoader/Header/MC/VarIntDataOutput.hpp +++ b/LiteLoader/Header/MC/VarIntDataOutput.hpp @@ -10,7 +10,11 @@ class VarIntDataOutput { #define AFTER_EXTRA - + BinaryStream *mStream; +public: + VarIntDataOutput(BinaryStream *stream){ + mStream = stream; + }; #undef AFTER_EXTRA #ifndef DISABLE_CONSTRUCTOR_PREVENTION_VARINTDATAOUTPUT public: diff --git a/LiteLoader/Header/RegCommandAPI.h b/LiteLoader/Header/RegCommandAPI.h index 150d661..ba2b1f0 100644 --- a/LiteLoader/Header/RegCommandAPI.h +++ b/LiteLoader/Header/RegCommandAPI.h @@ -1,87 +1,87 @@ -#pragma once -#include "Global.h" -#include "MC/Actor.hpp" -#include "MC/Player.hpp" -#include "MC/Command.hpp" -#include "MC/CommandMessage.hpp" -#include "MC/CommandOutput.hpp" -#include "MC/CommandParameterData.hpp" -#include "MC/CommandPosition.hpp" -#include "MC/CommandSelector.hpp" -#include "MC/CommandRegistry.hpp" -#include - -namespace RegisterCommandHelper { -template -static int getOffset(Type Command::*src) { - union { - Type Command::*src; - int value; - } u; - u.src = src; - return u.value; -} - -using ParseFn = bool (CommandRegistry::*)( - void*, CommandRegistry::ParseToken const&, CommandOrigin const&, int, std::string&, - std::vector&) const; - -template -static CommandParameterData makeMandatory(Type Command::*field, std::string name, bool Command::*isSet = nullptr) { - - return { - type_id(), - CommandRegistry::getParseFn(), - name, - CommandParameterDataType::NORMAL, - nullptr, - getOffset(field), - false, - isSet ? getOffset(isSet) : -1, - }; -} -template -static CommandParameterData - makeMandatory(Type Command::*field, std::string name, char const* desc = nullptr, bool Command::*isSet = nullptr) { - return { - type_id(), - CommandRegistry::getParseFn(), - name, - DataType, - desc, - getOffset(field), - false, - isSet ? getOffset(isSet) : -1, - }; -} -template -static CommandParameterData makeOptional(Type Command::*field, std::string name, bool Command::*isSet = nullptr) { - typeid_t tpid{0}; - - return { - type_id(), - CommandRegistry::getParseFn(), - name, - CommandParameterDataType::NORMAL, - nullptr, - getOffset(field), - true, - isSet ? getOffset(isSet) : -1, - }; -} -template -static CommandParameterData - makeOptional(Type Command::*field, std::string name, char const* desc = nullptr, bool Command::*isSet = nullptr) { - - return { - type_id(), - CommandRegistry::getParseFn(), - name, - DataType, - desc, - getOffset(field), - true, - isSet ? getOffset(isSet) : -1, - }; -} -} // namespace RegisterCommandHelper +//#pragma once +//#include "Global.h" +//#include "MC/Actor.hpp" +//#include "MC/Player.hpp" +//#include "MC/Command.hpp" +//#include "MC/CommandMessage.hpp" +//#include "MC/CommandOutput.hpp" +//#include "MC/CommandParameterData.hpp" +//#include "MC/CommandPosition.hpp" +//#include "MC/CommandSelector.hpp" +//#include "MC/CommandRegistry.hpp" +//#include +// +//namespace RegisterCommandHelper { +//template +//static int getOffset(Type Command::*src) { +// union { +// Type Command::*src; +// int value; +// } u; +// u.src = src; +// return u.value; +//} +// +//using ParseFn = bool (CommandRegistry::*)( +// void*, CommandRegistry::ParseToken const&, CommandOrigin const&, int, std::string&, +// std::vector&) const; +// +//template +//static CommandParameterData makeMandatory(Type Command::*field, std::string name, bool Command::*isSet = nullptr) { +// +// return { +// type_id(), +// CommandRegistry::getParseFn(), +// name, +// CommandParameterDataType::NORMAL, +// nullptr, +// getOffset(field), +// false, +// isSet ? getOffset(isSet) : -1, +// }; +//} +//template +//static CommandParameterData +// makeMandatory(Type Command::*field, std::string name, char const* desc = nullptr, bool Command::*isSet = nullptr) { +// return { +// type_id(), +// CommandRegistry::getParseFn(), +// name, +// DataType, +// desc, +// getOffset(field), +// false, +// isSet ? getOffset(isSet) : -1, +// }; +//} +//template +//static CommandParameterData makeOptional(Type Command::*field, std::string name, bool Command::*isSet = nullptr) { +// typeid_t tpid{0}; +// +// return { +// type_id(), +// CommandRegistry::getParseFn(), +// name, +// CommandParameterDataType::NORMAL, +// nullptr, +// getOffset(field), +// true, +// isSet ? getOffset(isSet) : -1, +// }; +//} +//template +//static CommandParameterData +// makeOptional(Type Command::*field, std::string name, char const* desc = nullptr, bool Command::*isSet = nullptr) { +// +// return { +// type_id(), +// CommandRegistry::getParseFn(), +// name, +// DataType, +// desc, +// getOffset(field), +// true, +// isSet ? getOffset(isSet) : -1, +// }; +//} +//} // namespace RegisterCommandHelper diff --git a/LiteLoader/Kernel/MC/ActorAPI.cpp b/LiteLoader/Kernel/MC/ActorAPI.cpp index 8d54178..a4a0d99 100644 --- a/LiteLoader/Kernel/MC/ActorAPI.cpp +++ b/LiteLoader/Kernel/MC/ActorAPI.cpp @@ -37,9 +37,9 @@ MCINLINE Vec3 Actor::getFeetPosition() const { return CommandUtils::getFeetPos(this); } -// BlockSource* Actor::getBlockSource() const { -// return Level::getBlockSource((Actor*)this); -// } + BlockSource* Actor::getBlockSource() const { + return Level::getBlockSource((Actor*)this); + } bool Actor::isPlayer(bool allowSimulatedPlayer) const { if (!this) @@ -51,9 +51,9 @@ bool Actor::isPlayer(bool allowSimulatedPlayer) const { } catch (...) { return false; } } -// bool Actor::isItemActor() const { -// return hasCategory((ActorCategory)1024); // IDA Player::take -// } + bool Actor::isItemActor() const { + return hasCategory((ActorCategory)1024); // IDA Player::take + } bool Actor::isOnGround() const { return (dAccess(this)); // IDA DirectActorProxyImpl::isOnGround @@ -169,16 +169,16 @@ Vec3 Actor::getCameraPos() const { return pos; } -// Tick* Actor::getLastTick() const { -// auto bs = getBlockSource(); -// if (!bs) -// return nullptr; -// auto bpos = getPos().toBlockPos(); -// LevelChunk* lc = bs->getChunkAt(bpos); -// if (!lc) -// return nullptr; -// return (Tick*)&lc->getLastTick(); -// } + Tick* Actor::getLastTick() const { + auto bs = getBlockSource(); + if (!bs) + return nullptr; + auto bpos = getPos().toBlockPos(); + LevelChunk* lc = bs->getChunkAt(bpos); + if (!lc) + return nullptr; + return (Tick*)&lc->getLastTick(); + } //enum ActorLocation; // BlockInstance Actor::getBlockFromViewVector(FaceID& face, bool includeLiquid, bool solidOnly, float maxDistance, bool ignoreBorderBlocks, bool fullOnly) const { diff --git a/LiteLoader/Kernel/MC/NetworkIdentifierAPI.cpp b/LiteLoader/Kernel/MC/NetworkIdentifierAPI.cpp index 3c7ea1c..e706898 100644 --- a/LiteLoader/Kernel/MC/NetworkIdentifierAPI.cpp +++ b/LiteLoader/Kernel/MC/NetworkIdentifierAPI.cpp @@ -2,6 +2,7 @@ #include string NetworkIdentifier::getIP() { - string rv = Global->getAdr(*this).ToString(true, ':'); + string rv; + Global->getAdr(*this).ToString_New(true, ':', rv.data()); return rv.substr(0, rv.find('|')); } \ No newline at end of file diff --git a/LiteLoader/Kernel/Network/BinaryStreamAPI.cpp b/LiteLoader/Kernel/Network/BinaryStreamAPI.cpp index aaa0811..eb9a12c 100644 --- a/LiteLoader/Kernel/Network/BinaryStreamAPI.cpp +++ b/LiteLoader/Kernel/Network/BinaryStreamAPI.cpp @@ -71,15 +71,9 @@ std::string& BinaryStream::getRaw() { return *dAccess(this); // BinaryStream::getAndReleaseData } -struct IDataOutput{ - void* pVT; - BinaryStream* pBinaryStream; -}; void BinaryStream::writeCompoundTag(class CompoundTag const& tag) { //serialize::write in case 5 - IDataOutput pVTVarIntDataOutput; - pVTVarIntDataOutput.pVT = dlsym("??_7VarIntDataOutput@@6B@"); - pVTVarIntDataOutput.pBinaryStream = this; - NbtIo::write(&tag,pVTVarIntDataOutput); + VarIntDataOutput pVTVarIntDataOutput = VarIntDataOutput(this); + NbtIo::write(&tag,(IDataOutput&)pVTVarIntDataOutput); } \ No newline at end of file diff --git a/LiteLoader/Kernel/Network/PacketAPI.cpp b/LiteLoader/Kernel/Network/PacketAPI.cpp index 8929cef..2d6ade5 100644 --- a/LiteLoader/Kernel/Network/PacketAPI.cpp +++ b/LiteLoader/Kernel/Network/PacketAPI.cpp @@ -845,7 +845,7 @@ static_assert(sizeof(MobArmorEquipmentPacket) == 0x198 || sizeof(MobArmorEquipme static_assert(sizeof(InteractPacket) == 0x50 || sizeof(InteractPacket) == 48, "size of InteractPacket should be 80 or 48(default)"); static_assert(sizeof(BlockPickRequestPacket) == 0x40 || sizeof(BlockPickRequestPacket) == 48, "size of BlockPickRequestPacket should be 64 or 48(default)"); static_assert(sizeof(ActorPickRequestPacket) == 0x40 || sizeof(ActorPickRequestPacket) == 48, "size of ActorPickRequestPacket should be 64 or 48(default)"); -static_assert(sizeof(PlayerActionPacket) == 0x58 || sizeof(PlayerActionPacket) == 48, "size of PlayerActionPacket should be 88 or 48(default)"); +static_assert(sizeof(PlayerActionPacket) == 0x50 || sizeof(PlayerActionPacket) == 48, "size of PlayerActionPacket should be 88 or 48(default)"); static_assert(sizeof(HurtArmorPacket) == 0x40 || sizeof(HurtArmorPacket) == 48, "size of HurtArmorPacket should be 64 or 48(default)"); static_assert(sizeof(SetActorDataPacket) == 0x58 || sizeof(SetActorDataPacket) == 48, "size of SetActorDataPacket should be 88 or 48(default)"); static_assert(sizeof(SetActorMotionPacket) == 0x48 || sizeof(SetActorMotionPacket) == 48, "size of SetActorMotionPacket should be 72 or 48(default)"); diff --git a/LiteLoader/Kernel/ParticleAPI.cpp b/LiteLoader/Kernel/ParticleAPI.cpp index 84e0a0f..9a4e60a 100644 --- a/LiteLoader/Kernel/ParticleAPI.cpp +++ b/LiteLoader/Kernel/ParticleAPI.cpp @@ -9,11 +9,11 @@ #include #include #include -void InitParticle() { - Event::ResourcePackInitEvent::subscribe([](const Event::ResourcePackInitEvent& ev) { - ev.mRepo->setCustomResourcePackPath(PackType::PackType_Resources, R"(plugins/LiteLoader/ResourcePacks)"); - return true; - }); -} - -ParticleAPI ParticleCUI::api{}; \ No newline at end of file +//void InitParticle() { +// Event::ResourcePackInitEvent::subscribe([](const Event::ResourcePackInitEvent& ev) { +// ev.mRepo->setCustomResourcePackPath(PackType::PackType_Resources, R"(plugins/LiteLoader/ResourcePacks)"); +// return true; +// }); +//} +// +//ParticleAPI ParticleCUI::api{}; \ No newline at end of file diff --git a/LiteLoader/Kernel/PlayerInfoAPI.cpp b/LiteLoader/Kernel/PlayerInfoAPI.cpp index 53cf18b..a4755a3 100644 --- a/LiteLoader/Kernel/PlayerInfoAPI.cpp +++ b/LiteLoader/Kernel/PlayerInfoAPI.cpp @@ -148,7 +148,7 @@ bool InitPlayerDatabase() { // return true; // }); Event::PlayerJoinEvent::subscribe([](const Event::PlayerJoinEvent& e) { - if (!e.mPlayer->isSimulatedPlayer()) { + if (!e.mPlayer) { insert(e.mPlayer->getRealName(), e.mPlayer->getXuid(), e.mPlayer->getUuid()); } return true; diff --git a/LiteLoader/Kernel/Scoreboard/ObjectiveAPI.cpp b/LiteLoader/Kernel/Scoreboard/ObjectiveAPI.cpp index d379741..ff5af16 100644 --- a/LiteLoader/Kernel/Scoreboard/ObjectiveAPI.cpp +++ b/LiteLoader/Kernel/Scoreboard/ObjectiveAPI.cpp @@ -28,5 +28,5 @@ bool Objective::setDisplay(const std::string& slotName, ObjectiveSortOrder sort) std::string Objective::getName(){ //ScoreboardCommand::applyPlayerOperation Line186 - return dAccess(this, 64); + return dAccess(this, 64); }; \ No newline at end of file diff --git a/LiteLoader/Main/AddonsHelper.cpp b/LiteLoader/Main/AddonsHelper.cpp index 9d5274a..d4c5484 100644 --- a/LiteLoader/Main/AddonsHelper.cpp +++ b/LiteLoader/Main/AddonsHelper.cpp @@ -1,677 +1,677 @@ -#include "AddonsHelper.h" -#include
-#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include
-#include -#include -#include -#include -#include -#include -#include -using namespace std; -using namespace RegisterCommandHelper; - -Logger addonLogger("AddonHelper"); -std::vector addons; - -bool AutoInstallAddons(string path); - -// Helper -std::string GetAddonJsonFile(Addon::Type type) { - string addonListFile = Level::getCurrentLevelPath(); - switch (type) { - case Addon::Type::BehaviorPack: - return addonListFile + "/world_behavior_packs.json"; - break; - case Addon::Type::ResourcePack: - return addonListFile + "/world_resource_packs.json"; - break; - default: - break; - } - return ""; -} - -inline bool isManifestFile(std::string const& filename) { - return filename == "manifest.json" || filename == "pack_manifest.json"; -} - -#include -inline std::string FixMojangJson(std::string const& content) { - Json::Value value; - JsonHelpers::parseJson(content, value); - return JsonHelpers::serialize(value); -} - -std::optional parseAddonFromPath(std::filesystem::path addonPath) { - try { - auto manifestPath = addonPath; - manifestPath.append("manifest.json"); - if (!filesystem::exists(manifestPath)) { - manifestPath = addonPath; - manifestPath.append("pack_manifest.json"); - } - auto manifestFile = ReadAllFile(UTF82String(manifestPath.u8string())); - if (!manifestFile || manifestFile->empty()) - throw std::exception("manifest.json not found!"); - std::string content = FixMojangJson(*manifestFile); - - auto manifest = nlohmann::json::parse(content, nullptr, true, true); - auto header = manifest["header"]; - auto uuid = header["uuid"]; - Addon addon; - addon.name = header["name"]; - addon.description = header["description"]; - addon.uuid = uuid; - addon.directory = UTF82String(addonPath.u8string()); - - auto ver = header["version"]; - addon.version = LL::Version(ver[0], ver[1], ver[2]); - - string type = manifest["modules"][0]["type"]; - if (type == "resources") - addon.type = Addon::Type::ResourcePack; - else if (type == "data" || type == "script") - addon.type = Addon::Type::BehaviorPack; - else - throw std::exception("Unknown type of addon pack!"); - - return addon; - } catch (const seh_exception& e) { - addonLogger.error("Uncaught SEH Exception Detected!"); - addonLogger.error("In " __FUNCTION__ " " + UTF82String(addonPath.u8string())); - addonLogger.error("Error: Code[{}] {}", e.code(), TextEncoding::toUTF8(e.what())); - } catch (const std::exception& e) { - addonLogger.error("Uncaught C++ Exception Detected!"); - addonLogger.error("In " __FUNCTION__ " " + UTF82String(addonPath.u8string())); - addonLogger.error("Error: Code[{}] {}", -1, TextEncoding::toUTF8(e.what())); - } catch (...) { - addonLogger.error("Uncaught Exception Detected!"); - addonLogger.error("In " __FUNCTION__ " " + UTF82String(addonPath.u8string())); - } - return std::nullopt; -} - -bool RemoveAddonFromList(Addon& addon) { - auto jsonFile = GetAddonJsonFile(addon.type); - if (!filesystem::exists(str2wstr(jsonFile))) { - addonLogger.error(tr("ll.addonsHelper.error.addonConfigNotFound")); - return false; - } - - auto addonJsonContent = ReadAllFile(jsonFile); - if (!addonJsonContent || addonJsonContent->empty()) { - addonLogger.error(tr("ll.addonsHelper.error.addonConfigNotFound")); - return false; - } - auto addonJson = fifo_json::parse(*addonJsonContent, nullptr, true, true); - int id = 0; - for (auto item : addonJson) { - if (item["pack_id"] == addon.uuid) { - addonJson.erase(id); - bool res = WriteAllFile(jsonFile, addonJson.dump(4)); - if (!res) { - addonLogger.error(tr("ll.addonsHelper.removeAddonFromList.fail", addon.getPrintName())); - return false; - } - addonLogger.info(tr("ll.addonsHelper.removeAddonFromList.success", addon.getPrintName())); - return true; - } - ++id; - } - addonLogger.error(tr("ll.addonsHelper.error.addonNotFound", addon.getPrintName())); - return false; -} - -bool AddAddonToList(Addon& addon) { - string addonListFile = GetAddonJsonFile(addon.type); - if (!filesystem::exists(str2wstr(addonListFile))) { - ofstream fout(addonListFile); - fout << "[]" << flush; - } - - try { - - bool exists = false; - auto addonList = nlohmann::json::parse(*ReadAllFile(addonListFile), nullptr, false, true); - // Auto fix Addon List File - if (!addonList.is_array()) { - auto backupPath = UTF82String(filesystem::path(str2wstr(addonListFile)).stem().u8string()) + "_error.json"; - addonLogger.error(tr("ll.addonsHelper.addAddonToList.invalidList", addonListFile, backupPath)); - std::error_code ec; - std::filesystem::rename(str2wstr(addonListFile), filesystem::path(addonListFile).remove_filename().append(str2wstr(backupPath)), ec); - addonList = "[]"_json; - } - for (auto& addonData : addonList) { - if (addonData["pack_id"] == addon.uuid) { - addonData["version"] = {addon.version.major, addon.version.minor, addon.version.revision}; - exists = true; - break; - } - } - if (!exists) { - auto newAddonData = nlohmann::json::object(); - newAddonData["pack_id"] = addon.uuid; - newAddonData["version"] = {addon.version.major, addon.version.minor, addon.version.revision}; - addonList.push_back(newAddonData); - } - bool res = WriteAllFile(addonListFile, addonList.dump(4)); - if (!res) - throw std::exception("Fail to write data back to addon list file!"); - addonLogger.info(tr("ll.addonsHelper.addAddonToList.success", addon.getPrintName())); - return true; - } catch (const std::exception& e) { - addonLogger.error(tr("ll.addonsHelper.addAddonToList.fail", addon.getPrintName(), addonListFile)); - addonLogger.error(tr("ll.addonsHelper.displayError", TextEncoding::toUTF8(e.what()))); - addonLogger.error(tr("ll.addonsHelper.error.installationAborted")); - return false; - } -} -bool InstallAddonToLevel(std::string addonDir, std::string addonName) { - auto addon = parseAddonFromPath(str2wstr(addonDir)); - if (!addon.has_value()) - return false; - std::string subPath; - if (addon->type == Addon::Type::ResourcePack) - subPath = "/resource_packs"; - else if (addon->type == Addon::Type::BehaviorPack) - subPath = "/behavior_packs"; - - - // copy files - string levelPath = Level::getCurrentLevelPath(); - string toPath = levelPath + subPath + "/" + addonName; - - // Avoid duplicate names or update addon if same uuid - while (filesystem::exists(str2wstr(toPath))) { - auto tmp = parseAddonFromPath(str2wstr(toPath)); - if (tmp.has_value() && tmp->uuid != addon->uuid) { - toPath += "_"; - } else { - std::error_code ec; - filesystem::remove_all(str2wstr(toPath), ec); - break; - } - } - std::error_code ec; - filesystem::create_directories(str2wstr(toPath), ec); - filesystem::copy(str2wstr(addonDir), str2wstr(toPath), filesystem::copy_options::recursive, ec); - - // add addon to list file - return AddAddonToList(*addon); -} - -void FindManifest(vector& result, const string& path) { - filesystem::directory_iterator ent(str2wstr(path)); - - bool foundManifest = false; - for (auto& file : ent) { - auto path = file.path(); - if (isManifestFile(UTF82String(path.filename().u8string()))) { - result.push_back(UTF82String(filesystem::canonical(path).parent_path().u8string())); - foundManifest = true; - break; - } - } - if (!foundManifest) { - // No manifest file - if (!AutoInstallAddons(path)) { - filesystem::directory_iterator ent2(str2wstr(path)); - for (auto& file : ent2) - if (file.is_directory()) - FindManifest(result, UTF82String(file.path().u8string())); - } - } - return; -} - -std::string Addon::getPrintName() const { - if (LL::globalConfig.colorLog) - return ColorFormat::convertToConsole(std::string(name)); - else - return ColorFormat::removeColorCode(std::string(name)); -} - -bool AddonsManager::install(std::string packPath) { - try { - if (!filesystem::exists(str2wstr(packPath))) { - addonLogger.error(tr("ll.addonsHelper.error.addonFileNotFound", packPath)); - return false; - } - if (VALID_ADDON_FILE_EXTENSION.find(UTF82String(filesystem::path(str2wstr(packPath)).extension().u8string())) == VALID_ADDON_FILE_EXTENSION.end()) { - addonLogger.error(tr("ll.addonsHelper.error.unsupportedFileType")); - return false; - } - - string name = UTF82String(filesystem::path(str2wstr(packPath)).filename().u8string()); - addonLogger.warn(tr("ll.addonsHelper.install.installing", name)); - - std::error_code ec; - if (EndsWith(packPath, ".mcpack")) { - string newPath = packPath; - ReplaceStr(newPath, ".mcpack", ".zip"); - filesystem::rename(str2wstr(packPath), str2wstr(newPath), ec); - packPath = newPath; - } - if (EndsWith(packPath, ".mcaddon")) { - string newPath = packPath; - ReplaceStr(newPath, ".mcaddon", ".zip"); - filesystem::rename(str2wstr(packPath), str2wstr(newPath), ec); - packPath = newPath; - } - - name = UTF82String(filesystem::path(str2wstr(packPath)).filename().u8string()); - - // filesystem::remove_all(ADDON_INSTALL_TEMP_DIR + name + "/", ec); //? - // filesystem::create_directories(ADDON_INSTALL_TEMP_DIR + name + "/", ec); - - auto res = NewProcessSync(fmt::format("{} x \"{}\" -o{} -aoa", ZIP_PROGRAM_PATH, packPath, "\"" ADDON_INSTALL_TEMP_DIR + name + "/\""), ADDON_INSTALL_MAX_WAIT); - if (res.first != 0) { - addonLogger.error(tr("ll.addonsHelper.install.error.failToUncompress.msg", name)); - addonLogger.error(tr("ll.addonsHelper.install.error.failToUncompress.exitCode"), res.first); - addonLogger.error(tr("ll.addonsHelper.install.error.failToUncompress.programOutput"), res.second); - addonLogger.error(tr("ll.addonsHelper.error.installationAborted")); - filesystem::remove_all(ADDON_INSTALL_TEMP_DIR + name + "/", ec); - return false; - } - - vector paths; - FindManifest(paths, ADDON_INSTALL_TEMP_DIR + name + "/"); - - for (auto& dir : paths) { - string addonName = UTF82String(filesystem::path(str2wstr(dir)).filename().u8string()); - if (addonName.empty() || addonName == "Temp") - addonName = UTF82String(filesystem::path(str2wstr(packPath)).stem().u8string()); - if (!InstallAddonToLevel(dir, addonName)) - throw std::exception("Error in Install Addon To Level "); - } - - filesystem::remove_all(ADDON_INSTALL_TEMP_DIR + name + "/", ec); - filesystem::remove_all(str2wstr(packPath), ec); - return true; - } catch (const seh_exception& e) { - addonLogger.error("Uncaught SEH Exception Detected!"); - addonLogger.error("In " __FUNCTION__); - addonLogger.error("Error: Code[{}] {}", e.code(), TextEncoding::toUTF8(e.what())); - } catch (const std::exception& e) { - addonLogger.error("Uncaught C++ Exception Detected!"); - addonLogger.error("In " __FUNCTION__); - addonLogger.error("Error: Code[{}] {}", -1, TextEncoding::toUTF8(e.what())); - } catch (...) { - addonLogger.error("Uncaught Exception Detected!"); - addonLogger.error("In " __FUNCTION__); - } - return false; -} - -bool AddonsManager::disable(std::string nameOrUuid) { - try { - auto addon = findAddon(nameOrUuid, true); - if (!addon) - return false; - if (RemoveAddonFromList(*addon)) { - addon->enable = false; - return true; - } - - } catch (...) {} - return false; -} - -bool AddonsManager::enable(std::string nameOrUuid) { - try { - auto addon = findAddon(nameOrUuid, true); - if (!addon) - return false; - if (AddAddonToList(*addon)) { - addon->enable = true; - return true; - } - - } catch (...) {} - return false; -} - -bool AddonsManager::uninstall(std::string nameOrUuid) { - try { - auto addon = findAddon(nameOrUuid, true); - if (!addon) { - addonLogger.error(tr("ll.addonsHelper.error.addonNotFound")); - return false; - } - RemoveAddonFromList(*addon); - std::error_code ec; - filesystem::remove_all(str2wstr(addon->directory), ec); - for (auto i = addons.begin(); i != addons.end(); ++i) - if (i->uuid == addon->uuid) { - addons.erase(i); - break; - } - addonLogger.info(tr("ll.addonsHelper.uninstall.success", addon->getPrintName())); - } catch (...) {} - return false; -} - -std::vector AddonsManager::getAllAddons() { - std::vector res; - for (auto& addon : addons) - res.push_back(&addon); - return res; -} - -Addon* AddonsManager::findAddon(std::string nameOrUuid, bool fuzzy) { - Addon* possible = nullptr; - bool multiMatch = false; - for (auto& addon : addons) { - if (addon.uuid == nameOrUuid) - return &addon; - std::string addonName = addon.name; - std::string targetName = nameOrUuid; - if (ColorFormat::removeColorCode(addonName) == ColorFormat::removeColorCode(targetName)) - return &addon; - if (!fuzzy) - continue; - // Simple fuzzy matching - std::transform(addonName.begin(), addonName.end(), addonName.begin(), ::tolower); - std::transform(targetName.begin(), targetName.end(), targetName.begin(), ::tolower); - if (StartsWith(addonName, targetName)) { - if (possible) - multiMatch = true; - else - possible = &addon; - } - } - if (multiMatch) - return nullptr; - else - return possible; -} - -void ListAllAddons(CommandOutput& output) { - if (addons.empty()) { - output.trSuccess("ll.addonsHelper.error.noAddonInstalled"); - return; - } - - output.trSuccess("ll.addonsHelper.cmd.output.list.overview", addons.size()); - for (auto index = 0; index < addons.size(); ++index) { - auto& addon = addons[index]; - string addonName = addon.name; - if (addonName.find("§") == string::npos) - addonName = "§b" + addonName; - string desc = addon.description; - if (desc.find("§") == string::npos) - desc = "§7" + desc; - - std::string addonType = (addon.type == Addon::Type::ResourcePack ? "ResourcePack" : "BehaviorPack"); - if (addon.enable) { - output.success(fmt::format("§e{:>2}§r: {} §a[v{}] §8({})", index + 1, addonName, addon.version.toString(), addonType)); - output.success(fmt::format(" {}", desc)); - } else { - output.success(fmt::format("§e{:>2}§r: §8{} [v{}] ({})", index + 1, ColorFormat::removeColorCode(addonName), addon.version.toString(), addonType)); - output.success(fmt::format(" §8Disabled")); - } - } -} - -void ShowAddon(CommandOutput& output, Addon& addon) { - std::ostringstream oss; - oss << "Addon <" << addon.name << "§r>" << (addon.enable ? " §aEnabled" : " §cDisabled") << "\n\n"; - oss << "- §aName§r: " << addon.name << "\n"; - oss << "- §aUUID§r: " << addon.uuid << "\n"; - oss << "- §aDescription§r: " << addon.description << "\n"; - oss << "- §aVersion§r: v" << addon.version.toString(true) << "\n"; - oss << "- §aType§r: " << magic_enum::enum_name(addon.type) << "\n"; - oss << "- §aDirectory§r: " << addon.directory << "\n"; - output.success(oss.str()); -} - -class AddonsCommand : public Command { - enum class Operation { - List, - Install, - Uninstall, - Enable, - Disable - }; - - Operation operation = static_cast(-1); - std::string target; - int index = -1; - bool target_isSet = false; - bool index_isSet = false; - - inline Addon* getSelectedAddon(CommandOutput& output) const { - Addon* addon = nullptr; - if (target_isSet) { - auto addon = AddonsManager::findAddon(target, true); - if (addon) { - return addon; - } else { - output.trError("ll.addonsHelper.error.addonNotfound", target); - } - } else { - auto addons = AddonsManager::getAllAddons(); - if (index - 1 >= 0 && index - 1 < static_cast(addons.size())) - return addons[index - 1]; - else - output.trError("ll.addonsHelper.error.outOfRange", index); - } - return nullptr; - } - -public: - void execute(CommandOrigin const& ori, CommandOutput& output) const override { - output.setLanguageCode(ori); - switch (operation) { - case Operation::List: - if (target_isSet || index_isSet) { - if (auto addon = getSelectedAddon(output)) - ShowAddon(output, *addon); - } else - ListAllAddons(output); - break; - case Operation::Install: - if (AddonsManager::install(target)) - filesystem::remove_all(ADDON_INSTALL_TEMP_DIR); - output.success(); - break; - case Operation::Uninstall: { - auto addon = getSelectedAddon(output); - if (addon && AddonsManager::uninstall(addon->uuid)) - output.success(); - break; - } - case Operation::Enable: { - auto addon = getSelectedAddon(output); - if (addon && AddonsManager::enable(addon->uuid)) - output.success(); - break; - } - case Operation::Disable: { - auto addon = getSelectedAddon(output); - if (addon && AddonsManager::disable(addon->uuid)) - output.success(); - break; - } - default: - break; - } - } - - static void setup(CommandRegistry* registry) { - registry->registerCommand("addons", "LiteLoaderBDS Addons Helper (Restart required after addon changes)", - CommandPermissionLevel::GameMasters, {(CommandFlagValue)0}, {(CommandFlagValue)0x80}); - - vector addonsList; - for (auto& addon : addons) - addonsList.push_back(addon.name); - registry->addSoftEnum("AddonName", addonsList); - - // addons list - registry->addEnum("Operation_Addons_List", {{"list", Operation::List}}); - registry->registerOverload( - "addons", - makeMandatory(&AddonsCommand::operation, "operation", "Operation_Addons_List").addOptions((CommandParameterOption)1), - makeOptional(&AddonsCommand::target, "addonName", "AddonName", &AddonsCommand::target_isSet)); - registry->registerOverload( - "addons", - makeMandatory(&AddonsCommand::operation, "operation", "Operation_Addons_List").addOptions((CommandParameterOption)1), - makeOptional(&AddonsCommand::index, "addonIndex", nullptr, &AddonsCommand::index_isSet)); - - // addons install - registry->addEnum("Operation_Addons_Install", {{"install", Operation::Install}}); - registry->registerOverload( - "addons", - makeMandatory(&AddonsCommand::operation, "operation", "Operation_Addons_Install").addOptions((CommandParameterOption)1), - makeMandatory(&AddonsCommand::target, "addonName")); - - // addons uninstall - - registry->addEnum("Operation_Addons_Others", { - {"uninstall", Operation::Uninstall}, - {"remove", Operation::Uninstall}, - {"enable", Operation::Enable}, - {"disable", Operation::Disable}, - }); - registry->registerOverload( - "addons", - makeMandatory(&AddonsCommand::operation, "operation", "Operation_Addons_Others").addOptions((CommandParameterOption)1), - makeMandatory(&AddonsCommand::target, "addonName", "AddonName", &AddonsCommand::target_isSet)); - registry->registerOverload( - "addons", - makeMandatory(&AddonsCommand::operation, "operation", "Operation_Addons_Others").addOptions((CommandParameterOption)1), - makeMandatory(&AddonsCommand::index, "addonIndex", nullptr, &AddonsCommand::index_isSet)); - } -}; - -void FindAddons(string jsonPath, string packsDir) { - try { - if (!filesystem::exists(str2wstr(jsonPath)) && !filesystem::exists(str2wstr(packsDir))) - return; - if (!filesystem::exists(str2wstr(jsonPath))) - WriteAllFile(jsonPath, "[]"); - if (!filesystem::exists(str2wstr(packsDir))) - filesystem::create_directories(str2wstr(packsDir)); - - auto content = ReadAllFile(jsonPath); - if (!content || content->empty()) { - WriteAllFile(jsonPath, "[]"); - content = "[]"; - } - std::set validPackIDs; - try { - auto addonList = nlohmann::json::parse(*content, nullptr, true, true); - for (auto addon : addonList) { - std::string pktid = addon["pack_id"]; - validPackIDs.insert(pktid); - } - } catch (const std::exception&) { - addonLogger.error(tr("ll.addonsHelper.error.parsingEnabledAddonsList")); - } - - filesystem::directory_iterator ent(str2wstr(packsDir)); - for (auto& dir : ent) { - if (!dir.is_directory()) - continue; - auto addon = parseAddonFromPath(dir); - if (!addon) - continue; - if (validPackIDs.find(addon->uuid) != validPackIDs.end()) - addon->enable = true; - addons.emplace_back(std::move(*addon)); - } - } catch (...) { - return; - } -} - -void BuildAddonsList() { - string levelPath = Level::getCurrentLevelPath(); - - FindAddons(levelPath + "/world_behavior_packs.json", levelPath + "/behavior_packs"); - FindAddons(levelPath + "/world_resource_packs.json", levelPath + "/resource_packs"); - - std::sort(addons.begin(), addons.end(), - [](Addon const& _Left, Addon const& _Right) { - if (_Left.enable && !_Right.enable) - return true; - if (_Left.type == Addon::Type::ResourcePack && _Right.type == Addon::Type::BehaviorPack) - return true; - return false; - }); -} - -bool AutoInstallAddons(string path) { - std::error_code ec; - if (!filesystem::exists(str2wstr(path))) { - filesystem::create_directories(str2wstr(path), ec); - addonLogger.info(tr("ll.addonsHelper.autoInstall.tip.dirCreated", LL::globalConfig.addonsInstallPath)); - return false; - } - std::vector toInstallList; - - filesystem::directory_iterator ent(str2wstr(path)); - for (auto& file : ent) { - if (!file.is_regular_file()) - continue; - - if (VALID_ADDON_FILE_EXTENSION.count(UTF82String(file.path().extension().u8string())) > 0) { - toInstallList.push_back(UTF82String(file.path().lexically_normal().u8string())); - } - } - - if (toInstallList.empty()) - return false; - - addonLogger.info(tr("ll.addonsHelper.autoInstall.working", toInstallList.size())); - int cnt = 0; - for (auto& path : toInstallList) { - addonLogger.debug("Installing \"{}\"...", path); - if (!AddonsManager::install(path)) { - // filesystem::remove_all(ADDON_INSTALL_TEMP_DIR, ec); - break; - } else { - ++cnt; - addonLogger.info(tr("ll.addonsHelper.autoInstall.installed", path)); - } - } - - if (cnt == 0) { - addonLogger.error(tr("ll.addonsHelper.error.noAddonInstalled")); - } else { - addonLogger.info(tr("ll.addonsHelper.autoInstall.installedCount", cnt)); - } - return true; -} - -void InitAddonsHelper() { - if (LL::isDebugMode()) - addonLogger.consoleLevel = addonLogger.debug.level; - - filesystem::remove_all(ADDON_INSTALL_TEMP_DIR); - filesystem::create_directories(ADDON_INSTALL_TEMP_DIR); - - AutoInstallAddons(LL::globalConfig.addonsInstallPath); - BuildAddonsList(); - - filesystem::remove_all(ADDON_INSTALL_TEMP_DIR); - - Event::RegCmdEvent::subscribe([](Event::RegCmdEvent ev) { // Register commands - AddonsCommand::setup(ev.mCommandRegistry); - return true; - }); -} \ No newline at end of file +//#include "AddonsHelper.h" +//#include
+//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include
+//#include +//#include +//#include +//#include +//#include +//#include +//#include +//using namespace std; +//using namespace RegisterCommandHelper; +// +//Logger addonLogger("AddonHelper"); +//std::vector addons; +// +//bool AutoInstallAddons(string path); +// +//// Helper +//std::string GetAddonJsonFile(Addon::Type type) { +// string addonListFile = Level::getCurrentLevelPath(); +// switch (type) { +// case Addon::Type::BehaviorPack: +// return addonListFile + "/world_behavior_packs.json"; +// break; +// case Addon::Type::ResourcePack: +// return addonListFile + "/world_resource_packs.json"; +// break; +// default: +// break; +// } +// return ""; +//} +// +//inline bool isManifestFile(std::string const& filename) { +// return filename == "manifest.json" || filename == "pack_manifest.json"; +//} +// +//#include +//inline std::string FixMojangJson(std::string const& content) { +// Json::Value value; +// JsonHelpers::parseJson(content, value); +// return JsonHelpers::serialize(value); +//} +// +//std::optional parseAddonFromPath(std::filesystem::path addonPath) { +// try { +// auto manifestPath = addonPath; +// manifestPath.append("manifest.json"); +// if (!filesystem::exists(manifestPath)) { +// manifestPath = addonPath; +// manifestPath.append("pack_manifest.json"); +// } +// auto manifestFile = ReadAllFile(UTF82String(manifestPath.u8string())); +// if (!manifestFile || manifestFile->empty()) +// throw std::exception("manifest.json not found!"); +// std::string content = FixMojangJson(*manifestFile); +// +// auto manifest = nlohmann::json::parse(content, nullptr, true, true); +// auto header = manifest["header"]; +// auto uuid = header["uuid"]; +// Addon addon; +// addon.name = header["name"]; +// addon.description = header["description"]; +// addon.uuid = uuid; +// addon.directory = UTF82String(addonPath.u8string()); +// +// auto ver = header["version"]; +// addon.version = LL::Version(ver[0], ver[1], ver[2]); +// +// string type = manifest["modules"][0]["type"]; +// if (type == "resources") +// addon.type = Addon::Type::ResourcePack; +// else if (type == "data" || type == "script") +// addon.type = Addon::Type::BehaviorPack; +// else +// throw std::exception("Unknown type of addon pack!"); +// +// return addon; +// } catch (const seh_exception& e) { +// addonLogger.error("Uncaught SEH Exception Detected!"); +// addonLogger.error("In " __FUNCTION__ " " + UTF82String(addonPath.u8string())); +// addonLogger.error("Error: Code[{}] {}", e.code(), TextEncoding::toUTF8(e.what())); +// } catch (const std::exception& e) { +// addonLogger.error("Uncaught C++ Exception Detected!"); +// addonLogger.error("In " __FUNCTION__ " " + UTF82String(addonPath.u8string())); +// addonLogger.error("Error: Code[{}] {}", -1, TextEncoding::toUTF8(e.what())); +// } catch (...) { +// addonLogger.error("Uncaught Exception Detected!"); +// addonLogger.error("In " __FUNCTION__ " " + UTF82String(addonPath.u8string())); +// } +// return std::nullopt; +//} +// +//bool RemoveAddonFromList(Addon& addon) { +// auto jsonFile = GetAddonJsonFile(addon.type); +// if (!filesystem::exists(str2wstr(jsonFile))) { +// addonLogger.error(tr("ll.addonsHelper.error.addonConfigNotFound")); +// return false; +// } +// +// auto addonJsonContent = ReadAllFile(jsonFile); +// if (!addonJsonContent || addonJsonContent->empty()) { +// addonLogger.error(tr("ll.addonsHelper.error.addonConfigNotFound")); +// return false; +// } +// auto addonJson = fifo_json::parse(*addonJsonContent, nullptr, true, true); +// int id = 0; +// for (auto item : addonJson) { +// if (item["pack_id"] == addon.uuid) { +// addonJson.erase(id); +// bool res = WriteAllFile(jsonFile, addonJson.dump(4)); +// if (!res) { +// addonLogger.error(tr("ll.addonsHelper.removeAddonFromList.fail", addon.getPrintName())); +// return false; +// } +// addonLogger.info(tr("ll.addonsHelper.removeAddonFromList.success", addon.getPrintName())); +// return true; +// } +// ++id; +// } +// addonLogger.error(tr("ll.addonsHelper.error.addonNotFound", addon.getPrintName())); +// return false; +//} +// +//bool AddAddonToList(Addon& addon) { +// string addonListFile = GetAddonJsonFile(addon.type); +// if (!filesystem::exists(str2wstr(addonListFile))) { +// ofstream fout(addonListFile); +// fout << "[]" << flush; +// } +// +// try { +// +// bool exists = false; +// auto addonList = nlohmann::json::parse(*ReadAllFile(addonListFile), nullptr, false, true); +// // Auto fix Addon List File +// if (!addonList.is_array()) { +// auto backupPath = UTF82String(filesystem::path(str2wstr(addonListFile)).stem().u8string()) + "_error.json"; +// addonLogger.error(tr("ll.addonsHelper.addAddonToList.invalidList", addonListFile, backupPath)); +// std::error_code ec; +// std::filesystem::rename(str2wstr(addonListFile), filesystem::path(addonListFile).remove_filename().append(str2wstr(backupPath)), ec); +// addonList = "[]"_json; +// } +// for (auto& addonData : addonList) { +// if (addonData["pack_id"] == addon.uuid) { +// addonData["version"] = {addon.version.major, addon.version.minor, addon.version.revision}; +// exists = true; +// break; +// } +// } +// if (!exists) { +// auto newAddonData = nlohmann::json::object(); +// newAddonData["pack_id"] = addon.uuid; +// newAddonData["version"] = {addon.version.major, addon.version.minor, addon.version.revision}; +// addonList.push_back(newAddonData); +// } +// bool res = WriteAllFile(addonListFile, addonList.dump(4)); +// if (!res) +// throw std::exception("Fail to write data back to addon list file!"); +// addonLogger.info(tr("ll.addonsHelper.addAddonToList.success", addon.getPrintName())); +// return true; +// } catch (const std::exception& e) { +// addonLogger.error(tr("ll.addonsHelper.addAddonToList.fail", addon.getPrintName(), addonListFile)); +// addonLogger.error(tr("ll.addonsHelper.displayError", TextEncoding::toUTF8(e.what()))); +// addonLogger.error(tr("ll.addonsHelper.error.installationAborted")); +// return false; +// } +//} +//bool InstallAddonToLevel(std::string addonDir, std::string addonName) { +// auto addon = parseAddonFromPath(str2wstr(addonDir)); +// if (!addon.has_value()) +// return false; +// std::string subPath; +// if (addon->type == Addon::Type::ResourcePack) +// subPath = "/resource_packs"; +// else if (addon->type == Addon::Type::BehaviorPack) +// subPath = "/behavior_packs"; +// +// +// // copy files +// string levelPath = Level::getCurrentLevelPath(); +// string toPath = levelPath + subPath + "/" + addonName; +// +// // Avoid duplicate names or update addon if same uuid +// while (filesystem::exists(str2wstr(toPath))) { +// auto tmp = parseAddonFromPath(str2wstr(toPath)); +// if (tmp.has_value() && tmp->uuid != addon->uuid) { +// toPath += "_"; +// } else { +// std::error_code ec; +// filesystem::remove_all(str2wstr(toPath), ec); +// break; +// } +// } +// std::error_code ec; +// filesystem::create_directories(str2wstr(toPath), ec); +// filesystem::copy(str2wstr(addonDir), str2wstr(toPath), filesystem::copy_options::recursive, ec); +// +// // add addon to list file +// return AddAddonToList(*addon); +//} +// +//void FindManifest(vector& result, const string& path) { +// filesystem::directory_iterator ent(str2wstr(path)); +// +// bool foundManifest = false; +// for (auto& file : ent) { +// auto path = file.path(); +// if (isManifestFile(UTF82String(path.filename().u8string()))) { +// result.push_back(UTF82String(filesystem::canonical(path).parent_path().u8string())); +// foundManifest = true; +// break; +// } +// } +// if (!foundManifest) { +// // No manifest file +// if (!AutoInstallAddons(path)) { +// filesystem::directory_iterator ent2(str2wstr(path)); +// for (auto& file : ent2) +// if (file.is_directory()) +// FindManifest(result, UTF82String(file.path().u8string())); +// } +// } +// return; +//} +// +//std::string Addon::getPrintName() const { +// if (LL::globalConfig.colorLog) +// return ColorFormat::convertToConsole(std::string(name)); +// else +// return ColorFormat::removeColorCode(std::string(name)); +//} +// +//bool AddonsManager::install(std::string packPath) { +// try { +// if (!filesystem::exists(str2wstr(packPath))) { +// addonLogger.error(tr("ll.addonsHelper.error.addonFileNotFound", packPath)); +// return false; +// } +// if (VALID_ADDON_FILE_EXTENSION.find(UTF82String(filesystem::path(str2wstr(packPath)).extension().u8string())) == VALID_ADDON_FILE_EXTENSION.end()) { +// addonLogger.error(tr("ll.addonsHelper.error.unsupportedFileType")); +// return false; +// } +// +// string name = UTF82String(filesystem::path(str2wstr(packPath)).filename().u8string()); +// addonLogger.warn(tr("ll.addonsHelper.install.installing", name)); +// +// std::error_code ec; +// if (EndsWith(packPath, ".mcpack")) { +// string newPath = packPath; +// ReplaceStr(newPath, ".mcpack", ".zip"); +// filesystem::rename(str2wstr(packPath), str2wstr(newPath), ec); +// packPath = newPath; +// } +// if (EndsWith(packPath, ".mcaddon")) { +// string newPath = packPath; +// ReplaceStr(newPath, ".mcaddon", ".zip"); +// filesystem::rename(str2wstr(packPath), str2wstr(newPath), ec); +// packPath = newPath; +// } +// +// name = UTF82String(filesystem::path(str2wstr(packPath)).filename().u8string()); +// +// // filesystem::remove_all(ADDON_INSTALL_TEMP_DIR + name + "/", ec); //? +// // filesystem::create_directories(ADDON_INSTALL_TEMP_DIR + name + "/", ec); +// +// auto res = NewProcessSync(fmt::format("{} x \"{}\" -o{} -aoa", ZIP_PROGRAM_PATH, packPath, "\"" ADDON_INSTALL_TEMP_DIR + name + "/\""), ADDON_INSTALL_MAX_WAIT); +// if (res.first != 0) { +// addonLogger.error(tr("ll.addonsHelper.install.error.failToUncompress.msg", name)); +// addonLogger.error(tr("ll.addonsHelper.install.error.failToUncompress.exitCode"), res.first); +// addonLogger.error(tr("ll.addonsHelper.install.error.failToUncompress.programOutput"), res.second); +// addonLogger.error(tr("ll.addonsHelper.error.installationAborted")); +// filesystem::remove_all(ADDON_INSTALL_TEMP_DIR + name + "/", ec); +// return false; +// } +// +// vector paths; +// FindManifest(paths, ADDON_INSTALL_TEMP_DIR + name + "/"); +// +// for (auto& dir : paths) { +// string addonName = UTF82String(filesystem::path(str2wstr(dir)).filename().u8string()); +// if (addonName.empty() || addonName == "Temp") +// addonName = UTF82String(filesystem::path(str2wstr(packPath)).stem().u8string()); +// if (!InstallAddonToLevel(dir, addonName)) +// throw std::exception("Error in Install Addon To Level "); +// } +// +// filesystem::remove_all(ADDON_INSTALL_TEMP_DIR + name + "/", ec); +// filesystem::remove_all(str2wstr(packPath), ec); +// return true; +// } catch (const seh_exception& e) { +// addonLogger.error("Uncaught SEH Exception Detected!"); +// addonLogger.error("In " __FUNCTION__); +// addonLogger.error("Error: Code[{}] {}", e.code(), TextEncoding::toUTF8(e.what())); +// } catch (const std::exception& e) { +// addonLogger.error("Uncaught C++ Exception Detected!"); +// addonLogger.error("In " __FUNCTION__); +// addonLogger.error("Error: Code[{}] {}", -1, TextEncoding::toUTF8(e.what())); +// } catch (...) { +// addonLogger.error("Uncaught Exception Detected!"); +// addonLogger.error("In " __FUNCTION__); +// } +// return false; +//} +// +//bool AddonsManager::disable(std::string nameOrUuid) { +// try { +// auto addon = findAddon(nameOrUuid, true); +// if (!addon) +// return false; +// if (RemoveAddonFromList(*addon)) { +// addon->enable = false; +// return true; +// } +// +// } catch (...) {} +// return false; +//} +// +//bool AddonsManager::enable(std::string nameOrUuid) { +// try { +// auto addon = findAddon(nameOrUuid, true); +// if (!addon) +// return false; +// if (AddAddonToList(*addon)) { +// addon->enable = true; +// return true; +// } +// +// } catch (...) {} +// return false; +//} +// +//bool AddonsManager::uninstall(std::string nameOrUuid) { +// try { +// auto addon = findAddon(nameOrUuid, true); +// if (!addon) { +// addonLogger.error(tr("ll.addonsHelper.error.addonNotFound")); +// return false; +// } +// RemoveAddonFromList(*addon); +// std::error_code ec; +// filesystem::remove_all(str2wstr(addon->directory), ec); +// for (auto i = addons.begin(); i != addons.end(); ++i) +// if (i->uuid == addon->uuid) { +// addons.erase(i); +// break; +// } +// addonLogger.info(tr("ll.addonsHelper.uninstall.success", addon->getPrintName())); +// } catch (...) {} +// return false; +//} +// +//std::vector AddonsManager::getAllAddons() { +// std::vector res; +// for (auto& addon : addons) +// res.push_back(&addon); +// return res; +//} +// +//Addon* AddonsManager::findAddon(std::string nameOrUuid, bool fuzzy) { +// Addon* possible = nullptr; +// bool multiMatch = false; +// for (auto& addon : addons) { +// if (addon.uuid == nameOrUuid) +// return &addon; +// std::string addonName = addon.name; +// std::string targetName = nameOrUuid; +// if (ColorFormat::removeColorCode(addonName) == ColorFormat::removeColorCode(targetName)) +// return &addon; +// if (!fuzzy) +// continue; +// // Simple fuzzy matching +// std::transform(addonName.begin(), addonName.end(), addonName.begin(), ::tolower); +// std::transform(targetName.begin(), targetName.end(), targetName.begin(), ::tolower); +// if (StartsWith(addonName, targetName)) { +// if (possible) +// multiMatch = true; +// else +// possible = &addon; +// } +// } +// if (multiMatch) +// return nullptr; +// else +// return possible; +//} +// +//void ListAllAddons(CommandOutput& output) { +// if (addons.empty()) { +// output.trSuccess("ll.addonsHelper.error.noAddonInstalled"); +// return; +// } +// +// output.trSuccess("ll.addonsHelper.cmd.output.list.overview", addons.size()); +// for (auto index = 0; index < addons.size(); ++index) { +// auto& addon = addons[index]; +// string addonName = addon.name; +// if (addonName.find("§") == string::npos) +// addonName = "§b" + addonName; +// string desc = addon.description; +// if (desc.find("§") == string::npos) +// desc = "§7" + desc; +// +// std::string addonType = (addon.type == Addon::Type::ResourcePack ? "ResourcePack" : "BehaviorPack"); +// if (addon.enable) { +// output.success(fmt::format("§e{:>2}§r: {} §a[v{}] §8({})", index + 1, addonName, addon.version.toString(), addonType)); +// output.success(fmt::format(" {}", desc)); +// } else { +// output.success(fmt::format("§e{:>2}§r: §8{} [v{}] ({})", index + 1, ColorFormat::removeColorCode(addonName), addon.version.toString(), addonType)); +// output.success(fmt::format(" §8Disabled")); +// } +// } +//} +// +//void ShowAddon(CommandOutput& output, Addon& addon) { +// std::ostringstream oss; +// oss << "Addon <" << addon.name << "§r>" << (addon.enable ? " §aEnabled" : " §cDisabled") << "\n\n"; +// oss << "- §aName§r: " << addon.name << "\n"; +// oss << "- §aUUID§r: " << addon.uuid << "\n"; +// oss << "- §aDescription§r: " << addon.description << "\n"; +// oss << "- §aVersion§r: v" << addon.version.toString(true) << "\n"; +// oss << "- §aType§r: " << magic_enum::enum_name(addon.type) << "\n"; +// oss << "- §aDirectory§r: " << addon.directory << "\n"; +// output.success(oss.str()); +//} +// +//class AddonsCommand : public Command { +// enum class Operation { +// List, +// Install, +// Uninstall, +// Enable, +// Disable +// }; +// +// Operation operation = static_cast(-1); +// std::string target; +// int index = -1; +// bool target_isSet = false; +// bool index_isSet = false; +// +// inline Addon* getSelectedAddon(CommandOutput& output) const { +// Addon* addon = nullptr; +// if (target_isSet) { +// auto addon = AddonsManager::findAddon(target, true); +// if (addon) { +// return addon; +// } else { +// output.trError("ll.addonsHelper.error.addonNotfound", target); +// } +// } else { +// auto addons = AddonsManager::getAllAddons(); +// if (index - 1 >= 0 && index - 1 < static_cast(addons.size())) +// return addons[index - 1]; +// else +// output.trError("ll.addonsHelper.error.outOfRange", index); +// } +// return nullptr; +// } +// +//public: +// void execute(CommandOrigin const& ori, CommandOutput& output) const override { +// output.setLanguageCode(ori); +// switch (operation) { +// case Operation::List: +// if (target_isSet || index_isSet) { +// if (auto addon = getSelectedAddon(output)) +// ShowAddon(output, *addon); +// } else +// ListAllAddons(output); +// break; +// case Operation::Install: +// if (AddonsManager::install(target)) +// filesystem::remove_all(ADDON_INSTALL_TEMP_DIR); +// output.success(); +// break; +// case Operation::Uninstall: { +// auto addon = getSelectedAddon(output); +// if (addon && AddonsManager::uninstall(addon->uuid)) +// output.success(); +// break; +// } +// case Operation::Enable: { +// auto addon = getSelectedAddon(output); +// if (addon && AddonsManager::enable(addon->uuid)) +// output.success(); +// break; +// } +// case Operation::Disable: { +// auto addon = getSelectedAddon(output); +// if (addon && AddonsManager::disable(addon->uuid)) +// output.success(); +// break; +// } +// default: +// break; +// } +// } +// +// static void setup(CommandRegistry* registry) { +// registry->registerCommand("addons", "LiteLoaderBDS Addons Helper (Restart required after addon changes)", +// CommandPermissionLevel::GameMasters, {(CommandFlagValue)0}, {(CommandFlagValue)0x80}); +// +// vector addonsList; +// for (auto& addon : addons) +// addonsList.push_back(addon.name); +// registry->addSoftEnum("AddonName", addonsList); +// +// // addons list +// registry->addEnum("Operation_Addons_List", {{"list", Operation::List}}); +// registry->registerOverload( +// "addons", +// makeMandatory(&AddonsCommand::operation, "operation", "Operation_Addons_List").addOptions((CommandParameterOption)1), +// makeOptional(&AddonsCommand::target, "addonName", "AddonName", &AddonsCommand::target_isSet)); +// registry->registerOverload( +// "addons", +// makeMandatory(&AddonsCommand::operation, "operation", "Operation_Addons_List").addOptions((CommandParameterOption)1), +// makeOptional(&AddonsCommand::index, "addonIndex", nullptr, &AddonsCommand::index_isSet)); +// +// // addons install +// registry->addEnum("Operation_Addons_Install", {{"install", Operation::Install}}); +// registry->registerOverload( +// "addons", +// makeMandatory(&AddonsCommand::operation, "operation", "Operation_Addons_Install").addOptions((CommandParameterOption)1), +// makeMandatory(&AddonsCommand::target, "addonName")); +// +// // addons uninstall +// +// registry->addEnum("Operation_Addons_Others", { +// {"uninstall", Operation::Uninstall}, +// {"remove", Operation::Uninstall}, +// {"enable", Operation::Enable}, +// {"disable", Operation::Disable}, +// }); +// registry->registerOverload( +// "addons", +// makeMandatory(&AddonsCommand::operation, "operation", "Operation_Addons_Others").addOptions((CommandParameterOption)1), +// makeMandatory(&AddonsCommand::target, "addonName", "AddonName", &AddonsCommand::target_isSet)); +// registry->registerOverload( +// "addons", +// makeMandatory(&AddonsCommand::operation, "operation", "Operation_Addons_Others").addOptions((CommandParameterOption)1), +// makeMandatory(&AddonsCommand::index, "addonIndex", nullptr, &AddonsCommand::index_isSet)); +// } +//}; +// +//void FindAddons(string jsonPath, string packsDir) { +// try { +// if (!filesystem::exists(str2wstr(jsonPath)) && !filesystem::exists(str2wstr(packsDir))) +// return; +// if (!filesystem::exists(str2wstr(jsonPath))) +// WriteAllFile(jsonPath, "[]"); +// if (!filesystem::exists(str2wstr(packsDir))) +// filesystem::create_directories(str2wstr(packsDir)); +// +// auto content = ReadAllFile(jsonPath); +// if (!content || content->empty()) { +// WriteAllFile(jsonPath, "[]"); +// content = "[]"; +// } +// std::set validPackIDs; +// try { +// auto addonList = nlohmann::json::parse(*content, nullptr, true, true); +// for (auto addon : addonList) { +// std::string pktid = addon["pack_id"]; +// validPackIDs.insert(pktid); +// } +// } catch (const std::exception&) { +// addonLogger.error(tr("ll.addonsHelper.error.parsingEnabledAddonsList")); +// } +// +// filesystem::directory_iterator ent(str2wstr(packsDir)); +// for (auto& dir : ent) { +// if (!dir.is_directory()) +// continue; +// auto addon = parseAddonFromPath(dir); +// if (!addon) +// continue; +// if (validPackIDs.find(addon->uuid) != validPackIDs.end()) +// addon->enable = true; +// addons.emplace_back(std::move(*addon)); +// } +// } catch (...) { +// return; +// } +//} +// +//void BuildAddonsList() { +// string levelPath = Level::getCurrentLevelPath(); +// +// FindAddons(levelPath + "/world_behavior_packs.json", levelPath + "/behavior_packs"); +// FindAddons(levelPath + "/world_resource_packs.json", levelPath + "/resource_packs"); +// +// std::sort(addons.begin(), addons.end(), +// [](Addon const& _Left, Addon const& _Right) { +// if (_Left.enable && !_Right.enable) +// return true; +// if (_Left.type == Addon::Type::ResourcePack && _Right.type == Addon::Type::BehaviorPack) +// return true; +// return false; +// }); +//} +// +//bool AutoInstallAddons(string path) { +// std::error_code ec; +// if (!filesystem::exists(str2wstr(path))) { +// filesystem::create_directories(str2wstr(path), ec); +// addonLogger.info(tr("ll.addonsHelper.autoInstall.tip.dirCreated", LL::globalConfig.addonsInstallPath)); +// return false; +// } +// std::vector toInstallList; +// +// filesystem::directory_iterator ent(str2wstr(path)); +// for (auto& file : ent) { +// if (!file.is_regular_file()) +// continue; +// +// if (VALID_ADDON_FILE_EXTENSION.count(UTF82String(file.path().extension().u8string())) > 0) { +// toInstallList.push_back(UTF82String(file.path().lexically_normal().u8string())); +// } +// } +// +// if (toInstallList.empty()) +// return false; +// +// addonLogger.info(tr("ll.addonsHelper.autoInstall.working", toInstallList.size())); +// int cnt = 0; +// for (auto& path : toInstallList) { +// addonLogger.debug("Installing \"{}\"...", path); +// if (!AddonsManager::install(path)) { +// // filesystem::remove_all(ADDON_INSTALL_TEMP_DIR, ec); +// break; +// } else { +// ++cnt; +// addonLogger.info(tr("ll.addonsHelper.autoInstall.installed", path)); +// } +// } +// +// if (cnt == 0) { +// addonLogger.error(tr("ll.addonsHelper.error.noAddonInstalled")); +// } else { +// addonLogger.info(tr("ll.addonsHelper.autoInstall.installedCount", cnt)); +// } +// return true; +//} +// +//void InitAddonsHelper() { +// if (LL::isDebugMode()) +// addonLogger.consoleLevel = addonLogger.debug.level; +// +// filesystem::remove_all(ADDON_INSTALL_TEMP_DIR); +// filesystem::create_directories(ADDON_INSTALL_TEMP_DIR); +// +// AutoInstallAddons(LL::globalConfig.addonsInstallPath); +// BuildAddonsList(); +// +// filesystem::remove_all(ADDON_INSTALL_TEMP_DIR); +// +// Event::RegCmdEvent::subscribe([](Event::RegCmdEvent ev) { // Register commands +// AddonsCommand::setup(ev.mCommandRegistry); +// return true; +// }); +//} \ No newline at end of file diff --git a/LiteLoader/Main/BuiltinBugFix.cpp b/LiteLoader/Main/BuiltinBugFix.cpp index f2a83fb..87a90d2 100644 --- a/LiteLoader/Main/BuiltinBugFix.cpp +++ b/LiteLoader/Main/BuiltinBugFix.cpp @@ -1,426 +1,426 @@ -#include - -#include
-#include
-#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -using namespace LL; - -// Fix bug -TClasslessInstanceHook(bool, "?_read@ClientCacheBlobStatusPacket@@EEAA?AW4StreamReadResult@@AEAVReadOnlyBinaryStream@@@Z", - ReadOnlyBinaryStream* a2) { - ReadOnlyBinaryStream pkt(a2->getData(), false); - pkt.getUnsignedVarInt(); - if (pkt.getUnsignedVarInt() >= 0xfff) - return false; - if (pkt.getUnsignedVarInt() >= 0xfff) - return false; - return original(this, a2); -} - -// Fix bug -TClasslessInstanceHook(void*, "?_read@PurchaseReceiptPacket@@EEAA?AW4StreamReadResult@@AEAVReadOnlyBinaryStream@@@Z", - ReadOnlyBinaryStream* a2) { - return (void*)1; -} - -// Fix bug -TClasslessInstanceHook(void*, "?_read@EduUriResourcePacket@@EEAA?AW4StreamReadResult@@AEAVReadOnlyBinaryStream@@@Z", - ReadOnlyBinaryStream* a2) { - return (void*)1; -} - -// Fix the listening port twice -TClasslessInstanceHook(__int64, "?LogIPSupport@RakPeerHelper@@AEAAXXZ") { - static bool isFirstLog = true; - if (globalConfig.enableFixListenPort) { - if (isFirstLog) { - isFirstLog = false; - original(this); - endTime = clock(); - Logger("Server").info("Done (" + fmt::format("{:.1f}", (endTime - startTime) * 1.0 / 1000) + "s)! For help, type \"help\" or \"?\""); - return 1; - } - return 0; - } else { - original(this); - if (!isFirstLog) { - endTime = clock(); - Logger("Server").info("Done (" + fmt::format("{:.1f}", (endTime - startTime) * 1.0 / 1000) + "s)! For help, type \"help\" or \"?\""); - } - isFirstLog = false; - return 1; - } -} - -// Fix abnormal items -#include -#include -#include -#include -#include -#include -#include -#include - -inline bool itemMayFromReducer(ItemStack const& item) { - return item.isNull() || (ElementBlock::isElement(item) && !item.hasUserData()); -} - -TInstanceHook(void, "?handle@ServerNetworkHandler@@UEAAXAEBVNetworkIdentifier@@AEBVInventoryTransactionPacket@@@Z", - ServerNetworkHandler, NetworkIdentifier const& netid, InventoryTransactionPacket* pk) { - if (globalConfig.enableAntiGive) { - auto sp = (Player*)this->getServerPlayer(netid); - auto& actions = pk->transaction->data.actions; - bool abnormal = false; - bool mayFromReducer = true; - bool isContainer = false; - for (auto& action : actions) { - if (action.first.type == InventorySourceType::Container) { - isContainer = true; - if (abnormal) { - logger.warn(tr("ll.antiAbnormalItem.detected", sp->getRealName())); - mayFromReducer = false; - } - } - if (action.first.type == InventorySourceType::NONIMPLEMENTEDTODO) { - for (auto& a : action.second) { - auto fromDesc = ItemStack::fromDescriptor(a.fromDescriptor, Global->getBlockPalette(), true); - auto toDesc = ItemStack::fromDescriptor(a.fromDescriptor, Global->getBlockPalette(), true); - if ( isContainer || !itemMayFromReducer(fromDesc) || !itemMayFromReducer(toDesc) || !itemMayFromReducer(a.fromItem) || !itemMayFromReducer(a.toItem)) { - if (mayFromReducer) { - logger.warn(tr("ll.antiAbnormalItem.detected", sp->getRealName())); - } - if (!toDesc.isNull()) { - logger.warn(tr("ll.antiAbnormalItem.itemInfo", toDesc.toString())); - } - mayFromReducer = false; - } - } - abnormal = true; - } - } - - if (abnormal && !mayFromReducer) { - string cmd = globalConfig.antiGiveCommand; - ReplaceStr(cmd, "{player}", "\"" + sp->getRealName() + "\""); - Level::runcmd(cmd); - return; - } - } - return original(this, netid, pk); -} - -TInstanceHook(size_t, "??0PropertiesSettings@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z", PropertiesSettings, const std::string& file) { - auto out = original(this, file); - if (LL::globalConfig.enableUnoccupyPort19132) { - // logger.warn("If you turn on this feature, your server will not be displayed on the LAN"); - DWORD v4Flag, v6Flag; - VirtualProtect((void*)&SharedConstants::NetworkDefaultGamePort, 4, PAGE_READWRITE, &v4Flag); - *(unsigned short*)&SharedConstants::NetworkDefaultGamePort = getServerPort(); - VirtualProtect((void*)&SharedConstants::NetworkDefaultGamePort, 4, v4Flag, NULL); - - VirtualProtect((void*)&SharedConstants::NetworkDefaultGamePortv6, 4, PAGE_READWRITE, &v6Flag); - *(unsigned short*)&SharedConstants::NetworkDefaultGamePortv6 = getServerPortv6(); - VirtualProtect((void*)&SharedConstants::NetworkDefaultGamePortv6, 4, v6Flag, NULL); - } - // Global service - Global = this; - return out; -} - -// Fix move view crash (ref PlayerAuthInput[MoveView]) -Player* movingViewPlayer = nullptr; -TInstanceHook(void, "?moveView@Player@@UEAAXXZ", - Player) { - movingViewPlayer = this; - original(this); - movingViewPlayer = nullptr; -} -#include -inline bool Interval(int a1) { - if (a1 < 0x5ffffff && a1 > -0x5ffffff) - return true; - return false; -} -template -inline bool validPosition(T const& pos) { - if (isnan(static_cast(pos.x)) || isnan(static_cast(pos.z))) - return false; - return Interval(static_cast(pos.x)) && Interval(static_cast(pos.y)) && Interval(static_cast(pos.z)); -} -inline void fixPlayerPosition(Player* pl, bool kick = true) { - if (pl->isPlayer()) { - logger.warn << "Player(" << pl->getRealName() << ") sent invalid MoveView Packet!" << Logger::endl; - auto& pos = pl->getPosPrev(); - if (validPosition(pos)) - pl->setPos(pl->getPosition()); - else - pl->setPos(Global->getDefaultSpawn().bottomCenter()); - if (kick) - pl->kick("error move"); - } -} -TInstanceHook(void, "?moveSpawnView@Player@@QEAAXAEBVVec3@@V?$AutomaticID@VDimension@@H@@@Z", - Player, class Vec3 const& pos, class AutomaticID dimid) { - if (validPosition(pos)) - return original(this, pos, dimid); - fixPlayerPosition(this, false); -} -TClasslessInstanceHook(__int64, "?move@ChunkViewSource@@QEAAXAEBVBlockPos@@H_NW4ChunkSourceViewGenerateMode@ChunkSource@@V?$function@$$A6AXV?$buffer_span_mut@V?$shared_ptr@VLevelChunk@@@std@@@@V?$buffer_span@I@@@Z@std@@UActorUniqueID@@@Z", - BlockPos a2, int a3, unsigned __int8 a4, int a5, __int64 a6, __int64 a7) { - if (validPosition(a2)) - return original(this, a2, a3, a4,a5,a6,a7); - fixPlayerPosition(movingViewPlayer); - return 0; -} - -TInstanceHook(void, "?move@Player@@UEAAXAEBVVec3@@@Z", Player, Vec3 pos) { - if (validPosition(pos)) - return original(this, pos); - logger.warn << "Player(" << this->getRealName() << ") sent invalid Move Packet!" << Logger::endl; - this->kick("error move"); - return; -} - -#if false -TInstanceHook(void, "?die@ServerPlayer@@UEAAXAEBVActorDamageSource@@@Z", ServerPlayer , ActorDamageSource* ds) -{ - original(this, ds); - if (LL::globalConfig.enableFixMcBug) - { - auto name = getRealName(); - Schedule::delay([name]() { - auto pl = Global->getPlayer(name); - if (pl) - pl->kill(); - },1); - } -} -#endif - -// Fix Fishing Hook changeDimension Crash -TInstanceHook(__int64, "?changeDimension@Actor@@UEAAXV?$AutomaticID@VDimension@@H@@@Z", Actor, unsigned int a1) { - if (!LL::globalConfig.enableFixMcBug) - return original(this, a1); - if ((int)this->getEntityTypeId() == 0x4D) - return 0; - return original(this, a1); -} - -TClasslessInstanceHook(__int64, "?teleportEntity@EndGatewayBlockActor@@QEAAXAEAVActor@@@Z", Actor* a1) { - if (!LL::globalConfig.enableFixMcBug) - return original(this, a1); - if ((int)a1->getEntityTypeId() == 0x4D) - return 0; - return original(this, a1); -} - -// Fix wine stop -TClasslessInstanceHook(void, "?leaveGameSync@ServerInstance@@QEAAXXZ") { - original(this); - if (IsWineEnvironment()) { - std::cerr << "Quit correctly" << std::endl; - auto proc = GetCurrentProcess(); - TerminateProcess(proc, 0); - } -} - -TClasslessInstanceHook(enum StartupResult, "?Startup@RakPeer@RakNet@@UEAA?AW4StartupResult@2@IPEAUSocketDescriptor@2@IH@Z", - unsigned int maxConnections, class SocketDescriptor* socketDescriptors, unsigned socketDescriptorCount, int threadPriority) { - if (maxConnections > 0xFFFF) { - maxConnections = 0xFFFF; - } - return original(this, maxConnections, socketDescriptors, socketDescriptorCount, threadPriority); -} - -// Fix command crash when server is stopping -TClasslessInstanceHook(void, "?fireEventPlayerMessage@MinecraftEventing@@AEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@000@Z", - std::string const& a1, std::string const& a2, std::string const& a3, std::string const& a4) { - if (LL::isServerStopping()) - return; - original(this, a1, a2, a3, a4); -} -TClasslessInstanceHook(void, "?fireEventPlayerTransform@MinecraftEventing@@SAXAEAVPlayer@@@Z", - class Player& a1) { - if (LL::isServerStopping()) - return; - original(this, a1); -} - -TClasslessInstanceHook(void, "?fireEventPlayerTravelled@MinecraftEventing@@UEAAXPEAVPlayer@@M@Z", - class Player& a1, float a2) { - if (LL::isServerStopping()) - return; - original(this, a1, a2); -} -TClasslessInstanceHook(void, "?fireEventPlayerTeleported@MinecraftEventing@@SAXPEAVPlayer@@MW4TeleportationCause@1@H@Z", - class Player* a1, float a2, int a3, int a4) { - if (LL::isServerStopping()) - return; - original(this, a1, a2, a3, a4); -} - -// Set stdin mode to text mode if in wine environment -inline bool _tryFixConsoleInputMode() { - if ((LL::globalConfig.enableFixMcBug && IsWineEnvironment()) || LL::globalConfig.enableForceUtf8Input) { - int result = _setmode(_fileno(stdin), _O_U8TEXT); - if (result == -1) { - logger.error("Cannot set stdin to utf8 text mode"); - return false; - } - return true; - } - return true; -} - -// Fix wine console input -THook(std::wistream&, - "??$getline@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@YAAEAV?$basic_istream@_WU?$char_traits@_W@std@@@0@$$" - "QEAV10@AEAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@0@_W@Z", - std::wistream&& ret, std::wstring& a1, wchar_t a2) { - if (&ret == &std::wcin) { - static bool fixed = _tryFixConsoleInputMode(); - } - return original(std::move(ret), a1, a2); -} - -// Fix server broadcast bug. -TClasslessInstanceHook(bool, "?getLANBroadcast@LevelData@@QEBA_NXZ") { - if (LL::globalConfig.enableFixBroadcastBug) { - return true; - } - return original(this); -} - -TClasslessInstanceHook(bool, "?getLANBroadcastIntent@LevelData@@QEBA_NXZ") { - if (LL::globalConfig.enableFixBroadcastBug) { - return true; - } - return original(this); -} - -// Disable 'Running AutoCompaction...' log. -bool pauseBLogging = false; -THook(__int64, "std::_Func_impl_no_alloc<,TaskResult>::_Do_call", - __int64 a1, __int64 a2) { - if (LL::globalConfig.disableAutoCompactionLog) { - pauseBLogging = true; - auto v = original(a1, a2); - pauseBLogging = false; - return v; - } - return original(a1, a2); -} - -TClasslessInstanceHook(char, "?log_va@BedrockLog@@YAXW4LogCategory@1@V?$bitset@$02@std@@W4LogRule@1@W4LogAreaID@@IPEBDH4PEAD@Z", - char a2, int a3, int a4, unsigned int a5, __int64 a6, int a7, __int64 a8, __int64 a9) { - if (LL::globalConfig.disableAutoCompactionLog && pauseBLogging) { - return 0; - } - return original(this, a2, a3, a4, a5, a6, a7, a8, a9); -} - - -//Try Fix BDS Crash -//Beta - -THook(void*, "??0ScopedTimer@ImguiProfiler@@QEAA@PEBD0_N@Z", - void* self, char* a2, char* a3, char a4) { - if (LL::globalConfig.enableFixBDSCrash) { - return nullptr; - } - return original(self, a2, a3, a4); -} - -THook(void, "??1ScopedTimer@ImguiProfiler@@UEAA@XZ", - void* self) { - if (LL::globalConfig.enableFixBDSCrash) { - return; - } - return original(self); -} - -SHook2("_tickDimensionTransition", __int64, "40 53 55 41 56 41 57 48 ?? ?? ?? ?? ?? ?? 48 ?? ?? ?? ?? ?? ?? 48 33 " - "C4 48 89 ?? ?? ?? 48 8B C2 4C 8B F9 48 8B C8 33 D2 49 8B D9 49 8B E8 E8 ?? ?? ?? ?? 4C 8B F0 48 85 C0", - __int64 a1, ActorOwnerComponent* a2, __int64 a3, void* a4) { - if (LL::globalConfig.enableFixBDSCrash) { - auto ac = Actor::tryGetFromComponent(*a2, 0); - if (ac) { - auto bs = &ac->getRegionConst(); - if (bs == nullptr || !bs) - return NULL; - } - } - return original(a1, a2, a3, a4); -} - -THook(void, "?_trackMovement@GameEventMovementTrackingSystem@@CAXAEAVActor@@AEAVGameEventMovementTrackingComponent@@@Z", - Actor* a1, void* self) { - if (LL::globalConfig.enableFixBDSCrash) { - auto bs = &a1->getRegionConst(); - if (bs == nullptr || !bs) { - return; - } - } - original(a1, self); -} - -#include -#include - -THook(LevelChunk*, "?getChunk@BlockSource@@QEBAPEAVLevelChunk@@AEBVChunkPos@@@Z", - BlockSource* self, ChunkPos* a2) { - if (LL::globalConfig.enableFixBDSCrash) { - LevelChunk* ptr = nullptr; - try { - ptr = original(self, a2); - } catch (...) { - return nullptr; - } - return ptr; - } - return original(self, a2); -} - - -THook(__int64, "?getAvailableChunk@ChunkSource@@QEAA?AV?$shared_ptr@VLevelChunk@@@std@@AEBVChunkPos@@@Z", - __int64 a1, __int64 a2) { - if (LL::globalConfig.enableFixBDSCrash) { - __int64 ptr = NULL; - try { - ptr = original(a1, a2); - } catch (...) { - return NULL; - } - return ptr; - } - return original(a1, a2); -} - -TInstanceHook(BlockSource*, "?getRegionConst@Actor@@QEBAAEBVBlockSource@@XZ", - Actor) { - - auto bs = original(this); - if (LL::globalConfig.enableFixBDSCrash) { - if (!bs) { - return Level::getBlockSource(getDimensionId()); - } - } - return bs; -} \ No newline at end of file +//#include +// +//#include
+//#include
+//#include +//#include +// +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +// +//#include +//#include +//#include +//#include +// +//using namespace LL; +// +//// Fix bug +//TClasslessInstanceHook(bool, "?_read@ClientCacheBlobStatusPacket@@EEAA?AW4StreamReadResult@@AEAVReadOnlyBinaryStream@@@Z", +// ReadOnlyBinaryStream* a2) { +// ReadOnlyBinaryStream pkt(a2->getData(), false); +// pkt.getUnsignedVarInt(); +// if (pkt.getUnsignedVarInt() >= 0xfff) +// return false; +// if (pkt.getUnsignedVarInt() >= 0xfff) +// return false; +// return original(this, a2); +//} +// +//// Fix bug +//TClasslessInstanceHook(void*, "?_read@PurchaseReceiptPacket@@EEAA?AW4StreamReadResult@@AEAVReadOnlyBinaryStream@@@Z", +// ReadOnlyBinaryStream* a2) { +// return (void*)1; +//} +// +//// Fix bug +//TClasslessInstanceHook(void*, "?_read@EduUriResourcePacket@@EEAA?AW4StreamReadResult@@AEAVReadOnlyBinaryStream@@@Z", +// ReadOnlyBinaryStream* a2) { +// return (void*)1; +//} +// +//// Fix the listening port twice +//TClasslessInstanceHook(__int64, "?LogIPSupport@RakPeerHelper@@AEAAXXZ") { +// static bool isFirstLog = true; +// if (globalConfig.enableFixListenPort) { +// if (isFirstLog) { +// isFirstLog = false; +// original(this); +// endTime = clock(); +// Logger("Server").info("Done (" + fmt::format("{:.1f}", (endTime - startTime) * 1.0 / 1000) + "s)! For help, type \"help\" or \"?\""); +// return 1; +// } +// return 0; +// } else { +// original(this); +// if (!isFirstLog) { +// endTime = clock(); +// Logger("Server").info("Done (" + fmt::format("{:.1f}", (endTime - startTime) * 1.0 / 1000) + "s)! For help, type \"help\" or \"?\""); +// } +// isFirstLog = false; +// return 1; +// } +//} +// +//// Fix abnormal items +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +// +//inline bool itemMayFromReducer(ItemStack const& item) { +// return item.isNull() || (ElementBlock::isElement(item) && !item.hasUserData()); +//} +// +//TInstanceHook(void, "?handle@ServerNetworkHandler@@UEAAXAEBVNetworkIdentifier@@AEBVInventoryTransactionPacket@@@Z", +// ServerNetworkHandler, NetworkIdentifier const& netid, InventoryTransactionPacket* pk) { +// if (globalConfig.enableAntiGive) { +// auto sp = (Player*)this->getServerPlayer(netid); +// auto& actions = pk->transaction->data.actions; +// bool abnormal = false; +// bool mayFromReducer = true; +// bool isContainer = false; +// for (auto& action : actions) { +// if (action.first.type == InventorySourceType::Container) { +// isContainer = true; +// if (abnormal) { +// logger.warn(tr("ll.antiAbnormalItem.detected", sp->getRealName())); +// mayFromReducer = false; +// } +// } +// if (action.first.type == InventorySourceType::NONIMPLEMENTEDTODO) { +// for (auto& a : action.second) { +// auto fromDesc = ItemStack::fromDescriptor(a.fromDescriptor, Global->getBlockPalette(), true); +// auto toDesc = ItemStack::fromDescriptor(a.fromDescriptor, Global->getBlockPalette(), true); +// if ( isContainer || !itemMayFromReducer(fromDesc) || !itemMayFromReducer(toDesc) || !itemMayFromReducer(a.fromItem) || !itemMayFromReducer(a.toItem)) { +// if (mayFromReducer) { +// logger.warn(tr("ll.antiAbnormalItem.detected", sp->getRealName())); +// } +// if (!toDesc.isNull()) { +// logger.warn(tr("ll.antiAbnormalItem.itemInfo", toDesc.toString())); +// } +// mayFromReducer = false; +// } +// } +// abnormal = true; +// } +// } +// +// if (abnormal && !mayFromReducer) { +// string cmd = globalConfig.antiGiveCommand; +// ReplaceStr(cmd, "{player}", "\"" + sp->getRealName() + "\""); +// Level::runcmd(cmd); +// return; +// } +// } +// return original(this, netid, pk); +//} +// +//TInstanceHook(size_t, "??0PropertiesSettings@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z", PropertiesSettings, const std::string& file) { +// auto out = original(this, file); +// if (LL::globalConfig.enableUnoccupyPort19132) { +// // logger.warn("If you turn on this feature, your server will not be displayed on the LAN"); +// DWORD v4Flag, v6Flag; +// VirtualProtect((void*)&SharedConstants::NetworkDefaultGamePort, 4, PAGE_READWRITE, &v4Flag); +// *(unsigned short*)&SharedConstants::NetworkDefaultGamePort = getServerPort(); +// VirtualProtect((void*)&SharedConstants::NetworkDefaultGamePort, 4, v4Flag, NULL); +// +// VirtualProtect((void*)&SharedConstants::NetworkDefaultGamePortv6, 4, PAGE_READWRITE, &v6Flag); +// *(unsigned short*)&SharedConstants::NetworkDefaultGamePortv6 = getServerPortv6(); +// VirtualProtect((void*)&SharedConstants::NetworkDefaultGamePortv6, 4, v6Flag, NULL); +// } +// // Global service +// Global = this; +// return out; +//} +// +//// Fix move view crash (ref PlayerAuthInput[MoveView]) +//Player* movingViewPlayer = nullptr; +//TInstanceHook(void, "?moveView@Player@@UEAAXXZ", +// Player) { +// movingViewPlayer = this; +// original(this); +// movingViewPlayer = nullptr; +//} +//#include +//inline bool Interval(int a1) { +// if (a1 < 0x5ffffff && a1 > -0x5ffffff) +// return true; +// return false; +//} +//template +//inline bool validPosition(T const& pos) { +// if (isnan(static_cast(pos.x)) || isnan(static_cast(pos.z))) +// return false; +// return Interval(static_cast(pos.x)) && Interval(static_cast(pos.y)) && Interval(static_cast(pos.z)); +//} +//inline void fixPlayerPosition(Player* pl, bool kick = true) { +// if (pl->isPlayer()) { +// logger.warn << "Player(" << pl->getRealName() << ") sent invalid MoveView Packet!" << Logger::endl; +// auto& pos = pl->getPosPrev(); +// if (validPosition(pos)) +// pl->setPos(pl->getPosition()); +// else +// pl->setPos(Global->getDefaultSpawn().bottomCenter()); +// if (kick) +// pl->kick("error move"); +// } +//} +//TInstanceHook(void, "?moveSpawnView@Player@@QEAAXAEBVVec3@@V?$AutomaticID@VDimension@@H@@@Z", +// Player, class Vec3 const& pos, class AutomaticID dimid) { +// if (validPosition(pos)) +// return original(this, pos, dimid); +// fixPlayerPosition(this, false); +//} +//TClasslessInstanceHook(__int64, "?move@ChunkViewSource@@QEAAXAEBVBlockPos@@H_NW4ChunkSourceViewGenerateMode@ChunkSource@@V?$function@$$A6AXV?$buffer_span_mut@V?$shared_ptr@VLevelChunk@@@std@@@@V?$buffer_span@I@@@Z@std@@UActorUniqueID@@@Z", +// BlockPos a2, int a3, unsigned __int8 a4, int a5, __int64 a6, __int64 a7) { +// if (validPosition(a2)) +// return original(this, a2, a3, a4,a5,a6,a7); +// fixPlayerPosition(movingViewPlayer); +// return 0; +//} +// +//TInstanceHook(void, "?move@Player@@UEAAXAEBVVec3@@@Z", Player, Vec3 pos) { +// if (validPosition(pos)) +// return original(this, pos); +// logger.warn << "Player(" << this->getRealName() << ") sent invalid Move Packet!" << Logger::endl; +// this->kick("error move"); +// return; +//} +// +//#if false +//TInstanceHook(void, "?die@ServerPlayer@@UEAAXAEBVActorDamageSource@@@Z", ServerPlayer , ActorDamageSource* ds) +//{ +// original(this, ds); +// if (LL::globalConfig.enableFixMcBug) +// { +// auto name = getRealName(); +// Schedule::delay([name]() { +// auto pl = Global->getPlayer(name); +// if (pl) +// pl->kill(); +// },1); +// } +//} +//#endif +// +//// Fix Fishing Hook changeDimension Crash +//TInstanceHook(__int64, "?changeDimension@Actor@@UEAAXV?$AutomaticID@VDimension@@H@@@Z", Actor, unsigned int a1) { +// if (!LL::globalConfig.enableFixMcBug) +// return original(this, a1); +// if ((int)this->getEntityTypeId() == 0x4D) +// return 0; +// return original(this, a1); +//} +// +//TClasslessInstanceHook(__int64, "?teleportEntity@EndGatewayBlockActor@@QEAAXAEAVActor@@@Z", Actor* a1) { +// if (!LL::globalConfig.enableFixMcBug) +// return original(this, a1); +// if ((int)a1->getEntityTypeId() == 0x4D) +// return 0; +// return original(this, a1); +//} +// +//// Fix wine stop +//TClasslessInstanceHook(void, "?leaveGameSync@ServerInstance@@QEAAXXZ") { +// original(this); +// if (IsWineEnvironment()) { +// std::cerr << "Quit correctly" << std::endl; +// auto proc = GetCurrentProcess(); +// TerminateProcess(proc, 0); +// } +//} +// +//TClasslessInstanceHook(enum StartupResult, "?Startup@RakPeer@RakNet@@UEAA?AW4StartupResult@2@IPEAUSocketDescriptor@2@IH@Z", +// unsigned int maxConnections, class SocketDescriptor* socketDescriptors, unsigned socketDescriptorCount, int threadPriority) { +// if (maxConnections > 0xFFFF) { +// maxConnections = 0xFFFF; +// } +// return original(this, maxConnections, socketDescriptors, socketDescriptorCount, threadPriority); +//} +// +//// Fix command crash when server is stopping +//TClasslessInstanceHook(void, "?fireEventPlayerMessage@MinecraftEventing@@AEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@000@Z", +// std::string const& a1, std::string const& a2, std::string const& a3, std::string const& a4) { +// if (LL::isServerStopping()) +// return; +// original(this, a1, a2, a3, a4); +//} +//TClasslessInstanceHook(void, "?fireEventPlayerTransform@MinecraftEventing@@SAXAEAVPlayer@@@Z", +// class Player& a1) { +// if (LL::isServerStopping()) +// return; +// original(this, a1); +//} +// +//TClasslessInstanceHook(void, "?fireEventPlayerTravelled@MinecraftEventing@@UEAAXPEAVPlayer@@M@Z", +// class Player& a1, float a2) { +// if (LL::isServerStopping()) +// return; +// original(this, a1, a2); +//} +//TClasslessInstanceHook(void, "?fireEventPlayerTeleported@MinecraftEventing@@SAXPEAVPlayer@@MW4TeleportationCause@1@H@Z", +// class Player* a1, float a2, int a3, int a4) { +// if (LL::isServerStopping()) +// return; +// original(this, a1, a2, a3, a4); +//} +// +//// Set stdin mode to text mode if in wine environment +//inline bool _tryFixConsoleInputMode() { +// if ((LL::globalConfig.enableFixMcBug && IsWineEnvironment()) || LL::globalConfig.enableForceUtf8Input) { +// int result = _setmode(_fileno(stdin), _O_U8TEXT); +// if (result == -1) { +// logger.error("Cannot set stdin to utf8 text mode"); +// return false; +// } +// return true; +// } +// return true; +//} +// +//// Fix wine console input +//THook(std::wistream&, +// "??$getline@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@YAAEAV?$basic_istream@_WU?$char_traits@_W@std@@@0@$$" +// "QEAV10@AEAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@0@_W@Z", +// std::wistream&& ret, std::wstring& a1, wchar_t a2) { +// if (&ret == &std::wcin) { +// static bool fixed = _tryFixConsoleInputMode(); +// } +// return original(std::move(ret), a1, a2); +//} +// +//// Fix server broadcast bug. +//TClasslessInstanceHook(bool, "?getLANBroadcast@LevelData@@QEBA_NXZ") { +// if (LL::globalConfig.enableFixBroadcastBug) { +// return true; +// } +// return original(this); +//} +// +//TClasslessInstanceHook(bool, "?getLANBroadcastIntent@LevelData@@QEBA_NXZ") { +// if (LL::globalConfig.enableFixBroadcastBug) { +// return true; +// } +// return original(this); +//} +// +//// Disable 'Running AutoCompaction...' log. +//bool pauseBLogging = false; +//THook(__int64, "std::_Func_impl_no_alloc<,TaskResult>::_Do_call", +// __int64 a1, __int64 a2) { +// if (LL::globalConfig.disableAutoCompactionLog) { +// pauseBLogging = true; +// auto v = original(a1, a2); +// pauseBLogging = false; +// return v; +// } +// return original(a1, a2); +//} +// +//TClasslessInstanceHook(char, "?log_va@BedrockLog@@YAXW4LogCategory@1@V?$bitset@$02@std@@W4LogRule@1@W4LogAreaID@@IPEBDH4PEAD@Z", +// char a2, int a3, int a4, unsigned int a5, __int64 a6, int a7, __int64 a8, __int64 a9) { +// if (LL::globalConfig.disableAutoCompactionLog && pauseBLogging) { +// return 0; +// } +// return original(this, a2, a3, a4, a5, a6, a7, a8, a9); +//} +// +// +////Try Fix BDS Crash +////Beta +// +//THook(void*, "??0ScopedTimer@ImguiProfiler@@QEAA@PEBD0_N@Z", +// void* self, char* a2, char* a3, char a4) { +// if (LL::globalConfig.enableFixBDSCrash) { +// return nullptr; +// } +// return original(self, a2, a3, a4); +//} +// +//THook(void, "??1ScopedTimer@ImguiProfiler@@UEAA@XZ", +// void* self) { +// if (LL::globalConfig.enableFixBDSCrash) { +// return; +// } +// return original(self); +//} +// +//SHook2("_tickDimensionTransition", __int64, "40 53 55 41 56 41 57 48 ?? ?? ?? ?? ?? ?? 48 ?? ?? ?? ?? ?? ?? 48 33 " +// "C4 48 89 ?? ?? ?? 48 8B C2 4C 8B F9 48 8B C8 33 D2 49 8B D9 49 8B E8 E8 ?? ?? ?? ?? 4C 8B F0 48 85 C0", +// __int64 a1, ActorOwnerComponent* a2, __int64 a3, void* a4) { +// if (LL::globalConfig.enableFixBDSCrash) { +// auto ac = Actor::tryGetFromComponent(*a2, 0); +// if (ac) { +// auto bs = &ac->getRegionConst(); +// if (bs == nullptr || !bs) +// return NULL; +// } +// } +// return original(a1, a2, a3, a4); +//} +// +//THook(void, "?_trackMovement@GameEventMovementTrackingSystem@@CAXAEAVActor@@AEAVGameEventMovementTrackingComponent@@@Z", +// Actor* a1, void* self) { +// if (LL::globalConfig.enableFixBDSCrash) { +// auto bs = &a1->getRegionConst(); +// if (bs == nullptr || !bs) { +// return; +// } +// } +// original(a1, self); +//} +// +//#include +//#include +// +//THook(LevelChunk*, "?getChunk@BlockSource@@QEBAPEAVLevelChunk@@AEBVChunkPos@@@Z", +// BlockSource* self, ChunkPos* a2) { +// if (LL::globalConfig.enableFixBDSCrash) { +// LevelChunk* ptr = nullptr; +// try { +// ptr = original(self, a2); +// } catch (...) { +// return nullptr; +// } +// return ptr; +// } +// return original(self, a2); +//} +// +// +//THook(__int64, "?getAvailableChunk@ChunkSource@@QEAA?AV?$shared_ptr@VLevelChunk@@@std@@AEBVChunkPos@@@Z", +// __int64 a1, __int64 a2) { +// if (LL::globalConfig.enableFixBDSCrash) { +// __int64 ptr = NULL; +// try { +// ptr = original(a1, a2); +// } catch (...) { +// return NULL; +// } +// return ptr; +// } +// return original(a1, a2); +//} +// +//TInstanceHook(BlockSource*, "?getRegionConst@Actor@@QEBAAEBVBlockSource@@XZ", +// Actor) { +// +// auto bs = original(this); +// if (LL::globalConfig.enableFixBDSCrash) { +// if (!bs) { +// return Level::getBlockSource(getDimensionId()); +// } +// } +// return bs; +//} \ No newline at end of file diff --git a/LiteLoader/Main/BuiltinCommands.cpp b/LiteLoader/Main/BuiltinCommands.cpp index b981e9a..265097e 100644 --- a/LiteLoader/Main/BuiltinCommands.cpp +++ b/LiteLoader/Main/BuiltinCommands.cpp @@ -1,389 +1,389 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include
-#include
-#include "../ScriptEngine/Main/Configs.h" - -using namespace RegisterCommandHelper; -using namespace LL; - -static_assert(sizeof(CommandSelector) == 200); - -class TeleportDimensionCommand : public Command { - - enum class DimensionType { - OverWorld, - Nether, - TheEnd, - } DimensionId; - CommandSelector Victim; - CommandPosition CommandPos; - bool Victim_isSet = false; - bool CommandPos_isSet = false; - - Vec3 getTargetPos(CommandOrigin const& ori, Actor* actor) const { - if (CommandPos_isSet) - return CommandPos.getPosition(ori, {0, 0, 0}); - auto pos = actor->getPosition(); - Vec3 result = pos; - int actorDimensionId = actor->getDimensionId(); - switch (DimensionId) { - case TeleportDimensionCommand::DimensionType::OverWorld: - if (actorDimensionId == 1) - result = {pos.x * 8, pos.y, pos.z * 8}; - break; - case TeleportDimensionCommand::DimensionType::Nether: - if (actorDimensionId != 1) - result = {pos.x / 8, pos.y, pos.z / 8}; - break; - case TeleportDimensionCommand::DimensionType::TheEnd: - if (actorDimensionId != 2) - result = {100, 50, 0}; - break; - default: - break; - } - return result; - } - - bool teleportTarget(CommandOrigin const& ori, CommandOutput& output, Actor* actor) const { - auto dim = VanillaDimensions::toString((int)DimensionId); - auto pos = getTargetPos(ori, actor); - actor->teleport(pos, (int)DimensionId); - output.trSuccess("ll.cmd.tpdim.success", actor->getNameTag(), dim, pos.x, pos.y, pos.z); - return true; - } - - bool teleportTargets(CommandOrigin const& ori, CommandOutput& output, CommandSelectorResults& actors) const { - auto dim = VanillaDimensions::toString((int)DimensionId); - std::string names; - for (auto& actor : actors) { - std::string actorName = actor->getNameTag(); - if (actorName.empty()) { - actorName = actor->getTypeName(); - } - names.append(", ").append(actorName); - if (actor->teleport(getTargetPos(ori, actor), (int)DimensionId)) { - output.success(); - } - } - if (output.getSuccessCount() == 0) { - output.trError("ll.cmd.tpdim.error.noActorTeleported"); - return false; - } else { - std::string message = fmt::format("Teleported {} to {}", names.substr(2), dim); - if (CommandPos_isSet) { - auto pos = CommandPos.getPosition(ori, {0, 0, 0}); - message.append(fmt::format(" ({:2f}, {:2f}, {:2f})", pos.x, pos.y, pos.z)); - } - output.addMessage(message); - return true; - } - } - -public: - void execute(CommandOrigin const& ori, CommandOutput& output) const override { - output.setLanguageCode(ori); - if ((int)DimensionId < 0 || (int)DimensionId > 2) { - output.trError("ll.cmd.tpdim.invalidDimid", (int)DimensionId); - return; - } - if (Victim_isSet) { - auto result = Victim.results(ori); - if (result.empty()) - output.trError("ll.cmd.tpdim.error.noActorSpecified"); - else if (result.count() == 1) - teleportTarget(ori, output, *result.begin()); - else - teleportTargets(ori, output, result); - } else { - auto actor = ori.getEntity(); - if (!actor) - output.trError("ll.cmd.tpdim.error.noActorSpecified"); - else - teleportTarget(ori, output, actor); - } - } - - static void setup(CommandRegistry* registry) { - registry->registerCommand( - "tpdim", "Teleport to Dimension", CommandPermissionLevel::GameMasters, - {(CommandFlagValue)0}, {(CommandFlagValue)0x80}); - registry->addEnum("DimensionType", - { - {"overworld", DimensionType::OverWorld}, - {"o", DimensionType::OverWorld}, - {"nether", DimensionType::Nether}, - {"n", DimensionType::Nether}, - {"end", DimensionType::TheEnd}, - {"e", DimensionType::TheEnd}, - }); - auto dimensionTypeParam = makeMandatory(&TeleportDimensionCommand::DimensionId, - "Dimension", "DimensionType"); - auto dimensionIdParam = makeMandatory((int TeleportDimensionCommand::*)&TeleportDimensionCommand::DimensionId, - "DimensionId"); - auto victimParam = makeMandatory(&TeleportDimensionCommand::Victim, "victim", - &TeleportDimensionCommand::Victim_isSet); - auto positionParam = makeOptional(&TeleportDimensionCommand::CommandPos, - "Position", &TeleportDimensionCommand::CommandPos_isSet); - - registry->registerOverload( - "tpdim", victimParam, dimensionTypeParam, positionParam); - registry->registerOverload( - "tpdim", victimParam, dimensionIdParam, positionParam); - // registry->registerOverload( - // "tpdim", dimensionTypeParam, positionParam); - registry->registerOverload( - "tpdim", dimensionIdParam, positionParam); - } -}; - -void LLListPluginsCommand(CommandOutput& output) { - auto plugins = LL::getAllPlugins(); - output.trSuccess("ll.cmd.listPlugin.overview", plugins.size()); - - std::ostringstream oss; - for (auto& [name, plugin] : plugins) { - string pluginName = name; - if (pluginName.find("§") == string::npos) - pluginName = "§b" + pluginName; - string desc = plugin->desc; - if (desc.find("§") == string::npos) - desc = "§7" + desc; - - auto fileName = UTF82String(std::filesystem::path(str2wstr(plugin->filePath)).filename().u8string()); - oss << fmt::format("- {} §a[v{}] §8({})\n {}\n", - pluginName, plugin->version.toString(), fileName, desc); - } - output.success(oss.str() + '\n'); - output.trAddMessage("ll.cmd.listPlugin.tip"); -} - -void LLPluginInfoCommand(CommandOutput& output, const string& pluginName) { - auto plugin = LL::getPlugin(pluginName); - if (plugin) { - std::map outs; - std::ostringstream oss; - auto fn = UTF82String(std::filesystem::path(str2wstr(plugin->filePath)).filename().u8string()); - string pluginType = plugin->type == Plugin::PluginType::ScriptPlugin ? "Script Plugin" : "DLL Plugin"; - - output.trAddMessage("ll.cmd.pluginInfo.title", pluginName); - - outs.emplace("Name", fmt::format("{} ({})", plugin->name, fn)); - outs.emplace("Description", plugin->desc); - outs.emplace("Version", "v" + plugin->version.toString(true)); - outs.emplace("Type", pluginType); - outs.emplace("File Path", plugin->filePath); - outs.merge(plugin->others); - size_t width = 10; - for (auto& [k, _] : outs) - width = std::max(width, k.length()); - for (auto& [k, v] : outs) { - if (k != "PluginType" && k != "PluginFilePath") - oss << "- §l" << std::setw(width) << std::left << k << "§r: " << v << std::endl; - } - auto text = oss.str(); - text.pop_back(); - output.success(text, {}); - } else { - output.trError("ll.cmd.pluginInfo.error.pluginNotFound", pluginName); - } -} - -void LLVersionCommand(CommandOutput& output) { - output.trSuccess("ll.cmd.version.msg", LL::getBdsVersion(), LL::getLoaderVersionString(), LL::getServerProtocolVersion()); -} - -void LLHelpCommand(CommandOutput& output) { - output.trSuccess("ll.cmd.help.msg"); -} - -void LLLoadPluginCommand(CommandOutput& output, const string& path) { - // if (!LL::isDebugMode()) - // return; - if (PluginManager::loadPlugin(path, true)) { - output.trSuccess("ll.cmd.loadPlugin.success", path); - } else { - output.trError("ll.cmd.loadPlugin.fail", path); - } -} - -void LLUnloadPluginCommand(CommandOutput& output, const string& pluginName) { - // if (!LL::isDebugMode()) - // return; - if (PluginManager::unloadPlugin(pluginName, true)) { - output.trSuccess("ll.cmd.unloadPlugin.success", pluginName); - } else { - output.trError("ll.cmd.unloadPlugin.fail", pluginName); - } -} - -void LLReloadPluginCommand(CommandOutput& output, const string& pluginName, bool reloadAll) { - // if (!LL::isDebugMode()) - // return; - if (!reloadAll) { - if (PluginManager::reloadPlugin(pluginName, true)) { - output.trSuccess("ll.cmd.reloadPlugin.success", pluginName); - } else { - output.trError("ll.cmd.reloadPlugin.fail", pluginName); - } - } else { - int cnt = PluginManager::reloadAllPlugins(true); - if (cnt > 0) { - output.trSuccess("ll.cmd.reloadAllPlugins.success", cnt); - } else { - output.trError("ll.cmd.reloadAllPlugins.fail"); - } - } -} - -class LLCommand : public Command { - - enum class Operation { - Version, - List, - Help, - Load, - Unload, - Reload - }; - - Operation operation; - bool hasUpgradeOption, hasPluginNameSet; - CommandRawText pluginNameToDoOperation; - -public: - void execute(CommandOrigin const& ori, CommandOutput& output) const override { - output.setLanguageCode(ori); - std::string pluginName = ""; - if (hasPluginNameSet) { - pluginName = pluginNameToDoOperation; - if (pluginName.size() > 1 && pluginName[0] == '"' && pluginName[pluginName.size() - 1] == '"' && pluginName[pluginName.size() - 2] != '\\') { - pluginName.erase(0, 1); - pluginName.pop_back(); - } - } - switch (operation) { - case Operation::Version: - LLVersionCommand(output); - break; - case Operation::List: - if (!hasPluginNameSet) - LLListPluginsCommand(output); - else - LLPluginInfoCommand(output, pluginName); - break; - case Operation::Load: - if (hasPluginNameSet) - LLLoadPluginCommand(output, pluginName); - else - output.trError("ll.cmd.error.noPathSpecified"); - break; - case Operation::Unload: - if (hasPluginNameSet) - LLUnloadPluginCommand(output, pluginName); - else - output.trError("ll.cmd.error.noNameSpecified"); - break; - case Operation::Reload: - if (hasPluginNameSet) - LLReloadPluginCommand(output, pluginName, false); - else - LLReloadPluginCommand(output, "", true); - break; - case Operation::Help: - LLHelpCommand(output); - break; - default: - break; - } - } - - static void setup(CommandRegistry* registry) { - // Register Cmd - registry->registerCommand("ll", "LiteLoaderBDS plugin operations", - CommandPermissionLevel::Console, {(CommandFlagValue)0}, {(CommandFlagValue)0x80}); - - // Register softenum - vector pluginList; - for (auto& [name, p] : LL::getAllPlugins()) { - pluginList.push_back(name); - } - registry->addSoftEnum("PluginName", pluginList); - - // ll version & help - registry->addEnum("Operation_Common", {{"version", Operation::Version}, - {"help", Operation::Help}}); - registry->registerOverload( - "ll", - makeMandatory(&LLCommand::operation, "Operation", "Operation_Common").addOptions((CommandParameterOption)1)); - - // ll load - registry->addEnum("Operation_FreeFilePath", { - {"load", Operation::Load}, - }); - registry->registerOverload( - "ll", - makeMandatory(&LLCommand::operation, "Operation", "Operation_FreeFilePath").addOptions((CommandParameterOption)1), - makeMandatory(&LLCommand::pluginNameToDoOperation, "pluginPath", nullptr, &LLCommand::hasPluginNameSet)); - - // ll unload - registry->addEnum("Operation_MustPluginName", { - {"unload", Operation::Unload}, - }); - registry->registerOverload( - "ll", - makeMandatory(&LLCommand::operation, "Operation", "Operation_MustPluginName").addOptions((CommandParameterOption)1), - makeMandatory((std::string LLCommand::*)&LLCommand::pluginNameToDoOperation, "pluginName", "PluginName", &LLCommand::hasPluginNameSet)); - - // ll list & reload - registry->addEnum("Operation_OptionalPluginName", { - {"list", Operation::List}, - {"plugins", Operation::List}, - {"reload", Operation::Reload}, - }); - registry->registerOverload( - "ll", - makeMandatory(&LLCommand::operation, "Operation", "Operation_OptionalPluginName").addOptions((CommandParameterOption)1), - makeOptional((std::string LLCommand::*)&LLCommand::pluginNameToDoOperation, "pluginName", "PluginName", &LLCommand::hasPluginNameSet)); - } -}; - -class VersionCommand : public Command { - -public: - void execute(CommandOrigin const& ori, CommandOutput& output) const override { - output.setLanguageCode(ori); -#ifdef DEBUG - Logger("CommandOrigin").warn(ori.serialize().toSNBT()); -#endif // DEBUG - LLVersionCommand(output); - } - - static void setup(CommandRegistry* registry) { - registry->registerCommand("version", "Get the version of this server", - CommandPermissionLevel::GameMasters, {(CommandFlagValue)0}, {(CommandFlagValue)0x80}); - registry->registerOverload("version"); - } -}; - -void RegisterCommands() { - Event::RegCmdEvent::subscribe([](Event::RegCmdEvent ev) { // Register commands - LLCommand::setup(ev.mCommandRegistry); - VersionCommand::setup(ev.mCommandRegistry); - if (LL::globalConfig.enableTpdimCommand) { - TeleportDimensionCommand::setup(ev.mCommandRegistry); - } - return true; - }); -} +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include
+//#include
+//#include "../ScriptEngine/Main/Configs.h" +// +//using namespace RegisterCommandHelper; +//using namespace LL; +// +//static_assert(sizeof(CommandSelector) == 200); +// +//class TeleportDimensionCommand : public Command { +// +// enum class DimensionType { +// OverWorld, +// Nether, +// TheEnd, +// } DimensionId; +// CommandSelector Victim; +// CommandPosition CommandPos; +// bool Victim_isSet = false; +// bool CommandPos_isSet = false; +// +// Vec3 getTargetPos(CommandOrigin const& ori, Actor* actor) const { +// if (CommandPos_isSet) +// return CommandPos.getPosition(ori, {0, 0, 0}); +// auto pos = actor->getPosition(); +// Vec3 result = pos; +// int actorDimensionId = actor->getDimensionId(); +// switch (DimensionId) { +// case TeleportDimensionCommand::DimensionType::OverWorld: +// if (actorDimensionId == 1) +// result = {pos.x * 8, pos.y, pos.z * 8}; +// break; +// case TeleportDimensionCommand::DimensionType::Nether: +// if (actorDimensionId != 1) +// result = {pos.x / 8, pos.y, pos.z / 8}; +// break; +// case TeleportDimensionCommand::DimensionType::TheEnd: +// if (actorDimensionId != 2) +// result = {100, 50, 0}; +// break; +// default: +// break; +// } +// return result; +// } +// +// bool teleportTarget(CommandOrigin const& ori, CommandOutput& output, Actor* actor) const { +// auto dim = VanillaDimensions::toString((int)DimensionId); +// auto pos = getTargetPos(ori, actor); +// actor->teleport(pos, (int)DimensionId); +// output.trSuccess("ll.cmd.tpdim.success", actor->getNameTag(), dim, pos.x, pos.y, pos.z); +// return true; +// } +// +// bool teleportTargets(CommandOrigin const& ori, CommandOutput& output, CommandSelectorResults& actors) const { +// auto dim = VanillaDimensions::toString((int)DimensionId); +// std::string names; +// for (auto& actor : actors) { +// std::string actorName = actor->getNameTag(); +// if (actorName.empty()) { +// actorName = actor->getTypeName(); +// } +// names.append(", ").append(actorName); +// if (actor->teleport(getTargetPos(ori, actor), (int)DimensionId)) { +// output.success(); +// } +// } +// if (output.getSuccessCount() == 0) { +// output.trError("ll.cmd.tpdim.error.noActorTeleported"); +// return false; +// } else { +// std::string message = fmt::format("Teleported {} to {}", names.substr(2), dim); +// if (CommandPos_isSet) { +// auto pos = CommandPos.getPosition(ori, {0, 0, 0}); +// message.append(fmt::format(" ({:2f}, {:2f}, {:2f})", pos.x, pos.y, pos.z)); +// } +// output.addMessage(message); +// return true; +// } +// } +// +//public: +// void execute(CommandOrigin const& ori, CommandOutput& output) const override { +// output.setLanguageCode(ori); +// if ((int)DimensionId < 0 || (int)DimensionId > 2) { +// output.trError("ll.cmd.tpdim.invalidDimid", (int)DimensionId); +// return; +// } +// if (Victim_isSet) { +// auto result = Victim.results(ori); +// if (result.empty()) +// output.trError("ll.cmd.tpdim.error.noActorSpecified"); +// else if (result.count() == 1) +// teleportTarget(ori, output, *result.begin()); +// else +// teleportTargets(ori, output, result); +// } else { +// auto actor = ori.getEntity(); +// if (!actor) +// output.trError("ll.cmd.tpdim.error.noActorSpecified"); +// else +// teleportTarget(ori, output, actor); +// } +// } +// +// static void setup(CommandRegistry* registry) { +// registry->registerCommand( +// "tpdim", "Teleport to Dimension", CommandPermissionLevel::GameMasters, +// {(CommandFlagValue)0}, {(CommandFlagValue)0x80}); +// registry->addEnum("DimensionType", +// { +// {"overworld", DimensionType::OverWorld}, +// {"o", DimensionType::OverWorld}, +// {"nether", DimensionType::Nether}, +// {"n", DimensionType::Nether}, +// {"end", DimensionType::TheEnd}, +// {"e", DimensionType::TheEnd}, +// }); +// auto dimensionTypeParam = makeMandatory(&TeleportDimensionCommand::DimensionId, +// "Dimension", "DimensionType"); +// auto dimensionIdParam = makeMandatory((int TeleportDimensionCommand::*)&TeleportDimensionCommand::DimensionId, +// "DimensionId"); +// auto victimParam = makeMandatory(&TeleportDimensionCommand::Victim, "victim", +// &TeleportDimensionCommand::Victim_isSet); +// auto positionParam = makeOptional(&TeleportDimensionCommand::CommandPos, +// "Position", &TeleportDimensionCommand::CommandPos_isSet); +// +// registry->registerOverload( +// "tpdim", victimParam, dimensionTypeParam, positionParam); +// registry->registerOverload( +// "tpdim", victimParam, dimensionIdParam, positionParam); +// // registry->registerOverload( +// // "tpdim", dimensionTypeParam, positionParam); +// registry->registerOverload( +// "tpdim", dimensionIdParam, positionParam); +// } +//}; +// +//void LLListPluginsCommand(CommandOutput& output) { +// auto plugins = LL::getAllPlugins(); +// output.trSuccess("ll.cmd.listPlugin.overview", plugins.size()); +// +// std::ostringstream oss; +// for (auto& [name, plugin] : plugins) { +// string pluginName = name; +// if (pluginName.find("§") == string::npos) +// pluginName = "§b" + pluginName; +// string desc = plugin->desc; +// if (desc.find("§") == string::npos) +// desc = "§7" + desc; +// +// auto fileName = UTF82String(std::filesystem::path(str2wstr(plugin->filePath)).filename().u8string()); +// oss << fmt::format("- {} §a[v{}] §8({})\n {}\n", +// pluginName, plugin->version.toString(), fileName, desc); +// } +// output.success(oss.str() + '\n'); +// output.trAddMessage("ll.cmd.listPlugin.tip"); +//} +// +//void LLPluginInfoCommand(CommandOutput& output, const string& pluginName) { +// auto plugin = LL::getPlugin(pluginName); +// if (plugin) { +// std::map outs; +// std::ostringstream oss; +// auto fn = UTF82String(std::filesystem::path(str2wstr(plugin->filePath)).filename().u8string()); +// string pluginType = plugin->type == Plugin::PluginType::ScriptPlugin ? "Script Plugin" : "DLL Plugin"; +// +// output.trAddMessage("ll.cmd.pluginInfo.title", pluginName); +// +// outs.emplace("Name", fmt::format("{} ({})", plugin->name, fn)); +// outs.emplace("Description", plugin->desc); +// outs.emplace("Version", "v" + plugin->version.toString(true)); +// outs.emplace("Type", pluginType); +// outs.emplace("File Path", plugin->filePath); +// outs.merge(plugin->others); +// size_t width = 10; +// for (auto& [k, _] : outs) +// width = std::max(width, k.length()); +// for (auto& [k, v] : outs) { +// if (k != "PluginType" && k != "PluginFilePath") +// oss << "- §l" << std::setw(width) << std::left << k << "§r: " << v << std::endl; +// } +// auto text = oss.str(); +// text.pop_back(); +// output.success(text, {}); +// } else { +// output.trError("ll.cmd.pluginInfo.error.pluginNotFound", pluginName); +// } +//} +// +//void LLVersionCommand(CommandOutput& output) { +// output.trSuccess("ll.cmd.version.msg", LL::getBdsVersion(), LL::getLoaderVersionString(), LL::getServerProtocolVersion()); +//} +// +//void LLHelpCommand(CommandOutput& output) { +// output.trSuccess("ll.cmd.help.msg"); +//} +// +//void LLLoadPluginCommand(CommandOutput& output, const string& path) { +// // if (!LL::isDebugMode()) +// // return; +// if (PluginManager::loadPlugin(path, true)) { +// output.trSuccess("ll.cmd.loadPlugin.success", path); +// } else { +// output.trError("ll.cmd.loadPlugin.fail", path); +// } +//} +// +//void LLUnloadPluginCommand(CommandOutput& output, const string& pluginName) { +// // if (!LL::isDebugMode()) +// // return; +// if (PluginManager::unloadPlugin(pluginName, true)) { +// output.trSuccess("ll.cmd.unloadPlugin.success", pluginName); +// } else { +// output.trError("ll.cmd.unloadPlugin.fail", pluginName); +// } +//} +// +//void LLReloadPluginCommand(CommandOutput& output, const string& pluginName, bool reloadAll) { +// // if (!LL::isDebugMode()) +// // return; +// if (!reloadAll) { +// if (PluginManager::reloadPlugin(pluginName, true)) { +// output.trSuccess("ll.cmd.reloadPlugin.success", pluginName); +// } else { +// output.trError("ll.cmd.reloadPlugin.fail", pluginName); +// } +// } else { +// int cnt = PluginManager::reloadAllPlugins(true); +// if (cnt > 0) { +// output.trSuccess("ll.cmd.reloadAllPlugins.success", cnt); +// } else { +// output.trError("ll.cmd.reloadAllPlugins.fail"); +// } +// } +//} +// +//class LLCommand : public Command { +// +// enum class Operation { +// Version, +// List, +// Help, +// Load, +// Unload, +// Reload +// }; +// +// Operation operation; +// bool hasUpgradeOption, hasPluginNameSet; +// CommandRawText pluginNameToDoOperation; +// +//public: +// void execute(CommandOrigin const& ori, CommandOutput& output) const override { +// output.setLanguageCode(ori); +// std::string pluginName = ""; +// if (hasPluginNameSet) { +// pluginName = pluginNameToDoOperation; +// if (pluginName.size() > 1 && pluginName[0] == '"' && pluginName[pluginName.size() - 1] == '"' && pluginName[pluginName.size() - 2] != '\\') { +// pluginName.erase(0, 1); +// pluginName.pop_back(); +// } +// } +// switch (operation) { +// case Operation::Version: +// LLVersionCommand(output); +// break; +// case Operation::List: +// if (!hasPluginNameSet) +// LLListPluginsCommand(output); +// else +// LLPluginInfoCommand(output, pluginName); +// break; +// case Operation::Load: +// if (hasPluginNameSet) +// LLLoadPluginCommand(output, pluginName); +// else +// output.trError("ll.cmd.error.noPathSpecified"); +// break; +// case Operation::Unload: +// if (hasPluginNameSet) +// LLUnloadPluginCommand(output, pluginName); +// else +// output.trError("ll.cmd.error.noNameSpecified"); +// break; +// case Operation::Reload: +// if (hasPluginNameSet) +// LLReloadPluginCommand(output, pluginName, false); +// else +// LLReloadPluginCommand(output, "", true); +// break; +// case Operation::Help: +// LLHelpCommand(output); +// break; +// default: +// break; +// } +// } +// +// static void setup(CommandRegistry* registry) { +// // Register Cmd +// registry->registerCommand("ll", "LiteLoaderBDS plugin operations", +// CommandPermissionLevel::Console, {(CommandFlagValue)0}, {(CommandFlagValue)0x80}); +// +// // Register softenum +// vector pluginList; +// for (auto& [name, p] : LL::getAllPlugins()) { +// pluginList.push_back(name); +// } +// registry->addSoftEnum("PluginName", pluginList); +// +// // ll version & help +// registry->addEnum("Operation_Common", {{"version", Operation::Version}, +// {"help", Operation::Help}}); +// registry->registerOverload( +// "ll", +// makeMandatory(&LLCommand::operation, "Operation", "Operation_Common").addOptions((CommandParameterOption)1)); +// +// // ll load +// registry->addEnum("Operation_FreeFilePath", { +// {"load", Operation::Load}, +// }); +// registry->registerOverload( +// "ll", +// makeMandatory(&LLCommand::operation, "Operation", "Operation_FreeFilePath").addOptions((CommandParameterOption)1), +// makeMandatory(&LLCommand::pluginNameToDoOperation, "pluginPath", nullptr, &LLCommand::hasPluginNameSet)); +// +// // ll unload +// registry->addEnum("Operation_MustPluginName", { +// {"unload", Operation::Unload}, +// }); +// registry->registerOverload( +// "ll", +// makeMandatory(&LLCommand::operation, "Operation", "Operation_MustPluginName").addOptions((CommandParameterOption)1), +// makeMandatory((std::string LLCommand::*)&LLCommand::pluginNameToDoOperation, "pluginName", "PluginName", &LLCommand::hasPluginNameSet)); +// +// // ll list & reload +// registry->addEnum("Operation_OptionalPluginName", { +// {"list", Operation::List}, +// {"plugins", Operation::List}, +// {"reload", Operation::Reload}, +// }); +// registry->registerOverload( +// "ll", +// makeMandatory(&LLCommand::operation, "Operation", "Operation_OptionalPluginName").addOptions((CommandParameterOption)1), +// makeOptional((std::string LLCommand::*)&LLCommand::pluginNameToDoOperation, "pluginName", "PluginName", &LLCommand::hasPluginNameSet)); +// } +//}; +// +//class VersionCommand : public Command { +// +//public: +// void execute(CommandOrigin const& ori, CommandOutput& output) const override { +// output.setLanguageCode(ori); +//#ifdef DEBUG +// Logger("CommandOrigin").warn(ori.serialize().toSNBT()); +//#endif // DEBUG +// LLVersionCommand(output); +// } +// +// static void setup(CommandRegistry* registry) { +// registry->registerCommand("version", "Get the version of this server", +// CommandPermissionLevel::GameMasters, {(CommandFlagValue)0}, {(CommandFlagValue)0x80}); +// registry->registerOverload("version"); +// } +//}; +// +//void RegisterCommands() { +// Event::RegCmdEvent::subscribe([](Event::RegCmdEvent ev) { // Register commands +// LLCommand::setup(ev.mCommandRegistry); +// VersionCommand::setup(ev.mCommandRegistry); +// if (LL::globalConfig.enableTpdimCommand) { +// TeleportDimensionCommand::setup(ev.mCommandRegistry); +// } +// return true; +// }); +//} diff --git a/LiteLoader/Main/BuiltinUnlockCmd.cpp b/LiteLoader/Main/BuiltinUnlockCmd.cpp index 5c9898a..7fc6e45 100644 --- a/LiteLoader/Main/BuiltinUnlockCmd.cpp +++ b/LiteLoader/Main/BuiltinUnlockCmd.cpp @@ -1,102 +1,102 @@ -#include "Global.h" -#include
-#include -#include -/////////////////// Built in UnlockCmd /////////////////// - -bool isUnlockCmdEnabled = true; - -// ==> LiteLoader/Main/SimpleServerLogger.cpp -void LogCommandRegistration(std::string const& name, char const* description, enum CommandPermissionLevel perm, short flag1, short flag2); - -TInstanceHook(void, "?registerCommand@CommandRegistry@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PEBDW4CommandPermissionLevel@@UCommandFlag@@3@Z", - CommandRegistry, std::string const& name, char const* description, enum CommandPermissionLevel perm, short flag1, short flag2) { - // For #643 - if (name.find(' ') == std::string::npos) { // If no space inside - // Check whether command is already exists before registering - if (this->findCommand(name)) { - // throw to prevent setup function, then this exception can be caught by event handler - throw std::runtime_error("There is already a command named " + name); - } - } - if (LL::globalConfig.enableUnlockCmd) { - flag1 |= 0x80; - } - if (LL::globalConfig.debugMode) { - LogCommandRegistration(name, description, perm, flag1, flag2); - } - return original(this, name, description, perm, flag1, flag2); -} - -class CommandSelectorBase; -class CommandOrigin; -TClasslessInstanceHook(bool, "?isExpansionAllowed@CommandSelectorBase@@AEBA_NAEBVCommandOrigin@@@Z", - CommandOrigin* a2) { - if (LL::globalConfig.enableUnlockCmd) { - original(this, a2); - return true; - } - return original(this, a2); -} - -//#include -//#include -//#include +//#include "Global.h" +//#include
//#include -// inline void tryChangeStringToRawText(CommandParameterData& data) -//{ -// if (false /* config.xxxx*/ && data.tid.value == type_id().value) -// { -// data.tid = type_id(); -// data.parser = CommandRegistry::getParseFn(); +//#include +///////////////////// Built in UnlockCmd /////////////////// +// +//bool isUnlockCmdEnabled = true; +// +//// ==> LiteLoader/Main/SimpleServerLogger.cpp +//void LogCommandRegistration(std::string const& name, char const* description, enum CommandPermissionLevel perm, short flag1, short flag2); +// +//TInstanceHook(void, "?registerCommand@CommandRegistry@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PEBDW4CommandPermissionLevel@@UCommandFlag@@3@Z", +// CommandRegistry, std::string const& name, char const* description, enum CommandPermissionLevel perm, short flag1, short flag2) { +// // For #643 +// if (name.find(' ') == std::string::npos) { // If no space inside +// // Check whether command is already exists before registering +// if (this->findCommand(name)) { +// // throw to prevent setup function, then this exception can be caught by event handler +// throw std::runtime_error("There is already a command named " + name); +// } // } +// if (LL::globalConfig.enableUnlockCmd) { +// flag1 |= 0x80; +// } +// if (LL::globalConfig.debugMode) { +// LogCommandRegistration(name, description, perm, flag1, flag2); +// } +// return original(this, name, description, perm, flag1, flag2); //} -//// allowlist -// TInstanceHook(CommandRegistry::Overload*, "??$_registerOverload@VAllowListCommand@@VCommandParameterData@@V2@@CommandRegistry@@AEAAPEAUOverload@0@PEBDVCommandVersion@@AEBVCommandParameterData@@2@Z", -// CommandRegistry, char const* unk, class CommandVersion version, class CommandParameterData const& operationParam, class CommandParameterData& nameParam) -//{ -// tryChangeStringToRawText(nameParam); -// return original(this, unk, version, operationParam, nameParam); -// } -//// op -// TInstanceHook(CommandRegistry::Overload*, "??$_registerOverload@VOpCommand@@VCommandParameterData@@@CommandRegistry@@AEAAPEAUOverload@0@PEBDVCommandVersion@@AEBVCommandParameterData@@@Z", -// CommandRegistry, char const* unk, class CommandVersion version, class CommandParameterData& nameParam) -//{ -// tryChangeStringToRawText(nameParam); -// return original(this, unk, version, nameParam); -// } -//// deop -// TInstanceHook(CommandRegistry::Overload*, "??$_registerOverload@VDeOpCommand@@VCommandParameterData@@@CommandRegistry@@AEAAPEAUOverload@0@PEBDVCommandVersion@@AEBVCommandParameterData@@@Z", -// CommandRegistry, char const* unk, class CommandVersion version, class CommandParameterData& nameParam) -//{ -// tryChangeStringToRawText(nameParam); -// return original(this, unk, version, nameParam); -// } -// bool unlockNewExecute = true; -// TClasslessInstanceHook(bool, "?isEnabled@FeatureToggles@@QEBA_NW4FeatureOptionID@@@Z", -// int feature) -// { -// if (feature == 54 && unlockNewExecute) -// return true; -// return original(this, feature); -// } -// TClasslessInstanceHook(void, "?addSemanticConstraint@CommandRegistry@@AEAAXW4SemanticConstraint@@@Z", -// enum SemanticConstraint) -//{ -// return; -// } -TClasslessInstanceHook(void, "?addEnumValueConstraints@CommandRegistry@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@3@W4SemanticConstraint@@@Z", - std::string const& enumName, std::vector const& enumValues, SemanticConstraint constraint) { - if (!LL::globalConfig.enableUnlockCmd) - return original(this, enumName, enumValues, constraint); - if (constraint & SemanticConstraint::RequiresCheatsEnabled) { - constraint = (SemanticConstraint)(constraint & (~SemanticConstraint::RequiresCheatsEnabled)); - constraint = (SemanticConstraint)(constraint | SemanticConstraint::RequiresElevatedPermissions); - } - // if (constraint & SemanticConstraint::RequiresHostPermissions) - //{ - // constraint = (SemanticConstraint)(constraint & (~SemanticConstraint::RequiresHostPermissions)); - // constraint = (SemanticConstraint)(constraint | SemanticConstraint::RequiresElevatedPermissions); - // } - return original(this, enumName, enumValues, constraint); -} \ No newline at end of file +// +//class CommandSelectorBase; +//class CommandOrigin; +//TClasslessInstanceHook(bool, "?isExpansionAllowed@CommandSelectorBase@@AEBA_NAEBVCommandOrigin@@@Z", +// CommandOrigin* a2) { +// if (LL::globalConfig.enableUnlockCmd) { +// original(this, a2); +// return true; +// } +// return original(this, a2); +//} +// +////#include +////#include +////#include +////#include +//// inline void tryChangeStringToRawText(CommandParameterData& data) +////{ +//// if (false /* config.xxxx*/ && data.tid.value == type_id().value) +//// { +//// data.tid = type_id(); +//// data.parser = CommandRegistry::getParseFn(); +//// } +////} +////// allowlist +//// TInstanceHook(CommandRegistry::Overload*, "??$_registerOverload@VAllowListCommand@@VCommandParameterData@@V2@@CommandRegistry@@AEAAPEAUOverload@0@PEBDVCommandVersion@@AEBVCommandParameterData@@2@Z", +//// CommandRegistry, char const* unk, class CommandVersion version, class CommandParameterData const& operationParam, class CommandParameterData& nameParam) +////{ +//// tryChangeStringToRawText(nameParam); +//// return original(this, unk, version, operationParam, nameParam); +//// } +////// op +//// TInstanceHook(CommandRegistry::Overload*, "??$_registerOverload@VOpCommand@@VCommandParameterData@@@CommandRegistry@@AEAAPEAUOverload@0@PEBDVCommandVersion@@AEBVCommandParameterData@@@Z", +//// CommandRegistry, char const* unk, class CommandVersion version, class CommandParameterData& nameParam) +////{ +//// tryChangeStringToRawText(nameParam); +//// return original(this, unk, version, nameParam); +//// } +////// deop +//// TInstanceHook(CommandRegistry::Overload*, "??$_registerOverload@VDeOpCommand@@VCommandParameterData@@@CommandRegistry@@AEAAPEAUOverload@0@PEBDVCommandVersion@@AEBVCommandParameterData@@@Z", +//// CommandRegistry, char const* unk, class CommandVersion version, class CommandParameterData& nameParam) +////{ +//// tryChangeStringToRawText(nameParam); +//// return original(this, unk, version, nameParam); +//// } +//// bool unlockNewExecute = true; +//// TClasslessInstanceHook(bool, "?isEnabled@FeatureToggles@@QEBA_NW4FeatureOptionID@@@Z", +//// int feature) +//// { +//// if (feature == 54 && unlockNewExecute) +//// return true; +//// return original(this, feature); +//// } +//// TClasslessInstanceHook(void, "?addSemanticConstraint@CommandRegistry@@AEAAXW4SemanticConstraint@@@Z", +//// enum SemanticConstraint) +////{ +//// return; +//// } +//TClasslessInstanceHook(void, "?addEnumValueConstraints@CommandRegistry@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@3@W4SemanticConstraint@@@Z", +// std::string const& enumName, std::vector const& enumValues, SemanticConstraint constraint) { +// if (!LL::globalConfig.enableUnlockCmd) +// return original(this, enumName, enumValues, constraint); +// if (constraint & SemanticConstraint::RequiresCheatsEnabled) { +// constraint = (SemanticConstraint)(constraint & (~SemanticConstraint::RequiresCheatsEnabled)); +// constraint = (SemanticConstraint)(constraint | SemanticConstraint::RequiresElevatedPermissions); +// } +// // if (constraint & SemanticConstraint::RequiresHostPermissions) +// //{ +// // constraint = (SemanticConstraint)(constraint & (~SemanticConstraint::RequiresHostPermissions)); +// // constraint = (SemanticConstraint)(constraint | SemanticConstraint::RequiresElevatedPermissions); +// // } +// return original(this, enumName, enumValues, constraint); +//} \ No newline at end of file diff --git a/LiteLoader/Main/LiteLoader.cpp b/LiteLoader/Main/LiteLoader.cpp index f426332..c69102c 100644 --- a/LiteLoader/Main/LiteLoader.cpp +++ b/LiteLoader/Main/LiteLoader.cpp @@ -196,34 +196,34 @@ void CheckProtocolVersion() { } } -BOOL WINAPI ConsoleExitHandler(DWORD CEvent) { - switch (CEvent) { - case CTRL_C_EVENT: - case CTRL_CLOSE_EVENT: - case CTRL_SHUTDOWN_EVENT: { - if (Global) { - Global->requestServerShutdown(); - } else { - std::terminate(); - } - return TRUE; - } - } - return FALSE; -} +//BOOL WINAPI ConsoleExitHandler(DWORD CEvent) { +// switch (CEvent) { +// case CTRL_C_EVENT: +// case CTRL_CLOSE_EVENT: +// case CTRL_SHUTDOWN_EVENT: { +// if (Global) { +// Global->requestServerShutdown(); +// } else { +// std::terminate(); +// } +// return TRUE; +// } +// } +// return FALSE; +//} -void UnixSignalHandler(int signum) { - switch (signum) { - case SIGINT: - case SIGTERM: { - if (Global) { - Global->requestServerShutdown(); - } else { - std::terminate(); - } - } - } -} +//void UnixSignalHandler(int signum) { +// switch (signum) { +// case SIGINT: +// case SIGTERM: { +// if (Global) { +// Global->requestServerShutdown(); +// } else { +// std::terminate(); +// } +// } +// } +//} // extern extern void EndScheduleSystem(); @@ -294,9 +294,9 @@ void LLMain() { SetWindowText(hwnd, s.c_str()); // Register Exit Event Handler. - SetConsoleCtrlHandler(ConsoleExitHandler, TRUE); - signal(SIGTERM, UnixSignalHandler); - signal(SIGINT, UnixSignalHandler); +// SetConsoleCtrlHandler(ConsoleExitHandler, TRUE); +// signal(SIGTERM, UnixSignalHandler); +// signal(SIGINT, UnixSignalHandler); // Welcome Welcome(); @@ -305,15 +305,15 @@ void LLMain() { CheckDevMode(); // Addon Helper - if (LL::globalConfig.enableAddonsHelper) { - InitAddonsHelper(); - } +// if (LL::globalConfig.enableAddonsHelper) { +// InitAddonsHelper(); +// } // Load plugins LL::LoadMain(); // Register built-in commands - RegisterCommands(); + //RegisterCommands(); // Register simple server logger RegisterSimpleServerLogger(); diff --git a/LiteLoader/Main/Loader.cpp b/LiteLoader/Main/Loader.cpp index 5c8a3ce..1092d89 100644 --- a/LiteLoader/Main/Loader.cpp +++ b/LiteLoader/Main/Loader.cpp @@ -184,7 +184,7 @@ void LoadParticleAPI() { auto lib = LoadLibrary(str2wstr(path).c_str()); if (lib) { logger.info(tr("ll.loader.loadParticleAPI.success")); - ParticleCUI::init(lib); + //ParticleCUI::init(lib); } else { logger.error("Fail to load ParticleAPI!"); logger.error("Error: Code[{}] - {}", GetLastError(), GetLastErrorMessage()); diff --git a/LiteLoader/Main/ModifyInfomation.cpp b/LiteLoader/Main/ModifyInfomation.cpp index 8939885..88a8883 100644 --- a/LiteLoader/Main/ModifyInfomation.cpp +++ b/LiteLoader/Main/ModifyInfomation.cpp @@ -79,50 +79,50 @@ THook(void, "?log@BedrockLog@@YAXW4LogCategory@1@V?$bitset@$02@std@@W4LogRule@1@ return BedrockLog::log_va(a1, a2, a3, a4, a5, a6, a7, a8, va); } -#include -#include -#include -extern std::unordered_map resultOfOrigin; -TClasslessInstanceHook(void*, "?send@CommandOutputSender@@UEAAXAEBVCommandOrigin@@AEBVCommandOutput@@@Z", - class CommandOrigin const& origin, class CommandOutput const& output) { - std::stringbuf tmpBuf; - auto oldBuf = std::cout.rdbuf(); - std::cout.rdbuf(&tmpBuf); - auto rv = original(this, origin, output); - std::cout.rdbuf(oldBuf); - if (LL::isDebugMode() && LL::globalConfig.tickThreadId != std::this_thread::get_id()) { - logger.warn("The thread executing the CommandOutputSender::send is not the \"MC_SERVER\" thread"); - logger.warn("Output: {}", tmpBuf.str()); - } - - auto it = resultOfOrigin.find(&origin); - if (it != resultOfOrigin.end()) { - try { - // May crash for incomprehensible reasons - it->second->assign(tmpBuf.str()); - while (it->second->size() && (it->second->back() == '\n' || it->second->back() == '\r')) - it->second->pop_back(); - it->second = nullptr; - resultOfOrigin.erase(it); - return rv; - } catch (...) { - if (LL::isDebugMode()) { - logger.warn("Output: {}", tmpBuf.str()); - logger.warn("size of resultOfOrigin: {}", resultOfOrigin.size()); - } -#ifdef DEBUG - __debugbreak(); -#endif // DEBUG - } - } - auto& log = output.getSuccessCount() > 0 ? serverLogger.info : serverLogger.error; - std::istringstream iss(tmpBuf.str()); - string line; - while (getline(iss, line)) { - if (LL::globalConfig.colorLog) - log << ColorFormat::convertToConsole(line, false) << Logger::endl; - else - log << ColorFormat::removeColorCode(line) << Logger::endl; - } - return rv; -} +//#include +//#include +//#include +//extern std::unordered_map resultOfOrigin; +//TClasslessInstanceHook(void*, "?send@CommandOutputSender@@UEAAXAEBVCommandOrigin@@AEBVCommandOutput@@@Z", +// class CommandOrigin const& origin, class CommandOutput const& output) { +// std::stringbuf tmpBuf; +// auto oldBuf = std::cout.rdbuf(); +// std::cout.rdbuf(&tmpBuf); +// auto rv = original(this, origin, output); +// std::cout.rdbuf(oldBuf); +// if (LL::isDebugMode() && LL::globalConfig.tickThreadId != std::this_thread::get_id()) { +// logger.warn("The thread executing the CommandOutputSender::send is not the \"MC_SERVER\" thread"); +// logger.warn("Output: {}", tmpBuf.str()); +// } +// +// auto it = resultOfOrigin.find(&origin); +// if (it != resultOfOrigin.end()) { +// try { +// // May crash for incomprehensible reasons +// it->second->assign(tmpBuf.str()); +// while (it->second->size() && (it->second->back() == '\n' || it->second->back() == '\r')) +// it->second->pop_back(); +// it->second = nullptr; +// resultOfOrigin.erase(it); +// return rv; +// } catch (...) { +// if (LL::isDebugMode()) { +// logger.warn("Output: {}", tmpBuf.str()); +// logger.warn("size of resultOfOrigin: {}", resultOfOrigin.size()); +// } +//#ifdef DEBUG +// __debugbreak(); +//#endif // DEBUG +// } +// } +// auto& log = output.getSuccessCount() > 0 ? serverLogger.info : serverLogger.error; +// std::istringstream iss(tmpBuf.str()); +// string line; +// while (getline(iss, line)) { +// if (LL::globalConfig.colorLog) +// log << ColorFormat::convertToConsole(line, false) << Logger::endl; +// else +// log << ColorFormat::removeColorCode(line) << Logger::endl; +// } +// return rv; +//} diff --git a/LiteLoader/Main/ModifyPack.cpp b/LiteLoader/Main/ModifyPack.cpp index a42decd..5bef44e 100644 --- a/LiteLoader/Main/ModifyPack.cpp +++ b/LiteLoader/Main/ModifyPack.cpp @@ -1,49 +1,48 @@ -#include -#include -#include "LiteLoader.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace ModifyPack { - vector PackListCache; -} - -THook(ResourcePack*, "??0ResourcePack@@QEAA@AEAVPack@@@Z", - ResourcePack* self, Pack* a2) { - auto Pack = original(self, a2); - auto manifest = &Pack->getManifest(); - if (manifest && manifest->getPackOrigin() == PackOrigin::PackOrigin_Dev) { - ModifyPack::PackListCache.push_back(a2->getManifest().getIdentity()); - } - return Pack; -} - -THook(std::unique_ptr, "?deserialize@ResourcePackStack@@SA?AV?$unique_ptr@VResourcePackStack@@U?$default_delete@VResourcePackStack@@@std@@@std@@AEAV?$basic_istream@DU?$char_traits@D@std@@@3@AEBVIResourcePackRepository@@@Z", - __int64 a2, ResourcePackRepository* a3) { - auto Stack = original( a2, a3); - for (auto& id : ModifyPack::PackListCache) { - auto Pack = a3->getResourcePackForPackId(id); - auto& SettingsFactory = a3->getPackSettingsFactory(); - auto settings = SettingsFactory.getPackSettings(Pack->getManifest()); - char gsl[16]; - auto gslPath = SymCall("??$?0PEAVResourcePack@@X@?$not_null@V?$NonOwnerPointer@VResourcePack@@@Bedrock@@@gsl@@QEAA@AEBV?$not_null@PEAVResourcePack@@@1@@Z", - void*, char*, ResourcePack**)(gsl, &Pack); - char size[480]; - auto Instance = SymCall("??0PackInstance@@QEAA@V?$not_null@V?$NonOwnerPointer@VResourcePack@@@Bedrock@@@gsl@@H_NPEAVPackSettings@@@Z", - PackInstance*, char*, void*, int, bool, PackSettings*)(size, gslPath, 0, false, settings); - Stack->add(*Instance, *(IResourcePackRepository*)a3, 0); - } - ModifyPack::PackListCache.clear(); - return Stack; -} \ No newline at end of file +//#include +//#include +//#include "LiteLoader.h" +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +// +//namespace ModifyPack { +// vector PackListCache; +//} +// +//THook(ResourcePack*, "??0ResourcePack@@QEAA@AEAVPack@@@Z", +// ResourcePack* self, Pack* a2) { +// auto Pack = original(self, a2); +// auto manifest = &Pack->getManifest(); +// if (manifest && manifest->getPackOrigin() == PackOrigin::PackOrigin_Dev) { +// ModifyPack::PackListCache.push_back(a2->getManifest().getIdentity()); +// } +// return Pack; +//} +// +//THook(std::unique_ptr, "?deserialize@ResourcePackStack@@SA?AV?$unique_ptr@VResourcePackStack@@U?$default_delete@VResourcePackStack@@@std@@@std@@AEAV?$basic_istream@DU?$char_traits@D@std@@@3@AEBVIResourcePackRepository@@@Z", +// __int64 a2, ResourcePackRepository* a3) { +// auto Stack = original( a2, a3); +// for (auto& id : ModifyPack::PackListCache) { +// auto Pack = a3->getResourcePackForPackId(id); +// auto& SettingsFactory = a3->getPackSettingsFactory(); +// auto settings = SettingsFactory.getPackSettings(Pack->getManifest()); +// char gsl[16]; +// auto gslPath = SymCall("??$?0PEAVResourcePack@@X@?$not_null@V?$NonOwnerPointer@VResourcePack@@@Bedrock@@@gsl@@QEAA@AEBV?$not_null@PEAVResourcePack@@@1@@Z", +// void*, char*, ResourcePack**)(gsl, &Pack); +// char size[480]; +// auto Instance = SymCall("??0PackInstance@@QEAA@V?$not_null@V?$NonOwnerPointer@VResourcePack@@@Bedrock@@@gsl@@H_NPEAVPackSettings@@@Z", +// PackInstance*, char*, void*, int, bool, PackSettings*)(size, gslPath, 0, false, settings); +// Stack->add(*Instance, *(IResourcePackRepository*)a3, 0); +// } +// ModifyPack::PackListCache.clear(); +// return Stack; +//} \ No newline at end of file