#pragma once #include "RE/B/BSCRC32.h" #include "RE/B/BSTArray.h" #include "RE/B/BSTHashMap.h" namespace RE { namespace PowerUtils { class GridConnection { public: ~GridConnection() noexcept {} // NOLINT(modernize-use-equals-default) // members std::uint32_t connection{ 0 }; // 0 - the powered object std::uint32_t connector{ 0 }; // 4 - how the object is connected }; static_assert(sizeof(GridConnection) == 0x8); class GridSaveLoadData { public: // members std::uint32_t node{ 0 }; // 0 GridConnection connection; // 4 }; static_assert(sizeof(GridSaveLoadData) == 0xC); class PowerGrid { public: // members BSTHashMap*> adjacencyMap; // 00 - maps powered objects to the objects they connect to BSTArray loadGameData; // 30 std::uint32_t loadElement{ 0 }; // 48 BSTArray currentlyPowered; // 50 float capacity{ 0.0 }; // 68 float load{ 0.0 }; // 6C }; static_assert(sizeof(PowerGrid) == 0x70); class TraverseConnectionsOptions { public: // members std::uint32_t ignoreMode; // 00 bool wiredOnly; // 04 bool inputsOnly; // 05 }; static_assert(sizeof(TraverseConnectionsOptions) == 0x8); inline bool ItemIsPowerConnection(const TESObjectREFR* a_refr) { using func_t = decltype(&PowerUtils::ItemIsPowerConnection); static REL::Relocation func{ ID::PowerUtils::ItemIsPowerConnection }; return func(a_refr); } inline bool ItemIsPowerReceiver(const TESObjectREFR* a_refr) { using func_t = decltype(&PowerUtils::ItemIsPowerReceiver); static REL::Relocation func{ ID::PowerUtils::ItemIsPowerReceiver }; return func(a_refr); } } template <> struct BSCRC32 { public: [[nodiscard]] std::uint32_t operator()(const PowerUtils::GridConnection& a_connection) const noexcept { return detail::GenerateCRC32( std::span( reinterpret_cast(std::addressof(a_connection)), sizeof(PowerUtils::GridConnection))); } }; }