Возможности скрипта:
- Умеет "качать" (по очереди) 1, 2 или сразу 3 ударных навыка (кроме мейсы);
- Быстро хилит бинтами, что способствует хорошему росту навыка Healing;
- Умеет воскрешать напарника, причем только его;
- При смерти прощает напарника (говорит ".forgivethee");
- Может использовать тотема в качестве страховки (по желанию пользователя);
- Может брать щиты (по желанию пользователя);
- Может пить бутылки со стаминой, если она равна нулю (по желанию пользователя);
- Все вещи использует с пола или с сундука (оружие, бутылки и щиты);
- Каждый воин работает со своим сундуком;
- На прокачку каждого навыка скрипт выделяет указаное вами время. Время по умолчанию - 1 час на каждый навык. Причем если при прокачке навыка закончилось оружие, то автоматически переходит к прокачке следующего навыка.
Настройка скрипта:
Скрипт настраивается в двух местах. В начале (в разделе обьявления констант) и в конце (после слова Begin). Поля, которые необходимо настроить - помечены коментариями {Need Setup}.
Code: Select all
HeaterType = $1B74; {Need Setup}
ArmorBoxType = $0E43; {Need Setup}
CriticalHP = 60; {Need Setup}
Code: Select all
UseDagerTime := 60 * 60 * 1000; {Need Setup} {Set 0 if you don't want use it}
UseCatanaTime := 60 * 60 * 1000; {Need Setup} {Set 0 if you don't want use it}
UseHandsTime := 60 * 60 * 1000; {Need Setup} {Set 0 if you don't want use it}
UseHeater := true; {Need Setup}
UseTotem := true; {Need Setup}
CutCorpse := true; {Need Setup}
Char[1] := $00123456; {Need Setup}
Char[2] := $01123445; {Need Setup}
Расстановка воинов:
Воинов ставим лицом к лицу. Под ноги им кидаем еду. Сразу за спинами воинов ставим каждому по сундуку. Также за спинами воинов, сбоку кидаем каждому бинты. FindDistance = 1. Поэтому, если верно все расставить (например как я описал), то каждый воин будет видеть только свой сундук и использовать только свои бинты.
Сам скрипт:
Code: Select all
Program fighter;
var HungryTime, HealTime : Cardinal;
EnemyID, ArmorBox : cardinal;
UseHeater, UseTotem, CutCorpse : Boolean;
UseDagerTime, UseCatanaTime, UseHandsTime, DT, CT, HT : Cardinal;
Char : Array[1..2] of Cardinal;
Const
EnemyType1 = $0190;
EnemyType2 = $0191;
GhostType1 = $0192;
GhostType2 = $0193;
BandageType = $0E21;
DagerType = $0F51;
CatanaType = $13FE;
HeaterType = $1B74; {Need Setup}
StamPotionType = $0F0B;
ArmorBoxType = $0E43; {Need Setup}
CriticalHP = 60; {Need Setup}
{$Include 'all.inc'}
procedure FullDisconnect;
begin
SetARStatus(false);
Disconnect;
end;
function OpenArmorBox : Boolean;
begin
WaitConnection(2000);
CheckSave;
ArmorBox := FindType(ArmorBoxType, Ground);
if ArmorBox = 0 then
begin
AddToSystemJournal('Error: ArmorBox not finded');
FullDisconnect;
Result := false;
Exit;
end
else Result := true;
UseObject(ArmorBox);
wait(2000);
end;
procedure TotemHeal;
var TimeToWait : Integer;
begin
if Dead then Exit;
if (HP > CriticalHP) then Exit;
TimeToWait := 4 * 1000;
{ждем, пока можно сказать Heal}
while (Timer < (HealTime + TimeToWait)) do wait(100);
if (HP < MaxHP) and (not Dead) then
begin
UOSay('heal');
HealTime := Timer;
end;
wait(200);
end;
procedure Heal(Enemy : Cardinal);
var Bandages : Cardinal;
stime : TDateTime;
begin
if GetType(Enemy) = 0 then Exit;
Bandages := FindType(BandageType, Ground);
if Bandages = 0 then
begin
AddToSystemJournal('Error: No bandages');
Wait(1000);
Exit;
end;
if TargetPresent then
begin
CancelTarget;
Wait(1000);
end;
stime := Now;
WaitTargetObject(Enemy);
UseObject(Bandages);
WaitJournalLine(stime, 'you have healed your patient|Your patient is at full heath|You have resurrected|You could not heal him', 15000);
Wait(1000);
end;
procedure CheckWeapon;
var WeaponID : Cardinal;
begin
if TargetPresent then
begin
CancelTarget;
Wait(1000);
end;
WaitConnection(2000);
CheckSave;
{Сначала проверим щит}
if (ObjAtLayer(LhandLayer) = 0) and UseHeater then
begin
UseObject(ArmorBox);
wait(3000);
if (findtype(HeaterType, Ground) = 0) then findtype(HeaterType, ArmorBox);
WeaponID := finditem;
if WeaponID = 0 then
begin
AddToSystemJournal('Error: Heater not finded');
end
else
begin
Equip(LhandLayer,WeaponID);
AddToSystemJournal('Heater is equiped');
end;
end;
//Если в руках есть оружие, то выходим.
if ObjAtLayer(RhandLayer) > 0 then Exit;
UseObject(ArmorBox);
wait(3000);
if ((DT + UseDagerTime > Timer) or (DT = 0)) and (UseDagerTime <> 0) then
begin
if DT = 0 then
begin
AddToSystemJournal('Begin of using Dager');
DT := Timer;
end;
if (findtype(DagerType, Ground) = 0) then findtype(DagerType, ArmorBox);
WeaponID := finditem;
if WeaponID = 0 then
begin
AddToSystemJournal('Error: Dager not finded');
DT := Timer - UseDagerTime;
Exit;
end;
Equip(RhandLayer,WeaponID);
AddToSystemJournal('Dager is equiped');
Exit;
end;
if ((CT + UseCatanaTime > Timer) or (CT = 0)) and (UseCatanaTime <> 0) then
begin
if CT = 0 then
begin
AddToSystemJournal('Begin of using Catana');
CT := Timer;
end;
if (findtype(CatanaType, Ground) = 0) then findtype(CatanaType, ArmorBox);
WeaponID := finditem;
if WeaponID = 0 then
begin
AddToSystemJournal('Error: Catana not finded');
CT := Timer - UseCatanaTime;
Exit;
end;
Equip(RhandLayer,WeaponID);
AddToSystemJournal('Catana is equiped');
Exit;
end;
if ((HT + UseHandsTime > Timer) or (HT = 0)) and (UseHandsTime <> 0) then
begin
if HT = 0 then
begin
AddToSystemJournal('Begin of using Hands');
HT := Timer;
end;
Exit;
end;
DT := 0;
CT := 0;
HT := 0;
end;
procedure CheckStam;
var StamPotion : Cardinal;
begin
if TargetPresent then
begin
CancelTarget;
Wait(1000);
end;
WaitConnection(2000);
CheckSave;
if Dead then Exit;
if Stam <> 0 then Exit;
if (findtype(StamPotionType,Ground) = 0) then findtype(StamPotionType,ArmorBox);
StamPotion := finditem;
if StamPotion = 0 then Exit;
UseObject(StamPotion);
end;
procedure CheckWar;
begin
if TargetPresent then
begin
CancelTarget;
Wait(1000);
end;
WaitConnection(2000);
CheckSave;
if (wartargetid <> EnemyID) or (iswarmode(self) = false) then attack(EnemyID);
if IsDead(EnemyID) then SetWarMode(false);
end;
procedure CheckDead;
var c : Integer;
begin
WaitConnection(2000);
CheckSave;
if Dead then
begin
AddToSystemJournal('I''m Dead. Waiting while anybody resurect me.');
SetWarMode(true);
UOSay('.forgivethee');
WaitGump('1');
wait(5000);
while (Dead) do
begin
Wait (2000);
WaitGump('1');
end;
wait (2000);
WaitConnection(2000);
CheckSave;
Hungry(1, -1);
c := 0;
while (HP < MaxHP) and (c < 3) and (not Dead) do
begin
UOSay('heal');
Wait(3000);
c := c + 1;
end;
end;
end;
procedure CheckGhost;
var c : Integer;
begin
WaitConnection(2000);
CheckSave;
if (GetType(EnemyID) <> GhostType1) and (GetType(EnemyID) <> GhostType2) then Exit;
AddToSystemJournal('Detecting Ghost. Trying resurect him.');
SetWarMode(false);
Heal(EnemyID);
Wait(2000);
WaitConnection(2000);
CheckSave;
Heal(EnemyID);
Wait(1000);
c := 0;
if Dead then Exit;
while (WarTargetID = 0) or (c > 15) do
begin
Wait(1000);
c := c + 1;
end;
end;
Begin
{Начальная иницилизация}
HungryTime := 0;
HealTime := 0;
DT := 0;
CT := 0;
HT := 0;
{Now Setup 3 times. 1 Hour = 60*60*1000}
UseDagerTime := 60 * 60 * 1000; {Need Setup} {Set 0 if you don't want use it}
UseCatanaTime := 60 * 60 * 1000; {Need Setup} {Set 0 if you don't want use it}
UseHandsTime := 60 * 60 * 1000; {Need Setup} {Set 0 if you don't want use it}
UseHeater := true; {Need Setup}
UseTotem := true; {Need Setup}
CutCorpse := true; {Need Setup}
Char[1] := $00C9C36B; {Need Setup}
Char[2] := $010602D3; {Need Setup}
FindDistance := 1;
WaitConnection(2000);
CheckSave;
CheckDead;
wait(5000);
if Self = 0 then
begin
AddToSystemJournal('Error : Self = 0.');
Exit;
end;
if (Char[1] <> Self) then EnemyID := Char[1]
else EnemyID := Char[2];
CheckGhost;
if not OpenArmorBox then Exit;
AddToSystemJournal('Open ArmorBox compete');
FindType(DagerType, ArmorBox);
AddToSystemJournal('There are ' + IntToStr(FindFullQuantity) + ' dagers');
FindType(CatanaType, ArmorBox);
AddToSystemJournal('There are ' + IntToStr(FindFullQuantity) + ' catanas');
FindType(HeaterType, ArmorBox);
AddToSystemJournal('There are ' + IntToStr(FindFullQuantity) + ' heaters');
FindType(StamPotionType, ArmorBox);
AddToSystemJournal('There are ' + IntToStr(FindFullQuantity) + ' stam potions');
FindType(BandageType, Ground);
AddToSystemJournal('There are ' + IntToStr(FindFullQuantity) + ' bandages');
SetARStatus(true);
while true do
begin
WaitConnection(2000);
CheckSave;
if UseTotem then TotemHeal;
CheckDead;
CheckGhost;
CheckWar;
CheckWeapon;
CheckStam;
if UseTotem then TotemHeal;
{Eat by timer}
if Timer > (HungryTime + (15 * 60 * 1000)) then
begin
WaitConnection(3000);
CheckSave;
CheckDead;
if TargetPresent then
begin
CancelTarget;
Wait(1000);
end;
Hungry(1, -1);
HungryTime :=Timer;
end;
Heal(EnemyID);
{--- Check corpse ---}
if CutCorpse then
begin
if FindType($2006, Ground) <> 0 then
begin
if TargetPresent then CancelTarget;
WaitTargetObject(FindItem);
if (FindType($0F51, ArmorBox) <> 0) then
begin
UseObject(FindItem);
wait(2000);
end
else if (FindType($0F51, BackPack) <> 0) then
begin
UseObject(FindItem);
wait(2000);
end;
end;
end;
{--- End Check corpse ---}
wait(1000);
end;
End.