#pragma once #include "RE/B/BSContainer.h" #include "RE/B/BSFixedString.h" #include "RE/B/BSIntrusiveRefCounted.h" #include "RE/B/BSScript_ErrorLogger.h" #include "RE/B/BSScript_ICachedErrorMessage.h" #include "RE/B/BSScript_TypeInfo.h" #include "RE/B/BSTArray.h" #include "RE/B/BSTHashMap.h" #include "RE/B/BSTObjectArena.h" #include "RE/B/BSTSmartPointer.h" namespace RE { template using BSTThreadScrapFunction = std::function; namespace BSScript { class Array; class BoundScript; class IFunction; class ILoader; class IObjectHandlePolicy; class ISavePatcherInterface; class IStackCallbackFunctor; class ITypeLinkedCallback; class JobList; class LogEvent; class Object; class ObjectBindPolicy; class ObjectTypeInfo; class StatsEvent; class Struct; class StructTypeInfo; class Variable; class __declspec(novtable) IVirtualMachine : public BSIntrusiveRefCounted // 08 { public: static constexpr auto RTTI{ RTTI::BSScript__IVirtualMachine }; static constexpr auto VTABLE{ VTABLE::BSScript__IVirtualMachine }; virtual ~IVirtualMachine() = default; // 00 // add virtual void SetLoader(ILoader* a_newLoader) = 0; // 01 virtual void SetLinkedCallback(ITypeLinkedCallback* a_typeLinkedCallback) = 0; // 02 virtual void Update(float a_updateBudget) = 0; // 03 virtual void UpdateTasklets(float a_updateBudget) = 0; // 04 virtual void SetOverstressed(bool a_overstressed) = 0; // 05 virtual bool IsCompletelyFrozen() const = 0; // 06 virtual bool RegisterObjectType(std::uint32_t a_typeID, const char* a_objectTypeName) = 0; // 07 virtual bool GetScriptObjectType(std::uint32_t a_typeID, BSTSmartPointer& a_objType) = 0; // 09 virtual bool GetScriptObjectType(const BSFixedString& a_name, BSTSmartPointer& a_objType) = 0; // 08 virtual bool GetScriptObjectTypeNoLoad(std::uint32_t a_typeID, BSTSmartPointer& a_objType) const = 0; // 0B virtual bool GetScriptObjectTypeNoLoad(const BSFixedString& a_objectTypeName, BSTSmartPointer& a_objType) const = 0; // 0A virtual bool GetTypeIDForScriptObject(const BSFixedString& a_objectTypeName, std::uint32_t& a_typeID) const = 0; // 0C virtual void GetScriptObjectsWithATypeID(BSScrapArray& a_objectTypeList) const = 0; // 0D virtual bool GetParentNativeType(const BSFixedString& a_childTypeName, BSTSmartPointer& a_parentType) = 0; // 0E virtual bool TypeIsValid(const BSFixedString& a_objectTypeName) = 0; // 0F virtual bool ReloadType(const char* a_objectTypeName) = 0; // 10 virtual void TasksToJobs(JobList& a_jobList) = 0; // 11 virtual void CalculateFullReloadList(const BSTSet& a_scriptSet, BSTObjectArena& a_scriptList) const = 0; // 12 virtual bool GetScriptStructType(const BSFixedString& a_structTypeName, BSTSmartPointer& a_structType) = 0; // 13 virtual bool GetScriptStructTypeNoLoad(const BSFixedString& a_structTypeName, BSTSmartPointer& a_structType) const = 0; // 14 virtual bool GetChildStructTypes(const BSFixedString& a_parentObjectName, BSTObjectArena& a_structTypes) const = 0; // 15 virtual bool CreateObject(const BSFixedString& a_objectTypeName, const BSTScrapHashMap& a_properties, BSTSmartPointer& a_newObj) = 0; // 16 virtual bool CreateObject(const BSFixedString& a_objectTypeName, BSTSmartPointer& a_newObj) = 0; // 17 virtual bool CreateStruct(const BSFixedString& a_structTypeName, BSTSmartPointer& a_newStruct) = 0; // 18 virtual bool CreateArray(TypeInfo::RawType a_elementType, const BSFixedString& a_elementObjectTypeName, std::uint32_t a_elementCount, BSTSmartPointer& a_newArray) = 0; // 1A virtual bool CreateArray(const TypeInfo& a_type, std::uint32_t a_elementCount, BSTSmartPointer& a_newArray) = 0; // 19 virtual bool BindNativeMethod(IFunction* a_function) = 0; // 1B virtual void SetCallableFromTasklets(const char* a_objectName, const char* a_functionName, bool a_taskletCallable) = 0; // 1D virtual void SetCallableFromTasklets(const char* a_objectName, const char* a_stateName, const char* a_functionName, bool a_taskletCallable) = 0; // 1C virtual void ForEachBoundObject(std::uint64_t a_objHandle, const BSTThreadScrapFunction& a_functor) = 0; // 1E virtual bool FindBoundObject(std::uint64_t a_objHandle, const char* a_objectTypeName, bool a_allowConst, BSTSmartPointer& a_attachedObj, bool a_exactMatch) const = 0; // 1F virtual void MoveBoundObjects(std::uint64_t a_sourceHandle, std::uint64_t a_destHandle) = 0; // 20 virtual void ResetAllBoundObjects(std::uint64_t a_objHandle) = 0; // 21 virtual bool CastObject(const BSTSmartPointer& a_sourceObj, const BSTSmartPointer& a_targetType, BSTSmartPointer& a_castedObj) = 0; // 22 virtual bool SetPropertyValue(const BSTSmartPointer& a_self, const char* a_propName, const Variable& a_newValue, const BSTSmartPointer& a_callback) = 0; // 23 virtual bool GetPropertyValue(const BSTSmartPointer& a_self, const char* a_propName, const BSTSmartPointer& a_callback) = 0; // 24 virtual bool GetVariableValue(std::uint64_t a_objHandle, const BSFixedString& a_scriptName, std::uint32_t a_varIndex, Variable& a_var) const = 0; // 26 virtual bool GetVariableValue(const BSTSmartPointer& a_obj, std::uint32_t a_varIndex, Variable& a_var) const = 0; // 25 virtual bool HandleImplementsEvent(std::uint64_t a_object, const BSFixedString& a_eventName) const = 0; // 27 virtual bool AddEventRelay(std::uint64_t a_sourceObject, const BSFixedString& a_eventName, const BSTSmartPointer& a_destObj) = 0; // 28 virtual void RemoveEventRelay(std::uint64_t a_sourceObject, const BSFixedString& a_eventName, const BSTSmartPointer& a_destObj) = 0; // 29 virtual void RemoveAllEventRelays(const BSTSmartPointer& a_destObj) = 0; // 2A virtual void SendEvent(std::uint64_t a_objHandle, const BSFixedString& a_eventName, const BSTThreadScrapFunction&)>& a_arguments, const BSTThreadScrapFunction&)>& a_filter, const BSTSmartPointer& a_callback) = 0; // 2B virtual bool DispatchStaticCall(const BSFixedString& a_objName, const BSFixedString& a_funcName, const BSTThreadScrapFunction&)>& a_arguments, const BSTSmartPointer& a_callback) = 0; // 2C virtual bool DispatchMethodCall(std::uint64_t a_objHandle, const BSFixedString& a_objName, const BSFixedString& a_funcName, const BSTThreadScrapFunction&)>& a_arguments, const BSTSmartPointer& a_callback) = 0; // 2E virtual bool DispatchMethodCall(const BSTSmartPointer& a_self, const BSFixedString& a_funcName, const BSTThreadScrapFunction&)>& a_arguments, const BSTSmartPointer& a_callback) = 0; // 2D virtual bool DispatchUnboundMethodCall(std::uint64_t a_objHandle, const BSTSmartPointer& a_script, const BSFixedString& a_funcName, const BSTThreadScrapFunction&)>& a_arguments, const BSTSmartPointer& a_callback) = 0; // 2F virtual bool IsWaitingOnLatent(std::uint32_t a_stackID) const = 0; // 30 virtual void ReturnFromLatent(std::uint32_t a_stackID, const Variable& a_retValue) = 0; // 31 [[nodiscard]] virtual ErrorLogger& GetErrorLogger() const = 0; // 32 [[nodiscard]] virtual const IObjectHandlePolicy& GetObjectHandlePolicy() const = 0; // 34 [[nodiscard]] virtual IObjectHandlePolicy& GetObjectHandlePolicy() = 0; // 33 [[nodiscard]] virtual const ObjectBindPolicy& GetObjectBindPolicy() const = 0; // 36 [[nodiscard]] virtual ObjectBindPolicy& GetObjectBindPolicy() = 0; // 35 [[nodiscard]] virtual ISavePatcherInterface& GetSavePatcherInterface() = 0; // 37 virtual void RegisterForLogEvent(BSTEventSink* a_sink) = 0; // 38 virtual void UnregisterForLogEvent(BSTEventSink* a_sink) = 0; // 39 virtual void RegisterForStatsEvent(BSTEventSink* a_sink) = 0; // 3A virtual void UnregisterForStatsEvent(BSTEventSink* a_sink) = 0; // 3B virtual void PostCachedErrorToLogger(const ICachedErrorMessage& a_errorFunctor, ErrorLogger::Severity a_severity) const = 0; // 3D virtual void PostCachedErrorToLogger(const ICachedErrorMessage& a_errorFunctor, std::uint32_t a_stackID, ErrorLogger::Severity a_severity) const = 0; // 3C template void BindNativeMethod( std::string_view a_object, std::string_view a_function, F a_func, std::optional a_taskletCallable = std::nullopt, bool a_isLatent = false); template bool DispatchStaticCall( const BSFixedString& a_objName, const BSFixedString& a_funcName, const BSTSmartPointer& a_callback, Args... a_args); template bool DispatchMethodCall( std::uint64_t a_objHandle, const BSFixedString& a_objName, const BSFixedString& a_funcName, const BSTSmartPointer& a_callback, Args... a_args); void PostError(std::string_view a_msg, std::uint32_t a_stackID, ErrorLogger::Severity a_severity) { class ErrorImpl : public ICachedErrorMessage { public: ErrorImpl(std::string_view a_message) noexcept : _message(a_message) {} void GetErrorMsg(BSFixedString& a_message) const override { a_message = _message; } private: std::string_view _message; }; const ErrorImpl e{ a_msg }; PostCachedErrorToLogger(e, a_stackID, a_severity); } }; static_assert(sizeof(IVirtualMachine) == 0x10); } }