51class CommandRegistry {
79 using ParseFunction = bool (::CommandRegistry::*)(
85 ::std::vector<::std::string>&
88 enum class HardNonTerminal :
int {
94 WildcardInt = 1048581,
96 CompareOperator = 1048583,
98 StandaloneSelection = 1048585,
99 WildcardSelection = 1048586,
100 NonIdSelector = 1048587,
102 ScoresArgs = 1048589,
103 ScoreSelectParam = 1048590,
104 ScoreSelector = 1048591,
105 TagSelector = 1048592,
107 FilePathVal = 1048594,
108 FilePathCont = 1048595,
109 IntegerRangeVal = 1048596,
110 IntegerRangePostVal = 1048597,
111 IntegerRange = 1048598,
112 FullIntegerRange = 1048599,
113 RationalRangeVal = 1048600,
114 RationalRangePostVal = 1048601,
115 RationalRange = 1048602,
116 FullRationalRange = 1048603,
125 HasPermissionArg = 1048612,
126 HasPermissionArgs = 1048613,
127 HasPermissionSelector = 1048614,
128 HasPermissionElement = 1048615,
129 HasPermissionElements = 1048616,
131 HasItemElement = 1048618,
132 HasItemElements = 1048619,
133 HasItemArg = 1048620,
134 HasItemArgs = 1048621,
135 HasItemSelector = 1048622,
136 EquipmentSlotEnum = 1048623,
137 PropertyValue = 1048624,
138 HasPropertyParamValue = 1048625,
139 HasPropertyParamEnumValue = 1048626,
140 HasPropertyArg = 1048627,
141 HasPropertyArgs = 1048628,
142 HasPropertyElement = 1048629,
143 HasPropertyElements = 1048630,
144 HasPropertySelector = 1048631,
150 CoordXFloat = 1048637,
151 CoordYFloat = 1048638,
152 CoordZFloat = 1048639,
154 PositionFloat = 1048641,
155 MessageExp = 1048642,
157 MessageRoot = 1048644,
158 PostSelector = 1048645,
160 RawTextCont = 1048647,
163 JsonObject = 1048650,
164 JsonObjectFields = 1048651,
165 JsonObjectCont = 1048652,
167 JsonArrayValues = 1048654,
168 JsonArrayCont = 1048655,
170 BlockStateKey = 1048657,
171 BlockStateValue = 1048658,
172 BlockStateValues = 1048659,
173 BlockStateArray = 1048660,
174 BlockStateArrayCont = 1048661,
175 ClockTimeMarkerName = 1048662,
179 SlashCommand = 1048666,
180 CodeBuilderArg = 1048667,
181 CodeBuilderArgs = 1048668,
182 CodeBuilderSelectParam = 1048669,
183 CodeBuilderSelector = 1048670,
190 ::ll::TypedStorage<4, 4, uint> signatureCount;
191 ::ll::TypedStorage<4, 4, uint> enumValueCount;
192 ::ll::TypedStorage<4, 4, uint> postfixCount;
193 ::ll::TypedStorage<4, 4, uint> enumCount;
194 ::ll::TypedStorage<4, 4, uint> enumLookupCount;
195 ::ll::TypedStorage<4, 4, uint> typeLookupCount;
196 ::ll::TypedStorage<4, 4, uint> factorizationCount;
197 ::ll::TypedStorage<4, 4, uint> optionalCount;
198 ::ll::TypedStorage<4, 4, uint> ruleCount;
199 ::ll::TypedStorage<4, 4, uint> softEnumCount;
200 ::ll::TypedStorage<4, 4, uint> constraintCount;
201 ::ll::TypedStorage<4, 4, uint> chainedSubcommandCount;
202 ::ll::TypedStorage<4, 4, uint> chainedSubcommandValueCount;
203 ::ll::TypedStorage<8, 24, ::std::vector<uint>> enumValuesCount;
204 ::ll::TypedStorage<8, 24, ::std::vector<uint>> constrainedValueCount;
205 ::ll::TypedStorage<8, 24, ::std::vector<uint>> softEnumValuesCount;
226 ::std::vector<::std::string> mValues;
236 MCAPI SoftEnum(::std::string
const& name, ::std::vector<::std::string> values);
242 MCAPI
void* $ctor(::std::string
const& name, ::std::vector<::std::string> values);
250 static int const NonTerminalBit = 0x100000;
251 static int const EnumBit = 0x200000;
252 static int const OptionalBit = 0x400000;
253 static int const FactorizationBit = 0x800000;
254 static int const PostfixBit = 0x1000000;
255 static int const EnumValueBit = 0x2000000;
256 static int const SoftEnumBit = 0x4000000;
260 Symbol(
int val) : mValue(val) {}
263 Symbol(Symbol
const& other) : mValue(other.mValue) {}
265 Symbol(HardNonTerminal data) : mValue(
static_cast<int>(data)) {}
267 Symbol(CommandLexer::TokenType data) : mValue(
static_cast<int>(data)) {}
269 Symbol& operator=(Symbol
const& other) {
270 mValue = other.mValue;
274 [[nodiscard]]
inline bool operator==(Symbol
const& other)
const {
return mValue == other.mValue; }
276 uint64 toIndex()
const {
return mValue & 0xffffffffe00fffffull; }
283 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> mValue;
284 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> mEnum;
285 ::ll::TypedStorage<8, 24, ::std::vector<uchar>> mConstraints;
293 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> commandSymbol;
297 struct LexicalToken {
305 ::CommandRegistry
const& mRegistry;
310 LexicalToken& operator=(LexicalToken
const&);
311 LexicalToken(LexicalToken
const&);
325 ::ll::TypedStorage<4, 4, int> parameterCount;
326 ::ll::TypedStorage<4, 4, int> followingRuleIndex;
327 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> paramSymbol;
341 ::std::vector<::CommandParameterData> params;
344 ::std::vector<::CommandRegistry::Symbol> paramsSymbol;
352 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> x;
353 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> y;
354 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> z;
355 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> dx;
356 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> dy;
357 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> dz;
358 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> r;
359 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> rm;
360 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> rx;
361 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> rxm;
362 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> ry;
363 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> rym;
364 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> l;
365 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> lm;
366 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> c;
367 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> m;
368 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> name;
369 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> type;
370 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> family;
371 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> score;
372 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> tag;
373 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> hasitem;
374 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> haspermission;
375 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> hasproperty;
376 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> codebuilder;
384 ::std::unique_ptr<::CommandRegistry::ParseToken> child;
385 ::std::unique_ptr<::CommandRegistry::ParseToken> next;
395 MCAPI ::std::string toString()
const;
414 ::std::vector<::std::pair<uint64, uint>> values;
425 ::std::vector<::std::pair<uint64, uint64>> values;
436 bool (CommandRegistry::*)(
442 ::std::vector<::std::string>&
445 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> symbol;
453 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> nonTerminal;
459 ::ll::TypedStorage<8, 24, ::std::vector<::CommandRegistry::Symbol>> derivation;
460 ::ll::TypedStorage<4, 8, ::CommandVersion> versions;
465 ParseRule& operator=(ParseRule
const&);
466 ParseRule(ParseRule
const&);
480 ::ll::TypedStorage<1, 1, bool> mIsValid;
481 ::ll::TypedStorage<8, 24, ::std::vector<::CommandRegistry::Symbol>> mConstrainedParams;
482 ::ll::TypedStorage<8, 32, ::std::string> mSoftEnumText;
483 ::ll::TypedStorage<8, 32, ::std::string> mSoftEnumEscapeCharExceptions;
484 ::ll::TypedStorage<8, 16, ::std::set<::CommandRegistry::Symbol>> mAlreadyCompletedSymbols;
493 ::std::string description;
494 ::std::vector<::CommandRegistry::Overload> overloads;
495 ::std::vector<uint> chainedSubcommandIndexes;
496 ::CommandPermissionLevel permissionLevel;
501 int firstFactorization;
530 ::entt::dense_set<::CommandRegistry::Symbol, ::CommandRegistry::SymbolHasher, ::std::equal_to<void>>>
535 ::entt::dense_set<::CommandRegistry::Symbol, ::CommandRegistry::SymbolHasher, ::std::equal_to<void>>>
538 ::std::pair<::CommandRegistry::Symbol, ::CommandRegistry::Symbol>,
541 ::std::equal_to<void>>
543 ::entt::dense_set<::CommandRegistry::Symbol, ::CommandRegistry::SymbolHasher, ::std::equal_to<void>>
545 ::std::chrono::nanoseconds buildDuration;
553 ::ll::TypedStorage<8, 8, ::CommandRegistry const&> mRegistry;
554 ::ll::TypedStorage<8, 8, ::CommandRegistry::ParseTable const*> mParseTable;
555 ::ll::TypedStorage<8, 40, ::std::deque<::std::pair<::CommandRegistry::Symbol, ::CommandRegistry::ParseToken*>>>
557 ::ll::TypedStorage<8, 32, ::CommandRegistry::LexicalToken> mNext;
558 ::ll::TypedStorage<8, 32, ::std::string> mInput;
559 ::ll::TypedStorage<8, 8, ::std::unique_ptr<::CommandRegistry::ParseToken>> mRoot;
560 ::ll::TypedStorage<8, 32, ::std::string> mError;
561 ::ll::TypedStorage<8, 24, ::std::vector<::std::string>> mErrorParams;
562 ::ll::TypedStorage<4, 4, int> mVersion;
563 ::ll::TypedStorage<1, 1, bool> mGenerateParams;
564 ::ll::TypedStorage<1, 1, bool> mBreakAtEnd;
569 Parser& operator=(Parser
const&);
570 Parser(Parser
const&);
576 MCAPI Parser(::CommandRegistry
const& registry,
int version);
578 MCAPI
bool _parse(::std::string
const& in);
580 MCAPI ::std::unique_ptr<::CommandSelector<::Actor>>
581 createSelector(::std::string
const& selectorString,
::CommandOrigin const& origin);
583 MCAPI ::std::vector<::std::string> getErrorParams()
const;
585 MCAPI
bool parseCommand(::std::string
const& in);
587 MCAPI
bool parseSelector(::std::string
const& in);
595 MCAPI
void* $ctor(::CommandRegistry
const& registry,
int version);
605 using ChainedSubcommandConversionFunction = ::std::function<void(
void*, uint64)>;
607 using ChainedSubcommandID = uint;
609 using ChainedSubcommandValueID = uint64;
611 using CommandOverrideFunctor =
612 ::std::function<void(::std::string
const&,
::CommandFlag&, ::CommandPermissionLevel&)>;
616 using ConstrainedValueID = uint;
618 using ConstrainedValueLookupKey = ::std::pair<uint64, uint>;
620 using CustomStorageGetFn =
void* (*)(
::Command*,
int);
622 using CustomStorageIsSetFn =
bool* (*)(
::Command*,
int);
624 using EnumConversionFunction = ::std::function<void(
void*, uint64)>;
628 using EnumValueID = uint64;
630 using HardTerminal = ::CommandLexer::TokenType;
632 using ParamVisitCallback = ::std::function<
635 using ParseMap = ::std::map<
637 ::entt::dense_set<::CommandRegistry::Symbol, ::CommandRegistry::SymbolHasher, ::std::equal_to<void>>>;
639 using ParseTableMap = ::std::map<uint, ::CommandRegistry::ParseTable>;
641 using PredictTable = ::entt::dense_map<
642 ::std::pair<::CommandRegistry::Symbol, ::CommandRegistry::Symbol>,
645 ::std::equal_to<void>>;
647 using ProcessFunction =
650 using RuleIndex = int;
652 using ScoreboardScoreAccessor = ::std::function<int(
bool&, ::std::string
const&,
::Actor const&)>;
654 using SemanticConstraintID = uchar;
656 using SoftEnumID = uint;
661 ::entt::dense_set<::CommandRegistry::Symbol, ::CommandRegistry::SymbolHasher, ::std::equal_to<void>>;
663 using SymbolVector = ::std::vector<::CommandRegistry::Symbol>;
667 using ValueTypeID = uint64;
672 ::std::function<void(
::Packet const&)> mNetworkUpdateCallback;
673 ScoreboardScoreAccessor mGetScoreForObjective;
675 ::std::vector<::CommandRegistry::ParseRule> mRules;
676 ::std::map<uint, ::CommandRegistry::ParseTable> mParseTables;
677 ::std::vector<::CommandRegistry::OptionalParameterChain> mOptionals;
678 ::std::vector<::std::string> mEnumValues;
679 ::std::vector<::CommandRegistry::Enum> mEnums;
680 ::std::vector<::std::string> mChainedSubcommandValues;
681 ::std::vector<::CommandRegistry::ChainedSubcommand> mChainedSubcommands;
682 ::std::vector<::CommandRegistry::Factorization> mFactorizations;
683 ::std::vector<::std::string> mPostfixes;
684 ::std::map<::std::string, uint> mEnumLookup;
685 ::std::map<::std::string, uint64> mEnumValueLookup;
686 ::std::map<::std::string, uint> mChainedSubcommandLookup;
687 ::std::map<::std::string, uint64> mChainedSubcommandValueLookup;
688 ::std::vector<::CommandRegistry::Symbol> mCommandSymbols;
689 ::std::map<::std::string, ::CommandRegistry::Signature> mSignatures;
690 ::std::map<::Bedrock::typeid_t<::CommandRegistry>,
int> mTypeLookup;
691 ::std::map<::std::string, ::std::string> mAliases;
692 ::std::vector<::SemanticConstraint> mSemanticConstraints;
693 ::std::map<::SemanticConstraint, uchar> mSemanticConstraintLookup;
694 ::std::vector<::CommandRegistry::ConstrainedValue> mConstrainedValues;
695 ::std::map<::std::pair<uint64, uint>, uint> mConstrainedValueLookup;
696 ::std::vector<::CommandRegistry::SoftEnum> mSoftEnums;
697 ::std::map<::std::string, uint> mSoftEnumLookup;
698 ::std::vector<::CommandRegistry::RegistryState> mStateStack;
700 ::std::unordered_set<int> mSkipOnEpsAutocompleteSymbols;
701 ::std::unordered_set<int> mAllowEmptySymbols;
702 CommandOverrideFunctor mCommandOverrideFunctor;
703 ::std::unique_ptr<::CommandRunStats> mCommandRunStats;
708 ::std::string
const&,
709 ::std::unordered_map<::mce::UUID, ::PlayerListEntry>
const&,
712 mAutoCompletePlayerMention;
722 std::vector<std::string>& errorParams
725 template <
class E,
class C>
732 std::vector<std::string>& errorParams
735 uint64 getEnumData(
ParseToken const& token)
const {
736 auto& values = mEnums[token.type.toIndex()].values;
737 return std::lower_bound(
740 token.child->type.toIndex(),
741 [](
auto& pair,
auto& child) { return pair.first < child; }
759 MCAPI ::CommandRegistry::Symbol _addChainedSubcommandValuesInternal(
760 ::std::string
const& name,
761 ::std::vector<::std::pair<::std::string, uint>>
const& strings,
763 bool (CommandRegistry::*parse)(
769 ::std::vector<::std::string>&
775 MCAPI ::CommandRegistry::Symbol _addChainedSubcommandValuesInternal(
776 ::std::string
const& name,
777 ::std::vector<::std::pair<uint64, uint>>
const& values,
779 bool (::CommandRegistry::*parse)(
785 ::std::vector<::std::string>&
791 MCAPI ::CommandRegistry::Symbol _addEnumValuesInternal(
792 ::std::string
const& name,
793 ::std::vector<::std::pair<::std::string, uint64>>
const& strings,
795 bool (CommandRegistry::*parse)(
801 ::std::vector<::std::string>&
805 MCAPI ::CommandRegistry::Symbol _addEnumValuesInternal(
806 ::std::string
const& name,
807 ::std::vector<::std::pair<uint64, uint64>>
const& values,
809 bool (::CommandRegistry::*parse)(
815 ::std::vector<::std::string>&
819 MCAPI ::std::unique_ptr<::CommandSelector<::Actor>> _createSelector(
823 ::std::string& error,
824 ::std::vector<::std::string>& errorParams
831 MCAPI
bool _matchesEnumConstraintsSet(
835 ::SemanticConstraint requiredConstraints
839 MCAPI
void addChainedSubcommandValuesToExisting(uint index, ::std::vector<::std::pair<uint64, uint>>
const& values);
842 MCAPI
void addEnumValueConstraints(
843 ::std::string
const& enumName,
844 ::std::vector<::std::string>
const& values,
845 ::SemanticConstraint constraints
848 MCAPI
int addEnumValues(::std::string
const& name, ::std::vector<::std::string>
const& values);
850 MCAPI
void addEnumValuesToExisting(uint index, ::std::vector<::std::pair<uint64, uint64>>
const& values);
853 MCAPI ::CommandRegistry::Symbol addPostfix(::std::string
const& name);
858 ::std::vector<::CommandRegistry::Symbol> derivation,
864 MCAPI
void addSemanticConstraint(::SemanticConstraint constraintType);
866 MCAPI
int addSoftEnum(::std::string
const& name, ::std::vector<::std::string> values);
868 MCAPI
void addSoftEnumValues(::std::string
const& enumName, ::std::vector<::std::string> values);
870 MCAPI ::CommandRegistry::Symbol addSoftTerminal(::std::string
const& name);
873 MCAPI
void autoComplete(
875 ::std::string
const& cmdLine,
876 ::std::string
const& partialMatch,
883 MCAPI
void autoCompleteCommand(
884 ::std::string
const& partialMatch,
892 MCAPI
void buildFollowSet(
896 ::std::set<::CommandRegistry::Symbol>& workingSet
899 MCAPI ::CommandRegistry::Symbol buildRules(
901 ::std::vector<::gsl::not_null<::CommandRegistry::Overload*>>
const& overloads,
909 MCAPI
bool canCommandBeUsed(
910 ::std::string
const& commandLine,
911 ::CommandPermissionLevel
const& permissionLevel,
917 MCAPI ::std::unique_ptr<::Command> createCommand(
921 ::std::string& error,
922 ::std::vector<::std::string>& errorParams
928 MCAPI ::std::string describe(
930 ::std::string
const& alias,
938 MCAPI
void finalizeChainedSubcommandOverloadRules(
char const* command);
940 MCFOLD ::CommandRegistry::Signature
const* findCommand(::std::string
const& name)
const;
942 MCFOLD ::CommandRegistry::Signature* findCommand(::std::string
const& name);
944 MCAPI
void fireCommandParseTableTelemetry(
::IMinecraftEventing const& eventing,
bool isServer)
const;
948 MCAPI ::Json::Value generateDocumentationMetadata(
bool generateInternalMetadata)
const;
950 MCAPI ::std::vector<::std::string> getAliases(::std::string
const& command)
const;
952 MCAPI ::std::vector<::std::string> getAlphabeticalLookup(
::CommandOrigin const& origin)
const;
955 MCAPI ::std::unique_ptr<::AutoCompleteInformation> getAutoCompleteOptions(
957 ::std::string
const& _cmdLine,
958 uint cursorPositionUnsafe
962 MCAPI ::std::string getCommandName(::std::string
const& commandLine)
const;
964 MCAPI ::CommandSyntaxInformation
965 getCommandOverloadSyntaxInformation(
::CommandOrigin const& origin, ::std::string
const& commandName)
const;
967 MCAPI ::CommandStatus getCommandStatus(::std::string
const& nameIn)
const;
972 MCAPI ::CommandSyntaxInformation getOverloadSyntaxInformation(
974 ::std::string
const& cmdLine,
979 MCAPI
bool isCommandOfType(::std::string
const& nameIn, ::CommandTypeFlag commandType)
const;
992 MCAPI ::std::string parsePartialCommand(
994 ::std::string
const& _cmdLine,
1000 MCAPI
bool parseSelector(
1005 ::std::string& error,
1006 ::std::vector<::std::string>& errorParams
1009 MCAPI
bool parseSelector(
1014 ::std::string& error,
1015 ::std::vector<::std::string>& errorParams,
1020 MCAPI
void popState();
1022 MCAPI
void pushState();
1025 MCAPI
void registerAlias(::std::string name, ::std::string alias);
1027 MCAPI
void registerCommand(
1028 ::std::string
const& name,
1029 char const* description,
1030 ::CommandPermissionLevel requirement,
1036 MCAPI
void registerCommandFactory(
1037 char const* command,
1042 MCAPI
void registerOverload(
1043 char const* command,
1045 ::std::function<::std::unique_ptr<::Command>()> allocFn,
1046 ::std::vector<::CommandParameterData> params
1051 MCAPI
void removeSoftEnumValues(::std::string
const& enumName, ::std::vector<::std::string> values);
1053 MCAPI ::AvailableCommandsPacket serializeAvailableCommands()
const;
1055 MCAPI
void setNetworkUpdateCallback(::std::function<
void(
::Packet const&)> callback);
1057 MCAPI
void setScoreCallback(::std::function<
int(
bool&, ::std::string
const&,
::Actor const&)> callback);
1059 MCAPI
void setSoftEnumValues(::std::string
const& enumName, ::std::vector<::std::string> values);
1076 MCAPI static ::BlockType
const* _getBlockFromCmdParameters(::std::string
const& parameters);
1079 MCAPI static ::std::string _removeStringQuotes(::std::string
const& str);
1081 MCFOLD static ::CommandRegistry::ParseToken*
1084 MCAPI static ::CommandRegistry::ParseToken* collapseOn(
1090 MCAPI static ::CommandRegistry::ParseToken*
1093 MCAPI static ::CommandRegistry::ParseToken* expandExcept(
1099 MCAPI static ::CommandRegistry::ParseToken* fold(
1105 MCAPI static ::CommandRegistry::ParseToken*
1108 MCAPI
static bool readFloat(
1111 ::std::string& error,
1112 ::std::vector<::std::string>& errorParams
1115 MCAPI
static bool readInt(
1118 ::std::string& error,
1119 ::std::vector<::std::string>& errorParams
1122 MCAPI
static bool readRelativeCoordinate(
1126 bool readIntegerAsCentered,
1127 ::std::string& error,
1128 ::std::vector<::std::string>& errorParams
1131 MCAPI
static bool readString(
1132 ::std::string& value,
1134 ::std::string& error,
1135 ::std::vector<::std::string>& errorParams
1142 MCAPI
static char const*& CODE_STATUS_PROPERTY_NAME();
1144 MCAPI
static char const*& COMMAND_NAME_ENUM_NAME();
1146 MCAPI
static char const*& FUNCTION_NAME_SOFTENUM_NAME();
1148 MCAPI
static char const*& POI_TAG_SOFTENUM();
1150 MCAPI
static char const*& POI_TYPE_SOFTENUM();
1152 MCAPI
static char const*& TAG_VALUES_SOFTENUM_NAME();
1154 MCAPI
static char const*& UNLOCKABLE_RECIPES_SOFTENUM_NAME();