Если у кого будут дополнения / предложения / поправки - не стесняйтесь оставить комментарий.
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 с партнером
_ _
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.
Код: Выделить всё
// Прокачка кемпинга. Стопка хвороста на полу на расстоянии 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.
Код: Выделить всё
// Прокачка трекинга, оснащённого блокирующим меню. Можно запускать в фоне пока где-то бегаешь.
// Или в связке со скриптами на кемпинг, рыбалку; прочими, завязанными на использование предметов.
// Нельзя запускать в связке со скриптами, использующими активные навыки (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.
Код: Выделить всё
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.
Желательно, чтоб ренж был капитаном (будет кидать за борт мусор).
Так же, советую руками набить тайлов для рыбалки (так качественней, чем с тем скриптом на автосбор тайлов).
То есть, дабл-клил на удочку - на клетку в воде и потом текстом на инже, например, ,infotile и ласттаргет - убираем лишние Z: / Y: / Tile:
и добавляем в список / блокнот (всего около 50 тайлов норм)
_ _
в данной версии будет еще и костры палить на лодке (без мангала!!!) - прирост 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.
кидает ветку, берет бинты с пола, кушает, юзает анимал лор и начинает лечить (если у гритвирма хп меньше 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 плюс на лету качаем и 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.
Идея лупить по грит вирму, но можно и по файту.
Еда, Стрелы, Сундук с луками - все на полу.
Лучник проверяет уровень здоровья жертвы - если меньше пол хп - отбегает за препятствие (стена, угол дома, шкаф - на ваше усмотрение)
Пьет банки стр/декс (если такие есть) с пола.
Качает фоном Animal Lore (можно активировать Tracking или Camping)
Позже, если руки дойдут, поправлю "по-человечески" переключалку, пока шо просто надо раскомментировать (убрать "//") возле скила, который хотим запустить в фоновом режиме
на примере выше будет юзать Animal Lore// == useskill
// Camping;
AnimalLore;
//Tracking;
// == useskill END
Код: Выделить всё
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.