Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

DRW Lumber Без гвард зоны (outside guard zone) V 1.0

Only working scripts
shinma
Expert
Expert
Posts: 505
Joined: 28.04.2011 12:05

DRW Lumber Без гвард зоны (outside guard zone) V 1.0

Post by shinma »

Скрипт может рубить в любой зоне игры при условии, что у вас хайд 80+ иначе вы просто умрете от Энтов. Скрипт прошел обкату. Работал без сбоев 12 часов. поэтому смело можно сказать, что он работает. но без хозяина лучше не оставлять больше чем на 3 часа. энты все таки умудряются убить чара, а я не могу найти выход. Если только вы не станете жертвой Гма переодетого в энта. Все данные которые вам нужно изменить под себя находятся в константах (Const) Это на пару строк ниже.

Code: Select all

Program Lumber_all;

{$Include 'all.inc'}


const
 Procent=90; //процент. При достижении ХП ниже этого процента скрипт начинает спасать чара.
 speed=700;   //скорость перемещения
 hatcher=$0F47 ; // тип топора
 logs=$1BDD; // тип логов
 Eat=$0C77   ;                //ID еды
 mesto_sell='64';             //Номер кнопки в рунбуке куда телепортироваться для продажи
 mesto_bank='73';             //Номер кнопки в рунбуке банка
 Les='88';                  //Номер кнопки в рунбуке куда телепортироваться для рубки леса
 runebook=$88888888 ;       //ID рунбуки
 kol_log = 21; 
 money=$88888888;          //ID сумки в банке куда складывать золото
 resi=$88888888 ;         //ID сумки в банке куда складывать дорогие логи
 goldcoin=$0EED;         //ГП
 clean_bandages = $0E21;//бинты 
 Vendor=$88888888;     //ID  вендора которому впариваем логи

 l_fizzles='You hack at the tree for a while, but fail to produce any useable wood.';
 l_nothing1='There are no logs here to chop.';
 l_nothing2='You can''t reach this.';
 l_needwait ='You must wait to perform another action';
 l_success = 'in your pack.';
 l_bad ='Unexpected target info';
 l_heavy ='at your feet';
 l_far='That is too far away.';
 l_elemental ='Ent';
 l_see='You have no line of sight to that location';
 
type
 region= record
  minX:word;
  minY:word;
  maxX:word;
  maxY:word;
 end;
 mas_cvet = array[1..kol_log] of Integer; //Создаем массив цветов дров
  
var
 tfta,temp,res_arr:TFoundTilesArray;
 RegArr: array [0..10] of region;
 TreeTile:array [0..9] of word;
 rs,i,j,k,sum,arr_sum:word;
 start_p: TFoundTile;
 Cvet : mas_cvet;
 

procedure init;
begin
 start_p.X:=GetX(Self); //Стартовая координата игрока
 start_p.Y:=GetY(Self); //Стартовая координата игрока
 //Tile Tree
 TreeTile[0]:=3283;
 TreeTile[1]:=3277;
 TreeTile[2]:=3293;
 TreeTile[3]:=3296;
 TreeTile[4]:=3302;
 TreeTile[5]:=3299;
 TreeTile[6]:=3290;
 TreeTile[7]:=3288;
 TreeTile[8]:=3286;
 TreeTile[9]:=3280;
 //Рубить в области +/- 30 клеток от Стартовой координаты игрока
 RegArr[0].minX:=start_p.X-30;
 RegArr[0].minY:=start_p.Y-30;
 RegArr[0].maxX:=start_p.X+30;
 RegArr[0].maxY:=start_p.Y+30;
end;


procedure cancel;
begin
CloseMenu;
CancelMenu; 
If TargetPresent Then CancelTarget; 
end;

procedure Wait_Target(time_ms:Cardinal);
var
 TempTime,SumTime:Cardinal;
begin
 SumTime:=0;
 repeat
  checksave;
  wait(500);
  TempTime:=Timer;
  SumTime:=SumTime+(Timer-TempTime);
 until ((targetpresent) or (dead) or (not connected) or (SumTime>time_ms));
end;


Procedure speedee(swm:word;srm:word;swu:word;sru:word);
begin
  SetWalkMountTimer   (swm);  //Ходить на лошади
  SetRunMountTimer  (srm);    //Бегать на лошади

  SetWalkUnmountTimer   (swu);   //Ходить пешком
  SetRunUnmountTimer    (sru);   //Бегать пешком
end;


procedure check_war;
begin
if IsWarMode(self) then
 begin
  setWarMode(false);
 end;
end;


procedure check_hide;
begin
cancel;
wait(1000)  ;
if Hidden then exit;
if WarMode = true then SetWarMode(false);
      repeat
         UseSkill('Hiding');
         wait(4000);
         checksave;
      until Hidden or (not Connected);
end; 


Procedure sos;
var
proc, max_HP, hp: word; //one - кол-во жизней в 1%. proc-кол во жизней при 70%.
begin
max_hp:= getmaxhp(self);
hp:= gethp(self);
proc:=(max_HP div 100)*Procent;
	if proc > hp then
		begin	
			WinExec('E:\Program files\aimp3\AIMP3.exe', 0);	//у меня стоит 3 аимп с музыкой в плейлисте. при запуске аимпа он сразу начинает играть. Эту строку можно и закоментрировать.
			speedee(400,300,500,400);
			check_hide;
			newmovexy(GetX(Self)+30,GetY(Self)+30,true,1,false);
			check_hide;
				while gethp(self) < getmaxhp(self) do
				begin		
					check_hide;
					UseObject(FindType(clean_bandages,Backpack));
					wait_target(2000);
					WaitTargetObject(Self); 
				wait (5000);		
				end;			
			speedee(speed,speed,speed,speed);	
		end;
end;


function sqr(a:LongInt):LongInt;
begin
 result:=a*a;
end;


function vector_length(c_1,c_2:TFoundTile):LongInt;
begin
 result:=Round(sqrt(sqr(c_1.X-c_2.X)+sqr(c_1.Y-c_2.Y)));
end;


{ сортировка минимальным маршрутом }
procedure QuickSort(var item:TFoundTilesArray; count:integer; point:TFoundTile);
var
 temp_index,temp_value, tempo,i,j:LongInt;
 t_c:TFoundTile;
begin
 AddToSystemJournal('сортируем '+IntToStr(count)+' деревьев');
 //for i:=0 to count-1 do AddToSystemJournal(IntToStr(vector_length(start_p,item[i])));
 t_c:=point;
 temp_index:=0;
 temp_value:=vector_length(t_c,item[temp_index]);
 for i:=0 to count-2 do
 begin
  for j:=i to count-1 do
   begin
    tempo:=vector_length(t_c,item[j]);
    if tempo<temp_value then
     begin
      temp_index:=j;
      temp_value:=tempo;
     end;
   end;
   t_c:=item[temp_index];
   item[temp_index]:=item[i];
   item[i]:=t_c;
   temp_value:=vector_length(item[i],item[i+1]);
 end;
 AddToSystemJournal('Готово...');
end; { конец  сортировки }


procedure equip_tool(type_of_tool:word;layer:Byte);
begin
   if (GetType(ObjAtLayer(layer))<>type_of_tool) then
    begin
     if layer=RhandLayer then unequip(RhandLayer)else unequip(LhandLayer);
     wait(500);
     if layer=RhandLayer then equipt(RhandLayer,type_of_tool) else equipt(LhandLayer,type_of_tool);
    end;
  repeat
    wait(500);
    checksave;
   until (GetType(ObjAtLayer(layer))=type_of_tool);
end;


procedure Chop(f_tile:TFoundTile);
var
 ctime : TDateTime;
 iter_max:integer;
 next_lumb,lumb_result,wait_lumb: string;
 fizzles:word;
begin
 wait_lumb:=l_fizzles+'|'+l_needwait;
 next_lumb:=l_nothing1+'|'+l_nothing2+'|'+l_far+'|'+l_see;;
 lumb_result:=wait_lumb+'|'+next_lumb+'|'+l_success+'|'+l_elemental+'|'+l_bad+'|'+l_heavy;
 fizzles:=0;
 repeat
  equip_tool(hatcher,LhandLayer);
  cancel;
  iter_max:=0;
  sos;
  check_hide;
  UseObject(ObjAtLayer(LhandLayer));
  check_hide;
  sos;
  Wait_Target(5000);
  ctime := Now;
  TargetToTile(f_tile.Tile,f_tile.X,f_tile.Y,f_tile.Z);
  sos;
  repeat
   iter_max:=iter_max+1;
   wait(2000);
   checksave;
   check_war;
   check_hide;
   sos;
  until  ((InJournalBetweenTimes(lumb_result, ctime, Now)<>-1) or (iter_max>10));
  if (InJournalBetweenTimes(l_fizzles, ctime, Now)<>-1) then fizzles:=fizzles+1;
  if (InJournalBetweenTimes('OOPS !!! It isn''t a tree, it''s an Ent!!!|is attacking you|Vas Corp Por|notice', ctime, Now)<>-1) then
   begin
        sos;
	PlayWav('C:\WINDOWS\Media\tada.wav');
	sos;
	check_hide;
    wait(1000);
    sos;
    alarm;
   end;
   sos;
 until ((InJournalBetweenTimes(next_lumb, ctime, Now)<>-1) or (fizzles>15));
end;

 
procedure eda(eat:word); //еда
begin
  UseType(eat,$0000);
  wait(300);
  UseType(eat,$0000);
  wait(300);
  UseType(eat,$0000);
  wait(300);
end;
 
 
procedure tele(kuda:string);
begin
checksave;
waitgump(kuda);
wait(1000)  ;
checksave;
UseObject(runebook);
checksave;
wait(6000);
end;


procedure Cvet_log;
begin
Cvet[1] := $047C; //Oak Logs 	
Cvet[2] := $0279; //Red Tree Logs 	
Cvet[3] := $096B ; //Dark Tree Logs	
Cvet[4] := $0237; //Swamp Logs 
Cvet[5] := $0482; //Silver Leaf Logs
Cvet[6] := $010F; //Keranit Logs 
Cvet[7] := $0014; //Perit Logs 
Cvet[8] := $03C1; //Petrified Logs
Cvet[9] := $0085; //Dragon Tree Logs
Cvet[10] := $04C2; //Vampire Tree Logs
Cvet[11] := $0033; //Eridan Logs 
Cvet[12] := $002B; //Hellios Logs 
Cvet[13] := $0071; //Illusions Tree Logs
Cvet[14] := $09A4; //Crystal Logs 
Cvet[15] := $0B82; //Dead Tree Logs 
Cvet[16] := $00BE ; //Paradise Logs


Cvet[17] := $0035; //Titan Tree Logs 
Cvet[18] := $0BB6; //Avalon Logs 		
Cvet[19] := $0487; //Elven Logs
Cvet[20] := $0498; //Asterxylon Logs 	
Cvet[21] := $0000; //Logs 
end;
 
 
procedure podhod;
begin
AddToSystemJournal('Продацец: '+GetName(Vendor)+'. координата Х: '+inttostr(GetX(Vendor))+'. координата Y: '+inttostr(GetY(Vendor))+'. дистанция: ' +inttostr(GetDistance(Vendor)));
NewMoveXY(GetX(Vendor),GetY(Vendor),true,1,false); 
repeat
wait(2000);
checksave;
until GetDistance(Vendor)< 3
end;


procedure vendor_sell;
var
i:word;
begin
i:=0;
SetAutoSellDelay(7);		//Установить задержку на продажу. Время задается в секундах. По умолчанию - 3 (минимальное значение).
AutoSell(logs,Cvet[1],999);  
AutoSell(logs,Cvet[2],999);
AutoSell(logs,Cvet[3],999);
AutoSell(logs,Cvet[4],999);
AutoSell(logs,Cvet[8],999);
AutoSell(logs,Cvet[5],999);
AutoSell(logs,Cvet[6],999);
AutoSell(logs,Cvet[7],999);
AutoSell(logs,Cvet[8],999);
AutoSell(logs,Cvet[9],999);
AutoSell(logs,Cvet[10],999);
AutoSell(logs,Cvet[11],999);
AutoSell(logs,Cvet[12],999);
AutoSell(logs,Cvet[13],999);
AutoSell(logs,Cvet[14],999);
AutoSell(logs,Cvet[15],999);
AutoSell(logs,Cvet[16],999);
AutoSell(logs,Cvet[21],999);
while CountEx(GoldCoin,$0000,backpack) = 0 do
begin
checksave;
UOSay(GetName(Vendor)+'sell guards');				//произнести в игре фразу 'Sell'
wait(10000);
end;
end;


Procedure PutMoneyBank;
begin
  checksave;
  AddToSystemJournal('Заработал ГП : '+ inttostr(CountEx(GoldCoin,$0000,backpack)));
  begin
     while CountEx(GoldCoin,$0000,backpack) > 0 do
     begin
       FindTypeEx (GoldCoin,$0000,Backpack,True) ;
        MoveItem(FindItem,0,money,0,0,0);
      checksave;
      wait(2000);
     end;
  end;
end; 


Procedure PutLogBank;
var
i:word;
begin
  checksave;
  begin
  For i:=17 to 20 do
     if CountEx(logs,Cvet[i],backpack) > 0 then
     begin
       FindTypeEx (logs,Cvet[i],Backpack,True) ;
        MoveItem(FindItem,0,resi,0,0,0);
        wait(2000);
      checksave;
     end;
  end;
end; 



Begin
tele(Les);
check_hide
 SetArStatus(true);
speedee(speed,speed,speed,speed);
sos;
 init;
 sum:=0;
 // поиск деревьев и составление массива
  arr_sum:=0;
   for i:=0 to 9 do
    begin
     rs:=GetStaticTilesArray(RegArr[j].minX,RegArr[j].minY,RegArr[j].maxX,RegArr[j].maxY,1,TreeTile[i],tfta);
     if rs>0 then
      for k:=0 to rs-1 do temp[arr_sum+k]:=tfta[k];
     arr_sum:=arr_sum+rs;
    end;
   QuickSort(temp,arr_sum,start_p);
   for k:=0 to arr_sum-1 do res_arr[sum+k]:=temp[k];
   sum:=sum+arr_sum;
 // рубка по составленному массиву
 check_hide;
 sos;
 while not dead do
 begin
  i:=0;
  j:=sum-1;
  sos;
  eda(eat);
  sos;	
  while (i<j) do
   begin
     ClearBadLocationList;
     sos;
     eda(eat);
     sos;
     cancel;
     NewMoveXY(res_arr[i].X,res_arr[i].Y,true,1,false);
     sos;
     cancel;
     check_hide;
     sos;
     chop(res_arr[i]);
    i:=i+1;
    if Weight>=300 then
     begin
          check_hide;
          checksave;
	  tele(mesto_sell);
	  check_hide;
	  checksave;
	  Cvet_log;
      checksave;
      podhod;
      checksave;
      vendor_sell;
      wait(3000);
          checksave;
	  tele(mesto_bank);
	  checksave;
	  wait(5000);
	  checksave;
	  uosay('bank guards');
	  wait(3000);
	  PutMoneyBank;
      wait(3000);
      Cvet_log;
      wait(3000);
      PutLogBank;
      wait(3000);
      tele(Les);
      wait(3000);		
     end;
    end;
  end;
End. 
Last edited by shinma on 09.05.2011 7:35, edited 11 times in total.
shinma
Expert
Expert
Posts: 505
Joined: 28.04.2011 12:05

Post by shinma »

скрипт переделал. теперь он может спасаться от ентов. опять же при условии хайд +80.
shinma
Expert
Expert
Posts: 505
Joined: 28.04.2011 12:05

Post by shinma »

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

procedure check_hide;
begin
wait(1000) ;
if Hidden then exit;
if WarMode = true then SetWarMode(false);
repeat
UseSkill('Hiding');
wait(2000);
checksave;
until Hidden or (not Connected);

wait(1000) ;
if Hidden then exit;
if WarMode = true then SetWarMode(false);
repeat
UseSkill('Hiding');
wait(2000);
checksave;
until Hidden or (not Connected);

end;
grundick
Developer
Developer
Posts: 272
Joined: 31.01.2008 21:16

Post by grundick »

А может он просто расхайдился?
Я ,кстати, проверял хайд и в циклах самой рубки(копки). Если чар расхайдивался, прекращал рубить(копать) и снова в хайд отправлял...
shinma
Expert
Expert
Posts: 505
Joined: 28.04.2011 12:05

Post by shinma »

check_hide;
UseObject(ObjAtLayer(LhandLayer));
check_hide;
sos;
Wait_Target(5000);
ctime := Now;
TargetToTile(f_tile.Tile,f_tile.X,f_tile.Y,f_tile.Z);
check_hide;


мой рубит тут. Научи как можно исправить. У меня вроде везде уже проверки понатыканы.
grundick
Developer
Developer
Posts: 272
Joined: 31.01.2008 21:16

Post by grundick »

Ну основное то время висит тут

Code: Select all

repeat 
   iter_max:=iter_max+1; 
   wait(1000); 
   checksave; 
   check_war; 
   sos; 
  until  ((InJournalBetweenTimes(lumb_result, ctime, Now)<>-1) or (iter_max>10));
И, кстати, после этого цикла проверяются две строки . l_fizzles и OOPS!!!..., а в рипит цикле то они не проверяются. И выходить из него не будет...
shinma
Expert
Expert
Posts: 505
Joined: 28.04.2011 12:05

Post by shinma »

спасибо сделал так но чар уже вторую минуту стоит рубит без хайда

repeat
iter_max:=iter_max+1;
wait(1000);
checksave;
check_war;
check_hide;
sos;
until ((InJournalBetweenTimes(lumb_result, ctime, Now)<>-1) or (iter_max>10));
grundick
Developer
Developer
Posts: 272
Joined: 31.01.2008 21:16

Post by grundick »

В журнале чё нибудь пишет? 2000 нормальная задержка для хайда? Стелс видит, что чар в хайде ?
shinma
Expert
Expert
Posts: 505
Joined: 28.04.2011 12:05

Post by shinma »

хмм попробую увеличить задержку. но не думаю что она тут причина. стелс ничего не пишет. он рубит и рубит
shinma
Expert
Expert
Posts: 505
Joined: 28.04.2011 12:05

Post by shinma »

скрипт работает больше дорабатывать не буду.
shinma
Expert
Expert
Posts: 505
Joined: 28.04.2011 12:05

Post by shinma »

опять мой мозг кипит. при рубке появляется моб - энт и начинает меня атачить и иногда я не успеваю уйти в хайд и он убивает чара. посоветуйте что можно придумать? ради интереса попросил одетого чара убить то дерево на 10 минуте их боя я понял что мне дровосеку в бой с деревом вообще вступить нереально. и незнаю что в код написать.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

ивент на появление нпц.
в ивентобработчике проверять, если это энт - сваливать быстро и далеко, и подальше. можно попутно орать в асю, или в игре сигнализировать - по желанию...
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
grundick
Developer
Developer
Posts: 272
Joined: 31.01.2008 21:16

Post by grundick »

А ели всё -таки убили, бежать ресаться и снова рубить ))
shinma
Expert
Expert
Posts: 505
Joined: 28.04.2011 12:05

Post by shinma »

хмм я тоже уже думаю проще наверно 10 точек в рунбуке сделать и бегать от энта потом телепорт в другую точку т.к. оно по пол часа может шарится , а может через минуту исчезнуть.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

дальнейшие действия - это уже на твое усмотрение.
но основа для моментального детекта энта - именно такая.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Post Reply