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