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

вопрос о функциях readString() и ProgresBar


Megaladon

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

Привет всем. Я долго и нудно, разбирался на примерах как работает "ProgresBar".

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

Вот что получилось:

lB.png

Теперь у меня возник вопрос, возможно ли, и как сделать чтобы параметры которые отображает progresbar вывести на его полоске, чтобы получить такой результат:

http://imgfast.ru/51cdf46db3c53/qB/

Lua-скрипт привожу:


<?xml version="1.0" encoding="utf-8"?>
<CheatTable CheatEngineTableVersion="14">
<CheatEntries>
<CheatEntry>
<ID>0</ID>
<Description>"base"</Description>
<ShowAsHex>1</ShowAsHex>
<Color>80000008</Color>
<VariableType>4 Bytes</VariableType>
<Address>Engine.dll+73D248</Address>
</CheatEntry>
<CheatEntry>
<ID>1</ID>
<Description>"full"</Description>
<Color>80000008</Color>
<VariableType>4 Bytes</VariableType>
<Address>Engine.dll+73D248</Address>
<Offsets>
<Offset>10E214</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>2</ID>
<Description>"current"</Description>
<Color>80000008</Color>
<VariableType>4 Bytes</VariableType>
<Address>Engine.dll+73D248</Address>
<Offsets>
<Offset>10E1F0</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>3</ID>
<Description>"full2"</Description>
<Color>80000008</Color>
<VariableType>4 Bytes</VariableType>
<Address>Engine.dll+73D248</Address>
<Offsets>
<Offset>10E210</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>4</ID>
<Description>"current2"</Description>
<Color>80000008</Color>
<VariableType>4 Bytes</VariableType>
<Address>Engine.dll+73D248</Address>
<Offsets>
<Offset>10E1F4</Offset>
</Offsets>
</CheatEntry>
</CheatEntries>
<UserdefinedSymbols/>
<LuaScript>function progresbar01(senderTimer)
full1 = readInteger(full1adr)
current1 = readInteger(current1adr)
control_setCaption(label2, current1.." / "..full1)
progressbar_setMax(progressbar1, full1)
progressbar_setPosition(progressbar1, current1)
end
function progresbar02(senderTimer)
full2 = readInteger(full2adr)
current2 = readInteger(current2adr)
control_setCaption(label4, current2.." / "..full2)
progressbar_setMax(progressbar2, full2)
progressbar_setPosition(progressbar2, current2)
end
function CloseForm(sender)
form_close(MyForm)
MyForm = nil
end
MyForm = createForm()
label1 = createLabel(MyForm)
label2 = createLabel(MyForm)
label3 = createLabel(MyForm)
label4 = createLabel(MyForm)
progressbar1 = createProgressBar(MyForm)
progressbar2 = createProgressBar(MyForm)
btnExit= createButton(MyForm)
control_setCaption(MyForm, "My First Lua ")
control_setCaption(label1, "Progressbar 1")
control_setCaption(label2, "Current1/Full1")
control_setCaption(label3, "Progressbar 2")
control_setCaption(label4, "Current2/Full2")
control_setCaption(btnExit, "Exit")
control_setSize(progressbar1, 120, 15)
control_setSize(progressbar2, 120, 15)
progressbar_setMin(progressbar1, 0)
progressbar_stepBy(progressbar1, 1)
progressbar_setMax(progressbar1, full1)
progressbar_setMin(progressbar2, 0)
progressbar_stepBy(progressbar2, 1)
progressbar_setMax(progressbar2, full2)
control_onClick(btnExit, CloseForm)
x = 10
y = 10
dy = 20
control_setPosition(label1, x+200, y+0*dy)
control_setPosition(progressbar1, x+78, y+0*dy)
control_setPosition(label2, x, y+0*dy)
control_setPosition(label3, x+200, y+1*dy)
control_setPosition(progressbar2, x+78, y+1*dy)
control_setPosition(label4, x, y+1*dy)
control_setPosition(btnExit, x + 220, y+9*dy)
form_show(MyForm)
timer1 = createTimer(MyForm)
timer_setInterval(timer1, 200)
timer_onTimer(timer1, progresbar01)
timer2 = createTimer(MyForm)
timer_setInterval(timer2, 200)
timer_onTimer(timer2, progresbar02)
-------- offsets -------------------
status = readInteger(0x1073D248)
full1adr = status + 0x10E214
current1adr = status + 0x10e1f0
full2adr = status + 0x10e210
current2adr = status + 0x10e1f4
-------------------------------------------
</LuaScript>
</CheatTable>

Вопрос второй.

при поиске текста в главной таблице СЕ текст на кирилице отображаеться правильно, но если считать этот текст в скрипте

text = readString(textadr, 76)

print(text)

то цифры и латиница отображаются как надо, а кирилица в виде вопросительных знаков

??????????????????????

http://imgfast.ru/51cdf46db3c53/pB/

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

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

>>Теперь у меня возник вопрос, возможно ли, и как сделать чтобы параметры которые отображает progresbar вывести на его полоске, чтобы получить такой результат:

1. Попытаться разместить label на полоске

2. Попытаться разместить label на полоски через Disigned редактор

3. Если не получается, то посмотреть описание ProgressBar класса. Я вроде помню, у него должен быть TCanvas слой, который позволяет рисовать текст.

Я бы попробовал решить задачу, но лень.

>>то цифры и латиница отображаются как надо, а кирилица в виде вопросительных знаков

Решение скорее всего в функциях в работе с кодировкой. В main.lua есть описание этих функции, возможно они помогут.

Ещё могу посоветовать написать о проблеме на форуме Cheat Engine. Я думаю, там помогут быстрее дав готовое решение.

>> почему то при попытке прикрепления изображения, пишет недопустимое расширение файла

Можно обратить к Xipho по этому вопросу

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

по поводу вопроса о выводе текста внутри полоски прогресс бара,

на форуме в примерах нашел способ вывести свойства класса:

print(strings_getText(getPropertyList(UDF1_CEProgressbar1)))


Name
Tag
AnchorSideLeft
AnchorSideTop
AnchorSideRight
AnchorSideBottom
Cursor
Left
Height
Hint
Top
Width
HelpType
HelpKeyword
HelpContext
Align
Anchors
BorderSpacing
BorderWidth
Constraints
Enabled
Max
Min
Position
Orientation
ParentShowHint
ShowHint
Smooth
Step
Style
TabOrder
TabStop
Visible
BarShowText -- этот параметр видимо мне и нужен

вопрос какой синтаксис должен быть у BarShowText?

пробовал progressbar_setBarShowText(progressbar1,true)

и progressbar_BarShowText(progressbar1,true)

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

Ещё вопрос имеется ли возможность менять цвет полосы у прогрессбара?

по поводу readString() нашел функцию:


ansiToUtf8(string): Converts a string in Ansi encoding to UTF8
utf8ToAnsi(string): Converts a string in UTF8 encoding to Ansi
Note: GUI components mainly show in UTF8, some other functions use Ansi, try to find out which ones...

Но ожидаемого результата не получил, видимо нужно именно строку вводить как аргумент, а не подставлять переменную,


MyForm = createForm()
control_setCaption(MyForm, "My First Lua ")
label1 = createLabel(MyForm)
form_show(MyForm)
text = readString(adress, 16)
ansiToUtf8(text)
control_setCaption(label1, text)
print(text)

все равно выдает ????????? вместо кирилицы.

Возник ещё один вопрос как правильно написать код чтобы работало:


value = readInteger([[EntitiesMP.dll+0x20F770]])


adress = [[EntitiesMP.dll+0x20F770]]
value = readInteger(adress)


adress1 = [[EntitiesMP.dll]]
adress2 = adress1 + 0x20F770
value = readInteger(adress2)

все варианты выдают ошибку, в главной таблице адресс EntitiesMP.dll+0x20F770 работает правильно, а в скрипте не могу использовать такой формат адресса, проблемма в том что у меня Win-7 x64, и почему-то этот адресс после перезапуска программы меняеться (адресс зеленый, и меняеться у него всегда только 2 байт, 0x00**5A4D ), Cheat Engine находит его всегда если привести адресс к такому виду как привел выше EntitiesMP.dll+0x20F770.

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

BarShowText - булева переменная, должна показывать текст, но скорее всего ни у кого не работает (судя по записям на немецком форуме). Как я понял это какие-то заморочки Lazarus или связанного с ним компилятора, или связанных модулей, или какие-то особенности ОС. Это проблему нужно изучать довольно кропотливо. Тут я не помогу.

Разместить Label на самом Progress Bar в дизайнере форм у меня не получается.

Рисовать на Progress Bar текст - вариант, но не через TCanvas. А каким-то другим способом, не знаю не пробовал.

Во всяком случае проще разместить Label с текстом рядом и показывать текущее значение в нем. Ещё вариант взять TImage и рисовать в нем этот progress bar просто как прямоугольник заполняющийся с цифрами.

По поводу кодировки. Если значение в игре по адресу в ANSI, то нужно конвертировать в UTF и передать строку в GUI. Не нужно работать с кодировкой в/из log консоли, там кажется только ANSI. Нужно экспериментировать с компонентами формы и значением в игре, а не с консолью. И советую работать с дизайнером форм по созданию окон - ускоряет процесс написания кода. Если текст русский есть в Lua скрипте, я сохранял таблицу как .CT или .CETRAINER открывал NotePad++ и ставил кодировку UTF-8(без BOM) тогда русский текст у меня отображался корректно.

По поводу " readInteger([[EntitiesMP.dll+0x20F770]])" Насколько я помню сочетание двойных скобок даже в кавычках рассматривается как оборачивание в комментарий. Скобка это служебный символ, а перед ним вроде нужно ставить знак % (или какой-то другой я мог ошибиться)

readInteger("%[%[EntitiesMP.dll+0x20F770%]%]")

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

Приветствую всех снова.

Проблемму с


value = readInteger([[EntitiesMP.dll+0x20F770]])

удалось решить.

Сперва нужно получить адрес модуля с помощью команды


getAddress(string, local OPTIONAL): returns the address of a symbol. Can be a modulename or an export. set Local to true if you wish to querry the symboltable of the ce process

и затем уже работать с полученным адресом.

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



function onTimer(senderTimer)
speed = readInteger(speedadr)
control_setCaption(label1, "1 status = "..status)
control_setCaption(label2, "2 EntitiesMP.dll = "..EntitiesMP)
control_setCaption(label3, "3 actionadr = "..actionadr)
control_setCaption(label4, "4 action = "..action)
control_setCaption(label5, "5 speedadr = "..speedadr)
control_setCaption(label6, "6 speed = "..speed)
end

MyForm = createForm()
label1 = createLabel(MyForm)
label2 = createLabel(MyForm)
label3 = createLabel(MyForm)
label4 = createLabel(MyForm)
label5 = createLabel(MyForm)
label6 = createLabel(MyForm)

control_setCaption(MyForm, "My First Lua ")
control_setCaption(label1, "1 status = ")
control_setCaption(label2, "2 EntitiesMP.dll = ")
control_setCaption(label3, "3 actionadr = ")
control_setCaption(label4, "4 action = ")
control_setCaption(label5, "5 speedadr = ")
control_setCaption(label6, "6 speed = ")

control_setPosition(label1, 10, 5)
control_setPosition(label2, 10, 30)
control_setPosition(label3, 10, 55)
control_setPosition(label4, 10, 80)
control_setPosition(label5, 10, 105)
control_setPosition(label6, 10, 130)

timer = createTimer(MyForm)
timer_setInterval(timer, 1000)
timer_onTimer(timer, onTimer)
-------- offsets text ----------------------------
status = readInteger(0x1073D248)
textadr2 = status + 0x10E1B8
textadr1 = readInteger(textadr2)
textadr = textadr1 + 0

----------- offsets memoryModul ----------------
EntitiesMP = getAddress('EntitiesMP.dll')
actionadr = EntitiesMP + 0x20F770
action = readInteger(actionadr)
speedadr = action + 0xDD8
-------------------------------------------

Что косается прогрессбара, то я решил остановиться на варианте выводить значения переменных max и current в лабеле перед полоской. Что касаеться возможности покрасить цвет полосы прогрессбара, хотелось бы конечно, но это не принципиально. главное что бы работало. Пошарился в main.lua и не нашел там ни строчки о color или rgb в progressbar.

Проблему с функцией readString() пока решить не удалось.

То ли потому что


ansiToUtf8(string)

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

Пример считанного текста из памяти процесса

считанный текст : ???????


function onTimer(senderTimer)
text = readString(textadr, 16, true) --[[пробовал несколько вариантов
1. text = readString(textadr, 16, true) результат всегда один и тот же
2. text = readString(textadr, 16, false)
3. text = readString(textadr, 16)]]
ansiToUtf8(text)
control_setCaption(label2, "считанный текст : "..text)
end
MyForm = createForm()
label1 = createLabel(MyForm)
label2 = createLabel(MyForm)
control_setCaption(MyForm, "My First Lua ")
control_setCaption(label1, "Пример считанного текста из памяти процесса ")
control_setCaption(label2, "Тут будет то что СЕ считает из памяти...")
control_setPosition(label1, 10, 5)
control_setPosition(label2, 10, 30)
timer = createTimer(MyForm)
timer_setInterval(timer, 2000)
timer_onTimer(timer, onTimer)
-------- offsets text ----------------------------
status = readInteger(0x1073D248)
textadr2 = status + 0x10E1B8
textadr1 = readInteger(textadr2)
textadr = textadr1 + 0
----------- offsets memoryModul ----------------
EntitiesMP = getAddress('EntitiesMP.dll')
actionadr = EntitiesMP + 0x20F770
action = readInteger(actionadr)
speedadr = action + 0xDD8

По поводу кодировки. Если значение в игре по адресу в ANSI, то нужно конвертировать в UTF и передать строку в GUI. Не нужно работать с кодировкой в/из log консоли, там кажется только ANSI. Нужно экспериментировать с компонентами формы и значением в игре, а не с консолью.

И советую работать с дизайнером форм по созданию окон - ускоряет процесс написания кода.Если текст русский есть в Lua скрипте, я сохранял таблицу как .CT или .CETRAINER открывал NotePad++ и ставил кодировку UTF-8(без BOM) тогда русский текст у меня отображался корректно.

Проблеммы с отображение русского текста в консоле набора Lua (Ctrl+Alt+L) нет, русский текст и в Lua-консоли и в Notepad++ отображаеться корректно. А считанный из памяти текст на форме отображаеться в виде ????????, причем структура


control_setCaption(label, "текст на русском языке: "..text)

дает результат: текст на русском языке: ????????? .

Как я понимаю проблема не в неправильной кодировке на компьютере, а в том что в памяти текст лежит в ansi, а в GUI-Label этот текст надо отправить в юникоде. Причем в главной таблице СЕ текст отображается корректно.

И советую работать с дизайнером форм по созданию окон - ускоряет процесс написания кода.

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

Вожможно, что бы содержимое переменной text отображалось корректно, надо как-то подгружать кодовую страницу-1251. Буду писать ДаркБайту, надеюсь найдеться решение данной проблеммы.

И напоследок: как установить положение трэкбара в нужное?

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

первый раз trackbar_setPosition(progressbar, integer) почему-то не отрабатываеться, а после того как подвигаю трэкбар и нажму сброс, то эта же команда в функции ResetZ срабатывает, я думал сперва что дело в том что переменная standart являеться числом с точкой и я строку standart = memoryrecord_getValue(memoryrec1) (значение переменной = 9,5) заменил на standart = 9, но это не помогло. При запуске скрипта ползунок не смотря на это все равно оказывается на нуле.


--[[TrackBar Class : (Inheritance: WinControl->Control->Component->Object)
createTrackBar(owner): Creates a TrackBar class object which belongs to the given owner. Owner can be any object inherited from WinControl
trackbar_getMax(trackbar)
trackbar_setMax(trackbar, integer)
trackbar_getMin(trackbar)
trackbar_setMin(trackbar, integer)
trackbar_getPosition(progressbar)
trackbar_setPosition(progressbar, integer)
trackbar_onChange(trackbar, function)]]


addresslist = getAddressList()
description1= [[Zoom]]
memoryrec1 = addresslist_getMemoryRecordByDescription(addresslist, description1)
standart = memoryrecord_getValue(memoryrec1)
function ResetZ(sender)
zoom = standart
memoryrecord_setValue(memoryrec1, zoom) --sets value for the memoryrecord
control_setCaption(label1, zoom)
trackbar_setPosition(TrackBar, zoom)
end
MyForm = createForm()
label1 = createLabel(MyForm)
TrackBar = createTrackBar(MyForm)
ResetZoom = createButton(MyForm)
control_setCaption(MyForm, "My First Lua ")
control_setCaption(ResetZoom, "Сброс")
control_setPosition(label1, 100, 5)
control_onClick(ResetZoom, ResetZ)
control_setPosition(ResetZoom, 130, 5)
control_setCaption(label1, zoom)
trackbar_setMin(TrackBar, 1)
trackbar_setMax(TrackBar, 210)
function ZoomHack()
zoom = trackbar_getPosition(TrackBar)
memoryrecord_setValue(memoryrec1, zoom)
control_setCaption(label1, zoom)
end
setMethodProperty(TrackBar , "OnChange" , "ZoomHack")

Зарание благодарю всех откликнувшихся.

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

Вот ответ Дарк Байта о не корректном отображении кирилицы в форме:

according to the add address window it should be "readString(textadr, 16)"

besides that I have no idea

usually ansiToUtf8 does something, but I can't really test this

Я так понимаю что проблемма кроется в неправильно работающей функции ansiToUtf8.

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

получил ответ с http://forum.cheatengine.org

должен быть следующий синтаксис.

local text = ansiToUtf8(readString(textadr, 16,false))
control_setCaption(label2, "считанный текст : "..text)

тогда все работает.

Пишу тут ответ, может кому нибудь пригодиться.

вообще в main.lua не раскрыто какой должен быть синтаскис, у той или иной функции, и угадывание правильного написания комманды отнимает много времени.

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

  • 5 лет спустя...
×
×
  • Создать...

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

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