Путь Лучника/Номада/Друида

Умные люди стремятся владеть информацией, мудрые - результатом её обработки!

В данном разделе находятся ответы на часто задаваемые вопросы и иная наиболее важная информация нашего шарда
  • Автор
  • Сообщение
Не в сети
Аватара пользователя
Novice
Novice
Сообщения: 29
Зарегистрирован: 18 фев 2021, 13:10
Репутация: 0
Откуда: ODS

Путь Лучника/Номада/Друида

Сообщение Nightwolf »

Попробуем найти оптимальной способ прокачки класса Ranger.
Если у кого будут дополнения / предложения / поправки - не стесняйтесь оставить комментарий.

1) Создаем перса:
Выбираем статы: ИНТу оставляем 10, остальное по-ровну в СТР и ДЕХ;
Скиллы я бы советовал начинающему: 50 Animal Taming & 50 Veterinary (оба скилла очень туго качать с 0, большие лвльные задержки) или 50 Archery & 50 Animal Taming (если нет других Персонажей, кем фармануть 20-30 к гп, чтоб скупить стрелы у Bowyer & Provisioner)

2) Трейним скиллы:
Трейним остальные скиллы ренжа (можно посмотреть в книге прописав .skill) у Стаблера, Боуера, Фиширмана, Провизионера;
Максимум можно затрейнить по 33;
Некоторые вендоры способны прокачать вас только до 28 или 24 - так что есть смысл побегать поискать кто обучит до 33;
п.с. стоит это удовольствие 10 гп за 1 скилл (итого 330 гп за 33 скилла))

3) Развитие до 1 уровня:
Чтобы упросить анализ вынужден опустить момент с добычей ресурсов.
Попробую позже отдельным постом и этот момент расписать.
Здесь же, предположим, что у вас есть всё - дом, трава, животные от коровы до оклока и гв, стрелы, бинты и печь с луками) а и еще напарник ренжер))
...
Так вот, я бы ставил 0 лвл сразу на лодку на Fishing, ниже скину скрипт на капитана лодки, который ловит рыбу + качает кэмпинг.
Делаем заметку: Fishing 33..100; + Camping 33...100;
Необходимо подготовить щепки, жаренную еду, лодку и удочки.
!Важно - лодку надо установить в гз, чтобы ренжа не трепали водяные чудовища (.gzone - для проверки в гз ли чар)

Далее, можно смело хватать рыбку и тащить её к печке в дом - там ее порезать за сырые фишстейки и стать на кукинг
Переходы (примерно): до 47 жарим по 1, потом до 67 по 3, потом по 4 и так далее...
Cooking 33...70-80

Легкий скилл до 100 (та и до 150) Animal Lore - просто на овцу до 50-60, а потом на лошадку, например Animal Lore 33...100
Ну и Tracking качаем условно до .. взятия 1лвла

Taming 50
Vetka 50
Archery 33
Cooking 70
Animal Lore 100
Fishing 100
Camping 100
Tracking 97

Total: 600 - 1lvl Ranger :)

4) Развитие до 6 уровня:
Хочу заметить только, что имеет смысл качать "зависимые от лвла" скиллы в конце (когда уже 4-5 уровни), а до этого стоит "углубиться" в:
Tracking 100..150; Cooking 70...150; Camping 100...150; Archery + Animal Lore 33/100... 150;
Лвл влияет на кол-во рыбы, которое мы достаем за попытку - поэтому, считаю разумным прокачку Fishing тоже оттягивать "наподольше" 100...150
Рекомендую качать последними Veterinary 50...150 и в заключение (уже будет 5лвл) Animal Taming 50..150 с партнером

_
Taming.jpeg
Taming.jpeg (564.94 КБ) 63758 просмотров
_

5) Скрипты:

Animal Lore

Код: Выделить всё

Program AnimalLore; 
var
t : Integer; 
enemy : Cardinal; 

{$Include 'all.inc'} 

Begin 
Enemy := $00463995; {Animal ID}
SetARStatus(true);
Finddistance := 2; 
hungry(1,ground);
clearjournal; 
while not Dead do 
begin 
 if Connected then 
 begin
 Finddistance := 10; 
 for t := 0 to 10 do 
 begin 
       if TargetPresent then CancelTarget; 
       CheckSave; 
       UseSkill('Animal Lore');
       WaitTargetObject(enemy);
       Wait(10000);
 end;
 Finddistance := 2;  
 Hungry(1,ground);
 end; 
end;
End.
Camping

Код: Выделить всё

// Прокачка кемпинга. Стопка хвороста на полу на расстоянии 1-2 клеток от игрока, но только не под игроком. Еда в пределах досягаемости.
// Можно запускать в связке со скриптами для активных навыков, типа: Animal Lore/Taming, Traking, etc.
Program Camping;
{$Include 'all.inc'}

Const
TKind = $0DE1;		// Type kindling
LowWarning = 50;	// Запас хвороста при котором предупреждать о необходимости пополнить запасы.

Var
Fired : Integer;

Begin
SetARStatus(true);
Wait(5000);
CheckStability;
Fired := 0;
While Connected And Not Dead Do
	Begin
	FindDistance := 2;
	Grab(FindType(TKind,Ground),1);
	If FindCount = 0 Then
		Begin
		AddToSystemJournal('No Kindlings');
		UOSay('Кажись хворост закончился... 8-(');
		Exit;
		End;
	If FindQuantity < LowWarning Then
		Begin
		AddToSystemJournal('Low Kindlings! Need refill!!!');
		UOSay('Хвороста мало осталось, принесите ещё!');
		End;
	Wait(500);
	DropHere(FindType(TKind,BackPack));
	Wait(500);
	FindDistance := 0;
	Repeat
	FindType(TKind,Ground);
	If FindCount > 0 Then
		Begin
		UseObject(FindItem);
		Wait(3000);
		End;
	Until FindCount = 0;
	Fired:=Fired+1;
	// проверка голода
	If Fired = 50 Then
		Begin
		FindDistance := 2;
		Hungry(1,-1);
		Wait(500);
		Fired:=0;
		End;
	End;
End.
Tracking

Код: Выделить всё

// Прокачка трекинга, оснащённого блокирующим меню. Можно запускать в фоне пока где-то бегаешь.
// Или в связке со скриптами на кемпинг, рыбалку; прочими, завязанными на использование предметов.
// Нельзя запускать в связке со скриптами, использующими активные навыки (Animal Lore/Taming, ArmsLore, Hiding, etc.).
// Графическое изображение меню в игровом клиенте остаётся, и его надо закрывать вручную по ПКМ.
// При длительном использовании скрипта с включённым клиентом - клиент лучше перезапустить.
Program Tracking_v0_02;

{$Include 'all.inc'}

Var
Eat : TDateTime;

Begin
SetARStatus(true);
Wait(5000);
CheckStability;
If MenuHookPresent Then CancelMenu;
AutoMenu('Select a category','(last)');
AutoMenu('Select a creature','(last)');
Eat := Now;
While Connected And Not Dead Do
	Begin
	If MenuPresent Then CloseMenu;
	UseSkill('Tracking');
	Wait(10000);
	// проверка голода
	If Now > (Eat + 7.0/1440) Then
		Begin
		Hungry(1,-1);
		Wait(500);
		Eat := Now;
		End;
	End;

End.
Animal Taming

Код: Выделить всё

program taming; 
var 

Char : Array[1..2] of string; 
Zver : Array[1..4] of Cardinal; 

procedure IsCurMessages; 
var D : TDateTime; 
begin 
{5 minutes in DateTime = 5 / 1440 = 0.00347} 
D := Now - (0.00697); 
InJournalBetweenTimes(CharName + ': I am already performing another action.',D,Now); 

{у меня глюканула строка ниже, поэтому отключил у себя}
//if LineCount > 1 then 
//begin 
//AddToSystemJournal('Error with target. Disconnected'); 
//Disconnect; 
//end; 
end; 

procedure Hungry(NeededLevel : Integer); 
var HArray : array [0..10] of String; 
CurrentLevel : Integer; 
HasError : Boolean; 
TimeSayHungry : TDateTime; 
FoodID : Cardinal; 
i,c,difference : Integer; 
begin 
findtype($097B,0); 
FoodID := FindItem;
if (NeededLevel < 0) or (NeededLevel > 10) then Exit; 
HArray[0] := 'You are absolutely stuffed!'; 
HArray[1] := 'You are stuffed'; 
HArray[2] := 'hungry at all'; 
HArray[3] := 'You are a little hungry'; 
HArray[4] := 'You are somewhat hungry'; 
HArray[5] := 'You are REALLY hungry'; 
HArray[6] := 'Your stomash hurts'; 
HArray[7] := 'Your stomash hurts and you feel dizzy'; 
HArray[8] := 'You are starving'; 
HArray[9] := 'You are almost dying of hunger'; 
HArray[10] := 'You are DYING of hunger...'; 
HasError := true; 
TimeSayHungry := Now; 
UOSay('.hungry'); 
wait(100); 
i:=0; 
while i < 100 do 
begin 
for c := 0 to 10 do 
if InJournalBetweenTimes(HArray[c],TimeSayHungry,Now) >= 0 then 
begin 
CurrentLevel := c; 
HasError := false; 
i := 100; 
end; 
wait(100); 
i := i + 1; 
end; 
if HasError then 
begin 
AddToSystemJournal('Error with Hungry: Lag? No connect? Something else?'); 
Exit; 
end; 
difference := CurrentLevel - NeededLevel; 
if difference > 0 then for i := 1 to difference do 
begin 
UseObject(FoodID); 
wait(2000); 
end; 
end; 

procedure First(); 

var 
b : TDateTime; 
tmp,i : integer; 
lol : String; 

Begin 
lol:=Char[2]+': all release'; 

while True do 
begin 
IsCurMessages; 
Hungry(1); 

i:=0; 
while i < 5 do 
begin 
for tmp:=1 to 4 do 
begin 
WaitTargetObject(zver[tmp]); 
UseSkill('Animal Taming'); 
B:=Now+0.0001157407407; 
WaitJournalLine(Now, 'You successfully tame|You failed|upset', 10000); 
{WaitJournalLine(Now, lol, 10000);} 
UOsay('all release'); 
UOsay(IntToStr(tmp)); 
i := i + 1; 
end; 
end; 
End; 
End; 

procedure Second(); 
var 

i,tmp : integer; 
f : TDateTime; 

begin 
f:=Now; 
while true do 
begin 

IsCurMessages; 
Hungry(1); 

i:=0; 
while i < 5 do 
begin 
WaitJournalLine(f,Char[1]+': 1'+'|'+Char[1]+': 2'+'|'+Char[1]+': 3'+'|'+Char[1]+': 4',0); 
if InJournalBetweenTimes(Char[1]+': 1',f,Now) >= 0 then tmp := 1; 
if InJournalBetweenTimes(Char[1]+': 2',f,Now) >= 0 then tmp := 2; 
if InJournalBetweenTimes(Char[1]+': 3',f,Now) >= 0 then tmp := 3; 
if InJournalBetweenTimes(Char[1]+': 4',f,Now) >= 0 then tmp := 4; 

f:=Now; 
WaitTargetObject(Zver[tmp]); 
UseSkill('Animal Taming'); 

WaitJournalLine(Now,'You successfully tame|You failed|upset', 10000); 

UOsay('all release'); 
i := i + 1; 
end; 
End; 
End; 

begin 
SetARStatus(true); 

   Char[1]:='Dreamcatcher'; { First Tamer } 
   Char[2]:='King Salmon'; { Second Tamer } 
   Zver[1]:= $0046ACC0; { Animal ID } 
   Zver[2]:= $0046ACBF;
   Zver[3]:= $0046ACC1;
   Zver[4]:= $0046ACBE;    

Case CharName Of 
Char[1] : First(); 
Char[2] : Second(); 
else AddToSystemJournal('Error'); 
End; 
End.
Fishing
Желательно, чтоб ренж был капитаном (будет кидать за борт мусор).
Так же, советую руками набить тайлов для рыбалки (так качественней, чем с тем скриптом на автосбор тайлов).
То есть, дабл-клил на удочку - на клетку в воде и потом текстом на инже, например, ,infotile и ласттаргет - убираем лишние Z: / Y: / Tile:
и добавляем в список / блокнот (всего около 50 тайлов норм)
_
Fishing.jpeg
Fishing.jpeg (64.75 КБ) 63752 просмотра
_
в данной версии будет еще и костры палить на лодке (без мангала!!!) - прирост Camping при наличии хвороста под ногами гарантирован!

Код: Выделить всё

Program Fishing;
type FishR = record
tile:word;
px,py,pz:integer;
end;

var
ItemCount,i:Integer;
FishP: array [0..150] of FishR;
Pole,Eat,Tracktimer:Cardinal;
const
Maps=$0000; //ерунда
MapBag=$6908DC84; //ерунда
BoatCap=true; // Капитан ли лодки
FilePath = 'D:\Games\stealth\Scripts\'; // путь к файлу с тайлами для рыбалки - название equal никнейму рыбаки - см скрин выше

{$Include 'all.inc'}

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(FilePath+CharName()+'.txt');
  for i := 0 to List.Count-1 do
  GetFishTiles(List.strings[i],i);
  ItemCount:=i;
end;

procedure camping;
begin
  finddistance:=2;
  FindType($0DE1,Ground);
  If FindCount > 0 Then
    Begin
    Wait(100);
    UseObject(FindItem);
    Wait(100);
    End;
  finddistance:=16;
end;

procedure redcheck;
begin
  finddistance:=16;
  findvertical:=255;
  if ((WarTargetID>0) {or (FindNotoriety(-1, 3) > 0)} or (FindNotoriety(-1, 4) > 0) or (FindNotoriety(-1, 6) > 0)) then
  begin
    UOSay('.guards');
    wait(10000);
  end;
  wait(50);
  While not connected or dead do wait(1000);
  finddistance:=2;
end;

Procedure Change;
var
chb, chg : integer;
begin
  checkdead;
  if not dead then
  begin
    CheckSave;
    redcheck;
    finddistance:=2;
    chg:=CountGround($0DBF);
    chb:=Count($0DBF);
    if (chb> 0) and (ObjAtLayer(LhandLayer) <= 0) then
    begin
      findtype($0DBF, backpack);
      Equip(LhandLayer,finditem);
      AddToSystemJournal('????? ?????? ? ???? '+inttostr(chb-1)+', ????? '+inttostr(chg+chb-1));
      wait(1000);
    end;
    if (chg> 0) and (ObjAtLayer(LhandLayer) <= 0) then
    begin
      findtype($0DBF, ground);
      Equip(LhandLayer,finditem)
      AddToSystemJournal('????? ?????? ?? ???? '+inttostr(chg-1)+', ????? '+inttostr(chg+chb-1));
      wait(1000);
    end;
    if (chb+chg)<1 then
    begin
      AddToSystemJournal('??????????? ??????!');
      checksave;
      redcheck;
      checkdead;
    end;

  end;
  Wait(1000);
end;

procedure tracking;
begin
  if (GetTickCount > (Tracktimer + (2 * 6 * 1000))) then
  begin
    Wait (200);
    Tracktimer := GetTickCount;
    CloseMenu;
    CancelMenu;
    if MenuHookPresent = True then CancelMenu;
    WaitMenu('Select','(last)');
    UseSkill('Tracking');
    Wait (250);
    WaitMenu('Select','(last)');
    Wait (300);
    CloseMenu;
    CancelMenu;
    if MenuHookPresent = True then CancelMenu;
    Wait(200);
  end;
end;

Procedure Fish(tile:Word;x,y,z:Integer);
var
FBegin:TDateTime;
begin

//  Tracking;
  camping;

  FBegin:=Now;
  while (not InJournalBetweenTimes('seem to be|not in your line',FBegin,Now)>=0) do
  begin
    If TargetPresent then
    CancelTarget;
    checkdead;
    redcheck;
    Change;
    UseObject(ObjAtLayer(LHandLayer));
    WaitForTarget(4000);
    TargetToTile(tile,x,y,z);
    WaitJournalLine(Now, 't fish there|a nice fish!|seem to be|not in your line|You find a message|an old tattered|not a fish!', 20000);
    redcheck;
    checkdead;
    If (GetType(Pole) = 0) then
    begin
      FindType($0DBF,ground);
      if FindCount > 0 then
      Pole:=finditem
      else
      checksave;
      redcheck;
    end;
    CheckSave;
    checkdead;
    WaitConnection(3000);
  end;
end;

Procedure FishS;
var
i:Integer;
FishT:array[1..4] of Cardinal;
begin
  checkdead;
  FishT[1] := $09CC;
  FishT[2] := $09CE;
  FishT[3] := $09CD;
  FishT[4] := $09CF;
  for i := 1 to 4 do
  stack(FishT[i],$0000);
  checkdead;
end;

Procedure Cleaner;
var
ThrowItem: array of Cardinal;
q,y: integer;
fl: boolean;
m: word;

begin
  FindDistance := 2;
  ThrowItem:=[$170D,$170B,$170F,$1711,$14ED,$099F];
  fl:=false;
  for q:=0 to (getArrayLength(ThrowItem)-1) do
  begin
    m:=Count(ThrowItem[q]);
    If m>0 then
    begin
      for y:=0 to (m-1) do
      begin
        checksave;
        redcheck;
        checkdead;
        findtype(ThrowItem[q],backpack);
        MoveItem(finditem, 0, Ground, 0,0,0);
//        DropHere(finditem);
        wait(500);
      end;
      fl:=true;
    end;
  end;
  m:=Count(Maps);
  if m>0 then
  for q:=0 to (m-1) do
  begin
    checksave;
    redcheck;
    checkdead;
    findtype(Maps,backpack);
    MoveItem(finditem, 0, MapBag, 0,0,0);
    wait(500);
  end;
  if BoatCap then
  for q:=0 to (getArrayLength(ThrowItem)-1) do
  begin
    findtype(ThrowItem[q], ground);
    m:=FindCount;
    If m>0 then
    for y:=0 to (m-1) do
    begin
      CancelWaitTarget;
      CancelTarget;
      checksave;
      redcheck;
      checkdead;
      findtype(ThrowItem[q], ground);
      UOsay('Throw Away');
      WaitForTarget(1000);
      if TargetPresent then TargetToObject(finditem);
      wait(1000);
    end;
  end;
  CancelWaitTarget;
  CancelTarget;
end;

begin
  SetArStatus(true);
  Checkdead;
  Eat:=0;
  GetCoord;
  Disarm;
  while true do
  begin
    FindDistance := 2;
    FindVertical := 255;
    for i:=0 to ItemCount-1 do
    begin
//      CloseMenu;
//      CancelMenu;
//      if MenuHookPresent = True then CancelMenu;
//      Wait(200);
      if (Timer > (Eat + (15 *60 *1000))) then
      begin
        finddistance:=2;
        Hungry(1,ground);
        Eat :=Timer;
        finddistance:=16;
      end;
      Cleaner;
      Fish(FishP[i].tile,FishP[i].px,FishP[i].py,FishP[i].pz);
      if Weight > 350 then FishS;
      if Weight > 410 then checksave;
      redcheck;
    end;
  end;
end.
Veterinary

кидает ветку, берет бинты с пола, кушает, юзает анимал лор и начинает лечить (если у гритвирма хп меньше 100%)
вирм должен быть приручен (пофиг кем хоть).
лайфхак - если не кем таймит - подкармливай вирма мясными дольками (продается у батчера по 100 единиц).
узнать голоден ли животен - можно кинуть анимал лор (кажется, последняя фраза - wonderfully happy)

внимание, если вдруг вы ослушаетесь и станете качать ветку 0лвлу - в строке ниже обязательно увеличьте задержку на ожидание результата хила с 6 секунд, хотябы до 12-13
WaitJournalLine(stime, 'successfully heal your patient|full heath|have resurrected|could not heal your patient|You could not|you successfully|completely', 13200);

Код: Выделить всё

Program Veterinary;

var 
ETimer: Cardinal;

const
BandageType = $0E21;
AnimalId = $00466763;
AnymalLoreId = $00466763;

{$Include 'all.inc'}

procedure checkbandages;
begin
  if (count($0E21) < 50) then
  begin
    MoveItem(FindType($0E21,ground),2000,backpack,0,0,0);
    CheckLag (30000);
    wait(500);
    
    FindType($0E21,ground);
    AddToSystemJournal('Bandages left: '+IntToStr(FindFullQuantity));
  end;
end;

procedure animal_lore;
begin
   if TargetPresent then CancelTarget;
   Waittargetobject(AnymalLoreId);
   useskill('Animal Lore'); 
   wait(3000);
end;

procedure check_enemy;
begin
    if IsObjectExists(AnimalId) then
    begin
     wait(50);
    end else
    begin  
       addtosystemjournal('Zver umer, Logout');
       fulldisconnect; 
    end;
end;

Procedure Eat;
Begin
If (GetTickCount > ETimer + (6 * 60 * 1000)) Then Begin
check_enemy;
animal_lore;
Hungry(1, -1);
ETimer := GetTickCount;
wait(1000);
End;
End;

procedure Heal;
var stime : TDateTime;
begin
   stime := Now;
   waitconnection(4000);
   FindType($0E21, Backpack); 
   if (finditem > 0) and (GetHP(AnimalId) < GetMaxHP(AnimalId)) then
   begin 
      if TargetPresent then CancelTarget;
      WaitTargetObject(AnimalId);
      UseObject(finditem);             
      WaitJournalLine(stime, 'successfully heal your patient|full heath|have resurrected|could not heal your patient|You could not|you successfully|completely', 6200);
   end;  
//   CheckBloodyBandage;
end;

Begin
   SetARStatus(true);

   finddistance:=2;
   if TargetPresent then CancelTarget;
   Waittargetobject(AnymalLoreId);
   useskill('Animal Lore');
   wait(1500);

  while true do begin   
    WaitConnection(2000);
    CheckDead;
    Eat; 
    wait(500);
    if TargetPresent then CancelTarget;
    
    checkbandages;
    Heal;
    
    wait(100);
    
  end;
end.
Cooking

Получился супер универсальный скрипт, жаль, что меня Владимирус раньше не пнул и я ток сейчас поправил
Жарим рыбку Cooking плюс на лету качаем и Tracking и Camping.
Можно всегда что-то одно (или сразу оба фоновых скилла) отключить, достаточно поставить false в конфиге

Код: Выделить всё

Program Cooking;

const
RawFishSteaks = $097A;
FishSteaks    = $097B;
AmountToDrop  = 100; { влияет на частоту проверки сытости, по достижению амаунта - будет сбрасывать готовую еду на пол }
SteaksAmount  = 15;  {possible values: 1, 3, 4, 6, 9, 12, 15}

useTracking   = true;
useCamping    = true;

var
TrackTimer: Cardinal;

{$Include 'all.inc'}
  
procedure CheckRawFishSteaks;
begin
If GetQuantity(FindType(RawFishSteaks,BackPack)) < SteaksAmount Then
  begin
  If FindType(RawFishSteaks,Ground) > 0 Then 
    begin
    Grab (FindItem, 300);
    wait (500)
    CheckLag (10000);
    FindType(RawFishSteaks,Ground);
    AddToSystemJournal('Raw fishsteaks left: '+IntToStr(FindFullQuantity));
    end
  else
    begin
    AddToSystemJournal('Run out of raw fish');
    wait (600000)
    end;
  end;  
end;

procedure DropFishSteaks;
begin
  While FindType(FishSteaks,backpack) > AmountToDrop Do
    begin
    Stack(FishSteaks,$0000);
    wait(500)
    checklag (10000);
    FindType(FishSteaks,Ground);
    AddToSystemJournal('Already cooked fishsteaks: '+IntToStr(FindFullQuantity));
    wait(200);
    Hungry(1,-1);
    wait(500);
    end;
end;

procedure Tracking;
begin
  If (GetTickCount > TrackTimer + (1 * 10 * 1000)) Then Begin
    CheckSave;
    if MenuHookPresent = True then CancelMenu;
    WaitMenu('Select','(last)');
    UseSkill('Tracking');
    wait (300);
    WaitMenu('Select','(last)');
    wait (1000);
    TrackTimer := GetTickCount;

    CloseMenu;
    CancelMenu;
    if MenuHookPresent = True then CancelMenu;
  End;
end;

procedure Camping;
begin
  FindType($0DE1,Ground);
  If FindCount > 0 Then
    Begin
    Wait(140);
    UseObject(FindItem);
    Wait(700);
    End;
end;

procedure MakeSteaks;
begin
While GetQuantity(FindType(RawFishSteaks,BackPack)) >= SteaksAmount Do
  begin
    if useTracking then Tracking;
    if useCamping then Camping;
    wait(100);
  
    if (SteaksAmount < 3) then
      begin
       AutoMenu('What do you want to make?','cooked fishsteak');
      end
      else
      begin
       AutoMenu('What do you want to make?','cooked fishsteak (' + IntToStr(SteaksAmount) + ')');   
      end;
      
    Useobject(findtype(RawFishSteaks,backpack));
    WaitJournalLine(Now,'You burned|You create|You must|You put', 10000);
    wait(100);
    CloseMenu;
    CancelMenu;
    if MenuHookPresent = True then CancelMenu;
  end;
end;

// -------------

BEGIN
  SetARStatus (True);
  SetPauseScriptOnDisconnectStatus(True);

  while not Dead Do
  begin
    while not Connected Do
    begin 
      wait(10000);
    end;
   
    begin 
      CheckLag(30000);
      DropFishSteaks;
      CheckRawFishSteaks;
      MakeSteaks;
    end;
  end;
END.
Archery

Идея лупить по грит вирму, но можно и по файту.
Еда, Стрелы, Сундук с луками - все на полу.
Лучник проверяет уровень здоровья жертвы - если меньше пол хп - отбегает за препятствие (стена, угол дома, шкаф - на ваше усмотрение)
Пьет банки стр/декс (если такие есть) с пола.
Качает фоном Animal Lore (можно активировать Tracking или Camping)
Позже, если руки дойдут, поправлю "по-человечески" переключалку, пока шо просто надо раскомментировать (убрать "//") возле скила, который хотим запустить в фоновом режиме
// == useskill

// Camping;
AnimalLore;
//Tracking;

// == useskill END
на примере выше будет юзать Animal Lore

Код: Выделить всё

Program Archery;

var t : integer;
ETimer,BDTimer,BSTimer: Cardinal;

const
Enemy    = $00466763;   // { ID цели для арчери }
Enemy2   = $00466763;   // { ID цели для арчери }
tweapon  = $13B2;       // { Type лука }
Chest    = $736BA680;   // { ID сундука с луками }
PotionDex = $0F08; // { ОК }
PotionStr = $0F09; // { ОК }
// ----------
ax = 3910; // Точка для пальбы
ay = 260;
// ----------
bx = 3912; // Точка для сейва жертвы
by = 259;


LimitHP = 70;     // игнор
tshield  = $0000;     // игнор
Breastplate = $0000;     // игнор
Gloves = $0000;     // игнор
Gorget = $0000;     // игнор
Legs = $0000;     // игнор
Helm = $0000;     // игнор
Arms = $0000;     // игнор

{$Include 'all.inc'}

procedure check_enemy;
begin
    if IsObjectExists(Enemy) then
    begin
     wait(50);
    end else
    begin  
       addtosystemjournal('Zver umer, Logout');
       fulldisconnect; 
    end;
end;

Procedure Eat;
Begin
If (GetTickCount > ETimer + (7 * 60 * 1000)) Then Begin
check_enemy;
Hungry(1, -1);
ETimer := GetTickCount;
End;
End;

procedure check_corpse;
var CorpseID : Cardinal;
begin
  finddistance := 6;
  if FindType($2006, Ground) > 0 then
  begin
    CorpseID:=FindItem;   
    UnEquip(RHandLayer);
    CheckLag (30000);
    wait(500);
    newMoveXY(3910,263,true,0,true);
    wait(300);
    WaitTargetObject(finditem);
    UseObject(FindType($0F51, Backpack));
    CheckLag(30000);
    Wait(500);
    addtosystemjournal('Kto-to umer, oops - nado pochikat...');
    newMoveXY(bx,by,true,0,true);
    Ignore(CorpseID);
  end;
  finddistance := 2;
end;

Procedure BoostDex;
Begin
  If (GetTickCount > BDTimer + (5 * 60 * 1000)) Then Begin
      if (getquantity(findtype(PotionDex,Backpack)) > 0) then
        begin
            Wait(100);
            UseType(PotionDex,$FFFF);
            Wait(200);
            CheckLag (30000);
            BDTimer := GetTickCount;
        end
      else
        begin
            if (getquantity(findtype(PotionDex,Ground)) > 0) then begin
            addtosystemjournal('Dex bottles left: '+inttostr(findcount-1));
            Wait(100);
            MoveItem(finditem,0,BackPack,0,0,0);
            Wait(500);
            UseType(PotionDex,$FFFF);
            Wait(200);
            CheckLag (30000);
            BDTimer := GetTickCount;
            end;
        end;
      
      if (getquantity(findtype($0F0E,Backpack)) > 0) then begin  
      Wait(100);
      Stack($0F0E,$FFFF);
      Wait(200);
      CheckLag (30000);
      End;
  End;
End;

Procedure BoostStr;
Begin
  If (GetTickCount > BSTimer + (5 * 60 * 1000)) Then Begin
      if (getquantity(findtype(PotionStr,Backpack)) > 0) then
        begin
            Wait(100);
            UseType(PotionStr,$FFFF);
            Wait(200);
            CheckLag (30000);
            BSTimer := GetTickCount;
        end
      else
        begin
            if (getquantity(findtype(PotionStr,Ground)) > 0) then begin
            addtosystemjournal('Str bottles left: '+inttostr(findcount-1));
            Wait(100);
            MoveItem(finditem,0,BackPack,0,0,0);
            Wait(500);
            UseType(PotionStr,$FFFF);
            Wait(200);
            CheckLag (30000);
            BSTimer := GetTickCount;
            end;
        end;
      
      if (getquantity(findtype($0F0E,Backpack)) > 0) then begin  
      Wait(100);
      Stack($0F0E,$FFFF);
      Wait(200);
      CheckLag (30000);
      End;
  End;
End;

procedure checkall;
begin
if IsObjectExists(Chest) then
begin
 UseObject(Chest); 
 CheckLag (30000);
 Wait(500);
 Eat;
 Wait(500); 
 
{ это если вдруг решите на гв качать без кожи с резистом от огня - тотем вам в помощь}
// if (HP < MaxHP) then
//  begin 
//    Uosay('Heal');
//    Wait(1000);
//  end;

end;
    if (getquantity(findtype(tweapon,Chest)) > 0) and (gettype(ObjAtLayer(RhandLayer)) <> gettype(finditem)) then
    begin
      addtosystemjournal('Bows left: '+inttostr(findcount-1));
      UnEquip(RHandLayer);
      CheckLag (30000);
      wait(500);
      Equip(RhandLayer,finditem);
      CheckLag (30000);
      Wait(500);
    end;
    if FindType(tweapon, Backpack) > 0 then
    begin
      MoveItem(FindItem, 0, Chest, 0,0,0);
      CheckLag (30000);
      Wait(500);
    end;
    if (getquantity(findtype(Gorget,Chest)) > 0) and (gettype(ObjAtLayer(NeckLayer)) <> gettype(finditem)) then
    begin
      addtosystemjournal('Gorget Change, ???????? '+inttostr(findcount-1));
      UnEquip(NeckLayer);
      CheckLag (30000);
      wait(500);
      Equip(NeckLayer,finditem);
      CheckLag (30000);
      Wait(500);
    end;
    if FindType(Gorget, Backpack) > 0 then
    begin
      MoveItem(FindItem, 0, Chest, 0,0,0);
      CheckLag (30000);
      Wait(500);
    end;    
    if (getquantity(findtype(Helm,Chest)) > 0) and (gettype(ObjAtLayer(HatLayer)) <> gettype(finditem)) then
    begin
      addtosystemjournal('Helm Change, ???????? '+inttostr(findcount-1));
      UnEquip(HatLayer);
      CheckLag (30000);
      wait(500);
      Equip(HatLayer,finditem);
      CheckLag (30000);
      wait(500);
    end;
    if FindType(Helm, Backpack) > 0 then
    begin
      MoveItem(FindItem, 0, Chest, 0,0,0);
      CheckLag (30000);
      Wait(500);
    end;
    if (getquantity(findtypeEx(Gloves,$0000,Chest,True)) > 0) and (gettype(ObjAtLayer(GlovesLayer)) <> gettype(finditem)) then
    begin
      addtosystemjournal('Gloves Change, ???????? '+inttostr(findcount-1));
      UnEquip(GlovesLayer);
      CheckLag (30000);
      wait(500);
      Equip(GlovesLayer,finditem);
      CheckLag (30000);
      wait(500);
    end;
    if FindType(Gloves, Backpack) > 0 then
    begin
      MoveItem(FindItem, 0, Chest, 0,0,0);
      CheckLag (30000);
      Wait(500);
    end;
    if (getquantity(findtype(Arms,Chest)) > 0) and (gettype(ObjAtLayer(ArmsLayer)) <> gettype(finditem)) then
    begin
      addtosystemjournal('Arms Change, ???????? '+inttostr(findcount-1));
      UnEquip(ArmsLayer);
      CheckLag (30000);
      wait(500);
      Equip(ArmsLayer,finditem);
      CheckLag (30000);
      wait(500);
    end;
    if FindType(Arms, Backpack) > 0 then
    begin
      MoveItem(FindItem, 0, Chest, 0,0,0);
      CheckLag (30000);
      Wait(500);
    end;
    if (getquantity(findtype(Breastplate,Chest)) > 0) and (gettype(ObjAtLayer(TorsoLayer)) <> gettype(finditem)) then
    begin
      addtosystemjournal('Breastplate Change, ???????? '+inttostr(findcount-1));
      UnEquip(TorsoLayer);
      CheckLag (30000);
      wait(500);
      Equip(TorsoLayer,finditem);
      CheckLag (30000);
      wait(500);
    end;
    if FindType(Breastplate, Backpack) > 0 then
    begin
      MoveItem(FindItem, 0, Chest, 0,0,0);
      CheckLag (30000);
      Wait(500);
    end;
    if (getquantity(findtype(Legs,Chest)) > 0) and (gettype(ObjAtLayer(LegsLayer)) <> gettype(finditem)) then
    begin
      addtosystemjournal('Legs Change, ???????? '+inttostr(findcount-1));
      UnEquip(LegsLayer);
      CheckLag (30000);
      wait(500);
      Equip(LegsLayer,finditem);
      CheckLag (30000);
      wait(500);
    end;
    if FindType(Legs, Backpack) > 0 then
    begin
      MoveItem(FindItem, 0, Chest, 0,0,0);
      CheckLag (30000);
      Wait(500);
    end;
    if (getquantity(findtype(tshield,Chest)) > 0) and (gettype(ObjAtLayer(LhandLayer)) <> gettype(finditem)) then
    begin
      addtosystemjournal('Shield Change, ???????? '+inttostr(findcount-1));
      UnEquip(LHandLayer);
      CheckLag (30000);
      wait(500);
      Equip(LhandLayer,finditem);
      CheckLag (30000);
      wait(500);
    end;
    if FindType(tshield, Backpack) > 0 then
    begin
      MoveItem(FindItem, 0, Chest, 0,0,0);
      CheckLag (30000);
      Wait(500);
    end;
end;

procedure checkAnimalHP;
begin
 if (GetHP(Enemy) < (GetMaxHP(Enemy) / 2)) then newMoveXY(bx,by,true,0,true);
 wait(1000);
 if (GetHP(Enemy) > (GetMaxHP(Enemy) / 2)) then newMoveXY(ax,ay,true,0,true);
 wait(300);
end;

procedure checkbandages;
begin
  if (count($0F3F) < 200) then
  {bolts: $1BFB}
  begin
    MoveItem(FindType($0F3F,ground),2000,backpack,0,0,0);
    CheckLag (30000);
    wait(500);
    FindTypeEx($0F3F,$0000,ground,true);
    Addtosystemjournal('Arrows left: '+intToStr(findfullquantity));
    wait(300);
  end;
end;

procedure checkhp;
begin
CheckLag (30000);
if (HP < LimitHP) then newMoveXY(bx,by,true,0,true);
//if (HP > LimitHP+10) then newMoveXY(ax,ay,true,0,true);
wait(100);
checkAnimalHP;
wait(100);
end;

procedure Camping;
begin
  FindType($0DE1,Ground);
  If FindCount > 0 Then
    Begin
    Wait(100);
    UseObject(FindItem);
    Wait(1000);
    End;
end;

procedure AnimalLore;
begin
    If TargetPresent Then CancelTarget;
    UseSkill('Animal Lore');
    CheckLag (30000);
    Wait(100);
    If TargetPresent Then
    begin
      TargetToObject(Enemy2);
      CheckLag (30000);
      Wait(290);
    end;
end;

procedure Tracking;
begin
CloseMenu;
//CancelMenu;
//if MenuHookPresent = True then CancelMenu;
WaitMenu('Select','(last)');
UseSkill('Tracking');
wait(300);
WaitMenu('Select','(last)');
wait(400);
CloseMenu;
//CancelMenu;
//if MenuHookPresent = True then CancelMenu;
end;

Begin
  SetARStatus(true);
  moveThroughNPC := 1;
  FindDistance := 2;
  while true do
  begin
    SetWarMode(True);
  while (not Dead) and connected do
    begin
      for t := 0 to 30 do
      begin
      checkhp;
      check_corpse;
      BoostDex;
      BoostStr;
      checkall; 
      wait(400);
//      SetWarMode(False);
//      wait(2700);
//      SetWarMode(True);
//      wait(2500);
      Attack(Enemy);
      CheckLag (30000);
      Wait(300);
      checkhp;
      check_corpse; 
      
      // == useskill
           
      // Camping;
      AnimalLore;
      //Tracking;
                    
      // == useskill END  
      
      checkhp;
      checkbandages;
      If TargetPresent Then CancelTarget;
      if (count($0E21) > 0) then 
      begin
        if (HP < MaxHP) then
        begin
          WaitTargetSelf;
          UseType($0E21,$FFFF);
          CheckLag (30000);
          Wait(1000);
        end;
      checkhp;
      end;
        if (Count($0E20) > 50) then 
         begin
          stack($0E20,$0000);
          CheckLag (30000);
          Wait(1000);
        end;
       end;
    end;
    while (dead) and (connected) do
     begin
      SetWarMode(true);
      Wait(1000);
     end; 
    if (not Connected) then
     begin
      waitconnection(1000);
     end;
  end;
End.
альтернативный скрипт от Инсайда:

Код: Выделить всё

Program Archery;

Const
WeaponBoxId = $59F1F1EE; //?????? ? ??????
AnymalLoreId = $0041E4D7; //???? ?? ??? ?????? ?????? ???
EnemyId = $0041E4D7; //?? ??? ????????
WeaponType = $13B2; //??? ??????
ArrowType = $0F3F; //??? ?????
KindlingType = $0DE1; //??? ?????
UseTracking = true; //?????? ?? ????? ???????
UseCamping = false; //?????? ?? ????? ???????
UseAnimalLore = true; //?????? ?? ????? ?????? ???

MinHP=70; // ??????????? ??????? ?? ????? ??????? ?????

{$Include 'all.inc'}

procedure applySkill;
var j: Integer;
begin
  WaitConnection(2000);
  if dead then exit;
  if UseTracking then begin
    useskill('Tracking');       
    wait(1000);
  end else if UseAnimalLore then begin
    if TargetPresent then CancelTarget;
    Waittargetobject(AnymalLoreId);
    useskill('Animal Lore'); 
    wait(1000);
  end;
  if UseCamping then begin
    for j:= 0 to 1 do begin
      WaitConnection(2000);
      if dead then exit;
      FindType(KindlingType, $0000);
      if FindCount > 0 then begin
        useobject(finditem);
      end;
      wait(5250);
    end;
  end else begin
    wait(10500);
  end;
end;

Begin
  finddistance := 1;
  SetARStatus(true);
  AutoMenu('(any)','(any)');
  while true do begin
    WaitConnection(2000);
    CheckDead;
    hungry(1,ground);
    attack(EnemyId);
    WaitConnection(2000);
    while not dead and ((GetHP(EnemyId) * 100.0 / GetMaxHP(EnemyId)) < MinHp) do begin
      //wait and use skills only
      disarm;
      applySkill;  
      hungry(1,ground);
    end;
    //check weapon
    WaitConnection(2000);
    if dead then continue;
    if (ObjAtLayer(RhandLayer) = 0) then begin
      useobject(backpack);
      wait(1500);
      WaitConnection(2000);
      if (findtype(WeaponType, backpack) > 0) then begin
        //get weapon from pack
        Equip(RhandLayer, finditem);
        wait(1000);
      end else begin
        //get weapon from chest
        WaitConnection(2000);
        useobject(WeaponBoxId);
        wait(1500);
        WaitConnection(2000);
        if dead then continue;
        if (findtype(WeaponType, WeaponBoxId) > 0) then begin
          Equip(RhandLayer, finditem);
        end else begin
          AddToSystemJournal('No weapons, disconnecting...');
          SetARStatus(false);
          Disconnect;
          exit;
        end;
      end;
    end;
    //check arrows
    WaitConnection(2000);
    if dead then continue;
    if (GetQuantity(FindType(ArrowType,backpack)) <= 100) then begin
      if (GetQuantity(FindType(ArrowType,ground)) > 0) then  begin
        AddToSystemJournal('There are ' + IntToStr(FindFullQuantity) + ' arrows left.');
        Grab(FindType(ArrowType,ground), 500);
      end else begin
        AddToSystemJournal('No arrows, disconnecting...');
        SetARStatus(false);
        Disconnect;
        exit;
      end;
    end;  
    //use skills
    applySkill;
  end;
End.
Последний раз редактировалось Nightwolf 13 ноя 2023, 18:09, всего редактировалось 8 раз.

Не в сети
Grandmaster
Grandmaster
Сообщения: 392
Зарегистрирован: 11 фев 2021, 20:07
Репутация: 11

Re: Путь Лучника/Номада/Друида

Сообщение Turner »

я бы качал трек-фиш-кемп вместе.
арчери+лорку
ветку+лорку. не будет необходимости в таком случае качать отдельно кемп и отдельно лорку и тратить на это время.
рыбы на кукинг до 150 должно хватить на каком бы левеле фишинг не качал до 150. если, конечно, не унесут всякие помогайки.

по времени в таком случае выйдет немного быстрее, чем все переставлять туда-сюда.

а в целом чудный гайд!

Не в сети
Аватара пользователя
Novice
Novice
Сообщения: 29
Зарегистрирован: 18 фев 2021, 13:10
Репутация: 0
Откуда: ODS

Re: Путь Лучника/Номада/Друида

Сообщение Nightwolf »

спасибо за отзыв, скрипты первые "нубовские" когда нет ни стрел ни бинтов и задача просто на лодке взять 1лвл (присмотреться что к чему, так сказать)

да конечно, ты прав - я сам качал:
тайминг и ветку - соло
арчери + трекинг/анимал лор
кукинг + трекинг/кемпинг
фишинг + кемпинг (трек у меня зависал - если можешь поделится скриптом на фиш + трек - велкам, или подсказать, где поправить мой)

П.С. я еще буду редактировать текст - в планах закинуть "конфетку" на кукинг и дописать развитие ренжа в Номада и Друида.....

*upd.: кукинг вроде ничо так получился:)

Не в сети
Neophyte
Сообщения: 2
Зарегистрирован: 12 май 2023, 15:45
Репутация: 0

Re: Путь Лучника/Номада/Друида

Сообщение buldog »

Nightwolf писал(а): 21 сен 2023, 09:40 спасибо за отзыв, скрипты первые "нубовские" когда нет ни стрел ни бинтов и задача просто на лодке взять 1лвл (присмотреться что к чему, так сказать)

да конечно, ты прав - я сам качал:
тайминг и ветку - соло
арчери + трекинг/анимал лор
кукинг + трекинг/кемпинг
фишинг + кемпинг (трек у меня зависал - если можешь поделится скриптом на фиш + трек - велкам, или подсказать, где поправить мой)

П.С. я еще буду редактировать текст - в планах закинуть "конфетку" на кукинг и дописать развитие ренжа в Номада и Друида.....

*upd.: кукинг вроде ничо так получился:)
Ага наделятся тебе тут надейся. и скрипты дадут и карты шахт всё дадут ....

Не в сети
Grandmaster
Grandmaster
Сообщения: 392
Зарегистрирован: 11 фев 2021, 20:07
Репутация: 11

Re: Путь Лучника/Номада/Друида

Сообщение Turner »

кстати да. продам карты шахт )

Не в сети
Аватара пользователя
Master
Master
Сообщения: 140
Зарегистрирован: 05 дек 2021, 11:13
Репутация: 9
Откуда: Одесса
Контактная информация:

Re: Путь Лучника/Номада/Друида

Сообщение Ingram »

За такой гайд, угостить - это самый минимум.

Не в сети
Аватара пользователя
Novice
Novice
Сообщения: 29
Зарегистрирован: 18 фев 2021, 13:10
Репутация: 0
Откуда: ODS

Re: Путь Лучника/Номада/Друида

Сообщение Nightwolf »

Осилив 6лвл пути лучников разделились..
один пошел в магию, другой в звон мечей и кувалд..

Друид (6лвл Ренж + 2й класс Маг)
Я качал в следующей очередности:
Итем, Эвал по 100
Спирт до 75
Меджери до 50
Медитацию И Инскрипт ~ по 80-90
Алхимию до 90-100
Резист не трогал (33)

Итого 1лвл Друид, суммскилл >1800

далее я закончил с Алхимией 135,
Итем / Эвал по 120-125
Инскрипт до 112-114
Меджери до 70-80
Спирит Спик (одев ++ на меджери немного можно прокачать параллельно магию до 90 на диспелах) до 115-120
Медитация параллельно получается около 118-125
Резист не трогал (33)

затем приодев ++ на инскрипт и меджери подняв до 125-130 оба скилла стал на РБ
Меджери 135
Инскрипт 135

начал трогать резист - до 70 на минд бластах по a valey frenzey ostard (сделав друиду 125 ИНТЫ)
потом имея ++ на резист я сразу стал на ин вас поры на plague beasts (я где-то при 80 стал 3лвлом)
добавил себе в скрипт, чтоб юзал Евал(120-135), потом Итем(120-135), потом Медитацию(131-135) при этом Резист добил "пассивно" до 120

далее при 120 Спирита и 120 Резиста 4лвлом стал на прямые просто одев немного на стр (до 175 силы)
Спирит 135
Резист 135

Druid 5lvl ;)

Не в сети
Аватара пользователя
Novice
Novice
Сообщения: 29
Зарегистрирован: 18 фев 2021, 13:10
Репутация: 0
Откуда: ODS

Re: Путь Лучника/Номада/Друида

Сообщение Nightwolf »

Номад (6лвл Ренж + 2й класс Воин)
С этим товарищем всё куда проще, трейним скиллы кое-как, анатомку у ювелира, хилинг у батчера и вперед лупить грушу на пару недель/месяцев.
Анатомку качал фоном между хилом бинтами сначала на псе до 45, потом на коняке до 75, затем на наёмнике до 105 - далее до 135 на Орчиш Лорде.
Начал с мейсы до 135, птом Сворд, потом Фенс Врестлинг.

Nomad 5lvl

Не в сети
Neophyte
Сообщения: 3
Зарегистрирован: 03 сен 2022, 20:38
Репутация: 0

Re: Путь Лучника/Номада/Друида

Сообщение Naskan811 »

Спасибо гайд просто огонь

Не в сети
Apprentice
Apprentice
Сообщения: 56
Зарегистрирован: 18 авг 2021, 15:36
Репутация: 1

Re: Путь Лучника/Номада/Друида

Сообщение Demon »

Спасибо за гайд, уважение, респект все дела