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

Stealth 6

Archive messages
Post Reply
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Stealth 6

Post by Vizit0r »

для тестов и создания шаблонов скриптов нужны любители любых языков, кроме паскаля и C# (тут уже все написано). В частности, интересны грамотный питонщик, java и т.д.
Писать в личку, а лучше прямо в аську.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Stealth 6

Post by Vizit0r »

peis wrote:Также интересно будут ли нормально работать старые скрипты в новом стелсе
процентов так на 99. 1% я оставлю на то, что где-то я что-то не вспомню и изменю. Но надеюсь что не будет такого.

Вот с питоном сложнее, но это проблемы тех, кто хочет в нем писать скрипты. Захотят - напишут прослойку, типа той, что мы сделали для дельфей и c#. Пока питонщики молчат.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Stealth 6

Post by Vizit0r »

принимаю заявки на переписывание нескольких больших и сложных скриптов в новом формате на Delphi\c#, для демонстрации. Задача - чтобы использовалось как можно больше скриптовых возможностей. туда же прицеплю GUI и всякое такое.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Stealth 6

Post by drabadan »

Vizit0r wrote:принимаю заявки на переписывание нескольких больших и сложных скриптов в новом формате на Delphi\c#, для демонстрации. Задача - чтобы использовалось как можно больше скриптовых возможностей. туда же прицеплю GUI и всякое такое.
Ламбер\майнинг + крафт тулсов. Вроде как и не сложно, но потом можно будет "почерпнуть"!

Code: Select all

Program Mining_Bot_New_2; // -- V nazvanii "2" - eto nomer konfiga dlya bota.

const
RESP_WAITING_TIME_MINS = 5; // -- Prodolzjitelnost' ozjidaniya respa v minutah.
MY_MAX_WEIGHT = 200; // -- Maks ves pri kotorom vugryzka.
AVERAGE_LAG_MS = 1500; // -- Ne Trogat'.
BANK_ID = $400DBA9E; // -- Bank id personaja.
CURRENT_BOT = 2; // -- poryadkoviy nomer bota. 1, 2, 3.
{===========================================================================================================================}
{========CHAT SETUP================}
{MINING PART}
 M_nothing1 = 'is no metal'; 
 M_nothing2 = 'too far'; 
 M_nothing3 = 'mining in rock'; 
 M_nothing4 = 'cannot mine'; 
 M_nothing5 = 'no line'; 
 M_nothing6 = 'reach'; 
 M_fizzles1 = 'loosen some rocks'; 
 M_needwait = 'not to mine'; 
 M_success = 'in your pack.';
{LUMBER PART} 
 Msg1 = 'переместили'; 
 Msg2 = 'You put'; 
 Msg3 = 'hack'; 
 Msg4 = 'Target cannot be seen'; 
 Msg5 = 'There are no';
 Msg6 = 'not enough wood here to';
 Msg7 = 'use an axe on';
 Msg8 = 'That is too far away';
{====CHAT SETUP END=================}
 iTTileCount = 39;    
 iRadiusSearch = 30; // Радиус (не диаметр!) поиска деревьев в тайлах, относительно персонажа
 Logs = $1BDD;       // Тип логов
 Raw_Ore_Type = $19B8;
 Ingot_Type = $1BEF;
{END CONSTANTS}
{===========================================================================================================================}
type WayPoints = record
	x, y : Integer;
	end;

type TItemInfo = Record
	TypeOfItem : Cardinal;
	CategoryBtn, ItemBtn : Integer;
	end;
{===========================================================================================================================}	
{VARS}	
var
Hatchet, Pickaxe, Tinker_Tools, Carpentry_Tools : TItemInfo;
WayPoint : array[0..12] of WayPoints;
i, minret, Start_Mine, End_Mine, Bank_Tile_X, Bank_Tile_Y : Integer;
FoundTilesArray : TFoundTilesArray;
TempFoundTilesArray, ChopTilesArray : array of TFoundTile;
TreeTile:array [0..iTTileCount] of word;
ctime : TDateTime;
{END VARS}
{===========================================================================================================================}
{INITIATION SECTION}
procedure InitBotSystem;
	begin
		if (CURRENT_BOT = 1) then
			begin
				Start_Mine := 1;
				End_Mine := 3;
				Bank_Tile_X := 2512;
				Bank_Tile_Y := 548;
			end;
		if (CURRENT_BOT = 2) then
			begin
				Start_Mine := 4;
				End_Mine := 7;
				Bank_Tile_X := 2512;
				Bank_Tile_Y := 553;
			end;
		if (CURRENT_BOT = 3) then
			begin
				Start_Mine := 8;
				End_Mine := 9;
				Bank_Tile_X := 2512;
				Bank_Tile_Y := 559;
			end;
	end;
procedure InitTools;
	begin
		Hatchet.TypeOfItem := $0F43;
		Hatchet.CategoryBtn := 6;
		Hatchet.ItemBtn := 15;
		Pickaxe.TypeOfItem := $0E86;
		Pickaxe.CategoryBtn := 8;
		Pickaxe.ItemBtn := 57;
		Tinker_Tools.TypeOfItem := $1EB8;
		Tinker_Tools.CategoryBtn := 8;
		Tinker_Tools.ItemBtn := 25;
		Carpentry_Tools.TypeOfItem := $1034;
		Carpentry_Tools.CategoryBtn := 8;
		Carpentry_Tools.ItemBtn := 33;
	end;
	
  procedure InitWaypoints;
	begin
		WayPoint[0].x := Bank_Tile_X;
		WayPoint[0].y := Bank_Tile_Y;
	//______Minoc Bank__________//
		WayPoint[1].x := 2466;
		WayPoint[1].y := 556;
	//______Crafting Point______//	
		WayPoint[2].x := 2570;
		WayPoint[2].y := 477;    
		WayPoint[3].x := 2573;
		WayPoint[3].y := 477;
		WayPoint[4].x := 2575;
		WayPoint[4].y := 478;
		WayPoint[5].x := 2577;
		WayPoint[5].y := 480;
		WayPoint[6].x := 2573;
		WayPoint[6].y := 480;
		WayPoint[7].x := 2569;
		WayPoint[7].y := 480;
	    WayPoint[8].x := 2565;
		WayPoint[8].y := 485;
		WayPoint[9].x := 2565;
		WayPoint[9].y := 485;
		WayPoint[10].x := 2569;
		WayPoint[10].y := 486;
	//______Mining Points________//
		WayPoint[11].x := 2572;
		WayPoint[11].y := 475;
	//______Smelting Point______//
		WayPoint[12].x := 2435;
		WayPoint[12].y := 477;
	//_______Lumber Point________//
	end;
	

procedure InitTTilesArray;
  begin
   TreeTile[0]:=3274; 
   TreeTile[1]:=3275; 
   TreeTile[2]:=3277; 
   TreeTile[3]:=3280;

   TreeTile[4]:=3283; 
   TreeTile[5]:=3286; 
   TreeTile[6]:=3288; 
   TreeTile[7]:=3290;

   TreeTile[8]:=3293; 
   TreeTile[9]:=3296; 
   TreeTile[10]:=3299; 
   TreeTile[11]:=3302; 

   TreeTile[12]:=3320; 
   TreeTile[13]:=3323; 
   TreeTile[14]:=3326; 
   TreeTile[15]:=3329;

   TreeTile[16]:=3393;
   TreeTile[17]:=3394;
   TreeTile[18]:=3395;
   TreeTile[19]:=3396;

   TreeTile[20]:=3415;
   TreeTile[21]:=3416;
   TreeTile[22]:=3417;
   TreeTile[23]:=3418;

   TreeTile[24]:=3419;
   TreeTile[25]:=3438;
   TreeTile[26]:=3439;
   TreeTile[27]:=3440;

   TreeTile[28]:=3441;
   TreeTile[29]:=3442;
   TreeTile[30]:=3460;
   TreeTile[31]:=3461;

   TreeTile[32]:=3462;
   TreeTile[33]:=3476;
   TreeTile[34]:=3478;
   TreeTile[35]:=3480;

   TreeTile[36]:=3482;
   TreeTile[37]:=3484;
   TreeTile[38]:=3492;
   TreeTile[39]:=3496;
   
   SetArrayLength(ChopTilesArray, 1);
  end;
  
  // Поиск деревьев
procedure SearchTree;
  var
  i, j : Integer;
  iFoundTilesArrayCount : word;
  iTempFoundTilesArrayCount : Integer;
  
  begin 
    for i:= 0 to iTTileCount do
      begin
        iFoundTilesArrayCount := GetStaticTilesArray((GetX(Self) - iRadiusSearch), (GetY(Self) - iRadiusSearch), (GetX(Self) + iRadiusSearch), (GetY(Self) + iRadiusSearch), 1, TreeTile[i], FoundTilesArray);
        if iFoundTilesArrayCount > 0 then
          begin
            SetArrayLength(TempFoundTilesArray, Length(TempFoundTilesArray) + iFoundTilesArrayCount); 
            for j := 0 to iFoundTilesArrayCount - 1 do
              begin            
                TempFoundTilesArray[iTempFoundTilesArrayCount + j] := FoundTilesArray[j];
              end;
            iTempFoundTilesArrayCount := iTempFoundTilesArrayCount + iFoundTilesArrayCount;  
          end;
      end;
    //AddToSystemJournal('Найдено деревьев: ' + IntToStr(iTempFoundTilesArrayCount));     
  end;

// Чистим записи дубликаты (Vizit0r :P)
procedure ClearDuplicate;
  var
  i, j : Integer;  
  begin
    ChopTilesArray[Length(ChopTilesArray) - 1] := TempFoundTilesArray[0];
    for i:=1 to Length(TempFoundTilesArray) - 1 do
      begin
        for j:=0 to Length(ChopTilesArray) - 1 do
          if (ChopTilesArray[j] = TempFoundTilesArray[i]) then
            break;
        if j > Length(ChopTilesArray) - 1 then
          begin
            SetArrayLength(ChopTilesArray, Length(ChopTilesArray) + 1);
            ChopTilesArray[Length(ChopTilesArray) - 1] := TempFoundTilesArray[i];  
          end;
      end;
      //AddToSystemJournal('После отсеивания дубликатов, осталось деревьев:' + IntToStr(Length(ChopTilesArray)));  
  end;

// Возводим в степень 2 (Shinma)
function sqr(a:LongInt):LongInt;
  begin
    result:=a*a;
  end;

// Вычисляем длину вектора (Shinma)
function vector_length(c_2:TFoundTile):LongInt;
  begin
    result:=Round(sqrt(sqr(GetX(self)-c_2.X)+sqr(GetY(self)-c_2.Y)));
  end;

// «Быстрая сортировка» по длине вектора, от центра последней поляны ко всем собранным координатам деревьев    
procedure QuickSort(A: array of TFoundTile; l,r: integer);
  var
  i, j: Integer;
  x, y: TFoundTile;  
  begin
    i := l;
    j := r;
    x := A[((l + r) div 2)];
    repeat
      while vector_length(A[i]) < vector_length(x) do inc(i);
      while vector_length(x) < vector_length(A[j]) do dec(j);
      if not (i>j) then
        begin
          y:= A[i];
          A[i]:= A[j];
          A[j]:= y;
          inc(i);
          dec(j);
        end;
    until i>j;
    if l < j then QuickSort(ChopTilesArray, l,j);
    if i < r then QuickSort(ChopTilesArray, i,r);
  end;

// Находим, исключаем дубликаты, сортируем деревья
procedure MarkTrees;
	begin
	    NewMoveXY(WayPoint[12].x, WayPoint[12].y, true, 1, true);
        SearchTree;
        AddToSystemJournal('Trees found: ' + IntToStr(Length(TempFoundTilesArray)));
        ClearDuplicate;
		QuickSort(ChopTilesArray, 0, Length(ChopTilesArray) - 1);
	end;
  
 procedure WaitAverageLag(Lag : Integer);
	begin
		Wait(Lag);
		//UOSay(IntToStr(Lag));
	end;

function ItemMoved(PreviousWeight : Integer): Boolean;
	begin
		Result := False;
		if Weight <> PreviousWeight then Result := True;
	end;
	
procedure CallBank;
	begin
		WaitAverageLag(AVERAGE_LAG_MS);	
		UOSay('BANK');
		WaitAverageLag(AVERAGE_LAG_MS);
	end;
{INITIATION SECTION END}
{===========================================================================================================================}
{GATHERING SECTION}
function ToolCount(Tool, Container : Cardinal) : Integer;
	begin
		FindType(Tool, Container);
		Result := FindCount;
	end;

procedure LoadTools(Tool : Cardinal);
var tmpId : Cardinal;
	begin
		NewMoveXY(WayPoint[0].x, WayPoint[0].y, true, 0, true);
		WaitAverageLag(AVERAGE_LAG_MS);
		CallBank;
		WaitAverageLag(AVERAGE_LAG_MS);		
		tmpId := FindType($0E75, BANK_ID);
		UseObject(tmpId);
		WaitAverageLag(AVERAGE_LAG_MS);
		if FindType(Tool, tmpId) > 0 then 
			begin
				While ToolCount(Tool, backpack) < 5 do
					begin
						MoveItem(FindType(Tool, tmpId), 1, backpack, 0,0,0);
						Wait(1500);
					end;
			end;
		AddToSystemJournal('Zagruzil Tool');
	end;
	
procedure EquipTool(Tool : Cardinal);
var
xc, yc : Integer;
	begin
		if not ((GetType(ObjAtLayer(RhandLayer)) = Tool) or (GetType(ObjAtLayer(LhandLayer)) = Tool)) then
			begin
				if ToolCount(Tool, backpack) <= 3 then 
					begin
						xc := GetX(self);
						yc := GetY(self);
						WaitAverageLag(AVERAGE_LAG_MS);	
						LoadTools(Tool);
						WaitAverageLag(AVERAGE_LAG_MS);	
						NewMoveXY(xc, yc, true, 0, true);
					end;
				UseObject(FindType(Tool, backpack));
				WaitAverageLag(AVERAGE_LAG_MS*2);								
			end;
	end;
	
// Рубим дерево (Edred)
function LumbCurTree(tile,x,y,z : Integer) : Boolean; 
  // рубим указанный тайл. Возвращаем false если перевес или чар мертв. 
  var
  q, m1, m2, m3, m4, m5, m6, m7, m8, CountFizzle, NextTree : integer; 
  
  begin 
    Result := true; 
    CountFizzle := 0; 
    repeat 
      if WarMode = true then SetWarMode(false); 
      if TargetPresent then CancelTarget; 
      ctime := Now; 
      if Dead then begin Result := false; exit; end;
      EquipTool(Hatchet.TypeOfItem);
      //if IsGump then GumpHandling; 
      if not TargetPresent then UseObject(ObjAtLayerEx(LhandLayer,self));      	
      WaitForTarget(5000);
      //Guards; 
      If TargetPresent then TargetToTile(tile, x, y, z); 
      q := 0; 
      repeat 
        wait(100); 
        q := q + 1;         
        //CallGuards; 
        m1 := InJournalBetweenTimes(Msg1, ctime, Now); 
        m2 := InJournalBetweenTimes(Msg2, ctime, Now); 
        m3 := InJournalBetweenTimes(Msg3, ctime, Now); 
        m4 := InJournalBetweenTimes(Msg4, ctime, Now); 
        m5 := InJournalBetweenTimes(Msg5, ctime, Now);
        m6 := InJournalBetweenTimes(Msg6, ctime, Now);
        m7 := InJournalBetweenTimes(Msg7, ctime, Now); 
        m8 := InJournalBetweenTimes(Msg8, ctime, Now);  
      until (m1<>-1) or (m2<>-1) or (m3<>-1) or (m4<>-1) or (m5<>-1) or (m6<>-1) or (m7<>-1) or (m8<>-1) or Dead or (q > 50); 
      if (m2<>-1) or (m3<>-1) or (m4<>-1) then CountFizzle := CountFizzle + 1; 
      if Dead or (Weight > MY_MAX_WEIGHT) then begin Result := false; exit; end; 
      if (q > 200) then NextTree := NextTree + 1;
    until (m5<>-1) OR (m6<>-1) OR (m7<>-1) OR (m8<>-1) OR (CountFizzle = 10) OR (NextTree > 3);
    if NextTree >= 3 then NextTree := 0; 
  end;
  
 function MiningAround : Integer ;                  
   // копаем вокруг чара 
   // параметр - максимальный вес. 
   // возвращаем: 
   // 1 - вокруг чара все вскопано успешно 
   // 2 - превышен максимальный вес 
   // 3 - чар под атакой 
   // 4 - нет кирки 
   var il, k, r, x, y, xnk, ynk : Integer; 
   var xn, yn : Word;
   var mn1, mn2, mn3, mn4, mn5, mn6, mf1, mw1, ms1 : Integer; 
   var ctime : TDateTime;
   var TileInfo : TStaticCell;
   //var gi : TGumpInfo;
   begin 
      Result := 1; 
      //addtosystemjournal(inttostr(GetX(self)) + ' ' + inttostr(GetY(self)) + ': Начинаем обкопку. Вес чара: ' + inttostr(Weight)); 
      for x := -2 to 2 do 
      begin 
         for y := -2 to 2 do 
         begin 
            r := 0; 
            repeat					
               if TargetPresent then CancelTarget; 
               if WarMode = true then SetWarMode(false); 
               ctime := Now;  
			   EquipTool(Pickaxe.TypeOfItem);
			   while IsGump do
				begin
					CloseSimpleGump(GetGumpsCount-1);
					Wait(100);
				end;
               ///////////////////////////
               if not Dead then
                begin
                  xnk := GetX(self) + x;
                  ynk := GetY(self) + y;
                  xn := xnk;
                  yn := ynk;                                    
                  TileInfo := ReadStaticsXY(xn, yn, 0);
                  for il := 0 to TileInfo.StaticCount - 1 do                  
                    begin
                      //AddToSystemJournal(IntToStr(il));  
                      if (TileInfo.Statics[il].Tile >= 1339) and (TileInfo.Statics[il].Tile <= 1359) then 
                        begin
                          WaitTargetTile(TileInfo.Statics[il].Tile,TileInfo.Statics[il].x,TileInfo.Statics[il].y,TileInfo.Statics[il].z); 
                          UseObject(ObjAtLayer(RHandLayer));
                        end;
                    end;
                end;
               /////////////////////////// 
               k := 0; 
               repeat 
                  wait(10); 
                  k := k + 1;                   
                  mn1 := InJournalBetweenTimes(M_nothing1, ctime, Now); 
                  mn2 := InJournalBetweenTimes(M_nothing2, ctime, Now); 
                  mn3 := InJournalBetweenTimes(M_nothing3, ctime, Now); 
                  mn4 := InJournalBetweenTimes(M_nothing4, ctime, Now); 
                  mn5 := InJournalBetweenTimes(M_nothing5, ctime, Now); 
                  mn6 := InJournalBetweenTimes(M_nothing6, ctime, Now); 
                  mf1 := InJournalBetweenTimes(M_fizzles1, ctime, Now); 
                  ms1 := InJournalBetweenTimes(M_success, ctime, Now); 
               until (mn1<>-1) or (mn2<>-1) or (mn3<>-1) or (mn4<>-1) or (mn5<>-1) or (mn6<>-1) or (mf1<>-1) or (ms1<>-1) or Dead or (k > 200);
                  if InJournalBetweenTimes('heavy', ctime, Now) <> -1 then 
                    begin 
                      Result := 6 
                      exit; 
                    end; 
                  if Weight > MY_MAX_WEIGHT then 
                    begin 
                      Result := 2; 
                      exit; 
                    end; 
                  if (mf1<>-1) then 
                    begin 
                      r := r + 1; 
                      if r >= 10 then break 
                      else continue; 
                    end; 
               if (mw1<>-1) then wait(2000); 
            until (mn1<>-1) or (mn2<>-1) or (mn3<>-1) or (mn4<>-1) or (mn5<>-1) or (mn6<>-1); 
         end; 
      end; 
   end;
   
procedure Unload;
var k : Integer;
	begin		
		while FindTypeEx(Raw_Ore_Type, $0000, backpack, false) > 0 do
			begin
				NewMoveXY(WayPoint[1].x, WayPoint[1].y, true, 0, true);
				WaitAverageLag(AVERAGE_LAG_MS);	
				UseObject(FindItem);
				WaitAverageLag(AVERAGE_LAG_MS);	
			end;
		while FindType(Raw_Ore_Type, backpack) > 0 do
			begin
				NewMoveXY(WayPoint[0].x, WayPoint[0].y, true, 0, true);
				CallBank;
				WaitAverageLag(AVERAGE_LAG_MS*2);	
				for k := 0 to 5 do
					begin
						UseObject(FindType($097B, BANK_ID));
						WaitAverageLag(AVERAGE_LAG_MS);	
					end;
				MoveItems(backpack, Raw_Ore_Type, $FFFF, BANK_ID, 0,0,0, 1200);
			end;
		while FindType(Ingot_Type, backpack) > 0 do
			begin
				NewMoveXY(WayPoint[0].x, WayPoint[0].y, true, 0, true);
				CallBank;			
				MoveItems(backpack, Ingot_Type, $FFFF, BANK_ID, 0,0,0, 1200);
			end;
		while FindType(Logs, backpack) > 0 do
			begin
				NewMoveXY(WayPoint[0].x, WayPoint[0].y, true, 0, true);
				CallBank;
				MoveItems(backpack, Logs, $FFFF, BANK_ID, 0,0,0, 1200);
			end;		
	end;
	
procedure GetLogs;
	begin
		for i := 0 to Length(ChopTilesArray) - 1 do
			begin        
				NewMoveXY(ChopTilesArray[i].x, ChopTilesArray[i].y, true, 1, true);
				if not LumbCurTree(ChopTilesArray[i].tile, ChopTilesArray[i].x, ChopTilesArray[i].y, ChopTilesArray[i].z)
					or (GetQuantity(FindType(Logs, backpack)) > 80) then 
					begin
						Unload; 
						break;
					end;
			end;
	end;
{GATHERING SECTION END}	
{===========================================================================================================================}
{CRAFTING SECTION}	
procedure CraftTool(Tool : Cardinal; CategoryBtn, ItemBtn : Integer);
var
	gi : TGumpInfo;
		begin
			while IsGump do	CloseSimpleGump(GetGumpsCount-1); 
			WaitAverageLag(AVERAGE_LAG_MS);	
			Useobject(FindType(Tool, backpack));
			WaitAverageLag(AVERAGE_LAG_MS*2);	
			GetGumpInfo(GetGumpsCount-1, gi); 
			WaitAverageLag(AVERAGE_LAG_MS);	
			NumGumpButton(GetGumpsCount-1, gi.GumpButtons[CategoryBtn].return_value);
			WaitAverageLag(AVERAGE_LAG_MS*2);	       
			NumGumpButton(GetGumpsCount-1, gi.GumpButtons[ItemBtn].return_value); 
			WaitAverageLag(AVERAGE_LAG_MS*3);	
		end;

procedure LoadCraftResources;
	begin
		while GetQuantity(FindType(Logs, backpack)) < 100 do 
			begin
				CallBank;
				if GetQuantity(FindItem) > 100 then break;
				MoveItem(FindType(Logs, BANK_ID), 25, backpack, 0,0,0);
				WaitAverageLag(AVERAGE_LAG_MS);
			end;
		while GetQuantity(FindType(Ingot_Type, backpack)) < 100 do 
			begin
				CallBank;
				if GetQuantity(FindItem) > 100 then break;	
				MoveItem(FindType(Ingot_Type, BANK_ID), 25, backpack, 0,0,0);
				WaitAverageLag(AVERAGE_LAG_MS);
			end;
	end;
	
function Count(Tool, Container : Cardinal) : Integer;
var 
tmpInt : Integer;
	begin
		FindType(Tool, Container);
		tmpInt := FindCount;
		FindType(Tool, Backpack);
		Result := tmpInt + FindCount;
	end;
	
procedure ToolsCheck;
var 
tmpContainer : Cardinal;
PreviousWeight : Integer;
	begin
		NewMoveXY(WayPoint[0].x, WayPoint[0].y, true, 0, true);
		WaitAverageLag(AVERAGE_LAG_MS);
		CallBank;		
		tmpContainer := FindType($0E75, BANK_ID);
		UseObject(tmpContainer);
		WaitAverageLag(AVERAGE_LAG_MS);
		while GetQuantity(FindType(Logs, BANK_ID)) < 500 do GetLogs;			
		//UOSay(IntToStr(Count(Dig_Tool_Type, tmpContainer)));
		while Count(Pickaxe.TypeOfItem, tmpContainer) < 25 do
			begin
				LoadCraftResources;
				if FindType(Tinker_Tools.TypeOfItem, backpack) <= 0 then MoveItem(FindType(Tinker_Tools.TypeOfItem, tmpContainer), 1, backpack, 0,0,0);				
				CraftTool(Tinker_Tools.TypeOfItem, Pickaxe.CategoryBtn, Pickaxe.ItemBtn);
				WaitAverageLag(AVERAGE_LAG_MS*2);
			end;
		while Count(Hatchet.TypeOfItem, tmpContainer) < 15 do
			begin
				LoadCraftResources;
				if FindType(Carpentry_Tools.TypeOfItem, backpack) <= 0 then MoveItem(FindType(Carpentry_Tools.TypeOfItem, tmpContainer), 1, backpack, 0,0,0);
				CraftTool(Carpentry_Tools.TypeOfItem, Hatchet.CategoryBtn, Hatchet.ItemBtn);
				WaitAverageLag(AVERAGE_LAG_MS*2);
			end;
		while Count(Tinker_Tools.TypeOfItem, tmpContainer) < 8 do
			begin
				LoadCraftResources;
				if FindType(Tinker_Tools.TypeOfItem, backpack) <= 0 then MoveItem(FindType(Tinker_Tools.TypeOfItem, tmpContainer), 1, backpack, 0,0,0);
				CraftTool(Tinker_Tools.TypeOfItem, Tinker_Tools.CategoryBtn, Tinker_Tools.ItemBtn);
				WaitAverageLag(AVERAGE_LAG_MS*2);
			end;
		while Count(Carpentry_Tools.TypeOfItem, tmpContainer) < 8 do
			begin
				LoadCraftResources;
				if FindType(Tinker_Tools.TypeOfItem, backpack) <= 0 then MoveItem(FindType(Tinker_Tools.TypeOfItem, tmpContainer), 1, backpack, 0,0,0);
				CraftTool(Tinker_Tools.TypeOfItem, Carpentry_Tools.CategoryBtn, Carpentry_Tools.ItemBtn);
				WaitAverageLag(AVERAGE_LAG_MS*2);
			end;
		Unload;
		while FindType($FFFF, backpack) > 0 do
			begin
				PreviousWeight := Weight;
				MoveItem(FindItem, 0, tmpContainer, 0,0,0);
				WaitAverageLag(AVERAGE_LAG_MS);
				if not ItemMoved(PreviousWeight) then CallBank;
			end;
	end;
{CRAFTING SECTION END}
{===========================================================================================================================}
{WAITING SECTION}	
function getSkill(Skill : Integer) : String;
	begin
		if Skill = 0 then Result := 'Hiding';
		if Skill = 1 then Result := 'Detecting Hidden';
		if Skill = 2 then Result := 'Spirit Speak';
	end;
				
procedure WaitForResp;
var randomSkill : String;
var k, kn : Integer;
	begin
		Unload;
		WaitAverageLag(AVERAGE_LAG_MS);
		randomSkill := getSkill(Random(3));
		k := 0;
		kn := RESP_WAITING_TIME_MINS*10;
		repeat
			UseSkill(randomSkill);
			WaitAverageLag(AVERAGE_LAG_MS*4);
			k := k + 1;
		until (k > kn) or Dead;
	end;
{WAITING SECTION END}
{===========================================================================================================================}
{MAIN LOOP}	
begin
	InitBotSystem;
	InitTools;
	InitTTilesArray;		
	InitWaypoints;
	//CallBank;
	MarkTrees;	
	while not Dead do
		begin			
			for i := Start_Mine to End_Mine do
				begin
					ToolsCheck;
					NewMoveXY(WayPoint[i].x, WayPoint[i].y, true, 0, true);
					repeat
						minret := MiningAround;
						if minret = 2 then Unload;							
					until (minret = 2) or (minret = 1);
				end;
			WaitForResp;
		end;
end.
{MAIN LOOP END}

drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Stealth 6

Post by drabadan »

Vizit0r wrote:принимаю заявки на переписывание нескольких больших и сложных скриптов в новом формате на Delphi\c#, для демонстрации. Задача - чтобы использовалось как можно больше скриптовых возможностей. туда же прицеплю GUI и всякое такое.
Крафт скроллов с GUI.

Code: Select all

Program CraftScrollov;

const
RegChest = $4057AA11;
LoadRegAmount = 750;

type TReagentInfo = Record
	Name : String;
	TypeOfReagent : Cardinal;
	end;
  
type TItemInfo = Record
  Name : String;
  Tool, Container, TypeOfItem : Cardinal;
  CountOfReagent, QuantityOfReg, CraftGump, CategoryBtn, ItemBtn, SmeltBtn : Integer;
  Reg : array[0..9] of TReagentInfo;
  end;
  
var
Item : TItemInfo;
Food : array[0..4] of Cardinal;

CraftForm : TSTForm;
CraftButton : TSTButton;
CraftItemTField : TSTEdit;
CraftItemQuantityTField : TSTEdit;
CraftQuantityLabel : TSTLabel;
CraftItemNameLabel : TSTLabel;
CraftChoicesLabel : TSTLabel;
CraftChoiceDescriptionLabel : TSTLabel;
CounterLabel : TSTLabel;
HowManyLeftToDoLabel : TSTLabel;
RegLabel : array[0..9] of TSTLabel;
RegLabelChest : array[0..9] of TSTLabel;
CurrentSkillLevelLabel : TSTLabel;
StatisticsLabel : TSTLabel;
StatisticsLabelChest : TSTLabel;
UsesLeftLabel : TSTLabel;
TriesMade : TSTLabel;


procedure initFood;
	begin
		Food[0] := $09B7;
		Food[1] := $1608; 
		Food[2] := $09D0;
		Food[3] := $160A;
		Food[4] := $097B;   
	end;

procedure GetTItemInfo(Choice : String);
  begin   
	if (Choice = 'recall') then
      begin
        Item.Name := 'Recall cкролл';
        Item.Tool := $0FBF;
		Item.CountOfReagent := 4;
        Item.Container := $0E76;
        Item.TypeOfItem := $1F4C;
        Item.QuantityOfReg := 1;
        Item.CraftGump := 1044009;
        Item.CategoryBtn := 6;
        Item.ItemBtn := 30;        
        Item.Reg[0].TypeOfReagent := BM;
		Item.Reg[0].Name := 'Blood Moss';
		Item.Reg[1].TypeOfReagent := MR; 
		Item.Reg[1].Name := 'Mandrake Roots';
		Item.Reg[2].TypeOfReagent := BP;
		Item.Reg[2].Name := 'Black Pearls';
		Item.Reg[3].TypeOfReagent := $0EF3;
		Item.Reg[3].Name := 'Blank scroll';
	  end;
	if (Choice = 'gh') then
      begin
        Item.Name := 'GH cкролл';
        Item.Tool := $0FBF;
        Item.Container := $0E76;
        Item.TypeOfItem := $1F49;
        Item.QuantityOfReg := 1;
		Item.CountOfReagent := 5;
        Item.CraftGump := 1044009;
        Item.CategoryBtn := 6;
        Item.ItemBtn := 22;        
        Item.Reg[0].TypeOfReagent := SS; 
		Item.Reg[0].Name := 'Spider`s Silk';
		Item.Reg[1].TypeOfReagent := MR; 
		Item.Reg[1].Name := 'Mandrake Roots';
		Item.Reg[2].TypeOfReagent := GS;
		Item.Reg[2].Name := 'Ginsening';
		Item.Reg[3].TypeOfReagent := $0EF3;
		Item.Reg[3].Name := 'Blank scroll';
		Item.Reg[4].TypeOfReagent := GA;
		Item.Reg[4].Name := 'Garlic';
      end;
	if (Choice = 'reflect') then
      begin
        Item.Name := 'Reflect cкролл';
        Item.Tool := $0FBF;
		Item.CountOfReagent := 4;
        Item.Container := $0E76;
        Item.TypeOfItem := $1F50;
        Item.QuantityOfReg := 1;
        Item.CraftGump := 1044009;
        Item.CategoryBtn := 7;
        Item.ItemBtn := 20;        
        Item.Reg[0].TypeOfReagent := GA;
		Item.Reg[0].Name := 'Garlic';
		Item.Reg[1].TypeOfReagent := MR; 
		Item.Reg[1].Name := 'Mandrake Roots';
		Item.Reg[2].TypeOfReagent := SS; 
		Item.Reg[2].Name := 'Spider`s Silk';
		Item.Reg[3].TypeOfReagent := $0EF3;
		Item.Reg[3].Name := 'Blank scroll';
	  end;
	if (Choice = 'paralyze') then
      begin
        Item.Name := 'Paralyze cкролл';
        Item.Tool := $0FBF;
		Item.CountOfReagent := 4;
        Item.Container := $0E76;
        Item.TypeOfItem := $1F52;
        Item.QuantityOfReg := 1;
        Item.CraftGump := 1044009;
        Item.CategoryBtn := 7;
        Item.ItemBtn := 24;        
        Item.Reg[0].TypeOfReagent := GA;
		Item.Reg[0].Name := 'Garlic';
		Item.Reg[1].TypeOfReagent := MR; 
		Item.Reg[1].Name := 'Mandrake Roots';
		Item.Reg[2].TypeOfReagent := SS; 
		Item.Reg[2].Name := 'Spider`s Silk';
		Item.Reg[3].TypeOfReagent := $0EF3;
		Item.Reg[3].Name := 'Blank scroll';
	  end;
	if (Choice = 'efield') then
      begin
        Item.Name := 'EF cкролл';
        Item.Tool := $0FBF;
        Item.Container := $0E76;
        Item.TypeOfItem := $1F5E;
        Item.QuantityOfReg := 1;
		Item.CountOfReagent := 5;
        Item.CraftGump := 1044009;
        Item.CategoryBtn := 9;
        Item.ItemBtn := 14;        
        Item.Reg[0].TypeOfReagent := SS; 
		Item.Reg[0].Name := 'Spider`s Silk';
		Item.Reg[1].TypeOfReagent := MR; 
		Item.Reg[1].Name := 'Mandrake Roots';
		Item.Reg[2].TypeOfReagent := BP;
		Item.Reg[2].Name := 'Black Pearls';
		Item.Reg[3].TypeOfReagent := $0EF3;
		Item.Reg[3].Name := 'Blank scroll';
		Item.Reg[4].TypeOfReagent := SA;
		Item.Reg[4].Name := 'Sulfurous Ash';
      end;
end;
   
procedure GumpCheckAndSolve;
var
gi :TGumpInfo;
  begin    
    if IsGump then
      begin    
        GetGumpInfo(GetGumpsCount-1, gi);  
        if not (gi.XmfHTMLGumpColor[0].Cliloc_id = Item.CraftGump) then
          begin
            while IsGump do
              begin
                CloseSimpleGump(GetGumpsCount-1);
              end;
            if (FindType(Item.Tool, backpack) > 0) then UseObject(FindItem);
            Wait(1500);      
          end;
      end;
    if not IsGump then
      begin
         if (FindType(Item.Tool, backpack) > 0) then UseObject(FindItem);
         Wait(1000);                  
      end;
  end;
  
procedure CraftOneItem;
var
gi : TGumpInfo;
  begin
    GumpCheckAndSolve;        
    GetGumpInfo(GetGumpsCount-1, gi);  
    if (gi.XmfHTMLGumpColor[0].Cliloc_id = Item.CraftGump) then
      begin
        NumGumpButton(GetGumpsCount-1, gi.GumpButtons[Item.CategoryBtn].return_value);
        Wait(1500);       
        NumGumpButton(GetGumpsCount-1, gi.GumpButtons[Item.ItemBtn].return_value);        
      end;
  end;
  
procedure SmeltItem;
var
gi : TGumpInfo;
  begin
    GumpCheckAndSolve;	
    GetGumpInfo(GetGumpsCount-1, gi);  
    if (gi.XmfHTMLGumpColor[0].Cliloc_id = Item.CraftGump) then
      begin
        NumGumpButton(GetGumpsCount-1, gi.GumpButtons[Item.SmeltBtn].return_value);
        WaitForTarget(5000);
        if TargetPresent then TargetToObject(FindType(Item.TypeOfItem, backpack));
        Wait(1500);                
      end;
  end;
  
procedure LoadUnload;
var
tmpInt : Integer;
	begin
		GetTItemInfo(CraftItemTField.Text);
		UseObject(RegChest);
		Wait(1500);
		for tmpInt := 0 to (Item.CountOfReagent - 1) do
			begin				
				if GetQuantity(FindType(Item.Reg[tmpInt].TypeOfReagent, backpack)) < Item.QuantityOfReg then
					begin
						MoveItem(FindType(Item.Reg[tmpInt].TypeOfReagent, RegChest), (LoadRegAmount - GetQuantity(FindType(Item.Reg[tmpInt].TypeOfReagent, backpack))), backpack, 0,0,0);
						Wait(1500);
					end;
			end;
		if FindType(Item.TypeOfItem, backpack) > 0 then
			begin
				MoveItem(FindItem, 0, RegChest, 0,0,0);
				Wait(1500);
			end;
	end;
procedure Obed;
var 
im : Integer;
  begin
    for im := 0 to 4 do
      begin
        if (FindType(Food[im], backpack) > 0) then
          begin
            UseObject(FindItem);
            Wait(1500);
			exit;
          end;
      end;
  end;
  
function UsesLeft : Integer;
var
aa : TClilocRec;
  begin   
    aa := GetToolTipRec(FindType(Item.Tool, backpack));
    Result := (StrToInt(aa.Items[1].Params[0]));       
  end;
  
 function Counter : Integer;
	begin
		GetTItemInfo(CraftItemTField.Text);
		Result := GetQuantity(FindType(Item.TypeOfItem, backpack));
	end;

procedure B_Click(Sender : TObject);
var
tmpInt1, tmpInt2, tmpInt3, k, im : Integer;
ctime : TDateTime;
	begin
		GetTItemInfo(CraftItemTField.Text);
		Wait(1000);
		UOSay(Item.Name);
		im := 0;
		While FindType(Item.TypeOfItem, backpack) > 0 do
			begin
				MoveItem(FindItem, 0, RegChest, 0,0,0);
				Wait(1500);
			end;		
		while ((Counter + (GetQuantity(FindType(Item.TypeOfItem, RegChest)))) < StrToInt(CraftItemQuantityTField.Text)) do
			begin								
				for tmpInt1 := 0 to (Item.CountOfReagent - 1) do
					begin
						if (GetQuantity(FindType(Item.Reg[tmpInt1].TypeOfReagent, backpack)) <= Item.QuantityOfReg) then LoadUnload;
					end;
				if Mana < 20 then
					begin
						ctime := Now;
						while not (InJournalBetweenTimes('You enter', ctime, Now) <> -1) do
							begin
								UseSkill('Meditation');
								Wait(2500);
							end;
						repeat
							Wait(1500);
						until (Mana > 90);
					end;				
				Obed;
				im := im + 1;
				TriesMade.Caption := 'Tries Made: ' + IntToStr(im);
				CraftOneItem;
				k := 0;
				repeat
					k := k + 1;
					Wait(300);
				until IsGump or Dead or (k > 15);
				HowManyLeftToDoLabel.Caption := 'Left to do: ' + IntToStr(((StrToInt(CraftItemQuantityTField.Text))) - (Counter + (GetQuantity(FindType(Item.TypeOfItem, RegChest)))));
				for tmpInt2 := 0 to (Item.CountOfReagent - 1) do
					begin
						RegLabel[tmpInt2].Caption := Item.Reg[tmpInt2].Name + ': ' + IntToStr(GetQuantity(FindType(Item.Reg[tmpInt2].TypeOfReagent, backpack)));
					end;
				CurrentSkillLevelLabel.Caption := 'Current Skill Level: ' + FloatToStrF(GetSkillValue('Inscription'),ffFixed,12,1);
				CounterLabel.Caption := 'Total Items: ' + IntToStr(Counter + (GetQuantity(FindType(Item.TypeOfItem, RegChest))));
				for tmpInt3 := 0 to (Item.CountOfReagent - 1) do
					begin
						RegLabelChest[tmpInt3].Caption := Item.Reg[tmpInt3].Name + ': ' + IntToStr(GetQuantity(FindType(Item.Reg[tmpInt3].TypeOfReagent, RegChest)));
					end;						
				//UsesLeftLabel.Caption := 'Uses of tool left: ' + IntToStr(UsesLeft);
			end;
		Beep;
		AddToSystemJournal('Done!');
	end;
	
procedure FormClose(Sender: TObject; var Action : TCloseAction);    
    begin
       Action := caFree;
       raiseException(erCustomError, 'for example, script stop after form');
    end;
	
procedure init;
var i, k, im, ik : Integer;
	begin		
		CraftForm := TSTForm.Create;
		CraftForm.OnClose := @FormClose;
		CraftForm.Width := 380;       
		CraftForm.Height := 320;   
		CraftForm.Caption := 'Craft by Drabadanchik';
		CraftForm.Visible := True;
		
		CraftButton := TSTButton.Create(CraftForm);
		CraftButton.OnClick := @B_Click;
		CraftButton.Caption := 'Скрафтить!';
		CraftButton.Top := 55;
		
		CraftItemTField := TSTEdit.Create(CraftForm);
		CraftItemQuantityTField := TSTEdit.Create(CraftForm);
		CraftItemQuantityTField.Top := 30;
		
		CraftItemNameLabel := TSTLabel.Create(CraftForm);
		CraftItemNameLabel.Left := 125;
		CraftItemNameLabel.Caption := '<-- Напиши название итема!';		
		CraftQuantityLabel := TSTLabel.Create(CraftForm);
		CraftQuantityLabel.Left := 125; 
		CraftQuantityLabel.Top := 30;
		CraftQuantityLabel.Caption := '<-- Напиши сколько хочешь скрафтить!';
		CraftChoiceDescriptionLabel := TSTLabel.Create(CraftForm);
		CraftChoiceDescriptionLabel.Top := 65;
		CraftChoiceDescriptionLabel.Left := 95;
		CraftChoiceDescriptionLabel.Caption := 'Варианты крафта: reflect, recall, paralyze, efield, gh.';
		CraftChoicesLabel := TSTLabel.Create(CraftForm);
		CraftChoicesLabel.Top := 95;
		CraftChoicesLabel.Left := 55;
		CraftChoicesLabel.Caption := 'CURRENT STATISTICS:';
		CounterLabel := TSTLabel.Create(CraftForm);
		CounterLabel.Top := 115;
		CounterLabel.Left := 10;		
		HowManyLeftToDoLabel := TSTLabel.Create(CraftForm);
		HowManyLeftToDoLabel.Top := 135;
		HowManyLeftToDoLabel.Left := 10;		
		for i := 0 to 9 do
			begin
				k := k + 20;
				RegLabel[i] := TSTLabel.Create(CraftForm);
				RegLabel[i].Top := k + 165;
				RegLabel[i].Left := 10;				
			end;
		CurrentSkillLevelLabel := TSTLabel.Create(CraftForm);
		CurrentSkillLevelLabel.Top := 135;
		CurrentSkillLevelLabel.Left := 145;
		StatisticsLabel := TSTLabel.Create(CraftForm);
		StatisticsLabel.Top := 165;
		StatisticsLabel.Left := 10;
		StatisticsLabel.Caption := 'Reagents in Backpack:';		
		for im := 0 to 9 do
			begin
				ik := ik + 20;
				RegLabelChest[im] := TSTLabel.Create(CraftForm);
				RegLabelChest[im].Top := ik + 165;
				RegLabelChest[im].Left := 145;
			end;
		StatisticsLabelChest := TSTLabel.Create(CraftForm);
		StatisticsLabelChest.Top := 165;
		StatisticsLabelChest.Left := 145;
		StatisticsLabelChest.Caption := 'Reagetns in Chest: ';
		UsesLeftLabel := TSTLabel.Create(CraftForm);
		UsesLeftLabel.Top := 115;
		UsesLeftLabel.Left := 145;
		TriesMade := TSTLabel.Create(CraftForm);
		TriesMade.Top := 115;
		TriesMade.Left := 145;
	end;
	

	
begin
	initFood;
	init;	
	while True do Wait(1000);		
end.
	
		
		
		
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Stealth 6

Post by Vizit0r »

слабенький какой-то инскрипт, всего на пару скроллов.
Впрочем, пойдет.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Stealth 6

Post by drabadan »

Vizit0r wrote:слабенький какой-то инскрипт, всего на пару скроллов.
Впрочем, пойдет.
Заготовка же =).
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Stealth 6

Post by Vizit0r »

тестеры внешних скриптов и стелса в целом - со вторника можете писать в асю, буду беты давать на тесты.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
HeadShot1989
Neophyte
Neophyte
Posts: 13
Joined: 11.07.2013 6:04

Re: Stealth 6

Post by HeadShot1989 »

А где хотя бы пятый взять? Тут уже бета 6го тестируется, а 5ого нет нигде...
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Stealth 6

Post by Vizit0r »

5й получился несколько неудачный, поэтому перешли на 6й сразу :)
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Stealth 6

Post by Vizit0r »

По поводу тестов - к CFA, я уезжаю на пару месяцев. будет интернет, или нет - узнаю по месту.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Stealth 6

Post by Vizit0r »

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