Search code examples
vb.neteventslualuainterface

Remove one event that may be exactly like the others in VB.net


I'm creating a system in VB.net that utilizes Lua via the LuaInterface.

To associate an event in Lua with a function, I can simply do this:

RegisterEvent("tick", function(nt)
    if not lcc then return end
        if nt>=tt then
            f()
            lcc=false
        end
    end)

As you can see, I currently am using the lcc variable to 'cancel' the function. This is kind of hacked up, and the function will still be called causing unneeded overhead. This is what my 'RegisterEvent' sub looks like in my VB.net

Public Sub RegisterEvent(ByVal eventName As String, ByVal func As LuaFunction)
    Select Case eventName.ToLower
        Case "keydown"
            AddHandler Me.event_keydown, AddressOf func.Call
        Case "keyup"
            AddHandler Me.event_keyup, AddressOf func.Call
        Case "mousedown"
            AddHandler Me.event_mousedown, AddressOf func.Call
        Case "mouseup"
            AddHandler Me.event_mouseup, AddressOf func.Call
        Case "ready"
            AddHandler Me.event_ready, AddressOf func.Call
        Case "tick"
            AddHandler Me.event_tick, AddressOf func.Call
        Case "frame"
            AddHandler Me.event_frame, AddressOf func.Call
    End Select
End Sub

I would like to do something like this in my Lua:

local lcc=RegisterEvent("tick", function(nt)
    print("The Ticks Are Now At: "..nt)
    if nt>5000 then
        DisconnectEvent(lcc)
    end
end)

The problem is, I'm not sure how I should change my RegisterEvent Function/Sub and how I should make the DisconnectEvent.

Thanks for any help. I know this is kind of annoying to try and understand what I'm trying to say. Feel free to post a comment asking for clarification. I'll be more than willing to try and explain it to the best of my abilities. If the LuaInterface has some kind of native way of handling this, I'm open to that as well :)

Anything at all to help is great!


Solution

  • Correct me if I'm wrong. You might have to use Dictionary(of String,boolean) to determine an event has been attached or not.

    Dim eventDict As New Dictionary(Of String, Boolean)
    
    Public Sub RegisterEvent(ByVal eventName As String, ByVal func As LuaFunction)
        Select Case eventName.ToLower
            Case "keydown"
               If Not eventDict.ContainsKey(eventName) Then
                    eventDict.Add(eventName,false)
               End If
               if eventDict(eventName) Then
                    RemoveHandler Me.event_keydown, AddressOf func.Call
                    eventDict(eventName)=false
               Else 
                    eventDict(eventName)=true
                    AddHandler Me.event_keydown, AddressOf func.Call
               End If
         ...
    End sub