Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7
Fishing
Code: Select all
Program Fishing;
type FishR = record
tile:word;
px,py,pz:integer;
end;
var
ItemCount,i:Integer;
FishP: array [0..150] of FishR;
Pole,Eat:Cardinal;
Const
BowChest = $6BC9B55A;
PoleChest = $6BC9B5D6;
{$Include 'all.inc'}
procedure FullDisconnect;
begin
SetARStatus(false);
Disconnect;
end;
Procedure GetFishTiles(s:String;WPos:Integer);
begin
s := s + ' ';
FishP[WPos].tile:=StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
FishP[WPos].px:=StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
FishP[WPos].py:=StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
FishP[WPos].pz:=StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
end;
Procedure GetCoord;
var
List:TStringList;
i:integer;
begin
List:=TStringList.Create;
List.LoadFromFile('Tiles.txt');
for i := 0 to List.Count-1 do
GetFishTiles(List.strings[i],i);
ItemCount:=i;
end;
Procedure DeathR;
begin
if life = 0 then
begin
CheckSave;
WaitConnection(3000);
WaitGump('1');
while life = 0 do
wait(1000);
CheckSave;
WaitConnection(3000);
UseObject(BowChest);
wait(500);
UseObject(PoleChest);
wait(500);
FindType($13B2,BowChest);
if FindCount <> 0 then
Grab(finditem,1);
FindType($0F3F,ground);
if FindCount <> 0 then
Grab(finditem,100);
end;
end;
Procedure Kill(Enemy:Cardinal);
var
RTime:Cardinal;
begin
CheckSave;
WaitConnection(3000);
if Count($0F3F) < 20 then
begin
FindType($0F3F,ground);
if FindCount <> 0 then
Grab(finditem,100);
end;
Disarm;
wait(1000);
FindType($13B2,backpack);
if FindCount > 0 then
Equip(RhandLayer,finditem)
else
begin
FindType($13B2,BowChest);
Equip(RhandLayer,finditem);
end;
CheckSave;
WaitConnection(3000);
Attack(Enemy);
RTime:=Timer;
While (GetDistance(Enemy)<15) and (Timer < (RTime + (30 *1000))) do
begin
if life <80 then
UOSay('Heal');
Wait(1000);
CheckSave;
WaitConnection(3000);
end;
Disarm;
wait(1000);
SetWarMode(false);
end;
Procedure DangerCheak;
var
Enemy:array[1..4] of Cardinal;
i:Integer;
begin
Enemy[1] := $0190;
Enemy[2] := $0191;
Enemy[3] := $0010;
Enemy[4] := $0096;
Ignore(Self);
for i:=1 to 4 do
begin
CheckSave;
WaitConnection(3000);
FindType(Enemy[i],ground);
if FindCount>0 then
Kill(FindItem);
end;
end;
Procedure Fish(tile:Word;x,y,z:Integer);
var
FBegin:TDateTime;
begin
FBegin:=Now;
while (not InJournalBetweenTimes('seem to be',FBegin,Now)>=0) do
begin
If TargetPresent then
CancelTarget;
If (GetType(Pole) = 0) then
begin
FindType($0DBF,backpack);
if FindCount > 0 then
Pole:=finditem
else
begin
UseObject(PoleChest);
wait(500);
FindType($0DBF,PoleChest);
if FindCount > 0 then
Pole:=finditem
else
FullDisconnect;
end;
end;
DeathR;
WaitTargetTile(tile,x,y,z);
UseObject(Pole);
CheckSave;
WaitConnection(3000);
WaitJournalLine(Now, 'a nice fish!|seem to be|You find a message|an old tattered|not a fish!', 20000);
DangerCheak;
CheckSave;
WaitConnection(3000);
end;
end;
Procedure FishS;
var
i:Integer;
FishT:array[1..4] of Cardinal;
begin
FishT[1] := $09CC;
FishT[2] := $09CE;
FishT[3] := $09CD;
FishT[4] := $09CF;
for i := 1 to 4 do
stack(FishT[i],$0000);
end;
begin
CheckSave;
WaitConnection(3000);
UseObject(BowChest);
wait(500);
UseObject(PoleChest);
wait(500);
SetArStatus(true);
Eat:=0;
GetCoord;
Disarm;
while true do
begin
FindDistance := 12;
FindVertical := 255;
for i:=0 to ItemCount-1 do
begin
CheckSave;
WaitConnection(3000);
if (Timer > (Eat + (15 *60 *1000))) then
begin
Hungry(1,ground);
Eat :=Timer;
end;
AddToSystemJournal('Fishing tile #'+IntToStr(i));
Fish(FishP[i].tile,FishP[i].px,FishP[i].py,FishP[i].pz);
if Weight > 350 then FishS;
end;
end;
end.
Интересно как работает, но не могу понять почему тут именно 150:
Как оно соотносится с количеством точек ловли в файле?
П.С.
Если несколько стопок с едой и одна из них не в пределах досягаемости, то нужно что то с этим делать
а то может умереть с голода пытаясь поесть с дальней.
Я пока сделал этот кусок так:
А вообще, отличная работа.
Code: Select all
FishP: array [0..150] of FishR;
П.С.
Если несколько стопок с едой и одна из них не в пределах досягаемости, то нужно что то с этим делать
а то может умереть с голода пытаясь поесть с дальней.
Я пока сделал этот кусок так:
Code: Select all
if (Timer > (Eat + (15 *60 *1000))) then
begin
FindDistance := 2;
Hungry(1);
Eat :=Timer;
FindDistance := 12;
end;