Скрипт собирает золото убивая слабых монстров.
Скрипт удобно использовать как шаблон для своих ботов.
идет по точкам ищет мобов убивает собирает лут. лут тоже может быть какой угодно для удобства все сделано через динамические массивы.
так же в боте заложена функция самоодевания. можно кинуть в сумку пару наборов брони и штук 10 оружия он сам будет их одевать при поломке. юзает бинты если есть. Так же есть возможность юзать рунбуку , много чего просто закомментировано. ну короче сами разбирайтесь. тестил на RunUO.
и еще у кого нету мозга - я на нем заработал порядка 50 000 000. кто не умеет думать это его проблемы.
P.S. на Abyss он уже запрещен (((( увидят дадут банан.
Code: Select all
Program Golden_Boy;
const
money=30000;//кол-во денег после которого чар понесет их домой
homeX=2655 ;//Координата Х где встать для разгрузки
homeY= 534; //Координата У где встать для разгрузки
buttonHome=51;
buttonSkelet=50;
FindDistanceMob=75; //Дистанция поиска мобов
Helm= $2B10 ;  //Тип шлема
gorget= $2B0E ;   //Тип горжетки
legs = $2B06 ;   //Тип штанов
perchatki=$2B0C ; //Тип перчаток
Lokti=$2B0A ;  //Тип локтей  Arms
Cloak  = $2B04 ; //Плащь
Sandali=$2B13 ;//Сандали
Bracer =$1086 ;//Браслет
Ring=$108A ;//кольцо
Breastplate =$2B08 ;//Грудь
Shild=$1B76 ;  //Тип щита
Weapon=$1405 ; //Тип оружия
runebook= $4003B326 ;//ИД рунбуки
bankbox=$408428E8 ;
 goldcoin=$0EED;         		//ГП
 clean_bandages = $0E21;		//бинты   
 
 kolvodot=10; //кол-во точек которые будем обходить  
 
bagAll=$401335C7  ;//Ид сумки в которой лежат все остальные подсумки
bagweapon= $4020EB4D; //ид сундука откуда брать оружие и щит
bagarmor= $4020F6D6 ; //ид сундука откуда брать броню
bugMoney= $40212441 ;//ид сундука куда класть бабки
bugreagent=$40117D52 ;//ID bag reagent
BagRing=$40212437 ;  //ИД сумки куда класть кольцами
BagBrace=$40212440  ;//ИД сумки куда класть браслеты
var
//brockenItem:cardinal;  
monstro:array of word;
bodymonstro:array of word;
checkheal,k,hhh,mmn,checkmobss,dotResp:integer;
telo,TargetZ: cardinal;
ctime: TDateTime;
grabmas:array of word;
dot:array [0..10] of TFoundTile;
ctimeq:TDatetime;
procedure Init;
begin
monstro:=[$0003,$0099,$0038,$0032,$0094,$001A ];//  типы монстров которых надо бить. вписывать через запятую 
grabmas:=[$0EED];
//,$0F88,$0F78,$0F86,$0F8D,$0F7B,$0F8C,$0F7E    ,$0F8E,$0F8A,$0F7D,$0F84,$0F7A,$0F85,$0F84,$0F7D,$0F8F ] ; //$1F06,$1086-Браслеты.$1F09,$108A - кольца
{skeleton Type: $0032 
ghoul Type: $0099
}
FindVertical := 5;
moveOpenDoor := True; 
bodymonstro:=[$2006];// типы трупов монстров которые надо обыскивать
ctimeq := Now;
checkheal:=0;
SetPauseScriptOnDisconnectStatus(True);
SetARStatus(True);
mmn:=0;
dotResp:=0;
ctimeq := Now;
dot[0].X:=3679;      //точки которые будем обходить
dot[0].Y:=2481;
dot[1].X:=3654;
dot[1].Y:=2480;
dot[2].X:=3619;
dot[2].Y:=2482;
dot[3].X:=3597;
dot[3].Y:=2452;
dot[4].X:=3619;
dot[4].Y:=2507;
dot[5].X:=3643;
dot[5].Y:=2514;
dot[6].X:=3640;
dot[6].Y:=2512;
dot[7].X:=3637;     
dot[7].Y:=2539;
dot[8].X:=3658;     
dot[8].Y:=2537;
dot[9].X:=3661;     
dot[9].Y:=2512;
dot[10].X:=548;     
dot[10].Y:=969;
end;
procedure tele(kuda:Integer);
var
agump:Word;
ctime:TDatetime;
begin
{
waitgump(kuda);
wait(1000)  ;
UseObject(runebook);
wait (1000);
CloseSimpleGump(0);
}
ctime := Now; 
repeat
AddToSystemJournal('1');
if InJournalBetweenTimes('The spell fizzles|needs time to recharge|location is blocked', ctime, Now)>=0 then
begin
AddToSystemJournal('Ждем 10 сек');
wait(10000);
end;
if InJournalBetweenTimes('More reagents are needed', ctime, Now)>=0 then
begin
AddToSystemJournal('Нет реагентов для рекола.должите реагентов');
wait(60000);
end;
ctime := Now; 
checklag(60000);
  agump := GetGumpsCount;
  UseObject(runebook); 
  //If IsGump then
  while agump = GetGumpsCount do
    Wait(50);
  //NumGumpTextEntry(GetGumpsCount-1,513, '30');
  NumGumpButton(GetGumpsCount-1,kuda);
  wait(6000);         
						checklag(60000);  
AddToSystemJournal('2');
		until  (InJournalBetweenTimes('The spell fizzles|This book needs time to recharge|That location is blocked|More reagents are needed', ctime, Now)<0) or dead;
AddToSystemJournal('3');
end;
procedure equip_tool(type_of_tool:word;layer:Byte);
begin
while (GetType(ObjAtLayer(layer))<>type_of_tool) and (not dead) do
    begin    
{    while (GetType(ObjAtLayer(layer))<>0) or (not dead) do
      begin   
      checklag(60000); 
      unequip(layer); 
      wait(1000);
      end;  } 
    checklag(60000); 
    equipt(layer,type_of_tool);
    wait(1000);
   end;
end;
function podhod(targetk:Cardinal):Boolean;
begin
AddToSystemJournal('Жертва: '+GetName(targetk)+'.ID: '+inttohex(targetk,8)+'.Х: '+inttostr(GetX(targetk))+'.Y: '+inttostr(GetY(targetk))+'.Z:'+inttostr(GetZ(targetk))+'. дистанция: ' +inttostr(GetDistance(targetk)));
checklag(60000);
AddToSystemJournal('My person: '+GetName(Self)+'.Х: '+inttostr(GetX(Self))+'.Y: '+inttostr(GetY(Self))+'.Z:'+inttostr(GetZ(Self)));
checklag(60000);
if (GetX(targetk)>3686) and (GetY(targetk)>2501) and (GetX(targetk)<3701) and (GetY(targetk)<2521) then result:=False
else 
result:= NewMoveXY(GetX(targetk),GetY(targetk),true,1,true);
//wait(500);
end;
procedure Heal;// хилимcя 
var
m:integer;
begin
  if (gethp(self) < (getmaxhp(self)*0.7))and (not dead)and(ctimeq<now) then   
 //if (gethp(self) < 98) and (not dead) then  
//  while (gethp(self) < (getmaxhp(self))) and (not dead) do
    begin		
    ctimeq := now+EncodeTime(0,0,7,0);  
      AddToSystemJournal('Хилимся');
      checklag(60000); 
      UseObject(FindType(clean_bandages,Backpack)); 
      checklag(60000); 
      WaitTargetObject(Self); 
   { m:=0;   
    if (InJournalBetweenTimes('You finish applying the bandages|You apply the bandages, but they barely help', ctimeq, Now)>= 0) then   
    begin
     checkheal:=0;   
     ctimeq := Now;
    end;
     if  ctimeq+EncodeTime(0,1,0,0)<Now then
     checkheal:=0;
     
 //   while (CountEx(clean_bandages,$0000,backpack) < 1) and  (not dead) do
 if  (CountEx(clean_bandages,$0000,backpack) < 1) and  (not dead) then
    begin
      AddToSystemJournal('Нет бинтов');  
      wait(1000);
    end
    else    
     if (InJournalBetweenTimes('You finish applying the bandages|You apply the bandages, but they barely help', ctimeq, Now)< 0)and(not dead) and( (checkheal=0))  then   
     begin
      AddToSystemJournal('Хилимся');
      checklag(60000); 
      UseObject(FindType(clean_bandages,Backpack)); 
      checklag(60000); 
      WaitTargetObject(Self); 
      checkheal:=1;       
			ctimeq := Now;  
      end; }
  end;
end;
procedure checkwar; //включаем вармоде
begin
if IsWarMode(self) then
 begin
  setWarMode(false);
 end;
end;
function Fight(zertva:cardinal):integer ; //Бьем цель
var
KolVoZahod:integer;
begin
if (gethp(self) < (getmaxhp(self)*0.7)) and not dead then
Heal;
 
//AddToSystemJournal('ghj 56');  
KolVoZahod:=0;   
//Cast('Evasion');
while (GetHP(zertva)<>0) and (KolVoZahod<2) do 
begin
AddToSystemJournal('GetHP(zertva) = '+inttostr(GetHP(zertva)));  
//if IsActiveSpellAbility( 'Lightning Strike') = false then Cast('Lightning Strike');
//AddToSystemJournal('ghj 3');
setWarMode(true);
//if GetActiveAbility  <> 'Lightning Strike' then 
//Cast('Lightning Strike');
//  AddToSystemJournal('GetActiveAbility='+GetActiveAbility);
//AddToSystemJournal('16');
Attack (zertva);
Heal;
//AddToSystemJournal('17');
 if podhod(zertva)=false then 
 begin 
  //  AddToSystemJournal('Нет прохода');  
    KolVoZahod:=KolVoZahod+1;
 end;
 //AddToSystemJournal('18');
 result:=KolVoZahod;
end;
Heal;
end;
//function checkshmot:Boolean;//проверяем поломана ли вещь если да то глобальная переменная примет значение поломанной вещи
//begin
//brockenItem:= ;
//end;
procedure Stock;//выгружаем loot
var
ppp:integer;
lootReg:array of word;
lootRing:array of word;
lootBrace:array of word;
begin
lootReg:=[$0F8D,$0F84,$0F8A,$0F88,$0F86,$0F7B,$0F7D,$0F8A,$0F8C,$0F78,$0F8E,$0F7A ,$0F8F,$0F7E,$0F85 ];
lootRing:=[$1F09,$108A];
lootBrace:=[$1F06,$1086];
  checklag(60000);
  UseObject(bagAll); 
  wait(1000); 
                        
  
  //AddToSystemJournal('606 Заработал ГП : '+ inttostr(CountEx(GoldCoin,$0000,backpack)));  
  
 checklag(60000);
  UseObject(bugMoney); 
  wait(1000); 
    
  begin
     while (Count(goldcoin) > 0) and not dead do
     begin
	      checklag(60000);
        FindType (goldcoin,Backpack) ;
        MoveItem(FindItem,0,bugMoney,0,0,0);
      wait(600);
     end;
  end;    
  
    begin
     while (Count(clean_bandages) > 0) and not dead do
     begin
	      checklag(60000);
        FindType (clean_bandages,Backpack) ;
        MoveItem(FindItem,0,bagAll,0,0,0);
      wait(600);
     end;
  end;  
  
checklag(60000);
  UseObject(bugreagent); 
  wait(1000); 
    
  for  ppp:=0 to (GetArrayLength(lootReg)-1) do
  begin
     while (Count(lootReg[ppp]) > 0) and not dead do
     begin
	      checklag(60000);
        FindType (lootReg[ppp],Backpack) ;
        MoveItem(FindItem,0,bugreagent,0,0,0);
      wait(600);
     end;
  end;   
  
  checklag(60000);
  UseObject(BagRing); 
  wait(1000); 
  for  ppp:=0 to (GetArrayLength(lootRing)-1) do
  begin
     while (Count(lootRing[ppp]) > 0) and not dead do
     begin
	      checklag(60000);
        FindType (lootRing[ppp],Backpack) ;
        MoveItem(FindItem,0,BagRing,0,0,0);
      wait(600);
     end;
  end;
  checklag(60000);
  UseObject(BagBrace); 
  wait(1000); 
  for  ppp:=0 to (GetArrayLength(lootBrace)-1) do
  begin
     while (Count(lootBrace[ppp]) > 0) and not dead do
     begin
	      checklag(60000);
        FindType (lootBrace[ppp],Backpack) ;
        MoveItem(FindItem,0,BagBrace,0,0,0);
      wait(600);
     end;
  end;  
end;
procedure checkweapon;  
begin
{
AddToSystemJournal('srtghtrr'+inttostr(GetLayer($400A6BD5 ))); 
equip_tool(Ring,RingLayer);
AddToSystemJournal('1');
equip_tool(Breastplate,TorsoLayer);
AddToSystemJournal('2');
equip_tool(Bracer,BraceLayer);
AddToSystemJournal('3');
equip_tool(Sandali,ShoesLayer);
AddToSystemJournal('4');
equip_tool(Cloak,CloakLayer);
//AddToSystemJournal('5');
equip_tool(Lokti,ArmsLayer);
//AddToSystemJournal('6');
equip_tool(perchatki,GlovesLayer);
//AddToSystemJournal('7');
equip_tool(legs,PantsLayer);
//AddToSystemJournal('8');
equip_tool(gorget,NeckLayer);
//AddToSystemJournal('9');
equip_tool(Helm,HatLayer);
//AddToSystemJournal('10'); }
//AddToSystemJournal('Shild');
equip_tool(Shild,LhandLayer);
//AddToSystemJournal('Weapon');
equip_tool(Weapon,RhandLayer);
//AddToSystemJournal('все');
     
end;
procedure Zagruzka_regov;// запасаемся реагентами
var
pppp:integer;
RegZag:array of word;
begin
RegZag:=[$0F7B ,$0F7A ,$0F86 ];
  checklag(60000);
  UseObject(bagAll); 
  wait(1000); 
    begin
     while (Count(clean_bandages) < 80) and not dead do
     begin
	      checklag(60000);
        FindType (clean_bandages,bagAll) ;  
        MoveItem(FindItem,100,Backpack,0,0,0);
      wait(600);
     end;
  end;     
  
   checklag(60000);
  UseObject(bugreagent); 
  wait(1000); 
   for  pppp:=0 to (GetArrayLength(RegZag)-1) do
   begin
     while (Count(RegZag[pppp]) < 20) and not dead do
     begin
	      checklag(60000);
        FindType (RegZag[pppp],bugreagent) ;  
        MoveItem(FindItem,20,Backpack,0,0,0);
      wait(600);
     end;
  end; 
end;
function targetzertva:cardinal;
var
//bad_list:array [0..400] of cardinal;
distance,mob:integer;
cur_mob:cardinal;                 
begin
distance := 9999999;
FindDistance:=FindDistanceMob;
    
    for mob:=0 to (GetArrayLength(monstro)-1) do 
        while FindType(monstro[mob],Ground) <> 0 do  
          begin
           AddToSystemJournal('function targetzertva '+inttohex(FindItem,8));
            if GetDistance(FindItem) < distance  then      
                begin
                distance := GetDistance(FindItem) ;
                cur_mob := FindItem;
            end;                
                Ignore(FindItem); 
          end;       
    IgnoreReset;           
 //AddToSystemJournal('Жертва: '+GetName(cur_mob)+'. координата Х: '+inttostr(GetX(cur_mob))+'. координата Y: '+inttostr(GetY(cur_mob))+'. дистанция: ' +inttostr(GetDistance(cur_mob)));     
//if (GetX(cur_mob) in [3686..3701]) and (GetY(cur_mob) in [2502..2521]) then cur_mob:= 0;
if (GetX(cur_mob)>3686) and (GetY(cur_mob)>2502) and (GetX(cur_mob)<3701) and (GetY(cur_mob)<2521) then cur_mob:=0; 
result:= cur_mob;    //получаем сериал ближнего моба
end;
 Procedure PutMoneyBank;
begin
  checklag(60000); 
  AddToSystemJournal('606 Заработал ГП : '+ inttostr(CountEx(goldcoin,$0000,backpack)));
  begin
     while (CountEx(goldcoin,$0000,backpack) > 0) and not dead do
     begin
       checklag(60000); 
       FindTypeEx (goldcoin,$0000,Backpack,True) ;
       checklag(60000); 
        MoveItem(FindItem,0,bankbox,0,0,0);
     wait(2000);
     end;
  end;
end; 
begin
IgnoreReset; 
AddToSystemJournal('Init');
init;
//tele(buttonSkelet);
while not dead do
if (Weight < (MaxWeight-50)) then
  begin //Бой в городе
    begin
      checkmobss:=0 ;
     // checkwar;
      TargetZ:=targetzertva;   
      checkweapon;     
      AddToSystemJournal('TargetZ = '+inttohex(TargetZ,8));
      if (Fight(TargetZ)>1) or (TargetZ=0) then
        begin      
            if dotResp=kolvodot-1 then dotResp:=0;
            //AddToSystemJournal('Точка: '+inttostr(dotResp)); 
              
            if (NewMoveXY(dot[dotResp].X,dot[dotResp].Y,true,1,true))= true then 
            dotResp:=dotResp+1
            else    
            begin
           // tele(buttonSkelet);     
            //dotResp:=0; 
            dotResp:=0;  
            NewMoveXY(dot[dotResp].X,dot[dotResp].Y,true,1,true);
            end;    
        end;
      for k:=0 to (GetArrayLength(bodymonstro)-1) do
        begin   
          FindDistance:=2;
          FindType(bodymonstro[k],Ground);  
          if (Findcount > 0) then  
          begin 
            telo:=finditem; //telo - ИД убитый монстр  
            checklag(60000);
            if NewMoveXY(GetX(telo),GetY(telo),true,1,true) = false then 
            //tele(buttonSkelet); 
            begin
           // tele(buttonSkelet);     
            dotResp:=0;  
            NewMoveXY(dot[dotResp].X,dot[dotResp].Y,true,1,true);
            end;  
             
            checklag(60000); 
            ctime := Now;
            UseObject(telo);  
            if WaitJournalLine(ctime,'not earn the right to loot this creature', 500) = false then
                begin  
                for hhh:=0 to (GetArrayLength(grabmas)-1)  do 
                  begin 
                  if  CountEx(grabmas[hhh],$FFFF,telo)>0 then
                      begin  
                        checklag(60000);
                        Grab(findItem,telo);   
                        wait(600); 
                      end;  
                  end ;
              end;
           ignore(telo); 
        end ;    
      end ;    
      
      end ; 
      end
      else
       begin //Рекол домой и разгрузка 
           {tele(buttonHome); 
      NewMoveXY(homeX,homeY,true,1,true);  
      Stock;
      Zagruzka_regov;
      tele(buttonSkelet);
      checkweapon; } 
      // SetARStatus(false);
      //Disconnect;     
      checklag(60000);
      NewMoveXY(3494,2571,true,1,true); 
      checklag(60000);
      uosay('bank');  
      wait(1000);  
      UseObject(bankbox); 
      PutMoneyBank;
      end;  
end.





