Files
2024-10-03 16:29:54 +02:00

153 lines
4.9 KiB
VB.net

Imports System
Imports System.Diagnostics
Imports System.IO
Imports KeraLua
Imports Effector.Plugin.Interface
Public Module LuaManager
Private m_state As Lua
Friend ReadOnly Property state As Lua
Get
Return m_state
End Get
End Property
Friend Function SetGlobVar(sName As String, bValue As Boolean) As Boolean
Return Lua_Aux.LuaSetGlobVar(m_state, sName, bValue)
End Function
Friend Function SetGlobVar(sName As String, nValue As Integer) As Boolean
Return Lua_Aux.LuaSetGlobVar(m_state, sName, nValue)
End Function
Friend Function SetGlobVar(sName As String, dValue As Double) As Boolean
Return Lua_Aux.LuaSetGlobVar(m_state, sName, dValue)
End Function
Friend Function SetGlobVar(sName As String, sValue As String) As Boolean
Return Lua_Aux.LuaSetGlobVar(m_state, sName, sValue)
End Function
Friend Function GetGlobVar(sName As String, ByRef bValue As Boolean) As Boolean
Return Lua_Aux.LuaGetGlobVar(m_state, sName, bValue)
End Function
Friend Function GetGlobVar(sName As String, ByRef nValue As Integer) As Boolean
Return Lua_Aux.LuaGetGlobVar(m_state, sName, nValue)
End Function
Friend Function GetGlobVar(sName As String, ByRef dValue As Double) As Boolean
Return Lua_Aux.LuaGetGlobVar(m_state, sName, dValue)
End Function
Friend Function GetGlobVar(sName As String, ByRef sValue As String) As Boolean
Return Lua_Aux.LuaGetGlobVar(m_state, sName, sValue)
End Function
Friend Function CreateGlobTable(sName As String) As Boolean
Return Lua_Aux.LuaCreateGlobTable(m_state, sName)
End Function
Public Function ExecFile(ByVal sPath As String) As Boolean
' verifico ambiente lua
If IsNothing(m_state) Then Return False
' eseguo la linea
Dim result As LuaStatus = m_state.LoadFile(sPath)
Dim sError As String = String.Empty
If result <> LuaStatus.OK Then
sError = m_state.ToString(1)
EgtOutLog("Fail loading file: " & sPath & "ERROR:" & sError)
End If
result = m_state.PCall(0, -1, 0)
If result <> LuaStatus.OK Then
sError = m_state.ToString(1)
m_state.Pop(1)
EgtOutLog("Fail calling file: " & sPath & " ERROR: " & If(String.IsNullOrWhiteSpace(sError), "Unknown", sError))
End If
Return result = LuaStatus.OK
End Function
Public Function ExecLuaFunction(ByVal sName As String, nReturns As Integer, Params() As Object) As Boolean
' recupero la funzione
If Not sName.Contains("."c) Then
' e' direttamente la funzione
m_state.GetGlobal(sName)
Else
' e' in una table
Dim sTableName As String = "", sFunctionName As String = ""
Dim sParams() As String = sName.Split("."c)
sTableName = sParams(0)
sFunctionName = sParams(1)
m_state.GetGlobal(sTableName)
If Not m_state.IsTable(-1) Then Return False
m_state.GetField(-1, sFunctionName)
' porto la funzione uno slot sotto e diminuisco lo stack di uno (per essere come caso sopra)
m_state.Copy(-1, -2)
m_state.Pop(1)
End If
Dim nParamCount = 0
If Not IsNothing(Params) Then
' numero di parametri
nParamCount = Params.Count()
' inserisco i parametri sullo stack
For Each Param In Params
Select Case Param.GetType()
Case GetType(Boolean)
m_state.PushBoolean(CBool(Param))
Case GetType(Integer)
m_state.PushInteger(CInt(Param))
Case GetType(Double)
m_state.PushNumber(CDbl(Param))
Case GetType(String)
m_state.PushString(CStr(Param))
End Select
Next
End If
' eseguo la chiamata
Dim result As LuaStatus = m_state.PCall(nParamCount, -1, 0)
' senza errori
If result = LuaStatus.OK Then
Return True
Else
' recupero il messaggio di errore
Dim sError As String = m_state.ToString(-1)
m_state.Pop(1)
EgtOutLog("Fail calling function: " & sName & " ERROR: " & sError)
Return False
End If
End Function
Public Function Init() As Boolean
' se già aperto, lo fermo per riavviarlo
If Not IsNothing(m_state) Then
m_state.Close()
m_state = Nothing
End If
' inizializzo Lua
m_state = New Lua()
If IsNothing(m_state) Then
EgtOutLog("Error in Lua interpreter starting (LuaManager.Init)")
Return False
End If
' carico le librerie standard
m_state.OpenLibs()
If Not LuaInstallGeneral(m_state) Then
Return False
End If
Return True
End Function
Public Function Close() As Boolean
' verifico ambiente lua
If IsNothing(m_state) Then Return False
' termino Lua
m_state.Close()
m_state = Nothing
Return True
End Function
End Module