Page 1 of 1

Сортировка итемов

Posted: 06.11.2006 2:12
by Dr.Assassin
И так, в кратце:

Проблема
Вы порубали пару десятков драконов, и слутили всё их барахло, в результате у вас весь подвал забит сумками с этим самым лутом, как рассортировать их содержимое по сумочках - реги к регам, драгоценные камни к драгоценным, бронижилеты патроны и оружие в сейф..

Решение
Предлагаю Вашему вниманию скрипт для сортировки итемов.
В его основе лежит простая человеческая слабость - ЛЕНЬ.
В том смысле что мне лень было сортировать итемы, а Вам - лень настраивать этот скрипт, поэтому никаких настроек не нужно, кроме как указать типы контейнеров - в которых будет производится автоматический поиск.

Подробнее
Расположите на полу около себя сумочки (типа a backpack) с содержимым - которое нужно рассортировать.
И теже сумочки - в которые нужно это всё добро фасовать.

Последние должны отвечать двум требованиям:

1. Покрашеные в какой-то цвет (отличный от нулевого цвета -$0000)
2. Внутри должны быть хотя бы по одному екземляру тех вещей, которые Вы хотели бы туда сбросить.

Особенности
Стыковку итемов обеспечил.
Если итемы немогут быть состикованы (количество в стопке больше 60000 или они не переносят состыковку) - то они ложаться друг на друга - как в песне :D

Вот вроде бы и всё. Должно работать :P

Code: Select all


Program Sort; 
Var
 BoxType: array[0..100]of cardinal;//типы всех контейнеров - в которых будем искать
 BoxTypeSize:integer;//размер масива BOXType

 BOX:     array[0..100]of cardinal;//сюда запишем найдинные ИДишки неколёровых контейнеров
 BoxSize:integer;//размер масива BOX

 BOXColor:array[0..100]of cardinal;//сюда запишем найденные ИДишки колёровых контейнеров
 BoxColorSize:integer;//размер масива BOXColor
 
 FOUNDED_ITEMS:array[0..65535]of cardinal;//save founded item Types
 FOUNDED_ITEMS_Size:integer;
 
 FindList,FindNOCOLORList : TStringList;
 i,j,k, zItem,zItemType,zColor:cardinal; zItemCount:integer;
        dItem,dItemType,dColor:cardinal; dItemCount:integer; //resort dublicate
        zX,zY,zZ:integer;
        dX,dY,dZ:integer; //resort dublicate
        
{$Include 'all.inc'} 

function Hex2Int( const Value : String) : Integer;
var I : Integer;
begin
  Result := 0;
  I := 1;
  if Value = '' then Exit;
  if Value[1] = '$' then I:=I+1;
  while I <= Length(Value) do
  begin
    if (Value[I]='0') or (Value[I]='1') or (Value[I]='2') or (Value[I]='3')
     or(Value[I]='4') or (Value[I]='5') or (Value[I]='6') or (Value[I]='7')
     or(Value[I]='8') or (Value[I]='9') then
       Result := (Result shl 4) or (Ord(Value[I]) - Ord('0'))
    else
    if (Value[I]='A')or(Value[I]='B')or(Value[I]='C')or(Value[I]='D')or(Value[I]='E')or(Value[I]='F') then
       Result := (Result shl 4) or (Ord(Value[I]) - Ord('A') + 10)
    else
    if (Value[I]='a')or(Value[I]='b')or(Value[I]='c')or(Value[I]='d')or(Value[I]='e')or(Value[I]='f') then
       Result := (Result shl 4) or (Ord(Value[I]) - Ord('a') + 10)
    else
      break;
    I:=I+1;
  end;
end;


function FoundAndGetIfNot(ItemName:string;ItemType,ItemCount:cardinal; RepeatForever:boolean):cardinal;
Var rez:cardinal;
begin
 rez:=0;
 AddToSystemJournal('searching '+ItemName);
 repeat
  rez:=Findtype(ItemType,backpack); //a heating stand
  if rez=0 then begin
     rez:=Findtype(ItemType,ground);
     Grab(rez,ItemCount);
     wait(2000);
     if RepeatForever then continue;
  end;
  wait(2000);   
 until (rez>0) or (not(RepeatForever));
 AddToSystemJournal('Found '+ItemName+' = '+intToHex(rez,1)); 
 result:=rez;
end;
 
procedure AddToBoxList(Box_ID,Box_Color:cardinal);
begin
 if (BOX_Color=0) then begin
     BOX[BoxSize]:=BOX_id;
     BoxSize:=BoxSize+1;
 end else begin
     BOXColor[BoxColorSize]:=BOX_id;
     BoxColorSize:=BoxColorSize+1; 
 end;
end;

function IS_NEW_FOUND_TYPE(ItemType:cardinal):boolean;
Var ii:cardinal;
    found:boolean;
begin
 //AddToSystemJournal('NEW TYPE ? = '+intToHex(ItemType,2));    
 found:=true;
 if FOUNDED_ITEMS_Size>0 then
 for ii:=0 to FOUNDED_ITEMS_Size-1 do begin
    if FOUNDED_ITEMS[ii]=ItemType then begin found:=false; break; end;
 end;
 result:=found;   
end; 

   
  
procedure Grab_From_NOT_COLORED_BOX(Item, ItemType:cardinal; ItemCount:integer; COLOR_Box, XX,YY,ZZ:cardinal);
Var jj,ii, zzItem,zzItemType,{zzColor,}zzCount:cardinal;
begin
   FOUNDED_ITEMS[FOUNDED_ITEMS_Size]:=ItemType;//add item Type to Data Base!! To prevent future search
   FOUNDED_ITEMS_Size:=FOUNDED_ITEMS_Size+1;
   AddToSystemJournal('TYPE = '+intToHex(ItemType,2)+' ColorBox='+intToHex(Color_Box,2)+' X='+intToStr(XX)+' Y='+intToStr(YY)+' Z='+intToStr(ZZ));    
   if BoxSize>0 then
   for jj:=0 to BoxSize-1 do begin
       FindNoCOLORList.Clear;
       FindtypeEx(ItemType,$FFFF,Box[jj],True);
       //AddToSystemJournal(intToStr(jj)+' [+] Box '+intToHex(Box[jj],2)+' TYPE='+intToHex(ItemType,2)); 
       if GetFindedList(FindNoCOLORList) then begin
           //AddToSystemJournal(' <<= '+intToHex(Box[jj],2)+' COUNT='+intToStr(FindNoCOLORList.Count)+' ==>');
           if FindNoCOLORList.Count>0 then
           for ii:=0 to FindNoCOLORList.Count-1 do begin
             zzItem:=Hex2Int(FindNoCOLORList.strings[ii]);
             zzCount:=GetQuantity(zzItem);
             zzItemType:=GetType(zzItem);
             ClickOnObject(zzItem);
             wait(500);
                //AddToSystemJournal(intToStr(ii)+'. [-] DRAG.... '+intToHex(zzItem,2)+' TYPE='+intToHex(zzItemType,2)+' COUNT='+intToStr(zzCount){+' NAME='+GetName(zzItem)});
             if //MoveItem(zzItem,zzCount,COLOR_Box,GetX(COLOR_Box),GetY(COLOR_Box),GetZ(COLOR_Box))
                DragItem(zzItem,zzCount) 
             then begin//БЕРУ ВСЁ!! :-D
                AddToSystemJournal(intToStr(ii)+'. [-] DRAG OK! '+intToHex(zzItem,2)+' TYPE='+intToHex(zzItemType,2)+' COUNT='+intToStr(zzCount){+' NAME='+GetName(zzItem)}); 
                wait(1000); 
                if ItemCount+zzCount<=60000 then begin//STACK:
                    if DropItem(Item,0,0,0) then begin wait(2000);
                    end else AddToSystemJournal(intToStr(jj)+'. [-] DROP ***ERROR*** ( boxSRC='+intToHex(Box[jj],2)+' boxDST='+intToHex(COLOR_Box,2)+' item='+intToHex(zzItem,2)+' TYPE='+intToHex(zzItemType,2)+' count='+intToStr(zzCount){+' Name='+GetName(zzItem)});
                end else begin //NOT STACK:
                    if DropItem(COLOR_Box,XX,YY,ZZ) then begin wait(2000);
                    end else AddToSystemJournal(intToStr(jj)+'. [-] DROP ***ERROR*** ( boxSRC='+intToHex(Box[jj],2)+' boxDST='+intToHex(COLOR_Box,2)+' item='+intToHex(zzItem,2)+' TYPE='+intToHex(zzItemType,2)+' count='+intToStr(zzCount){+' Name='+GetName(zzItem)});
                end;
                //if DropItem(COLOR_Box,XX,YY,ZZ) then begin
                //    wait(2000); 
                //end else AddToSystemJournal(intToStr(jj)+'. [-] DROP ***ERROR*** ( boxSRC='+intToHex(Box[jj],2)+' boxDST='+intToHex(COLOR_Box,2)+' item='+intToHex(zzItem,2)+' TYPE='+intToHex(zzItemType,2)+' count='+intToStr(zzCount){+' Name='+GetName(zzItem)});
             end else    AddToSystemJournal(intToStr(jj)+'. [-] DRAG ***ERROR*** ( boxSRC='+intToHex(Box[jj],2)+' boxDST='+intToHex(COLOR_Box,2)+' item='+intToHex(zzItem,2)+' TYPE='+intToHex(zzItemType,2)+' count='+intToStr(zzCount){+' Name='+GetName(zzItem)});
             
             //zzItemType:=GetType(zItem);
             //zzColor:=GetColor(zItem);
             //AddToSystemJournal(intTostr(i)+'.'+FindList.strings[i]+', color='+intToHex(zColor,2)+' name='+GetName(zItem));
           end;
       end; //else AddToSystemJournal(intToStr(jj)+'.[--------]'+intToHex(Box[jj],2));
     end;
end; 
 
 
Begin 
{==================================} 
 FindDistance:=2;
 BoxType[0]:=$0e75;
 BoxType[1]:=$0e79;
 BoxTypeSize:=2;
{==================================} 
 BoxSize:=0;
 BoxColorSize:=0; 
 FOUNDED_ITEMS_Size:=0;            
 ClearJournal; 
 SetARStatus(true); 
 FindList:=TStringList.create;
 FindNOCOLORList:=TStringList.create;
While not Dead do begin 
  If Connected then begin 
     //FindQuantity;
     //Grab(REGZ,FindQuantity); 
     //AddToSystemJournal('......'); 
     AddToSystemJournal('find items count='+intToStr(FindList.Count));
     if BoxTypeSize>0 then
     for j:=0 to BoxTypeSize-1 do begin
         Findtype(BoxType[j],ground);
         FindList.Clear;
         if GetFindedList(FindList) then begin
           if FindList.Count>0 then  
           for i:=0 to FindList.Count-1 do begin
             zItem:=Hex2Int(FindList.strings[i]);
             zColor:=GetColor(zItem);
             //AddToSystemJournal(intTostr(i)+'.'+FindList.strings[i]+', color='+intToHex(zColor,2));
             AddToBoxList(zItem,zColor);
           end;//for i
         end;//if GetFindedList
     end;//for j
  
     AddToSystemJournal('----COLOR----BOX''s----');
     if BoxColorSize>0 then      
     for i:=0 to BoxColorSize-1 do begin
        zItem:=GetDistance(BoxColor[i]);
        zColor:=GetColor(BoxColor[i]);
        //ClickOnObject(BoxColor[i]);
        UseObject(BoxColor[i]);
        //wait(2000);
        AddToSystemJournal(intTostr(i)+'.'+IntToHex(BoxColor[i],2) +' dist='+intToStr(zItem)+' Color='+inttoHex(zColor,2) +', '+GetName(BoxColor[i]));
     end;
         
     AddToSystemJournal('----other---BOX''s----');
     if BoxSize>0 then
     for i:=0 to BoxSize-1 do begin
        zItem:=GetDistance(Box[i]);
        zColor:=GetColor(Box[i]);
        //ClickOnObject(Box[i]);
        UseObject(Box[i]);
        //wait(2000);
        AddToSystemJournal(intTostr(i)+'.'+IntToHex(Box[i],2) +' dist='+intToStr(zItem)+' Color='+inttoHex(zColor,2) +', '+GetName(Box[i]));
     end;
     wait(5000);//slowly smoke ;-)
     //НАШЛИ ВСЕ КОНТЕЙНЕРЫ, ТЕПЕРЬ ПО ОЧЕРЕДИ БУДЕМ ИСКАТЬ ВСЕ ИТЕМЫ В БЕЗЦВЕТНЫХ КОНТЕЙНЕРАХ И СОРТИРОВАТЬ ИХ ПО ЦВЕТНЫХ
     //ТОЕСТЬ НАДА СМОТРЕТЬ В ЦВЕТНЫХ ЧТО ТАМ ЕСТЬ
     AddToSystemJournal('----MOVE IN COLOR BOX----');
     if BoxColorSize>0 then
     for j:=0 to BoxColorSize-1 do begin
       FindList.Clear;
       FindtypeEx($FFFF,$FFFF,BoxColor[j],True);
       if GetFindedList(FindList) then begin
           AddToSystemJournal(intToStr(j)+'.===BEGIN BOXColor==='+intToHex(BoxColor[j],2)+' COUNT='+intToStr(FindList.Count));
           if FindList.Count>0 then
           for i:=0 to FindList.Count-1 do begin         
             zItem:=Hex2Int(FindList.strings[i]);
             zItemType:=GetType(zItem);
             zColor:=GetColor(zItem);
             zItemCount:=GetQuantity(zItem);
             if IS_NEW_FOUND_TYPE(zItemType)//search item Type only one raz
             then begin Grab_From_NOT_COLORED_BOX(zItem, zItemType, zItemCount, BoxColor[j],GetX(zItem),GetY(zItem),GetZ(zItem));//Not stack
                         //else if zItemCount>1 then Grab_From_NOT_COLORED_BOX(zItemType,zItem,GetX(zItem),GetY(zItem),GetZ(zItem));//FOR Stack
                  end;
             //AddToSystemJournal(intTostr(i)+'.'+FindList.strings[i]+', color='+intToHex(zColor,2)+' name='+GetName(zItem));
           end;
       end else AddToSystemJournal(intToStr(j)+'.===END BOXColor==='+intToHex(BoxColor[j],2));
     end;
       
    (* AddToSystemJournal('----SORT ITEMs IN COLOR BOX----');
     for j:=0 to BoxColorSize-1 do begin
       FindList.Clear;
       FOUNDED_ITEMS_Size:=0;
       FindtypeEx($FFFF,$FFFF,BoxColor[j],True);
       if GetFindedList(FindList) then begin
           AddToSystemJournal(intToStr(j)+'.===BEGIN BOXColor==='+intToHex(BoxColor[j],2)+' COUNT='+intToStr(FindList.Count));
           for i:=0 to FindList.Count-1 do begin         
             zItem:=Hex2Int(FindList.strings[i]);
             zItemType:=GetType(zItem);
             zColor:=GetColor(zItem);
             zItemCount:=GetQuantity(zItem);
             zX:=GetX(zItem);
             zY:=GetY(zItem);
             zZ:=GetZ(zItem);
             if IS_NEW_FOUND_TYPE(zItemType) then begin
               FOUNDED_ITEMS[FOUNDED_ITEMS_Size]:=zItemType;//add item Type to Data Base!! To prevent future search
               FOUNDED_ITEMS_Size:=FOUNDED_ITEMS_Size+1;
             end else continue;
             if (zX<45) or (zX>142) or (zY<70) or (zY>127) then begin
                if DragItem(zItem,zItemCount) then begin
                  wait(1000);
                  if DropItem(BoxColor[j],100,100,0) then begin
                      wait(2000);
                  end else AddToSystemJournal(intToStr(j)+'. DROP ***ERROR*** ( boxcol='+intToHex(BoxColor[j],2)+' item='+intToHex(zItem,2)+' TYPE='+intToHex(zItemType,2)+' count='+intToStr(zItemCount){+' Name='+GetName(zzItem)});
                end else   AddToSystemJournal(intToStr(j)+'. DRAG ***ERROR*** ( boxCol='+intToHex(BoxColor[j],2)+' item='+intToHex(zItem,2)+' TYPE='+intToHex(zItemType,2)+' count='+intToStr(zItemCount){+' Name='+GetName(zzItem)});
             end
             zX:=GetX(zItem);
             zY:=GetY(zItem);
             zZ:=GetZ(zItem);//NEED FUTURE CHECK FOR NORMAL COORDINATES ???!

             FindNOCOLORList.Clear;
             FindtypeEx(zItemType,$FFFF,BoxColor[j],True);
             if GetFindedList(FindNOCOLORList) then begin
                for k:=0 to FindNOCOLORList.Count-1 do begin
                   dItem:=Hex2Int(FindNOCOLORList.strings[k]);
                   dItemType:=GetType(zItem);
                   dColor:=GetColor(zItem);
                   dItemCount:=GetQuantity(zItem);
                   if dItem=zItem {same item} then continue else
                   begin 
                        if DragItem(dItem,dItemCount) then begin
                           wait(1000);
                           if dItemCount+zItemCount<=60000 then begin//STACK:
                            if DropItem(zItem,0,0,0) then begin wait(2000);
                            end else AddToSystemJournal(intToStr(j)+'. DROP ***ERROR*** ( boxcol='+intToHex(BoxColor[j],2)+' item='+intToHex(dItem,2)+' TYPE='+intToHex(dItemType,2)+' count='+intToStr(dItemCount){+' Name='+GetName(zzItem)});
                           end else begin //NOT STACK:
                            if DropItem(BoxColor[j],zX,zY,zZ) then begin wait(2000);
                            end else AddToSystemJournal(intToStr(j)+'. DROP ***ERROR*** ( boxcol='+intToHex(BoxColor[j],2)+' item='+intToHex(dItem,2)+' TYPE='+intToHex(dItemType,2)+' count='+intToStr(dItemCount){+' Name='+GetName(zzItem)});
                           end;
                        end else   AddToSystemJournal(intToStr(j)+'. DRAG ***ERROR*** ( boxCol='+intToHex(BoxColor[j],2)+' item='+intToHex(dItem,2)+' TYPE='+intToHex(dItemType,2)+' count='+intToStr(dItemCount){+' Name='+GetName(zzItem)});
                     
                   end;                   
                end;
             end;
           end;
       end else AddToSystemJournal(intToStr(j)+'.===END BOXColor==='+intToHex(BoxColor[j],2));
     end;
     *)
     exit;
    wait(1000);
  end else waitconnection(3000);{ждём кода будем в онлайне}
end;    

End.

КСТАТИ.
Последний кусочек кода закоментирован - и оставлен для желающих поковыряться.
Я писал его - для того что бы навести порядок в цветных сумках (состыковать там всё что можно).
Вроде бы даже работает :roll: насколько я помню...

P.S.

Posted: 06.11.2006 2:19
by Dr.Assassin
Begin
{==================================}
FindDistance:=2;
BoxType[0]:=$0e75;
BoxType[1]:=$0e79;
BoxTypeSize:=2;
{==================================}

вот в этот масив: BoxType - как раз и нужно вносить изменения, или додавать новые записи (если вы используете ещё какие-то сумочки или сундуки, одним словом контейнеры, отличные от a backpack)
Незабывайте верно прописать размер масива BoxType (который вы заполните типами контейнеров) - в переменную BoxTypeSize .
:wink: