MasterGH Опубликовано 25 июля, 2011 Поделиться Опубликовано 25 июля, 2011 Новое руководство 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 без шифрования. Посмотрим что получилось в файле. Выглядит устрашающе. Скорее всего Вы сейчас ничего не поймете.<?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() endendmemoryrecordhotkey_onPostHotkey(memrec0_hotkey0,onPostHotkey0)control_setVisible(CETrainer_SEPERATOR, false)strings_add(getAutoAttachList(), "Test.exe")gBeepOnAction=falseform_show(CETrainer)function AboutClick() showMessage(gAboutText)endgAboutText=[[This trainer was made by Cheat Enginewww.cheatengine.org]]function CloseClick() closeCE() return caFree --onClick doesn't care, but onClose would like a resultend--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() endendmemoryrecordhotkey_onPostHotkey(memrec0_hotkey0,onPostHotkey0)control_setVisible(CETrainer_SEPERATOR, false)strings_add(getAutoAttachList(), "Test.exe")gBeepOnAction=falseform_show(CETrainer)function AboutClick() showMessage(gAboutText)endgAboutText=[[This trainer was made by Cheat Enginewww.cheatengine.org]]function CloseClick() closeCE() return caFree --onClick doesn't care, but onClose would like a resultend--TRAINERGENERATORSTOP-- </LuaScript> Я напишу тоже самое только с моими комментраиями.<LuaScript>-- Получить коллекцию записей addresslist в существующих таблицах Cheat Engine-- Я не знаю почему getAddressList, когда надо было названить иначе, потому что у вас могут быть не только адреса в таблицах, но и скрипты.addresslist=getAddressList()-- Получить запись memrec0 по ID из коллекции, где ID равно нулю. Это как раз первая моя запись. Помните выше, была ветвь <CheatEntry>...memrec0=addresslist_getMemoryRecordByID(addresslist,0)-- Получить горячие клавиши в memrec0_hotkey0 из записи memrec0memrec0_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 - компонент чита сгенерированный CEmemoryrecordhotkey_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 Enginewww.cheatengine.org]]-- Обарботчик закрытия окнаfunction CloseClick() closeCE() -- закрыть CE return caFree -- лучше написать именно так, чтобы точно остановить Lua скрипт и завершить работуend</LuaScript> Итак. Какие тут подводные камни и неприятности? Некоторые вещи вы не видите. Вы не знаете как создавался CETrainer_CHEAT0 и CETrainer-форма. Вы не видели как привязались обработчики CloseClick и AboutClick. Вы вынуждены видеть этот запутанный, закрученный скрипт часть которого от вас скрыта. За вас связывают события заморозки с другой функций грубо и неудобно. Потому что это всего лишь заготовка! И разобраться в ней могут не все. Мы же с вами будем писать другие скрипты. Удобные и более понятные. Надеюсь вы дочитали до этого места. Дальше будет проще. Прочитав то, что вы прочитаете дальше, вы лучше поймёте предыдущий код.3. Учимся создавать форму трейнераНашим основным руководством будет страница 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 наследует CustomControlCustomControl наследует WinControlWinControl наследует ControlControl наследует ComponentComponent наследует ObjectОписания этих классов вы можете найти там где я писал. Данное наследование позволяет узнать как использовать функции для нашего объекта trainerForm, которые бы мы хотели.Поищем функцию которая могла бы установить название формы. И найдем класс Control и функцию:control_setCaption()Итак мы научились создавать форму и она корректно закрывается закрывая программу Cheat Engine окно которой по умолчанию скрыто.4. Создадим кнопку About на форме, нажав на которую пользователь видит описание трейнера на английском языке.Итак ищем в руководстве по 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 textmessageDialog(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+12) Infinity ammo : CTRL+2GameHackLab[RU], MasterGH(C), 2011]] function onBtnAboutClick(sender) showMessage(abouTrnString) end control_onClick(btnAbout, onBtnAboutClick) </LuaScript></CheatTable>Ну, вот теперь работает. Можно вывести сообщение с иконкой "Информация". Сделаем это.Замените showMessage(AboutnString) на messageDialog(AboutnString, 2, 2)Вы наверно заметели, что код получается несколько сумбурным. Сделаем более удобнее.<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. Картинка и музыка в трейнереСкачайте после прочтения руководства: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. С интерфейсом трейнера думаю закончили, дальше будем разобраться с функциональностью.Продолжение следует... Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения