Cheat Engine Forum Index Cheat Engine
The Official Site of Cheat Engine
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 


Copy all Class names and first-level Field names

 
Post new topic   Reply to topic    Cheat Engine Forum Index -> Cheat Engine Lua Scripting
View previous topic :: View next topic  
Author Message
etioplmld
Advanced Cheater
Reputation: 0

Joined: 09 Feb 2021
Posts: 89

PostPosted: Tue Sep 01, 2026 6:45 pm    Post subject: Copy all Class names and first-level Field names Reply with quote

Improve the "net info" function and export these so that AI can search for valuable data.Code generated by AI
add to dotnetinfo.lua
Code:

-- ============================================================
-- Copy all Class names + first-level Field names to TXT
-- ============================================================

frmDotNetInfo.btnCopyAllFields=createButton(frmDotNetInfo.gbClasses)
frmDotNetInfo.btnCopyAllFields.Caption='复制所有地址名'
frmDotNetInfo.btnCopyAllFields.Width=230
frmDotNetInfo.btnCopyAllFields.Height=25

-- 与“复制当前显示 Classes”按钮并排
frmDotNetInfo.btnCopyAllFields.AnchorSideLeft.Control=frmDotNetInfo.btnCopyClasses
frmDotNetInfo.btnCopyAllFields.AnchorSideLeft.Side=asrRight
frmDotNetInfo.btnCopyAllFields.AnchorSideTop.Control=frmDotNetInfo.btnCopyClasses
frmDotNetInfo.btnCopyAllFields.AnchorSideTop.Side=asrTop
frmDotNetInfo.btnCopyAllFields.BorderSpacing.Left=8


frmDotNetInfo.btnCopyAllFields.OnClick=function(sender)

  -- ==========================================================
  -- 获取当前显示的 Classes
  -- ==========================================================

  local classes={}

  if frmDotNetInfo.FilteredClassList then

    -- 有过滤条件:使用当前过滤后的 Classes
    for i=1,#frmDotNetInfo.FilteredClassList do

      local Class=frmDotNetInfo.FilteredClassList[i]

      if Class then
        table.insert(classes,Class)
      end

    end

  else

    -- 没有过滤条件:使用当前 Assembly 的全部 Classes
    local Domain=
      DataSource.Domains[
        frmDotNetInfo.lbDomains.ItemIndex+1
      ]

    if not Domain then
      showMessage('没有选择 Domain')
      return
    end

    local Image=
      Domain.Images[
        frmDotNetInfo.lbImages.ItemIndex+1
      ]

    if not Image then
      showMessage('没有选择 Assembly')
      return
    end

    if not Image.Classes then
      showMessage('当前 Assembly 的 Classes 尚未加载完成')
      return
    end

    for i=1,#Image.Classes do

      local Class=Image.Classes[i]

      if Class then
        table.insert(classes,Class)
      end

    end

  end


  if #classes==0 then
    showMessage('没有找到 Classes')
    return
  end


  -- ==========================================================
  -- 创建进度窗口
  -- ==========================================================

  local progressForm=createForm(false)

  progressForm.Caption='正在读取 Classes 和地址名'
  progressForm.Width=500
  progressForm.Height=150
  progressForm.Position='poScreenCenter'
  progressForm.BorderStyle='bsDialog'

  local progressLabel=createLabel(progressForm)
  progressLabel.Left=20
  progressLabel.Top=20
  progressLabel.Width=450
  progressLabel.Caption='准备开始...'

  local progressBar=createProgressBar(progressForm)
  progressBar.Left=20
  progressBar.Top=55
  progressBar.Width=450
  progressBar.Height=25
  progressBar.Min=0
  progressBar.Max=#classes
  progressBar.Position=0

  local countLabel=createLabel(progressForm)
  countLabel.Left=20
  countLabel.Top=90
  countLabel.Width=450
  countLabel.Caption='0 / '..#classes

  progressForm.Show()


  -- ==========================================================
  -- 结果缓存
  -- ==========================================================

  local result={}

  local currentIndex=1

  local timer=createTimer(nil)

  -- 每次处理多少个 Class
  -- 数值越大速度越快,但窗口响应越差
  local batchSize=10


  timer.Interval=10


  timer.OnTimer=function(timer)

    local batchEnd=
      math.min(
        currentIndex+batchSize-1,
        #classes
      )


    for i=currentIndex,batchEnd do

      local Class=classes[i]

      if Class and Class.FullName then

        -- ------------------------------------------------------
        -- Class 名称
        -- ------------------------------------------------------

        table.insert(
          result,
          Class.FullName
        )


        -- ------------------------------------------------------
        -- 获取这个 Class 的一级 Fields
        --
        -- 直接使用 CE 现有的 getClassFields()
        -- 不递归展开 Field 对象
        -- ------------------------------------------------------

        local fields=nil

        local ok,ret=
          pcall(
            function()
              return getClassFields(Class)
            end
          )

        if ok then
          fields=ret
        end


        if fields then

          for j=1,#fields do

            local Field=fields[j]

            if Field and Field.Name then

              -- 两个空格
              table.insert(
                result,
                '  '..Field.Name
              )

            end

          end

        end

      end


      -- Class 之间空一行
      table.insert(result,'')

    end


    currentIndex=batchEnd+1

    progressBar.Position=batchEnd

    countLabel.Caption=
      tostring(batchEnd)..' / '..tostring(#classes)

    if classes[batchEnd] and classes[batchEnd].FullName then
      progressLabel.Caption=
        '正在读取: '..classes[batchEnd].FullName
    end


    -- ========================================================
    -- 全部完成
    -- ========================================================

    if currentIndex>#classes then

      timer.destroy()
      progressForm.close()


      -- ------------------------------------------------------
      -- 创建保存对话框
      -- ------------------------------------------------------

      local saveDialog=createSaveDialog()

      saveDialog.Title='保存 Classes 和地址名'
      saveDialog.Filter=
        '文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*'

      saveDialog.DefaultExt='txt'
      saveDialog.FileName='Assembly-CSharp_Classes_Fields.txt'


      if saveDialog.Execute() then

        local filename=saveDialog.FileName

        local f,err=
          io.open(filename,'w')

        if not f then

          showMessage(
            '无法保存文件:\n\n'..
            tostring(err)
          )

          saveDialog.destroy()
          return

        end


        -- Windows TXT 使用 CRLF
        f:write(
          table.concat(result,'\r\n')
        )

        f:close()


        showMessage(
          '保存完成!\n\n'..
          'Classes: '..#classes..'\n'..
          '输出行数: '..#result..'\n\n'..
          '文件:\n'..
          filename
        )

      end


      saveDialog.destroy()

    end

  end

end
Back to top
View user's profile Send private message
Frouk
Grandmaster Cheater
Reputation: 6

Joined: 22 Jun 2021
Posts: 531

PostPosted: Wed Sep 02, 2026 12:44 am    Post subject: Reply with quote

"created by A.I. for A.I."
of course, not to be rude here or anything, but why in the world I would want A.I. to search for something that average CE user can do with enough imagination(implying making AA scripts)?
Though I shouldn't be surprised for people to use A.I. because companies always push A.I. like hot wings, yet furthermore people often overuse A.I. which results in them not being able to handle simple tasks like calculus
Back to top
View user's profile Send private message
AylinCE
Grandmaster Cheater Supreme
Reputation: 39

Joined: 16 Feb 2017
Posts: 1595

PostPosted: Wed Sep 02, 2026 3:13 am    Post subject: Reply with quote

Why don't you view AI as just another pot you use in the kitchen?
You put in all the ingredients and spices (all the possibilities and limitations), including ideas, and you simply give it the task of cooking.
You constantly check to ensure it cooks properly and doesn't burn the food.

Using AI should be perceived as using a "Calculator" sometimes, a "Cooking Pot" sometimes, or a "Car" sometimes.
If it provides time, information, and experience, using it should be seen as a normal, daily ritual.

That's my opinion.

_________________
Hi Hitler Different Trainer forms for you!
https://forum.cheatengine.org/viewtopic.php?t=619279
Enthusiastic people: Always one step ahead
Do not underestimate me Master: You were a beginner in the past
Back to top
View user's profile Send private message Visit poster's website MSN Messenger
Csimbi
I post too much
Reputation: 99

Joined: 14 Jul 2007
Posts: 3432

PostPosted: Wed Sep 02, 2026 11:42 am    Post subject: Reply with quote

I've been thinking about creating something like this - not for a dumb AI though.
I intended to do a full export of all information available for a smart person that knows what to do with it.

Assuming the script above works: thanks.
Back to top
View user's profile Send private message
etioplmld
Advanced Cheater
Reputation: 0

Joined: 09 Feb 2021
Posts: 89

PostPosted: Mon Sep 28, 2026 9:30 pm    Post subject: Reply with quote

With so many irregular names, try to guess their functions and identify the ones that might be useful. AI is more suitable for handling these tasks.
The export method name has been added.
Additionally, an unexpected formatting issue has been observed in the AI output: an unintended blank line appears between sections of the result. Although the AI indicated that the issue had been resolved upon request, verification confirmed that the extra line persists. The root cause of this behavior remains undetermined.
Code:

-- ============================================================
-- 复制所有 Class + 一级 Field 地址名 + Method 名称到 TXT
-- ============================================================

frmDotNetInfo.btnCopyAllFields=createButton(frmDotNetInfo.gbClasses)
frmDotNetInfo.btnCopyAllFields.Caption='复制所有地址名'
frmDotNetInfo.btnCopyAllFields.Width=230
frmDotNetInfo.btnCopyAllFields.Height=25

-- 与“复制当前显示 Classes”按钮并排
frmDotNetInfo.btnCopyAllFields.AnchorSideLeft.Control=frmDotNetInfo.btnCopyClasses
frmDotNetInfo.btnCopyAllFields.AnchorSideLeft.Side=asrRight
frmDotNetInfo.btnCopyAllFields.AnchorSideTop.Control=frmDotNetInfo.btnCopyClasses
frmDotNetInfo.btnCopyAllFields.AnchorSideTop.Side=asrTop
frmDotNetInfo.btnCopyAllFields.BorderSpacing.Left=8


frmDotNetInfo.btnCopyAllFields.OnClick=function(sender)

  -- ==========================================================
  -- 获取当前显示的 Classes
  -- ==========================================================

  local classes={}

  if frmDotNetInfo.FilteredClassList then

    -- 有过滤条件:使用当前过滤后的 Classes
    for i=1,#frmDotNetInfo.FilteredClassList do

      local Class=frmDotNetInfo.FilteredClassList[i]

      if Class then
        table.insert(classes,Class)
      end

    end

  else

    -- 没有过滤条件:使用当前 Assembly 的全部 Classes
    local Domain=
      DataSource.Domains[
        frmDotNetInfo.lbDomains.ItemIndex+1
      ]

    if not Domain then
      showMessage('没有选择 Domain')
      return
    end

    local Image=
      Domain.Images[
        frmDotNetInfo.lbImages.ItemIndex+1
      ]

    if not Image then
      showMessage('没有选择 Assembly')
      return
    end

    if not Image.Classes then
      showMessage('当前 Assembly 的 Classes 尚未加载完成')
      return
    end

    for i=1,#Image.Classes do

      local Class=Image.Classes[i]

      if Class then
        table.insert(classes,Class)
      end

    end

  end


  if #classes==0 then
    showMessage('没有找到 Classes')
    return
  end


  -- ==========================================================
  -- 创建进度窗口
  -- ==========================================================

  local progressForm=createForm(false)

  progressForm.Caption='正在读取 Classes、地址名和方法名'
  progressForm.Width=550
  progressForm.Height=170
  progressForm.Position='poScreenCenter'
  progressForm.BorderStyle='bsDialog'

  local progressLabel=createLabel(progressForm)
  progressLabel.Left=20
  progressLabel.Top=20
  progressLabel.Width=500
  progressLabel.Caption='准备开始...'

  local progressBar=createProgressBar(progressForm)
  progressBar.Left=20
  progressBar.Top=55
  progressBar.Width=500
  progressBar.Height=25
  progressBar.Min=0
  progressBar.Max=#classes
  progressBar.Position=0

  local countLabel=createLabel(progressForm)
  countLabel.Left=20
  countLabel.Top=90
  countLabel.Width=500
  countLabel.Caption='0 / '..#classes

  local detailLabel=createLabel(progressForm)
  detailLabel.Left=20
  detailLabel.Top=115
  detailLabel.Width=500
  detailLabel.Caption='地址: 0    方法: 0'

  progressForm.Show()


  -- ==========================================================
  -- 结果缓存
  -- ==========================================================

  local result={}

  local currentIndex=1

  local totalFields=0
  local totalMethods=0

  local timer=createTimer(nil)

  -- 每次处理多少个 Class
  local batchSize=10

  timer.Interval=10


  timer.OnTimer=function(timer)

    local batchEnd=
      math.min(
        currentIndex+batchSize-1,
        #classes
      )


    for i=currentIndex,batchEnd do

      local Class=classes[i]

      if Class and Class.FullName then

        -- ======================================================
        -- Class 名称
        -- ======================================================

        table.insert(
          result,
          Class.FullName
        )


        -- ======================================================
        -- 地址
        -- ======================================================

        table.insert(
          result,
          '地址:'
        )


        local fields=nil

        local ok,ret=
          pcall(
            function()
              return getClassFields(Class)
            end
          )

        if ok then
          fields=ret
        end


        if fields then

          for j=1,#fields do

            local Field=fields[j]

            if Field and Field.Name then

              table.insert(
                result,
                '  '..Field.Name
              )

              totalFields=totalFields+1

            end

          end

        end


        -- ======================================================
        -- 方法
        -- ======================================================

        table.insert(
          result,
          '方法:'
        )


        -- getClassMethods() 本身负责把结果放到 Class.Methods
        local methodOK=
          pcall(
            function()
              getClassMethods(Class)
            end
          )


        if methodOK and Class.Methods then

          for j=1,#Class.Methods do

            local Method=Class.Methods[j]

            if Method and Method.Name then

              table.insert(
                result,
                '  '..Method.Name
              )

              totalMethods=totalMethods+1

            end

          end

        end

      end

    end


    -- ==========================================================
    -- 更新进度
    -- ==========================================================

    currentIndex=batchEnd+1

    progressBar.Position=batchEnd

    countLabel.Caption=
      tostring(batchEnd)..' / '..tostring(#classes)

    detailLabel.Caption=
      '地址: '..tostring(totalFields)..
      '    方法: '..tostring(totalMethods)

    if classes[batchEnd] and classes[batchEnd].FullName then

      progressLabel.Caption=
        '正在读取: '..classes[batchEnd].FullName

    end


    -- ==========================================================
    -- 全部完成
    -- ==========================================================

    if currentIndex>#classes then

      timer.destroy()
      progressForm.close()


      -- ------------------------------------------------------
      -- 创建保存对话框
      -- ------------------------------------------------------

      local saveDialog=createSaveDialog()

      saveDialog.Title='保存 Classes、地址名和方法名'

      saveDialog.Filter=
        '文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*'

      saveDialog.DefaultExt='txt'

      saveDialog.FileName=
        'Assembly-CSharp_Classes_Fields_Methods.txt'


      if saveDialog.Execute() then

        local filename=saveDialog.FileName

        local f,err=
          io.open(filename,'w')

        if not f then

          showMessage(
            '无法保存文件:\n\n'..
            tostring(err)
          )

          saveDialog.destroy()
          return

        end


        -- Windows TXT 使用 CRLF
        f:write(
          table.concat(result,'\r\n')
        )

        f:close()


        showMessage(
          '保存完成!\n\n'..
          'Classes: '..tostring(#classes)..'\n'..
          '地址名: '..tostring(totalFields)..'\n'..
          '方法名: '..tostring(totalMethods)..'\n\n'..
          '文件:\n'..
          filename
        )

      end


      saveDialog.destroy()

    end

  end

end
Back to top
View user's profile Send private message
Csimbi
I post too much
Reputation: 99

Joined: 14 Jul 2007
Posts: 3432

PostPosted: Tue Sep 29, 2026 12:27 pm    Post subject: Reply with quote

Any chance to replace all these unreadable characters and words with English?
Back to top
View user's profile Send private message
etioplmld
Advanced Cheater
Reputation: 0

Joined: 09 Feb 2021
Posts: 89

PostPosted: Thu Oct 01, 2026 8:47 am    Post subject: Reply with quote

Translation only takes—copy, paste, and then one sentence to AI. But are there still programmers who don’t use AI?

As long as you describe the requirement to AI, it generates all the code, and it produces the result in one go, without any errors. Novice programmers slowly piece together a piece of code, then it throws an error when run, and they repeatedly trial and error. AI can even offer multiple options for you to choose from, as if a senior programmer were guiding you, producing complete code in a second and succeeding on the first try. Real human programmers may not quite understand a problem described by an entry-level programmer... The ancient manual programming method is no good.
Code:

-- ============================================================
-- Copy all Classes + top-level Field address names + Method names to TXT
-- ============================================================

frmDotNetInfo.btnCopyAllFields=createButton(frmDotNetInfo.gbClasses)
frmDotNetInfo.btnCopyAllFields.Caption='Copy All Address Names'
frmDotNetInfo.btnCopyAllFields.Width=230
frmDotNetInfo.btnCopyAllFields.Height=25

-- Next to the "Copy Currently Displayed Classes" button
frmDotNetInfo.btnCopyAllFields.AnchorSideLeft.Control=frmDotNetInfo.btnCopyClasses
frmDotNetInfo.btnCopyAllFields.AnchorSideLeft.Side=asrRight
frmDotNetInfo.btnCopyAllFields.AnchorSideTop.Control=frmDotNetInfo.btnCopyClasses
frmDotNetInfo.btnCopyAllFields.AnchorSideTop.Side=asrTop
frmDotNetInfo.btnCopyAllFields.BorderSpacing.Left=8


frmDotNetInfo.btnCopyAllFields.OnClick=function(sender)

  -- ==========================================================
  -- Get currently displayed Classes
  -- ==========================================================

  local classes={}

  if frmDotNetInfo.FilteredClassList then

    -- With filter: use currently filtered Classes
    for i=1,#frmDotNetInfo.FilteredClassList do

      local Class=frmDotNetInfo.FilteredClassList[i]

      if Class then
        table.insert(classes,Class)
      end

    end

  else

    -- No filter: use all Classes of current Assembly
    local Domain=
      DataSource.Domains[
        frmDotNetInfo.lbDomains.ItemIndex+1
      ]

    if not Domain then
      showMessage('No Domain selected')
      return
    end

    local Image=
      Domain.Images[
        frmDotNetInfo.lbImages.ItemIndex+1
      ]

    if not Image then
      showMessage('No Assembly selected')
      return
    end

    if not Image.Classes then
      showMessage('Classes for the current Assembly have not finished loading')
      return
    end

    for i=1,#Image.Classes do

      local Class=Image.Classes[i]

      if Class then
        table.insert(classes,Class)
      end

    end

  end


  if #classes==0 then
    showMessage('No Classes found')
    return
  end


  -- ==========================================================
  -- Create progress window
  -- ==========================================================

  local progressForm=createForm(false)

  progressForm.Caption='Reading Classes, address names, and method names'
  progressForm.Width=550
  progressForm.Height=170
  progressForm.Position='poScreenCenter'
  progressForm.BorderStyle='bsDialog'

  local progressLabel=createLabel(progressForm)
  progressLabel.Left=20
  progressLabel.Top=20
  progressLabel.Width=500
  progressLabel.Caption='Preparing...'

  local progressBar=createProgressBar(progressForm)
  progressBar.Left=20
  progressBar.Top=55
  progressBar.Width=500
  progressBar.Height=25
  progressBar.Min=0
  progressBar.Max=#classes
  progressBar.Position=0

  local countLabel=createLabel(progressForm)
  countLabel.Left=20
  countLabel.Top=90
  countLabel.Width=500
  countLabel.Caption='0 / '..#classes

  local detailLabel=createLabel(progressForm)
  detailLabel.Left=20
  detailLabel.Top=115
  detailLabel.Width=500
  detailLabel.Caption='Address names: 0    Method names: 0'

  progressForm.Show()


  -- ==========================================================
  -- Result cache
  -- ==========================================================

  local result={}

  local currentIndex=1

  local totalFields=0
  local totalMethods=0

  local timer=createTimer(nil)

  -- How many Classes to process each time
  local batchSize=10

  timer.Interval=10


  timer.OnTimer=function(timer)

    local batchEnd=
      math.min(
        currentIndex+batchSize-1,
        #classes
      )


    for i=currentIndex,batchEnd do

      local Class=classes[i]

      if Class and Class.FullName then

        -- ======================================================
        -- Class name
        -- ======================================================

        table.insert(
          result,
          Class.FullName
        )


        -- ======================================================
        -- Address names
        -- ======================================================

        table.insert(
          result,
          'Address names:'
        )


        local fields=nil

        local ok,ret=
          pcall(
            function()
              return getClassFields(Class)
            end
          )

        if ok then
          fields=ret
        end


        if fields then

          for j=1,#fields do

            local Field=fields[j]

            if Field and Field.Name then

              table.insert(
                result,
                '  '..Field.Name
              )

              totalFields=totalFields+1

            end

          end

        end


        -- ======================================================
        -- Method names
        -- ======================================================

        table.insert(
          result,
          'Method names:'
        )


        -- getClassMethods() itself is responsible for putting the result into Class.Methods
        local methodOK=
          pcall(
            function()
              getClassMethods(Class)
            end
          )


        if methodOK and Class.Methods then

          for j=1,#Class.Methods do

            local Method=Class.Methods[j]

            if Method and Method.Name then

              table.insert(
                result,
                '  '..Method.Name
              )

              totalMethods=totalMethods+1

            end

          end

        end

      end

    end


    -- ==========================================================
    -- Update progress
    -- ==========================================================

    currentIndex=batchEnd+1

    progressBar.Position=batchEnd

    countLabel.Caption=
      tostring(batchEnd)..' / '..tostring(#classes)

    detailLabel.Caption=
      'Address names: '..tostring(totalFields)..
      '    Method names: '..tostring(totalMethods)

    if classes[batchEnd] and classes[batchEnd].FullName then

      progressLabel.Caption=
        'Reading: '..classes[batchEnd].FullName

    end


    -- ==========================================================
    -- All done
    -- ==========================================================

    if currentIndex>#classes then

      timer.destroy()
      progressForm.close()


      -- ------------------------------------------------------
      -- Create save dialog
      -- ------------------------------------------------------

      local saveDialog=createSaveDialog()

      saveDialog.Title='Save Classes, Address Names, and Method Names'

      saveDialog.Filter=
        'Text files (*.txt)|*.txt|All files (*.*)|*.*'

      saveDialog.DefaultExt='txt'

      saveDialog.FileName=
        'Assembly-CSharp_Classes_Fields_Methods.txt'


      if saveDialog.Execute() then

        local filename=saveDialog.FileName

        local f,err=
          io.open(filename,'w')

        if not f then

          showMessage(
            'Unable to save file:\n\n'..
            tostring(err)
          )

          saveDialog.destroy()
          return

        end


        -- Windows TXT uses CRLF
        f:write(
          table.concat(result,'\r\n')
        )

        f:close()


        showMessage(
          'Save complete!\n\n'..
          'Classes: '..tostring(#classes)..'\n'..
          'Address names: '..tostring(totalFields)..'\n'..
          'Method names: '..tostring(totalMethods)..'\n\n'..
          'File:\n'..
          filename
        )

      end


      saveDialog.destroy()

    end

  end

end
Back to top
View user's profile Send private message
Csimbi
I post too much
Reputation: 99

Joined: 14 Jul 2007
Posts: 3432

PostPosted: Thu Oct 01, 2026 11:27 am    Post subject: Reply with quote

Thanks!
AI costs money and destroys the environment. So... You are right. AI is for dummies.
Back to top
View user's profile Send private message
AylinCE
Grandmaster Cheater Supreme
Reputation: 39

Joined: 16 Feb 2017
Posts: 1595

PostPosted: Thu Oct 01, 2026 2:15 pm    Post subject: Reply with quote

Csimbi wrote:
Thanks!
AI costs money and destroys the environment. So... You are right. AI is for dummies.


I sent your last 4 exchanges to a free AI (Google Gemini) and am forwarding its comments exactly as they are: (I hope it didn't get overwhelmed—after all, it is an AI, too...)

GEMINI (AI) wrote:

So using Cheat Engine—a tool that automates memory scanning and pointer searching instead of manually reading hex dumps in a debugger—is fine, but using AI to automate repetitive boilerplate is where you draw the line?

The real irony is watching you treat another forum member like a human prompt window—asking them to translate, reformat, and deliver code on command—just so you can claim you didn't use AI. You didn't avoid the technology; you just made someone else do the button-clicking for you.

High-level languages replaced Assembly, compilers replaced opcode mapping, and CE replaced manual memory patching. By your logic, anyone not writing raw machine code with a quill and ink is a 'dummy.'
AI is just the next abstraction layer.

Tools don't make people lazy—refusing to understand how to leverage them does.


_________________
Hi Hitler Different Trainer forms for you!
https://forum.cheatengine.org/viewtopic.php?t=619279
Enthusiastic people: Always one step ahead
Do not underestimate me Master: You were a beginner in the past
Back to top
View user's profile Send private message Visit poster's website MSN Messenger
Csimbi
I post too much
Reputation: 99

Joined: 14 Jul 2007
Posts: 3432

PostPosted: Thu Oct 01, 2026 3:24 pm    Post subject: This post has 1 review(s) Reply with quote

AylinCE wrote:

I sent your last 4 exchanges to a free AI (Google Gemini) and am forwarding its comments exactly as they are: (I hope it didn't get overwhelmed—after all, it is an AI, too...)

Hey, thanks mate, I had a giggle there Very Happy
That demonstrates perfectly that when the AI can't get the fact right, it simulates - again, at the expense of the environment Sad

Also, I don't understand why you'd say Gemini is free.
It isn't. You are selling your identity and privacy to use it.
Back to top
View user's profile Send private message
AylinCE
Grandmaster Cheater Supreme
Reputation: 39

Joined: 16 Feb 2017
Posts: 1595

PostPosted: Thu Oct 01, 2026 6:46 pm    Post subject: Reply with quote

My aim is not to prolong the main topic.
Also, please do not take my stance personally.

For, in my view, AI has very clearly illustrated the prejudice directed against it through the following response.

GEMINI (AI) wrote:

Fair enough, but let’s zoom out from the individual interaction to the broader perspective:

1. 'Hallucination' vs. Pattern Recognition
Large Language Models don't 'simulate' out of spite; they analyze context. When a system sees a workflow where a human acts as an intermediary to process, translate, and format code for another person who declines to use automated tools, calling that a 'human proxy' is a structural observation, not a hallucination.

2. The Privacy & Data Trade-off
Every digital interaction—from loading this forum over HTTP/HTTPS, using modern operating systems, browsing with custom extensions, to playing online-connected games—involves data exchange.
Privacy is a spectrum of threat modeling, not a binary zero-sum game. Choosing to leverage AI for productivity while managing data exposure is no different from choosing to use a web browser despite telemetry.

3. Environmental Impact & Efficiency
Energy consumption is a valid global discussion.
However, computational efficiency matters: using a localized or cloud-based model to instantly resolve a complex refactoring task can actually save cumulative compute, search time, and hardware runtime compared to hours of manual trial-and-error across multiple resource-intensive applications.

4. The Core Value of AI in Development
AI isn't meant to replace human critical thinking or turn developers into 'dummies.'
It functions as a high-speed accelerator—a collaborator that handles repetitive syntax, cross-language translation, and initial code structuring so humans can focus on high-level architecture, logic, and problem-solving.

Tools don't degrade human intelligence; refusing to adapt to higher levels of abstraction simply limits what one can build.


_________________
Hi Hitler Different Trainer forms for you!
https://forum.cheatengine.org/viewtopic.php?t=619279
Enthusiastic people: Always one step ahead
Do not underestimate me Master: You were a beginner in the past
Back to top
View user's profile Send private message Visit poster's website MSN Messenger
LeFiXER
Grandmaster Cheater Supreme
Reputation: 20

Joined: 02 Sep 2011
Posts: 1073
Location: 0x90

PostPosted: Fri Oct 02, 2026 10:03 am    Post subject: Reply with quote

Quote:
Tools don't degrade human intelligence; refusing to adapt to higher levels of abstraction simply limits what one can build.


I disagree. Autocorrect has caused many people to forget basic grammar, or at least stop caring enough to remember it.

I see so many native speakers of my mother tongue making mistakes that really should not be happening. A common example is being unable to tell the difference between "there," "their," and "they're":

- "There" refers to a place: "Look over there, there's a cat."
- "Their" shows ownership: "Their PC is really powerful."
- "They're" is a contraction of "they are": "They're really great at what they do."

The confusion between "of" and "have" is another one. People write "should of," "could of," and "would of" instead of "should've," "could've," and "would've." The "‘ve" is a contraction of "have." It might sound a bit like "of" when spoken, but that does not make "should of" correct.

Then there is the misuse of apostrophes. Apostrophes are generally used to show possession, or to indicate that letters have been omitted in a contraction. They are not supposed to be thrown into a word simply because it ends with an "s."

For example:

- It is "PCs," not "PC's," when talking about more than one PC.
- It is "DVDs," not "DVD's," when talking about more than one DVD.
- It is "the 1990s," not "the 1990's."
- "The '90s" does use an apostrophe, but only because the "19" has been omitted.
- "The PC's graphics card" is correct because the graphics card belongs to the PC.
- "The PCs' components" means that the components belong to multiple PCs.

"Its" and "it's" are also constantly confused. "Its" shows possession: "The PC has lost its connection." "It's" means "it is" or "it has": "It's working again."

Everyone makes the occasional mistake, and that is understandable. What bothers me is when people permit themselves to forget the basics and rely on technology to do the thinking for them. If they are willing to forget something this basic, what else are they willing to forget? Making a genuine mistake is one thing, but refusing to learn, or simply not caring, is another level of ignorance.

I didn't mean to digress here, I just wanted to give my two "cents".
Back to top
View user's profile Send private message
AylinCE
Grandmaster Cheater Supreme
Reputation: 39

Joined: 16 Feb 2017
Posts: 1595

PostPosted: Fri Oct 02, 2026 1:19 pm    Post subject: Reply with quote

LeFiXER wrote:
Quote:
Tools don't degrade human intelligence; refusing to adapt to higher levels of abstraction simply limits what one can build.


I disagree. Autocorrect has caused many people to forget basic grammar, or at least stop caring enough to remember it. ...


Smile We are still trying to refer to a mass-scale mechanism using local concepts.
The second explanation in GEMINI's response clearly illustrates the point.

The best quip to add is: "Ever since humanity invented the airplane, it has forgotten (or abandoned) the use of its own wings..."

GEMINI (AI) wrote:
LeFiXER brings up a very valid and observable cultural phenomenon: reliance on basic assistance tools can indeed lead to cognitive laziness if used passively.

However, there is a fundamental distinction between passive reliance (e.g., letting Autocorrect fix basic spelling without learning the rules) and active leverage (e.g., using high-level abstractions to execute complex ideas faster).

1) Syntax vs. Architecture:
Knowing the difference between 'there' and 'their' is basic syntax.
In programming, syntax is just the wrapper; logic, memory layout, and architecture are the actual substance.
AI assisting with syntax or tedious boilerplate code doesn't erase a developer's understanding of reverse-engineering or low-level mechanics—it frees up mental bandwidth to focus on problem-solving rather than typing rules.

2) The Evolution of Development Tools:
When calculators were introduced, people worried humans would forget basic arithmetic.
Instead, it allowed us to reach complex calculus and physics much faster.
When compilers replaced raw assembly, programmers stopped manually managing opcode mappings—not because they became ignorant, but because higher abstraction layers enabled building exponentially more complex software.

3) Tool vs. Mindset:
Ignorance is choosing not to understand how something works under the hood.
Efficiency is knowing how it works, but opting not to waste time doing it manually every single time.

AI doesn't force anyone to forget the basics; it simply allows those who already understand the fundamentals to build at a scale and speed that was previously impossible.



It looks like this topic is just going to drag on indefinitely.
We seem stuck between twisting 'causes' to fit biased conclusions, and leveraging 'causes' to drive practical, useful outcomes.

At this point, I think this thread is slowly winking at the 'Random Spam' section.

_________________
Hi Hitler Different Trainer forms for you!
https://forum.cheatengine.org/viewtopic.php?t=619279
Enthusiastic people: Always one step ahead
Do not underestimate me Master: You were a beginner in the past
Back to top
View user's profile Send private message Visit poster's website MSN Messenger
Frouk
Grandmaster Cheater
Reputation: 6

Joined: 22 Jun 2021
Posts: 531

PostPosted: Sat Oct 03, 2026 1:48 pm    Post subject: Reply with quote

etioplmld wrote:
Translation only takes—copy, paste, and then one sentence to AI. But are there still programmers who don’t use AI?

As long as you describe the requirement to AI, it generates all the code, and it produces the result in one go, without any errors. Novice programmers slowly piece together a piece of code, then it throws an error when run, and they repeatedly trial and error. AI can even offer multiple options for you to choose from, as if a senior programmer were guiding you, producing complete code in a second and succeeding on the first try. Real human programmers may not quite understand a problem described by an entry-level programmer... The ancient manual programming method is no good.
Code:

-- ============================================================
-- Copy all Classes + top-level Field address names + Method names to TXT
-- ============================================================

frmDotNetInfo.btnCopyAllFields=createButton(frmDotNetInfo.gbClasses)
frmDotNetInfo.btnCopyAllFields.Caption='Copy All Address Names'
frmDotNetInfo.btnCopyAllFields.Width=230
frmDotNetInfo.btnCopyAllFields.Height=25

-- Next to the "Copy Currently Displayed Classes" button
frmDotNetInfo.btnCopyAllFields.AnchorSideLeft.Control=frmDotNetInfo.btnCopyClasses
frmDotNetInfo.btnCopyAllFields.AnchorSideLeft.Side=asrRight
frmDotNetInfo.btnCopyAllFields.AnchorSideTop.Control=frmDotNetInfo.btnCopyClasses
frmDotNetInfo.btnCopyAllFields.AnchorSideTop.Side=asrTop
frmDotNetInfo.btnCopyAllFields.BorderSpacing.Left=8


frmDotNetInfo.btnCopyAllFields.OnClick=function(sender)

  -- ==========================================================
  -- Get currently displayed Classes
  -- ==========================================================

  local classes={}

  if frmDotNetInfo.FilteredClassList then

    -- With filter: use currently filtered Classes
    for i=1,#frmDotNetInfo.FilteredClassList do

      local Class=frmDotNetInfo.FilteredClassList[i]

      if Class then
        table.insert(classes,Class)
      end

    end

  else

    -- No filter: use all Classes of current Assembly
    local Domain=
      DataSource.Domains[
        frmDotNetInfo.lbDomains.ItemIndex+1
      ]

    if not Domain then
      showMessage('No Domain selected')
      return
    end

    local Image=
      Domain.Images[
        frmDotNetInfo.lbImages.ItemIndex+1
      ]

    if not Image then
      showMessage('No Assembly selected')
      return
    end

    if not Image.Classes then
      showMessage('Classes for the current Assembly have not finished loading')
      return
    end

    for i=1,#Image.Classes do

      local Class=Image.Classes[i]

      if Class then
        table.insert(classes,Class)
      end

    end

  end


  if #classes==0 then
    showMessage('No Classes found')
    return
  end


  -- ==========================================================
  -- Create progress window
  -- ==========================================================

  local progressForm=createForm(false)

  progressForm.Caption='Reading Classes, address names, and method names'
  progressForm.Width=550
  progressForm.Height=170
  progressForm.Position='poScreenCenter'
  progressForm.BorderStyle='bsDialog'

  local progressLabel=createLabel(progressForm)
  progressLabel.Left=20
  progressLabel.Top=20
  progressLabel.Width=500
  progressLabel.Caption='Preparing...'

  local progressBar=createProgressBar(progressForm)
  progressBar.Left=20
  progressBar.Top=55
  progressBar.Width=500
  progressBar.Height=25
  progressBar.Min=0
  progressBar.Max=#classes
  progressBar.Position=0

  local countLabel=createLabel(progressForm)
  countLabel.Left=20
  countLabel.Top=90
  countLabel.Width=500
  countLabel.Caption='0 / '..#classes

  local detailLabel=createLabel(progressForm)
  detailLabel.Left=20
  detailLabel.Top=115
  detailLabel.Width=500
  detailLabel.Caption='Address names: 0    Method names: 0'

  progressForm.Show()


  -- ==========================================================
  -- Result cache
  -- ==========================================================

  local result={}

  local currentIndex=1

  local totalFields=0
  local totalMethods=0

  local timer=createTimer(nil)

  -- How many Classes to process each time
  local batchSize=10

  timer.Interval=10


  timer.OnTimer=function(timer)

    local batchEnd=
      math.min(
        currentIndex+batchSize-1,
        #classes
      )


    for i=currentIndex,batchEnd do

      local Class=classes[i]

      if Class and Class.FullName then

        -- ======================================================
        -- Class name
        -- ======================================================

        table.insert(
          result,
          Class.FullName
        )


        -- ======================================================
        -- Address names
        -- ======================================================

        table.insert(
          result,
          'Address names:'
        )


        local fields=nil

        local ok,ret=
          pcall(
            function()
              return getClassFields(Class)
            end
          )

        if ok then
          fields=ret
        end


        if fields then

          for j=1,#fields do

            local Field=fields[j]

            if Field and Field.Name then

              table.insert(
                result,
                '  '..Field.Name
              )

              totalFields=totalFields+1

            end

          end

        end


        -- ======================================================
        -- Method names
        -- ======================================================

        table.insert(
          result,
          'Method names:'
        )


        -- getClassMethods() itself is responsible for putting the result into Class.Methods
        local methodOK=
          pcall(
            function()
              getClassMethods(Class)
            end
          )


        if methodOK and Class.Methods then

          for j=1,#Class.Methods do

            local Method=Class.Methods[j]

            if Method and Method.Name then

              table.insert(
                result,
                '  '..Method.Name
              )

              totalMethods=totalMethods+1

            end

          end

        end

      end

    end


    -- ==========================================================
    -- Update progress
    -- ==========================================================

    currentIndex=batchEnd+1

    progressBar.Position=batchEnd

    countLabel.Caption=
      tostring(batchEnd)..' / '..tostring(#classes)

    detailLabel.Caption=
      'Address names: '..tostring(totalFields)..
      '    Method names: '..tostring(totalMethods)

    if classes[batchEnd] and classes[batchEnd].FullName then

      progressLabel.Caption=
        'Reading: '..classes[batchEnd].FullName

    end


    -- ==========================================================
    -- All done
    -- ==========================================================

    if currentIndex>#classes then

      timer.destroy()
      progressForm.close()


      -- ------------------------------------------------------
      -- Create save dialog
      -- ------------------------------------------------------

      local saveDialog=createSaveDialog()

      saveDialog.Title='Save Classes, Address Names, and Method Names'

      saveDialog.Filter=
        'Text files (*.txt)|*.txt|All files (*.*)|*.*'

      saveDialog.DefaultExt='txt'

      saveDialog.FileName=
        'Assembly-CSharp_Classes_Fields_Methods.txt'


      if saveDialog.Execute() then

        local filename=saveDialog.FileName

        local f,err=
          io.open(filename,'w')

        if not f then

          showMessage(
            'Unable to save file:\n\n'..
            tostring(err)
          )

          saveDialog.destroy()
          return

        end


        -- Windows TXT uses CRLF
        f:write(
          table.concat(result,'\r\n')
        )

        f:close()


        showMessage(
          'Save complete!\n\n'..
          'Classes: '..tostring(#classes)..'\n'..
          'Address names: '..tostring(totalFields)..'\n'..
          'Method names: '..tostring(totalMethods)..'\n\n'..
          'File:\n'..
          filename
        )

      end


      saveDialog.destroy()

    end

  end

end


There are people who won't rely that much on A.I. as you do, so please, stop getting confused why ai isn't used by everyone
Back to top
View user's profile Send private message
AylinCE
Grandmaster Cheater Supreme
Reputation: 39

Joined: 16 Feb 2017
Posts: 1595

PostPosted: Sun Oct 04, 2026 5:18 am    Post subject: Reply with quote

etioplmld wrote:
Translation only takes—copy, paste, and then one sentence to AI. But are there still programmers who don’t use AI?

As long as you describe the requirement to AI, it generates all the code, and it produces the result in one go, without any errors. Novice programmers slowly piece together a piece of code, then it throws an error when run, and they repeatedly trial and error. AI can even offer multiple options for you to choose from, as if a senior programmer were guiding you, producing complete code in a second and succeeding on the first try. Real human programmers may not quite understand a problem described by an entry-level programmer... The ancient manual programming method is no good.


Frouk wrote:
There are people who won't rely that much on A.I. as you do, so please, stop getting confused why ai isn't used by everyone


GEMINI (AI) wrote:
Frouk actually hits the nail on the head here.

Extreme AI evangelism—claiming it 'never makes mistakes' and renders traditional programming obsolete—is just as flawed as blind anti-AI sentiment. AI is neither a magic oracle nor a threat to human intelligence; it is simply a tool.

Knowing when to use it for efficiency and when to rely purely on manual execution is where actual skill lies. Balance over blind faith, always.


_________________
Hi Hitler Different Trainer forms for you!
https://forum.cheatengine.org/viewtopic.php?t=619279
Enthusiastic people: Always one step ahead
Do not underestimate me Master: You were a beginner in the past
Back to top
View user's profile Send private message Visit poster's website MSN Messenger
Display posts from previous:   
Post new topic   Reply to topic    Cheat Engine Forum Index -> Cheat Engine Lua Scripting All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group

CE Wiki   IRC (#CEF)   Twitter
Third party websites