Page 1 of 2

Что сделано не так?

Posted: 02.04.2015 12:10
by iluha
Program heal
begin
if (HP < MaxHP) then
uosay('.bandageself');
wait(4000);
End;
if (HP < 50) then // смысл этого в том, что бы пить поушен если нанесяно больше 50 повреждений
uosay('.drink greaterhealpotion');
wait(25000);
End;
if (HP < 60) then // смысл этого в том, что бы пить поушен если нанесяно больше 60 повреждений
uosay(',usetype 123123');
wait(20000);
End.

На практике полечается что, если чар получил дамаг, он хилится бинтами, и пьет поушен только при HP < 50.

Смысл в том что бы скрипт был постоянно в работе проверяя состояние чара, если снизились Хп, чарт лечился бинтами, а если получал 50 дамага и более пил поушен и юзал необходимый итем.
Все это в постоянном цикле.
На практике он не работает, что тут не так?

Re: Что сделано не так?

Posted: 02.04.2015 12:14
by drabadan
тело скрипта не взято в тег скрипт.

И реализовывать это или через свой обработчик или с помощью евентов.

Re: Что сделано не так?

Posted: 02.04.2015 12:19
by Macks
iluha wrote:Program heal
begin
if (HP < MaxHP) then
uosay('.bandageself');
wait(4000);
End;
if (HP < 50) then // смысл этого в том, что бы пить поушен если нанесяно больше 50 повреждений
uosay('.drink greaterhealpotion');
wait(25000);
End;
if (HP < 60) then // смысл этого в том, что бы пить поушен если нанесяно больше 60 повреждений
uosay(',usetype 123123');
wait(20000);
End.

На практике полечается что, если чар получил дамаг, он хилится бинтами, и пьет поушен только при HP < 50.

Смысл в том что бы скрипт был постоянно в работе проверяя состояние чара, если снизились Хп, чарт лечился бинтами, а если получал 50 дамага и более пил поушен и юзал необходимый итем.
Все это в постоянном цикле.
На практике он не работает, что тут не так?
1. Не было главного цикла, программа отработает один раз.
2. "End;" завершает составной блок операторов, а в начале блока "begin", вы его забыли написать.

Code: Select all

Program heal
begin
  while true do
  begin
    if (HP < MaxHP) then 
    begin
      uosay('.bandageself');     
      wait(4000);  
    End;

    if (HP < 50) then  // смысл этого в том, что бы пить поушен если нанесяно больше 50 повреждений
    begin
      uosay('.drink greaterhealpotion');         
      wait(25000); 
    End;

    if (HP < 60) then // смысл этого в том, что бы пить поушен если нанесяно больше 60 повреждений
    begin
      uosay(',usetype 123123');         
      wait(20000); 
    End;

  End;
End.

Re: Что сделано не так?

Posted: 02.04.2015 13:02
by iluha
Macks , спасибо за помошь
Я так понял в этом скрипте будет использоваться если здоровье уподет ниже 50 Хп.

if (HP < 50) then // смысл этого в том, что бы пить поушен если нанесяно больше 50 повреждений
begin
uosay('.drink greaterhealpotion');
wait(25000);
End;
Как то можно сделать, что бы данное действие начиналось при потере этого кол-ва здоровья.
Вот пример, Чар с 250 Хп, в существующем скрипте при Хп ниже 50 будет использоваться вышеуказанное условие.
А как сделать условие, что бы при снижении на 50 Хп не зависимо от общего Объема жизни начиналось лечение?

Re: Что сделано не так?

Posted: 02.04.2015 13:04
by iluha
drabadan wrote:тело скрипта не взято в тег скрипт.

И реализовывать это или через свой обработчик или с помощью евентов.
Извини, вообще ничего не понял:)

Re: Что сделано не так?

Posted: 02.04.2015 13:05
by drabadan
iluha wrote:Macks , спасибо за помошь
Я так понял в этом скрипте будет использоваться если здоровье уподет ниже 50 Хп.

if (HP < 50) then // смысл этого в том, что бы пить поушен если нанесяно больше 50 повреждений
begin
uosay('.drink greaterhealpotion');
wait(25000);
End;
Как то можно сделать, что бы данное действие начиналось при потере этого кол-ва здоровья.
Вот пример, Чар с 250 Хп, в существующем скрипте при Хп ниже 50 будет использоваться вышеуказанное условие.
А как сделать условие, что бы при снижении на 50 Хп не зависимо от общего Объема жизни начиналось лечение?
if (hp < (maxhp-49)) then

автор топика, как я понял, хочет асинхронный хил.

Re: Что сделано не так?

Posted: 02.04.2015 13:18
by iluha
нужно попробывать и по тестить, спасибо Драбаданушка

Re: Что сделано не так?

Posted: 02.04.2015 14:24
by iluha
Я так понимаю что цикл этого скрипта будет не прирывный, но если будет чар убит, эти условия будут выполняться?
если сделать вот так "while Dead = false do"
скрипт будет игнорить хил? а то получается будет грузить клиент в состоянии Гост

и паралельный вопрос, в процессе лечения .bandageself стоит задержка 4 сек. получается что в пределах 4 секунд если чар не отхилится будет накладываться новый бинт, но чар уже лечится бинтом.
Можно ли как то дополнить следующим условием if (InJournalBetweenTimes('You finish applying the bandages|You apply the bandages, but they barely help', ctimeq, Now)>= 0) then

Re: Что сделано не так?

Posted: 02.04.2015 15:01
by Macks
iluha wrote:
drabadan wrote:тело скрипта не взято в тег скрипт.

И реализовывать это или через свой обработчик или с помощью евентов.
Извини, вообще ничего не понял:)
https://ru.wikipedia.org/wiki/BbCode

Code: Select all

[ code ] Моноширинный текст или web код[ / code ]

Re: Что сделано не так?

Posted: 02.04.2015 15:07
by Macks
iluha wrote:Я так понимаю что цикл этого скрипта будет не прирывный, но если будет чар убит, эти условия будут выполняться?
если сделать вот так "while Dead = false do"
скрипт будет игнорить хил? а то получается будет грузить клиент в состоянии Гост
Я предпочитаю явно написать

Code: Select all

while Not Dead do
begin
end;
iluha wrote:и паралельный вопрос, в процессе лечения .bandageself стоит задержка 4 сек. получается что в пределах 4 секунд если чар не отхилится будет накладываться новый бинт, но чар уже лечится бинтом.
Можно ли как то дополнить следующим условием if (InJournalBetweenTimes('You finish applying the bandages|You apply the bandages, but they barely help', ctimeq, Now)>= 0) then
Можно, но нужно определить переменную соответствующего типа.
Перед использованием бинта запомнить в ней(переменной) текущее время.
Использовать команду лечения бинтами.
Дать минимальную паузу для поступления в журнал сообщения.
А уже потом искать нужные строчки и на их основе ставить основную задержку.

Re: Что сделано не так?

Posted: 02.04.2015 15:09
by iluha
Macks wrote:
iluha wrote:
drabadan wrote:тело скрипта не взято в тег скрипт.

И реализовывать это или через свой обработчик или с помощью евентов.
Извини, вообще ничего не понял:)
https://ru.wikipedia.org/wiki/BbCode

Code: Select all

[ code ] Моноширинный текст или web код[ / code ]

Code: Select all

Макс ты мой кумир
Спасибо

Re: Что сделано не так?

Posted: 02.04.2015 15:14
by Macks
iluha wrote:

Code: Select all

Макс ты мой кумир
Спасибо
Развитие цивилизации возможно только при обмене опытом и передаче его новым поколениям.

Re: Что сделано не так?

Posted: 02.04.2015 16:21
by iluha
Macks wrote:
iluha wrote:

Code: Select all

Макс ты мой кумир
Спасибо
Развитие цивилизации возможно только при обмене опытом и передаче его новым поколениям.
Максим подскажи следующее:

У меня есть 2а типа вещей, которые мне нужно искать в радиусе 5 тайлов, как только будет найден один из двух типов на него должен будет установиться таргет и выполниться условие (использовать на него предмет "яйцо" с задержкой в 500 мс, до тех пор пока в него не попадет "вы попали яйцом (надпись из журнала)" и скрипт останавливатся)
если предмет из радиуса поражения (5 тайлов) вышел, то поиск начинается с начала.

Code: Select all

 
Program search;
const
FindDistance:=5

type
a=$1542
b=$1256
c=$1436

begin
if WaitTargetGround (a,b,c) then useobject ('eggs');
Wait (500);
начало правильное или бредятина?

Re: Что сделано не так?

Posted: 02.04.2015 16:49
by Macks
iluha wrote:Максим подскажи следующее:

У меня есть 2а типа вещей, которые мне нужно искать в радиусе 5 тайлов, как только будет найден один из двух типов на него должен будет установиться таргет и выполниться условие (использовать на него предмет "яйцо" с задержкой в 500 мс, до тех пор пока в него не попадет "вы попали яйцом (надпись из журнала)" и скрипт останавливатся)
если предмет из радиуса поражения (5 тайлов) вышел, то поиск начинается с начала.

Code: Select all

 
Program search;
const
FindDistance:=5

type
a=$1542
b=$1256
c=$1436

begin
if WaitTargetGround (a,b,c) then useobject ('eggs');
Wait (500);
начало правильное или бредятина?

Code: Select all

 
Program search;

const
MyFindDistance = 5
ItemType1 = $1542
ItemType2 = $1256
EggsType = $1436

begin
  FindDistance := MyFindDistance;
  while Not Dead do
  begin
    if FindType(ItemType1, Ground) > 0 or FindType(ItemType2, Ground) > 0 then
    begin
      while ((IsObjectExists(FindItem)) and (Dist(GetX(FindItem), GetY(FindItem), GetX(Self), GetY(Self)) <= MyFindDistance))  do
      begin
        if TargetPresent then CancelTarget;
        WaitTargetObject(FindItem);
        UseType(EggsType, $ffff);
        Wait (500);
      end;
    end;
    Wait (500);
  end;
end.
Как то так.

Re: Что сделано не так?

Posted: 03.04.2015 18:59
by drabadan
Претензия на ассинхронный хил. Как он работает не знаю, общая идея возникла, решил реализовать.
Может, у кого есть возможность потестировать - потестируйте.

Code: Select all

program asyncHealer;

type 
 TTimer = record
  Ticks : Integer;
  MaxTicks : Integer;
  Enabled : Boolean;
 end;

var
 Timers : Array of TTimer;

procedure InitTimer(Timer : TTimer; MaxTicks : Integer);
begin
 Timer.Ticks := 0;
 MaxTicks := MaxTicks;
 Timer.Enabled := False; 
end; 

procedure InitVars;
begin
 SetLength(Timers, 3);
 
 InitTimer(Timers[0], 40);//bandage
 InitTimer(Timers[1], 250);//gh
 InitTimer(Timers[2], 200);//item 
end;

procedure HealSelf;
begin
 if (HP < MaxHP) and (not Timers[0].Enabled) then begin
  UOSay('.bandageself'); 
  Timers[0].Enabled := True;  
 end;
 if (HP < 50) and (not Timers[1].Enabled) then begin
  UOSay('.drink greaterhealpotion'); 
  Timers[1].Enabled := True;  
 end;
 if (HP < 60) and (not Timers[1].Enabled) then begin
  UOSay(',usetype 123123');  
  Timers[2].Enabled := True;  
 end;
end;

procedure TimerProc;
var
 i : Integer;
begin
 for i := 0 to 2 do
  if (Timers[i].Enabled) then begin
   Timers[i].Ticks := Timers[i].Ticks + 1;
   if (Timers[i].Ticks >= Timers[i].MaxTicks) then
    Timers[i].Enabled := False;
  end;
end;

begin
 SetEventProc(evTimer1, 'TimerProc');
 while true do wait(50);
end.