Показать сообщение отдельно
Старый 06.01.2008, 05:28   #132
Рыцарь
 
Аватар для mks
 
Регистрация: 21.09.2007
Сообщений: 376
Сказал Спасибо: 11
Имеет 218 спасибок в 106 сообщенях
mks пока неопределено
По умолчанию Re: ДА БУДЕТ БОТ!

Всем привет, всех с новым годом!
Давно не заходил, смотрю тем рассплодилось немерено)), все не перечитал....
Лан, в общем не об этом я)).... Решил как-то я сделать бота хиллера(биш, се, не важно....) -смысл - лечить членов пати.... Набросал для начала небольшой скриптик, который анализировал пакеты от сервера содержащие информацию об изменениях параметров членов пати и тупо хилил тех у кого ХП меньше чем я укажу.... По началу казалось что все нормально, но когда я начал его использовать в больших пати(не только со своими ботами), начались проблемы - хилер тупо лечил того члена пати, чей пакет пришел первым, т.е. допустим один член пати буквально умирает, а бот лечит другого, у которого ХП еще много, но соответствовало указаному минимуму. Переделал с проверкой на больше нуждающегося в ХП члена пати))... Вроде правильно все высказал, голова квадратная после нового года)))

Ну в общем выкладываю бота хилера(СЕ), написал вчера, еще много собираюсь добавить....

Имеются несколько режимов, включаются и выключаются социальными действиями начиная с первого, думаю поймете(не китайцы же))):
-режима лечения(первое соц. действие) -действует граматно, -изначально вычисляет у кого из пати меньше всего ХП, потом сравнивает его с указанным в const HP, если меньше, то хилит его первым.
-режим бега(второе соц. действие) -режим бега работает так, что бот бежит туда же куда и хозяин, но с отклонением которое можно указать в const -chaos, генерируется случайным образом
режимы включаются и выключаются тем же соц. действием.
-ну и третье соц. дейстие - вливает МП хозяину, можно будет сделать что б это шло и автоматом, но пока не вижу смысла....
Комментарии не ставил дабы избежать пользования скриптом ламаков. Кому надо поймет, кому не понятно обьясню....
Код:
Const
  HP=2000;
  BotName='имя СЕ';
  MasterName='имя Коммандира';
  Chaos=100;

  GreatHeal='2F C1 04 00 00 00 00 00 00 00';
  GroupHeal='2F C3 04 00 00 00 00 00 00 00';

var
   CharName: array[1..9] of string;
   CharID:   array[1..9] of integer;
   CurHP:    array[1..9] of integer;
   MaxHP:    array[1..9] of integer;
   CurMP:    array[1..9] of integer;
   MaxMP:    array[1..9] of integer;
   Dev:      array[1..9] of extended;
   xe, ye: extended;
   PartyCount,i,f,e,t,MinHP,NeedHP,ox,oy,oz,x,y,z,MasterID,BotID: integer;
   exist, HealKey, RunKey: boolean;

   TimerHP: TTimer;

procedure Init; //?????????? ??? ????????? ???????
begin
  TimerHP:=TTimer.Create(nil);
  TimerHP.OnTimer:=@OnTimerHP;
  TimerHP.enabled:=true;
  TimerHP.interval:=1000;
end;

procedure Heal;
begin
    //target
    buf:=#$04;
    WriteD(CharID[NeedHP]);
    WriteD(ox);
    WriteD(oy);
    WriteD(oz);
    WriteC(0);
    SendToServerEx(BotName);
    //heal
    buf:=hstr(GreatHeal);
    SendToServerEx(BotName);
end;

procedure SendMsg(msg:string);
begin
buf:=#$4A;
WriteD(BotID);
WriteD(2);
WriteS(BotName);
WriteS(msg);
SendToClient;
end;

procedure Min(n1,n2:integer);
begin
if n1<n2 then MinHP:=n1 else MinHP:=n2;
end;

procedure OnTimerHP(Sender: TObject);
begin
  if PartyCount>0 then
  begin
    MinHP:=CurHP[1];
    for t:=1 to PartyCount do
    begin
        if CharName[t]=MasterName then MasterID:=CharID[t];
        if CharName[t]=BotName then BotID:=CharID[t];
        min(MinHP,CurHP[t]);
    end;
    for t:=1 to PartyCount do
    begin
        if CurHP[t]=MinHP then
        begin
        NeedHP:=t;
        break;
        end;
    end;
    if (HealKey=true) and (MinHP<HP) then Heal;
  end;
end;

procedure Free; //?????????? ??? ?????????? ???????
begin
PartyCount:=0;
TimerHP.free;
 HealKey:=false;
 RunKey:=false;
end;

//???????? ????? ???????
//?????????? ??? ??????? ??????? ?????? ???? ?????? ???????
begin

if FromServer and (pck[1]=#$52) then
  begin
    i:=6;
    for f:=1 to (PartyCount+1) do
        begin
             if CharID[f]=ReadD(2) then exist:=true else exist:=false;
             if exist=true then
             begin
                CharName[f]:=ReadS(i);
                i:=i+8;
                CurHP[f]:=ReadD(i);
                MaxHP[f]:=ReadD(i);
                CurMP[f]:=ReadD(i);
                MaxMP[f]:=ReadD(i);
                Dev[f]:=CurHP[f]/MaxHP[f];
                break;
             end;
        end;

        if exist=false then
                begin
                PartyCount:=PartyCount+1;
                f:=PartyCount;
                CharID[f]:=ReadD(2);
                CharName[f]:=ReadS(i);
                i:=i+8;
                CurHP[f]:=ReadD(i);
                MaxHP[f]:=ReadD(i);
                CurMP[f]:=ReadD(i);
                MaxMP[f]:=ReadD(i);
                Dev[f]:=CurHP[f]/MaxHP[f];
                end;
  end;


   if FromClient and (ConnectName=MasterName) and (RunKey=true) and (pck[1]=#$01) then
      begin
         xe:=ReadD(2)-Chaos/2+round(random*Chaos);
         ye:=ReadD(6)-Chaos/2+round(random*Chaos);

         x:=round(xe);
         y:=round(ye);
         z:=ReadD(10);

         buf:=#$01;
         WriteD(x);
         WriteD(y);
         WriteD(z);
         WriteD(ox);
         WriteD(oy);
         WriteD(oz);
         ox:=x;
         oy:=y;
         oz:=z;
         SendToServerEx(BotName);
      end;


   if FromClient and (ConnectName=BotName) and (pck[1]=#$01) then
      begin
         ox:=ReadD(2);
         oy:=ReadD(6);
         oz:=ReadD(10);
      end;


      //Heal mode
if FromClient and (ConnectName=MasterName) and (pck=hstr('1B 02 00 00 00')) then
begin
HealKey:=not(HealKey);
pck:='';
Case HealKey of
true: SendMsg('Heal mode ON');
false: SendMsg('Heal mode OFF');
end;
end;

//Run mode
if FromClient and (ConnectName=MasterName) and (pck=hstr('1B 03 00 00 00')) then
begin
RunKey:=not(RunKey);
pck:='';
Case RunKey of
true: SendMsg('Run mode ON');
false: SendMsg('Run mode OFF');
end;
end;

if FromClient and (pck=hstr('1B 04 00 00 00')) then
 begin
     //target master
    buf:=#$04;
    WriteD(MasterID);
    WriteD(ox);
    WriteD(oy);
    WriteD(oz);
    WriteC(0);
  SendToServerEx(BotName);
  buf:=hstr('2F F5 03 00 00 00 00 00 00 00');
  SendToServerEx(BotName);
  pck:='';
 end;
end.
ЗЫ да, забыл добавить, это походу баг пакетхака - скрипт пришлось немного видоизминять, не буду перечислять все, но допустим если последние три части переставить в начало(что не изменит программу) ПХ выдает ошибку....
__________________
FA©Q!
mks вне форума   Ответить с цитированием
За это сообщение mks нажился спасибкой от: