Показать сообщение отдельно
Старый 11.03.2008, 22:22   #29
Рыцарь
 
Аватар для NLObP
 
Регистрация: 25.02.2008
Адрес: г.Волгоград
Сообщений: 2,009
Сказал Спасибо: 1,285
Имеет 1,458 спасибок в 793 сообщенях
NLObP пока неопределено
По умолчанию Re:

Цитата:
Сообщение от 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.
__________________
| Для самых ленивый | Телепаты в отпуске |Мы работаем над этим |
Не умеешь - учись, не хочешь учиться - плати © Суровый Закон Жизни


NLObP вне форума   Ответить с цитированием