Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)

Paste

Pasted as Plain Text by 1233 ( 7 years ago )
Program Sparring;

var
sparringPartner, weaponContainer, weaponCheckTimer, anatomyTimer, hungryTimer : Cardinal;
safeX, safeY, warX, warY, w : Integer;
myWarMode, partnerWarMode : String;
containerOpenTime : TDateTime;

const
maleType = $0190;
femaleType = $0191;
bandagesType = $0E21;
bloodyBandagesType = $0E20;

{Настройки скрипта}
weaponContainerType = $09A9; // Тайп сундука или сумки в которой лежит оружие и щиты
weaponType = $0001; // Тайп оружия
shieldType = $1B76; // Тайп щита
useShields = true; // true - одевать щит, false - нет
healthDelta = 60; // Сколько демеджа можем выхилить
minPartnerHealthPercent = 70; // Процентное значение ХП у спарринг партнера при котором с него снимается Вар

{$Include 'all.inc'}

Procedure DisconnectWithMessage(message : String);
Begin
    AddToSystemJournal(message);
    SetARStatus(false);
    Disconnect;
End;

Procedure Anatomy;
Begin
    If (Timer > anatomyTimer + 10000) or (anatomyTimer = 0) then Begin
        WaitTargetObject(sparringPartner);
        UseSkill('Anatomy');
        anatomyTimer := Timer;
    End;
End;

Procedure CheckHungry;
Begin
    If (Timer > hungryTimer + 5*60*1000) or (hungryTimer = 0) then Begin
        Hungry(1, Ground);
        hungryTimer := Timer;
    End;
End;

Procedure FindSparringPartner;
Begin
    Ignore(self);
    If (FindType(maleType, Ground) = 0) then FindType(femaleType, Ground);
    If (FindItem <> 0) Then Begin
        AddToSystemJournal('Sparring Partner: '+GetName(FindItem));
        sparringPartner := FindItem;
    End
    Else DisconnectWithMessage('Error: Sparring partner not found');
End;

Procedure CreateSafePoints;
var partnerX, partnerY : Integer;
Begin
    warX := GetX(self);
    warY := GetY(self);
    partnerX := GetX(sparringPartner);
    partnerY := GetY(sparringPartner);
    If (warX <> partnerX) and (warY <> partnerY) then DisconnectWithMessage('Error: chars must stand on one line, 3-5-7 or 1-5-9 axis (on numeric keyboard)');
    If warY = partnerY then Begin
        safeY := partnerY;
        If warX < partnerX then safeX := warX-1 else safeX := warX+1;
        If warX = partnerX then DisconnectWithMessage('Error: chars on the same spot');
    End;
    If warX = partnerX then Begin
        safeX := warX;
        If warY < partnerY then safeY := warY-1 else safeY := warY+1;
    End;
End;

Procedure OpenContainer(forced : Boolean);
// Если forced - true, просто открываем контейнер с вещами
// Если forced - false, проверяем, был ли реконнект с последнего открытия контейнера
Begin
    WaitConnection(3000);
    If forced or (containerOpenTime < ConnectedTime) then Begin
        UseObject(weaponContainer);
        Wait(1000);
        CheckSave;
        containerOpenTime := Now;
        AddToSystemJournal('Container opened at '+DateTimeToStr(Now));
    End;
End;

Procedure CheckContainer;
Begin
    WaitConnection(3000);
    If (FindType(weaponContainerType, Ground) = 0) then DisconnectWithMessage('Container for weapons and shields not found');
    weaponContainer := FindItem;
    containerOpenTime := Now;
    OpenContainer(true);
End;

Procedure CheckBandages;
Begin
    If (Count(bloodyBandagesType) > 200) then Stack(bloodyBandagesType, $0000);
    If (FindType(bandagesType, Ground) = 0) then DisconnectWithMessage('No bandages found, can''t heal');
End;

Procedure FullHeal;
Begin
    While (HP < MaxHP) do Begin
        If TargetPresent then CancelTarget;
        If (FindType(bandagesType, Ground) = 0) then Break;
        WaitTargetSelf;
        UseObject(FindItem);
        WaitJournalLine(Now, 'You healed|You couldn', 10000);
    End;
End;

Function HPToPercent(targetID:Cardinal):Integer;
Begin
    Result := Round(100 * GetHP(targetID) / GetMaxHP(targetID));
End;

Procedure WeaponCheck;
Begin
    If (Timer > weaponCheckTimer + 2*30*1000) or (weaponCheckTimer = 0) then Begin
        // Если в руке с оружием ничего нет
        If (ObjAtLayer(RHandLayer) = 0) then Begin
            OpenContainer(false);
            If (FindType(weaponType, weaponContainer) <> 0) then Equip(RHandLayer, FindItem)
            Else AddToSystemJournal('Can''t find weapon in container');
        End;
        // Если юзаем щиты и в руке с щитом ничего нет
        If (useShields = true) and (ObjAtLayer(LHandLayer) = 0) then Begin
            OpenContainer(false);
            If (FindType(shieldType, weaponContainer) <> 0) then Equip(LHandLayer, FindItem)
            Else AddToSystemJournal('Can''t find shield in container');
        End;
        weaponCheckTimer := Timer;
    End;
End;

Begin
    FindDistance := 1; // Дистанция для поиска бинтов, сундуков и т.д.
    anatomyTimer := 0;
    hungryTimer := 0;
    weaponCheckTimer := 0;
    CheckHungry;
    FindSparringPartner; // Ищем партнера по спаррингу
    CreateSafePoints; // Проверяем расстановку чаров
    CheckContainer; // Ищем и открываем сумку
    CheckBandages; // Проверяем бинты
    WeaponCheck; // Проверяем оружие и щиты
    FullHeal; // Если надо - хилимся до полного ХП
    // SetGlobal('stealth', myWarMode, false);
    myWarMode := GetName(self) + 'WarMode';
    partnerWarMode := GetName(sparringPartner) + 'WarMode';
    SetGlobal('stealth', myWarMode, 'true');
    WaitConnection(3000);
    Repeat // Ждем пока спарринг партнер не сообщит о готовности
        Wait(500);
        Anatomy;
    Until (GetGlobal('stealth', partnerWarMode) = 'true');
    // Оба готовы к спаррингу
    While (not Dead) do Begin
        If (not WarMode) then SetWarMode(true);
        Attack(sparringPartner);

w := 45;
Repeat
    Anatomy;
    CheckHungry;
    WeaponCheck;
    Wait(100);
    w := w + 1;
    // w = 50?
    If (w > 45) and (FindType(bandagesType, Ground) <> 0) and (HP < MaxHP) then Begin
        WaitConnection(3000);
        If TargetPresent then CancelTarget;
        UseObject(FindItem);
        WaitForTarget(5000);
        If TargetPresent then TargetToObject(self);
        w := 0;
    End;
    WaitConnection(3000);
Until (HP <= (MaxHP - healthDelta)) or (GetGlobal('stealth', partnerWarMode) = 'false') or (HPToPercent(sparringPartner) < minPartnerHealthPercent);
SetGlobal('stealth', myWarMode, 'false');
WaitConnection(3000);
NewMoveXY(safeX, safeY, true, 0, true);
SetWarMode(false);
FullHeal;
WaitConnection(3000);
NewMoveXY(warX, warY, true, 0, true);
SetGlobal('stealth', myWarMode, 'true');
WaitConnection(3000);
Repeat
    Wait(100);
Until (HP < MaxHP) OR (GetGlobal('stealth', partnerWarMode) = 'true');

    End;
End.

 

Revise this Paste

Your Name: Code Language: