// This Header is auto generated by BDSLiteLoader Toolchain #pragma once #define AUTO_GENERATED #include "../Global.h" #define BEFORE_EXTRA // Include Headers or Declare Types Here enum CommandPermissionLevel : char; enum class CommandFlagValue : unsigned short; enum SemanticConstraint : unsigned char; class CommandParameterData; #include "CommandFlag.hpp" #include //#include "typeid_t.hpp" //#include "Command.hpp" #include "CommandPosition.hpp" #include "CommandPositionFloat.hpp" #include "CommandMessage.hpp" #include "CommandSelector.hpp" #include "CommandOrigin.hpp" #include "CommandVersion.hpp" #include "CommandRawText.hpp" #include "CommandItem.hpp" #include "CommandIntegerRange.hpp" #include "ActorDamageSource.hpp" #include "ActorDefinitionIdentifier.hpp" #pragma region typeid template class typeid_t { public: inline static unsigned short count = 0; unsigned short value; typeid_t(typeid_t const& id) : value(id.value){}; typeid_t(unsigned short value) : value(value){}; }; template <> class typeid_t { public: MCAPI static unsigned short count; unsigned short value; typeid_t(typeid_t const& id) : value(id.value){}; typeid_t(unsigned short value) : value(value){}; }; template typeid_t type_id() { static typeid_t id = typeid_t::count++; return id; } template MCAPI typeid_t type_id(); template MCAPI typeid_t type_id>(); // template MCAPI typeid_t type_id(); // template MCAPI typeid_t type_id(); template MCAPI typeid_t type_id(); template MCAPI typeid_t type_id(); template MCAPI typeid_t type_id(); template MCAPI typeid_t type_id(); template MCAPI typeid_t type_id(); template MCAPI typeid_t type_id>(); template MCAPI typeid_t type_id>(); template MCAPI typeid_t type_id(); template MCAPI typeid_t type_id(); template MCAPI typeid_t type_id(); template MCAPI typeid_t type_id(); template MCAPI typeid_t type_id(); template MCAPI typeid_t type_id(); template MCAPI typeid_t type_id(); template MCAPI typeid_t type_id(); template MCAPI typeid_t type_id>(); template MCAPI typeid_t type_id>(); // template MCAPI typeid_t type_id(); template MCAPI typeid_t type_id(); // template MCAPI typeid_t type_id(); template <> inline typeid_t type_id() { static typeid_t id = *(typeid_t*)dlsym_real("?id@?1???$type_id@VCommandRegistry@@PEBUActorDefinitionIdentifier@@@@YA?AV?$typeid_t@VCommandRegistry@@@@XZ@4V1@A"); // static typeid_t id = ([]() -> typeid_t { // CommandParameterData data = SymCall("??$mandatory@VRideCommand@@PEBUActorDefinitionIdentifier@@@commands@@YA?AVCommandParameterData@@PEQRideCommand@@PEBUActorDefinitionIdentifier@@PEBDPEQ2@_N@Z", // CommandParameterData, void*, char const*, uintptr_t)(nullptr, "entityType", 0); // return data.tid; // })(); return id; }; template <> inline typeid_t type_id() { static typeid_t id = *(typeid_t*)dlsym_real("?id@?1???$type_id@VCommandRegistry@@VCommandItem@@@@YA?AV?$typeid_t@VCommandRegistry@@@@XZ@4V1@A"); return id; }; template <> inline typeid_t type_id() { static typeid_t id = *(typeid_t*)dlsym_real("?id@?1???$type_id@VCommandRegistry@@_N@@YA?AV?$typeid_t@VCommandRegistry@@@@XZ@4V1@A"); return id; }; template <> inline typeid_t type_id() { static typeid_t id = *(typeid_t*)dlsym_real("?id@?1???$type_id@VCommandRegistry@@PEBVBlock@@@@YA?AV?$typeid_t@VCommandRegistry@@@@XZ@4V1@A"); return id; }; #pragma endregion #undef BEFORE_EXTRA class CommandRegistry { #define AFTER_EXTRA public: struct ParseTable; class Symbol { public: unsigned val; MCAPI Symbol(unsigned __int64 = -1); MCAPI Symbol(class Symbol const&); MCAPI unsigned __int64 toIndex() const; MCAPI int value() const; inline bool operator==(Symbol const& right) const { return val == right.val; } inline std::string toString() const { return Global->symbolToString(*this); } inline std::string toDebugString() const { return fmt::format("", toString(), val); } }; struct ParseToken { std::unique_ptr child; std::unique_ptr next; CommandRegistry::ParseToken* parent; const char* text; // 24 uint32_t length; // 32 Symbol type; // 36 MCAPI std::string toString() const; //{ // if (text) // return std::string(text, length); // auto v6 = child.get(); // auto v8 = child.get(); // while (v8->child) // { // v8 = v8->child.get(); // } // while (v6->child || v6->next) // { // v6 = v6->next ? v6->next.get() : v6->child.get(); // } // auto v10 = v6->text + v6->length; // auto v11 = v8->text; // return std::string(v11, v10 - v11); //}; inline std::string toDebugString() const { return fmt::format("", toString()); } }; static_assert(sizeof(ParseToken) == 40); using ParseFn = bool (CommandRegistry::*)( void*, ParseToken const&, CommandOrigin const&, int, std::string&, std::vector&) const; struct Overload { using FactoryFn = std::unique_ptr (*)(); CommandVersion version; // 0 FactoryFn factory; // 8 std::vector params; // 16 int versionOffset; // 40 LIAPI Overload(CommandVersion version, FactoryFn factory, std::vector&& args); LIAPI ~Overload(); inline std::string toDebugString() { return fmt::format(""); } }; struct Signature { std::string name; // 0 std::string desc; // 32 std::vector overloads; // 64 CommandPermissionLevel perm; // 88 Symbol main_symbol; // 92 Symbol alt_symbol; // 96 CommandFlag flag; // 100 int unk72; int unk76; int unk80; bool b84; inline Signature(std::string_view name, std::string_view desc, CommandPermissionLevel perm, Symbol symbol, CommandFlag flag) : name(name), desc(desc), perm(perm), main_symbol(symbol), flag(flag) { } inline std::string toDebugString() const { return fmt::format("", name); } }; struct SoftEnum { std::string name; // 0 std::vector list; // 32 }; struct Enum { std::string name; // 0 typeid_t type; // 32 ParseFn parse; // 40 std::vector> values; // 48 inline std::string toDebugString() const { return fmt::format("", name); } }; LIAPI static std::vector getEnumNames(); LIAPI static std::vector getSoftEnumNames(); LIAPI static std::vector getEnumValues(std::string const& name); LIAPI static std::vector getSoftEnumValues(std::string const& name); LIAPI static std::string getCommandFullName(std::string const& name); // Experiment LIAPI bool unregisterCommand(std::string const& name); template struct DefaultIdConverter { template static Target convert(Source source) { return (Target)source; } uint64_t operator()(Type value) const { return convert(value); } Type operator()(uint64_t value) const { return convert(value); } }; #ifdef COMMAND_REGISTRY_EXTRA inline static std::string toString(std::vector const& syms) { std::ostringstream oss; bool first = true; for (auto& sym : syms) { if (!first) oss << ", "; oss << sym.toString(); first = false; } return oss.str(); } struct ParseRule { Symbol sym; std::function func; std::vector syms; CommandVersion version; inline std::string toDebugString() const { return fmt::format("", sym.toDebugString(), toString(syms)); } }; struct ParseTable { std::map> first; std::map> follow; std::map, int> predict; inline std::string toDebugString() const { std::ostringstream oss; bool f = true; for (auto& [k, v] : first) { if (!f) oss << ", "; oss << k.toString() << ":[" << toString(v) << "]"; f = false; } oss << "\n"; for (auto& [k, v] : follow) { if (!f) oss << ", "; oss << k.toString() << ":[" << toString(v) << "]"; f = false; } return fmt::format("[{}]", oss.str()); } }; struct OptionalParameterChain { int parameterCount; int followingRuleIndex; Symbol paramSymbol; inline std::string toDebugString() const { return fmt::format("", parameterCount, followingRuleIndex, paramSymbol.toDebugString()); } }; struct Factorization { Symbol sym; inline std::string toDebugString() const { return fmt::format("", sym.toDebugString()); } }; struct RegistryState { int signatureCount; int enumValueCount; int postfixCount; int enumCount; int factorizationCount; int optionalCount; int ruleCount; int softEnumCount; int constraintCount; std::vector constrainedValueCount; std::vector softEnumValuesCount; }; struct ConstrainedValue { Symbol mValue; Symbol mEnum; std::vector mConstraints; inline std::string toDebugString() const { std::ostringstream oss; bool first = true; for (auto& i : mConstraints) { if (!first) oss << ", "; oss << (int)i; first = false; } return fmt::format("", mValue.toDebugString(), mEnum.toDebugString(), oss.str()); } }; using CommandOverrideFunctor = std::function, class std::allocator> const&)>; using ParamSymbols = std::array; std::function mGetScoreForObjective; // 0 std::function mNetworkUpdateCallback; // 64 std::vector mRules; // 128 // map std::map mParseTableMap; // 152 std::vector mOptionals; // 168 std::vector mEnumValues; // 192 std::vector mEnums; // 216 std::vector mFactorizations; // 240 std::vector mPostfixes; // 264 std::map mEnumLookup; // 288 std::map mEnumValueLookup; // 304 std::vector mCommandSymbols; // 320 std::map mSignatures; // 344 std::map, int> mTypeLookup; // 360 std::map unk376; // 376 std::map mAliases; // 392 std::vector mSemanticConstraints; // 408 std::map mSemanticConstraintLookup; // 432 std::vector mConstrainedValues; // 448 std::map, unsigned int> mConstrainedValueLookup; // 472 std::vector mSoftEnums; // 488 std::map mSoftEnumLookup; // 512 std::vector mStateStack; // 528 ParamSymbols mArgs; // 552 CommandOverrideFunctor mCommandOverrideFunctor; // 640 // 704 inline void printAll() const; inline void printSize() const; void test() { auto mParseTableMapCopy = mParseTableMap; auto mEnumLookupCopy = mEnumLookup; auto mEnumValueLookupCopy = mEnumValueLookup; auto mSignaturesCopy = mSignatures; auto mTypeLookupCopy = mTypeLookup; auto unk376Copy = unk376; auto mAliasesCopy = mAliases; auto mSemanticConstraintLookupCopy = mSemanticConstraintLookup; auto mConstrainedValueLookupCopy = mConstrainedValueLookup; auto mSoftEnumLookupCopy = mSoftEnumLookup; constexpr auto size = sizeof(CommandRegistry); static_assert(sizeof(Enum) == 72); static_assert(sizeof(ParseTable) == 48); static_assert(sizeof(ParseRule) == 104); static_assert(sizeof(CommandRegistry) == 0x2c0); static_assert(offsetof(CommandRegistry, mGetScoreForObjective) == 0); static_assert(offsetof(CommandRegistry, mNetworkUpdateCallback) == 64); static_assert(offsetof(CommandRegistry, mRules) == 128); static_assert(offsetof(CommandRegistry, mParseTableMap) == 152); static_assert(offsetof(CommandRegistry, mOptionals) == 168); static_assert(offsetof(CommandRegistry, mEnumValues) == 192); static_assert(offsetof(CommandRegistry, mEnums) == 216); static_assert(offsetof(CommandRegistry, mFactorizations) == 240); static_assert(offsetof(CommandRegistry, mPostfixes) == 264); static_assert(offsetof(CommandRegistry, mEnumLookup) == 288); static_assert(offsetof(CommandRegistry, mEnumValueLookup) == 304); static_assert(offsetof(CommandRegistry, mCommandSymbols) == 320); static_assert(offsetof(CommandRegistry, mSignatures) == 344); static_assert(offsetof(CommandRegistry, mTypeLookup) == 360); static_assert(offsetof(CommandRegistry, unk376) == 376); static_assert(offsetof(CommandRegistry, mAliases) == 392); static_assert(offsetof(CommandRegistry, mSemanticConstraints) == 408); static_assert(offsetof(CommandRegistry, mSemanticConstraintLookup) == 432); static_assert(offsetof(CommandRegistry, mConstrainedValues) == 448); static_assert(offsetof(CommandRegistry, mConstrainedValueLookup) == 472); static_assert(offsetof(CommandRegistry, mSoftEnums) == 488); static_assert(offsetof(CommandRegistry, mSoftEnumLookup) == 512); static_assert(offsetof(CommandRegistry, mStateStack) == 528); static_assert(offsetof(CommandRegistry, mArgs) == 552); static_assert(offsetof(CommandRegistry, mCommandOverrideFunctor) == 640); } #endif COMMAND_REGISTRY_EXTRA template inline static std::unique_ptr allocateCommand() { return std::make_unique(); } inline void registerOverload( std::string const& name, Overload::FactoryFn factory, std::vector&& args) { Signature* signature = const_cast(findCommand(name)); auto& overload = signature->overloads.emplace_back(CommandVersion{}, factory, std::move(args)); registerOverloadInternal(*signature, overload); } template inline void registerOverload(std::string const& name, Params... params) { registerOverload(name, &allocateCommand, {params...}); } template bool fakeParse(void*, ParseToken const&, CommandOrigin const&, int, std::string&, std::vector&) const { return false; } inline static std::unordered_map parse_ptr = { {typeid(CommandMessage).name(), dlsym_real( "??$parse@VCommandMessage@@@CommandRegistry@@AEBA_NPEAXAEBUParseToken@0@AEBVCommandOrigin@" "@HAEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAV?$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@@4@@Z")}, {typeid(std::string).name(), dlsym_real("??$parse@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@" "CommandRegistry@@AEBA_NPEAXAEBUParseToken@0@AEBVCommandOrigin@@HAEAV?$basic_" "string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAV?$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@@4@@Z")}, {typeid(bool).name(), dlsym_real("??$parse@_N@CommandRegistry@@AEBA_NPEAXAEBUParseToken@0@AEBVCommandOrigin@@HAEAV?$" "basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAV?$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@@4@@Z")}, {typeid(float).name(), dlsym_real("??$parse@M@CommandRegistry@@AEBA_NPEAXAEBUParseToken@0@AEBVCommandOrigin@@HAEAV?$" "basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAV?$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@@4@@Z")}, {typeid(int).name(), dlsym_real("??$parse@H@CommandRegistry@@AEBA_NPEAXAEBUParseToken@0@AEBVCommandOrigin@@HAEAV?$" "basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAV?$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@@4@@Z")}, {typeid(CommandSelector).name(), dlsym_real( "??$parse@V?$CommandSelector@VActor@@@@@CommandRegistry@@AEBA_NPEAXAEBUParseToken@0@" "AEBVCommandOrigin@@HAEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@" "AEAV?$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@@4@@Z")}, {typeid(CommandSelector).name(), dlsym_real( "??$parse@V?$CommandSelector@VPlayer@@@@@CommandRegistry@@AEBA_NPEAXAEBUParseToken@0@" "AEBVCommandOrigin@@HAEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@" "AEAV?$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@@4@@Z")}, {typeid(CommandPosition).name(), dlsym_real( "??$parse@VCommandPosition@@@CommandRegistry@@AEBA_NPEAXAEBUParseToken@0@AEBVCommandOrigin@@" "HAEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAV?$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@@4@@Z")}, {typeid(CommandPositionFloat).name(), dlsym_real( "??$parse@VCommandPositionFloat@@@CommandRegistry@@AEBA_NPEAXAEBUParseToken@0@AEBVCommandOrigin@@" "HAEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAV?$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@@4@@Z")}, {typeid(Json::Value).name(), dlsym_real( "??$parse@VValue@Json@@@CommandRegistry@@AEBA_NPEAXAEBUParseToken@0@AEBVCommandOrigin@@" "HAEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAV?$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@@4@@Z")}, {typeid(std::unique_ptr).name(), dlsym_real( "??$parse@V?$unique_ptr@VCommand@@U?$default_delete@VCommand@@@std@@@std@@@CommandRegistry@@AEBA_NPEAXAEBUParseToken@0@AEBVCommandOrigin@@HAEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAV?$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@@4@@Z")}, {typeid(RelativeFloat).name(), dlsym_real( "??$parse@VRelativeFloat@@@CommandRegistry@@AEBA_NPEAXAEBUParseToken@0@AEBVCommandOrigin@@HAEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAV?$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@@4@@Z")}, {typeid(CommandRawText).name(), dlsym_real( "??$parse@VCommandRawText@@@CommandRegistry@@AEBA_NPEAXAEBUParseToken@0@AEBVCommandOrigin@@HAEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAV?$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@@4@@Z")}, {typeid(class Block const*).name(), dlsym_real( "??$parse@PEBVBlock@@@CommandRegistry@@AEBA_NPEAXAEBUParseToken@0@AEBVCommandOrigin@@HAEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAV?$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@@4@@Z")}, {typeid(class MobEffect const*).name(), dlsym_real( "??$parse@PEBVMobEffect@@@CommandRegistry@@AEBA_NPEAXAEBUParseToken@0@AEBVCommandOrigin@@HAEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAV?$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@@4@@Z")}, {typeid(CommandItem).name(), dlsym_real( "??$parse@VCommandItem@@@CommandRegistry@@AEBA_NPEAXAEBUParseToken@0@AEBVCommandOrigin@@HAEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAV?$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@@4@@Z")}, {typeid(WildcardCommandSelector).name(), dlsym_real( "??$parse@V?$WildcardCommandSelector@VActor@@@@@CommandRegistry@@AEBA_NPEAXAEBUParseToken@0@AEBVCommandOrigin@@HAEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAV?$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@@4@@Z")}, {typeid(ActorDefinitionIdentifier const*).name(), dlsym_real( "??$parse@PEBUActorDefinitionIdentifier@@@CommandRegistry@@AEBA_NPEAXAEBUParseToken@0@AEBVCommandOrigin@@HAEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAV?$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@@4@@Z")}, }; private: template bool parse(void*, ParseToken const&, CommandOrigin const&, int, std::string&, std::vector&) const { }; public: template inline static ParseFn getParseFn() { if constexpr (!std::is_same_v && std::is_enum_v) return &fakeParse; // else // return &parse; bool (CommandRegistry::*ptr)(void*, CommandRegistry::ParseToken const&, CommandOrigin const&, int, std::string&, std::vector&) const; *(void**)&ptr = parse_ptr[typeid(T).name()]; if (!ptr) { printf("Cant parse cmd data %s\n", typeid(T).name()); std::this_thread::sleep_for(std::chrono::seconds(10)); exit(1); } return ptr; } bool parseEnumInt(void* target, CommandRegistry::ParseToken const& token, CommandOrigin const&, int, std::string&, std::vector&) const { auto data = getEnumData(token); *(int*)target = (int)data; return true; } bool parseEnumString(void* target, CommandRegistry::ParseToken const& token, CommandOrigin const&, int, std::string&, std::vector&) const { auto data = token.toString(); *(std::string*)target = data; return true; } bool parseEnumStringAndInt(void* target, CommandRegistry::ParseToken const& token, CommandOrigin const&, int, std::string&, std::vector&) const { auto str = token.toString(); auto data = getEnumData(token); *(std::pair*)target = {str, (int)data}; return true; } template > bool parseEnum( void* target, CommandRegistry::ParseToken const& token, CommandOrigin const&, int, std::string&, std::vector&) const { // fmt::print(token.toString() + '\n'); auto data = getEnumData(token); *(Type*)target = IDConverter{}(data); return true; } template > unsigned addEnumValues( std::string const& name, typeid_t tid, std::vector> const& values) { std::vector> converted; IDConverter converter; for (auto& value : values) converted.emplace_back(value.first, converter(value.second)); return addEnumValuesInternal(name, converted, tid, &CommandRegistry::parseEnum).val; } unsigned addEnumValues(std::string const& name, typeid_t tid, std::initializer_list const& values) { std::vector> converted; uint64_t idx = 0; for (auto& value : values) converted.emplace_back(value, ++idx); return addEnumValuesInternal(name, converted, tid, &CommandRegistry::parseEnumInt).val; } // inline static typeid_t getNextTypeId() { // return typeid_t::count++; // } template CommandRegistry* addEnum(char const* name, std::vector> const& values) { this->addEnumValues(name, type_id(), values); return this; } friend class DynamicCommand; friend class DynamicCommandInstance; #undef AFTER_EXTRA #ifndef DISABLE_CONSTRUCTOR_PREVENTION_COMMANDREGISTRY public: class CommandRegistry& operator=(class CommandRegistry const &) = delete; CommandRegistry(class CommandRegistry const &) = delete; #endif public: #ifdef ENABLE_VIRTUAL_FAKESYMBOL_COMMANDREGISTRY #endif MCAPI CommandRegistry(); MCAPI void addEnumValueConstraints(std::string const &, std::vector const &, enum SemanticConstraint); MCAPI int addEnumValues(std::string const &, std::vector const &); MCAPI int addSoftEnum(std::string const &, std::vector); MCAPI void addSoftEnumValues(std::string const &, std::vector); MCAPI std::vector getAliases(std::string const &) const; MCAPI std::vector getAlphabeticalLookup(class CommandOrigin const &) const; MCAPI std::string getCommandName(std::string const &) const; MCAPI struct CommandSyntaxInformation getCommandOverloadSyntaxInformation(class CommandOrigin const &, std::string const &) const; MCAPI void registerAlias(std::string, std::string); MCAPI void registerCommand(std::string const &, char const *, enum CommandPermissionLevel, struct CommandFlag, struct CommandFlag); MCAPI void removeSoftEnumValues(std::string const &, std::vector); MCAPI class AvailableCommandsPacket serializeAvailableCommands() const; MCAPI void setNetworkUpdateCallback(class std::function); MCAPI void setScoreCallback(class std::function); MCAPI void setSoftEnumValues(std::string const &, std::vector); MCAPI ~CommandRegistry(); MCAPI static char const * COMMAND_NAME_ENUM_NAME; MCAPI static char const * FUNCTION_NAME_SOFTENUM_NAME; MCAPI static char const * TAG_VALUES_SOFTENUM_NAME; //private: MCAPI void _addEnumValueConstraintsInternal(std::vector> const &, enum SemanticConstraint); MCAPI class CommandRegistry::Symbol _addFunctionSoftEnum(); MCAPI class CommandRegistry::Symbol _getConstrainedParamEnumSymbol(class CommandParameterData const &) const; MCAPI bool _matchesEnumConstraintsSet(class CommandRegistry::Symbol const &, class CommandOrigin const &, class CommandRegistry::Symbol const &, enum SemanticConstraint) const; MCAPI class CommandRegistry::Symbol addEnumValuesInternal(std::string const &, std::vector> const &, class typeid_t, bool ( CommandRegistry::*)(void *, struct CommandRegistry::ParseToken const &, class CommandOrigin const &, int, std::string &, std::vector &) const); MCAPI class CommandRegistry::Symbol addEnumValuesInternal(std::string const &, std::vector> const &, class typeid_t, bool ( CommandRegistry::*)(void *, struct CommandRegistry::ParseToken const &, class CommandOrigin const &, int, std::string &, std::vector &) const); MCAPI void addEnumValuesToExisting(unsigned int, std::vector> const &); MCAPI class CommandRegistry::Symbol addPostfix(std::string const &); MCAPI void addRule(class CommandRegistry::Symbol, std::vector &&, class std::function, class CommandVersion); MCAPI void addSemanticConstraint(enum SemanticConstraint); MCAPI class CommandRegistry::Symbol addSoftTerminal(std::string const &); MCAPI void buildFirstSet(struct CommandRegistry::ParseTable &, class CommandRegistry::Symbol, unsigned int) const; MCAPI void buildFollowSet(struct CommandRegistry::ParseTable &, class CommandRegistry::Symbol, unsigned int, class std::set, class std::allocator> &) const; MCAPI class CommandRegistry::Symbol buildOptionalRuleChain(struct CommandRegistry::Signature const &, std::vector const &, std::vector const &); MCAPI class CommandRegistry::Symbol buildOptionalRuleChain(struct CommandRegistry::Signature const &, std::vector const &, class CommandParameterData const *, unsigned __int64); MCAPI void buildParseTable(unsigned int) const; MCAPI class CommandRegistry::Symbol buildRules(struct CommandRegistry::Signature &, std::vector const &, unsigned __int64); MCAPI bool checkOriginCommandFlags(class CommandOrigin const &, struct CommandFlag, enum CommandPermissionLevel) const; MCAPI std::unique_ptr createCommand(struct CommandRegistry::ParseToken const &, class CommandOrigin const &, int, std::string &, std::vector &) const; MCAPI std::string describe(class CommandRegistry::Symbol) const; MCAPI std::string describe(class CommandParameterData const &) const; MCAPI std::string describe(struct CommandRegistry::Signature const &, std::string const &, struct CommandRegistry::Overload const &, unsigned int, unsigned int *, unsigned int *) const; MCAPI struct CommandRegistry::Signature * findCommand(std::string const &); MCAPI struct CommandRegistry::Signature const * findCommand(std::string const &) const; MCAPI class CommandRegistry::Symbol findEnum(std::string const &) const; MCAPI class CommandRegistry::Symbol findEnumValue(std::string const &) const; MCAPI class CommandRegistry::Symbol findIdentifierInfo(std::string const &) const; MCAPI class CommandRegistry::Symbol findPostfix(std::string const &) const; MCAPI class CommandRegistry::Symbol findSoftEnum(std::string const &) const; MCAPI std::vector first(struct CommandRegistry::ParseTable &, std::vector const &) const; MCAPI void forEachNonTerminal(class std::function) const; MCAPI unsigned __int64 getEnumData(struct CommandRegistry::ParseToken const &) const; MCAPI struct InvertableFilter getInvertableFilter(struct CommandRegistry::ParseToken const &) const; MCAPI bool isValid(class CommandRegistry::Symbol) const; MCAPI bool originCanRun(class CommandOrigin const &, struct CommandRegistry::Signature const &) const; MCAPI bool originCanRunOverloadWithParam(class CommandOrigin const &, class CommandParameterData const &) const; MCAPI bool parseOperator(enum CommandOperator *, struct CommandRegistry::ParseToken const &, std::string &, std::vector &) const; MCAPI bool parseSelector(class CommandSelectorBase *, struct CommandRegistry::ParseToken const &, class CommandOrigin const &, int, std::string &, std::vector &, bool) const; MCAPI void registerOverloadInternal(struct CommandRegistry::Signature &, struct CommandRegistry::Overload &); MCAPI void setupOverloadRules(struct CommandRegistry::Signature &, struct CommandRegistry::Overload &); MCAPI std::string symbolToString(class CommandRegistry::Symbol) const; MCAPI static std::string _removeStringQuotes(std::string const &); MCAPI static struct CommandRegistry::ParseToken * collapse(struct CommandRegistry::ParseToken &, class CommandRegistry::Symbol); MCAPI static struct CommandRegistry::ParseToken * collapseOn(struct CommandRegistry::ParseToken &, class CommandRegistry::Symbol, class CommandRegistry::Symbol); MCAPI static struct CommandRegistry::ParseToken * expand(struct CommandRegistry::ParseToken &, class CommandRegistry::Symbol); MCAPI static struct CommandRegistry::ParseToken * expandExcept(struct CommandRegistry::ParseToken &, class CommandRegistry::Symbol, class CommandRegistry::Symbol); MCAPI static struct CommandRegistry::ParseToken * fold(struct CommandRegistry::ParseToken &, class CommandRegistry::Symbol, class CommandRegistry::Symbol); MCAPI static struct CommandRegistry::ParseToken * kill(struct CommandRegistry::ParseToken &, class CommandRegistry::Symbol); MCAPI static bool readFloat(float &, struct CommandRegistry::ParseToken const &, std::string &, std::vector &); MCAPI static bool readInt(int &, struct CommandRegistry::ParseToken const &, std::string &, std::vector &); MCAPI static bool readRelativeCoordinate(bool &, float &, struct CommandRegistry::ParseToken const &, bool, std::string &, std::vector &); private: MCAPI static struct std::pair &) const, class CommandRegistry::Symbol> const ParseRuleSymbols[]; };