CommonLibVR
Loading...
Searching...
No Matches
IVirtualMachine.h
Go to the documentation of this file.
1#pragma once
2
5#include "RE/B/BSTEvent.h"
7#include "RE/E/ErrorLogger.h"
9#include "RE/T/TypeInfo.h"
10#include "RE/T/TypeTraits.h"
11#include "RE/V/Variable.h"
12
13namespace RE
14{
15 namespace BSJobs
16 {
17 class JobList;
18 }
19
20 class TESForm;
21
22 namespace BSScript
23 {
24 class Array;
25 class ErrorLogger;
26 class IForEachScriptObjectFunctor;
27 class IFunction;
28 class IFunctionArguments;
29 class ISavePatcherInterface;
30 class ITypeLinkedCallback;
31 class Object;
32 class ObjectBindPolicy;
33 class ObjectTypeInfo;
34 class Variable;
35 struct IObjectHandlePolicy;
36 struct LogEvent;
37 struct StatsEvent;
38
40 {
41 public:
42 inline static constexpr auto RTTI = RTTI_BSScript__IVirtualMachine;
43 inline static constexpr auto VTABLE = VTABLE_BSScript__IVirtualMachine;
44
46 struct Awaitable
47 {
49 {
50 void operator()(Variable a_result) override;
51 void SetObject(const BSTSmartPointer<Object>&) override {}
52
53 bool pending{ false };
55 std::coroutine_handle<> continuation;
56 };
57
59 void SetPending(bool a_pending = true);
60 bool await_ready() const;
61 void await_suspend(std::coroutine_handle<> a_handle);
63
65 };
66
67 virtual ~IVirtualMachine(); // 00
68
69 // add
70 virtual void SetLinkedCallback(ITypeLinkedCallback* a_callback) = 0; // 01
71 virtual void TraceStack(const char* a_str, VMStackID a_stackID, Severity a_severity = Severity::kError) = 0; // 02
72 virtual void FormatAndPostMessage(const char* a_message, Severity a_severity) = 0; // 03
73 virtual void Update(float a_budget) = 0; // 04
74 virtual void UpdateTasklets(float a_budget) = 0; // 05
75 virtual void SetOverstressed(bool a_set) = 0; // 06
76 virtual bool IsCompletelyFrozen() const = 0; // 07
77 virtual bool RegisterObjectType(VMTypeID a_typeID, const char* a_className) = 0; // 08
78 virtual bool GetScriptObjectType1(const BSFixedString& a_className, BSTSmartPointer<ObjectTypeInfo>& a_outTypeInfoPtr) = 0; // 09
79 virtual bool GetScriptObjectType2(VMTypeID a_typeID, BSTSmartPointer<ObjectTypeInfo>& a_outTypeInfoPtr) = 0; // 0A
80 virtual bool GetScriptObjectTypeNoLoad1(const BSFixedString& a_className, BSTSmartPointer<ObjectTypeInfo>& a_typeInfoPtr) const = 0; // 0B
81 virtual bool GetScriptObjectTypeNoLoad2(VMTypeID a_typeID, BSTSmartPointer<ObjectTypeInfo>& a_outTypeInfoPtr) const = 0; // 0C
82 virtual bool GetTypeIDForScriptObject(const BSFixedString& a_className, VMTypeID& a_typeID) const = 0; // 0D
83 virtual void GetScriptObjectsWithATypeID(BSScrapArray<BSFixedString>& a_classes) const = 0; // 0E
84 virtual bool GetParentNativeType(const BSFixedString& a_className, BSTSmartPointer<ObjectTypeInfo>& a_typeInfoPtr) = 0; // 0F
85 virtual bool TypeIsValid(const BSFixedString& a_className) = 0; // 10
86 virtual bool ReloadType(const char* a_className) = 0; // 11
87 virtual void TasksToJobs(BSJobs::JobList& a_jobList) = 0; // 12
88 virtual void CalculateFullReloadList(void) const = 0; // 13
89 virtual bool CreateObject1(const BSFixedString& a_className, void* a_property, BSTSmartPointer<Object>& a_objPtr) = 0; // 14
90 virtual bool CreateObject2(const BSFixedString& a_className, BSTSmartPointer<Object>& a_result) = 0; // 15
91 virtual bool CreateArray1(const TypeInfo& a_typeInfo, std::uint32_t a_size, BSTSmartPointer<Array>& a_arrayPtr) = 0; // 16
92 virtual bool CreateArray2(TypeInfo::RawType a_typeID, const BSFixedString& a_className, std::uint32_t a_size, BSTSmartPointer<Array>& a_arrayPtr) = 0; // 17
93 virtual bool BindNativeMethod(IFunction* a_fn) = 0; // 18
94 virtual void SetCallableFromTasklets1(const char* a_className, const char* a_stateName, const char* a_fnName, bool a_callable) = 0; // 19
95 virtual void SetCallableFromTasklets2(const char* a_className, const char* a_fnName, bool a_callable) = 0; // 1A
96 virtual void ForEachBoundObject(VMHandle a_handle, IForEachScriptObjectFunctor* a_functor) = 0; // 1B
97#ifdef SKYRIMVR
98 virtual void UnkVR_1C(void) = 0; // added in VR 1.4.15
99 virtual void UnkVR_1D(void) = 0; // added in VR 1.4.15
100#endif
101 virtual bool FindBoundObject(VMHandle a_handle, const char* a_className, BSTSmartPointer<Object>& a_result) const = 0; // 1C
102 virtual void MoveBoundObjects(VMHandle a_from, VMHandle a_to) = 0; // 1D
103 virtual void ResetAllBoundObjects(VMHandle a_handle) = 0; // 1E
104 virtual bool CastObject(const BSTSmartPointer<Object>& a_fromObjPtr, const BSTSmartPointer<ObjectTypeInfo>& a_toTypeInfoPtr, BSTSmartPointer<Object>& a_toObjPtr) = 0; // 1F
105 virtual bool SetPropertyValue(BSTSmartPointer<Object>& a_obj, const char* a_propertyName, Variable& a_setVal) = 0; // 20
106 virtual bool GetPropertyValue(BSTSmartPointer<Object>& a_obj, const char* a_propertyName, Variable& a_getVal) = 0; // 21
107 virtual bool GetVariableValue1(const BSTSmartPointer<Object>& a_objPtr, std::uint32_t a_index, Variable& a_out) const = 0; // 22
108 virtual bool GetVariableValue2(VMHandle a_handle, const BSFixedString& a_className, std::int32_t a_variableIndex, Variable& a_out) const = 0; // 23
109 virtual void SendEvent(VMHandle a_handle, const BSFixedString& a_eventName, IFunctionArguments* a_args) = 0; // 24
110 virtual void SendEventAll(const BSFixedString& a_eventName, IFunctionArguments* a_args) = 0; // 25
111 virtual bool DispatchStaticCall(const BSFixedString& a_className, const BSFixedString& a_fnName, IFunctionArguments* a_args, BSTSmartPointer<IStackCallbackFunctor>& a_result) = 0; // 26
113 virtual bool DispatchMethodCall2(VMHandle a_handle, const BSFixedString& a_className, const BSFixedString& a_fnName, IFunctionArguments* a_args, BSTSmartPointer<IStackCallbackFunctor>& a_result) = 0; // 28
114 virtual bool DispatchUnboundMethodCall(void) = 0; // 29
115 virtual bool IsWaitingOnLatent(VMStackID a_stackID) const = 0; // 2A
116 virtual void ReturnFromLatent(VMStackID a_stackID, const Variable& a_val) = 0; // 2B
117 virtual ErrorLogger* GetErrorLogger() = 0; // 2C
119 virtual const IObjectHandlePolicy* GetObjectHandlePolicy2() const = 0; // 2E
121 virtual const ObjectBindPolicy* GetObjectBindPolicy2() const = 0; // 30
123 virtual void RegisterForLogEvent(BSTEventSink<LogEvent>* a_sink) = 0; // 32
124 virtual void UnregisterForLogEvent(BSTEventSink<LogEvent>* a_sink) = 0; // 33
125 virtual void RegisterForStatsEvent(BSTEventSink<StatsEvent>* a_sink) = 0; // 34
126 virtual void UnregisterForStatsEvent(BSTEventSink<StatsEvent>* a_sink) = 0; // 35
127
128 bool CreateArray(const TypeInfo& a_typeInfo, std::uint32_t a_size, BSTSmartPointer<Array>& a_arrayPtr);
129 bool CreateArray(TypeInfo::RawType a_typeID, const BSFixedString& a_className, std::uint32_t a_size, BSTSmartPointer<Array>& a_arrayPtr);
130 bool CreateObject(const BSFixedString& a_className, void* a_property, BSTSmartPointer<Object>& a_objPtr);
131 bool CreateObject(const BSFixedString& a_className, BSTSmartPointer<Object>& a_result);
134 bool DispatchMethodCall(VMHandle a_handle, const BSFixedString& a_className, const BSFixedString& a_fnName, IFunctionArguments* a_args, BSTSmartPointer<IStackCallbackFunctor>& a_result);
135 Awaitable DispatchMethodCall(VMHandle a_handle, const BSFixedString& a_className, const BSFixedString& a_fnName, IFunctionArguments* a_args);
136 Awaitable DispatchStaticCall(const BSFixedString& a_className, const BSFixedString& a_fnName, IFunctionArguments* a_args);
141 bool GetScriptObjectType(const BSFixedString& a_className, BSTSmartPointer<ObjectTypeInfo>& a_outTypeInfoPtr);
143 bool GetScriptObjectTypeNoLoad(const BSFixedString& a_className, BSTSmartPointer<ObjectTypeInfo>& a_typeInfoPtr) const;
145 bool GetVariableValue(const BSTSmartPointer<Object>& a_objPtr, std::uint32_t a_index, Variable& a_out) const;
146 bool GetVariableValue(VMHandle a_handle, const BSFixedString& a_className, std::int32_t a_variableIndex, Variable& a_out) const;
147
148 template <class F>
149 void RegisterFunction(std::string_view a_fnName, std::string_view a_className, F a_callback, bool a_callableFromTasklets = false);
150
151 template <class R, class F>
152 void RegisterLatentFunction(std::string_view a_fnName, std::string_view a_className, F a_callback, bool a_callableFromTasklets = false);
153
154 template <class V>
155 requires is_return_convertible_v<V>
156 void ReturnLatentResult(VMStackID a_stackID, V result);
157
158 void SetCallableFromTasklets(const char* a_className, const char* a_stateName, const char* a_fnName, bool a_callable);
159 void SetCallableFromTasklets(const char* a_className, const char* a_fnName, bool a_callable);
160 void TraceForm(TESForm* a_form, const char* a_str, VMStackID a_stackID, Severity a_severity = Severity::kError);
161 void VTraceStack(VMStackID a_stackID, Severity a_severity, const char* a_fmt, ...);
162
163 // members
164 std::uint32_t pad0C; // 0C
165 };
166 static_assert(sizeof(IVirtualMachine) == 0x10);
167 }
168}
Definition ErrorLogger.h:13
Severity
Definition ErrorLogger.h:19
Definition IFunctionArguments.h:12
Definition IFunction.h:23
Definition ISavePatcherInterface.h:11
Definition IStackCallbackFunctor.h:14
Definition IVirtualMachine.h:40
bool DispatchMethodCall(VMHandle a_handle, const BSFixedString &a_className, const BSFixedString &a_fnName, IFunctionArguments *a_args, BSTSmartPointer< IStackCallbackFunctor > &a_result)
virtual void UpdateTasklets(float a_budget)=0
Awaitable DispatchStaticCall(const BSFixedString &a_className, const BSFixedString &a_fnName, IFunctionArguments *a_args)
virtual const IObjectHandlePolicy * GetObjectHandlePolicy2() const =0
virtual bool FindBoundObject(VMHandle a_handle, const char *a_className, BSTSmartPointer< Object > &a_result) const =0
virtual IObjectHandlePolicy * GetObjectHandlePolicy1()=0
void SetCallableFromTasklets(const char *a_className, const char *a_stateName, const char *a_fnName, bool a_callable)
virtual void SetOverstressed(bool a_set)=0
virtual bool CreateObject1(const BSFixedString &a_className, void *a_property, BSTSmartPointer< Object > &a_objPtr)=0
Awaitable DispatchMethodCall(VMHandle a_handle, const BSFixedString &a_className, const BSFixedString &a_fnName, IFunctionArguments *a_args)
virtual ISavePatcherInterface * GetSavePatcherInterface()=0
virtual void RegisterForLogEvent(BSTEventSink< LogEvent > *a_sink)=0
const IObjectHandlePolicy * GetObjectHandlePolicy() const
virtual bool IsCompletelyFrozen() const =0
virtual void FormatAndPostMessage(const char *a_message, Severity a_severity)=0
virtual bool CreateArray1(const TypeInfo &a_typeInfo, std::uint32_t a_size, BSTSmartPointer< Array > &a_arrayPtr)=0
virtual bool CreateArray2(TypeInfo::RawType a_typeID, const BSFixedString &a_className, std::uint32_t a_size, BSTSmartPointer< Array > &a_arrayPtr)=0
virtual void ReturnFromLatent(VMStackID a_stackID, const Variable &a_val)=0
virtual bool GetScriptObjectType2(VMTypeID a_typeID, BSTSmartPointer< ObjectTypeInfo > &a_outTypeInfoPtr)=0
std::uint32_t pad0C
Definition IVirtualMachine.h:164
virtual void SetLinkedCallback(ITypeLinkedCallback *a_callback)=0
virtual bool DispatchMethodCall2(VMHandle a_handle, const BSFixedString &a_className, const BSFixedString &a_fnName, IFunctionArguments *a_args, BSTSmartPointer< IStackCallbackFunctor > &a_result)=0
virtual bool DispatchStaticCall(const BSFixedString &a_className, const BSFixedString &a_fnName, IFunctionArguments *a_args, BSTSmartPointer< IStackCallbackFunctor > &a_result)=0
bool DispatchMethodCall(BSTSmartPointer< Object > &a_obj, const BSFixedString &a_fnName, IFunctionArguments *a_args, BSTSmartPointer< IStackCallbackFunctor > &a_result)
virtual ObjectBindPolicy * GetObjectBindPolicy1()=0
static constexpr auto VTABLE
Definition IVirtualMachine.h:43
virtual void GetScriptObjectsWithATypeID(BSScrapArray< BSFixedString > &a_classes) const =0
virtual bool GetTypeIDForScriptObject(const BSFixedString &a_className, VMTypeID &a_typeID) const =0
virtual void CalculateFullReloadList(void) const =0
virtual bool GetScriptObjectType1(const BSFixedString &a_className, BSTSmartPointer< ObjectTypeInfo > &a_outTypeInfoPtr)=0
virtual bool GetScriptObjectTypeNoLoad1(const BSFixedString &a_className, BSTSmartPointer< ObjectTypeInfo > &a_typeInfoPtr) const =0
virtual bool DispatchUnboundMethodCall(void)=0
virtual void ResetAllBoundObjects(VMHandle a_handle)=0
virtual void UnregisterForLogEvent(BSTEventSink< LogEvent > *a_sink)=0
void RegisterFunction(std::string_view a_fnName, std::string_view a_className, F a_callback, bool a_callableFromTasklets=false)
Definition NativeFunction.h:174
virtual bool SetPropertyValue(BSTSmartPointer< Object > &a_obj, const char *a_propertyName, Variable &a_setVal)=0
const ObjectBindPolicy * GetObjectBindPolicy() const
virtual void RegisterForStatsEvent(BSTEventSink< StatsEvent > *a_sink)=0
virtual bool CreateObject2(const BSFixedString &a_className, BSTSmartPointer< Object > &a_result)=0
void ReturnLatentResult(VMStackID a_stackID, V result)
Returns a result to the stack if it is waiting for a latent function to return. This is a wrapper ove...
Definition NativeLatentFunction.h:105
IObjectHandlePolicy * GetObjectHandlePolicy()
virtual void Update(float a_budget)=0
bool GetVariableValue(const BSTSmartPointer< Object > &a_objPtr, std::uint32_t a_index, Variable &a_out) const
bool GetScriptObjectType(VMTypeID a_typeID, BSTSmartPointer< ObjectTypeInfo > &a_outTypeInfoPtr)
bool CreateObject(const BSFixedString &a_className, BSTSmartPointer< Object > &a_result)
virtual void MoveBoundObjects(VMHandle a_from, VMHandle a_to)=0
virtual bool RegisterObjectType(VMTypeID a_typeID, const char *a_className)=0
virtual void SetCallableFromTasklets1(const char *a_className, const char *a_stateName, const char *a_fnName, bool a_callable)=0
virtual bool IsWaitingOnLatent(VMStackID a_stackID) const =0
virtual void ForEachBoundObject(VMHandle a_handle, IForEachScriptObjectFunctor *a_functor)=0
virtual void UnregisterForStatsEvent(BSTEventSink< StatsEvent > *a_sink)=0
bool GetScriptObjectTypeNoLoad(const BSFixedString &a_className, BSTSmartPointer< ObjectTypeInfo > &a_typeInfoPtr) const
Awaitable DispatchMethodCall(BSTSmartPointer< Object > &a_obj, const BSFixedString &a_fnName, IFunctionArguments *a_args)
virtual bool TypeIsValid(const BSFixedString &a_className)=0
virtual bool GetScriptObjectTypeNoLoad2(VMTypeID a_typeID, BSTSmartPointer< ObjectTypeInfo > &a_outTypeInfoPtr) const =0
virtual bool ReloadType(const char *a_className)=0
virtual bool GetVariableValue1(const BSTSmartPointer< Object > &a_objPtr, std::uint32_t a_index, Variable &a_out) const =0
virtual bool CastObject(const BSTSmartPointer< Object > &a_fromObjPtr, const BSTSmartPointer< ObjectTypeInfo > &a_toTypeInfoPtr, BSTSmartPointer< Object > &a_toObjPtr)=0
virtual bool BindNativeMethod(IFunction *a_fn)=0
virtual bool GetParentNativeType(const BSFixedString &a_className, BSTSmartPointer< ObjectTypeInfo > &a_typeInfoPtr)=0
bool GetScriptObjectTypeNoLoad(VMTypeID a_typeID, BSTSmartPointer< ObjectTypeInfo > &a_outTypeInfoPtr) const
virtual void SendEvent(VMHandle a_handle, const BSFixedString &a_eventName, IFunctionArguments *a_args)=0
virtual void TraceStack(const char *a_str, VMStackID a_stackID, Severity a_severity=Severity::kError)=0
virtual const ObjectBindPolicy * GetObjectBindPolicy2() const =0
bool CreateArray(TypeInfo::RawType a_typeID, const BSFixedString &a_className, std::uint32_t a_size, BSTSmartPointer< Array > &a_arrayPtr)
virtual void SetCallableFromTasklets2(const char *a_className, const char *a_fnName, bool a_callable)=0
void TraceForm(TESForm *a_form, const char *a_str, VMStackID a_stackID, Severity a_severity=Severity::kError)
virtual ErrorLogger * GetErrorLogger()=0
static constexpr auto RTTI
Definition IVirtualMachine.h:42
ObjectBindPolicy * GetObjectBindPolicy()
void SetCallableFromTasklets(const char *a_className, const char *a_fnName, bool a_callable)
void VTraceStack(VMStackID a_stackID, Severity a_severity, const char *a_fmt,...)
virtual bool DispatchMethodCall1(BSTSmartPointer< Object > &a_obj, const BSFixedString &a_fnName, IFunctionArguments *a_args, BSTSmartPointer< IStackCallbackFunctor > &a_result)=0
bool GetScriptObjectType(const BSFixedString &a_className, BSTSmartPointer< ObjectTypeInfo > &a_outTypeInfoPtr)
bool CreateObject(const BSFixedString &a_className, void *a_property, BSTSmartPointer< Object > &a_objPtr)
bool GetVariableValue(VMHandle a_handle, const BSFixedString &a_className, std::int32_t a_variableIndex, Variable &a_out) const
virtual bool GetPropertyValue(BSTSmartPointer< Object > &a_obj, const char *a_propertyName, Variable &a_getVal)=0
void RegisterLatentFunction(std::string_view a_fnName, std::string_view a_className, F a_callback, bool a_callableFromTasklets=false)
Registers a latent function. Unlike normal native functions, latent functions do not return a result ...
Definition NativeLatentFunction.h:88
virtual void TasksToJobs(BSJobs::JobList &a_jobList)=0
virtual bool GetVariableValue2(VMHandle a_handle, const BSFixedString &a_className, std::int32_t a_variableIndex, Variable &a_out) const =0
bool CreateArray(const TypeInfo &a_typeInfo, std::uint32_t a_size, BSTSmartPointer< Array > &a_arrayPtr)
virtual void SendEventAll(const BSFixedString &a_eventName, IFunctionArguments *a_args)=0
Definition BSScriptObjectBindPolicy.h:16
Definition TypeInfo.h:10
RawType
Definition TypeInfo.h:13
Definition Variable.h:15
Definition BSTArray.h:378
Definition BSTEvent.h:143
Definition BSTSmartPointer.h:37
Definition TESForm.h:40
Definition AbsorbEffect.h:6
constexpr REL::ID RTTI_BSScript__IVirtualMachine(static_cast< std::uint64_t >(691836))
constexpr std::array< REL::ID, 1 > VTABLE_BSScript__IVirtualMachine
Definition Offsets_VTABLE.h:9464
std::uint32_t VMTypeID
Definition BSCoreTypes.h:9
std::uint32_t VMStackID
Definition BSCoreTypes.h:8
std::uint64_t VMHandle
Definition BSCoreTypes.h:7
Definition BSIntrusiveRefCounted.h:8
Definition IObjectHandlePolicy.h:13
Variable result
Definition IVirtualMachine.h:54
std::coroutine_handle continuation
Definition IVirtualMachine.h:55
void SetObject(const BSTSmartPointer< Object > &) override
Definition IVirtualMachine.h:51
Definition IVirtualMachine.h:47
void await_suspend(std::coroutine_handle<> a_handle)
void SetPending(bool a_pending=true)
BSTSmartPointer< IStackCallbackFunctor > callback
Definition IVirtualMachine.h:64