Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

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

тут можно задать вопрос по скриптингу
iluha
Neophyte
Neophyte
Posts: 30
Joined: 30.03.2015 2:21

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

Post 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 дамага и более пил поушен и юзал необходимый итем.
Все это в постоянном цикле.
На практике он не работает, что тут не так?
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

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

Post by drabadan »

тело скрипта не взято в тег скрипт.

И реализовывать это или через свой обработчик или с помощью евентов.
Macks
Apprentice
Apprentice
Posts: 250
Joined: 27.02.2006 22:23
Location: АоП - Age Of Power

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

Post 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.
iluha
Neophyte
Neophyte
Posts: 30
Joined: 30.03.2015 2:21

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

Post by iluha »

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

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

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

Post by iluha »

drabadan wrote:тело скрипта не взято в тег скрипт.

И реализовывать это или через свой обработчик или с помощью евентов.
Извини, вообще ничего не понял:)
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

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

Post 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

автор топика, как я понял, хочет асинхронный хил.
iluha
Neophyte
Neophyte
Posts: 30
Joined: 30.03.2015 2:21

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

Post by iluha »

нужно попробывать и по тестить, спасибо Драбаданушка
iluha
Neophyte
Neophyte
Posts: 30
Joined: 30.03.2015 2:21

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

Post 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
Macks
Apprentice
Apprentice
Posts: 250
Joined: 27.02.2006 22:23
Location: АоП - Age Of Power

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

Post by Macks »

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

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

Code: Select all

[ code ] Моноширинный текст или web код[ / code ]
Macks
Apprentice
Apprentice
Posts: 250
Joined: 27.02.2006 22:23
Location: АоП - Age Of Power

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

Post 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
Можно, но нужно определить переменную соответствующего типа.
Перед использованием бинта запомнить в ней(переменной) текущее время.
Использовать команду лечения бинтами.
Дать минимальную паузу для поступления в журнал сообщения.
А уже потом искать нужные строчки и на их основе ставить основную задержку.
iluha
Neophyte
Neophyte
Posts: 30
Joined: 30.03.2015 2:21

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

Post by iluha »

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

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

Code: Select all

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

Code: Select all

Макс ты мой кумир
Спасибо
Macks
Apprentice
Apprentice
Posts: 250
Joined: 27.02.2006 22:23
Location: АоП - Age Of Power

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

Post by Macks »

iluha wrote:

Code: Select all

Макс ты мой кумир
Спасибо
Развитие цивилизации возможно только при обмене опытом и передаче его новым поколениям.
iluha
Neophyte
Neophyte
Posts: 30
Joined: 30.03.2015 2:21

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

Post 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);
начало правильное или бредятина?
Macks
Apprentice
Apprentice
Posts: 250
Joined: 27.02.2006 22:23
Location: АоП - Age Of Power

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

Post 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.
Как то так.
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

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

Post 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.

Post Reply