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

[D3DHook] Отобразить в ingame-menu изменяемое значение из таблицы


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

Пробовал ли кто-нибудь выводить в окне игры изменяемое значение из таблицы? Например, я нашёл игровое время и хочу сделать игровые часы, которых в игре нет :) В CE такое доступно?

UPD: так.. форму сделал, на форме всё работает, но как сделать поверх игры... Игра Assassin's Creed Revelations вылетает при хуке DirectX, может это просто игра проблемная..

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

Пример показывает сообщение на 2 секунды после нажатия на CTRL+1.

Заменить " processName = '[Game.exe]' "

Созать текстовый документ *.CETRAINER с кодировкой "utf-8" без BOM в программе Notepad++


<?xml version="1.0" encoding="utf-8"?>
<CheatTable CheatEngineTableVersion="14">
<LuaScript>processName = 'Game.exe'

isD3dhook_initializeHook = false
isTimerShowingMessageInGameMenu = false

function OnCloseClick(sender)
closeCE()
return caFree
end

trainerForm = createForm()
form_onClose(trainerForm, OnCloseClick)
control_setCaption(trainerForm, 'Trainer Form v1.0 (in game message)')
form_centerScreen(trainerForm)

exitBtn = createButton(trainerForm)
control_setCaption(exitBtn, 'Exit')
control_onClick(exitBtn, OnCloseClick)
control_setSize(exitBtn, 200, 70)
control_setPosition(exitBtn, 62, 130)

labelCaption1 = createLabel(trainerForm)
control_setCaption(labelCaption1, 'Press in game: CTRL + 1')
control_setPosition(labelCaption1, 62, 30)
form_show(trainerForm)


autoAttachList = getAutoAttachList()
stringlist_add(autoAttachList, processName);

function onOpenProcess(processid)
if not isD3dhook_initializeHook then
reinitializeSymbolhandler()
d3dhook_initializeHook()
isD3dhook_initializeHook = true
ShowMessageInGame('d3dhook initialize Hook!', 400, 100, 2)
createHotkey(OnKeyPressSomeActivate, VK_CONTROL, VK_1)
end
end


function OnTickTimerShowingMessageInGameMenu(senderTimer)
timer_setEnabled(senderTimer, false)
object_destroy(senderTimer)
object_destroy(displayedTextObject)
object_destroy(fontmap)
object_destroy(font)
isTimerShowingMessageInGameMenu = false
end


function ShowMessageInGame(stringMessage, fontWidthTextContainer, fontHeightTextContainer, timeShowing)
font = createFont()
font_setSize(font, 24)
font_setColor(font,0x0000ff) --red rgb

fontmap = d3dhook_createFontmap(font)

displayedTextObject = d3dhook_createTextContainer(fontmap, fontWidthTextContainer, fontHeightTextContainer, stringMessage )

d3dhook_renderobject_setY(displayedTextObject, -1)
d3dhook_renderobject_setX(displayedTextObject, -1)

messageTimer = createTimer(nil, false)
timer_setInterval(messageTimer, timeShowing * 1000)
timer_onTimer(messageTimer, OnTickTimerShowingMessageInGameMenu)
timer_setEnabled(messageTimer, true)
isTimerShowingMessageInGameMenu = true
end


pressCount = 0
function OnKeyPressSomeActivate()
if not isTimerShowingMessageInGameMenu then
pressCount = pressCount + 1
ShowMessageInGame('Message count №'..pressCount..' !', 400, 100, 2)
end
end
</LuaScript>
</CheatTable>

Дарк Байт советовал не разрушать/создавать font. А создать его один раз после хука.

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

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

Пример показывает сообщение на 2 секунды после нажатия на CTRL+1.

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

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

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

У меня был случай. Хук не проходил в полноэкранном режиме, а в оконном работало. Два пути решения пытаться на Lua что-то придумывать или например делать на C++. Вообще интересно найти проблему почему на Lua на получается o_0

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

Вот что мне писал Дарк Байт

and of course as always, don't do hook stuff in onOpenProcess. That is too soon at that point(If it does work when doing single line command manually, then try using a one time run timer. As that will run after the process initialization instead of before)

Мне сложно перевести эту цитату, т.к. я не очень понял смысл её, кроме как не использовать хук в onOpenProcess, т.к. это рановато... используйте таймер.

Если полазить по скриптам на форуме Cheat Engine, то там d3dhook_initializeHook не стоит в функции открытии процесса.

aliast, можешь попробовать

1. d3dhook_initializeHook запустить при запуске скрипта вне функции открытия процесса

2. d3dhook_initializeHook запустить через некотрое время по таймеру (запускаемому в onOpenProcess)

3. поискать примеры по ключевому слову d3dhook_initializeHook

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

and of course as always, don't do hook stuff in onOpenProcess. That is too soon at that point(If it does work when doing single line command manually, then try using a one time run timer. As that will run after the process initialization instead of before)

И конечно же, как всегда, не выполняйте ничего связанного с хуком по событию onOpenProcess. Это слишком рано (если работает через ручной запуск однострочной команды, тогда попробуйте "одноразовый" таймер, так как он сработает ПОСЛЕ инициализации процесса, а не ДО.)

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

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

  • 1 год спустя...

Возвращаясь к этому вопросу. Почему код

test = readInteger('["Dishonored.exe"]')function OnKeyPressSomeActivate()if (test == nil) thentest = 0endShowMessageInGame('Message count №'..test..' !', 400, 100, 2)end

выдаёт надпись Message count № 0 т.е. test = readInteger('["Dishonored.exe"]') ничего не прочитывает? Весь скрипт целиком выше, я изменил только этот кусок.

Upd: вот рабочий скрипт

function OnKeyPressSomeActivate()CurCoins    = readFloat('[[[["Dishonored.exe"+010654A4]+754]+0]+6b0]+70')TotalCoins    = readInteger('[[[["Dishonored.exe"+010654A4]+754]+0]+6b0]+74')if (CurCoins == nil or TotalCoins == nil) then   ShowMessageInGame('ERROR!', 400, 100, 2)endShowMessageInGame('Coins collected: '..CurCoins..' from '..TotalCoins..' !', 400, 100, 2)end

Заметил странный глюк. Создал несколько функций, показывающие значения разных адресов. Навесил на них хоткеи Ctrl+1,2,3,4,5. Иногда сообщение появляется и так и остается висеть на экране. Закрываю тренер, ничего в коде не меняю, снова нажимаю хоткей - глюк может повториться, а может и не повториться или появиться на другом сообщении (на другом хоткее). Насколько я разобрался глюк появляется если попытаться вывести другую надпись до того, как первая исчезнет с экрана, либо даже сразу после её исчезновения. Первая надпись при этом должна исчезнуть, а вот вторая зависнет.

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

test = readInteger('["Dishonored.exe"]')
Правильно

test = readInteger('Dishonored.exe')
По поводу глюков. Сообщение внутри игры должно показаться и скрыться. Пока оно не скрылось нельзя вызывать снова ShowMessageInGame и нельзя закрывать CE или трейнер CE, потому что там общие переменные и не они не работают с отдельными сообщениями или одновременными сообщениями. Так написан скрипт. Так что его придется переписывать.
Ссылка на комментарий
Поделиться на другие сайты

Так написан скрипт. Так что его придется переписывать.

В принципе я вроде пофиксил этот баг, добавив в начале каждой функции перед выводом нового сообщения строчку object_destroy(displayedTextObject). Подозреваю что это не идеальный вариант решения, но вроде как работает. При таком раскладе новое сообщение будет гореть на экране не 2 секунды (или сколько там будет указано в скрипте), а столько, сколько осталось гореть предыдущему сообщению на экране. Для меня это не существенно. Не успел прочитать - жмакни хоткей ещё раз и читай заданные 2 секунды :)

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

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

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

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