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

MasterGH

Ветераны
  • Постов

    2 999
  • Зарегистрирован

  • Победитель дней

    129

Сообщения, опубликованные MasterGH

  1. 1) Да исключения хорошо было бы обрабатывать, если они возникают хотя бы два: нет процесса, нет доступа к адресу.

    2) По поводу вновь создаваемого

    VAM = new VAMemory("Need for Speed Underground 2");

    Так можно писать и возможно даже нужно в данном случае, т.к. нет кода поиска процесса или его запуска и подразумевается, что трейнер будет работать, если игра будет открыта и закрыта несколько раз (типа подстраховки, чтобы не запускать трейнер вновь). Помним, что сборщик мусора следит за "мусором в памяти" и можно писать new в случаях, когда он не очень часто применяется.

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

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Text;
    using System.Windows.Forms;

    namespace Trainer
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
    label2.Text = GameNFS.GetMoney();
    }

    private void button2_Click(object sender, EventArgs e)
    {
    var newMoneyValue = textBox1.Text.ToString();
    GameNFS.SetMoney(newMoneyValue);
    }
    }

    public static class GameNFS
    {
    const _processName = "Need for Speed Underground 2";
    const _addressMoney = 0x00861E74;

    public static string GetMoney()
    {
    var VAM = new VAMemory(_processName);
    var moneyValue = VAM.ReadUlong((IntPtr)_addressMoney);
    return Convert.ToString(moneyValue);
    }

    public string void SetMoney(string newMoneyValue)
    {
    var VAM = new VAMemory(_processName);
    var uintMoneyValue = uint.Parse(newMoneyValue)
    VAM.WriteByte((IntPtr)0x00861E74, uintMoneyValue);
    }
    }

    }

    На ошибки я не проверял...

  2. В группу добавлен.

    При публикация нужно писать версию игры.

    На счёт трейнера.

    Я рекомендую использовать MasterGHLuaTrainerSource_V1.lua и использовать Cheat Engine6.2 в качестве исполняемой программы для скриптов .CETRAINER.

  3. Класс VAMemory должен иметь методы чтения не только ReadByte, но и других. Соответственно Byte заменить на нужный тип.

    По аналогии Byte.Parse, так нужно заменить на нужный тип. Да и почти все ответы можно найти в MSDN.

  4. Еще вопрос как взломать звездочки?(Поконкретней)

    И как сделать так, что бы стрелять без перезарядки?(Поконкретней)

    Если своей работы ноль и вопросы общего характера, то и ответы на эти вопросы не могут быть подробнее и также относятся к ответам общего характера.

    << Еще вопрос как взломать звездочки?

    << И как сделать так, что бы стрелять без перезарядки?

    Ответ. Берете сканер памяти, отладчик/дизассемблер и исследуете машинный код который работает с адресом количества звёздочек и машинный код который работает с логикой перезарядки. Затем меняете код на тот, который даёт нужный результат.

  5. 2. Пока не вижу смысла вводить дополнительные модераторские посты, так как Кваз вполне справляется. Но насчет назначения "наместников" (модераторов в определенные разделы) мы с МастерGH подумаем.

    Вот на текущий момент опубликованная не по правилам тема. Kvaz этой темой не занимался к примеру.

    Один из лучших модераторов для форума "Трейнеры, скрипты, модули (PC, Windows)" этот тот человек который постоянно и чаще всех находится в этом форуме. Но это моё ИМХО.

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

  6. Я вот что хочу предложить. В разделе трейнеры создавать только одну тему для какой либо игры. Ее соответственно описать. И выкладывать в этой теме все для этой игры. Трейнеры таблицы.. И тд. И тп. А ни как сейчас. Одна тема с таблицей, другая с трейнером...

    Да, по правилам публикуется одна тема для одной игры. В этой теме писать скрипты, трейнеры, модули... для одной игры.

    Хочу предложить кандидатуры Grom-Skynet, ZOCKIR на доступ к модераторским функциям в форуме "Трейнеры, скрипты, модули (PC, Windows)". Если вы оба согласны, а также согласны Xipho, Kvazimado, то почему бы и нет.

    Кажется многие путают предназначение сайта и форума.

    У меня такое предложение - сделать как на cheatengine.org:

    сайт - для таблиц и софта.

    форум - для общения и обсуждения таблиц.

    ввод дополнительных правил и цензуры форуму на пользу не пойдёт ИМХО.

    Никто ничего не путает. Публикация файлов на форуме это временная мера.

    На сколько я знаю Xipho писал, что делал или делает поддержку публикации трейнеров. Так что ждём. Я в php и в настройках доступа не очень шарю.

  7. Версию эту искать я не буду. Версии которыми я пользуюсь можно было увидеть по ссылке которая опубликована мной в соответствующей теме. Там есть более новые версии. Но я так понял проблема в этих ошибках.

    frmStringMapUnit.pas(31,26) Error: Identifier not found "TREGExprEngine" 
    frmStringMapUnit.pas(31,26) Error: Error in type definition
    frmStringMapUnit.pas(41,146) Error: Identifier not found "TREGExprEngine"
    frmStringMapUnit.pas(69,26) Error: Identifier not found "TRegExprEngine"
    frmStringMapUnit.pas(69,26) Error: Error in type definition
    frmStringMapUnit.pas(85,1) Fatal: There were 5 errors compiling module, stopping

    Т.е здесь ошибка в отсутсвии класса TREGExprEngine. Этот класс нужен для вычисления регулярных выражений. Он находится в модуле RegExpr версии от 2008 года (C:\lazarus32\fpc\2.5.1\source\packages\regexpr\src\regexpr.pp). Также нужно иметь regex.pp(C:\lazarus32\fpc\2.5.1\source\packages\regexpr\src\regex.pp)

    Как можно было заметить со сборкой с сайта снапшотов(ссылку на него я давал в теме комплияции CE) с lazarus32 всё пучком, а с lazaruz64 указанные файлы regexpr.ppи RegExpr.pp старые вроде аж от 2002 (или 2004) года. Раньше в ревизиях CE класс TREGExprEngine не использовался.

    Выход в данном случае, видимо, установить/обновить новый пакадж(или пакет) или заменить вручную старые файлы на новые. Пока эту проблему я тоже не решил и компилирую CE 32-разрядным lazarus-ом с сайта снапшотов.

  8. Внимание

    Я что забыл написать.

    На форуме control_onClick(btnAboutExit, OnMusicStopAndExit) там где красная буковка надо исправить на заглавную. Иначе у вас скрипт будет выдавать ошибку. Дело в том что форум автоматически исправляет букву "C" на букву нижнего регистра для защиты от XSS.

            btnAboutExit = createButton(formInfo)
    control_setCaption(btnAboutExit,"Exit")
    btnAboutExitWidth, btnAboutExitHeight = control_getSize(btnAboutExit)
    control_setPosition(btnAboutExit, formInfoWidth - 3 - btnAboutExitWidth, formInfoHeight - 3 - btnAboutExitHeight)
    control_onСlick(btnAboutExit, OnMusicStopAndExit) // здесь исправить!

  9. function timerGUIAboutLabel()

    if deltaAboutY < -50*15 then
    formInfoWidth, formInfoHeight = control_getSize(formInfo)
    deltaAboutY = formInfoHeight + 10
    else
    deltaAboutY = deltaAboutY - 1
    end

    control_setPosition(AboutLbl, 40, deltaAboutY) -- вот эта команда устанавливает позицию длинной строки титров с фиксированной шириной
    end

    Прежде всего на скорость влияет:

    timer_setInterval(timerGUIAbout, 20)

    Здесь 20 это интервал таймера, чем он больше, тем медленнее.

    Ещё скорость можно увеличить перемещая строку не на одну позицию, а более:

    function timerGUIAboutLabel()

    if deltaAboutY < -50*15 then
    formInfoWidth, formInfoHeight = control_getSize(formInfo)
    deltaAboutY = formInfoHeight + 10
    else
    deltaAboutY = deltaAboutY - 1 -- если изменить 1 на большее значение, то текст будет двигаться менее плавно, но быстрее
    end

    control_setPosition(AboutLbl, 40, deltaAboutY)
    end

  10. post-3-1317792451,09_thumb.png

    Не забудьте указать свой путь к треку с музыкой



    function OnMusicStopAndExit(sender)

    if (xmplayer_isPlaying()) then
    xmplayer_pause()
    else
    xmplayer_resume()
    end
    form_hide(formInfo)

    end

    deltaAboutY = 0

    function timerGUIAboutLabel()

    if deltaAboutY < -50*15 then
    formInfoWidth, formInfoHeight = control_getSize(formInfo)
    deltaAboutY = formInfoHeight + 10
    else
    deltaAboutY = deltaAboutY - 1
    end

    control_setPosition(AboutLbl, 40, deltaAboutY)
    end

    function ShowFormInfo()

    formInfo = createForm(true)
    control_setCaption(formInfo, "About Trainer")
    form_onClose(formInfo, OnMusicStopAndExit)

    formInfoWidth, formInfoHeight = control_getSize(formInfo)

    aboutPanel = createPanel(formInfo)
    control_setPosition(aboutPanel, 10, 10)
    control_setSize(aboutPanel, formInfoWidth - 20, formInfoHeight - 40)

    AboutLbl = createLabel(aboutPanel)

    deltaAboutY = formInfoHeight+20
    control_setPosition(AboutLbl, 40, formInfoHeight+20)
    baseString = " BLA .. BLA ... BLA ... BLA .. BLA ... BLA\n\r"

    for i=1, 50 do
    baseString = baseString..i..")" .." BLA .. BLA ... BLA ... BLA .. BLA ... BLA\n" --i .. ") ".. baseString
    end

    control_setCaption(AboutLbl, baseString)

    btnAboutExit = createButton(formInfo)
    control_setCaption(btnAboutExit,"Exit")
    btnAboutExitWidth, btnAboutExitHeight = control_getSize(btnAboutExit)
    control_setPosition(btnAboutExit, formInfoWidth - 3 - btnAboutExitWidth, formInfoHeight - 3 - btnAboutExitHeight)
    control_onClick(btnAboutExit, OnMusicStopAndExit)

    form_centerScreen(formInfo)

    xmplayer_playXM('C:\\Users\\master\\Desktop\\Gamehack\\CE\\CETrainer\\TrainerTest\\Trainer_GameHackLab[RU]\\GameHackLab[RU]_Trainers\\Resources(v1.0)\\musics\\SnD - Ahead DVD Ripper 2.4.1 kg.xm')

    if timerGUIAbout == nil then
    timerGUIAbout = createTimer(formInfo,false)
    timer_setInterval(timerGUIAbout, 20)
    timer_onTimer(timerGUIAbout, timerGUIAboutLabel)
    end
    timer_setEnabled(timerGUIAbout, true)
    end

    ShowFormInfo()
    formInfo = nil

  11. Ramil, это надо писать Дарк Байту на английском. на его форуме.

    Ошибка похоже связана с тем что не хватает где-то места для записи 753 МБ. Происходит исключительная ситуация и исключение это заведомо не обрабатывается так чтобы продолжить сканирование, а просто как видим выдаётся сообщение.

  12. К тому же, сообщение WM_NCLBUTTONDOWN предназначено как раз для обработки нажатия мыши на окне без заголовка.

    Такого предназначения в MSDN не указано. И вообще формулировки о том, что это сообщение предназначено для чего-то нет. Есть описание в связи с чем это сообщение появляется. И появляется по клику по не рабочей клиентской области и это не только заголовок. Никакой речи не может быть чтобы рекомендовалось или только использовалось WM_NCLBUTTONDOWN с HTCAPTION. Есть только одна рекомендация, где-то я её видел. Использовать только документированные функции и константы. В примере который я привёл одна из "переменных" не документирована в winuser.h.

  13. :) Читайте статьи и форум.

    Ваш вопрос это вопрос "новичка",а новичок должен учиться самостоятельно по существующим статьям, видео и т.п. Если хотите больше шансов на ответ, то нужно задавать более конкретные вопросы, предоставляя больше начальной и подробной информации.

    По поводу скорострельности и отдачи боюсь, если Вам ответят как это сделать Вы все равно ничего не поймете. Кстати и не каждому это под силу.

  14. control_setPosition() - устанавливает позицию объекта TControl или объекта, который наследует класс TControl.

    Файл примера:

    DragWindow.rar

    Статья:

    Перетаскиваемая форма на Lua.rar

    Код из статьи:


    dragTimer = nil

    function OnTimerDrag()
    mx,my = getMousePos()
    control_setPosition(UDF1, mx+dx, my+dy)
    end

    function CEImage1MouseDown(sender, button, x, y)

    if dragTimer == nil then

    dragTimer = createTimer(UDF1, false)
    timer_setInterval(dragTimer, 10)
    timer_onTimer(dragTimer, OnTimerDrag)

    mx,my = getMousePos()
    x, y = control_getPosition(UDF1)
    dx = x - mx
    dy = y - my
    timer_setEnabled(dragTimer, true)

    return
    end

    if not timer_getEnabled(dragTimer) then
    mx,my = getMousePos()
    x, y = control_getPosition(UDF1)
    dx = x - mx
    dy = y - my
    timer_setEnabled(dragTimer, true)
    end

    end

    function CEImage1Click(sender)
    if dragTimer == nil then
    return
    end

    if timer_getEnabled(dragTimer) then
    timer_setEnabled(dragTimer, false)
    object_destroy(dragTimer)
    dragTimer = nil
    end
    end

    function CEButtonExitClick(sender)
    closeCE()
    return caFree
    end
    form_show(UDF1)

    Пока не могу выделить время на публикацию статьи на главном сайте.

  15. Пример, который я предложил Дарк Байту.

    function FormMouseDown(sender, button, x, y) 

    ReleaseCapture() // новая функция
    frmHandle = wincontrol_getHandle(UDF1) // новая функция

    if frmHandle==nil then
    return

    WM_SYSCOMMAND = 274
    SendMessageA(frmHandle,WM_SYSCOMMAND,0xF012,0) // новая функция
    end

    Надеюсь он введёт поддержку. Ну а до тех пор, проще всего сделать движение формы за мышкой по текущим и новым её координатм обрабатывая события удерживания и отпуска.

    --------

    Я всё-таки решил тебе чуть помочь, потому что понял, что по первому способу у тебя трудности. Тем не менее тебе ещё предстоит написать dx и dy работу для того чтобы курсор мышки был там где он должен быть а не в левом верхнем углу при перетаскивании.

    post-3-1317401557,84_thumb.jpg

    На форме UDF1 есть картинка. Когда на картинку нажали или был клик, то ставим булевы переменные. Таймер работает по логике этих переменных. В данном коде курсор всегда будет в верхнем левом углу и только при клике на картинку. Остальное предоставляю тебе доработать самому.


    form_show(UDF1)

    isMouseDown = false;
    isMouseUp = false;


    --dx = 0
    --dy = 0

    function OnTimerDrag()
    if isMouseDown then
    mx,my = getMousePos()

    --dx = dx - mx
    --dy = dy - my

    --x, y = control_getPosition(UDF1)
    control_setPosition(UDF1, mx, my)

    end

    end


    timer1 = createTimer(UDF1)
    timer_setInterval(timer1, 50)
    timer_onTimer(timer1, OnTimerDrag)

    function CEImage1MouseDown(sender, button, x, y)
    isMouseDown = true
    isMouseUp = false
    end

    function FormClick(sender)
    isMouseDown = false
    isMouseUp = true
    end

    Ну и на всякий случай, таблица в формате .CT.

    DragWindow.rar

    Откроешь таблицу.

    Согласишься запустить Lua -скрипт.

    Удерживаем левую кнопку мышки на картинке и тянем куда-нибудь и видим перемещение.

  16. По точнее не могу объяснить :)

    Как я писал используй первый способ.

    Простой способ 1: перемещать форму за курсором когда нажата левая кнопка мышки. Это способ можно найти в Интернете задав запрос "перемещение формы за курсором"
  17. Если было бы именно так просто, то я бы наверняка написал бы готовый ответ :)

    Речь идёт о Lua-Engine поддержке, а не о полноценном языке программирования под Windows.

    1) Lua-engine явно не поддерживает посылку сообщений: SendMessage(Handle,WM_NCLBUTTONDOWN,HTCAPTION,0)

    2) Явно не поддерживает поиск дескриптора окна.

    3) Мелочь, но все же, имхо, некрасиво эмулировать HTCAPTION, когда заголовка в окне не видно. Если делаем перетаскивание, то делаем его через WM_SYSCOMMAND и SC_DRAGMOVE.

    Первый и второй пункт означают, что нужно изворачиваться с автоассемблером совместно с Lua-Engine. Вижу несколько способов решения с таймером/потоком или тот способ который я описал. Да, ещё один способ написать Даркб Байту чтобы ввел поддержу работу с дескрипторами форм.

  18. Данную функцию нужно писать.

    Простой способ 1: перемещать форму за курсором когда нажата левая кнопка мышки. Это способ можно найти в Интернете задав запрос "перемещение формы за курсором"

    Самый красивый способ 2 это сделать инъекцию кода в процесс CE с помощью АА-скрипта на обработку любых поступающих сообщений в форму трейнера с выполнением следующего условия. Если было сообщение о нажатии левой кнопки мышкив окне трейнера, то выполнить внутри


    Новая память:
    WM_SYSCOMMAND = 0x0112;
    SC_DRAGMOVE = 0xF012;

    ReleaseCapture();
    SendMessage(Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
    Возврат назад

    Естественно этот код нужно написать на автоассемблере и это надо сделать на Lua-Engine открыв процесс CE и на том же Lua коде использовать функцию выполнения скрипта автоассемблера. Сделав инъекцию кода можно спокойно отключиться от процесса CE. Если это автономный трейнер, то нужно делать инъекцию в процесс этого трейнера и затем отключиться от него.

  19. Как уже написали у версии CE 6.1 проблемы с кодировкой. А точнее с ANSI и UTF8. В CE 6.1 не используйте русские символы: ни в таблицах, ни в трейнерах, не в формах, не в путях каких-либо, ни в комментариях. Используйте только английский язык.

    Русский текст можно делать на картинках.

    В CE 6.2 этих проблем не будет, т.е тех о которых сообщали Дарк Байту.

  20. А что сложного? :) В "документации" всё написано ( все функции написаны в main.lua, который лежит в папке с CE )

    Предполагается, что фай музыки добавлен в ресурсы.

    Создана форма и на форме есть кнопка, у которой есть событие CEButton1Click

    musicName = 'music.xm'

    XMFILE=findTableFile(musicName)
    if (XMFILE==nil) then
    print('Er.: File '..musicName..' is not found!')
    setProperty(CEButton1, "Caption", "Er.")
    else
    xmplayer_playXM(XMFILE)
    setProperty(CEButton1, "Caption", "Music On")
    end

    function CEButton1Click(sender)
    if xmplayer_isPlaying() then
    xmplayer_pause()
    setProperty(CEButton1, "Caption", "Music Off")
    else
    xmplayer_resume()
    setProperty(CEButton1, "Caption", "Music On")
    end
    end

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

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

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