Сортировка итемов
Posted: 06.11.2006 2:12
И так, в кратце:
Проблема
Вы порубали пару десятков драконов, и слутили всё их барахло, в результате у вас весь подвал забит сумками с этим самым лутом, как рассортировать их содержимое по сумочках - реги к регам, драгоценные камни к драгоценным, бронижилеты патроны и оружие в сейф..
Решение
Предлагаю Вашему вниманию скрипт для сортировки итемов.
В его основе лежит простая человеческая слабость - ЛЕНЬ.
В том смысле что мне лень было сортировать итемы, а Вам - лень настраивать этот скрипт, поэтому никаких настроек не нужно, кроме как указать типы контейнеров - в которых будет производится автоматический поиск.
Подробнее
Расположите на полу около себя сумочки (типа a backpack) с содержимым - которое нужно рассортировать.
И теже сумочки - в которые нужно это всё добро фасовать.
Последние должны отвечать двум требованиям:
1. Покрашеные в какой-то цвет (отличный от нулевого цвета -$0000)
2. Внутри должны быть хотя бы по одному екземляру тех вещей, которые Вы хотели бы туда сбросить.
Особенности
Стыковку итемов обеспечил.
Если итемы немогут быть состикованы (количество в стопке больше 60000 или они не переносят состыковку) - то они ложаться друг на друга - как в песне
Вот вроде бы и всё. Должно работать
КСТАТИ.
Последний кусочек кода закоментирован - и оставлен для желающих поковыряться.
Я писал его - для того что бы навести порядок в цветных сумках (состыковать там всё что можно).
Вроде бы даже работает
насколько я помню...
Проблема
Вы порубали пару десятков драконов, и слутили всё их барахло, в результате у вас весь подвал забит сумками с этим самым лутом, как рассортировать их содержимое по сумочках - реги к регам, драгоценные камни к драгоценным, бронижилеты патроны и оружие в сейф..
Решение
Предлагаю Вашему вниманию скрипт для сортировки итемов.
В его основе лежит простая человеческая слабость - ЛЕНЬ.
В том смысле что мне лень было сортировать итемы, а Вам - лень настраивать этот скрипт, поэтому никаких настроек не нужно, кроме как указать типы контейнеров - в которых будет производится автоматический поиск.
Подробнее
Расположите на полу около себя сумочки (типа a backpack) с содержимым - которое нужно рассортировать.
И теже сумочки - в которые нужно это всё добро фасовать.
Последние должны отвечать двум требованиям:
1. Покрашеные в какой-то цвет (отличный от нулевого цвета -$0000)
2. Внутри должны быть хотя бы по одному екземляру тех вещей, которые Вы хотели бы туда сбросить.
Особенности
Стыковку итемов обеспечил.
Если итемы немогут быть состикованы (количество в стопке больше 60000 или они не переносят состыковку) - то они ложаться друг на друга - как в песне

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

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.
Последний кусочек кода закоментирован - и оставлен для желающих поковыряться.
Я писал его - для того что бы навести порядок в цветных сумках (состыковать там всё что можно).
Вроде бы даже работает
