Posted: 2006-11-09 01:29:56
Вот мой скрипт на мининг для шарда ФВ. Разбирайтесь.
Code: Select all
; Мининг для шарда ForestWars. Портирование на Изи соответствующего скрипта из инжекта
; с одновременной доработкой (усовершенствованием).
;
;v.1.09 (c) Edred
;
; 1.00 - делаем процедуру обкопки вокруг чара
; 1.01 - вводим включение / выключение Always Run (копка будет производиться в хайде)
; 1.02 - вводим автоматическое перемещение по шахте
; 1.03 - вводим процедуру перемещения по маршруту, маршрут пишется через _
; 1.04 - переписываем на изе головную процедуру
; 1.05 - разбиваем маршрут в шахту вне ГЗ на две части так, чтобы стык
; приходился на респ кирок. Тут при обратном пути проверяем наличие
; кирки и если ее нет - берем с респа.
; 1.06 - делаем разгрузку в банк. В банке лежат 6 мешков для дидов. Думаю,
; 6х250 - вполне достаточно :). Делаем рес чара. Восстановление
; здоровья и маны.
; 1.07 - ввел реконнектор, исправил кучу мелких ошибок. Все работает.
; Реконнектор еще не оттесчен.
; 1.08 - вводим копку в хайде.
; 1.09 - ввел вывод итогов копки в шапку окна УО
initevents
event macro 8 2 ; открыть статус если закрыт
event macro 8 7 ; открыть бекпак если закрыт
; Сообщения
set %nothing There_is_nothing_here_to_mine_for.
set %far That_is_too_far
set %try Try_mining_elsewhere.
set %cannot You_cannot_mine_so_close
set %noline You_have_no_line
set %cannot2 You_can't_reach
set %attacking is_attacking_you
set %decide You_decide_not_to_mine_for_now.
set %put in_your_pack.
set %loosen You_loosen_some_rocks
set %fignya K_=5_A<>3 ; "вы не смогли выкопать ничего стоющего"
set %battle You_are_preoccupied_with_thoughts
;
set %MaxTime4Mes 20 ; Максимум сколько ждать сообщений в секундах
set %MaxPointIteration 10 ; сколько раз получать сообщение "ничего стоющего"
;
set %RunOn Always_Run_is_now_on.
set %RunOff Always_Run_is_now_off.
;
set %PackInBankID XKXKKMD
set %PackInBankType CKF
set %CaveLimit 1283
set %line _
; 1. Внутри шахты
set %Rail1 1308_2836_1308_2848
; 2. От шахты до ГЗ
set %Rail2 1308_2848_1313_2848_1333_2828
; 3. По ГЗ до точки рядом с крестом
; (если бьют, можно гвардить)
set %Rail3 1350_2828_1351_2827_1370_2827_1370_2820_1376_2814_1376_2805_1371_2805
; 4 и 5 маршруты задействуются только если чар убит. Живой чар следует с 3 сразу на 6.
; 4. Подход к кресту для реса
set %Rail4 1371_2803
; 5. Отход от креста обратно
set %Rail5 1371_2805
; 6. Подход к банку
set %Rail6 1339_2805_1339_2790
; Начальные точки копки
set %JevelType DWF
set %SAType SZF
set %OreType1 DWJ_EWJ_GWJ_TVJ
set %BankBagNom 1
set %cntbag1 0
set %cntbag2 0
set %cntbag3 0
set %cntbag4 0
set %cntbag5 0
set %cntbag6 0
set %cntghost 0
set %DeedType TVH
if #CHARNAME = BOCTOK
{
set %StartMinPoint1 1306_2836
set %StartMinPoint2 1306_2831
set %StartMinPoint3 1306_2827
set %bankbox IHDKKMD
set %BankBag1 ZDAJKMD
set %BankBag2 YGAJKMD
set %BankBag3 IHAJKMD
set %BankBag4 SKAJKMD
set %BankBag5 BEAJKMD
set %BankBag6 XKXKKMD
}
if #CHARNAME = Edred
{
set %StartMinPoint1 1306_2838
set %StartMinPoint2 1306_2829
set %StartMinPoint3 1306_2824
set %bankbox VXYVJMD
set %BankBag1 FOMIKMD
set %BankBag2 JOXHKMD
set %BankBag3 ASXHKMD
set %BankBag4 KPXHKMD
set %BankBag5 YHWKKMD
set %BankBag6 JCWKKMD
}
set %AnkhID PBPBKMD
set %AnkhType UC
; Головная процедура:
set %CountMining 0
event SysMessage Script started...
setUOTitle UO h: , #hits , #spc , | bag1: , %cntbag1 , #spc , bag2: , %cntbag2 , #spc , bag3: , %cntbag3 , #spc , bag4: , %cntbag4 , #spc , bag5: , %cntbag5 , #spc , bag6: , %cntbag6 , #spc , ghost: , %cntghost
if #charposx = 1339 && #charposy = 2790
{
; Чар стартует от банка
event SysMessage Go to cave...
gosub CheckStamina
gosub GotoRail %Rail6 0 1
gosub CheckStamina
gosub GotoRail %Rail3 0 1
gosub CheckStamina
gosub GotoRail %Rail2 0 0
gosub CheckPickaxe
gosub GotoRail %Rail1 0 0
gosub GotoRail %StartMinPoint1 1 0
}
repeat
{
gosub ChangeRun 0
repeat
{
gosub MineAround
set flagWarRes 0
if #result = 0 || #result = 2 || #result = 3 || #charghost = YES || #charposx < %CaveLimit + 2
break
if #result = 4
{
set flagWarRes 1
break
}
set %tmpx #charposx - 2
set %rail %tmpx , %line , #charposy
gosub GotoRail %rail 1 0
event SysMessage char moved to new location
}
until #charghost = YES || #charposx < %CaveLimit + 2
gosub %ControlMine 1 0
event SysMessage Go to town...
gosub ChangeRun 1
gosub GotoRail %Rail1 1 0
gosub GotoRail %Rail2 1 0
gosub CheckStamina
if flagWarRes = 1
{
event macro 6 0
wait 1s
}
gosub GotoRail %Rail3 1 1
if #charghost = YES
{
event SysMessage Res...
gosub GotoRail %Rail4 1 0
gosub ResChar
gosub CheckStamina
gosub GotoRail %Rail5 1 0
event SysMessage Go to Cave...
}
else
{
gosub CheckStamina
gosub GotoRail %Rail6 1 1
event SysMessage Discharge...
gosub CheckStamina
gosub DishargeBank
if #result = 0
{
event SysMessage Script finished...
halt
}
event SysMessage Go to Cave...
gosub GotoRail %Rail6 0 1
}
gosub CheckStamina
gosub GotoRail %rail3 0 1
gosub CheckStamina
gosub GotoRail %rail2 0 0
gosub CheckPickaxe
gosub GotoRail %rail1 0 0
; выберем начальную точку
if %CountMining = 0
gosub GotoRail %StartMinPoint1 1 0
if %CountMining = 1
gosub GotoRail %StartMinPoint2 1 0
if %CountMining = 2
gosub GotoRail %StartMinPoint3 1 0
set %CountMining %CountMining + 1
if %CountMining = 3
set %CountMining 0
}
until #false
halt
sub CheckStamina
if #stamina < 30
{
repeat
{
wait 1s
}
until #stamina > #maxstam - 20
return
sub CheckConnect
; If ( #contSize = 203_121 ) && ( #contName = waiting_gump )
; {
; Call TheUnseenPowerRelog.txt
; If ! #Result
; Halt
; }
return
sub ResChar
; Ресаем чара с креста и восстанавливаем ему здоровье спирит спиком
if G in #charStatus
{
event SysMessage War!
event macro 6 0
wait 1s
}
while #charghost = YES
{
set #LObjectID %AnkhId
event Macro 17
wait 1s
}
set %cntghost %cntghost + 1
event macro 8 1 ; открыть папердолл если закрыт
event macro 8 2 ; открыть статус если закрыт
event macro 8 7 ; открыть бекпак если закрыт
while #hits < #maxhits
{
event macro 13 32
wait 2s
if #mana < 20
{
while #mana < #maxmana
{
event macro 13 46
wait 2s
}
}
}
return
sub CheckPickaxe
; Проверяем в паке наличие кирки и если ее нет, то подходим
; к респу кирок и берем кирку с земли. Если кирки нет - ждем появления
set %CurPoint 1308_2848
set %Resp 1303_2848
if #charghost = YES
return
finditem NPF_WTH_QPF C
if #findcnt < 1
{
; бум искать на земле
gosub GotoRail %Resp 1 0
repeat
{
finditem NPF_WTH_QPF G_3
if #findcnt > 0
{
; нашли, возьмем в пак
Exevent Drag #findid #findstack
wait 10
Exevent Dropc #backpackid
wait 10
break
}
wait 1s
}
until #findcnt > 0
}
gosub GotoRail %CurPoint 1 0
return
sub DishargeBank
; Разгружаем пак чара в банк. Возвращаем:
; 1 - все ок. 0 - перевес или что-то подобное
msg bank $
wait 1s
; Переместим SA reg в банк
repeat
{
finditem %SAType C_ , #backpackid
if #findcnt > 0
{
Exevent Drag #findid #findstack
wait 10
Exevent Dropc %bankbox
wait 10
}
}
until #findcnt = 0
; Переместим джевелы в банк
repeat
{
finditem %JevelType C_ , #backpackid
if #findcnt > 0
{
Exevent Drag #findid #findstack
wait 10
Exevent Dropc %bankbox
wait 10
}
}
until #findcnt = 0
; теперь займемся рудой
repeat
{
finditem %OreType1 C_, #backpackid
if #findcnt > 0
{
msg .tradedeed $
target 3s
set #lTargetID #findid
set #lTargetKind 1
event Macro 22
wait 3s
}
}
until #findcnt = 0
RepeatCheckBag:
if %BankBagNom = 1
set %CurBankBag %BankBag1
if %BankBagNom = 2
set %CurBankBag %BankBag2
if %BankBagNom = 3
set %CurBankBag %BankBag3
if %BankBagNom = 4
set %CurBankBag %BankBag4
if %BankBagNom = 5
set %CurBankBag %BankBag5
if %BankBagNom = 6
set %CurBankBag %BankBag6
; проверим мешок
set #LObjectID %CurBankBag
event Macro 17
wait 1s
finditem %DeedType C_ , %CurBankBag
if %BankBagNom = 1
set %cntbag1 #findcnt
if %BankBagNom = 2
set %cntbag2 #findcnt
if %BankBagNom = 3
set %cntbag3 #findcnt
if %BankBagNom = 4
set %cntbag4 #findcnt
if %BankBagNom = 5
set %cntbag5 #findcnt
if %BankBagNom = 6
set %cntbag6 #findcnt
if #findcnt > 240
{
if %BankBagNom = 6
return 0
set %BankBagNom %BankBagNom + 1
goto RepeatCheckBag
}
set %tmpcountDeed 0
repeat
{
finditem %DeedType C_ , #backpackid
if #findcnt > 0
{
Exevent Drag #findid #findstack
wait 10
Exevent Dropc %CurBankBag
wait 10
ignoreitem #findid
set %tmpcountDeed %tmpcountDeed + 1
}
}
until #findcnt = 0
ignoreitem reset
if %BankBagNom = 1
set %cntbag1 %cntbag1 + %tmpcountDeed
if %BankBagNom = 2
set %cntbag2 %cntbag2 + %tmpcountDeed
if %BankBagNom = 3
set %cntbag3 %cntbag3 + %tmpcountDeed
if %BankBagNom = 4
set %cntbag4 %cntbag4 + %tmpcountDeed
if %BankBagNom = 5
set %cntbag5 %cntbag5 + %tmpcountDeed
if %BankBagNom = 6
set %cntbag6 %cntbag6 + %tmpcountDeed
setUOTitle UO h: , #hits , #spc , | bag1: , %cntbag1 , #spc , bag2: , %cntbag2 , #spc , bag3: , %cntbag3 , #spc , bag4: , %cntbag4 , #spc , bag5: , %cntbag5 , #spc , bag6: , %cntbag6 , #spc , ghost: , %cntghost
if G in #charStatus
{
event SysMessage War!
event macro 6 0
wait 1s
}
while #hits < #maxhits
{
event macro 13 32
wait 2s
if #mana < 20
{
while #mana < #maxmana
{
event macro 13 46
wait 2s
}
}
}
return 1
sub MineAround
; Обкопка вокруг чара
; Возвращает:
; 0 - чар под атакой
; 1 - все выкопано
; 2 - макс вес
; 3 - нет кирки
; 4 - чар в варе
if #charghost = YES || #hits < #maxhits
return 0
for %minex -2 2
{
for %miney -2 2
{
set %FinishFlag 1
set %CountIteration 0
repeat
{
if #charghost = YES || #hits < #maxhits
return 0
if #weight >= #MaxWeight - 40
return 2
while H notIn #charstatus
{
event macro 13 21
wait 5s
if #charghost = YES || #hits < #maxhits
return 0
}
repeat
{
finditem NPF_WTH_QPF
if #charghost = YES || #hits < #maxhits
{
ignoreitem reset
return 0
}
if #findkind = 1
ignoreitem #findid
if #findkind = -1
{
ignoreitem reset
return 3
}
}
until #findkind = 0
ignoreitem reset
if #charghost = YES || #hits < #maxhits
return 0
setUOTitle UO h: , #hits , #spc , | bag1: , %cntbag1 , #spc , bag2: , %cntbag2 , #spc , bag3: , %cntbag3 , #spc , bag4: , %cntbag4 , #spc , bag5: , %cntbag5 , #spc , bag6: , %cntbag6 , #spc , ghost: , %cntghost
if G in #charStatus
{
event macro 6 0
wait 1s
}
set #lobjectid #findid
event macro 17 0
if #charghost = YES || #hits < #maxhits
return 0
set #ltargetkind 3
set #ltargetx #charposx + %minex
set #ltargety #charposy + %miney
target 2s
event macro 22 0
if #charghost = YES || #hits < #maxhits
return 0
; сканируем журнал в поисках сообщений:
set %MessageFlag 0
set %CurTime4Mes 0
repeat
{
set %jrnl #jindex
wait 1s
set %CurTime4Mes %CurTime4Mes + 1
if %CurTime4Mes >= %MaxTime4Mes
{
set %FinishFlag 1
break
}
for %i %jrnl #jindex
{
scanjournal %i
if %decide in #journal
{
wait 3s
set %MessageFlag 1
break
}
if %battle in #journal
return 4
if %attacking in #journal || #hits < #maxhits - 10 || #charghost = YES
return 0
if %nothing in #journal || %far in #journal || %try in #journal || %cannot in #journal || %noline in #journal || %cannot2 in #journal
{
set %FinishFlag 0
set %MessageFlag 1
break
}
if %put in #journal
{
set %MessageFlag 1
break
}
if %loosen in #journal || %fignya in #journal
{
set %CountIteration %CountIteration + 1
if %CountIteration >= %MaxPointIteration
set %FinishFlag 0
else
set %FinishFlag 1
set %MessageFlag 1
break
}
}
}
until %MessageFlag = 1
}
until %FinishFlag = 0
}
}
return 1
sub ChangeRun
; Смена Always Run в зависимости от параметра.
; 0 - выключить Always Run
; 1 - включить Always Run
set %RunFlag %1
set %jrnl #jindex
event macro 32 0
wait 4
for %i %jrnl #jindex
{
scanjournal %i
if %RunOn in #journal && %RunFlag = 0
{
event macro 32 0
break
}
if %RunOff in #journal && %RunFlag = 1
{
event macro 32 0
break
}
}
return
Sub GotoRail
; %1 - маршрут
; %2 - направление (1 - прямое, 0 - обратное)
; %3 - вызывать гвардов в узловых точках или нет (есл здоровья меньше максимума -10)
set %rail %1
set %direct %2
set %guard %3
set %tolerant 0
set %timeout 60s
set %line _
if %direct = 0
{
; вывернем "наизнанку" маршрут %rail
set %railback
set %nstep 1
repeat
{
gosub GetWord %rail %nstep
set %myx #result
set %nstep %nstep + 1
gosub GetWord %rail %nstep
set %myy #result
if %myx <> %line && %myy <> %line
{
str Len %railback
if #strRes <> 0
set %railback %myx , %line , %myy , %line , %railback
else
set %railback %myx , %line , %myy
}
set %nstep %nstep + 1
}
until %myx = %line || %myy = %line
set %rail %railback
}
set %nstep 1
repeat
{
gosub GetWord %rail %nstep
set %myx #result
set %nstep %nstep + 1
gosub GetWord %rail %nstep
set %myy #result
if %myx <> %line && %myy <> %line
{
if %guard = 1 && #hits < #maxhits - 10 && #charghost = NO
{
msg guards $
wait 2
}
move %myx %myy %tolerant %timeout
set %nstep %nstep + 1
}
else
{
return
}
}
until %myx = %line || %myy = %line
return
Sub GetWord
; (c) Edred
; Возвращает слово из строки str (первый параметр) за номером
; num (второй параметр), слова должны быть разделены _
; если такого слова нет - возвращаем _
; Пример 1111_2222_3333_4444
; считаем параметры в переменные
set %str %1
set %num %2 - 1
if %num > 0
{
; установим возврат в _
set %ret _
; запомним длину строки
str Len %str
set %len #strRes
; определим количество подчеркиваний
str Count %str _
set %cnt #strRes
; если их меньше чем заказано - вернуть пустую строку
if %num > %cnt
return %ret
; найдем нужное подчеркивание и следующая позиция - начало
str Pos %str _ %num
set %start #strRes + 1
}
else
{
set %start 1
}
; увеличим счетчик подчеркиваний на 1
set %num %num + 1
; если это больше макс числа - значит до конца строки
if %num > %cnt
{
set %fin %len - %start + 1
str Mid %str %start %fin
}
else
{
; иначе считаем до предыдущей позиции
str Pos %str _ %num
set %num #strRes - 1
set %fin %num - %start + 1
str Mid %str %start %fin
}
set %ret #strRes
return %ret