Перейти к содержанию

...Описание инструкций CE Lua Engine 6.2


Рекомендуемые сообщения

Новое руководство CE6.2 Lua-Engine r969. Июль, 2011 год

Для тех кто недавно познакомился с Cheat Engine 6.1

Лучший по удобству способ создания трейнеров - это создание трейнеров сценариями Lua.

Используйте только формат *.CETRAINER. Не используйте *.exe генерирумые трейнеры и не используйте таблицы *.CT.

*.CETRAINER - это формат текстового файла с xml разметкой, которую обрабатывает Cheat Engine. Саму Cheat Engine при запуске файла формата *.CETRAINER видно не будет.

Пользователь может открыть созданный файл .CETRAINER для внесения в него необходимых настроек, которые были описаны автором этого файла.

Для запуска .CETRAINER пользователю необходимо установить последнюю версию Cheat Engine.

Вы можете встраивать свои ресурсы в формат *.CETRAINER. Это могут быть модули *dll, *.lua, текстовые и графические файлы, файлы музыки формата "xm" и любые другие файлы.

Имейте ввиду, что встраиваемые ресурсы в *.CETRAINER увеличивают его размер на величину двухкратную размеру самих этих ресурсов.

Встраивание графических картинок, музыки, других эффектов обычно считается хорошим тоном для трейнеров, но не обязательно.

Вы можете создать форму трейнера и расположить на ней картинку, а также сделать музыкальное сопровождение.

Сделать кнопку, которая вызывает окно с описанием ваших читов и описанием другой информации.

Прочитав это руководство вы узнайте как делать трейнеры в формате *.CETRAINER. Узнаете описания всех функций и примеры для версии lua-Engine r969 (июль месяц 2011 года, Cheat Engine 6.2)

1. Обзор формата *.CETRAINER.

В следующием примере Вы можете увидеть содержание файла "*.CETRAINER" в упрощённом виде.


<?xml version="1.0"?>
<CheatTable CheatEngineTableVersion="11">
<LuaScript>
-- Ваш Lua скрипт
</LuaScript>
</CheatTable>

Таким образом вам достаточно создать текстовый файл, написать в нём строки вашего кода с разметкой и сохранить как *.CETRAINER. Размер такого файла получается очень маленьким. А также вы можете в любой момент отредактировать его в текстовом редакторе. Затем вам стоит его опубликовать в Интернете. И те пользователи у кого есть Cheat Engine смогут запустить этот скрипт.

Скорее всего вам не понадобится писать такую разметку, за вас это сделает CE(Cheat Egnine) когда вы будите работать в CE. Потом вы сможете открыть файл и отредактировать его так как вам будет удобно.

2. Разметка созданая трейнер-генератором.

Разметка выше не содержала никакого кода. Давайте посмотрим разметку, которую предлагает ДаркБайт (автор Cheat Engine)

Прокомментирую как был построен этот скрипт.

Я подключился к процессу test.exe через значок "Компьютер". Эта программа написана мной для примера. В ней нажимая на кнопку отображаемое значение увеличивается на единицу.

Далее я нашёл адрес параметра через сканер памяти и назвал его MyFloatValue.

Я запустил генератор трейнера. Выделил запись MyFloatValue. Поставил горячие клавиши "ctrl+q" для заморозки значения. Данное событие назвал как "Freeze Value".

И сгенерировал трейнер с интерфейсом по умолчанию в файл *.CETRAINER без шифрования.

post-3-1311619519,51_thumb.png

Посмотрим что получилось в файле. Выглядит устрашающе. Скорее всего Вы сейчас ничего не поймете.


<?xml version="1.0"?>
<CheatTable CheatEngineTableVersion="12">
<Forms>
<CETrainer>7D534B6EDB3014A4A5E81F34D90628D0650B74D11CA192CCC446544BB518F4B32A2DD1B660463428DA4E973D478FD4451745916BF408A5455996DD342BF1919C79F366C4EF2700A0E4EAF214218E8B92F02BC6EF9C1036D54944A6427F63980352CCE642FF0374C496FAB79EF1A1C8C55C7FDBB342BC14052BCD3DE834A40529450BF154DD22E232A4AC22965B7FE461B6B01356155B1AEBD992A51927A40C258470E0A110A64B5A085938294CE0D847F1B8D6A5E587B234A054690600B68425B824D4851FD1D84FFC118C1408FC07941B3E2D66A56562BABDE706644DE8B094F358CE641DB10DE12457BBF14A1CEC3E35B096DB084F629E13AEF5802365052B2158E9F9417C8B825B84E29112A635C2B48BDAE3DF3B615F1A6136A60193D0BBD672C39FB095A8FD941E5A6E5D2A3FDB9E407931BCC333620CDFF9D7F0B09BFE4BD9A0FDDB4D4D61A5821391CD1DD075351C401F755C2D1E77557F00C77C4FFE1D0F60AF5CABDB457842A83788D10DFC14F9C1AE9FBB33EBBC6EE736EA5FB6DE98032616E4AB97602ED9434619B7C19EF1BC0FD3703C4CD0301E7568F3C7695FEC69E1744A327144DB89358CE2147663BD3E8CF5E72ED61BCB2FB339E39567E3850A16EC93552FA44DB6F352BAC99A3217828559A77179E4CCF37A84574D103F24F9F6EE48021D44EE45B6D56E3919ED93295E51E1C0BC101BF5CB36E6996628387DFDDEEB932AE38592A65595AB8E69FD9CCE3A87F5CE67C7CF44B1C682E4F659B39467AA9F91D1B17C46D59C6DE63589E30E70B56D1DB07BDB936BA9325B4C6421E7037F01</CETrainer>
</Forms>
<CheatEntries>
<CheatEntry>
<ID>0</ID>
<Description>"MyFloatValue"</Description>
<Color>80000008</Color>
<VariableType>4 Bytes</VariableType>
<Address>Test.exe+5B5A4</Address>
<Hotkeys>
<Hotkey>
<Action>Toggle Activation</Action>
<Keys>
<Key>17</Key>
<Key>81</Key>
</Keys>
<Description>Freeze Value</Description>
<ID>0</ID>
</Hotkey>
</Hotkeys>
</CheatEntry>
</CheatEntries>
<UserdefinedSymbols/>
<LuaScript>--TRAINERGENERATORSTART--
--This is autogenerated code. Changing code in this block will
--get erased and rewritten if you regenerate the trainer code

--Uncomment the following line if this is a Cheat Table format trainer and you don't want CE to show (Tip, save as .CETRAINER alternatively)
--hideAllCEWindows()
addresslist=getAddressList()
memrec0=addresslist_getMemoryRecordByID(addresslist,0)

memrec0_hotkey0=memoryrecord_getHotkeyByID(memrec0,0)

function onPostHotkey0(Hotkey)
--Executed after the "toggle*" cheat got executed
local memrec=memoryrecordhotkey_getOwner(Hotkey)
local isActive=memoryrecord_isActive(memrec) --get the state after the hotkey got triggered
cheatcomponent_setActive(CETrainer_CHEAT0, isActive)
if gBeepOnAction then
beep()
end
end

memoryrecordhotkey_onPostHotkey(memrec0_hotkey0,onPostHotkey0)

control_setVisible(CETrainer_SEPERATOR, false)

strings_add(getAutoAttachList(), "Test.exe")
gBeepOnAction=false
form_show(CETrainer)
function AboutClick()
showMessage(gAboutText)
end
gAboutText=[[This trainer was made by Cheat Engine
www.cheatengine.org]]

function CloseClick()
closeCE()
return caFree --onClick doesn't care, but onClose would like a result
end

--TRAINERGENERATORSTOP--
</LuaScript>
</CheatTable>
	

Думаете тут есть что-то сложное? Ничего подобного. Давайте разберёмся как работает этот трейнер чтобы делать свой.


<Forms>
<CETrainer>7D534B6EDB3014A4A5E81F34D90628D0650B74D11CA192CCC446544BB518F4B32A2DD1B660463428DA4E973D478FD4451745916BF408A5455996DD342BF1919C79F366C4EF2700A0E4EAF214218E8B92F02BC6EF9C1036D54944A6427F63980352CCE642FF0374C496FAB79EF1A1C8C55C7FDBB342BC14052BCD3DE834A40529450BF154DD22E232A4AC22965B7FE461B6B01356155B1AEBD992A51927A40C258470E0A110A64B5A085938294CE0D847F1B8D6A5E587B234A054690600B68425B824D4851FD1D84FFC118C1408FC07941B3E2D66A56562BABDE706644DE8B094F358CE641DB10DE12457BBF14A1CEC3E35B096DB084F629E13AEF5802365052B2158E9F9417C8B825B84E29112A635C2B48BDAE3DF3B615F1A6136A60193D0BBD672C39FB095A8FD941E5A6E5D2A3FDB9E407931BCC333620CDFF9D7F0B09BFE4BD9A0FDDB4D4D61A5821391CD1DD075351C401F755C2D1E77557F00C77C4FFE1D0F60AF5CABDB457842A83788D10DFC14F9C1AE9FBB33EBBC6EE736EA5FB6DE98032616E4AB97602ED9434619B7C19EF1BC0FD3703C4CD0301E7568F3C7695FEC69E1744A327144DB89358CE2147663BD3E8CF5E72ED61BCB2FB339E39567E3850A16EC93552FA44DB6F352BAC99A3217828559A77179E4CCF37A84574D103F24F9F6EE48021D44EE45B6D56E3919ED93295E51E1C0BC101BF5CB36E6996628387DFDDEEB932AE38592A65595AB8E69FD9CCE3A87F5CE67C7CF44B1C682E4F659B39467AA9F91D1B17C46D59C6DE63589E30E70B56D1DB07BDB936BA9325B4C6421E7037F01</CETrainer>
</Forms>

"Forms" содержит формы. В данном случае одну форму "CETrainer". Длинная строка которую вы видите, это ресурсы формы. Иначе говоря это информация о том что на форме находится. Там находится поле для картинки, кнопка About и список читов из одной записи. Данное окно вы не раз видели, если пользовались генератором трейнеров.

Дальше.


<CheatEntries>
<CheatEntry>
....
</CheatEntry>
</CheatEntries>

"CheatEntries" это "куст" из "веток" "CheatEntry", где "CheatEntry" это запись в главной таблице CE


<CheatEntry>
<ID>0</ID>
<Description>"MyFloatValue"</Description>
<Color>80000008</Color>
<VariableType>4 Bytes</VariableType>
<Address>Test.exe+5B5A4</Address>
<Hotkeys>
...
</Hotkeys>
</CheatEntry>
 

ID - идентификатор записи CheatEntry

Description - описание

Color - цвет

VariableType - тип данных

Address - адрес

Hotkeys - куст содержищий Hotkey


<Hotkey>
<Action>Toggle Activation</Action>
<Keys>
<Key>17</Key>
<Key>81</Key>
</Keys>
<Description>Freeze Value</Description>
<ID>0</ID>
</Hotkey>
	

Action - определения способа активации. В данном случае это простая заморозка, а ещё есть 5-видов активации. Их вы сами посмотрите.

Keys - куст для key-кодов 17 и 81 (CTRL + Q). Кей-коды можно увидеть здесь http://code.google.c...bin/defines.lua

Description - пользовательское описание

ID - идентификатор Hotkey

<UserdefinedSymbols/>

Пусто. Это зарегистрированные пользовательские метки. На самом деле этот куст можно удалить.

Ну и наконец. Самое вижное и сложное это ветка Lua -скрипта. Это самое сердце трейнера.


<LuaScript>--TRAINERGENERATORSTART--
--This is autogenerated code. Changing code in this block will
--get erased and rewritten if you regenerate the trainer code

--Uncomment the following line if this is a Cheat Table format trainer and you don't want CE to show (Tip, save as .CETRAINER alternatively)
--hideAllCEWindows()
addresslist=getAddressList()
memrec0=addresslist_getMemoryRecordByID(addresslist,0)

memrec0_hotkey0=memoryrecord_getHotkeyByID(memrec0,0)

function onPostHotkey0(Hotkey)
--Executed after the "toggle*" cheat got executed
local memrec=memoryrecordhotkey_getOwner(Hotkey)
local isActive=memoryrecord_isActive(memrec) --get the state after the hotkey got triggered
cheatcomponent_setActive(CETrainer_CHEAT0, isActive)
if gBeepOnAction then
beep()
end
end

memoryrecordhotkey_onPostHotkey(memrec0_hotkey0,onPostHotkey0)

control_setVisible(CETrainer_SEPERATOR, false)

strings_add(getAutoAttachList(), "Test.exe")
gBeepOnAction=false
form_show(CETrainer)
function AboutClick()
showMessage(gAboutText)
end
gAboutText=[[This trainer was made by Cheat Engine
www.cheatengine.org]]

function CloseClick()
closeCE()
return caFree --onClick doesn't care, but onClose would like a result
end

--TRAINERGENERATORSTOP--
</LuaScript>
 	

Я напишу тоже самое только с моими комментраиями.


<LuaScript>
-- Получить коллекцию записей addresslist в существующих таблицах Cheat Engine
-- Я не знаю почему getAddressList, когда надо было названить иначе, потому что у вас могут быть не только адреса в таблицах, но и скрипты.
addresslist=getAddressList()

-- Получить запись memrec0 по ID из коллекции, где ID равно нулю. Это как раз первая моя запись. Помните выше, была ветвь <CheatEntry>...
memrec0=addresslist_getMemoryRecordByID(addresslist,0)

-- Получить горячие клавиши в memrec0_hotkey0 из записи memrec0
memrec0_hotkey0=memoryrecord_getHotkeyByID(memrec0,0)

-- Эта функция будет будет связана ниже (её написали здесь заранее). Она будет вызываться, когда пользователь нажмёт горячие клавиши
function onPostHotkey0(Hotkey)
-- опять получить запись по владельцу горячих клавиш
local memrec=memoryrecordhotkey_getOwner(Hotkey)
-- определить активирована ли запись
local isActive=memoryrecord_isActive(memrec) --get the state after the hotkey got triggered

-- повтороно или в первый раз активировать компонент CETrainer_CHEAT0 (надпись станет красной или перестанет быть красной)
cheatcomponent_setActive(CETrainer_CHEAT0, isActive)
-- если разрешён звукой сигнал переменной gBeepOnAction (эта переменная будет где-то позже), то произвести звук бипа
if gBeepOnAction then
beep()
end

-- Важно пояснить.
-- CETrainer_CHEAT0 это объект Сheatcomponent. Объект генерируется автоматически генератором терйнеров и вы не можете его создавать. Т.е. в своих скриптах, которые вы будите писать без генератора трейнеров, вы не сможете связываться с Сheatcomponent и будите писать код иначе.
end


-- Наконец, связать memrec0_hotkey0 с функцией onPostHotkey0, для того чтобы задействовать CETrainer_CHEAT0 - компонент чита сгенерированный CE
memoryrecordhotkey_onPostHotkey(memrec0_hotkey0,onPostHotkey0)

-- Спрятать разделительную линию. Просто дизайнерский финт
control_setVisible(CETrainer_SEPERATOR, false)

-- Добавить название пройесса в список процессов автоподключения. CE будет автоматически искать процесс по его названию и подключаться к нему
strings_add(getAutoAttachList(), "Test.exe")
-- А вот наша переменная активации, можно было вообще обойтись без неё. Он запрещает звуковой сигнал при активации горячих клавиш, но вы можете его включить поставив true.
gBeepOnAction=false

-- Показать наконец форму CETrainer, её так уже автоматически назвали и где-то как-то создали без нашего ведома
form_show(CETrainer)

-- Обаботчик нажатия на кнопку "О программе"
function AboutClick()
-- Показать сообщение в переменной gAboutText
showMessage(gAboutText)
end

-- Собственно самое сообщение
gAboutText=[[This trainer was made by Cheat Engine
www.cheatengine.org]]

-- Обарботчик закрытия окна
function CloseClick()
closeCE() -- закрыть CE
return caFree -- лучше написать именно так, чтобы точно остановить Lua скрипт и завершить работу
end
</LuaScript>

Итак. Какие тут подводные камни и неприятности? Некоторые вещи вы не видите. Вы не знаете как создавался CETrainer_CHEAT0 и CETrainer-форма. Вы не видели как привязались обработчики CloseClick и AboutClick.

Вы вынуждены видеть этот запутанный, закрученный скрипт часть которого от вас скрыта.

За вас связывают события заморозки с другой функций грубо и неудобно. Потому что это всего лишь заготовка! И разобраться в ней могут не все. Мы же с вами будем писать другие скрипты. Удобные и более понятные. Надеюсь вы дочитали до этого места. Дальше будет проще. Прочитав то, что вы прочитаете дальше, вы лучше поймёте предыдущий код.

3. Учимся создавать форму трейнера

post-3-1311669364,2_thumb.png

Нашим основным руководством будет страница

http://code.google.com/p/cheat-engine/source/browse/trunk/Cheat%20Engine/bin/main.lua

Создадим сначала форму трейнера, которая корректно закрывается если нажать на крестик. В этом случае невидимый процесс Cheat Engine (посмотрите список процессов, там она будет) закроется. Это корректное закрытие.


<?xml version="1.0"?>
<CheatTable CheatEngineTableVersion="11">
<LuaScript>
-- Обработчик закрытия формы
-- sender это объект вызывавший обработчик,а в этом случае sender будет равен trainerForm
function onCloseClick(sender)
closeCE()
return caFree
end

trainerForm = createForm()
form_onClose(trainerForm, onCloseClick)
</LuaScript>
</CheatTable>

Дело в том, что в Lua функции должны быть описаны до того как будут использоваться. Именно поэтому onCloseClick расположена выше form_onClose(trainerForm, onCloseClick).

Если мы запустим этот файл, то в левом верхнем углу появится окно трейнера. При закрытии окно закрывается.

Теперь сделаем так, что форма располагалась по центру с некоторым названием.


<?xml version="1.0"?>
<CheatTable CheatEngineTableVersion="11">
<LuaScript>
function onCloseClick(sender)
closeCE()
return caFree
end

trainerForm = createForm()
form_onClose(trainerForm, onCloseClick)

form_centerScreen(trainerForm)
control_setCaption(trainerForm, "My first Lua-trainer" )
</LuaScript>
</CheatTable>

"My first Lua-trainer" - мой первый Lua-трейнер. На русском писать нельзя иначе форма не запуститься. Мне это тоже не нравиться, но лучше всегда писать заголовок формы на английском.

Когда мы работаетм с формой, то в руководстве смотрим Form Class. Там вы могли найти описания и form_centerScreen(), и form_onClose(), и createForm(). И воспользоваться этими функциями.

А так же вы могли найти такую строку:

Form Class: (Inheritance: ScrollingWinControl->CustomControl->WinControl->Control->Component->Object)

Это строка ваша подсказка и означает наследование классов.


ScrollingWinControl наследует CustomControl
CustomControl наследует WinControl
WinControl наследует Control
Control наследует Component
Component наследует Object

Описания этих классов вы можете найти там где я писал. Данное наследование позволяет узнать как использовать функции для нашего объекта trainerForm, которые бы мы хотели.

Поищем функцию которая могла бы установить название формы. И найдем класс Control и функцию:

control_setCaption()

Итак мы научились создавать форму и она корректно закрывается закрывая программу Cheat Engine окно которой по умолчанию скрыто.

4. Создадим кнопку About на форме, нажав на которую пользователь видит описание трейнера на английском языке.

post-3-1311675581,55_thumb.png

Итак ищем в руководстве по Lua-Engine информацию, которая поможет осуществить задуманное.

Вот кое-что про Кнопку:


Button Class: (Inheritance: ButtonControl->WinControl->Control->Component->Object)
createButton(owner): Creates a Button class object which belongs to the given owner. Owner can be any object inherited from WinControl

А вот, что про вывод Сообщения:


showMessage(text) : shows a messagebox with the given text
messageDialog(text, type, buttons...) : pops up a messagebox with a specific icon/sound with the specified buttons (mbok, mbyes, ....)


<?xml version="1.0"?>
<CheatTable CheatEngineTableVersion="12">
<LuaScript>
function onCloseClick(sender)
closeCE()
return caFree
end

trainerForm = createForm()
form_onClose(trainerForm, onCloseClick)

form_centerScreen(trainerForm)
control_setCaption(trainerForm, "My first Lua-trainer")

btnAbout = createButton(trainerForm)
control_setCaption(btnAbout, "About")
</LuaScript>
</CheatTable>

Вы увидите кнопку с названием "About" в верхнем левом углу формы трейнера. Она расположена явно не там где надо и ничего не делает.

Сделаем так чтобы кнопка размещалась в правом нижнем углу формы.


<?xml version="1.0"?>
<CheatTable CheatEngineTableVersion="12">
<LuaScript>
function onCloseClick(sender)
closeCE()
return caFree
end

trainerForm = createForm()
form_onClose(trainerForm, onCloseClick)

form_centerScreen(trainerForm)
control_setCaption(trainerForm, "My first Lua-trainer")

btnAbout = createButton(trainerForm)
control_setCaption(btnAbout, "About")

trFormWidth, trFormHeight = control_getSize(trainerForm)
btnAboutWidth, btnAboutHeight = control_getSize(btnAbout)

btnAboutX = trFormWidth - btnAboutWidth - 5
btnAboutY = trFormHeight - btnAboutHeight - 5

control_setPosition(btnAbout, btnAboutX, btnAboutY)
</LuaScript>
</CheatTable>

Да, получилось кнопка распалогается там где надо. Но событие нажатия на кнопку не показывает сообщения. Сделаем это.


<?xml version="1.0"?>
<CheatTable CheatEngineTableVersion="12">
<LuaScript>
function onCloseClick(sender)
closeCE()
return caFree
end

trainerForm = createForm()
form_onClose(trainerForm, onCloseClick)

form_centerScreen(trainerForm)
control_setCaption(trainerForm, "My first Lua-trainer")

btnAbout = createButton(trainerForm)
control_setCaption(btnAbout, "About")

trFormWidth, trFormHeight = control_getSize(trainerForm)
btnAboutWidth, btnAboutHeight = control_getSize(btnAbout)

btnAboutX = trFormWidth - btnAboutWidth - 5
btnAboutY = trFormHeight - btnAboutHeight - 5

control_setPosition(btnAbout, btnAboutX, btnAboutY)

abouTrnString = [[About my Trainer:

1) God mode: CTRL+1
2) Infinity ammo : CTRL+2



GameHackLab[RU], MasterGH(C), 2011]]

function onBtnAboutClick(sender)
showMessage(abouTrnString)
end
control_onClick(btnAbout, onBtnAboutClick)
</LuaScript>
</CheatTable>

Ну, вот теперь работает. Можно вывести сообщение с иконкой "Информация". Сделаем это.

Замените showMessage(AboutnString) на messageDialog(AboutnString, 2, 2)

post-3-1311675596,38_thumb.png

Вы наверно заметели, что код получается несколько сумбурным. Сделаем более удобнее.


<CheatTable CheatEngineTableVersion="12">
<LuaScript>

aboutTrnString = ""

function onCloseClick(sender)
closeCE()
return caFree
end

function onBtnAboutClick(sender)
messageDialog(aboutTrnString, 2, 2)
end

function CreateFormTrainer(captionWindow)
trainerForm = createForm()
form_onClose(trainerForm, onCloseClick)

form_centerScreen(trainerForm)
control_setCaption(trainerForm, captionWindow)

btnAbout = createButton(trainerForm)
control_setCaption(btnAbout, "About")

trFormWidth, trFormHeight = control_getSize(trainerForm)
btnAboutWidth, btnAboutHeight = control_getSize(btnAbout)

btnAboutX = trFormWidth - btnAboutWidth - 5
btnAboutY = trFormHeight - btnAboutHeight - 5

control_setPosition(btnAbout, btnAboutX, btnAboutY)
control_onClick(btnAbout, onBtnAboutClick)
end

aboutTrnString = "About my Trainer:\n\r\n\r1) God mode: CTRL+1\n\r2) Infinity ammo : CTRL+2\n\r\n\r\n\rGameHackLab[RU], MasterGH(C), 2011"
CreateFormTrainer("My first Lua-trainer")
</LuaScript>
</CheatTable>
<?xml version="1.0"?>

Этот код делает тоже самое. Если вы поняли, что я делал, то вы уже можете что-то делать самостоятельно.

5. Картинка и музыка в трейнере

post-3-1311681975,92_thumb.png

Скачайте после прочтения руководства:

Trainer.rar

Для примера у меня есть некоторая картинка и трек музыки.

Задача отобразить картинку в окне трейнера и проигрывать музыку. Музыку можно было бы остановить и запустить. Музыка проигрывается циклически по умолчанию. Да, и сделать так чтобы размер формы автоматически подстраивался под размер картинки.

Сделаем это.

Файл картинки назовём Trainer.jpeg.

Файл музыки назовем Trainer.xm.

Расположим эти файлы в ресурсах нашего файла Trainer.CETRAINER разметку которго мы пишем.

Для этого запустим Cheat Engine и перетащим в неё Trainer.CETRAINER.

В главном меню раскроем "Table" и вызовем "Add file" и добавим файл картинки, а затем файл музыки.

Разметка Trainer.CETRAINER получится следующей:


<?xml version="1.0"?>
<CheatTable CheatEngineTableVersion="12">
<Files>
<Trainer.jpeg>954E755C14..вырезано..1F</Trainer.jpeg>
<Trainer.xm>ECBC09985CD5752..вырезано..04</Trainer.xm>
</Files>
<CheatEntries/>
<UserdefinedSymbols/>
<LuaScript>aboutTrnString = ""

function onCloseClick(sender)
closeCE()
return caFree
end

function onBtnAboutClick(sender)
messageDialog(aboutTrnString, 2, 2)
end

function CreateFormTrainer(captionWindow)
trainerForm = createForm()
form_onClose(trainerForm, onCloseClick)

form_centerScreen(trainerForm)
control_setCaption(trainerForm, captionWindow)

btnAbout = createButton(trainerForm)
control_setCaption(btnAbout, "About")

trFormWidth, trFormHeight = control_getSize(trainerForm)
btnAboutWidth, btnAboutHeight = control_getSize(btnAbout)

btnAboutX = trFormWidth - btnAboutWidth - 5
btnAboutY = trFormHeight - btnAboutHeight - 5

control_setPosition(btnAbout, btnAboutX, btnAboutY)
control_onСlick(btnAbout, onBtnAboutClick)
end

aboutTrnString = "About my Trainer:\n\r\n\r1) God mode: CTRL+1\n\r2) Infinity ammo : CTRL+2\n\r\n\r\n\rGameHackLab[RU], MasterGH(C), 2011"
CreateFormTrainer("My first Lua-trainer")

</LuaScript>
</CheatTable>

Я привел разметку не всю, т.к. она получилась бы большой: 51.2 кб. Пока это не окончательный размер Lua-трейнера.

Выше ссылка на Trainer.CETRAINER.

Загружаем музыку из ресурсов и проигрываем её следующим образом.


XMFILE=findTableFile('Trainer.xm')
xmplayer_playXM(XMFILE)

Загружаем картинку из ресурсов и отображаем её на трейнере следующим образом.


trImage=createImage(trainerForm)
setProperty(trImage, "AutoSize", "true")
picture=image_getPicture(trImage)
stream=findTableFile('Trainer.jpeg')
picture_loadFromStream(picture,stream)

Как вы могли видеть функция findTableFile() возвращает поток данных из ресурсов.

Новые изменения коснулись только функции CreateFormTrainer(captionWindow).


<?xml version="1.0"?>
<CheatTable CheatEngineTableVersion="12">
<Files>
<Trainer.jpeg>954E755C14..вырезано..1F</Trainer.jpeg>
<Trainer.xm>ECBC09985CD5752..вырезано..04</Trainer.xm>
</Files>
<CheatEntries/>
<UserdefinedSymbols/>
<LuaScript>
aboutTrnString = ""

function onCloseClick(sender)
closeCE()
return caFree
end

function onBtnAboutClick(sender)
messageDialog(aboutTrnString, 2, 2)
end

function CreateFormTrainer(captionWindow)
trainerForm = createForm()
form_onClose(trainerForm, onCloseClick)
control_setCaption(trainerForm, captionWindow)
setProperty(trainerForm, "AutoSize", "true")


trImage=createImage(trainerForm)
setProperty(trImage, "AutoSize", "true")
picture=image_getPicture(trImage)
stream=findTableFile('Trainer.jpeg')
picture_loadFromStream(picture,stream)

btnAbout = createButton(trainerForm)
control_setCaption(btnAbout, "About")
trFormWidth, trFormHeight = control_getSize(trainerForm)
btnAboutWidth, btnAboutHeight = control_getSize(btnAbout)
btnAboutX = trFormWidth - btnAboutWidth - 5
btnAboutY = trFormHeight - btnAboutHeight - 5
control_setPosition(btnAbout, btnAboutX, btnAboutY)
control_onСlick(btnAbout, onBtnAboutClick)

form_centerScreen(trainerForm)


XMFILE=findTableFile('Trainer.xm')
xmplayer_playXM(XMFILE)
end

aboutTrnString = "About my Trainer:\n\r\n\r1) God mode: CTRL+1\n\r2) Infinity ammo : CTRL+2\n\r\n\r\n\rGameHackLab[RU], MasterGH(C), 2011"
CreateFormTrainer("My first Lua-trainer")
</LuaScript>
</CheatTable>

Картинка отображается и проигрывается циклически музыка. Надо обязательно сделать кнопку остановки и продолжения проигрывания музыки.


<?xml version="1.0"?>
<CheatTable CheatEngineTableVersion="12">
<Files>
<Trainer.jpeg>954E755C14..вырезано..1F</Trainer.jpeg>
<Trainer.xm>ECBC09985CD5752..вырезано..04</Trainer.xm>
</Files>
<CheatEntries/>
<UserdefinedSymbols/>
<LuaScript>aboutTrnString = ""

function OnCloseClick(sender)
closeCE()
return caFree
end

function OnBtnAboutClick(sender)
messageDialog(aboutTrnString, 2, 2)
end

function OnMusicRunOrStop(sender)
if (xmplayer_isPlaying()) then
xmplayer_pause()
control_setCaption(btnMusic, "Music Off")
else
xmplayer_resume()
control_setCaption(btnMusic, "Music On")
end
end

function CreateFormTrainer(captionWindow)
trainerForm = createForm()
form_onClose(trainerForm, OnCloseClick)
control_setCaption(trainerForm, captionWindow)
setProperty(trainerForm, "AutoSize", "true")

trImage=createImage(trainerForm)
setProperty(trImage, "AutoSize", "true")
picture=image_getPicture(trImage)
stream=findTableFile('Trainer.jpeg')
picture_loadFromStream(picture,stream)

btnAbout = createButton(trainerForm)
setProperty(btnAbout, "AutoSize", "true")
control_setCaption(btnAbout, "About")
trFormWidth, trFormHeight = control_getSize(trainerForm)
btnAboutWidth, btnAboutHeight = control_getSize(btnAbout)
btnAboutX = trFormWidth - btnAboutWidth - 5
btnAboutY = trFormHeight - btnAboutHeight - 5
control_setPosition(btnAbout, btnAboutX, btnAboutY)
control_onСlick(btnAbout, OnBtnAboutClick)

btnMusic = createButton(trainerForm)
setProperty(btnMusic, "AutoSize", "true")
control_setCaption(btnMusic, "Music On")
btnMusicWidth, btnMusicHeight = control_getSize(btnMusic)
btnMusicX = btnAboutX - 5 - btnMusicWidth
btnMusicY = btnAboutY
control_setPosition(btnMusic, btnMusicX, btnMusicY)
control_onСlick(btnMusic, OnMusicRunOrStop)

form_centerScreen(trainerForm)

XMFILE=findTableFile('Trainer.xm')
xmplayer_playXM(XMFILE)
end

aboutTrnString = "About my Trainer:\n\r\n\r1) God mode: CTRL+1\n\r2) Infinity ammo : CTRL+2\n\r\n\r\n\rGameHackLab[RU], MasterGH(C), 2011"
CreateFormTrainer("My first Lua-trainer")
</LuaScript>
</CheatTable>

Теперь пользователь может проигрывать и останавливать музыку

Скачать файл Trainer.CETRAINER можно выше из архива Trainer.rar.

С интерфейсом трейнера думаю закончили, дальше будем разобраться с функциональностью.

Продолжение следует...

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.