Page 4 of 7

Re: Autolumber - ламбер с автопоиском деревьев

Posted: 13.11.2013 19:58
by drabadan
Daden wrote:А подскажите пожалуйста как сюда добор топоров из контейнера прикрутить?
та лигко! БЕРИ ТАПОР РУБИ ХАРДКОР!!!

Re: Autolumber - ламбер с автопоиском деревьев

Posted: 26.11.2013 16:30
by Flucky
Выдает вот это:

Code: Select all

17:47:52:885 [Nick]: Compiling
17:47:52:922 [Nick]: Compiled succesfully
17:47:52:924 [Nick]: Out Of Range at 29.155
17:47:52:925 [Nick]: Script LUMBER!.sc stopped successfuly
Чтобы это могло значить?

Re: Autolumber - ламбер с автопоиском деревьев

Posted: 27.11.2013 0:52
by drabadan
ошибка в одном из массивов, может чегото добавлял или удалял...

Re: Autolumber - ламбер с автопоиском деревьев

Posted: 28.11.2013 15:31
by Vizit0r
Flucky wrote:Выдает вот это:

Code: Select all

17:47:52:885 [Nick]: Compiling
17:47:52:922 [Nick]: Compiled succesfully
17:47:52:924 [Nick]: Out Of Range at 29.155
17:47:52:925 [Nick]: Script LUMBER!.sc stopped successfuly
Чтобы это могло значить?
это могло бы значить, что надо использовать последнюю версию стелса, чтобы показывало нормально место ошибки.

Re: Autolumber - ламбер с автопоиском деревьев

Posted: 31.12.2013 14:05
by Panzer
Я наверное чайник, но подскажите пожалуйста.

14:28:41:649 [Panzer]: Include\uses file - 'all.inc' - not found!
14:28:41:658 [Panzer]: Script AutoLumber_SW.sc stopped successfuly

Я так понимаю, что не могу найти в скрипте где надо указать поиск или считывание из фаила координаты деревьев или что? :shock: :?:

Re: Autolumber - ламбер с автопоиском деревьев

Posted: 31.12.2013 15:38
by drabadan
Panzer wrote:Я наверное чайник, но подскажите пожалуйста.

14:28:41:649 [Panzer]: Include\uses file - 'all.inc' - not found!
14:28:41:658 [Panzer]: Script AutoLumber_SW.sc stopped successfuly

Я так понимаю, что не могу найти в скрипте где надо указать поиск или считывание из фаила координаты деревьев или что? :shock: :?:
не правильно понимаешь!
А чего б тебе там вообще искать?

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

Ищем на форуме, что такое инклюды для стелса, читаем о них и все в миг станет ясно.
Увы, хотелось бы помочь побольше - но как только начал вдумываться сколько всего тебе надо написать и объяснить по данной теме - решил отправить в поиск! Оно все очень доступно написано и очень много, так шта не ленимся - а читаем... Если оно тебе, конечно, надо!

Re: Autolumber - ламбер с автопоиском деревьев

Posted: 04.01.2014 5:41
by Lavion
Люди в чем может быть проблема. Набирает максимальный вес, подходит к сундуку, открывает его и логи не выкидывает а перемещает их по бэкпаку?

Re: Autolumber - ламбер с автопоиском деревьев

Posted: 04.01.2014 10:55
by drabadan
Lavion wrote:Люди в чем может быть проблема. Набирает максимальный вес, подходит к сундуку, открывает его и логи не выкидывает а перемещает их по бэкпаку?
Id сундука не правильный

Re: Autolumber - ламбер с автопоиском деревьев

Posted: 04.01.2014 14:31
by nah nah
drabadan wrote:Id сундука не правильный
Lavion wrote:подходит к сундуку, открывает его

Re: Autolumber - ламбер с автопоиском деревьев

Posted: 04.01.2014 15:49
by Gauhar
Возможно проблема где-то здесь:

Code: Select all

repeat 
   tmpstack := FindtypeEx(Logs,tmpcolor,Sunduk,False); 
   if GetQuantity(tmpstack) >= 65000 then Ignore(tmpstack); 
until (tmpstack = 0) OR (GetQuantity(tmpstack) < 65000);
Если пытаться бросить 100 бревен в кучу в которой 64999 бервен, то ничего не выйдет, так как размер кучи не может быть больше 65000, и, соответственно, нужно уточнить какой на шарде максимальный размер кучи.
Если проблема в вышеуказанном куске скрипта, то можно попробовать исправить так:

Code: Select all

repeat 
   tmpstack := FindTypeEx(Logs,tmpcolor,Sunduk,False); 
   if (GetQuantity(tmpstack) + GetQuantity(tmpid)) > 65000 then Ignore(tmpstack); 
until (tmpstack = 0) OR ((GetQuantity(tmpstack) + GetQuantity(tmpid)) <= 65000);

Re: Autolumber - ламбер с автопоиском деревьев

Posted: 04.01.2014 15:53
by nah nah
Gauhar wrote:так как размер кучи не может быть больше 65000
чуть поправлю =) видимо в уо размер кучи хранится в 2 байтах, соответственно макс значение - 65535

Re: Autolumber - ламбер с автопоиском деревьев

Posted: 04.01.2014 17:44
by Lavion
Он и в пустой сундук не сбрасывает. А просто перекладывает по паку.

Re: Autolumber - ламбер с автопоиском деревьев

Posted: 04.01.2014 18:13
by drabadan
nah nah wrote:
drabadan wrote:Id сундука не правильный
Lavion wrote:подходит к сундуку, открывает его
весьма остроумно...

а где гарантия, что у автора просьбы точь в точь скрипт как у автора темы?
Может там уже черт ногу поломает в анлоаде...
Еще вариант, а автор просьбы точно "свечку держал", что сундук открывается или может он только подходит?

Lavion - вложи под спойлер скрипт который у тебя.
Такие проблемы в 99 случаев из 100 - в напутанных айдишках, именно куда ложить, а не откуда или что!

Re: Autolumber - ламбер с автопоиском деревьев

Posted: 04.01.2014 18:28
by Lavion
Program AutoLumber_SW;

{$Include 'all.inc'}

const
/////////////////////////////////////////////////
// Обязательные к изменению настройки скрипта //
Sunduk = $4001639C; //
// //
// Координаты точки перед сундуком //
xTileSunduk = 1095; //
yTileSunduk = 2530; //
// //
/////////////////////////////////////////////////

// Возможные к изменению настройки скрипта
MyMaxWeight = 350; // Максимальный вес
Hatchet1 = $0F47; // Тип топора1
Hatchet2 = $0F48; // Тип топора2 (перевёрнутый)

// Размерности массивов
iTTileCount = 39; // Типы тайлов деревьев (менять, только при редактировании массива)
iCTileCount = 4; // Кол-во точек (центров поляны), в которых хотим собирать информацию о деревьях (поляна = 30х30 тайлов)

// Журнал
Msg1 = 'переместили';
Msg2 = 'не смогли';
Msg3 = 'You put';
Msg4 = 'You decide not to chop wood';
Msg5 = 'There is nothing';
Msg6 = 'appears immune';
Msg7 = 'Try chopping';
Msg8 = 'hack';

// Прочее
RunSpeed = 300;
iRadiusSearch = 30; // Радиус (не диаметр!) поиска деревьев в тайлах, относительно персонажа
Logs = $1BDD; // Тип логов
WoodType = $0F90; // Тип дедвудов

type
ChopTile = Record
x, y : Integer;
end;

var
Regs : array [1..3] of Cardinal;
FoundTilesArray : TFoundTilesArray;
TempFoundTilesArray, ChopTilesArray : array of TFoundTile;
TreeTile:array [0..iTTileCount] of word;
ChopTiles : array[1..iCTileCount] of ChopTile;
ctime : TDateTime;
i : Integer;

// Инициализация массива типов тайлов деревьев
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;
end;

// Инициализация массива координат для поиска деревьев
procedure InitCTilesArray;
begin
ChopTiles[1].x := 1097; // Координаты первой точки, на которую идем и ищем деревья
ChopTiles[1].y := 2512;

ChopTiles[2].x := 1099; // Координаты второй точки, на которую идем и ищем деревья
ChopTiles[2].y := 2486;

ChopTiles[3].x := 1102; // Координаты третьей точки, на которую идем и ищем деревья
ChopTiles[3].y := 2454;

ChopTiles[4].x := 1099; // Координаты третьей точки, на которую идем и ищем деревья
ChopTiles[4].y := 2432;
end;

// Инициализация системных переменных
procedure InitSystem;
begin
SetRunUnmountTimer(RunSpeed);
SetArrayLength(ChopTilesArray, 1);
end;

// Инициализация регов
procedure InitReg;
begin
Regs[1] := $0F85; // Ginseng
Regs[2] := $0F88; // Nightshade
Regs[3] := $0F86; // Mandrake Roots
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, 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) then
break;
if j > Length(ChopTilesArray) - 1 then
begin
SetArrayLength(ChopTilesArray, Length(ChopTilesArray) + 1);
ChopTilesArray[Length(ChopTilesArray) - 1] := TempFoundTilesArray;
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) < 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;
A:= 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
for i:= 1 to iCTileCount do
begin
NewMoveXY(ChopTiles.x, ChopTiles.y, False, 1, False);
SearchTree;
AddToSystemJournal('Всего найдено деревьев: ' + IntToStr(Length(TempFoundTilesArray)));
ClearDuplicate;
end;
QuickSort(ChopTilesArray, 0, Length(ChopTilesArray) - 1);
end;

// Разгрузка (Edred)
procedure Discharge;
// разгружаем нарубленное в сундук
// нарубленное - реги в массиве Regs[1..3]
// логи - константа Logs
var
m, tmpcnt : integer;
tmpid, tmpstack, tmpcolor : Cardinal;
tmpname : String;
begin
AddToSystemJournal('Разгружаемся');
waitconnection(3000);
if Dead then exit;
UseObject(Sunduk);
wait(1000);
checksave;
// выложим реги
for m := 1 to 3 do
begin
tmpcnt := 0;
Repeat
tmpid := Findtype(Regs[m],backpack);
if tmpid = 0 then break;
addtosystemjournal( 'Найдено ' + inttostr(GetQuantity(tmpid)) + ' regs');
tmpcnt := tmpcnt + 1;
if tmpcnt > 10 then
begin
addtosystemjournal('Ошибка: не могу переместить regs!');
wait(1500);
end;
MoveItem(tmpid,GetQuantity(tmpid),Sunduk,0,0,0);
wait(1000);
CheckSave;
until tmpid = 0;
end;
// выложим дид вуды
tmpcnt := 0;
Repeat
tmpid := Findtype(WoodType,backpack);
if tmpid = 0 then break;
addtosystemjournal( 'Найдено ' + inttostr(GetQuantity(tmpid)) + ' dead woods');
tmpcnt := tmpcnt + 1;
if tmpcnt > 10 then
begin
addtosystemjournal('Ошибка: не могу переместить dead woods!');
wait(1500);
end;
tmpstack := Findtype(WoodType,Sunduk);
// Если не найден в банке - тогда просто в контейнер
if tmpstack = 0 then tmpstack := Sunduk;
MoveItem(tmpid,GetQuantity(tmpid),tmpstack,0,0,0);
wait(1000);
CheckSave;
until tmpid = 0;
// выложим логи
tmpcnt := 0;
Repeat
tmpid := Findtype(Logs,backpack);
if tmpid = 0 then break;
tmpcolor := GetColor(tmpid);
tmpname := ' unknown logs';
case tmpcolor of
$0000 : tmpname := ' logs';
$037F : tmpname := ' Grave logs';
$0039 : tmpname := ' Willow logs';
$05DD : tmpname := ' Maple logs';
$0456 : tmpname := ' Oak logs';
$0030 : tmpname := ' Pine logs';
$045C : tmpname := ' Walnut logs';
$0898 : tmpname := ' Spirits logs';
end;
addtosystemjournal( 'Найдено ' + inttostr(GetQuantity(tmpid)) + tmpname);
tmpcnt := tmpcnt + 1;
if tmpcnt > 10 then
begin
addtosystemjournal('Ошибка: не могу переместить логи');
wait(1500);
end;
repeat
tmpstack := FindtypeEx(Logs,tmpcolor,Sunduk,False);
if GetQuantity(tmpstack) >= 65000 then Ignore(tmpstack);
until (tmpstack = 0) OR (GetQuantity(tmpstack) < 65000);
// Если не найден в сундуке - тогда просто в контейнер
if tmpstack = 0 then tmpstack := Sunduk;
MoveItem(tmpid,GetQuantity(tmpid),tmpstack,0,0,0);
wait(1000);
CheckSave;
until tmpid = 0;
IgnoreReset;
AddToSystemJournal('Разгрузка закончена');
end;

// Идем к сундуку и выгружаемся
procedure UnloadOrDead;
begin
NewMoveXY(xTileSunduk, yTileSunduk, false, 1, false);
if not Dead then begin Discharge; end
else begin AddToSystemJournal('Персонаж мертв.'); SetARStatus(False); Disconnect; 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;
if UseType(Hatchet1,$FFFF) = 0 then
begin
if UseType(Hatchet2,$FFFF) = 0 then
begin
Result := false;
exit;
end;
end;
WaitForTarget(1500);
If TargetPresent then TargetToTile(tile, x, y, z);
q := 0;
repeat
wait(100);
q := q + 1;
checksave;
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 > 150);
if (m2<>-1) or (m3<>-1) or (m4<>-1) then CountFizzle := CountFizzle + 1;
if Dead or (Weight > MyMaxWeight) then begin Result := false; exit; end;
if (q > 150) 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;


// Главная функция
Begin
InitTTilesArray;
InitCTilesArray;
InitSystem;
InitReg;
MarkTrees;

repeat
for i:= 0 to Length(ChopTilesArray) - 1 do
begin
NewMoveXY(ChopTilesArray.x, ChopTilesArray.y, false, 1, false);
if not LumbCurTree(ChopTilesArray[i].tile, ChopTilesArray[i].x, ChopTilesArray[i].y, ChopTilesArray[i].z) then UnloadOrDead;
end;
until Dead;
End.
Скрипт не менялся, менялись лиш задержки. И Цвета логов с названиями.

Code: Select all

21:03:05:379 [Lavion]: Разгружаемся
21:03:06:379 [Lavion]: Найдено 1756 logs
21:03:07:481 [Lavion]: Найдено 1756 logs
21:03:08:592 [Lavion]: Найдено 1756 logs
21:03:09:696 [Lavion]: Найдено 1756 logs
21:03:10:852 [Lavion]: Найдено 1756 logs
21:03:11:958 [Lavion]: Найдено 1756 logs
21:03:13:058 [Lavion]: Найдено 1756 logs
21:03:14:159 [Lavion]: Найдено 1756 logs
21:03:15:334 [Lavion]: Найдено 1756 logs
21:03:16:439 [Lavion]: Найдено 1756 logs
21:03:17:548 [Lavion]: Найдено 1756 logs
21:03:17:552 [Lavion]: Ошибка: не могу переместить логи

Вот в чем может быть проблема? Рубит нормально. А разгрузиться не может.

Re: Autolumber - ламбер с автопоиском деревьев

Posted: 05.01.2014 19:45
by Lavion
На версии Стелса 6.1.5 не скидывает. Запустил его на версии 3.9.6 начал скидывать нормально.