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

Спаринг

Only working scripts
Post Reply
Miralex
Developer
Developer
Posts: 656
Joined: 11.03.2005 19:12
Contact:

Спаринг

Post by Miralex »


Возможности скрипта:

- Умеет "качать" (по очереди) 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.
*13*
Neophyte
Neophyte
Posts: 13
Joined: 17.02.2006 20:21

Post by *13* »

самый оптимальный, самый легконастраиваемый и практичный скрипт на спаринг из всех, что тут есть. спасибо Миралекс :wink:
Edred
Moderator
Moderator
Posts: 559
Joined: 28.03.2006 21:29

Post by Edred »

Он написан и годится только под определенный шард. Также как и все остальные, лежащие здесь. И не удивительно.
Post Reply