Показать сообщение отдельно
Старый 27.03.2008, 22:28   #317
Новичок
 
Регистрация: 22.11.2007
Сообщений: 17
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
Rubec
По умолчанию

Цитата:
My name='NLObP"
Для мага - сложность в дистанционной атаке, очень большая сложность... для меня по крайней мере.
очень неплохо такая атака реализована в этом скрипте

Код:
//Бот_маг with 'Hachling of Star' by NLObP
    {
    Социальное действие YES включить
    Социальное действие NO выключить

    Скрипт распространяется как есть, и я не несу ответственности за то, что
    ВЫ натворили у себя, его используя.
    }

    //******************************************************************************
    Const
      Name='';      //имя чара
      Pet='';           //имя Пета
      max=500;         //max количество контролируемых мобов
      Radius=1500;    //радиус участка для поиска мобов
      DeltaZ=250;    //глубина/высота до мобов
      Distance=600;  //дистанция до моба
      windstrike=1230; //Wind Strike

    //******************************************************************************
    VAR
      NameChar: string;
      CharID, PetID, Attacker, ObjectID: integer;
      CentrKachX,CentrKachY,CentrKachZ,RadiusKachX,RadiusKachY: integer;
      CentrKachXex,CentrKachYex,RadiusKachXex,RadiusKachYex: extended;
      tempX,tempY, tempLenght: extended;
      tempZ, ColvoMobs: integer;

      xe,ye: extended;
      x,y,z,ox,oy,oz,n: integer;

      MobCurHP, MobMaxHP, CurHP, MaxHP, CurMP, MaxMP: integer;
      BotCoordX,BotCoordY,BotCoordZ: integer; //координаты бота
      BotCoordXext,BotCoordYext,BotCoordZext:extended;
      MinPutID: integer; //указывает индекс моба в базе путь до которого самый короткий
      MinPutLenght: extended; //расстояния до ближайшего моба
      timer1: TTimer; //основной таймер
      timer2: TTimer; //вспомогательный
      timerA: TTimer; //вспомогательный
      i, itm, SocialID: integer; // вспомогательная
      time1, time2: integer;
      AddMob, UnderAttack, scrready, NeedBackup, fire: boolean;

      ItemBase:   array[1..4,1..max] of integer;  // описатель предметов
      CharBase:   array[1..4,1..max] of integer;  // описатель игроков (которых не атакуем)
      MobBase:    array[1..4,1..max] of integer;  // описатель мобов вокруг
      MobBaseExt: array[1..4,1..max] of extended; // описатель мобов вокруг вспомогательная
    { 1 - ID
      2 - X
      3 - Y
      4 - Z}

    //******************************************************************************
    procedure Init; //Вызывается при включении скрипта
    begin
      UnderAttack:=false;
      itm:=0;
      NeedBackup:=false;
      scrready:=false;
      colvomobs:=0;
      timer1:=TTimer.Create(nil);
      timer1.OnTimer:=@OnTimer1;
      timer1.enabled:=False;
      timer1.interval:=1500;        //каждые 2 сек ищем ближайшего моба для атаки
      timerA:=TTimer.Create(nil);
      timerA.OnTimer:=@OnTimerA;
      timerA.enabled:=False;
      timerA.interval:=1500;        //каждые 2 сек магическая атака
      timer2:=TTimer.Create(nil);
      timer2.OnTimer:=@OnTimer2;
      timer2.enabled:=false;
      timer2.interval:=5000;
      //RequestItemList
      buf:=hstr('0F');
      SendToServerEx(Name);
    end;

    //******************************************************************************
    procedure Free; //Вызывается при выключении скрипта
    begin
      timer1.Free;
      timer2.Free;
      timerA.Free;
    end;

    //******************************************************************************
    //сообщения в приват, на сервер не отправляются
    procedure Say(msg:string);
    begin
      buf:=hstr('4A 00 00 00 00');
      WriteD(2);
      WriteS(Name);
      WriteS(msg);
      SendToClientEx(Name);
    end;

    //*******************************************************************
    function Wait(var tick: integer;Timewait: Integer): Boolean;
    // сквозная проверка без остановки скрипта (c)dmitry501
    // modifed by Sh00rGo
    var
      t: integer;
    begin
      result:=false;
      t:=Round(Time*86400);
      if t>(tick+Timewait) then begin
        if tick>0 then result:=true;
        tick:=t;
      end;
    end;

    //******************************************************************************
    procedure ReqGetItem;
    begin
      if itm=0 then begin
        timer1.enabled:=true; //включаем отсчет времени
        needbackup:=false;
        exit;
      end;
      timer1.enabled:=false; //выключаем отсчет времени
      //перебираем базу
      for i:=1 to max do begin
        //если нашли, то обнуляем
        if (ItemBase[1,i]<>0) then begin  //ObjectID
          say('ReqGetItem');
          //даем команду подобрать вещь
          buf:=#$04;
          WriteD(ItemBase[1,i]);
          WriteD(ItemBase[2,i]);
          WriteD(ItemBase[3,i]);
          WriteD(ItemBase[4,i]);
          WriteH(00);
          SendToServerEx(Name);
        end;
      end;
    end;

    //******************************************************************************
    procedure OnTimer2(Sender: TObject);
    begin
      UnderAttack:=false;     //отцепимся от атакуемого
      if itm>0 then needbackup:=true;
    end;

    //******************************************************************************
    //0E=StatusUpdate:h(ObjectID)d(AttribCount)d(AttrID)d(AttrValue)
    procedure StatusUpdate;
    var
      i: integer;
    begin
      for i:=0 to ReadD(6)-1 do begin
        case pck[i*8+10] of
          #$09: MobCurHP:=ReadD(i*8+14);
          #$0A: MobMaxHP:=ReadD(i*8+14);
        end;
      end;
      if (MobCurHP<=0) then begin
        underattack:=false;
        say('Убили!');
      end;
    end;

    //******************************************************************************
    procedure OnTimer1(Sender: TObject);
    begin
      //не вычисляем, если уже атакуем
      if UnderAttack then exit;

      MinPutID:=0;
      MinPutLenght:=99999999;

      ///ищем самого близкого к нам моба
      for i:=1 to max do begin
        if (MobBaseExt[1,i]<>0) then begin
          tempX:=MobBaseExt[2,i];
          tempY:=MobBaseExt[3,i];
          //расстояние по теореме Пифагора: c^2=a^2+b^2
          tempLenght:=int(sqrt((BotCoordXext-tempx)*(BotCoordXext-tempx)+(BotCoordYext-tempy)*(BotCoordYext-tempy)));
          if (tempLenght<MinPutLenght) and (PetID<>MobBase[1,i]) and (CharID<>MobBase[1,i]) then begin
            MinPutLenght:=tempLenght;
            MinPutID:=i;
          end;
        end;
      end;
      if (minputid<>0) then begin
          Attacker:=MobBase[1,MinPutID];
          TargetAttacker(Attacker);
          say('Атакуем моба!');
      end
       else MoveCenter;
    end;


    //******************************************************************************
    //01=MoveBackwardToLocation:d(targetX)d(targetY)d(targetZ)d(originX)d(originY)d(originZ)d(moveByMouse)
    procedure MoveDistance;
    begin
       xe:=MobBase[2,MinPutID]+Distance/4+round(random*(Distance/4));
        ye:=MobBase[3,MinPutID]+Distance/4+round(random*(Distance/4));

        x:=round(xe);
        y:=round(ye);
         z:=MobBase[4,MinPutID];

        buf:=#$01;
        WriteD(x);
        WriteD(y);
        WriteD(z);
        WriteD(BotCoordx);
        WriteD(BotCoordy);
        WriteD(BotCoordz);
        WriteD(01);
        SendToServerEx(Name);
        say('держим дистанцию');
    end;

    procedure MoveCenter;
    begin
        buf:=#$01;
        WriteD(CentrKachx);
        WriteD(CentrKachy);
        WriteD(CentrKachz);
        WriteD(BotCoordx);
        WriteD(BotCoordy);
        WriteD(BotCoordz);
        WriteD(01);
        SendToServerEx(Name);
        say('бежим в центр');
    end;
    //******************************************************************************
    procedure TargetAtt;
    begin
      buf:=#$04;
      WriteD(Attacker);
      WriteD(BotCoordX);
      WriteD(BotCoordY);
      WriteD(BotCoordZ);
      WriteC(00);
      SendToServerEx(Name);
    end;

    //***************************************************************
    //2F=RequestMagicSkillUse:h(MagicID)d(CtrlPressed)b(ShiftPressed)
    procedure MagicSkillUse(MagicID:integer);
    begin
        buf:=#$2F;
        WriteD(MagicID);
        WriteD(00);
        WriteC(00);
        SendToServerEx(Name);
    end;

    //******************************************************************************
    procedure OnTimerA(Sender: TObject);
    begin
      MagicSkillUse(windstrike);
      MoveDistance;
      say('magic attack');
    end;

    //******************************************************************************
    procedure TargetAttacker(Attacker: Integer);
    begin
      TargetAtt;
      timerA.enabled:=true;
      UnderAttack:=true; //зацепимся за атакуемого
    end;

    //******************************************************************************
    //          вызывается при приходе каждого пакета если скрипт включен
    //******************************************************************************
    begin

      //****************************************************************************
      //не пропускаем пустые пакеты
      if pck='' then exit;

      //****************************************************************************
      //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)
      //NPCInfo, запоминаем мобов
      if FromServer and (ConnectName=Name) and (pck[1]=#$16) then begin
        AddMob:=true;

        //проверка, входит моб в радиус действия?
        tempX:=ReadD(14); //x
        tempY:=ReadD(18); //y
        tempLenght:=sqrt((CentrKachXex-tempX)*(CentrKachXex-tempX)+(CentrKachYex-tempY)*(CentrKachYex-tempY));

        //проверям, не под землей ли моб(в катакомбах)
        tempZ:=BotCoordZ-ReadD(22);
        if tempz<0 then tempZ:=tempz*(-1);
        if tempZ<=DeltaZ then begin
          if (tempLenght<Radius) then begin
            for i:=1 to max do begin
              //если нашли Моба в базе, то коректируем его координаты на новые
              if (MobBase[1,i]=ReadD(2)) and (CharID<>ReadD(2)) and (PetID<>ReadD(2)) then begin
                MobBase[2,i]:=ReadD(14); //x
                MobBase[3,i]:=ReadD(18); //y
                MobBase[4,i]:=ReadD(22); //z
                //Ext массив
                MobBaseExt[2,i]:=ReadD(14); //x
                MobBaseExt[3,i]:=ReadD(18); //y
                MobBaseExt[4,i]:=ReadD(22); //z
                AddMob:=false;
              end;
            end;
            //иначе, перебираем базу, ищем свободную ячейку в ней и добавляем нового моба
            for i:=1 to max do begin
              if (MobBase[1,i]=0) and AddMob and (CharID<>ReadD(2)) and (PetID<>ReadD(2)) then begin
                //запоминаем моба в свободную ячейку
                MobBase[1,i]:=ReadD(2); //ObjectID
                MobBase[2,i]:=ReadD(14); //x
                MobBase[3,i]:=ReadD(18); //y
                MobBase[4,i]:=ReadD(22); //z
                //Ext массив
                MobBaseExt[1,i]:=ReadD(2); //ObjectID
                MobBaseExt[2,i]:=ReadD(14); //x
                MobBaseExt[3,i]:=ReadD(18); //y
                MobBaseExt[4,i]:=ReadD(22); //z
                inc(colvomobs);
                say('Запоминаем координаты Моба'+' ColvoMobs='+inttostr(colvomobs));
                break;
              end;
            end;
          end;
        end;
      end;

      //****************************************************************************
      //CharInfo, запоминаем игроков
      if FromServer and (ConnectName=Name) and (pck[1]=#$03) then begin
        AddMob:=true;
        for i:=1 to max do begin
          //если нашли чара в базе, то коректируем его координаты на новые
          if (CharBase[1,i]=ReadD(18)) then begin
            CharBase[2,i]:=ReadD(2);  //x
            CharBase[3,i]:=ReadD(6);  //y
            CharBase[4,i]:=ReadD(10); //z
            AddMob:=false;
          end;
        end;
        //иначе, перебираем базу, ищем свободную ячейку в ней и добавляем нового чара
        for i:=1 to max do begin
          if (CharBase[1,i]=0) and AddMob then begin
            //запоминаем моба в свободную ячейку
            CharBase[1,i]:=ReadD(18); //ObjectID
            CharBase[2,i]:=ReadD(2);  //x
            CharBase[3,i]:=ReadD(6);  //y
            CharBase[4,i]:=ReadD(10); //z
            NameChar:=ReadS(22);
            say('Приближается Игрок '+NameChar+'!!!');
            break;
          end;
        end;

        for i:=1 to max do begin
          //если нашли Чара в базе Мобов, то удаляем его
          if (MobBase[1,i]=ReadD(18)) then begin
            MobBase[1,i]:=0; //x
            MobBase[2,i]:=0; //x
            MobBase[3,i]:=0; //y
            MobBase[4,i]:=0; //z
            //Ext массив
            MobBaseExt[1,i]:=0; //x
            MobBaseExt[2,i]:=0; //x
            MobBaseExt[3,i]:=0; //y
            MobBaseExt[4,i]:=0; //z
            dec(colvomobs);
            say('Нашли Чара в базе Мобов, удаляем его'+' ColvoMobs='+inttostr(colvomobs));
          end;
        end;
      end;

      //****************************************************************************
      //MoveToLocation, коректируем координаты мобов в базе
      if FromServer and (ConnectName=Name) and (pck[1]=#$01) then begin
        AddMob:=true;
        //проверка, входит моб в радиус действия?
        tempX:=ReadD(6);  //x
        tempY:=ReadD(10); //y
        tempLenght:=sqrt((CentrKachXex-tempX)*(CentrKachXex-tempX)+(CentrKachYex-tempY)*(CentrKachYex-tempY));
        tempZ:=BotCoordZ-ReadD(14);
        if tempz<0 then tempZ:=tempz*(-1);
        if tempZ<=DeltaZ then begin
          if (int(tempLenght)<Radius) then begin
            //перебираем базу и ищем там моба, который бежит
            for i:=1 to max do begin
              //если нашли моба в базе, то коректируем его координаты на новые
              if (MobBase[1,i]=ReadD(2)) and (CharID<>ReadD(2)) and (PetID<>ReadD(2)) and (CharBase[1,i]<>ReadD(2)) then begin  //ObjectID
                MobBase[2,i]:=ReadD(6);  //x
                MobBase[3,i]:=ReadD(10); //y
                MobBase[4,i]:=ReadD(14); //z
                //Ext массив
                MobBaseExt[2,i]:=ReadD(6);  //x
                MobBaseExt[3,i]:=ReadD(10); //y
                MobBaseExt[4,i]:=ReadD(14); //z
                AddMob:=false;
              end;
            end;
            //иначе, перебираем базу, ищем свободную ячейку в ней и добавляем нового моба
            for i:=1 to max do begin
              if (MobBase[1,i]=0) and AddMob and (CharID<>ReadD(2)) and (PetID<>ReadD(2)) then begin
                //запоминаем моба в свободную ячейку
                MobBase[1,i]:=ReadD(2); //ObjectID
                MobBase[2,i]:=ReadD(6); //x
                MobBase[3,i]:=ReadD(10); //y
                MobBase[4,i]:=ReadD(14); //z
                //Ext массив
                MobBaseExt[1,i]:=ReadD(2); //ObjectID
                MobBaseExt[2,i]:=ReadD(6); //x
                MobBaseExt[3,i]:=ReadD(10); //y
                MobBaseExt[4,i]:=ReadD(14); //z
                inc(colvomobs);
                break;
              end;
            end;
          end;
        end;
      end;

      //****************************************************************************
      //MagicSkillUse 48, Attack 05
      if FromServer and (ConnectName=Name) and ((pck[1]=#$48) or (pck[1]=#$05)) then begin
        if UnderAttack then exit; //сначало убъем одного
        Attacker:=ReadD(2);
        ObjectID:=ReadD(6);
        if (Attacker<>ObjectID) and (CharID=ObjectID) then begin
          UnderAttack:=true;     //нас атакуют
          needbackup:=false;
          Say('Нас атакуют!');
          TargetAttacker(Attacker);
        end;
      end;

      //****************************************************************************
      //если принят пакет Die
      if FromServer and (ConnectName=Name) and (pck[1]=#$06) then begin
        //ищем моба в базе
        if (Attacker=ReadD(2)) then begin
          UnderAttack:=false; //убили атакующего моба
          timerA.enabled:=False;
        end;
        for i:=1 to max do begin
          //очишаем запись связанную с етим мобом
          if (MobBase[1,i]=ReadD(2)) then begin
            dec(colvomobs);
            MobBase[1,i]:=0; //ObjectID
            MobBase[2,i]:=0; //x
            MobBase[3,i]:=0; //y
            MobBase[4,i]:=0; //z
            //Ext массив
            MobBaseExt[1,i]:=0; //ObjectID
            MobBaseExt[2,i]:=0; //x
            MobBaseExt[3,i]:=0; //y
            MobBaseExt[4,i]:=0; //z
            break;
          end;
        end;
      end;

      //****************************************************************************
      //если принят пакет DeleteObject
      if FromServer and (ConnectName=Name) and (pck[1]=#$12) then begin
        //ищем моба в базе
        //say('DeleteObject');
        if (Attacker=ReadD(2)) then begin
          UnderAttack:=false; //убили атакующего моба
          timerA.enabled:=False;
        end;
        for i:=1 to max do begin
          //очишаем запись связанную с етим мобом
          if (MobBase[1,i]=ReadD(2)) then begin
            dec(colvomobs);
            MobBase[1,i]:=0; //ObjectID
            MobBase[2,i]:=0; //x
            MobBase[3,i]:=0; //y
            MobBase[4,i]:=0; //z
            //Ext массив
            MobBaseExt[1,i]:=0; //ObjectID
            MobBaseExt[2,i]:=0; //x
            MobBaseExt[3,i]:=0; //y
            MobBaseExt[4,i]:=0; //z
            break;
          end;
        end;
        for i:=1 to max do begin
          //если нашли в базе, то удаляем
          if (CharBase[1,i]=ReadD(2)) then begin
            CharBase[2,i]:=0; //x
            CharBase[3,i]:=0; //y
            CharBase[4,i]:=0; //z
          end;
        end;
      end;

      //****************************************************************************
      //ValidatePosition если принят пакет от клиента с моими кординатами то
      if FromClient and (ConnectName=Name) and (pck[1]=#$48) then begin
        //запоминаем мои координаты
        BotCoordX:=ReadD(2);
        BotCoordY:=ReadD(6);
        BotCoordZ:=ReadD(10);
        //ext
        BotCoordXext:=ReadD(2);
        BotCoordYext:=ReadD(6);
        BotCoordZext:=ReadD(10);
      end;

      //****************************************************************************
      //если от сервака принят пакет с ИД и Координатами членов пати то
      if FromServer and (ConnectName=Name) and (pck[1]=#$a7) then begin
          //запоминаем ИД командира
          CharID:=ReadD(6);
          if scrready then exit
          else begin
            Say('Скрипт готов к работе. Запомнил ИД лидера');
            scrready:=true;
          end;
      end;

      //****************************************************************************
      //если от сервака принят пакет с UserInfo
      if FromServer and (ConnectName=Name) and (pck[1]=#$04) then begin
          //Запоминаем собственный ИД
          CharID:=ReadD(18);
          if scrready then exit
          else begin
            Say('Скрипт готов к работе. Запомнил ИД лидера');
            scrready:=true;
          end;
      end;

      //****************************************************************************
      //если от сервака принят пакет с PetInfo
      if FromServer and (PetID=0) and (ConnectName=Name) and (pck[1]=#$b1) then PetID:=ReadD(6);

      //****************************************************************************
      //DropItem - выпала вещь
      if FromServer and (ConnectName=Name) and (pck[1]=#$0C) then begin
        //чужие вещи не берем
        if (Attacker=ReadD(2)) then begin
          timer1.enabled:=false; //выключаем бота
          AddMob:=true;
          //перебираем базу
          for i:=1 to max do begin
            //если нашли, то корректируем его координаты на новые
            if (ItemBase[1,i]=ReadD(6)) then begin  //ObjectID
              ItemBase[2,i]:=ReadD(14); //x
              ItemBase[3,i]:=ReadD(18); //y
              ItemBase[4,i]:=ReadD(22); //z
              AddMob:=false;
              inc(itm);
              NeedBackup:=true;
            end;
          end;
          //иначе, перебираем базу, ищем свободную ячейку в ней и добавляем
          for i:=1 to max do begin
            if (ItemBase[1,i]=0) then begin
              //запоминаем в свободную ячейку
              ItemBase[1,i]:=ReadD(6); //ObjectID
              ItemBase[2,i]:=ReadD(14); //x
              ItemBase[3,i]:=ReadD(18); //y
              ItemBase[4,i]:=ReadD(22); //z
              inc(itm);
              NeedBackup:=true;
              break;
            end;
          end;
        end;
        say('ColvoItm='+inttostr(itm));
      end;

      //****************************************************************************
      //каждые две сек подбираем предмет
      if Wait(time1,2) and NeedBackup and (underAttack=false) then ReqGetItem;

      //****************************************************************************
      //определяем реальность поднятия вещи
      //GetItem
      if FromServer and (ConnectName=Name) and (pck[1]=#$0D) then begin
        //перебираем базу
        for i:=1 to max do begin
          //если нашли, то обнуляем
          if (ItemBase[1,i]=ReadD(6)) then begin  //ObjectID
            ItemBase[1,i]:=0; //x
            ItemBase[2,i]:=0; //x
            ItemBase[3,i]:=0; //y
            ItemBase[4,i]:=0; //z
            dec(itm);
            //say('Удаляем данные по предмету');
          end;
        end;
        if itm=0 then begin
          needbackup:=false;
          timer1.enabled:=true;
        end;
        say('ColvoItm='+inttostr(itm));
      end;

      //******************************************************************************
      //StatusUpdate
      if FromServer and (ConnectName=Name) and (pck[1]=#$0E) and (Attacker=ReadD(2)) then StatusUpdate;

      //****************************************************************************
      if FromClient and (ConnectName=Name) and (pck[1]=#$1B) then begin
        SocialID:=ReadD(2);
        pck:='';
        case SocialID of
          //социальное действие Yes для начала
          6: begin
            //if CharID=0 then exit;
            CentrKachX:=BotCoordX;
            CentrKachY:=BotCoordY;
            CentrKachZ:=BotCoordZ;
            CentrKachXex:=BotCoordXext;
            CentrKachYex:=BotCoordYext;
            Say('Команда Старт!!!');
            say('Получили координаты центра');
            say('X='+inttostr(BotCoordX)+' Y='+inttostr(BotCoordY));
            timer1.enabled:=true;
            exit;
          end;
          //социальное действие No для окончания
          5: begin
            //if CharID=0 then exit;
            timer1.enabled:=false;
            timer2.enabled:=false;
            timerA.enabled:=False;
            underattack:=false;
            Say('Команда Стоп!!!');
            exit;
          end;
        end;
      end;
    end.
Добавлено спустя 3 минуты 34 секунды:
Re:
Цитата:
Сообщение от DashKAaa
Бегает,лечит,заливает, пьет цп,хп на ура, правда задержечка есть при цп...

скорей всего у тебя просто сервак левый особенно с таргетами и пропаданием суппорта за спиной)
Какие хроники?

Добавлено спустя 2 минуты 16 секунд:
Сервер довольно неплохой ПТС Ц4
Rubec вне форума   Ответить с цитированием