157 lines
23 KiB
C++
157 lines
23 KiB
C++
#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 <class F>
|
|
using BSTThreadScrapFunction = std::function<F>;
|
|
|
|
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<ObjectTypeInfo>& a_objType) = 0; // 09
|
|
virtual bool GetScriptObjectType(const BSFixedString& a_name, BSTSmartPointer<ObjectTypeInfo>& a_objType) = 0; // 08
|
|
virtual bool GetScriptObjectTypeNoLoad(std::uint32_t a_typeID, BSTSmartPointer<ObjectTypeInfo>& a_objType) const = 0; // 0B
|
|
virtual bool GetScriptObjectTypeNoLoad(const BSFixedString& a_objectTypeName, BSTSmartPointer<ObjectTypeInfo>& a_objType) const = 0; // 0A
|
|
virtual bool GetTypeIDForScriptObject(const BSFixedString& a_objectTypeName, std::uint32_t& a_typeID) const = 0; // 0C
|
|
virtual void GetScriptObjectsWithATypeID(BSScrapArray<BSFixedString>& a_objectTypeList) const = 0; // 0D
|
|
virtual bool GetParentNativeType(const BSFixedString& a_childTypeName, BSTSmartPointer<ObjectTypeInfo>& 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<BSFixedString>& a_scriptSet, BSTObjectArena<BSFixedString>& a_scriptList) const = 0; // 12
|
|
virtual bool GetScriptStructType(const BSFixedString& a_structTypeName, BSTSmartPointer<StructTypeInfo>& a_structType) = 0; // 13
|
|
virtual bool GetScriptStructTypeNoLoad(const BSFixedString& a_structTypeName, BSTSmartPointer<StructTypeInfo>& a_structType) const = 0; // 14
|
|
virtual bool GetChildStructTypes(const BSFixedString& a_parentObjectName, BSTObjectArena<BSFixedString>& a_structTypes) const = 0; // 15
|
|
virtual bool CreateObject(const BSFixedString& a_objectTypeName, const BSTScrapHashMap<BSFixedString, Variable>& a_properties, BSTSmartPointer<Object>& a_newObj) = 0; // 16
|
|
virtual bool CreateObject(const BSFixedString& a_objectTypeName, BSTSmartPointer<Object>& a_newObj) = 0; // 17
|
|
virtual bool CreateStruct(const BSFixedString& a_structTypeName, BSTSmartPointer<Struct>& a_newStruct) = 0; // 18
|
|
virtual bool CreateArray(TypeInfo::RawType a_elementType, const BSFixedString& a_elementObjectTypeName, std::uint32_t a_elementCount, BSTSmartPointer<Array>& a_newArray) = 0; // 1A
|
|
virtual bool CreateArray(const TypeInfo& a_type, std::uint32_t a_elementCount, BSTSmartPointer<Array>& 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<BSContainer::ForEachResult(Object*)>& a_functor) = 0; // 1E
|
|
virtual bool FindBoundObject(std::uint64_t a_objHandle, const char* a_objectTypeName, bool a_allowConst, BSTSmartPointer<Object>& 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<Object>& a_sourceObj, const BSTSmartPointer<ObjectTypeInfo>& a_targetType, BSTSmartPointer<Object>& a_castedObj) = 0; // 22
|
|
virtual bool SetPropertyValue(const BSTSmartPointer<Object>& a_self, const char* a_propName, const Variable& a_newValue, const BSTSmartPointer<IStackCallbackFunctor>& a_callback) = 0; // 23
|
|
virtual bool GetPropertyValue(const BSTSmartPointer<Object>& a_self, const char* a_propName, const BSTSmartPointer<IStackCallbackFunctor>& 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<Object>& 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<Object>& a_destObj) = 0; // 28
|
|
virtual void RemoveEventRelay(std::uint64_t a_sourceObject, const BSFixedString& a_eventName, const BSTSmartPointer<Object>& a_destObj) = 0; // 29
|
|
virtual void RemoveAllEventRelays(const BSTSmartPointer<Object>& a_destObj) = 0; // 2A
|
|
virtual void SendEvent(std::uint64_t a_objHandle, const BSFixedString& a_eventName, const BSTThreadScrapFunction<bool(BSScrapArray<Variable>&)>& a_arguments, const BSTThreadScrapFunction<bool(const BSTSmartPointer<Object>&)>& a_filter, const BSTSmartPointer<IStackCallbackFunctor>& a_callback) = 0; // 2B
|
|
virtual bool DispatchStaticCall(const BSFixedString& a_objName, const BSFixedString& a_funcName, const BSTThreadScrapFunction<bool(BSScrapArray<Variable>&)>& a_arguments, const BSTSmartPointer<IStackCallbackFunctor>& a_callback) = 0; // 2C
|
|
virtual bool DispatchMethodCall(std::uint64_t a_objHandle, const BSFixedString& a_objName, const BSFixedString& a_funcName, const BSTThreadScrapFunction<bool(BSScrapArray<Variable>&)>& a_arguments, const BSTSmartPointer<IStackCallbackFunctor>& a_callback) = 0; // 2E
|
|
virtual bool DispatchMethodCall(const BSTSmartPointer<Object>& a_self, const BSFixedString& a_funcName, const BSTThreadScrapFunction<bool(BSScrapArray<Variable>&)>& a_arguments, const BSTSmartPointer<IStackCallbackFunctor>& a_callback) = 0; // 2D
|
|
virtual bool DispatchUnboundMethodCall(std::uint64_t a_objHandle, const BSTSmartPointer<BoundScript>& a_script, const BSFixedString& a_funcName, const BSTThreadScrapFunction<bool(BSScrapArray<Variable>&)>& a_arguments, const BSTSmartPointer<IStackCallbackFunctor>& 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<LogEvent>* a_sink) = 0; // 38
|
|
virtual void UnregisterForLogEvent(BSTEventSink<LogEvent>* a_sink) = 0; // 39
|
|
virtual void RegisterForStatsEvent(BSTEventSink<StatsEvent>* a_sink) = 0; // 3A
|
|
virtual void UnregisterForStatsEvent(BSTEventSink<StatsEvent>* 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 <class F>
|
|
void BindNativeMethod(
|
|
std::string_view a_object,
|
|
std::string_view a_function,
|
|
F a_func,
|
|
std::optional<bool> a_taskletCallable = std::nullopt,
|
|
bool a_isLatent = false);
|
|
|
|
template <class... Args>
|
|
bool DispatchStaticCall(
|
|
const BSFixedString& a_objName,
|
|
const BSFixedString& a_funcName,
|
|
const BSTSmartPointer<IStackCallbackFunctor>& a_callback,
|
|
Args... a_args);
|
|
|
|
template <class... Args>
|
|
bool DispatchMethodCall(
|
|
std::uint64_t a_objHandle,
|
|
const BSFixedString& a_objName,
|
|
const BSFixedString& a_funcName,
|
|
const BSTSmartPointer<IStackCallbackFunctor>& 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);
|
|
}
|
|
}
|