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

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

Post by iluha »

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

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.

У меня вот так работает с помощью Макса

Code: Select all

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

    if (hp < (maxhp-49)) then  // 
    begin
      uosay('.drink greaterhealpotion');         
      wait(25000); 
    End;

    if (hp < (maxhp-59)) then //
    begin
      uosay(',usetype 123123');         
      wait(20000); 
    End;

  End;
end.
единственное, вот поправят типы и цвет, будет вообще огонь.
кстати туда бы вместо задержки на бинты сделать бы проверку журнала на фразу после того как вылечит бинтом, тогда бы задержка не нужна была бы
Macks
Apprentice
Apprentice
Posts: 250
Joined: 27.02.2006 22:23
Location: АоП - Age Of Power

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

Post by Macks »

drabadan wrote:Претензия на ассинхронный хил. Как он работает не знаю, общая идея возникла, решил реализовать.
Может, у кого есть возможность потестировать - потестируйте.
Кто вызовет инициализацию?
Где вызывается лечение?
В обработчике таймера только подсчет тиков, зачем их считать если можно для каждого вида лечения свою переменную когда было последний раз использовано?
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

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

Post by drabadan »

призадумался, а как его то вызвать...
iluha
Neophyte
Neophyte
Posts: 30
Joined: 30.03.2015 2:21

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

Post by iluha »

У меня вот на сервере если холишь бинтами здорового чара появляется надпись в журнале
Who world you like to heal?
You begin app;ying a bandage...
The patient seems to be quite all right.

А после удачного хила появляется
You have healed 36 hit points at 4 seconds

может попытаться отследить нужную фразу?
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

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

Post by Vizit0r »

HealSelf, надо понимать, где-то из цикла самого скрипта вызывать надо?
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

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

Post by drabadan »

Vizit0r wrote:HealSelf, надо понимать, где-то из цикла самого скрипта вызывать надо?
а хз, я писал на работе "в не благоприятных условиях окружающей среды". Надо когда пишешь ето все на лету тестить и смотреть, пока лень. Основной целью было, помочь новичку в его потугах стать на путь истинный. Я пытался показать общий алгоритм как его вижу я, то-есть обработчик по таймеру отслеживает кд и включает\выключает возможности похилится. Если бы у кого-то хватило ума и терпения написать умный асинхронный хил, было бы круть! Я лишь высказал свою претензию на, а не написал реализацию.
Macks
Apprentice
Apprentice
Posts: 250
Joined: 27.02.2006 22:23
Location: АоП - Age Of Power

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

Post by Macks »

drabadan wrote:
Vizit0r wrote:HealSelf, надо понимать, где-то из цикла самого скрипта вызывать надо?
а хз, я писал на работе "в не благоприятных условиях окружающей среды". Надо когда пишешь ето все на лету тестить и смотреть, пока лень. Основной целью было, помочь новичку в его потугах стать на путь истинный. Я пытался показать общий алгоритм как его вижу я, то-есть обработчик по таймеру отслеживает кд и включает\выключает возможности похилится. Если бы у кого-то хватило ума и терпения написать умный асинхронный хил, было бы круть! Я лишь высказал свою претензию на, а не написал реализацию.
Я думаю асинхронность не нужна в данном случае.
Если на каждый способ лечения свой таймаут, то его просто нужно выдерживать и запоминать для каждого вида действия в отдельной переменной.
Таймеры в данном случае не нужны.
Macks
Apprentice
Apprentice
Posts: 250
Joined: 27.02.2006 22:23
Location: АоП - Age Of Power

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

Post by Macks »

drabadan wrote:призадумался, а как его то вызвать...
Есть другая задача, запомнить место где тебя убили, что бы потом вернуться и полутить свой труп.

А два макроса запускать не хочется.
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

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

Post by drabadan »

Macks wrote:
drabadan wrote:призадумался, а как его то вызвать...
Есть другая задача, запомнить место где тебя убили, что бы потом вернуться и полутить свой труп.

А два макроса запускать не хочется.
событие дед срабатывает - запускает обработчик в котором чар бежит ресается и возвращается где сдох
Macks
Apprentice
Apprentice
Posts: 250
Joined: 27.02.2006 22:23
Location: АоП - Age Of Power

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

Post by Macks »

drabadan wrote:
Macks wrote:
drabadan wrote:призадумался, а как его то вызвать...
Есть другая задача, запомнить место где тебя убили, что бы потом вернуться и полутить свой труп.

А два макроса запускать не хочется.
событие дед срабатывает - запускает обработчик в котором чар бежит ресается и возвращается где сдох
А есть такое событие?!!!
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

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

Post by drabadan »

Code: Select all

* evDeath : [Dead : Boolean] - если True, то мертв, False - жив.
в любом случае можно вызвать таймер в котором обрабатывать текущее состояние чара...
Macks
Apprentice
Apprentice
Posts: 250
Joined: 27.02.2006 22:23
Location: АоП - Age Of Power

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

Post by Macks »

drabadan wrote:

Code: Select all

* evDeath : [Dead : Boolean] - если True, то мертв, False - жив.
в любом случае можно вызвать таймер в котором обрабатывать текущее состояние чара...
Прикольно, в одном списке документации он есть, а в другом, видимо устаревшем, мессаже последнее событие.
Post Reply