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

MasterGH

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

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

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

    129

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

  1. Спойлер
    В 16.02.2023 в 18:33, Alex2411 сказал:

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

    В 16.02.2023 в 18:33, Alex2411 сказал:

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

    Определиться, что именно тебе интересно и чем ты сам хочешь заниматься.

    Если самому нечем заниматься. то это вопрос к самому себе. 

    Если же есть чем заниматься, но не дают, то это вопрос к админам. Лучше об этом сообщать (в тех же пожеланиях).

    В 16.02.2023 в 18:33, Alex2411 сказал:

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

    В 16.02.2023 в 18:33, Alex2411 сказал:

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

    Я бы смотрел в строну образования. Gamehacklab[RU] может мотивировать в изучении программирования и тем самым в выборе IT-специальности.

    Дать понять. что это за ресурс. 

    1) Для тех, кто просто ищут готовые читы, трейнеры

    2) Для тех, кто заказывает и продает услуги по читам.

    3) Для тех, кто учиться.

    Мне кажется, что третья категория совсем неочевидная. Человек, не понимает. Видит форум. Разделы. Первую тему, которую он создаст это "как найти готовые читы или трейнер". Ему скажут или сам делай и учись (смотри курсы), или ступай в заказы. И нет такого, чтобы была мотивация разобраться в том, как самому написать скрипт. Зато есть мотивация — выложи готовое и скачай готовое. Т.е. то, что лежит на видном месте: готовые трейнеры, готовые таблицы, готовые скрипты.  А еще категории форумов неоднозначно сформулированны о том, что в них обсуждается. То ли категория для вопросов, как читы готовые найти или категория о том, кто их смог бы помочь сделать. В категории должно быть все-таки очевидно написано, какие темы там будут либо дайте готовое, либо я буду учиться и нужна помощь. В общем такое видение у меня.

     

  2. Судя по посту Xipho, есть надежда, что хоть какой-то форум будет

     

    Я предлагаю идею привязать активных пользователей к разделам форума. 

    1. повторяющиеся вопросы — разрешать. Для этого специальный лояльный модератор-помогатор и специальный раздел "Вопросы для начинающих". У раздела создать подразделы. Несколько. Пока не знаю какие. Я бы нзначил Питроника(желание помочь) и Гарика(вежливость + опыт) на этот раздел. Название подразделов обсудить с ними.
    2.  готовые ответы — разрешать. Раздел "Вопрос-ответ". Этот раздел специально для тех, кому надо быстро и без проблем получить ответ и не ковыряться по два часа.  Назначил бы модератором Partizan. Т.к. он выдает готовые ответы часто. Но, если раздел для начинающих, то Partizan там не пишет готовые ответы сразу. Подразделы здесь обсудить с Partizan
    3. раздел "Опытные". На него поставить imaginary, justHack. Подразделы обсудить с ними. В этом разделе нельзя задавать "тупых вопросов". Иначе перенаправят тему для начинающих. Рекомендую сделать в этой теме FAQ. Чтобы самим не забыть, что вопросы уже обсуждали.
    4. Раздел "общение". Подраздел "Решение вопросов". Поставить Garik66, SerVick, Antonshka для решение споров. Цель — найти компромисс. Сообщения с разборками отправлять туда или создавать темы отельные. В конце темы — принятие решения. Есть спор возник, то его надо обязательно решить и написать в конце темы решение.
    5. DieVisn и Alex2411 могут быть модераторами в разделе публикаций. Например в подразделе "таблицам CE". их контролю содержания, что они работают. Следить за отвзывами по таблицам. Если, конечно, Alex2411 захочет и остальные не будут против.

    Ну, как-то так. Т.е. идея разделы разбить по активным позициям иначе мы не сдвинемся — никто писать не будет, т.к. друг друга "блокируем" и начинает какой-нибудь разбор полетов.

    • Понравилось 2
  3. Есть множество предложений создать бесплатный форум. Примеры

    Можно будет свободно общаться как и раньше.

    У кого-то будет время и тот сможет наполнять разделы.

    Кто-то сможет быть модератором.

    И совсем необязательно будущий форум закрывать, если там не будет активности или не будет времени им заниматься.

     

    Согласовать надо два момента (это к тебе xipho):

    1) объявление о том, что форум переехал по другому адресу
    2) ссылку на этот форум разместить по возможности на видом месте. Чтобы человек мог перейти по ссылке.

     

    Этот вариант для тех, кто хочет продолжать общаться на форуме, создавать темы, писать комментарии, ставить оценки и т.п.

    • Понравилось 1
    • Плюс 1
  4. Я не особо любитель автономных трейнеров. Если бы я заморочился, то т.к. форма генерируемого трейнера продолжает работать с обычными MemoryRecord  из таблицы CE, то можно в MemoryRecord подменять Hotkey. Я бы все удалил с формы. Создал бы сначала CECheckbox1, CEEdit1 и связал бы их с некоторым MemoryRecord по уникальному названию. В MemoryRecord подменял бы Hotkey через обработчик CEEdit1. По esc клавише стирать все, что в CEEdit1

    Спойлер

    image.png

    Потом бы для остальных записей по аналогии...

    На мой взгляд, это большие заморочки и сложнее чем если писать на WinAPI + язык программирования.  Я бы предложил просто пользоваться  *.CT-таблицей 🙂 

     

    • Плюс 1
  5. Спойлер

    image.png

     

     

    Разобраться будет непросто. Основной принцип надо уловить.

    1) userDefinedKeys - Lua-таблица с hot-keys. Не более 5 комбинаций нажатий. В эту таблицу происходит запись и чтение.

    2) (object1.ClassName=='tcheat') and (object2.ClassName=='TMemoryRecordHotkey') это типы недокументированные в celua.txt. Экземпляры этих типов генерируются на форме при создании hot-keys

    Спойлер

    image.png

    3) Сколько опций нагенерировали на форме, столько надо добавить потом. например

    addChangeHotkeyKeysFunctionality(CETrainer.CHEAT0,memrec0_hotkey0)
    addChangeHotkeyKeysFunctionality(CETrainer.CHEAT1,memrec1_hotkey0)
    addChangeHotkeyKeysFunctionality(CETrainer.CHEAT2,memrec2_hotkey0)

    4) userPressedKey - обработчик нажатий в поле ввода текста, который будет работать с таблицей кодов hotkeys userDefinedKeys на 5 нажатий

    5) clearHotkey() - обработчик клика на кнопку, очистит таблицу кодов hotkeys userDefinedKeys

    6) -- создание формы changeHotkeyKeysForm "local function formCreate()". 

     

    Принцип, который надо понять и уловить состоит в подмене хоткеев в tcheat и TMemoryRecordHotkey.  Как именно подменяется можно увидеть по исходникам и по документации. К сожалению, документировано не все.  Те, кто постоянно лазят на форуме CE, по исходником CE они знают и описание tcheat  и TMemoryRecordHotkey.

     

    С моими комментариями:

     

    Спойлер
    -- обработчик нажатий до 5 hot-keys на поле для поля CEEdit1.OnKeyDown = userPressedKey (ниже задается)
    -- userDefinedKeys = {} таблица hot-keys
    local function userPressedKey(sender, key)
      if userDefinedKeys[5]==0 then
        for i=1,5 do
          if userDefinedKeys[i]==0 then
            userDefinedKeys[i]=key
            break
          else
            if userDefinedKeys[i]==key then break end
          end
        end
      end
      -- преобразование таблицы hot-keys в строку и запись в поле changeHotkeyKeysForm.CEEdit1.Text
      changeHotkeyKeysForm.CEEdit1.Text=convertKeyComboToString(userDefinedKeys)
      return 0
    end
    -- Обработчик для очистки hot-key
    local function clearHotkey()
      userDefinedKeys={0,0,0,0,0}
      changeHotkeyKeysForm.CEEdit1.Text=convertKeyComboToString(userDefinedKeys)
      changeHotkeyKeysForm.CEEdit1.setFocus()
    end
    -- создание формы changeHotkeyKeysForm
    local function formCreate()
      changeHotkeyKeysForm=createForm(false)
      changeHotkeyKeysForm.Name = 'changeHotkeyKeysForm'
      changeHotkeyKeysForm.Caption = 'Hotkey Manually Set'
      changeHotkeyKeysForm.Width = 300
      changeHotkeyKeysForm.Height = 120
      changeHotkeyKeysForm.Position = poScreenCenter
      changeHotkeyKeysForm.OnClose =
         function ()
           changeHotkeyKeysForm.CEEdit1.setFocus()
           return caHide
         end
    
      local CELabel1=createLabel(changeHotkeyKeysForm)
      CELabel1.Name = 'CELabel1'
      CELabel1.Left = 20
      CELabel1.Top = 20
      CELabel1.Caption = 'Set hotkey:'
    
      local CEEdit1=createEdit(changeHotkeyKeysForm)
      CEEdit1.Name = 'CEEdit1'
      CEEdit1.Text = ''
      CEEdit1.AnchorSideLeft.Control = CELabel1
      CEEdit1.AnchorSideTop.Control = CELabel1
      CEEdit1.AnchorSideTop.Side = asrBottom
      CEEdit1.Height = 25
      CEEdit1.Width = 248
      CEEdit1.BorderSpacing.Top = 4
    
      local clearButton=createButton(changeHotkeyKeysForm)
      clearButton.Name = 'clearButton'
      clearButton.AnchorSideLeft.Control = CEEdit1
      clearButton.AnchorSideTop.Control = CEEdit1
      clearButton.AnchorSideTop.Side = asrBottom
      clearButton.Height = 30
      clearButton.Width = 80
      clearButton.BorderSpacing.Top = 8
      clearButton.Caption = 'Clear'
    
      local applyButton=createButton(changeHotkeyKeysForm)
      applyButton.Name = 'applyButton'
      applyButton.AnchorSideLeft.Control = clearButton
      applyButton.AnchorSideLeft.Side = asrBottom
      applyButton.AnchorSideTop.Control = clearButton
      applyButton.Height = 30
      applyButton.Width = 80
      applyButton.BorderSpacing.Left = 10
      applyButton.Caption = 'Apply'
    
      CEEdit1.OnKeyDown = userPressedKey -- обработчки нажатий
      -- https://lazarus-ccr.sourceforge.io/docs/lcl/controls/tmousebutton.html для записи хот-кей мышки.
      local mbtn={false,true,true,true}
      CEEdit1.OnMouseDown = function (s,k) if mbtn[k] then s.OnKeyDown(s,k+2) end end
      
      clearButton.OnClick = clearHotkey    -- обработчик очистки hot-keys
      applyButton.ModalResult = mrYes      -- apply button
    end
    
    -- Обработчик кнопки смены hot-key. Показывает форму смены hot-keys
    function changeHotkeyKeys(hotkey)
      -- если форма не создана, то создать
      if not changeHotkeyKeysFormCreated then
        changeHotkeyKeysFormCreated = true
        formCreate()
      end
    
      if hotkey==nil then return end
      -- таблица из пользовательский hot-keys. Максимум 5
      userDefinedKeys={0,0,0,0,0}
      -- проверка на свопаданеие для ClassName=='TGenericHotkey' или на "TMemoryRecordHotkey"
      if hotkey.ClassName=='TGenericHotkey' then
        -- если TGenericHotkey, то запись клавиш
        -- TGenericHotkey, вроде, не документирована. Так что либо лезем в git либо запоминаем что есть .getKeys() у hotkey
        for i,v in ipairs({hotkey.getKeys()}) do
          userDefinedKeys[i]=v -- установка hot-key
        end
        -- показать таблицу с кодами hot-keys как строку
        changeHotkeyKeysForm.CEEdit1.Text=convertKeyComboToString(userDefinedKeys)
        -- запомнить что есть setKeys у  hotkey типа TGenericHotkey. Передать пять нажатий
        if changeHotkeyKeysForm.showModal()==mrYes then
          hotkey.setKeys(userDefinedKeys[1],userDefinedKeys[2],
                         userDefinedKeys[3],userDefinedKeys[4],
                         userDefinedKeys[5])
        end
    
      elseif hotkey.ClassName=='TMemoryRecordHotkey' then -- если же это TMemoryRecordHotkey
        for i,v in ipairs(hotkey.Keys) do
          userDefinedKeys[i]=v -- записать коды hot-key
        end
        -- показать строку
        changeHotkeyKeysForm.CEEdit1.Text=convertKeyComboToString(userDefinedKeys)
        -- если подвержедение закрытия формы через showModal()==mrYes, то назначить клавиши
        if changeHotkeyKeysForm.showModal()==mrYes then
          hotkey.Keys = userDefinedKeys
        end
    
      end
    
    end
    
    -- Функция для связи CETrainer.CHEAT0 и memrec0_hotkey0. Примеры ниже.
    -- object1 это тип условный тип tcheat, object2 это тип TMemoryRecordHotkey. Типы не документированы в celua.txt. Просто запомнить или лезть в git CE
    function addChangeHotkeyKeysFunctionality(object1, object2)
      if (type(object1)=='userdata') and (object1.ClassName=='tcheat') and (object2.ClassName=='TMemoryRecordHotkey') then
        local btn = createButton(object1.Owner)
        btn.Parent = object1.Parent
        btn.AnchorSideLeft.Control = object1
        btn.AnchorSideTop.Control = object1
        btn.Height = object1.Height
        btn.Width = 15
        btn.BorderSpacing.Left = object1.Descriptionleft - 20
        btn.Caption = 'E' -- создание кнопок вида "E" редактироавния hot-key
        btn.OnClick = function () changeHotkeyKeys(object2) object1.Hotkey = object2.HotkeyString end
      end
    end
    
    -- автоматическая, генерация как обычно. Оставить как есть для трех опций.
    
    --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()
    
    RequiredCEVersion=6.6
    if (getCEVersion==nil) or (getCEVersion()<RequiredCEVersion) then
      messageDialog('Please install Cheat Engine '..RequiredCEVersion, mtError, mbOK)
      closeCE()
    end
    addresslist=getAddressList()
    memrec0=addresslist.getMemoryRecordByID(0)
    memrec1=addresslist.getMemoryRecordByID(1)
    memrec2=addresslist.getMemoryRecordByID(2)
    
    memrec0_hotkey0=memrec0.getHotkeyByID(0)
    memrec1_hotkey0=memrec1.getHotkeyByID(0)
    memrec2_hotkey0=memrec2.getHotkeyByID(0)
    
    function onPostHotkey0(Hotkey)
      --Executed after the "toggle*" cheat got executed
      local memrec=Hotkey.Owner
      local isActive=memrec.Active --get the state after the hotkey got triggered
      CETrainer.CHEAT0.setActive(isActive) --gui update, nothing else
      if gPlaySoundOnAction then
        if isActive then
          playSound(gActivateSound)
        else
          playSound(gDeactivateSound)
        end
      end
    end
    
    memrec0_hotkey0.onPostHotkey=onPostHotkey0
    
    function onPostHotkey1(Hotkey)
      --Executed after the "toggle*" cheat got executed
      local memrec=Hotkey.Owner
      local isActive=memrec.Active --get the state after the hotkey got triggered
      CETrainer.CHEAT1.setActive(isActive) --gui update, nothing else
      if gPlaySoundOnAction then
        if isActive then
          playSound(gActivateSound)
        else
          playSound(gDeactivateSound)
        end
      end
    end
    
    memrec1_hotkey0.onPostHotkey=onPostHotkey1
    
    function onHotkey2(Hotkey)
      --Executed before the hotkey is handled
      CETrainer.CHEAT2.setActive(true, 1500)
      if gPlaySoundOnAction then
        playSound(gActivateSound)
      end
    end
    
    memrec2_hotkey0.onHotkey=onHotkey2
    CETrainer.SEPERATOR.Visible=false
    
    getAutoAttachList().add("ddgd")
    gPlaySoundOnAction=false
    CETrainer.show()
    function AboutClick()
      showMessage(gAboutText)
    end
    gAboutText=[[This trainer was made by Cheat Engine
    www.cheatengine.org]]
    
    function CloseClick()
      --called by the close button onClick event, and when closing the form
      closeCE()
      return caFree --onClick doesn't care, but onClose would like a result
    end
    
    --TRAINERGENERATORSTOP--
    
    -- А это уже дописывать. Сколько опций, столько и строк
    addChangeHotkeyKeysFunctionality(CETrainer.CHEAT0,memrec0_hotkey0)
    addChangeHotkeyKeysFunctionality(CETrainer.CHEAT1,memrec1_hotkey0)
    addChangeHotkeyKeysFunctionality(CETrainer.CHEAT2,memrec2_hotkey0)

     

     

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

    Если что не понятно, то пиши. Я когда исходник открыл вообще ничего не понял. Когда начинаешь разбираться, потом картина выстраивается.

     

    Если бы я делал с нуля, то, наверно, делал бы без tcheat и TMemoryRecordHotkey, но остальное почти также с convertKeyComboToString

    • Проверить, чтобы переменные были без кавычек. Т.е. debug_continueFromBreakpoint(co_stepover), а не debug_continueFromBreakpoint('co_stepover').
    • Функция debug_continueFromBreakpoint(co_stepover) делает шаг на следующую инструкцию не заходя в call. Далее прочитать регистры и далее вызывать debug_continueFromBreakpoint(co_run) чтобы отпустить отладку. Если этого не сделать, то ничего и не произойдёт — висит в отладке.
    • Учитывать нахождение на EIP при брейкпоинте на адресе брейкпоинта или на адресе следующем за адресом брейкпоинта. Например, это позволит прочитать eax из mov eax, [eax] двумя способами. 1 способ до перезаписи eax (EIP на инструкции брейкпоинта). Это software-брейкпоинт.  Способ2 после перезаписи (EIP на инструкции следующей за инструкцией, на которой сработал брейкпоинт). Это hardware-брейкпоинт(он же по умолчанию).
      Оба режима, можно ставить вручную или программно.
      debug_setBreakpoint(address, size OPTIONAL, trigger OPTIONAL, breakpointmethod OPTIONAL, functiontocall() OPTIONAL) 
      -- Где на EIP повлияет
      --Breakpoint methods:
      bpmInt3=0  --- software breakpoint
      bpmDebugRegister=1 -- hardwarebreakpoint
      bpmException=2 -- ну, это не нужно(медленный), на регион памяти (где здесь EIP будет, уже не помню)

       

    • Понравилось 2
    • Плюс 1
  6. Да, лучше спросить у Дарк Байта.

     

    Может быть, сделать можно через registerCustomTypeLua. Нет? Если есть желание. можешь погуглить.

     

    Можешь написать на C# через чтение памяти

    Спойлер
    string text = "Заказ звонка технической поддержки";
    
    Encoding utf8 = Encoding.GetEncoding("UTF-8");
    Encoding win1251 = Encoding.GetEncoding("Windows-1251");
    
    byte[] utf8Bytes = win1251.GetBytes(text);
    byte[] win1251Bytes = Encoding.Convert(utf8, win1251, utf8Bytes);
    
    Console.WriteLine(win1251.GetString(win1251Bytes));

     

    Или другими программами попытаться просматривать память. Типа winHex

    Спойлер

    SamLab.ws - WinHex 20.6

     

    Могут быть и программы альтернативы. Хотя CE как небольшой комбайн, но не все же ему уметь делать во всех кодировках. Пробуй IDA, Hidra и т.п.

  7. 22 часа назад, ктота сказал:

    Существует ли возможность добавить дополнительную кодировку текста, чтоб можно было прямо в памяти процесса распознавать русский текст?

     

    Отвечая на вопрос существует ли возможность, то она лично у Вас теоретически всегда существует, а именно самостоятельно изучить программирование и сделать, но вряд ли кто-то другой будет этим заниматься с отдельной кодировкой.

    Логику работы кодировки можно увидеть в исходниках MemoryBrowserFormUnitисходниках hexviewunit.pas. Там не только чтение, но и запись в кодировке.

     

     

  8. 18 часов назад, Partizan сказал:

    Может не в тему. Но как сделать средствами СЕ вменяемый тренер. Допустим на эту таблицу?

     

    Ну, такой я предлагать не буду 😃

    Спойлер

    http://i.imgur.com/mhHAyN6.png

     

    Ну, может такой вменямый (визуально)?

    Спойлер

    http://forum.cheatengine.org/files/capture2_108.jpg

     

    Большое количество опций, наверно, лучше оставить в таблице как есть без трейнеров. Вот пример

    Спойлер

    tld9.png

    Или вот такая вменяемая таблица?

    Спойлер

    ahdqcrk

     

    Или такая

    Спойлер

    Image

     

    Во всяком случае можно выбрать отдельные опции или сгруппировать их, что-то вроде этого вполне вменяемо (сделан на Cheat Engine)

    Спойлер

    Image

     

    А если опций еще больше и нужны галки, то тогда использовать контролы. Списки, вкладки и т.п.

  9. 4 часа назад, Pitronic сказал:

    Сыылка не рабочая перезалей пажалуйста.

    Ты уверен, что нужна ссылка? Это плагины к OllyDbg.

    Ссылки все битые. Им лет 10. Можешь поискать в Интернете "OllyDbg и названия этих плагинов".

  10. 9 часов назад, Pitronic сказал:

    В общем мне даже не обязательно подключение к процессу се уже подключено, мне нужна активация диактивация дочерних скриптов в таблице. Активировал один он автоматом активировал другой.

     

    Хотя ответ был, но я приведу функции, которые могут пригодится

     

    1. Открытие процесса: openProcess("Tutorial-i386.exe")

    2. Добавить процесс в список процессов для автоподкючения: getAutoAttachList().add("Tutorial-i386.exe") 

    3. Функция, которая срабатывает, когда процесс подключился: 

    function onOpenProcess(processid)
      // здесь некоторый код
    end

    4. Активация записи по её имени: getAddressList().getMemoryRecordByDescription("Название записи в таблице CE").Active = true.

    Если такой записи еще в таблице нет, то вызовет ошибку. 

    5. При добавлении записи в CE сразу вызывается код в АА-скрипте.

    Так CE проверяет все, что там находится. Это может создать лишний таймер. Как это проверить? Через логи  и print()

    Спойлер
    // перед добавлением скрипта, запись уже уже должна быть создана в таблице с пустыми [ENABLE] и [DISABLE]
    {$lua}
    print('инициализирован "'..memrec.Description..'"')
    {$asm}
    [ENABLE]
    {$lua}
    print('активирован "'..memrec.Description..'"')
    {$asm}
    
    [DISABLE]
    {$lua}
    print('не активирован "'..memrec.Description..'"')
    {$asm}

     

     

    6. Если объединить пункты выше и отказаться от таймера, то получится что-то вроде этого.

    Спойлер
    [ENABLE]
    {$lua}
    process_name = 'Tutorial-i386.exe'      -- Название процесса
    record_name = 'Активирующий скрипт'     -- Название записи
    getAutoAttachList().add(process_name)   -- Автоподключение
    
    function onOpenProcess(process_id)      -- Обработчик подключения
        -- активация record записи
        getAddressList().getMemoryRecordByDescription(record_name).Active = true
    end
    
    [DISABLE]

     

     

    9 часов назад, Pitronic сказал:

    он у меня не добавляется в таблицу вот такая ошибка.

    7. Ошибка, очень похоже, связана с названием записи напротив галки. Т.е. она отсутствует.

     

    8. Ну, а как программное разворачивать вложенные читы и активировать их?

    Идем в документацию и что-то вроде этого ищем про memoryRecord.Options. Выставляnm Options можно как вручную так и скриптом

    Спойлер
    local addressList = getAddressList()
    local memoryRecord = getAddressList().getMemoryRecordByDescription("Активирующий скрипт")
    memoryRecord.Options = "moHideChildren, moActivateChildrenAsWell, moAllowManualCollapseAndExpand"
    memoryRecord.Active = true
    
    --[[  Options: String set - a string enclosed by square brackets filled with the options seperated by a comma.
    Valid options are: moHideChildren, moActivateChildrenAsWell, moDeactivateChildrenAsWell, moRecursiveSetValue,
    moAllowManualCollapseAndExpand, moManualExpandCollapse, moAlwaysHideChildren]]--

     

    Спойлер

    image.png

    image.png

    Таблица на всякий случай, если потребуется для изучения или проверки

    Tutorial-i386.CT

     

    Более полно все функции описаны в документации

    image.png

     

    Хотя там не все есть. Например, про "memrec" внутри уже созданного АА-скрипта. Тогда не нужно использовать local memoryRecord = getAddressList().getMemoryRecordByDescription("Активирующий скрипт"), а сразу memrec и с ним работать.

  11. Какую логику работы скриптов хотим получить?

     

    Вариант1
    1. Если нажали на галку в таблице CE, то делать автоматически аттач к процессу?
    2. Как только подключился процесс, то активировать другую галку?

     

    Или вариант2

    1. Чтобы нажали на галку и начался поиск процесса

    2. Как только процесс найден, то все вложенные записи под этой же галкой показались(развернулись)?

     

    Критерий "Как правильно написать этот скрипт для табличного варианта?" мне пока не совсем понятен.

  12. 12 минут назад, Pitronic сказал:

    Ещё вопрос если можно чекбокс окрасить в таблице, разве нет похожего Lua скрипта для чекбоксов?

     

    То, что ДаркБайт делал, это квадратик нарисовал и пару палочек в нем в виде крестика. Это не на Lua, а на Lazarus -  то, на чем CE написан.

    На Lua можно в теории сделать любой чек-бокс. Только готового скрипта нет и это не быстро сделать.  И это творческий процесс.  Если очень надо поспрашивай на форуме Cheat Engine. Я думаю, будут энтузиасты и  они подскажут.  Может быть и что-то готовое уже есть.

  13. Google пишет, что этот компонент системный. Поэтому Dark Byte сделал финт - квадратик с крестиком, т.е. сделал свой вариант чек-боксаа и может красить его как угодно

    Спойлер

    Yu-Gi-Oh! Master Duel - Page 14 - FearLess Cheat Engine

     

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

    Спойлер

    image.png

     

    Все это дело не простое и творческое. Кнопку может и сделаешь визуально в редакторе и кликаться будет, и меняться картинка и label-надписи будут рядом. Но еще предстоит внедрить в саму форму, где будешь использовать. Выровнять. Все эти клики связать. Либо вручную в этом визуальном редакторе CE, либо программно. В целом это все творческий и долгий процесс создания внешней оболочки.

  14. Это решение не тестировал и не могу судить насколько оно удобно или применимо. Может быть ситуация, когда надо постоянно проверять подключён процесс или нет. Это можно делать тем же таймером или перед активаципй опций читов. В общем просто вариант из сочинений на тему "как бы подключился к процессу". 

  15. 14 часов назад, Partizan сказал:
      Показать контент

    #2

      Показать контент

    #3

      Показать контент

     

     

    #4 

    Спойлер
    attach_prosess = 'process.exe'
    getAutoAttachList().add(attach_prosess)
    is_reconnect_process_not_allowed = false
    
    -- Обработчик подключения
    function onOpenProcess(process_id)
    	if is_reconnect_process_not_allowed then
    		-- сообщения с текстом "перезапустите таблицу/трейнер"
    		--messageDialog(text, type, buttons...) : pops up a messagebox with a specific icon/sound with the specified buttons (mbok, mbyes, ....)
    		--messageDialog(title, text, type, buttons...): ^ but adds a custom title
    		--messageDialog(text) : shows an information dialog with the text
    		return
    	end
    	getAutoAttachList().remove(attach_prosess)
    	is_reconnect_process_not_allowed = true
    end

     

     

     

    • Плюс 1
  16. А какая ошибка выскакивает?

    Я проверил старый скрипт на CE 7.2. Ошибки нет. Процесс находится и подключение к нему происходит. 

    Спойлер
    local timerAutorun = createTimer(nil, true)
      timerAutorun.Interval = 1000
      timerAutorun.OnTimer = function ()
      if (getOpenedProcessID() ~= getProcessIDFromProcessName("Tutorial-i386.exe")) then
         OpenProcess("Tutorial-i386.exe")
      end
    end

     

     

  17. С CheatEngine форума. 

     

    Самая интересная конструкция в скрипте

    compactmenuitem.Caption = state and 'Compact View Mode' or 'Full View Mode'

    Здесь-то Caption-то — строка. Ну, а вот Lua такой язык программирования, что позволяет булевые значения и строки вместе писать, и возвращать строки.

  18. Спойлер

    Шаг 1. Снять галку

    Шаг2. Нажать на кнопку "Пользовательский дизайн"

    image.png

     

    Шаг3. выбрать BorderStyle = bsSingle чтобы размер формы не менялся

    image.png

     

    Шаг4. Закрыть дизайнер форм копкой на шаге2.

    Шаг5. Сгенерировать exe

     

    Не проверял, но должно работать.

     

     

  19. 14 часов назад, Antonshka сказал:

    Интересно как на С++ проверяется валидность значения адреса.

     

    Через WinAPI проверять доступные регионы памяти

    Спойлер

    image.png

     

    Подробно в справочнике по win api. Или Рихтер. "Глава 13. Архитектура памяти в Windows"

  20. В 25.05.2022 в 2:18 PM, botmaker сказал:

    Было бы достаточно алгоритма, мне не удается его понять до сих пор.

     

    Проекция точки на экран на SlimDX

    var viewProj = mMainCamera.View * mMainCamera.Projection;
    var vp = mDevice.ImmediateContext.Rasterizer.GetViewports()[0];
    var screenCoords = Vector3.Project(worldSpaceCoordinates, vp.X, vp.Y, vp.Width, vp.Height, vp.MinZ, vp.MaxZ, viewProj);

    Не знаю, оно или нет. Надо в API смотреть.  Просто загуглил.

    На unity это одной функцией Camera.WorldToScreenPoint

    Разбираться надо. Времени нет.

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

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

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