Cheat EngineでLuaを使ってみよう!

Cheat EngineでLuaを実行するには以下の4パターンあります。


  1. Auto Assemblerスクリプト内で{$lua}と記述する。これとは違う方法でluaCallもあります。
  2. Memory View -> Tools -> Lua Engine
    純粋にLuaを実行し、テストしたい場合に使用します。
  3. Table -> Show Cheat Table Lua Script
    ここにLuaを記述するとCTに関連付けられ、CTを開いたときに実行されるようになります。
  4. C:\Program Files\Cheat Engine 7.2\autorun
    autorunフォルダに.luaファイルを置くとCheat Engine起動時に実行されます。 ネット上からダウンロードした拡張機能はこのフォルダに入れましょう。

1番が主力になります。Auto Assemblerで実装しにくいものはLuaに切り替ると良いです。


特定のキーを押している間だけ値を固定する

使用ゲームはAsssault Cubeで、キーボードのLを押している間だけ弾数が30で固定されます。

{$lua}
if syntaxcheck then return end
[ENABLE]
t = createTimer()
t.Interval = 10
t.OnTimer = function()
  if isKeyPressed(VK_L) then
    writeInteger('[ac_client.exe+0010F4F4]+148',30)
  end
end
[DISABLE]
t.destroy()

参考動画


Luaスクリプトの解説


[MAIN]セクション

{$lua}はAAスクリプト内でluaを記述する際に必要な宣言
Auto Assemblerに戻すには{$asm}と記述する


2行目は構文チェックを無効化している


[ENABLE]セクション

createTimerでTimerクラスのインスタンスを生成
Intervalには指定された関数を何ミリ秒ごとに実行するかを、
OnTimerには実行する関数を代入する

function()
  if isKeyPressed(VK_L) then
    writeInteger('["ac_client.exe"+0010F4F4]+148',30)
  end
end

上記の関数が10ミリ秒ごとに繰り返し実行される


isKeyPressedはgetAsyncKeyStateのluaバージョン
指定されたキーが押されている場合はtrueが返される
trueならwriteIntegerで指定されたアドレスに値を書き込む
VK_Lは仮想キー。Microsoftのサイトで調べ、自分の好みのキーを指定できる


[DISABLE]セクション

スクリプトをオフにしたときにdestroyメソッドを呼び出し、インスタンスをメモリから削除


自動でアタッチ

PROCESS_NAME = 'Game.exe'
local autoAttachTimer = nil
local autoAttachTimerInterval = 100
local autoAttachTimerTicks = 0
local autoAttachTimerTickMax = 5000

local function autoAttachTimer_tick(timer)
    if getProcessIDFromProcessName(PROCESS_NAME) ~= nil then
        timer.destroy()
        openProcess(PROCESS_NAME)
    elseif autoAttachTimerTickMax > 0 and autoAttachTimerTicks >= autoAttachTimerTickMax then
        timer.destroy()
    end
    autoAttachTimerTicks = autoAttachTimerTicks + 1
end

autoAttachTimer = createTimer(MainForm)
autoAttachTimer.Interval = autoAttachTimerInterval
autoAttachTimer.OnTimer = autoAttachTimer_tick

Table -> Show Cheat Table Lua Scriptを開き、上記のLuaスクリプトを貼り付ける。
'Game.exe'をアタッチしたいプロセス名に書き換えれば完成!

CTを開くとスクリプトが実行され、自動でアタッチされるようになります。


CTに関連付けされているLuaスクリプトを自動で実行するかどうかは、
Edit -> Settings -> General Settingsから変更できます。



CE Luaのドキュメントについて

Cheat Engine LuaのドキュメントはメニューバーのHelpにあります。
Web版はこちらから



どんな関数があるのか、関数の返り値、引数は何かを確認できるのですが、
そのままだとsyntax highlightが適用されないため読みづらいです。



これの解決策として、メニューバーのTableからShow Cheat Table Lua Scriptを開き、 そこに先ほどのドキュメントをコピペすると読みやすくなります。




目的の関数の仕様を調べたいときは、Ctrl + Rを押してから検索すると確認できます。



CE Luaのドキュメント(日本語版)

上記サイトの日本語化ファイルをダウンロードすると、日本語化されたCE Luaのドキュメントが同封されています。感謝!



Ver 6.8.2時点での翻訳なので、情報が古くなっています。GitHubにある最新のドキュメント(英語)と併用して不足分を補填すると良いです。


ブレークポイントの設定方法


例えば2行目でプログラムをブレークさせたい場合は赤矢印のあたりを左クリックするとブレークポイントを設定できます。設定できましたらExecuteをクリックして実行してみましょう。



狙い通り2行目でブレークし、画像の赤枠部分にアイコンが出現しました。

左から Continue, Single Step, Stop になっています。


Continue -> プログラムを走らせる
Single Step -> 1行だけコードを実行する
Stop -> プログラムを停止する


Luaのコードを読む時、わからない箇所でブレークさせて変数の中身をprint関数で表示すれば理解できるようになってきます!


関連記事

5 Comments

Mukoryo

No title

CEの日本語記事でかなりお世話になってます!
筆者さんとディスコードで繋がる事はできますでしょうか?

チャットでお話させてもらいたいです。
ダメなら大丈夫です。

宜しくお願いします。

  • 2021/03/25 (Thu) 14:15
  • REPLY
ちーたー

なんでもチート

To Mukoryoさん

コメントありがとうございます。
discordに関しては、そのうち公開しようと作ったサーバーがあるので、良かったらこちらにお越しください。
https://discord.gg/z7tPB7Zu9w
Mukoryoさんのサーバーがあればそちらに伺いますし、どちらでも大丈夫です。

  • 2021/03/28 (Sun) 14:59
  • REPLY

len

なんでもチート様
いつも記事の方、拝見させてもらっています。
実現の方法が思い浮かばないチートがありまして、
コメントさせていただきます。

SteamのDEAD OR ALIVE 6という格闘ゲームにて
対戦中のキャラクターのモデルサイズを変更したいと思い、
https://youtu.be/fi4SrwrHRNc
こちらの動画を参考にしてCheat Engineで値を探していました。

動画によるとモデルのサイズ倍率等はキャラの座標と近いアドレスに
格納されていることが多いらしく、座標アドレスの特定まではできました。
しかし、座標付近の構造体を探しても目的の値は見つかりませんでした。

ゲーム自体にモデルのサイズを変更する機会などは存在しないので
increased valueといった検索もできず、値に関しても、
おそらくfloat型でXYZがそれぞれ1.0ではないか
という推測しかできていない状態です。

なんでもチート様がよろしければ、
どうか値を特定する方法をご教授いただけないでしょうか。

  • 2021/04/30 (Fri) 19:04
  • REPLY
ちーたー

なんでもチート

To lenさん

コメントありがとうございます。
Cheat EngineにGroupedというValue Typeがあるので、これを試してみてください。メモリに連続して存在する値を見つけることが出来ます。
https://dl.dropboxusercontent.com/s/xzb8s2xrr46biu6/Image1619961097.png

1.57895などの複雑な値ではないと思うので、simple values onlyにチェックを入れると検索範囲を絞れるはずです。ただ、スケール変数がどのゲームにも存在するかは懐疑的なので、存在しない場合はどうすれば良いかわかりません。

  • 2021/05/02 (Sun) 22:36
  • REPLY

len

To なんでもチートさん

なんでもチート様
ご返答ありがとうございます。

こんな検索方法があったとは...。
この検索でなんとか試していけるレベルには結果を絞り込めたので、
コツコツ試していこうかと思います。
変数自体が存在しない場合はさすがにどうしようもありませんよね...。

ご丁寧にどうもありがとうございました。
これからも記事の方、楽しみに読ませていただきます!

  • 2021/05/03 (Mon) 02:17
  • REPLY