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

 
Ответить в эту темуОткрыть новую тему
> Помогите Оптимизировать Скрипт
EL-GReeN
сообщение 25.1.2012, 22:00
Сообщение #1


*****

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



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

Код
//Подобие инжектовского InJournal, в массиве %journal хранятся последние 100 сообщение
set %journal[100]
:re
set $tmp lastmsg
if ($tmp != %journal[1]) //если последнее сообщение не равно последнему в массиве значит это новое сообщение
for #a 1 99 1 //сдвиг всего массива на 1
set %journal[#a+1] %journal[#a]
end_for
set %journal[1] $tmp
end_if
goto re


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 25.1.2012, 23:57
Сообщение #2


***********

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



Цитата
%journal[#a+1]

недопустимо


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


*****

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



DarkMaster, давно хотел спросить сколько раз, примерно в секунду обновляются переменные lastmsg, charposx, hits, mana, и тд. и с каких адресов в памяти читаются в клиенте 1.26.4a?

переделал, виснуть стало реже но теперь минут через 5 вылезает ошибка:
(IMG:http://i28.fastpic.ru/big/2012/0126/ab/724f15baafc3a5f724b2b42c8410e9ab.jpg)


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 26.1.2012, 1:24
Сообщение #4


***********

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



Цитата
примерно в секунду обновляются переменные lastmsg, charposx, hits, mana, и тд. и с каких адресов в памяти читаются в клиенте 1.26.4a?

Не имею ни малейшего понятия. По моим догадкам в момент вызова этих переменных происходит считывание значений из памяти(самое логичное просто и удобное).Попробуйте вкладку еще/параметры чара. Возможно там можно увидеть адреса.
Визуально все должно работать. Попробуйте вставить перед третьей строкой set logging lastmsg. Похоже, что либо значение какое-то шибко не корректное либо считываение дает сбой. Так же для теста рекомендую сделать скрипт из 1 строки set $tmp lastmsg, убрать задержку и посмотреть не кританет ли(можно вывод в лог еще добавить),


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


*****

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



set logging lastmsg
set $tmp lastmsg
даже при паузе между строк 100 выдаёт ошибку, в логе нечего странного проблема в lastmsg, но в усовиях типа if (lastmsg asd) проблемы нет но ведь там тоже идет считывание


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
WKnight
сообщение 26.1.2012, 17:51
Сообщение #6


********

Разработчик UO Pilot'а
Сообщений: 1.639
Регистрация: 9.1.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 4.688



Цитата
if (lastmsg asd) проблемы нет

а такие конструкции?
if (lastmsg = asd)
if (lastmsg <= asd)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
EL-GReeN
сообщение 26.1.2012, 18:18
Сообщение #7


*****

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



if (lastmsg = asd)
if (lastmsg <= asd)
if (lastmsg != asd)
if (lastmsg <> asd)
ошибка
if (lastmsg asd)
все нормально
(версия пилота последняя)


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


***********

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



условие тогда просто перепиши, как временная мера.


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


********

Разработчик UO Pilot'а
Сообщений: 1.639
Регистрация: 9.1.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 4.688



странно, там почти идентично сделано.
придумаем ченить.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
EL-GReeN
сообщение 27.1.2012, 16:51
Сообщение #10


*****

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



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

Код
set priority 0
set linedelay 0
set %j[20]
set #c2 1
:re
readmem #decCount 0xCE3228 d //чтение указателя на указатель 1
set $hexCount      //обнулить что бы не склеивались адреса
gosub DecToHex     //перевод в HEX
set $hexCount Insert(0x $hexCount 0) //+0x
readmem #decCount $hexCount d        //чтение указателя 2
set #c1 #decCount  //резервация для сравнения
set $hexCount      //обнулить что бы не склеивались адреса
gosub DecToHex     //перевод в HEX
set $hexCount Insert(0x $hexCount 0) //+0x
readmem $lmess $hexCount s 128       //чтение сообщения 3
if (#c2 != #c1) //если адреса не равны значит есть новое сообщение
   for #a 1 19 1 //сдвиг всего массива на 1
       set #b #a + 1
       set %j[#a] %j[#b]
       set logging %j[#a]
   end_for
   set %j[20] $lmess
   set logging %j[20]
end_if
set #c2 #c1
goto re
end_script  
//=============================================
:DecToHex
while #decCount > 16
    set #ostatock #decCount - ( #decCount / 16 * 16)
    set #decCount #decCount / 16
    gosub format
    //set logging  #decCount #ostatock || $hexCount
end_while
set #ostatock #decCount - ( #decCount / 16 * 16)
gosub format
return
:format  // Формирование внешнего вида числа.
    if #ostatock < 10
        set $hexCount #ostatock$hexCount
        return
    end_if
    if #ostatock = 10
        set $hexCount A$hexCount
        return
    end_if
    if #ostatock = 11
        set $hexCount B$hexCount
        return
    end_if
    if #ostatock = 12
        set $hexCount C$hexCount
        return
    end_if
    if #ostatock = 13
        set $hexCount D$hexCount
        return
    end_if
    if #ostatock = 14
        set $hexCount E$hexCount
        return
    end_if
    if #ostatock = 15
        set $hexCount F$hexCount
        return
    end_if
    msg Ошибка вычислений.
return


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


*********

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



а если адрес не переводить в hex-форму- разве не будет работать?


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


***********

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



Цитата
а если адрес не переводить в hex-форму- разве не будет работать?

будет


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


*****

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



Снова все переделал работает еще быстрее, но появилась ошибка при обращении к массиву из другого скрипта2, такая же как на скрине выше конкретно на этой строке:
set #asd PosEx($mess %j.9[#a]) //если нашлось сообщение
при том не сразу и скрипт может проработать несколько минут
скрипт1

Код

set priority 0
set linedelay 0
set %j[10]
set #if2 1
:re
readmem #if1 0xCE3228 d //чтение указателя 1
if (#if1 != #if2) //если адреса не равны значит есть новое сообщение
readmem #decCount #if1 d             //чтение указателя 2
readmem $lmess #decCount s 120       //чтение сообщения
for #a 1 9 1 //сдвиг всего массива на 1
    set #b #a + 1
    set %j[#a] %j[#b]
    //set logging %j[#a]
end_for
set %j[10] $lmess
end_if
set #if2 #if1
goto re


скрипт2

Код

//что то делаем и нужно ждать пока не появится сообщение о том что готово
set $mess All kill please
gosub waitmess
end_script

:waitmess //$mess
//set %j[10]
start_script 0
set #tmp linedelay
set linedelay 0
set #asd 0
:rere123
for #a 1 10 1              //перебор всего массива
    //if (#avl.0 = 1) //pause_script 0
    set #asd PosEx($mess %j.0[#a]) //если нашлось сообщение
    //end_if //resume_script 0
    if (#asd > 0)
       stop_script 0
       goto next123
    end_if
end_for
goto rere123
:next123
set linedelay #tmp
return



--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

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

 

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