Пожелания/советы по улучшению/доработки приветствуются.
Расчитан на 2х чаров, для спаринга необходима сумка с арморами, щитами, а так же - ножами, мейсами, бинтами и прочим.
Что делает этот скрипт: одевается с сундука. Отображает количество оставшегося армора/ножей/бинтов.
Берет по 500 бинтов из сундука.
Хиляется сам, отходит при малом количестве жизни своей/противника.
Хиляет противника, когда у него мало жизни.
Качает по очереди : реслинг до 90, сворд, фенс, мейс, докачивает реслинг.
При силы больше 120 берет хитер из пака, если хитер не найден - берет кайт шилд. При ГМ парринга перестает брать щиты из сумки.
Работает на версии РС 3.0 и выше.
Code: Select all
Program Sparring;
{$Include 'move_v0_2.inc'}
Const
Oponent = $; // Айди опонента
OneSec = 1000;
ArmorPack = $; // Айди сундука с арморами
Bandages = $0E21;
WAR_X = ; // координата Х спарринга
WAR_Y = ; // координата У спарринга
HEAL_X = ; // координата Х куда отходить при лечении
HEAL_Y = ; // координата У куда отходить при лечении
EN_HEAL_X = ; // координата Х лечения противника
EN_HEAL_Y = ; // координата У лечения противника
type sparringrecord = Record
id : cardinal;
name : string;
layer : byte;
msgflag : boolean;
end;
var sparring : array[0..6] of sparringrecord;
healhp,okhp : byte;
timec : integer;
procedure SetVars;
begin
//sparring[0].id := ; // определение переменной происходит в функции проверки статов
//sparring[0].name := ''; // определение переменной происходит в функции проверки статов
sparring[0].layer := LhandLayer;
sparring[0].msgflag := true;
sparring[1].id := $13F2;
sparring[1].name := 'ringmail gloves';
sparring[1].layer := GlovesLayer;
sparring[1].msgflag := true;
sparring[2].id := $13C4;
sparring[2].name := 'chain tunic';
sparring[2].layer := TorsoLayer;
sparring[2].msgflag := true;
sparring[3].id := $13BB;
sparring[3].name := 'chain coif';
sparring[3].layer := HatLayer;
sparring[3].msgflag := true;
sparring[4].id := $13EF;
sparring[4].name := 'chain sleeves';
sparring[4].layer := ArmsLayer;
sparring[4].msgflag := true;
sparring[5].id := $13C3;
sparring[5].name := 'chain leggings';
sparring[5].layer := PantsLayer;
sparring[5].msgflag := true;
//sparring[6].id := ; // определение переменной происходит в функции проверки скилов
//sparring[6].name := ''; // определение переменной происходит в функции проверки скилов
sparring[6].layer := RhandLayer;
sparring[6].msgflag := true;
timec := timer;
healhp := GetmaxHP(self) / 3;
okhp := GetmaxHP(self);
end;
*ресенд удален*
procedure OpenContainer(contype:cardinal);
begin
wait(OneSec);
ClearJournal;
FindDistance := 4;
UseObject(contype);
ClickOnObject(contype);
if InJournalBetweenTimes('item',OneSec,Now) <> 0 then AddToSystemJournal('Открыт контейнер');
end;
procedure CheckOponent(msgflag:boolean);
begin
if (FindType($0190,ground) <> -1) or (FindType($0191,ground) <> -1) then
begin
if finditem = Oponent then begin Attack(finditem); if msgflag then AddToSystemJournal('Противник найден') end;
end
else if msgflag then AddToSystemJournal('Противник не найден. Поиск ...'); wait(500); exit;
end;
*реконнект удален*
{procedure checkwait(waitlength:cardinal);
begin
if timer - timec > waitlength then AddToSystemJournal('Какие-то тормоза. задержка '+IntToStr(timer-timec)+' мс')
else wait(waitlength-(timer - timec));
end;}
procedure HealEnemy;
var tmp_bandages,tmp_rhand,tmp_lhand : cardinal;
begin
if TargetPresent then CancelTarget;
tmp_lhand := ObjAtLayer(LhandLayer);
tmp_rhand := ObjAtLayer(RhandLayer);
WaitTargetObject(Oponent);
wait(100);
tmp_bandages := FindType(Bandages,backpack);
useobject(tmp_bandages);
wait(100);
if tmp_lhand <> 0 then equip(LhandLayer,tmp_lhand);
wait(100);
if tmp_rhand <> 0 then equip(RhandLayer,tmp_rhand);
wait(7400);
end;
procedure CheckEnemyHP;
begin
if (GetHP(Oponent) < (GetMaxHP(Oponent) / 3)) then
begin
GotoXY(HEAL_X,HEAL_Y,false,0);
while GetHP(Oponent) < (GetMaxHP(Oponent) - 20) do HealEnemy;
GotoXY(WAR_X,WAR_Y,false,0);
end;
if (GetX(Oponent) = EN_HEAL_X) and (GetY(Oponent) = EN_HEAL_Y) and (GetHP(Oponent) < GetMaxHP(Oponent)) then HealEnemy;
end;
function CheckSkills:integer;
begin
WaitConnection('begin check skills');
if (GetSkillValue('Wrestling') < 90.0) or (str < 150) then
begin result := 5; exit; end
else
begin
WaitConnection('variables checkskills');;
if GetSkillValue('Swordsmanship') < 100.0 then
begin sparring[6].id := $0EC4; sparring[6].name := 'skinning knife'; result := 6; exit; end;
if GetSkillValue('Fencing') < 100.0 then
begin sparring[6].id := $0F51; sparring[6].name := 'dagger'; result := 6; exit; end;
if GetSkillValue('Mace Fighting') < 100.0 then
begin sparring[6].id := $0DF2; sparring[6].name := 'sceptre'; result := 6; exit; end;
if (GetSkillValue('Wrestling') < 100.0) then
begin result := 5; exit; end;
if (GetSkillValue('Fencing') = 100.0) and (GetSkillValue('Swordsmanship') = 100.0)
and (GetSkillValue('Mace Fighting') = 100.0) and (GetSkillValue('Wrestling') = 100.0)
and (GetSkillValue('Parrying') = 100.0) then begin SetARStatus(false); disconnect; end;
end;
end;
function CheckStats:boolean;
var tmp_id : cardinal;
begin
WaitConnection('begin checkstat');
if GetSkillValue('Parrying') = 100.0 then begin result := false; exit; end;
tmp_id := FindType($1B76,ArmorPack); // хитер
if (str < 120) or (tmp_id = 0) then begin sparring[0].id := $1B74; sparring[0].name := 'metal kite'; end
else begin sparring[0].id := $1B76; sparring[0].name := 'heater'; end;
result := true;
end;
procedure CheckBandages(msgflag : boolean);
var band_self,band_cont : integer;
band_self_id,band_cont_id : cardinal;
begin
WaitConnection('begin checkbandages');
band_self_id := FindType(Bandages,backpack); wait(50);
band_self := GetQuantity(band_self_id);
if msgflag then AddToSystemJournal('бинтов на начало макроса: '+IntToStr(band_self));
if band_self < 100 then
begin
WaitConnection('< 100 do bandages');
if band_self_id = 0 then band_self_id := backpack;
AddToSystemJournal('добираю бинты из сундука');
band_cont_id := FindType(Bandages,ArmorPack);
if band_cont_id <> 0 then
begin
moveitem(band_cont_id,500,band_self_id,1,1,1); wait(500);
band_cont := GetQuantity(band_cont_id);
AddToSystemJournal('Остаток бинтов в сундуке : '+IntToStr(band_cont)+' шт');
if band_cont_id < 1000 then AddToSystemJournal('ВНИМАНИЕ, ПОПОЛНИТЕ ЗАПАС БИНТОВ В СУНДУКЕ!');
end;
end;
end;
function CheckMyEquip(msgflag : boolean):boolean;
var tmp_layer, tmp_id : cardinal;
tmp_true : boolean;
i : byte;
begin // Ищем в бекпаке броню и одеваем, если есть
UseObject(backpack);
CheckStats;
for i:= 0 to CheckSkills do
begin
WaitConnection('begin checkmyequip');
tmp_layer := ObjAtLayer(sparring[i].layer);
if (tmp_layer <> 0) or (i = 0) and (CheckStats = false) then result := true
else begin
WaitConnection('checking layer checkmyequip');
tmp_id := FindType(sparring[i].id,backpack);
If GetQuantity(tmp_id) <> 0 then
begin
tmp_true := false;
while not tmp_true do
begin
WaitConnection('while checkmyequip');
tmp_true := equipt(sparring[i].layer,sparring[i].id);
AddToSystemJournal(sparring[i].name+' найден в рюкзаке, одеваю');
wait(onesec/2);
end;
end;
end;
tmp_layer := ObjAtLayer(sparring[i].layer);
if (tmp_layer <> 0) or (i = 0) and (CheckStats = false) then result := true
else begin
WaitConnection('ArmorPack checkmyequip');
tmp_id := FindType(sparring[i].id,ArmorPack);
if findcount = 0 then
begin
WaitConnection('moveing item checkmyequip');
If (i <> 0) or (GetSkillValue('Parrying') < 100.0) then
If msgflag or sparring[i].msgflag then AddToSystemJournal('ЗАКОНЧИЛИСЬ >> '+sparring[i].name+' << В СУНДУКЕ');
sparring[i].msgflag := false;
result := true;
end else
begin
WaitConnection('sysmsg checkmyequip');
AddToSystemJournal('Беру из сундука '+sparring[i].name);
if (findcount - 1 = 0) and sparring[i].msgflag then
begin AddToSystemJournal('ЗАКОНЧИЛИСЬ >> '+sparring[i].name+' << В СУНДУКЕ');
sparring[i].msgflag := false;
end else AddToSystemJournal('Осталось '+IntToStr(findcount-1)+' шт');
if tmp_id <> 0 then
begin
repeat
WaitConnection('move repeat checkmyequip');
moveitem(tmp_id,1,backpack,1,1,1);
wait(onesec/2);
until equipt(sparring[i].layer,sparring[i].id); end;
end;
end;
end;
end;
function startHealing:boolean;
begin
WaitConnection('begin healing');
If Life < okhp then
begin
If Life < healhp then
begin
WaitConnection('< 80 healing');
GotoXY(HEAL_X,HEAL_Y,false,0);
repeat
WaitConnection('repeat healing');
UOSay(Chr(39)+'pc heal self');
wait(7400);
until Life > okhp - 10;
CheckMyEquip(false);
GotoXY(WAR_X,WAR_Y,false,0);
end;
UOSay(Chr(39)+'pc heal self');
wait(7400);
end else result := true;
end;
procedure StartMacro;
begin
If waitresend then AddToSystemJournal('запуск макроса');
OpenContainer(ArmorPack);
CheckBandages(true);
CheckOponent(true);
If CheckMyEquip(true) then AddToSystemJournal('окончена проверка вещей');
If startHealing then AddToSystemJournal('чар отхилен и рвется в бой');
GotoXY(WAR_X,WAR_Y,false,0);
AddToSystemJournal('выходим на исходную позицию');
wait(2*OneSec);
end;
*инициализация скрипта удалена*