61 [[nodiscard]] std::uint32_t
Version()
const;
81 [[nodiscard]] std::uint32_t
Version()
const;
90 bool WriteRecord(std::uint32_t a_type, std::uint32_t a_version,
const void* a_buf, std::uint32_t a_length)
const;
98 inline std::uint32_t
WriteRecord(std::uint32_t a_type, std::uint32_t a_version,
const T& a_buf)
const
100 return WriteRecord(a_type, a_version, std::addressof(a_buf),
sizeof(T));
109 inline std::uint32_t
WriteRecord(std::uint32_t a_type, std::uint32_t a_version,
const T (&a_buf)[N])
const
111 return WriteRecord(a_type, a_version, std::addressof(a_buf),
sizeof(T) * N);
114 [[nodiscard]]
bool OpenRecord(std::uint32_t a_type, std::uint32_t a_version)
const;
140 bool GetNextRecordInfo(std::uint32_t& a_type, std::uint32_t& a_version, std::uint32_t& a_length)
const;
231 template <
class Last>
234 return Register_Impl(a_last);
237 template <
class First,
class... Rest>
240 return Register_Impl(a_first) &&
Register(a_rest...);
297 bool Dispatch(std::uint32_t a_messageType,
void* a_data, std::uint32_t a_dataLen,
const char* a_receiver)
const;
362 constexpr void AuthorName(std::string_view a_name)
noexcept { SetCharBuffer(a_name, std::span{
author }); }
371 [](
const REL::Version& a_version)
noexcept { return a_version.pack(); });
375 constexpr void PluginName(std::string_view a_plugin)
noexcept { SetCharBuffer(a_plugin, std::span{
pluginName }); }
402 static constexpr void SetCharBuffer(
403 std::string_view a_src,
404 std::span<char> a_dst)
noexcept
406 assert(a_src.size() < a_dst.size());
407 std::fill(a_dst.begin(), a_dst.end(),
'\0');
408 std::copy(a_src.begin(), a_src.end(), a_dst.begin());
411 static_assert(offsetof(PluginVersionData, dataVersion) == 0x000);
412 static_assert(offsetof(PluginVersionData, pluginVersion) == 0x004);
413 static_assert(offsetof(PluginVersionData, pluginName) == 0x008);
414 static_assert(offsetof(PluginVersionData, author) == 0x108);
415 static_assert(offsetof(PluginVersionData, supportEmail) == 0x208);
416 static_assert(offsetof(PluginVersionData, padding2) == 0x305);
417 static_assert(offsetof(PluginVersionData, padding3) == 0x306);
418 static_assert(offsetof(PluginVersionData, padding5) == 0x309);
419 static_assert(offsetof(PluginVersionData, padding6) == 0x30A);
420 static_assert(offsetof(PluginVersionData, compatibleVersions) == 0x30C);
421 static_assert(offsetof(PluginVersionData, xseMinimum) == 0x34C);
422 static_assert(
sizeof(PluginVersionData) == 0x350);
441 template <std::
size_t N>
447 constexpr String(std::string_view a_string)
noexcept
449 std::span<char> buffer(_buffer, N);
450 std::fill(buffer.begin(), buffer.end(),
'\0');
451 std::copy(a_string.begin(), a_string.end(), buffer.begin());
454 constexpr String(
const char* a_string)
noexcept
456 std::string_view string(a_string);
457 std::span<char> buffer(_buffer, N);
458 std::fill(buffer.begin(), buffer.end(),
'\0');
459 std::copy(
string.begin(),
string.end(), buffer.begin());
462 [[nodiscard]]
constexpr operator const char*()
const noexcept
467 [[nodiscard]]
constexpr operator std::string_view() const noexcept
483 _packed(
REL::
Version{ a_major, a_minor, a_patch, a_build }.pack())
487 _packed(a_version.pack()) {}
491 _packed = a_version.pack();
500 [[nodiscard]]
constexpr explicit operator std::uint32_t() const noexcept
506 std::uint32_t _packed{};
516 template <
class... Args>
517 requires(
sizeof...(Args) <=
MaxCompatibleVersions && (std::convertible_to<Args, VersionNumber> && ...))
519 _addressLibrary(
false), _compatibleVersions({
VersionNumber(a_compatibleVersions)... })
526 _structsPost629(a_requiresPost629Structs) {}
530 return _addressLibrary;
535 return _signatureScanning;
540 return _structsPost629;
550 return _compatibleVersions;
554 const bool _addressLibrary : 1 =
true;
555 const bool _signatureScanning: 1 =
false;
556 const bool _structsPost629 : 1 =
false;
557 [[maybe_unused]]
const std::uint8_t _pad0: 5 = 0;
558 [[maybe_unused]]
const std::uint8_t _pad1{ 0 };
559 [[maybe_unused]]
const std::uint16_t _pad2{ 0 };
560 std::array<VersionNumber, 16> _compatibleVersions{};
562 static_assert(
sizeof(RuntimeCompatibility) == 0x44);
614 static_assert(offsetof(PluginDeclarationInfo, Version) == 0x000);
615 static_assert(offsetof(PluginDeclarationInfo, Name) == 0x004);
616 static_assert(offsetof(PluginDeclarationInfo, Author) == 0x104);
617 static_assert(offsetof(PluginDeclarationInfo, SupportEmail) == 0x204);
619 static_assert(offsetof(PluginDeclarationInfo, RuntimeCompatibility) == 0x304);
620 static_assert(offsetof(PluginDeclarationInfo, MinimumSKSEVersion) == 0x348);
623 _data(std::move(info)) {}
630 [[nodiscard]]
constexpr std::string_view
GetName() const noexcept
635 [[nodiscard]]
constexpr std::string_view
GetAuthor() const noexcept
668 [[maybe_unused]]
const std::uint32_t _dataVersion{ kVersion };
669 [[maybe_unused]]
const PluginDeclarationInfo _data;
671 static_assert(
sizeof(PluginDeclaration) == 0x350);
674#define SKSEPluginInfo(...) \
675 extern "C" [[maybe_unused]] __declspec(dllexport) constinit ::SKSE::PluginDeclaration SKSEPlugin_Version({ __VA_ARGS__ }); \
676 extern "C" [[maybe_unused]] __declspec(dllexport) bool SKSEPlugin_Query(::SKSE::QueryInterface*, ::SKSE::PluginInfo* pluginInfo) \
678 pluginInfo->infoVersion = ::SKSE::PluginInfo::kVersion; \
679 pluginInfo->name = SKSEPlugin_Version.GetName().data(); \
680 pluginInfo->version = static_cast<std::uint32_t>(SKSEPlugin_Version.GetVersion().pack()); \
684#define SKSEPluginLoad(...) extern "C" [[maybe_unused]] __declspec(dllexport) bool SKSEPlugin_Load(__VA_ARGS__)
Definition IVirtualMachine.h:39
Definition VirtualMachine.h:46
Definition GFxMovieView.h:24
Definition InventoryEntryData.h:15
Definition Relocation.h:401
static constexpr Version unpack(std::uint32_t a_packedVersion) noexcept
Definition Relocation.h:505
std::uint16_t value_type
Definition Relocation.h:403
Definition Interfaces.h:29
@ kTrampoline
Definition Interfaces.h:40
@ kMessaging
Definition Interfaces.h:38
@ kPapyrus
Definition Interfaces.h:35
@ kSerialization
Definition Interfaces.h:36
@ kObject
Definition Interfaces.h:39
@ kTask
Definition Interfaces.h:37
@ kInvalid
Definition Interfaces.h:33
@ kScaleform
Definition Interfaces.h:34
@ kTotal
Definition Interfaces.h:41
void * QueryInterface(std::uint32_t a_id) const
PluginHandle GetPluginHandle() const
std::uint32_t GetReleaseIndex() const
const PluginInfo * GetPluginInfo(const char *a_name) const
Definition Interfaces.h:252
Dispatcher
Definition Interfaces.h:285
void * GetEventDispatcher(Dispatcher a_dispatcherID) const
@ kTotal
Definition Interfaces.h:281
@ kPostPostLoad
Definition Interfaces.h:272
@ kPostLoad
Definition Interfaces.h:271
@ kPreLoadGame
Definition Interfaces.h:273
@ kSaveGame
Definition Interfaces.h:275
@ kNewGame
Definition Interfaces.h:278
@ kDataLoaded
Definition Interfaces.h:279
@ kInputLoaded
Definition Interfaces.h:277
@ kDeleteGame
Definition Interfaces.h:276
@ kPostLoadGame
Definition Interfaces.h:274
std::uint32_t Version() const
const detail::SKSEMessagingInterface * GetProxy() const
bool Dispatch(std::uint32_t a_messageType, void *a_data, std::uint32_t a_dataLen, const char *a_receiver) const
bool RegisterListener(const char *a_sender, EventCallback *a_callback) const
bool RegisterListener(EventCallback *a_callback) const
@ kVersion
Definition Interfaces.h:266
void(Message *a_msg) EventCallback
Definition Interfaces.h:262
Definition Interfaces.h:307
SKSEObjectRegistry & GetObjectRegistry() const
SKSEPersistentObjectStorage & GetPersistentObjectStorage() const
std::uint32_t Version() const
@ kVersion
Definition Interfaces.h:311
SKSEDelayFunctorManager & GetDelayFunctorManager() const
Definition Interfaces.h:219
bool Register(First a_first, Rest... a_rest) const
Definition Interfaces.h:238
const detail::SKSEPapyrusInterface * GetProxy() const
std::uint32_t Version() const
bool(RE::BSScript::Internal::VirtualMachine *a_vm) RegFunction1
Definition Interfaces.h:221
bool(RE::BSScript::IVirtualMachine *a_vm) RegFunction2
Definition Interfaces.h:222
@ kVersion
Definition Interfaces.h:226
bool Register(Last a_last) const
Definition Interfaces.h:232
Definition Interfaces.h:510
constexpr bool Targets629Structs() const noexcept
Definition Interfaces.h:538
constexpr RuntimeCompatibility()=default
constexpr RuntimeCompatibility(VersionIndependence a_versionIndependence, bool a_requiresPost629Structs=false) noexcept
Definition Interfaces.h:523
static constexpr std::size_t MaxCompatibleVersions
Definition Interfaces.h:512
constexpr RuntimeCompatibility(Args... a_compatibleVersions) noexcept
Definition Interfaces.h:518
constexpr std::array< VersionNumber, 16 > GetCompatibleRuntimeVersions() const noexcept
Definition Interfaces.h:548
constexpr bool IsVersionIndependent() const noexcept
Definition Interfaces.h:543
constexpr bool UsesAddressLibrary() const noexcept
Definition Interfaces.h:528
constexpr bool UsesSignatureScanning() const noexcept
Definition Interfaces.h:533
Definition Interfaces.h:443
constexpr String(const char *a_string) noexcept
Definition Interfaces.h:454
constexpr String(std::string_view a_string) noexcept
Definition Interfaces.h:447
constexpr String()=default
Definition Interfaces.h:477
constexpr operator REL::Version() const noexcept
Definition Interfaces.h:495
constexpr VersionNumber & operator=(REL::Version a_version) noexcept
Definition Interfaces.h:489
constexpr VersionNumber(value_type a_major=1, value_type a_minor=0, value_type a_patch=0, value_type a_build=0) noexcept
Definition Interfaces.h:481
typename REL::Version::value_type value_type
Definition Interfaces.h:479
constexpr VersionNumber(REL::Version a_version) noexcept
Definition Interfaces.h:486
Definition Interfaces.h:17
const detail::SKSEInterface * GetProxy() const
std::uint32_t EditorVersion() const
REL::Version RuntimeVersion() const
std::uint32_t SKSEVersion() const
Definition Interfaces.h:71
std::uint32_t WriteRecord(std::uint32_t a_type, std::uint32_t a_version, const T(&a_buf)[N]) const
Definition Interfaces.h:109
bool ResolveHandle(RE::VMHandle a_oldHandle, RE::VMHandle &a_newHandle) const
std::uint32_t WriteRecordData(const T(&a_buf)[N]) const
Definition Interfaces.h:135
void SetLoadCallback(EventCallback *a_callback) const
std::uint32_t WriteRecord(std::uint32_t a_type, std::uint32_t a_version, const T &a_buf) const
Definition Interfaces.h:98
void SetFormDeleteCallback(FormDeleteCallback *a_callback) const
std::uint32_t ReadRecordData(T &a_buf) const
Definition Interfaces.h:150
void(SerializationInterface *a_intfc) EventCallback
Definition Interfaces.h:73
void(RE::VMHandle a_handle) FormDeleteCallback
Definition Interfaces.h:74
std::uint32_t ReadRecordData(void *a_buf, std::uint32_t a_length) const
void SetRevertCallback(EventCallback *a_callback) const
const detail::SKSESerializationInterface * GetProxy() const
std::uint32_t WriteRecordData(const T &a_buf) const
Definition Interfaces.h:124
void SetUniqueID(std::uint32_t a_uid) const
bool WriteRecordData(const void *a_buf, std::uint32_t a_length) const
bool GetNextRecordInfo(std::uint32_t &a_type, std::uint32_t &a_version, std::uint32_t &a_length) const
void SetSaveCallback(EventCallback *a_callback) const
std::uint32_t ReadRecordData(T(&a_buf)[N]) const
Definition Interfaces.h:161
bool ResolveFormID(RE::FormID a_oldFormID, RE::FormID &a_newFormID) const
@ kVersion
Definition Interfaces.h:78
std::uint32_t Version() const
bool WriteRecord(std::uint32_t a_type, std::uint32_t a_version, const void *a_buf, std::uint32_t a_length) const
bool OpenRecord(std::uint32_t a_type, std::uint32_t a_version) const
Definition Interfaces.h:192
Definition Interfaces.h:204
Definition Interfaces.h:174
void AddUITask(UIDelegate_v1 *a_task) const
std::function< void()> TaskFn
Definition Interfaces.h:176
const detail::SKSETaskInterface * GetProxy() const
void AddTask(TaskFn a_task) const
@ kVersion
Definition Interfaces.h:180
void AddUITask(TaskFn a_task) const
void AddTask(TaskDelegate *a_task) const
std::uint32_t Version() const
Definition Interfaces.h:325
void * AllocateFromBranchPool(std::size_t a_size) const
std::uint32_t Version() const
@ kVersion
Definition Interfaces.h:329
void * AllocateFromLocalPool(std::size_t a_size) const
std::uint32_t FormID
Definition BSCoreTypes.h:5
std::uint64_t VMHandle
Definition BSCoreTypes.h:7
Definition Relocation.h:182
std::uint32_t PluginHandle
Definition Stubs.h:11
VersionIndependence
Definition Interfaces.h:425
@ AddressLibraryPre1_6_629
@ AddressLibraryPost1_6_629
StructCompatibility
Definition Interfaces.h:433
Definition Interfaces.h:255
std::uint32_t dataLen
Definition Interfaces.h:258
const char * sender
Definition Interfaces.h:256
std::uint32_t type
Definition Interfaces.h:257
void * data
Definition Interfaces.h:259
Definition Interfaces.h:565
const String< 256 > Name
Definition Interfaces.h:574
const VersionNumber MinimumSKSEVersion
Definition Interfaces.h:612
const StructCompatibility StructCompatibility
Definition Interfaces.h:596
const String< 256 > Author
Definition Interfaces.h:579
const VersionNumber Version
Definition Interfaces.h:569
const String< 252 > SupportEmail
Definition Interfaces.h:584
const RuntimeCompatibility RuntimeCompatibility
Definition Interfaces.h:607
Definition Interfaces.h:439
static const PluginDeclaration * GetSingleton() noexcept
constexpr std::string_view GetAuthor() const noexcept
Definition Interfaces.h:635
constexpr PluginDeclaration(PluginDeclarationInfo info) noexcept
Definition Interfaces.h:622
constexpr std::string_view GetName() const noexcept
Definition Interfaces.h:630
constexpr REL::Version GetMinimumSKSEVersion() const noexcept
Definition Interfaces.h:655
constexpr REL::Version GetVersion() const noexcept
Definition Interfaces.h:625
constexpr std::string_view GetSupportEmail() const noexcept
Definition Interfaces.h:640
constexpr StructCompatibility GetStructCompatibility() const noexcept
Definition Interfaces.h:645
constexpr const RuntimeCompatibility & GetRuntimeCompatibility() const noexcept
Definition Interfaces.h:650
Definition Interfaces.h:342
std::uint32_t version
Definition Interfaces.h:350
const char * name
Definition Interfaces.h:349
std::uint32_t infoVersion
Definition Interfaces.h:348
@ kVersion
Definition Interfaces.h:345
Definition Interfaces.h:354
std::uint8_t padding5
Definition Interfaces.h:396
constexpr void HasNoStructUse(bool a_value=true) noexcept
Definition Interfaces.h:377
std::uint16_t padding6
Definition Interfaces.h:397
constexpr void UsesNoStructs(bool a_value=true) noexcept
Definition Interfaces.h:378
std::uint8_t padding4
Definition Interfaces.h:395
bool structsPost629
Definition Interfaces.h:394
constexpr void MinimumRequiredXSEVersion(REL::Version a_version) noexcept
Definition Interfaces.h:374
constexpr void PluginName(std::string_view a_plugin) noexcept
Definition Interfaces.h:375
std::uint16_t padding3
Definition Interfaces.h:391
std::uint32_t pluginVersion
Definition Interfaces.h:384
std::uint32_t xseMinimum
Definition Interfaces.h:399
constexpr void CompatibleVersions(std::initializer_list< REL::Version > a_versions) noexcept
Definition Interfaces.h:364
char pluginName[256]
Definition Interfaces.h:385
constexpr void AuthorEmail(std::string_view a_email) noexcept
Definition Interfaces.h:361
bool addressLibrary
Definition Interfaces.h:392
constexpr void UsesStructsPost629(bool a_value=true) noexcept
Definition Interfaces.h:381
std::uint8_t padding1
Definition Interfaces.h:389
constexpr void PluginVersion(REL::Version a_version) noexcept
Definition Interfaces.h:376
char author[256]
Definition Interfaces.h:386
@ kVersion
Definition Interfaces.h:358
std::uint8_t padding2
Definition Interfaces.h:390
bool sigScanning
Definition Interfaces.h:393
constexpr void AuthorName(std::string_view a_name) noexcept
Definition Interfaces.h:362
bool noStructUse
Definition Interfaces.h:388
std::uint32_t compatibleVersions[16]
Definition Interfaces.h:398
constexpr void UsesAddressLibrary(bool a_value=true) noexcept
Definition Interfaces.h:379
const std::uint32_t dataVersion
Definition Interfaces.h:383
char supportEmail[252]
Definition Interfaces.h:387
constexpr void UsesSigScanning(bool a_value=true) noexcept
Definition Interfaces.h:380