mirror of
https://github.com/quizhizhe/LiteLoaderBDS-1.16.40.git
synced 2025-06-04 19:33:40 +00:00
88 lines
2.5 KiB
C++
88 lines
2.5 KiB
C++
#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 <tuple>
|
|
|
|
namespace RegisterCommandHelper {
|
|
template <typename Command, typename Type>
|
|
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<std::string>&) const;
|
|
|
|
template <typename Command, typename Type>
|
|
static CommandParameterData makeMandatory(Type Command::*field, std::string name, bool Command::*isSet = nullptr) {
|
|
|
|
return {
|
|
type_id<CommandRegistry, Type>(),
|
|
CommandRegistry::getParseFn<Type>(),
|
|
name,
|
|
CommandParameterDataType::NORMAL,
|
|
nullptr,
|
|
getOffset(field),
|
|
false,
|
|
isSet ? getOffset(isSet) : -1,
|
|
};
|
|
}
|
|
template <CommandParameterDataType DataType, typename Command, typename Type>
|
|
static CommandParameterData
|
|
makeMandatory(Type Command::*field, std::string name, char const* desc = nullptr, bool Command::*isSet = nullptr) {
|
|
return {
|
|
type_id<CommandRegistry, Type>(),
|
|
CommandRegistry::getParseFn<Type>(),
|
|
name,
|
|
DataType,
|
|
desc,
|
|
getOffset(field),
|
|
false,
|
|
isSet ? getOffset(isSet) : -1,
|
|
};
|
|
}
|
|
template <typename Command, typename Type>
|
|
static CommandParameterData makeOptional(Type Command::*field, std::string name, bool Command::*isSet = nullptr) {
|
|
typeid_t<CommandRegistry> tpid{0};
|
|
|
|
return {
|
|
type_id<CommandRegistry, Type>(),
|
|
CommandRegistry::getParseFn<Type>(),
|
|
name,
|
|
CommandParameterDataType::NORMAL,
|
|
nullptr,
|
|
getOffset(field),
|
|
true,
|
|
isSet ? getOffset(isSet) : -1,
|
|
};
|
|
}
|
|
template <CommandParameterDataType DataType, typename Command, typename Type>
|
|
static CommandParameterData
|
|
makeOptional(Type Command::*field, std::string name, char const* desc = nullptr, bool Command::*isSet = nullptr) {
|
|
|
|
return {
|
|
type_id<CommandRegistry, Type>(),
|
|
CommandRegistry::getParseFn<Type>(),
|
|
name,
|
|
DataType,
|
|
desc,
|
|
getOffset(field),
|
|
true,
|
|
isSet ? getOffset(isSet) : -1,
|
|
};
|
|
}
|
|
} // namespace RegisterCommandHelper
|