Hello again,
I'm posting a example script for accessing C# (Mono) namespace and methods from Lua in a simple script. I had a rough time finding examples of how to do this and wanted to try to save others effort in locating a simple example of how to walk name spaces, classes, and instances to invoke methods against the Mono features of Cheat Engine. It's such a rich and killer program, but it's also extremely complex for someone new to injecting into Mono (C#).
Here's the script:
[CODE]LaunchMonoDataCollector()
the_class = 0
the_method = 0
method_name = ""
klasses = {}
function class_scan_and_invoke()
for n, klass in ipairs(klasses) do
invoke_me = klasses[n]
--invoke_me = klasses[0]
print("Invoke Address: ", invoke_me)
the_instance=getAddressSafe(invoke_me)
-- params=mono_method_get_parameters(the_method)
--for m, param_name in ipairs(params) do
--print("Param Name: ", params[0].name)
--if params[m].type == MONO_TYPE_BOOLEAN then
-- print("Param Type: boolean")
print("building parameters")
-- Remember that the args array is 1 based, not 0 based.
args={}
args[1]={}
args[1].type=vtByte
args[1].value = 1
--result = mono_invoke_method(nil, the_method, the_instance, args)
result = mono_invoke_method(nil, the_method, the_instance, args)
print("Method invoked, result: ", result)
--end
--end
end
end
function mem_scan_done(m)
print("Scan completed. Running complete method.")
for k,v in pairs(klasses) do klasses[k]=nil end
print("1.")
local fl=createFoundList(m)
print("2.")
fl.initialize()
print("3.")
local i
for i=0, fl.Count-1 do
print("new klasses: ", fl[i])
table.insert(klasses, fl[i])
end
fl.destroy()
m.destroy()
class_scan_and_invoke()
end
function enable_BattleTech_debug()
local assems = mono_enumAssemblies()
for i, addr in ipairs(assems) do
-- print ("Addr", addr)
local image = mono_getImageFromAssembly(addr)
local img_name = mono_image_get_name(image)
-- print( "Image: ", img_name)
if (img_name == "Assembly-CSharp") then
print("Got Assembly-CSharp image!")
local classes = mono_image_enumClasses(image)
for j, cls_addr in ipairs(classes) do
if classes[j].namespace == "HBS.DebugConsole" then
if classes[j].classname == "DebugConsole" then
the_class = classes[j].class
print("Found Target Class and Namespace")
print("Class NS: ", classes[j].namespace)
print("Class Name: ", classes[j].classname)
local methods = mono_class_enumMethods(the_class)
for k, method_name in ipairs(methods) do
if methods[k].name == "set_DebugCommandsUnlocked" then
the_method = methods[k].method
method_name = methods[k].name
print("Method Name: ", methods[k].name)
--print("Lock on set_DebugCommandsUnlocked at: ", the_method)
-- mono_class_findInstancesOfClass(c, method_name, mem_scan_done(m))
klasses = mono_class_findInstancesOfClassListOnly(nil, the_class)
class_scan_and_invoke()
end
end
end
end
end
end
end
end
enable_BattleTech_debug()
[/CODE]
Hope this helps someone!
-Phorkus
Cheat Engine Lua Scripting for Mono Example for BattleTech
Who is online
Users browsing this forum: No registered users