Mono Helper Project
Mono Helper Project
Update 2024-02-25 - Cheat Engine 7.5.2, better instructions, simple quick start
* Source: [Link]
* Raft Tutorial: [Link]
To just use it, download the 'Dev.CT' file and activate the 'MonoHelper' table entry while attached to a game that uses mono, or copy the table entry and paste it into your own script. When activated, there will be a new 'Mono->Search' menu item letting you search an image (default to 'Assembly-CSharp' if present) for any classes, fields, and methods containing your search text. Double-clicking opens a 'Class' window showing fields and methods and letting you easily hook those methods.
Known bugs:
* Sometimes it doesn't show all the classes/methods/fields for a name, i.e. typing 'Play' will show 'PlayerStats' class but when you keep typing and add the 'e' it no longer shows up... Hard to track down
* If a class won't open when double-clicking on search results, close the current class window and retry
* Source: [Link]
* Raft Tutorial: [Link]
To just use it, download the 'Dev.CT' file and activate the 'MonoHelper' table entry while attached to a game that uses mono, or copy the table entry and paste it into your own script. When activated, there will be a new 'Mono->Search' menu item letting you search an image (default to 'Assembly-CSharp' if present) for any classes, fields, and methods containing your search text. Double-clicking opens a 'Class' window showing fields and methods and letting you easily hook those methods.
Known bugs:
* Sometimes it doesn't show all the classes/methods/fields for a name, i.e. typing 'Play' will show 'PlayerStats' class but when you keep typing and add the 'e' it no longer shows up... Hard to track down
* If a class won't open when double-clicking on search results, close the current class window and retry
- Attachments
-
- Dev.CT
- (73.91 KiB) Downloaded 165 times
Last edited by jgoemat on Sun Feb 25, 2024 8:34 pm, edited 5 times in total.
Re: Mono Helper Project
If you do a search on the CEF for "cheat engine form to lua" there's a script to convert forms to lua scripts.
Re: Mono Helper Project
Using cheat engine 7,with the monohelper scripts, cheat engine spits out errors, particularly "Attempt to index a nil value" (global mono) as well as a few other nil values and when I try to use the search under mono its: Error:C:\Program Files\Cheat Engine 7.0\autorun\monomenu.lua:23: attempt to call a nil value (method 'show') and nothing works. Its a shame because the stuff looks pretty cool.
Re: Mono Helper Project
@gideon25 Looks like you put the scripts in the cheat engine autorun directory, but they're set to be run from the directory with the cheat table, and the forms have to be in the table too. That might be the reason...
UPDATE
I updated the repo, now it has 'autorun/monohelper.lua' drop the file in your cheat engine autorun folder and it should work (it does for me). Let me know if you get any errors. Now it creates a separate menu 'Mono Search' when a mono game is loaded, using the same code that CE's mono code uses.
UPDATE
I updated the repo, now it has 'autorun/monohelper.lua' drop the file in your cheat engine autorun folder and it should work (it does for me). Let me know if you get any errors. Now it creates a separate menu 'Mono Search' when a mono game is loaded, using the same code that CE's mono code uses.
Re: Mono Helper Project
This is an old script I am used, just a little modified to generated an LFM file.
How to use:
1. Save the script above as a CT file
2. Open with CE (I am use CE 7.0)
3. A LOL form will appear (just ignore it for now)
4. Create your form using CE Form Designer
5. Once you finish, click 'Generate Form Lua Script' on the LOL form
6. Done
7. Check your LFM file on the folder where you start LOL form
Note:
In case if you add 'CheckListBox' and/or 'ScrollBox' on your form within CE form designer then check your LFM form
and change 'createTCECheckListBox' to 'createListBox' and 'createTCEScrollBox' to 'createScrollBox'.
I think 'createScrollBox' not work since CE 6.4 till the latest CE version. You can add a scrollbox via a Lua function:
TODO:
You also able to add a function on the main script which searches inside the generated LFM file for strings 'createTCECheckListBox' then change to 'createListBox' and strings 'createTCEScrollBox' and change to 'createScrollBox'.
Good luck
Code: Select all
--c = getMainForm()
--c.Visible = false
local path = TrainerOrigin or getMainForm()
if moduleForm then moduleForm.Destroy() end
moduleForm = createForm()
moduleForm.setSize(200,50)
moduleForm.borderStyle = 'bsSingle'
moduleForm.Caption = 'LOL'
bgen = createButton(moduleForm)
bgen.setSize(180,30)
bgen.setPosition(10,10)
bgen.Caption = 'Generate Lua Form Script'
function TranslateToFunction(Str, parent)
if (type(Str) ~= 'string') then error('Not valid type'); end;
local action = 'create' .. string.gsub(Str, 'TCE', '')
if ( Str == 'TTabSheet' and parent and object_getClassName(parent) == 'TCEPageControl') then
action = parent.getName() .. '.addTab()';
end
return action
end
function GenerateLuaScript(WantedForm)
Form = WantedForm
FormToLua = {}
FormToLua.MainForm = {}
CompCount = Form.getComponentCount()
FormToLua.MainForm.name = Form.getName()
FormToLua.MainForm.caption = Form.Caption
FormToLua.MainForm.left = Form.Left
FormToLua.MainForm.top = Form.Top
FormToLua.MainForm.width = Form.Width
FormToLua.MainForm.height = Form.Height
FormToLua.MainForm.align = Form.Align
FormToLua.MainForm.enabled = tostring(Form.Enabled)
FormToLua.MainForm.visible = control_getVisible(Form) and 'true' or 'false'
for i=1,CompCount do
i = i-1
FormToLua[i] = {}
Object = UDF1.getComponent(i)
FormToLua[i].Object_parent = Object.Parent.getName()
FormToLua[i].Object_type = TranslateToFunction(object_getClassName(Object), Object.Parent) or error("No object type???");
FormToLua[i].Object_name = Object.getName() or false
FormToLua[i].Object_caption = Object.caption or false
FormToLua[i].Object_left = Object.Left or false
FormToLua[i].Object_top = Object.Top or false
FormToLua[i].Object_width = Object.Width or false
FormToLua[i].Object_height = Object.Height or false
FormToLua[i].Object_align = Object.Align or false
FormToLua[i].Object_enabled = Object.Enabled and 'true' or false
FormToLua[i].Object_visible = control_getVisible(Object) and 'true' or false
FormToLua[i].IsTab = object_getClassName(Object) == 'TTabSheet';
-- FormToLua[i].Object_color = tostring(Object.Color)
-- FormToLua[i].Object_font = tostring(Object.Font)
end
GenerateScript = [[--Creates first the form
]] .. FormToLua.MainForm.name .. [[ = createForm(]] .. FormToLua.MainForm.visible .. [[)
]] .. FormToLua.MainForm.name .. [[.caption = ]] .. "[[" .. FormToLua.MainForm.caption .. "]]" .. [[
]] .. FormToLua.MainForm.name .. [[.left = ]] .. FormToLua.MainForm.left .. [[
]] .. FormToLua.MainForm.name .. [[.top = ]] .. FormToLua.MainForm.top .. [[
]] .. FormToLua.MainForm.name .. [[.width = ]] .. FormToLua.MainForm.width .. [[
]] .. FormToLua.MainForm.name .. [[.height = ]] .. FormToLua.MainForm.height .. [[
]] .. FormToLua.MainForm.name .. [[.align = ]] .. FormToLua.MainForm.align .. [[
]] .. FormToLua.MainForm.name .. [[.enabled = ]] .. FormToLua.MainForm.enabled .. [[
]] .. FormToLua.MainForm.name .. [[.visible = ]] .. FormToLua.MainForm.visible
local f = assert(io.open(path..FormToLua.MainForm.name..'.LFM', "w"))
for line in string.gfind (GenerateScript,"[^\n]+") do
f:write(line, "\n")
print(line)
end
TempText = [[-- Creating the objects]]
for i = 1, CompCount do
i = i-1
TempText = TempText ..[[
]] .. (FormToLua[i].IsTab and FormToLua[i].Object_name .. [[ = ]] .. FormToLua[i].Object_type or FormToLua[i].Object_name .. [[ = ]] .. FormToLua[i].Object_type .. [[(]] .. FormToLua[i].Object_parent .. [[)]]) .. [[
]] .. ((FormToLua[i].Object_caption == false) and '' or FormToLua[i].Object_name .. [[.caption = ]] .. "[[" .. FormToLua[i].Object_caption .. "]]") .. [[
]] .. ((FormToLua[i].Object_left == false) and '' or FormToLua[i].Object_name .. [[.left = ]] .. "[[" .. FormToLua[i].Object_left .. "]]") .. [[
]] .. ((FormToLua[i].Object_top == false) and '' or FormToLua[i].Object_name .. [[.top = ]] .. "[[" .. FormToLua[i].Object_top .. "]]") .. [[
]] .. ((FormToLua[i].Object_width == false) and '' or FormToLua[i].Object_name .. [[.width = ]] .. "[[" .. FormToLua[i].Object_width .. "]]") .. [[
]] .. ((FormToLua[i].Object_height == false) and '' or FormToLua[i].Object_name .. [[.height = ]] .. "[[" .. FormToLua[i].Object_height .. "]]") .. [[
]] .. ((FormToLua[i].Object_align == false) and '' or FormToLua[i].Object_name .. [[.align = ]] .. "[[" .. FormToLua[i].Object_align .. "]]") .. [[
]] .. ((FormToLua[i].Object_enabled == false) and '' or FormToLua[i].Object_name .. [[.enabled = ]] .. "[[" .. FormToLua[i].Object_enabled .. "]]") .. [[
]] .. ((FormToLua[i].Object_visible == false) and '' or FormToLua[i].Object_name .. [[.visible = ]] .. "[[" .. FormToLua[i].Object_visible .. "]]")
end
for line in string.gfind (TempText,"[^\n]+") do
if (line~= '' and #line > 1) then
f:write(line, "\n")
print(line)
end
end
f:write(FormToLua.MainForm.name..'Show()')
f:close()
end
local mess = [[
Enter FORM NAME you has been created
using CE form designer
]]
function Start()
CEToLua = createForm(false)
CEToLua.height = 70
CEToLua.width = 240
CEToLua.caption = "Generator"
CEToLuaButton = createButton(CEToLua)
CEToLuaButton.caption = "Generate"
CEToLuaButton.height = 20
CEToLuaButton.width = 60
CEToLuaButton.top = 2
CEToLuaButton.left = 178
CEToLuaLabel = createLabel(CEToLua)
CEToLuaLabel.setPosition(5,33)
CEToLuaLabel.Caption = mess
CEToLuaEdit = createEdit(CEToLua)
CEToLuaEdit.width = 174
CEToLuaEdit.left = 2
CEToLuaEdit.top = 2
CEToLuaEdit.Caption = ""
CEToLuaButton.onClick = function ()
a = CEToLuaEdit.Text
if a == "" or a == nil then
showMessage("Form name can not be empty")
return a
end
loadstring([[test = (]] .. a .. [[ or nil) -- Defines test as a form]])()
a = nil
if (type(test)~="userdata") then
test = nil
CEToLuaEdit.Caption = ""
showMessage("Sorry but this is not a valid form!")
return
end
GenerateLuaScript(test)
test = nil
CEToLua.hide()
moduleForm.Show()
--crdr.Visible = true
end
CEToLua.centerScreen()
end
Start()
function CETrainerToLua()
moduleForm.Hide()
if CEToLua.getVisible() then
CEToLua.hide()
else
CEToLua.show()
end
end
function canceled()
CEToLua.hide()
moduleForm.Show()
return caFree
end
function loader()
c = getMainForm()
c.Visible = false
end
function clearance()
closeCE()
return caFree
end
--moduleForm.onShow = loader
moduleForm.Show()
moduleForm.onClose = clearance
bgen.onClick = CETrainerToLua
CEToLua.onClose = canceled
1. Save the script above as a CT file
2. Open with CE (I am use CE 7.0)
3. A LOL form will appear (just ignore it for now)
4. Create your form using CE Form Designer
5. Once you finish, click 'Generate Form Lua Script' on the LOL form
6. Done
7. Check your LFM file on the folder where you start LOL form
Note:
In case if you add 'CheckListBox' and/or 'ScrollBox' on your form within CE form designer then check your LFM form
and change 'createTCECheckListBox' to 'createListBox' and 'createTCEScrollBox' to 'createScrollBox'.
I think 'createScrollBox' not work since CE 6.4 till the latest CE version. You can add a scrollbox via a Lua function:
Code: Select all
function createScrollBox(Parent)
local box = createComponentClass('TScrollBox', Parent)
box.Parent = Parent
return box
end
-- and use with, example:
myscbox = createScrollBox(form_name)
You also able to add a function on the main script which searches inside the generated LFM file for strings 'createTCECheckListBox' then change to 'createListBox' and strings 'createTCEScrollBox' and change to 'createScrollBox'.
Good luck
Re: Mono Helper Project
Thanks! However I get this error when I open cheat engine:jgoemat wrote: ↑Sun Feb 16, 2020 7:14 am@gideon25 Looks like you put the scripts in the cheat engine autorun directory, but they're set to be run from the directory with the cheat table, and the forms have to be in the table too. That might be the reason...
UPDATE
I updated the repo, now it has 'autorun/monohelper.lua' drop the file in your cheat engine autorun folder and it should work (it does for me). Let me know if you get any errors. Now it creates a separate menu 'Mono Search' when a mono game is loaded, using the same code that CE's mono code uses.
Right now I only have the monohelper from your autorun in my the autorun folder. Cheat Engine 7.0
Re: Mono Helper Project
Sorry, try the most recent version. I had some code still in it used to load the separate files. Here's the script by itself, password is 'ce'
Re: Mono Helper Project
Ok, no errors and I can see the monosearch menu at the top. So I select Mono Search, then search and I select the Assembly-Csharp. It says "initializing fields and methods" with a green bar that fills then disappears. No other window/menu pops up or anything. It just disappears. Do I need some other files or something to go with that monohelper?
Re: Mono Helper Project
Does another window actually pop-up off screen? That happens to me and I can't figure out why, but I figured it had something to do with my multi-monitor setup. Try hitting ALT+SPACE, then 'm' to move the window. Hit left arrow key and then use the mouse to place the window. Sorry for the trouble, but I don't know why the windows are appearing that way.
Re: Mono Helper Project
Yea, no multiple monitors or any thing. Had DExpot buy uninstalled and rebooted. Then tried everything from changing the scaling thru Nvidia to a number of windows fixes (use cascade all windows, et) that SHOULD show the window if it exists at all. No dice. Bummer.jgoemat wrote: ↑Thu Mar 05, 2020 12:15 amDoes another window actually pop-up off screen? That happens to me and I can't figure out why, but I figured it had something to do with my multi-monitor setup. Try hitting ALT+SPACE, then 'm' to move the window. Hit left arrow key and then use the mouse to place the window. Sorry for the trouble, but I don't know why the windows are appearing that way.
Re: Mono Helper Project
I've updated on 1/4/2021 after having time over the holidays to do some cleanup. Check the actual post where there are direct links to the script and an attached table so you don't have to add it to your autorun directory. Also fixed the window not appearing on screen bug and made a few other cosmetic changes. No need to clone the repository now which I think caused a lot of confusion with my lua files all over the place. Now the source lua is all in 'lua', there's a 'Build' directory for me to use, and a 'Dev.CT' table with a nice menu for doing the build for me.
Re: Mono Helper Project
Yes, works great now. Thanks.. Keep at it, its quick and less clunky than the new .Net viewer in 7.2. Add all the stuff and tools you can think of that would be useful into it! Its all good
Re: Mono Helper Project
Very nice thanks for sharing
Re: Mono Helper Project
Wow, this is really cool. Haven't fully figured it out yet, but it's incredibly helpful
Who is online
Users browsing this forum: No registered users