Цитата:
Сообщение от begon
Люди, неужели я так многого прошу... Вы же скриптеры вам что так помочь трудно?
|
Вечерком гляну, потерпи.
Код:
//Скрипт для манора by Lafine
//modified by NLObP
//Включаем скрипт и потом социальное YES для начала работы
{
Скрипт распространяется как есть, и я не несу ответственности
за то, что ВЫ натворили у себя, его используя.
}
//***************************************************************
const
Name='Mathilda'; //имя чара для которого включаем скрипт
MobID=1000265; //ID моба Monster Eye Searcher 265 + 1000000
SeedID=5025; //Golden Coda
HarvesterID=5125;
HPotionID=1060;
MaxMobCount=20;
PercentHP=70; //% HP при котором начинать пить бутылки
MEsit=55; //при каком количестве хп в % надо сесть и подкопить хп
MEup=90; //при каком количестве хп в % надо встать после отдыха
//установить константу в зависимости от типа игры (С4 или Интерлюд)
IL=true; //true - IL, false - C4
//***************************************************************
var
MobsObjectID: array [1..MaxMobCount] of integer;
offs1, i, count:integer;
//мои
CurHP, MaxHP, MyID, x, y, z, but, sidim, vstaem : integer;
//МОбов
MobX, MobY, MobZ : integer;
status, sit : boolean; //Начинать работать или нет
SeedObjectID, HarvesterObjectID, HPotionObjectID : integer;
timer1: TTimer;
//***************************************************************
procedure Init; //Вызывается при включении скрипта
begin
if il then begin
//CharInfo
offs1:=48; //44 для С4, 48 для IL
end else begin
offs1:=44;
end;
count:=1;
timer1:=TTimer.Create(nil);
timer1.OnTimer:=@OnTimer1;
timer1.enabled:=true; //таймер по умолчанию включен
timer1.interval:=5000; //через каждые 5сек будем обновлять
sit:=false;
status:=false;
end;
//***************************************************************
procedure Free; //Вызывается при выключении скрипта
begin
for i:=1 to MaxMobCount do begin
MobsObjectID[i]:=0;
end;
timer1.free;
end;
//***************************************************************
procedure OnConnect(WithClient: Boolean); //Вызывается при установке соединения
begin
end;
//***************************************************************
procedure OnDisonnect(WithClient: Boolean); //Вызывается при потере соединения
begin
end;
//******************************************************************************
//сообщения в приват, на сервер не отправляются
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;
//***************************************************************
procedure OnTimer1(Sender: TObject);
begin
if (CurHP<but) and (HPotionObjectID<>0) then begin
UseItem(HPotionObjectID);
end;
if (CurHP<sidim) and (sit=false) then begin
buf:=HStr('45 00 00 00 00 00 00 00 00 00 '); //сесть
SendToServerEx(Name);
sit:=true;
end;
if (CurHP>vstaem) and (sit=true) then begin
buf:=HStr('45 00 00 00 00 00 00 00 00 00 '); //встать
SendToServerEx(Name);
sit:=false;
end;
end;
//***************************************************************
function ItemSearch(ItemName:integer):Cardinal;
var i,y:integer;
TempName:Cardinal;
begin
result:=0;
i:=1;
while i<Length(pck)-4 do begin
y:=i;
TempName:=ReadD(y);
Inc(i);
if TempName=ItemName then begin
result:=ReadD(y-8);
end;
end;
end;
//***************************************************************
procedure Target(ObjectID : Integer);
begin
buf:=#$04;
WriteD(ObjectID);
WriteD(x);
WriteD(y);
WriteD(z);
WriteC(0);
SendToServerEx(Name);
end;
//***************************************************************
procedure UseItem(ObjectID : integer);
begin
buf:=#$14;
WriteD(ObjectID);
WriteD(0);
SendToServerEx(Name);
end;
//***************************************************************
//2F=RequestMagicSkillUse:dMagicID)d(CtrlPressed)b(ShiftPressed)
procedure MagicSkillUse(MagicID:integer);
begin
buf:=#$2F;
WriteD(MagicID);
WriteD(0);
WriteC(0);
SendToServerEx(Name);
end;
//***************************************************************
procedure StatsUpdate;
var
i: integer;
begin
for i:=0 to ReadD(6)-1 do begin
case pck[i*8+10] of
#$09: CurHP:=ReadD(i*8+14);
#$0A: MaxHP:=ReadD(i*8+14);
end;
end;
if (MaxHP<>0) then begin // вычисляем процентное соотношение хп
but:=Round((MaxHP/100)*PercentHP); // при каком количестве хп юзать бутылку лечения
sidim:=Round((MaxHP/100)*MEsit); // при каком количестве хп надо сесть и подкопить хп
vstaem:=Round((MaxHP/100)*MEup); // при каком количестве хп надо встать после отдыха
end;
end;
//******************************************************************************
// вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
//****************************************************************************
//не обрабатываем пустые пакеты
if pck='' then exit;
//****************************************************************************
if (ConnectName=Name) and FromServer then begin
case pck[1] of
//Тут я под пакет MoveToLocation спрятал выборку следующего моба для атаки. Спрятал в этот пакет, потому что
//двигаются часто кто нить рядом, а ставить при обработке при любом пакете - слишком нагружать скрипт
#$01: begin
For i:=1 to MaxMobCount do begin
if MobsObjectID[i]<>0 then begin
Say('Target...');
Target(MobsObjectID[i]);
// if (SeedObjectID<>0) then UseItem(SeedObjectID);
// say('Use Seed');
// count:=i;
end;
end;
end;
#$04: begin
Say('Запомнил координаты и ID');
//пакет с инфой о моём чаре
i:=2;
X:=ReadD(i); //получаю координату х моего чара
Y:=ReadD(i); //получаю координату у моего чара
Z:=ReadD(i); //получаю координату z моего чара
//Запоминаем ИД
i:=18;
MyID:=ReadD(i); //получаю ид моего чара
//смещение переменное, зависит от имени (LenName*2+2)
i:=i+(Length(Name)*2+2)+offs1; //44 для С4, 48 для IL
MaxHP:=ReadD(i);
CurHP:=ReadD(i);
end;
//принят пакет Die
#$06: begin
if (MobsObjectID[count]=ReadD(2)) and (HarvesterObjectID<>0) then begin
UseItem(HarvesterObjectID);
say('Use Harvester');
end;
end;
//StatsUpdate
#$0E: begin
//Пока у моба не 0 ХП забрасываем семечку. Если данные о своих ХП то смотрим и выпиваем бутылку
if (MyID=ReadD(2)) then StatsUpdate; //обновление информации о хп
if (MobsObjectID[count]=ReadD(2)) then
if (ReadD(14)<>0) and (SeedObjectID<>0) then begin
UseItem(SeedObjectID);
say('Use Seed');
end;
end;
//принят пакет DeleteObject
#$12: begin
for i:=1 to MaxMobCount do begin
if (MobsObjectID[i]=ReadD(2)) then MobsObjectID[i]:=0;
end;
end;
//Если приходит пакет NPCInfo от сервера, то проверяем чтобы это был нужный нам моб
//и находился в нужной области координат, то запоминаем ИД моба в массив.
//16=NpcInfo:h(ObjectID)d(NpcTypeID)d(IsAttackable)d(X)d(Y)d(Z)d(Heading)d(d)
//d(Maspd)d(Paspd)d(runSpd)d(walkSpd)d(swimRSpd)d(swimWSpd)d(flRSpd)d(flWSpd)
//d(FlyRSpd)d(FlyWSpd)f(ProperMul)f(Paspd)f(CollisRadius)f(CollisHeight)d(RHand)
//d(d)d(LHand)b(nameabove)b(isRun)b(isInFight)b(isAlikeDead)b(isSummoned)s(Name)
//s(Title)d(d)d(d)d(karma?)d(abnEffect)d(d)d(d)d(d)d(d)b(c)b(Team)f(collisRadius)
//f(collisHeight)d(d)
#$16: begin
say('NPCInfo...');
//если можно атаковать
if (MobID=ReadD(6)) and (ReadD(10)=1) and (pck[120]=#$00) then begin
//перебираем базу и ищем свободную ячейку в ней
for i:=1 to MaxMobCount do begin
//запоминаем моба в свободную ячейку
if (MobsObjectID[i]=0) or (MobsObjectID[i]<>ReadD(2)) then begin
MobsObjectID[i]:=ReadD(2);
count:=i;
Say('count='+inttostr(count)+' i='+inttostr(i));
break;
end;
end;
end;
end;
//Если приходит пакет удаления объекта и ИД объекта равен мобу в массиве, то удаляем ИД с массива
//пакет просмотра инвентаря. Находим ИД семян, харвестера и бутылок для дальнейшего использования
#$1B: begin
SeedObjectID:=ItemSearch(SeedID);
HarvesterObjectID:=ItemSearch(HarvesterID);
HPotionObjectID:=ItemSearch(HPotionID);
end;
//InventoryUpdate
#$27: begin
case ReadD(12) of
1060,1061: begin //Healing Potion, Lesser Healing Potion
if HPotionObjectID=0 then begin
HPotionObjectID:=ReadD(8);
Say('Запомнили ID HPotion...');
end;
end;
5125: begin //Harvester
if HarvesterObjectID=0 then begin
HarvesterObjectID:=ReadD(8);
Say('Запомнили ID Harvester...');
end;
end;
5025: begin //Golden Coda
if SeedObjectID=0 then begin
SeedObjectID:=ReadD(8);
Say('Запомнили ID Seed...');
end;
end;
end;
end;
{ //Тут проверяем закончилось ли действие Баффа и если закончилось то еще раз используем
#$7F: begin
end;
} //приходит побтверждение что цель выбрана и атакуем цель
{ #$A6: begin
if (MobsObjectID[count]=ReadD(2)) then begin
Target(MobsObjectID[count]);
say('Attack...');
end;
end;
} end;
end;
//****************************************************************************
if (ConnectName=Name) and FromClient then begin
case pck[1] of
#$1B: begin
case ReadD(2) of
//социальное действие Yes для начала манора
$06: begin
//не передаем серверу
pck:='';
Status:=true;
//RequestItemList
buf:=#$0F;
SendToServerEx(Name);
end;
//социальное действие No для окончания
$05: begin
//не передаем серверу
pck:='';
Status:=false;
end;
end;
end;
//ValidatePosition пакет от клиента с моими кординатами
#$48: begin
X:=ReadD(2); //получаю координату х
Y:=ReadD(6); //получаю координату у
Z:=ReadD(10); //получаю координату z
end;
end;
end;
end.