mirror of
https://github.com/quizhizhe/LiteLoaderBDS-1.16.40.git
synced 2025-06-05 03:43:40 +00:00
715 lines
40 KiB
C++
715 lines
40 KiB
C++
// 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 <memory>
|
|
//#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 <typename T>
|
|
class typeid_t {
|
|
public:
|
|
inline static unsigned short count = 0;
|
|
unsigned short value;
|
|
typeid_t<T>(typeid_t<T> const& id)
|
|
: value(id.value){};
|
|
typeid_t<T>(unsigned short value)
|
|
: value(value){};
|
|
};
|
|
template <>
|
|
class typeid_t<CommandRegistry> {
|
|
public:
|
|
MCAPI static unsigned short count;
|
|
unsigned short value;
|
|
typeid_t<CommandRegistry>(typeid_t<CommandRegistry> const& id)
|
|
: value(id.value){};
|
|
typeid_t<CommandRegistry>(unsigned short value)
|
|
: value(value){};
|
|
};
|
|
template <typename T, typename T2>
|
|
typeid_t<T> type_id() {
|
|
static typeid_t<T> id = typeid_t<T>::count++;
|
|
return id;
|
|
}
|
|
|
|
template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, ActorDamageCause>();
|
|
template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, AutomaticID<class Dimension, int>>();
|
|
// template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, class Block const*>();
|
|
// template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, bool>();
|
|
template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, class CommandMessage>();
|
|
template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, enum CommandOperator>();
|
|
template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, class CommandPosition>();
|
|
template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, class CommandPositionFloat>();
|
|
template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, class CommandPositionFloat>();
|
|
template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, class CommandSelector<class Actor>>();
|
|
template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, class CommandSelector<class Player>>();
|
|
template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, enum EquipmentSlot>();
|
|
template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, float>();
|
|
template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, int>();
|
|
template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, Json::Value>();
|
|
template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, enum Mirror>();
|
|
template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, class MobEffect const*>();
|
|
template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, class RelativeFloat>();
|
|
template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, std::string>();
|
|
template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, std::unique_ptr<class Command>>();
|
|
template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, class WildcardCommandSelector<Actor>>();
|
|
// template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, CommandItem>();
|
|
template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, CommandIntegerRange>();
|
|
// template MCAPI typeid_t<CommandRegistry> type_id<CommandRegistry, ActorDefinitionIdentifier const*>();
|
|
|
|
template <>
|
|
inline typeid_t<CommandRegistry> type_id<CommandRegistry, ActorDefinitionIdentifier const*>() {
|
|
static typeid_t<CommandRegistry> id = *(typeid_t<CommandRegistry>*)dlsym_real("?id@?1???$type_id@VCommandRegistry@@PEBUActorDefinitionIdentifier@@@@YA?AV?$typeid_t@VCommandRegistry@@@@XZ@4V1@A");
|
|
// static typeid_t<CommandRegistry> id = ([]() -> typeid_t<CommandRegistry> {
|
|
// 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<CommandRegistry> type_id<CommandRegistry, CommandItem>() {
|
|
static typeid_t<CommandRegistry> id = *(typeid_t<CommandRegistry>*)dlsym_real("?id@?1???$type_id@VCommandRegistry@@VCommandItem@@@@YA?AV?$typeid_t@VCommandRegistry@@@@XZ@4V1@A");
|
|
return id;
|
|
};
|
|
|
|
template <>
|
|
inline typeid_t<CommandRegistry> type_id<CommandRegistry, bool>() {
|
|
static typeid_t<CommandRegistry> id = *(typeid_t<CommandRegistry>*)dlsym_real("?id@?1???$type_id@VCommandRegistry@@_N@@YA?AV?$typeid_t@VCommandRegistry@@@@XZ@4V1@A");
|
|
return id;
|
|
};
|
|
|
|
|
|
template <>
|
|
inline typeid_t<CommandRegistry> type_id<CommandRegistry, class Block const*>() {
|
|
static typeid_t<CommandRegistry> id = *(typeid_t<CommandRegistry>*)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<CommandRegistry>->symbolToString(*this);
|
|
}
|
|
inline std::string toDebugString() const {
|
|
return fmt::format("<Symbol {}({})>", toString(), val);
|
|
}
|
|
};
|
|
|
|
struct ParseToken {
|
|
std::unique_ptr<CommandRegistry::ParseToken> child;
|
|
std::unique_ptr<CommandRegistry::ParseToken> 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("<ParseToken {}>", toString());
|
|
}
|
|
};
|
|
static_assert(sizeof(ParseToken) == 40);
|
|
using ParseFn = bool (CommandRegistry::*)(
|
|
void*, ParseToken const&, CommandOrigin const&, int, std::string&,
|
|
std::vector<std::string>&) const;
|
|
|
|
struct Overload {
|
|
using FactoryFn = std::unique_ptr<class Command> (*)();
|
|
|
|
CommandVersion version; // 0
|
|
FactoryFn factory; // 8
|
|
std::vector<CommandParameterData> params; // 16
|
|
unsigned char unk; // 40
|
|
std::vector<Symbol> syms = {}; // 48
|
|
|
|
LIAPI Overload(CommandVersion version,
|
|
FactoryFn factory,
|
|
std::vector<CommandParameterData>&& args);
|
|
|
|
LIAPI ~Overload();
|
|
|
|
inline std::string toDebugString() {
|
|
return fmt::format("<Overload>");
|
|
}
|
|
};
|
|
|
|
struct Signature {
|
|
std::string name; // 0
|
|
std::string desc; // 32
|
|
std::vector<Overload> 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("<Signature {}>", name);
|
|
}
|
|
};
|
|
|
|
struct SoftEnum {
|
|
std::string name; // 0
|
|
std::vector<std::string> list; // 32
|
|
};
|
|
|
|
struct Enum {
|
|
std::string name; // 0
|
|
typeid_t<CommandRegistry> type; // 32
|
|
ParseFn parse; // 40
|
|
std::vector<std::tuple<unsigned long, unsigned long, unsigned long, unsigned long>> values; // 48
|
|
|
|
inline std::string toDebugString() const {
|
|
return fmt::format("<Enum {}>", name);
|
|
}
|
|
};
|
|
|
|
LIAPI static std::vector<std::string> getEnumNames();
|
|
LIAPI static std::vector<std::string> getSoftEnumNames();
|
|
LIAPI static std::vector<std::string> getEnumValues(std::string const& name);
|
|
LIAPI static std::vector<std::string> getSoftEnumValues(std::string const& name);
|
|
LIAPI static std::string getCommandFullName(std::string const& name);
|
|
// Experiment
|
|
LIAPI bool unregisterCommand(std::string const& name);
|
|
|
|
template <typename Type>
|
|
struct DefaultIdConverter {
|
|
template <typename Target, typename Source>
|
|
static Target convert(Source source) {
|
|
return (Target)source;
|
|
}
|
|
uint64_t operator()(Type value) const {
|
|
return convert<uint64_t, Type>(value);
|
|
}
|
|
Type operator()(uint64_t value) const {
|
|
return convert<Type, uint64_t>(value);
|
|
}
|
|
};
|
|
|
|
#ifdef COMMAND_REGISTRY_EXTRA
|
|
inline static std::string toString(std::vector<Symbol> 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<ParseToken*(ParseToken&, Symbol)> func;
|
|
std::vector<Symbol> syms;
|
|
CommandVersion version;
|
|
inline std::string toDebugString() const {
|
|
|
|
return fmt::format("<ParseRule {} - [{}]>", sym.toDebugString(), toString(syms));
|
|
}
|
|
};
|
|
struct ParseTable {
|
|
std::map<Symbol, std::vector<Symbol>> first;
|
|
std::map<Symbol, std::vector<Symbol>> follow;
|
|
std::map<std::pair<Symbol, Symbol>, 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("<ParseTable>[{}]", oss.str());
|
|
}
|
|
};
|
|
struct OptionalParameterChain {
|
|
int parameterCount;
|
|
int followingRuleIndex;
|
|
Symbol paramSymbol;
|
|
inline std::string toDebugString() const {
|
|
return fmt::format("<OptionalParameterChain {},{},{}>", parameterCount, followingRuleIndex, paramSymbol.toDebugString());
|
|
}
|
|
};
|
|
struct Factorization {
|
|
Symbol sym;
|
|
inline std::string toDebugString() const {
|
|
return fmt::format("<Factorization {}>", sym.toDebugString());
|
|
}
|
|
};
|
|
struct RegistryState {
|
|
int signatureCount;
|
|
int enumValueCount;
|
|
int postfixCount;
|
|
int enumCount;
|
|
int factorizationCount;
|
|
int optionalCount;
|
|
int ruleCount;
|
|
int softEnumCount;
|
|
int constraintCount;
|
|
std::vector<unsigned int> constrainedValueCount;
|
|
std::vector<unsigned int> softEnumValuesCount;
|
|
};
|
|
struct ConstrainedValue {
|
|
Symbol mValue;
|
|
Symbol mEnum;
|
|
std::vector<unsigned char> 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("<ConstrainedValue {} - {} - [{}]>", mValue.toDebugString(), mEnum.toDebugString(), oss.str());
|
|
}
|
|
};
|
|
|
|
using CommandOverrideFunctor = std::function<void __cdecl(struct CommandFlag&, class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char>> const&)>;
|
|
using ParamSymbols = std::array<Symbol, 21>;
|
|
|
|
std::function<void(const class Packet&)> mGetScoreForObjective; // 0
|
|
std::function<void(const class Packet&)> mNetworkUpdateCallback; // 64
|
|
std::vector<ParseRule> mRules; // 128
|
|
// map<command version, ParseTable>
|
|
std::map<unsigned int, ParseTable> mParseTableMap; // 152
|
|
std::vector<OptionalParameterChain> mOptionals; // 168
|
|
std::vector<std::string> mEnumValues; // 192
|
|
std::vector<Enum> mEnums; // 216
|
|
std::vector<Factorization> mFactorizations; // 240
|
|
std::vector<std::string> mPostfixes; // 264
|
|
std::map<std::string, unsigned int> mEnumLookup; // 288
|
|
std::map<std::string, unsigned long> mEnumValueLookup; // 304
|
|
std::vector<Symbol> mCommandSymbols; // 320
|
|
std::map<std::string, Signature> mSignatures; // 344
|
|
std::map<typeid_t<CommandRegistry>, int> mTypeLookup; // 360
|
|
std::map<char, char> unk376; // 376
|
|
std::map<std::string, std::string> mAliases; // 392
|
|
std::vector<SemanticConstraint> mSemanticConstraints; // 408
|
|
std::map<SemanticConstraint, unsigned char> mSemanticConstraintLookup; // 432
|
|
std::vector<ConstrainedValue> mConstrainedValues; // 448
|
|
std::map<std::pair<unsigned long, unsigned int>, unsigned int> mConstrainedValueLookup; // 472
|
|
std::vector<SoftEnum> mSoftEnums; // 488
|
|
std::map<std::string, unsigned int> mSoftEnumLookup; // 512
|
|
std::vector<RegistryState> 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 <typename T>
|
|
inline static std::unique_ptr<class Command> allocateCommand() {
|
|
return std::make_unique<T>();
|
|
}
|
|
inline void registerOverload(
|
|
std::string const& name, Overload::FactoryFn factory, std::vector<CommandParameterData>&& args) {
|
|
Signature* signature = const_cast<Signature*>(findCommand(name));
|
|
auto& overload = signature->overloads.emplace_back(CommandVersion{}, factory, std::move(args));
|
|
registerOverloadInternal(*signature, overload);
|
|
}
|
|
template <typename T, typename... Params>
|
|
inline void registerOverload(std::string const& name, Params... params) {
|
|
registerOverload(name, &allocateCommand<T>, {params...});
|
|
}
|
|
|
|
template <typename Type>
|
|
bool
|
|
fakeParse(void*, ParseToken const&, CommandOrigin const&, int, std::string&, std::vector<std::string>&) const {
|
|
return false;
|
|
}
|
|
inline static std::unordered_map<string, void*> 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<Actor>).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<Player>).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<class Command>).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<Actor>).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 <typename T>
|
|
bool parse(void*, ParseToken const&, CommandOrigin const&, int, std::string&, std::vector<std::string>&) const {
|
|
|
|
};
|
|
|
|
public:
|
|
template <typename T>
|
|
inline static ParseFn getParseFn() {
|
|
if constexpr (!std::is_same_v<enum CommandOperator, T> && std::is_enum_v<T>)
|
|
return &fakeParse<T>;
|
|
// else
|
|
// return &parse<T>;
|
|
bool (CommandRegistry::*ptr)(void*, CommandRegistry::ParseToken const&,
|
|
CommandOrigin const&, int, std::string&,
|
|
std::vector<std::string>&) 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<std::string>&) 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<std::string>&) 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<std::string>&) const {
|
|
auto str = token.toString();
|
|
auto data = getEnumData(token);
|
|
*(std::pair<std::string, int>*)target = {str, (int)data};
|
|
return true;
|
|
}
|
|
|
|
template <typename Type, typename IDConverter = CommandRegistry::DefaultIdConverter<Type>>
|
|
bool parseEnum(
|
|
void* target, CommandRegistry::ParseToken const& token, CommandOrigin const&, int, std::string&,
|
|
std::vector<std::string>&) const {
|
|
// fmt::print(token.toString() + '\n');
|
|
auto data = getEnumData(token);
|
|
*(Type*)target = IDConverter{}(data);
|
|
return true;
|
|
}
|
|
|
|
template <typename Type, typename IDConverter = CommandRegistry::DefaultIdConverter<Type>>
|
|
unsigned addEnumValues(
|
|
std::string const& name, typeid_t<CommandRegistry> tid,
|
|
std::vector<std::pair<std::string, Type>> const& values) {
|
|
std::vector<std::pair<std::string, uint64_t>> converted;
|
|
IDConverter converter;
|
|
for (auto& value : values)
|
|
converted.emplace_back(value.first, converter(value.second));
|
|
return addEnumValuesInternal(name, converted, tid, &CommandRegistry::parseEnum<Type, IDConverter>).val;
|
|
}
|
|
unsigned addEnumValues(std::string const& name,
|
|
typeid_t<CommandRegistry> tid,
|
|
std::initializer_list<std::string> const& values) {
|
|
std::vector<std::pair<std::string, uint64_t>> 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<CommandRegistry> getNextTypeId() {
|
|
// return typeid_t<CommandRegistry>::count++;
|
|
// }
|
|
|
|
template <typename T>
|
|
CommandRegistry* addEnum(char const* name, std::vector<std::pair<std::string, T>> const& values) {
|
|
this->addEnumValues<T>(name, type_id<CommandRegistry, T>(), 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<std::string> const &, enum SemanticConstraint);
|
|
MCAPI int addEnumValues(std::string const &, std::vector<std::string> const &);
|
|
MCAPI int addSoftEnum(std::string const &, std::vector<std::string>);
|
|
MCAPI void addSoftEnumValues(std::string const &, std::vector<std::string>);
|
|
MCAPI std::vector<std::string> getAliases(std::string const &) const;
|
|
MCAPI std::vector<std::string> 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<std::string>);
|
|
MCAPI class AvailableCommandsPacket serializeAvailableCommands() const;
|
|
MCAPI void setNetworkUpdateCallback(class std::function<void (class Packet const &)>);
|
|
MCAPI void setScoreCallback(class std::function<int (bool &, std::string const &, class Actor const &)>);
|
|
MCAPI void setSoftEnumValues(std::string const &, std::vector<std::string>);
|
|
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<struct std::pair<unsigned __int64, unsigned int>> 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<struct std::pair<std::string, unsigned __int64>> const &, class typeid_t<class CommandRegistry>, bool ( CommandRegistry::*)(void *, struct CommandRegistry::ParseToken const &, class CommandOrigin const &, int, std::string &, std::vector<std::string> &) const);
|
|
MCAPI class CommandRegistry::Symbol addEnumValuesInternal(std::string const &, std::vector<struct std::pair<unsigned __int64, unsigned __int64>> const &, class typeid_t<class CommandRegistry>, bool ( CommandRegistry::*)(void *, struct CommandRegistry::ParseToken const &, class CommandOrigin const &, int, std::string &, std::vector<std::string> &) const);
|
|
MCAPI void addEnumValuesToExisting(unsigned int, std::vector<struct std::pair<unsigned __int64, unsigned __int64>> const &);
|
|
MCAPI class CommandRegistry::Symbol addPostfix(std::string const &);
|
|
MCAPI void addRule(class CommandRegistry::Symbol, std::vector<class CommandRegistry::Symbol> &&, class std::function<struct CommandRegistry::ParseToken * (struct CommandRegistry::ParseToken &, class CommandRegistry::Symbol)>, 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 CommandRegistry::Symbol, struct std::less<class CommandRegistry::Symbol>, class std::allocator<class CommandRegistry::Symbol>> &) const;
|
|
MCAPI class CommandRegistry::Symbol buildOptionalRuleChain(struct CommandRegistry::Signature const &, std::vector<class CommandParameterData> const &, std::vector<class CommandRegistry::Symbol> const &);
|
|
MCAPI class CommandRegistry::Symbol buildOptionalRuleChain(struct CommandRegistry::Signature const &, std::vector<class CommandParameterData> const &, class CommandParameterData const *, unsigned __int64);
|
|
MCAPI void buildParseTable(unsigned int) const;
|
|
MCAPI class CommandRegistry::Symbol buildRules(struct CommandRegistry::Signature &, std::vector<struct CommandRegistry::Overload *> const &, unsigned __int64);
|
|
MCAPI bool checkOriginCommandFlags(class CommandOrigin const &, struct CommandFlag, enum CommandPermissionLevel) const;
|
|
MCAPI std::unique_ptr<class Command> createCommand(struct CommandRegistry::ParseToken const &, class CommandOrigin const &, int, std::string &, std::vector<std::string> &) 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<class CommandRegistry::Symbol> first(struct CommandRegistry::ParseTable &, std::vector<class CommandRegistry::Symbol> const &) const;
|
|
MCAPI void forEachNonTerminal(class std::function<void (class CommandRegistry::Symbol)>) const;
|
|
MCAPI unsigned __int64 getEnumData(struct CommandRegistry::ParseToken const &) const;
|
|
MCAPI struct InvertableFilter<std::string> 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<std::string> &) const;
|
|
MCAPI bool parseSelector(class CommandSelectorBase *, struct CommandRegistry::ParseToken const &, class CommandOrigin const &, int, std::string &, std::vector<std::string> &, 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<std::string> &);
|
|
MCAPI static bool readInt(int &, struct CommandRegistry::ParseToken const &, std::string &, std::vector<std::string> &);
|
|
MCAPI static bool readRelativeCoordinate(bool &, float &, struct CommandRegistry::ParseToken const &, bool, std::string &, std::vector<std::string> &);
|
|
|
|
private:
|
|
MCAPI static struct std::pair<bool ( CommandRegistry::*)(void *, struct CommandRegistry::ParseToken const &, class CommandOrigin const &, int, std::string &, std::vector<std::string> &) const, class CommandRegistry::Symbol> const ParseRuleSymbols[];
|
|
|
|
}; |