Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

Fishing Alexandria server

Only working scripts
Post Reply
bugger
Novice
Novice
Posts: 86
Joined: 02.02.2011 11:21

Fishing Alexandria server

Post by bugger »

Вообщем я играю периодически на сервер Alexandria(easyuo.com). Сервер работает на рануо 2.0, со включенным МЛом. Скрипт делает следующее:
Вылавливает всю рыбу в локации(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 схема -
Image

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.
P.S. Совсем забыл:
Потребуется вот это в алл.инк.

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; 
MuDaCk
Apprentice
Apprentice
Posts: 393
Joined: 10.10.2006 0:03
Contact:

Post by MuDaCk »

А как он кормит животного и чем?
Он бьёт только один вид змей? а кракенов?
My name is Игорёшка Image
Пишу скрипты за едуImage
grundick
Developer
Developer
Posts: 272
Joined: 31.01.2008 21:16

Post by grundick »

Много там народу?
Интересно играть?
Post Reply