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

Переплавка руды в инготы drw

тут можно задать вопрос по скриптингу
Post Reply
alpi
Novice
Novice
Posts: 51
Joined: 02.07.2009 17:37
Contact:

Переплавка руды в инготы drw

Post by alpi »

В качестве наглядного пособия для новичка постарался показать работу с предметами - перемещение, использование, а так же - логику циклов.
Что делает скрипт: ищет руду в указанной сумке, перетаскивает в бэкпак по несколько штук (в зависимости от цвета руды - настраивается перетаскивание разного количества),
сразу плавит и кладет инготы в другую сумку. Попутно считает количество переплавленных и сгоревших инготов каждого цвета.
Можно запустить как отдельный макрос, продвинутые юзеры стелса могут использовать как внешнюю процедуру например при разгрузке шахтера (если у них еще такого нет :))
Спасибо nepopus за готовую инфу по типам/цветам/именам руды и ингот.
Критика и предложения по усовершенствованию приветствуются :)

Code: Select all

Program Pereplavka_by_alpi;

const 
  mainBag = $4047DD76;  // Главная сумка. Если сумка с рудой в бекпаке чара - поставить backpack
  oreBag = $4002747C;    // Исходная сумка с рудой
  IngotBag = $4047DD76;  // Сумка куда складываются инготы
  
  oreLow = 10;   // по сколько штук плавить руду до верита
  oreMid = 3;   // по сколько штук плавить руду от верита до обсида
  oreHig = 1;   // по сколько штук плавить руду выше обсида
  
  worldmessage = 'World is saving now...';
  hungrymessage = 'You are starving';
  messagetimer = (0.05/(24*60));
  Food = $09BB;   

type toreinfo = record
  name: string;
  oreColor: word;
  ingotColor: word;
  ingotType: word;
end;

var
  oreInfo: array of toreinfo;
  oreType: array of word;
  tmpingot, tmpcount,tmpfizzle,tmpdrop : integer;
  i,k,j : byte;
  tmpid : cardinal;

Procedure CheckState;
  begin 
    if InJournalBetweenTimes(worldmessage,now-2*messagetimer,now) > 0 then begin AddToSystemJournal('Сохранение мира. Ждем 60 секунд'); wait(60000); end;
     if InJournalBetweenTimes(hungrymessage,now-messagetimer,now) > 0 then 
      begin 
       wait(500); 
        FindType(Food,backpack);
         if findcount > 0 then begin UseObject(finditem); AddToSystemJournal('Перекус. Осталось еды в паке: '+IntToStr(GetQuantity(FindType(Food,backpack)))+' шт'); end
         else AddToSystemJournal('Не найдена еда! Положите еду в пак!'); 
      end;
  end;  
  
begin

 UseObject(MainBag);
 wait(1000);
 UseObject(oreBag);
 wait(1000);

  setlength(oreInfo, 30);
  oreInfo[0].name :=       'Iron';
  oreInfo[0].oreColor :=    $0000;
  oreInfo[0].ingotColor :=  $0000;
  oreInfo[0].ingotType :=   $1BEF;
  ////////////
  oreInfo[1].name :=       'Rusty';
  oreInfo[1].oreColor :=    $0750;
  oreInfo[1].ingotColor :=  $0750;
  oreInfo[1].ingotType :=   $1BEF;
  ////////////
  oreInfo[2].name :=       'Old Copper';
  oreInfo[2].oreColor :=    $0590;
  oreInfo[2].ingotColor :=  $0590;
  oreInfo[2].ingotType :=   $1BEF;
  ////////////
  oreInfo[3].name :=       'Dull Copper';
  oreInfo[3].oreColor :=    $060A;
  oreInfo[3].ingotColor :=  $060A;
  oreInfo[3].ingotType :=   $1BEF;
  ////////////
  oreInfo[4].name :=       'Copper';
  oreInfo[4].oreColor :=    $0088;
  oreInfo[4].ingotColor :=  $0000;
  oreInfo[4].ingotType :=   $1BE3;
  ////////////
  oreInfo[5].name :=       'Bronze';
  oreInfo[5].oreColor :=    $0488;
  oreInfo[5].ingotColor :=  $0488;
  oreInfo[5].ingotType :=   $1BEF;
  ////////////
  oreInfo[6].name :=       'Silver';
  oreInfo[6].oreColor :=    $0482;
  oreInfo[6].ingotColor :=  $0000;
  oreInfo[6].ingotType :=   $1BF5;
  ////////////
  oreInfo[7].name :=       'Gold';
  oreInfo[7].oreColor :=    $0032;
  oreInfo[7].ingotColor :=  $0000;
  oreInfo[7].ingotType :=   $1BE9;
  ////////////
  oreInfo[8].name :=       'Shadow';
  oreInfo[8].oreColor :=    $096B;
  oreInfo[8].ingotColor :=  $096B;
  oreInfo[8].ingotType :=   $1BEF;
  ////////////
  oreInfo[9].name :=       'Rose';
  oreInfo[9].oreColor :=    $0014;
  oreInfo[9].ingotColor :=  $0014;
  oreInfo[9].ingotType :=   $1BEF;
  ////////////
  oreInfo[10].name :=      'Agapite';
  oreInfo[10].oreColor :=   $0193;
  oreInfo[10].ingotColor := $0193;
  oreInfo[10].ingotType :=  $1BEF;
  ////////////
  oreInfo[11].name :=      'Blood rock';
  oreInfo[11].oreColor :=   $04C2;
  oreInfo[11].ingotColor := $04C2;
  oreInfo[11].ingotType :=  $1BEF;
  ////////////
  oreInfo[12].name :=      'Verite';
  oreInfo[12].oreColor :=   $07D5;
  oreInfo[12].ingotColor := $07D5;
  oreInfo[12].ingotType :=  $1BEF;
  ////////////
  oreInfo[13].name :=      'Valorite';
  oreInfo[13].oreColor :=   $00CE;
  oreInfo[13].ingotColor := $00CE;
  oreInfo[13].ingotType :=  $1BEF;
  ////////////
  oreInfo[14].name :=      'Mitheril';
  oreInfo[14].oreColor :=   $052D;
  oreInfo[14].ingotColor := $052D;
  oreInfo[14].ingotType :=  $1BEF;
  ////////////
  oreInfo[15].name :=      'Black Rock';
  oreInfo[15].oreColor :=   $0455;
  oreInfo[15].ingotColor := $0455;
  oreInfo[15].ingotType :=  $1BEF;
  ////////////
  oreInfo[16].name :=      'Obsidian';
  oreInfo[16].oreColor :=   $0028;
  oreInfo[16].ingotColor := $0028;
  oreInfo[16].ingotType :=  $1BEF;
  ////////////
  oreInfo[17].name :=      'Plutonium';
  oreInfo[17].oreColor :=   $08AF;
  oreInfo[17].ingotColor := $08AF;
  oreInfo[17].ingotType :=  $1BEF;
  ////////////
  oreInfo[18].name :=      'Dragon';
  oreInfo[18].oreColor :=   $0085;
  oreInfo[18].ingotColor := $0085;
  oreInfo[18].ingotType :=  $1BEF;
  ////////////
  oreInfo[19].name :=      'Crystaline';
  oreInfo[19].oreColor :=   $09A4;
  oreInfo[19].ingotColor := $09A4;
  oreInfo[19].ingotType :=  $1BEF;
  ///////////
  oreInfo[20].name :=      'Krynite';
  oreInfo[20].oreColor :=   $010F;
  oreInfo[20].ingotColor := $010F;
  oreInfo[20].ingotType :=  $1BEF;
  ////////////
  oreInfo[21].name :=      'Vulcan';
  oreInfo[21].oreColor :=   $09DA;
  oreInfo[21].ingotColor := $09DA;
  oreInfo[21].ingotType :=  $1BEF;
  ////////////
  oreInfo[22].name :=      'Sand Rock';
  oreInfo[22].oreColor :=   $008F;
  oreInfo[22].ingotColor := $008F;
  oreInfo[22].ingotType :=  $1BEF;
  ////////////
  oreInfo[23].name :=      'Blood Crest';
  oreInfo[23].oreColor :=   $09EC;
  oreInfo[23].ingotColor := $09EC;
  oreInfo[23].ingotType :=  $1BEF;
  ////////////
  oreInfo[24].name :=      'Steel';
  oreInfo[24].oreColor :=   $09D3;
  oreInfo[24].ingotColor := $09D3;
  oreInfo[24].ingotType :=  $1BEF;
  ////////////
  oreInfo[25].name :=      'Elvin';
  oreInfo[25].oreColor :=   $09E6;
  oreInfo[25].ingotColor := $09E6;
  oreInfo[25].ingotType :=  $1BEF;
  ////////////
  oreInfo[26].name :=      'Gorgan';
  oreInfo[26].oreColor :=   $09F0;
  oreInfo[26].ingotColor := $09F0;
  oreInfo[26].ingotType :=  $1BEF;
  ////////////
  oreInfo[27].name :=      'Acid';
  oreInfo[27].oreColor :=   $09B9;
  oreInfo[27].ingotColor := $09B9;
  oreInfo[27].ingotType :=  $1BEF;
  ////////////
  oreInfo[28].name :=      'Aqua';
  oreInfo[28].oreColor :=   $0060;
  oreInfo[28].ingotColor := $0060;
  oreInfo[28].ingotType :=  $1BEF;
  ////////////
  oreInfo[29].name :=      'Eldar';
  oreInfo[29].oreColor :=   $0BA7;
  oreInfo[29].ingotColor := $0BA7;
  oreInfo[29].ingotType :=  $1BEF;

  setlength(oreType, 4);
  oreType[3] := $19B7;     //Руда 1шт.
  oreType[2] := $19BA;     //Руда 2шт.
  oreType[1] := $19B8;     //Руда 3шт.
  oreType[0] := $19B9;     //Руда 4шт.
  
  for i := 0 to 29 do                                                                                          // начинаем перебирать цвет руды от айрона до эльдара
    begin                                                                                                     
	  CheckState;                                                                                              // проверка на ворлдсейв
	  tmpingot := CountEx(oreInfo[i].ingotType,oreInfo[i].ingotColor,IngotBag);                                // запоминаем количество готовых инготов текущего цвета
	  if tmpingot > 0 then AddToSystemJournal(oreInfo[i].name+' в сундуке: '+IntToStr(tmpingot)'ингот.');      // выводим сообщение
	  
	  tmpid := FindTypeEx(oreType[0],oreInfo[i].oreColor,oreBag,false);                                        ////////////////////
	  if tmpid = 0 then tmpid := FindTypeEx(oreType[1],oreInfo[i].oreColor,oreBag,false);                      //
	  if tmpid = 0 then tmpid := FindTypeEx(oreType[2],oreInfo[i].oreColor,oreBag,false);                      // Проверяем, есть ли руда нужного типа в паке.
	  if tmpid = 0 then tmpid := FindTypeEx(oreType[3],oreInfo[i].oreColor,oreBag,false);                      //
	  tmpcount := findquantity;                                                                                // Запоминаем количество руды этого типа
	
      if tmpid <> 0 then                                                                                     // Если нашли руду - начинаем плавить
	  
		begin                                                                                                
		
		  AddToSystemJournal(oreInfo[i].name+': Плавлю руду *'+IntToStr(tmpcount)'*');                         // Выводим сообщения
		  
		    if i < 12 then tmpdrop := oreLow                                                                   /////////////////////
		    else if (i >= 12) and (i < 16) then tmpdrop := oreMid                                              // Настраиваем количество переносимой в пак за один раз руды для разных цветов 
		    else if i >= 16 then tmpdrop := oreHig;                                                            //
			
		    for k := 1 to tmpcount/tmpdrop +1 do                                                               // Задаем количество итераций, необходимых для переноса руды одного цвета
			
		      begin                        
			  
			    for j := 0 to 3 do                                                                             // Перебираем руду по типу: 4 в стопке, 3-2-1 в стопке.
			      begin
				    CheckState;                                                                                // Проверка на ворлдсейв
			        FindTypeEx(oreType[j],oreInfo[i].oreColor,oreBag,false);                                   // Ищем руду нужного цвета в паке для руды
				    wait(500);                                                                                 // Задержка 0,5с минимум 
		            if findcount > 0 then moveitem(finditem,tmpdrop,backpack,0,0,0);                           // Если найдена руда нужного типа - перемещаем ее в пак
				  end;
				  
			    for j := 0  to 3 do                                                                            // Снова перебираем руду по типу
				
			      repeat                                                                                       // * начало цикла плавки
				  
				    CheckState;                                                                                // Проверка на ворлдсейв
				    wait(100);
					
		            if CountEx(oreType[j],oreInfo[i].oreColor,backpack) > 0 then                               // Проверяем, найден ли нужный тип руды
				      UseType(oreType[j],oreInfo[i].oreColor);                                                 // Если да - плавим руду в бэкпаке
					  
				    FindTypeEx(oreInfo[i].ingotType,oreInfo[i].ingotColor,backpack,false);                     // Ищем готовые инготы в бэкпаке
		            if findquantity > 0 then                                                     
					  begin 
					    wait(500); 
						moveitem(finditem,9999,IngotBag,0,0,0);                                                // если найдены - перемещаем инготы в сумку для инготов
					  end;
					  
				  until FindTypeEx(oreType[j],oreInfo[i].oreColor,backpack,false) = 0;				           // * выход из цикла когда переплавили инготы (руды нет в паке)
				  
			  end;
			  
		    tmpfizzle := tmpcount + tmpingot - CountEx(oreInfo[i].ingotType,oreInfo[i].ingotColor,IngotBag);   // небольшая калькуляция для подсчета количества сгоревших инготов
	        AddToSystemJournal('Добавлено: '+IntToStr(tmpcount-tmpfizzle)+' ингот. Сгорело : '+IntToStr(tmpfizzle)+' шт.');
			
		end else AddToSystemJournal(oreInfo[i].name+': руда не найдена ');
  	  wait(500); 
	end;
    wait(500);
end.
just student
nepopus
Novice
Novice
Posts: 121
Joined: 29.02.2012 23:45
Location: Москва
Contact:

Re: Переплавка руды в инготы drw

Post by nepopus »

alpi wrote: oreLow = 10; // по сколько штук плавить руду до верита
oreMid = 3; // по сколько штук плавить руду от верита до обсида
oreHig = 1; // по сколько штук плавить руду выше обсида
Только заметил.
Высшую руду действительно нужно плавить по 1?
Я сразу по кучке плавлю = )
Слышал только что нужно плавить в демоне и сытым.
<( o_O<) <( O_O )> (>O_o )>
alpi
Novice
Novice
Posts: 51
Joined: 02.07.2009 17:37
Contact:

Re: Переплавка руды в инготы drw

Post by alpi »

честно говоря, на 100% не уверен :)
Помню на аопе еще играл так плавили, чтоб меньше сгорало, вот и сделал на всякий случай)
если кучка физланет - сразу несколько едениц руды сгорает. а так одна :roll:
Да и константы есть, кому как милее - пусть тот так и качает. Меня одна-две лишние минуты не напрягают :)
а за инфу что сытым нужно быть спасибо, не знал.
just student
Post Reply