Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Readmem <тип Данных>
фонарик
сообщение 23.11.2011, 2:37
Сообщение #1


****

Apprentice
Сообщений: 160
Регистрация: 23.11.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 14.305



Подскажите пожалуйста, умные дяди и тёти, какой тип данных нужно указать команде readmem, если мне хочется видеть в пилоте человеческое 4х байтовое число с точкой?

Вот например, при помощи artmoney я нахожу в памяти число -187.0

UOpilotу пишем:

readmem #X 0х12C30770 <тип данных>
msg #X
stop_script

Какой бы я тип данных не ставил, UOpilot не показывает нужное мне число. При типе DWORD, Пилот покажет 3274113024, при типе byte или W:word покажет 0 (IMG:style_emoticons/default/sad.gif) Как мне отобразить сидящее 4х байтовое число с точкой?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
фонарик
сообщение 30.11.2011, 13:10
Сообщение #2


****

Apprentice
Сообщений: 160
Регистрация: 23.11.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 14.305



Никто не знает как решить данную проблему или это просто сделать нельзя?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 30.11.2011, 13:52
Сообщение #3


***********

Модератор UOPilot
Сообщений: 9.742
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29657
Пользователь №: 11.279



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

// Пилот вообще не умеет работать не с целыми числами. Т.е. даже если бы ты считал значение -187,0, то тебе надо было бы каким-то образом вычленить целую часть, иначе сможешь только как с текстом работать. Парсинг это тоже достаточно слабое место пилота. В целом ты встал сразу на двое грабель при том, что их надо еще поискать...


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Zeleax
сообщение 30.11.2011, 17:27
Сообщение #4


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



Цитата
При типе DWORD, Пилот покажет 3274113024, при типе byte или W:word покажет 0 sad.gif Как мне отобразить сидящее 4х байтовое число с точкой?

И искомое число точно было -187.0, а не -167.0 ?


--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 30.11.2011, 18:04
Сообщение #5


***********

Модератор UOPilot
Сообщений: 9.742
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29657
Пользователь №: 11.279



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


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Zeleax
сообщение 30.11.2011, 18:15
Сообщение #6


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



Цитата(DarkMaster @ 30.11.2011, 18:04) *

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

Да, х.з. разбираться надо. Я через функции прямого доступа к памяти переменных это делал на C#.
Там всё просто -разложил DWORD на байты в отдельный массив, а потом собрал из массива 4-хбайтовое дробное. Это всё на функциях сделано. Получилось -167.0. Вот и уточняю

http://www.inf1.info/book/export/html/202
http://cheaton.ru/f30/sozdanie-chitov-5-ti...v-pamyati-3073/
http://www.bestreferat.ru/referat-207381.html

последняя ссылка самая полезная


--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 30.11.2011, 21:10
Сообщение #7


***********

Модератор UOPilot
Сообщений: 9.742
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29657
Пользователь №: 11.279



мдя... проще кнайта отпинать, чтобы считывалось нормально. Как в пилоте это приводить к нормальному виду не представляю. Хотя признаюсь получил удовольствие от рефератика и изучил достаточно подробно.

Сообщение отредактировал DarkMaster - 1.12.2011, 12:47


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Zeleax
сообщение 30.11.2011, 23:26
Сообщение #8


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



Дело в том, что даже не получается обработать такие большие числа DWORD:
Код
set #dw 3274113024 // Исходное число DWORD считанное из памяти
msg Исходное число DWORD #dw
end_script

msg выдаёт -1020854272


--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Zeleax
сообщение 1.12.2011, 1:13
Сообщение #9


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



Получилось (IMG:style_emoticons/default/smile.gif)

Создал новую тему

На нескольких примерах с отрицательными числами проверил - работает.
Если что не так- просьба ногами не пинать! ))

фонарик
Да, заставили вы нас поработать немного мозгами ))


--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
фонарик
сообщение 6.12.2011, 22:58
Сообщение #10


****

Apprentice
Сообщений: 160
Регистрация: 23.11.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 14.305



Цитата(Zeleax @ 30.11.2011, 17:27) *
И искомое число точно было -187.0, а не -167.0 ?
Сейчас уже проверить нет возможности, но в точности значения я ручаться не буду, так как помню что бегал туда сюда в локации, отсеивая значения.
Цитата(Zeleax @ 1.12.2011, 1:13) *
Получилось (IMG:style_emoticons/default/smile.gif)
Спасибо Вам большое, господин Zeleax (IMG:style_emoticons/default/smile.gif) Вы и вправду голова! Проверил сейчас пару данных - все работает! Ура! Теперь куча новых идей все-таки найдет реализацию.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
фонарик
сообщение 27.9.2012, 4:06
Сообщение #11


****

Apprentice
Сообщений: 160
Регистрация: 23.11.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 14.305



Код
--v.2.24.1--

добавил в команды 'readmem' и 'writemem' операции с числами с плавающей запятой
B:byte = 1b; W:word = 2b; D:dWord = 4b; C:char = 1b; S:String = 1-255b;
DO:double = 8b; F:float = 4b; R:real = 6b;
в связи с тем, что пилот оперирует только с целыми числами, числа с плавающей запятой можно хранить только в строковых переменных.
В связи с таким замечательным нововведением, решил опробывать как оно работает:

Код
readmem $x 0x035D027C F:float
msg $x


В самой игре это значение 27.3 а пилот показывает 27.3163489588374

можно как-то это значение в переменной укоротить до игрового без особых дополнительных напрягов на скрипт? (IMG:style_emoticons/default/huh.gif) Посоветуйте что-нибудь пожалуйста. И как вообще производить какие-либо математические операции с этим числом?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
EL-GReeN
сообщение 27.9.2012, 16:06
Сообщение #12


*****

Journeyman
Сообщений: 474
Регистрация: 18.7.2011
Группа: Пользователи
Наличность: 0
Из: Россия
Пользователь №: 13.815
Возраст: 32



Цитата(фонарик @ 27.9.2012, 5:06) *

Код
--v.2.24.1--

добавил в команды 'readmem' и 'writemem' операции с числами с плавающей запятой
B:byte = 1b; W:word = 2b; D:dWord = 4b; C:char = 1b; S:String = 1-255b;
DO:double = 8b; F:float = 4b; R:real = 6b;
в связи с тем, что пилот оперирует только с целыми числами, числа с плавающей запятой можно хранить только в строковых переменных.
В связи с таким замечательным нововведением, решил опробывать как оно работает:

Код
readmem $x 0x035D027C F:float
msg $x


В самой игре это значение 27.3 а пилот показывает 27.3163489588374

можно как-то это значение в переменной укоротить до игрового без особых дополнительных напрягов на скрипт? (IMG:style_emoticons/default/huh.gif) Посоветуйте что-нибудь пожалуйста. И как вообще производить какие-либо математические операции с этим числом?


Код

set linedelay 1
set $x 27.3163489588374
get word $var1 1 $x //получение целого
get word $var2 2 $x //получение дробного
set $var2 Copy($var2 1 1) //уменьшение строки до 1го символа
set #var1 $var1
set #var2 $var2
msg insert(. #var1 100)#var2
//условие на меньше:
set #a1 27
set #a2 5
if #var1 <= #a1 and #var2 < #a2
msg #var1 . #var2 меньше чем #a1 . #a2
end_if
//условие на больше:
set #a1 27
set #a2 2
if #var1 >= #a1 and #var2 > #a2
msg #var1 . #var2 больше чем #a1 . #a2
end_if
//условие на равно:
set #a1 27
set #a2 3
if #var1 = #a1 and #var2 = #a2
msg #var1 . #var2 равно #a1 . #a2
end_if
//сложение:
set #a1 47
set #a2 9
set #tmp1 #var1 + #a1 + ( ( #var2 + #a2 ) / 10 )
set #tmp2 ( #var2 + #a2 ) - ( ( #var2 + #a2 ) / 10 ) * 10
msg #var1 . #var2 + #a1 . #a2 = #tmp1 . #tmp2
//вычитание:
set #a1 21
set #a2 9
set #tmp1 #var1 - #a1 - ( ( #var2 + #a2 ) / 10 )
if #var2 < #a2
set #tmp #var2 - #a2
set #tmp Copy(#tmp 2 100)
set #tmp2 10 - #tmp
else
set #tmp2 #var2 - #a2
if #var2 > #a2
set #tmp1 #tmp1 + 1
end_if
end_if
msg #var1 . #var2 - #a1 . #a2 = #tmp1 . #tmp2
end_script


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
фонарик
сообщение 3.10.2012, 18:44
Сообщение #13


****

Apprentice
Сообщений: 160
Регистрация: 23.11.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 14.305



У меня стоит система вин7 64бит, на этой системе это дополнительное вычисление целого займет от 0.5 до 5сек, что будет критично для всего скрипта в целом. В отличие от ВинХР где скрипт со скоростью света работает, на семерке скрипты работают медленнее приблизительно в 50 раз.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 3.10.2012, 19:23
Сообщение #14


***********

Модератор UOPilot
Сообщений: 9.742
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29657
Пользователь №: 11.279



проверь задержку между строк. Так же проверь отключена ли галочка слежения за ходом скрипта(выключить надо).


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 8.7.2025, 13:51
Designed by Nickostyle