Ошибка GoTo

Ask for help

Moderators: Murderator+, Murderator

Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Ошибка GoTo

Post by Sanch »

Выдает ошибку GoTo, жомет ли это быть связано с тем что при переходе на определенную строчку скритпта еще раз задается значение переменной?
???
step1:
f = uo.getserial('finditem')
???

Было так:

sub test()
.....
step1:
.....
goto step1
.....
test2()
....
end sub

sub test2()
.....
step1:
.....
goto step1
.....
goto step1
.....
step2:
.....
goto step2
.....
end sub

Инжект жалуется на GoTo при запуске второго скрипта, изменил на:

sub test()
.....
step1:
.....
goto step1
.....
test2()
....
end sub

sub test2()
.....
step2:
.....
goto step2
.....
goto step2
.....
step3:
.....
goto step3
.....
end sub

Но это не помогло

Ну а вот собсно сам скрипт, все необходимое подчеркнуто:

sub Obkopka()
VAR mx, my, mz, a, b, c
step1:
mx = uo.getx('self')
my = uo.gety('self')
mz = uo.getz('self')
uo.deletejournal()
for a = mx-2 to mx+2
for b = my-2 to my+2
while not uo.Hidden()
uo.warmode('0')
uo.useskill('Stealth')
wait(4000)
wend
uo.print('!!!КОПАЕМ ТУТ!!!>>> : '+str(mx-a)+' '+str(my-b))
c = val(uo.getglobal('per3')) + 1
wait(100)
uo.setglobal('per3', str(c))
while not uo.injournal('no ore here') and not uo.injournal('location') and not uo.injournal('far away') and not uo.injournal('in rock') and not uo.injournal('You broke')
uo.deletejournal()
if uo.waiting() then
uo.canceltarget()
else
wait(100)
endif
uo.waittargettile('1341', str(a), str(b), str(mz))
uo.usetype('0x0E85')
while not uo.injournal('You put') and not uo.injournal('heavy') and not uo.injournal('location') and not uo.injournal('no ore') and not uo.injournal('but fail') and not uo.injournal('far away') and not uo.injournal('in rock') and not uo.injournal('You broke')
wait(500)
wend
uo.set('finddistance', '3')
uo.findtype( '0x000E', '-1', '1' )
if uo.findcount() > 0 then
KillElemental()
else
wait(100)
endif
if val(uo.getglobal('per3')) > 25 then
uo.setglobal('per3', '0')
wait(100)
ChengePlace()
wait(100)
goto step1
else
wait(100)
endif
if uo.weight > 600 then
uo.deletejournal()
wait(100)
uo.exec('terminate CheckingPlayers')
wait(500)
uo.exec('exec GoHome')
wait(500)
return
else
wait(100)
endif
wend
uo.deletejournal()
next
next
goto step1
end sub

sub KillElemental()
VAR a, b, c, d, e, f, g, h, i, j, k
if val(uo.getglobal('per4')) == 1 then
for a = 1 to 2
uo.press(40)
wait(300)
next
endif
if val(uo.getglobal('per4')) == 2 then
for b = 1 to 2
uo.press(39)
wait(300)
next
endif
if val(uo.getglobal('per4')) == 3 then
for c = 1 to 2
uo.press(38)
wait(300)
next
endif
if val(uo.getglobal('per4')) == 4 then
for d = 1 to 2
uo.press(40)
wait(300)
next
endif
uo.usetype('0x0F08')
wait(1000)
uo.set('finddistance', '5')
uo.findtype( '0x000E', '-1', '1' )
e = uo.getserial('finditem')
step2:
if uo.Mana < 50 then
uo.usetype('0x0F09')
wait(500)
endif
uo.waittargetobject('e')
uo.cast('Energy Vortex')
wait(7000)
if uo.injournal('fizzles') then
wait(1000)
uo.deletejournal('fizzles')
goto step2
else
while not uo.injournal('Body of')
uo.set('finddistance', '12')
uo.findtype( '0x000D', '-1', '1' )
f = uo.getserial('finditem')
if uo.findcount() == 0 then
goto step2
else
wait(5000)
endif
wend
endif
uo.deletejournal('Body of')
step3:
if uo.Mana < 40 then
uo.usetype('0x0F09')
wait(100)
endif
uo.waittargetobject('f')
uo.cast('Mass Dispel')
wait(5000)
if uo.injournal('fizzles') then
wait(1000)
uo.deletejournal('fizzles')
goto step3
endif
if val(uo.getglobal('per4')) == 1 then
for g = 1 to 2
uo.press(38)
wait(300)
next
endif
if val(uo.getglobal('per4')) == 2 then
for h = 1 to 2
uo.press(37)
wait(300)
next
endif
if val(uo.getglobal('per4')) == 3 then
for i = 1 to 2
uo.press(40)
wait(300)
next
endif
if val(uo.getglobal('per4')) == 4 then
for j = 1 to 2
uo.press(38)
wait(300)
next
endif
if uo.weight > 600 then
uo.deletejournal()
wait(100)
uo.exec('terminate CheckingPlayers')
wait(500)
uo.exec('exec GoHome')
wait(500)
uo.exec('terminate Obkopka')
wait(500)
return
else
wait(100)
endif
DIM item[2]
item[0] = '0x1BF5'
item[1] = '0x0EED'
uo.useobject('lastcorpse')
wait(1000)
for k = 0 to 1
uo.findtype( item[k], '-1', 'lastcorpse')
while uo.findcount() > 0
uo.moveitem('finditem')
wait(1000)
wend
next
uo.deletejournal()
wait(100)
end sub

Оч благодарен за помощь...
Savage
Expert!
Posts: 1205
Joined: 2004-04-04 11:13:54
Location: Балаково, Саратовская обл.
Contact:

Post by Savage »

Ниасилил!
viewtopic.php?t=3491
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

Ниасилил!


Какой умный ппц, если лень помогать так молчал бы уж, я эти уроки раз 10 уже проштудировал от и до и знаю их чуть ли не наизусть, там про GoTo ни слова не сказано, я бы не стал писать если бы сам смог бы найти ошибку, все вышейзложениые скрипты писал сам, 10 раз их проверял и не могу увидеть ошибку, вот и от безысходности создал топ этот.
dmitrykit
Posts: 247
Joined: 2005-06-12 22:12:15

Post by dmitrykit »

operator 'goto' uzhe davno nepolzujecca populjarnostju.. i programmisty starajucca ego niispolzovat'...
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

operator 'goto' uzhe davno nepolzujecca populjarnostju.. i programmisty starajucca ego niispolzovat'...


Мне конечно было очень интересно узнать об актулаьности использования goto на сегодняшний день, я отстал от жизни, я просто лох, какое несчастье :x :x :x .

Вобщем я переписал скирпт заного, думаю проблема отпала, имхо goto оч удобен, что использовать вместо него я хз, да и скрипты я пишу всего 2 недели, поэтому популярность команд меня мало интересует, главное чтобы они работали.
Savage
Expert!
Posts: 1205
Joined: 2004-04-04 11:13:54
Location: Балаково, Саратовская обл.
Contact:

Post by Savage »

Нужно переходить на качественно новый уровень, попробуй что ли в чужих скриптах покапаться....
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

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


Я бы не проч, но для 2ух недельного опыта писания скриптов я имхо хороших результатов добился, пишу как умею, начал писать сам тк в чужих разобраться никак не смог, ну конечно можно щас попробовать покопаться в чужишь, хотя сказать честно для меня принцип работы некоторых элементов в скриптах остается загадкой, например если не ставить пауз между различными командами, то ни иногда глючат, но после каких надо а после каких не надо я не знаю, поэтому леплю везде, где считаю нужным, на скорость работы скрипта пауза в 100 конечно значительно не повлияет, но все же хочется больше определенности.
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Паузы нужны:

1. В тех случаях, когда шард блокирует использование двух каких-то команд подряд. Например, лут - не стоит пытаться без паузы дергать вещи из трупа, тебя либо заблокирует, либо вообще выкинет из игры. Размер паузы либо выясняется из распросов админа шарда, либо по опыту других игроков, либо методом научного тыка.

2. В тех случаях, когда тебе надо в следующей команде (или одной из следующих) результат физического действия в мире, например, того же драга вещи. Ты играешь на шарде через интернет, пинг до сервера померять можешь, далее считаешь - пакет о драге ушел на сервер, вернулся обратно - вот тебе минимальная пауза, прежде чем драг завершится. И именно физического действия, поиск, например, действие виртуальное и в паузе после себя не нуждается. Инжект сам обеспечит необходимую паузу.

3. Очень часто необходимо вводить так называемую проверку на лаги - обычно это функция Checklag() - она нужна чтобы отследить какое-либо подвисание твоей игры, либо возросший пинг, либо сэйв мира в уо и прочее. Работает она просто - щелкает по бэкпаку и ловит имя бекпака. Как поймала - пауза завершается. Такую проверку надо обязательно вводить перед любым действием по ранее установленной ловушке прицела (иначе если твое действие попадет на лаг - его просто не будет и прицел останется висеть, либо действие запоздает, а скрипт у тебя пошел уже дальше...)

4. Паузы также нужны для выделения времени на совершения действия в уо. Например, использование скилла - прикинь сколько времени занимает крафт и на такое время ставь скрипт на паузу, иначе быстрее всего получишь физл. А лучше прочитай уроки и посмотри чужие скрипты и научись делать динамическую паузу, то есть паузу неопределенной заранее длины, а до какого-то конкретного события или сообщения.
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

Большое спасибо за инфу, приблизительно то же самое я и делаю в скриптах, есть некая трабла: есть скрипт на мининг, одновременно работают 2 скрипта, на проверку появлеения пк и на саму копку, проблема заключается в следующем, что при копке когда чар что либо выкопал проверяет наличие эелементаля с заданой дистанией в 3 тайтла, при этом скритп на пк ищет чаров на расстоянии в 14 тайтлов, и когда эти 2 проверки перехлестываются то происходит поиск элементаля на расстоянии 14 тайтлов, и как правило он его находит, тк другие игроки элементалей не убивают а выводят из шахты, в совю очередь скритп записывает его ID, отбегает, сьедает инвизку кидает на него вортекса и скрипт выдает тучу ошибок, эту проблему я исправил путем отмены убийства элементаля при пявлении в журнале сообщения о том что он вне зоны видемости, все бы ничего если бы не нереальные цены на инвизки, будут ли какие либо идеи по синхронизации работы 2ух поисков? Не приемлемость испольования проверки на пк в самом скрипте на копку заключается в том что проверка должна производиться постоянно, тк чар еще ходит по шахте и тд, в это время он бут беззащитен против пк.
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Sanch wrote:Большое спасибо за инфу, приблизительно то же самое я и делаю в скриптах, есть некая трабла: есть скрипт на мининг, одновременно работают 2 скрипта, на проверку появлеения пк и на саму копку, проблема заключается в следующем, что при копке когда чар что либо выкопал проверяет наличие эелементаля с заданой дистанией в 3 тайтла, при этом скритп на пк ищет чаров на расстоянии в 14 тайтлов, и когда эти 2 проверки перехлестываются то происходит поиск элементаля на расстоянии 14 тайтлов, и как правило он его находит, тк другие игроки элементалей не убивают а выводят из шахты, в совю очередь скритп записывает его ID, отбегает, сьедает инвизку кидает на него вортекса и скрипт выдает тучу ошибок, эту проблему я исправил путем отмены убийства элементаля при пявлении в журнале сообщения о том что он вне зоны видемости, все бы ничего если бы не нереальные цены на инвизки, будут ли какие либо идеи по синхронизации работы 2ух поисков? Не приемлемость испольования проверки на пк в самом скрипте на копку заключается в том что проверка должна производиться постоянно, тк чар еще ходит по шахте и тд, в это время он бут беззащитен против пк.

Code: Select all

sub AntiPK()
uo.setGlobal("in_pk","0")
...
while uo.getGlobal("in_element") == "1"
wait(10)
wend
uo.setGlobal("in_pk","1")
; поиск PK
uo.setGlobal("in_pk","0")
endsub

sub AntiElement()
uo.setGlobal("in_element","0")
...
while uo.getGlobal("in_pk") == "1"
wait(10)
wend
uo.setGlobal("in_element","1")
; поиск элементов
uo.setGlobal("in_element","0")
endsub


Разберёшся, что к чему? Я для понятность использовал setGlobal, но при нём чаще выскакивает противная ошибка - лучше использовать uo.(set|get)EasyUO.

Суть скрипта такова, когда ищем пк/эля, мы записываем об этом в глобалку, и другой скрипт, ждёт, пока поиск пк/эля не завершиться.
Savage
Expert!
Posts: 1205
Joined: 2004-04-04 11:13:54
Location: Балаково, Саратовская обл.
Contact:

Post by Savage »

Двухпотоковые скрипты - ересь! Надо строить скрипт так чтоб в ключевых моментах вызывалась твоя проверка на пк. Или как крайний случай проверка на пк проверяет все возможные опасности включая элементалей. Перед передвижением к следующей клетке, выдерживаешь паузу чтоб проверка обязательно отработала.
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Destruction wrote:но при нём чаще выскакивает противная ошибка - лучше использовать uo.(set|get)EasyUO.


Дест, уже на зубах навязла твоя навязчивая реклама UO.setEasyUO. Несешь ахинею насчет "неустойчивости" UO.SetGlobal(), я тебе уже говорил что у меня почти во всех скриптах используются эти команды и скрипты пашут неделями без перерыва. Не надо выдавать за непреложную истину то, что ты где-то от кого-то краем уха услышал.
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Savage wrote:Двухпотоковые скрипты - ересь!


Почему же ересь-то? У меня и пятипотоковые встречаются... А сводить все к одному скрипту с кучей проверок на каждом шагу... фу... Просто потоки надо разводить, чтобы они не пересекались. А взимодействовали через глобальные переменные.
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

Что то вдруг все месные эксперты проснулись, это не может не радовать :) :) :)

По поводу использования глобалок, твою идею понял, спасибо, по поводу использования uo.set\getglobal(), как они работают я знаю, не так давно пользуюсь, но пока никаких нареканий не было, uo.set\getEasyUO никогда не пользовался.

Ну а одновременная работа нескольких скриптов это в моем случае необходимость, когда я написал свой скрипт на мининг их было порядка 4, доработал, стало 2, проблема скрипта на мининг под дрв, по которому я делал свой, в том что там нет убийства элементаля и смены места копки, во время которых проверку на пк то же хотелось бы делать, тут 3 варианта, либо проверка на пк после каждого шага и на всех стадиях убийства элема, либо 2 скрита работающих одновременно, ну или можно просто понадеяться на то что пк не прибежит когда ты будешь менять место копки или сражаться с элемом, чего мне бы не хотелось.
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Edred wrote:
Destruction wrote:но при нём чаще выскакивает противная ошибка - лучше использовать uo.(set|get)EasyUO.


Дест, уже на зубах навязла твоя навязчивая реклама UO.setEasyUO. Несешь ахинею насчет "неустойчивости" UO.SetGlobal(), я тебе уже говорил что у меня почти во всех скриптах используются эти команды и скрипты пашут неделями без перерыва. Не надо выдавать за непреложную истину то, что ты где-то от кого-то краем уха услышал.

Зависит от того, насколько часто пользовать.

Вот ты сам подумай, где инжа глобалы хранит? Прально, где-то внутри, сидит, хранит, память засоряет потихоньку.

А изиуо грамотно, в реестр, чтобы не мучаться.

PS: Моё дело предупредить.

Запусти сначало такой скрипт:

Code: Select all

sub MySub()
var i=0
repeat
i=i+1
uo.setGlobal("MyName",str(i))
until false
endsub


А затем такой:

Code: Select all

sub MySub()
var i=0
repeat
i=i+1
uo.setEasyUO(1,str(i))
until false
endsub


И сравни, который дольше проживёт.
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

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

sub CheckingPlayers()
while uo.Life > 0
uo.setglobal('per4', '1') #отвечает за синхронизацию поиска#
uo.set('finddistance', '14')
uo.findtype('0x0190', '-1', '1') #тип игрока мужского пола#
if uo.findcount() > 1 then
uo.usetype('0x0F08')
wait(100)
uo.exec('terminate Obkopka')
wait(500)
uo.exec('exec Teleportation')
wait(500)
return
else
uo.setglobal('per4', '0')
wait(1000)
endif
uo.setglobal('per4', '1')
uo.set('finddistance', '14')
uo.findtype('*', '-1', '1') #тип игрока женского пола#
if uo.findcount() > 0 then
uo.usetype('0x0F08')
wait(100)
uo.exec('terminate Obkopka')
wait(500)
uo.exec('exec Teleportation')
wait(500)
return
else
uo.setglobal('per4', '0')
wait(1000)
endif
wend
end sub

sub Obkopka()
VAR mx, my, mz, a, b, c, d
step1:
mx = uo.getx('self')
my = uo.gety('self')
mz = uo.getz('self')
uo.deletejournal()
for a = mx-2 to mx+2
for b = my-2 to my+2
while not uo.Hidden()
uo.warmode('0')
uo.useskill('Stealth')
wait(4000)
wend
uo.print('!!!КОПАЕМ ТУТ!!!>>> : '+str(mx-a)+' '+str(my-b))
c = val(uo.getglobal('per2')) + 1
wait(100)
uo.setglobal('per2', str(c))
while not uo.injournal('no ore here') and not uo.injournal('location') and not uo.injournal('far away') and not uo.injournal('in rock') and not uo.injournal('You broke')
uo.deletejournal()
if uo.waiting() then
uo.canceltarget()
else
wait(100)
endif
uo.waittargettile('1341', str(a), str(b), str(mz))
uo.usetype('0x0E85') #тип кирки#
while not uo.injournal('You put') and not uo.injournal('heavy') and not uo.injournal('location') and not uo.injournal('no ore') and not uo.injournal('but fail') and not uo.injournal('far away') and not uo.injournal('in rock') and not uo.injournal('You broke')
wait(500)
wend
while val(uo.getglobal('per4')) == 1
wait(100)
wend
uo.set('finddistance', '3')
uo.findtype('0x000E', '-1', '1') #тип элементаля#
if uo.findcount() > 0 then
d = uo.getserial('finditem')
uo.setglobal('elem', 'd')
KillElemental()
else
wait(100)
endif
if val(uo.getglobal('per2')) > 25 then
uo.setglobal('per2', '1')
wait(100)
ChengePlace()
goto step1
else
wait(100)
endif
if uo.weight > 600 then #максимальный вес#
uo.deletejournal()
wait(100)
uo.exec('terminate CheckingPlayers')
wait(500)
uo.exec('exec GoHome')
wait(500)
return
else
wait(100)
endif
wend
uo.deletejournal()
next
next
goto step1
end sub

Есть небольшой вопросик, можно ли с помощью uo.Print напечатать пробел?
Last edited by Sanch on 2006-04-12 13:25:46, edited 1 time in total.
Savage
Expert!
Posts: 1205
Joined: 2004-04-04 11:13:54
Location: Балаково, Саратовская обл.
Contact:

Post by Savage »

По поводу отмены таргета.
viewtopic.php?p=39328#39328
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

По поводу отмены таргета.


Это типо как пробел нажать через инжу?
Savage
Expert!
Posts: 1205
Joined: 2004-04-04 11:13:54
Location: Балаково, Саратовская обл.
Contact:

Post by Savage »

Code: Select all

uo.deletejournal() 
if uo.waiting() then
uo.canceltarget()
else
wait(100)
endif

Канцелтаргет несколько другая команда...
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

А к чему тогда это было написано? Мож я че не догоняю :?
Post Reply