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

Цитата:
Сообщение от StKolya
NLObP,
ок,буду пробовать...

Добавлено спустя 2 часа 50 минут 20 секунд:
промучался,сколько смог,вот что вышло,только не заработало:
Вот немного поправил.
Код:
//автоматическое лечение by NLObP
// 1-Изменяем Name='NLObP';
// 2- Изменяем корректно MagicID - скила Greater Battle Heal

const
    //лучше в начало скрипта выносить все константы для облегчения настройки и модификации
    Name='ViniPUF';
    MagicID=1218;  //MagicID - скила Greater Battle Heal
var
    CharObjID: integer;
    CurMP, MaxMP,  MaxHP, CurHP: integer;
    TimerHP: TTimer;

//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 OnTimerHP(Sender: TObject);
begin
   MagicSkillUse(MagicID);
end;
//******************************************************************************
procedure Say(msg:string);
begin
  buf:=hstr('4A 00 00 00 00');
  WriteD(2);
  WriteS(Name);
  WriteS(msg);
  SendToClientEx(Name);
end;
//******************************************************************************
procedure InitStats;
var
  i: integer;
begin
  //Запоминаем ИД
  i:=18;
  CharObjID:=ReadD(i);
  //смещение переменное, зависит от имени (LenName*2+2)
  i:=i+(Length(Name)*2+2)+44;
  MaxHP:=ReadD(i);
  CurHP:=ReadD(i);
  MaxMP:=ReadD(i);
  CurMP:=ReadD(i);
 //Say('MaxHP='+inttostr(MaxHP)+'CurHP='+inttostr(CurHP)); //если раскоментировать то можно увидеть много
                                                                                          //полезного, например несоответствие реальным данным
  //if ItemObjID=0 then exit; //здесь была проверка на готовность скрипта
  //в нашем случае можно поставить проверку на количество маны
  if CurMP<300 then Say('CurMP='+inttostr(CurMP)+'Заканчивается мана!');
  if (CurHP<MaxHP-600) then TimerHP.enabled:=true else TimerHP.enabled:=false;
                        //не слишком ли много -600?
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);
      #$0B: CurMP:=ReadD(i*8+14);
      #$0C: MaxMP:=ReadD(i*8+14);
    end;
  end;
  //Say('MaxHP='+inttostr(MaxHP)+'CurHP='+inttostr(CurHP)); //если раскоментировать то можно увидеть много
                                                                                          //полезного, например несоответствие реальным данным
  //if ItemObjID=0 then exit; //здесь была проверка на готовность скрипта
  //в нашем случае можно поставить проверку на количество маны
  if CurMP<300 then Say('CurMP='+inttostr(CurMP)+'Заканчивается мана!');
  if (CurHP<=MaxHP-600) then TimerHP.enabled:=true else TimerHP.enabled:=false;
end;
//******************************************************************************
//                 Вызывается при включении скрипта
//******************************************************************************
procedure Init;
begin
    CharObjID:=0;
    timerHP:=TTimer.Create(nil);
    timerHP.OnTimer:=@OnTimerHP;
    timerHP.enabled:=false;
    timerHP.interval:=5000; //время отката лечения с помощью скила Greater Battle Heal
end;
//******************************************************************************
//                 Вызывается при выключении скрипта
//******************************************************************************
procedure Free;
begin
     timerHP.Free;
end;
//******************************************************************************
//       Вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
//******************************************************************************
  //не обрабатываем пустые пакеты
  if pck='' then exit;
//******************************************************************************
//UserInfo
if FromServer and (ConnectName=Name) and (pck[1]=#$04) then InitStats;
//******************************************************************************
//StatusUpdate
if FromServer and (ConnectName=Name) and (pck[1]=#$0E) and (CharObjID=ReadD(2)) then StatsUpdate;
end.
__________________
| Для самых ленивый | Телепаты в отпуске |Мы работаем над этим |
Не умеешь - учись, не хочешь учиться - плати © Суровый Закон Жизни


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