Вылавливает всю рыбу в локации(5*5 или 7*7, не помню). Ловит на углах квадрата 12*12. То есть 4 угла-локации. На каждой локации ещё 4. В итоге 16 локаций.
Если выловил змею - убивает её при помощи лука и животного. Лечится и лечит животного. Убив змею, подплывает к ней и (пока только в теории, из-за глюков стелса) если надо подходит к трупу, срезает кожу, лутает золото и специальный предмет(карта, сеть, бутылка). Если перевес режет рыбу и если надо делает телепорт в банк и обратно на корабль. В банке проверяет бинты стрелы, сбрасывает лут, летит обратно.
Если вы играете не на рануо - используйте на свой страх и риск, так как я на сфере и поле давно не играл уже.
В скрипт проставляете все что имеет Id. Скрипт расчитан на: Animal Taming, Lore, Vet + Archery, Tactics, Chivalry + Fishing.
Теоретически можно переделать скрипт допустим для Magery+Eval int+Medit+Resist+Healing+Anatomy+Fishing. Чтобы следить за здоровьем у нас WatchHealth и чтобы убивать у нас KillSerp. Их конкретные реализации можно менять, остальное вроде трогать не надо. Если надумаете менять, то смотрите чтобы у вас бот, допустим,не искал в банке стрелы и бинты.
Примерная UML схема -
Code: Select all
Program Fishing;
{$Include 'all.inc'}
const
//Modified values
keyId = $4005922D;
petId = $00144C80;
safeRuneId = $4347A8A3;
cutterId = $457AB657;
vaultId = $457ACEB6;//$44878E60;
//Unmodified values
arrowType = $0F3F;
bandageType = $0E21;
steakType = $097A;
poleType = $0DC0;
netType = $0DCA;
mibType = $099F;
mapType = $14EC;
scaleType = $26B4;
hideType = $1079;
goldType = $0EED;
pearlType = $3196;
magicFishType = $0DD6;
seaSerpentType = $0096;
corpseType = $2006;
var
fishType : array of Cardinal;
bootType : array of Cardinal;
targetX:Integer;
targetY:Integer;
locDir:Integer;
healTimer : TTimer;
function checkArrows : Boolean;
begin
FindType(arrowType, backpack);
if FindFullQuantity < 100 then result:= true else result:= false;
end;
function checkBandaids : Boolean;
begin
FindType(bandageType, backpack);
if FindFullQuantity < 100 then result:= true else result:= false;
end;
procedure cutStakes;
var
tries,i : Integer;
begin
for i:=0 to 3 do
begin
while true do
begin
If TargetPresent then CancelTarget;
Inc(tries);
UseObject(cutterId);
WaitForTarget(2000);
if TargetPresent then break;
If tries > 10 then Exit;
end;
TargetToObject(FindType(fishType[i], backpack));
wait(500);
end;
end;
procedure goToBank;
begin
cutStakes;
while true do
begin
If TargetPresent then CancelTarget;
Cast('Sacred Journey');
WaitForTarget(5000);
if TargetPresent then break;
end;
TargetToObject(safeRuneId);
wait(5000);
//here should be some antiblock thing
UOSay('bank');//here is some check for vault
wait(1500);
MoveItems(backpack, mapType,$FFFF, ObjAtLayer(BankLayer), 0, 0, 0, 600);
wait(500);
MoveItems(backpack, netType,$FFFF, ObjAtLayer(BankLayer), 0, 0, 0, 600);
wait(500);
MoveItems(backpack, mibType,$FFFF, ObjAtLayer(BankLayer), 0, 0, 0, 600);
wait(500);
MoveItems(backpack, scaleType,$FFFF, ObjAtLayer(BankLayer), 0, 0, 0, 600);
wait(500);
MoveItems(backpack, hideType,$FFFF, ObjAtLayer(BankLayer), 0, 0, 0, 600);
wait(500);
MoveItems(backpack, goldType,$FFFF, ObjAtLayer(BankLayer), 0, 0, 0, 600);
wait(500);
MoveItems(backpack, pearlType,$FFFF, ObjAtLayer(BankLayer), 0, 0, 0, 600);
wait(500);
MoveItems(backpack, steakType,$FFFF, ObjAtLayer(BankLayer), 0, 0, 0, 600);
wait(500);
if checkArrows then MoveItem(FindType(arrowType, ObjAtLayer(BankLayer)),300,BackPack,0,0,0);
wait(500);
if checkBandaids then MoveItem(FindType(bandageType, ObjAtLayer(BankLayer)),300,BackPack,0,0,0);
wait(500);
while true do
begin
If TargetPresent then CancelTarget;
Cast('Sacred Journey');
WaitForTarget(5000);
if TargetPresent then break;
end;
TargetToObject(keyId);
wait(3000);
end;
procedure checkStuff;
begin
if Weight > (MaxWeight - 50) then cutStakes;
if (Weight > (MaxWeight - 80)) or checkArrows or checkBandaids then goToBank;
end;
procedure sail(destX,destY:Integer);
var
dirWord:String;
begin
while true do
begin
if getX(self) > destX then dirWord:= 'forward' else if getX(self) < destX then dirWord:= 'back' else break;
UOSay('one ' + dirWord);
wait(1000);
end;
while true do
begin
if getY(self) > destY then dirWord:= 'right' else if getY(self) < destY then dirWord:= 'left' else break;
UOSay('one ' + dirWord);
wait(1000);
end;
end;
procedure cutCorpse(corpseID:Cardinal);
var
tries:Integer;
begin
while true do
begin
If TargetPresent then CancelTarget;
Inc(tries);
UseObject(cutterId);
WaitForTarget(2000);
if TargetPresent then break;
If tries > 10 then Exit;
end;
TargetToObject(corpseID);
wait(500);
end;
procedure lootCorpse(corpseID:Cardinal);
var
i:Integer;
begin
MoveItems(corpseID, mapType,$FFFF, backpack, 0, 0, 0, 600);
wait(500);
MoveItems(corpseID, netType,$FFFF, backpack, 0, 0, 0, 600);
wait(500);
MoveItems(corpseID, mibType,$FFFF, backpack, 0, 0, 0, 600);
wait(500);
MoveItems(corpseID, scaleType,$FFFF, backpack, 0, 0, 0, 600);
wait(500);
MoveItems(corpseID, hideType,$FFFF, backpack, 0, 0, 0, 600);
wait(500);
MoveItems(corpseID, goldType,$FFFF, backpack, 0, 0, 0, 600);
wait(500);
MoveItems(corpseID, arrowType,$FFFF, backpack, 0, 0, 0, 600);
wait(500);
for i:=0 to 3 do MoveItems(backpack, bootType[i],$FFFF, corpseID, 0, 0, 0, 600);
wait(500);
for i:=0 to 3 do MoveItems(backpack, magicFishType,$FFFF, corpseID, 0, 0, 0, 600);
wait(500);
end;
procedure loot(corpseID:cardinal);
var
oldX, oldY, underMastX, underMastY : Integer;
afterMoveTime:TDateTime;
begin
oldX := getX(Self);
oldY := getY(Self);
sail(getX(corpseID),getY(corpseID));
underMastX:= getX(Self);
underMastY:= getY(Self);
newMoveXY(getX(corpseID),getY(corpseID),false,1,false);
afterMoveTime := Now;
UseObject(corpseID);
wait(500);
if InJournalBetweenTimes('far', afterMoveTime, Now) > -1 then
Ignore(corpseID)
else
begin
cutCorpse(corpseID);
lootCorpse(corpseID);
end;
Ignore(corpseID);
newMoveXY(underMastX,underMastY,false,0,false);
sail(oldX, oldY);
end;
procedure watchHealth;
var
tries:Integer;
begin
tries:= 0;
while (Life < MaxLife) and (Mana > 10) do
begin
Cast('Close Wounds');
WaitForTarget(2000);
TargetToObject(Self);
wait(2500);
end;
if isTimerExpire(healTimer) and (GetHP(petId) < GetMaxHP(petId)) then
begin
if TargetPresent then CancelTarget;
while not TargetPresent do
begin
UseObject(FindType(bandageType, backpack));
wait(500);
Inc(tries);
if tries > 10 then Exit;
end;
TargetToObject(petId);
end
end;
procedure killSerp(ID:Cardinal);
begin
UOSay('all guard me');
UOSay('all kill');
UOSay('all kill');
UOSay('all kill');
WaitForTarget(3000);
TargetToObject(ID);
SetWarMode(true);
Attack(ID);
Cast('Enemy Of One');
wait(2000);
while GetHP(ID) > 0 do
begin
//Cast('Divine Fury');
//Wait(2000);
Cast('Consecrate Weapon');
wait(2500);
watchHealth;
end;
SetWarMode(False);
UOSay('all guard me');
end;
procedure checkForSerp;
begin
FindType(seaSerpentType,Ground);
if FindCount > 0 then
begin
killSerp(FindItem);
loot(Findtype(corpseType, ground));
end;
end;
procedure changeFishCoords;
var
dirName:String;
i:Integer;
begin
if (targetX = -5) and (targetY = -5) then targetX := 5
else if (targetX = 5) and (targetY = -5) then targetY := 5
else if (targetX = 5) and (targetY = 5) then targetX:= -5
else if (targetX = -5) and (targetY = 5) then
begin
targetY := -5;
if locDir = 1 then dirName:= 'forward'
else if locDir = 2 then dirName:= 'left'
else if locDir = 3 then dirName := 'back'
else dirName := 'right';
Inc(locDir);
if locDir = 5 then locDir:= 1;
for i:= 0 to 12 do begin UOSay('one ' + dirName); wait(1500);end;
end;
end;
procedure tryCatch;
var
tries : Integer;
startTime:TDateTime;
begin
tries := 0;
if TargetPresent then CancelTarget;
while not TargetPresent do
begin
UseObject(FindType(PoleType, backpack));
wait(500);
Inc(tries);
if tries > 10 then Exit;
end;
startTime:=Now;
TargetToTile(0,getX(Self) + targetX,getY(Self) + targetY, 251);
if not WaitJournalLine(startTime,'biting', 3000) then
WaitJournalLine(startTime, 'while|monster|item|fish|biting', 17000);
if InJournalBetweenTimes('monster',startTime, Now) > -1 then
Exit;
if InJournalBetweenTimes('biting', startTime, Now) > -1 then begin changeFishCoords; Exit; end;
end;
procedure setStartValues;
begin
healTimer := setTimer(2000);
FindDistance:= 15;
FindVertical:= 251;
fishType:=[$09CF,$09CD,$09CC,$09CE];
bootType:=[$1711,$170F,$170B,$170D];
targetX:= -5;
targetY:= -5;
locDir:=1;
end;
begin
setStartValues;
while true do
begin
tryCatch;
checkForSerp;
watchHealth;
checkStuff;
end;
end.
Потребуется вот это в алл.инк.
Code: Select all
type
TTimer = record
timer : TDateTime;
expireTime : TDateTime;
end;
function setTimer(expireTime : cardinal) : TTimer;
begin
result.expireTime := double(expireTime) / 86400000;
result.timer := now + result.expireTime;
end;
procedure resetTimer(var timer : TTimer);
begin
timer.timer := now + timer.expireTime;
end;
function isTimerExpire(timer : TTimer) : boolean;
begin
result := now > timer.timer;
end;