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

Разрешите передавать встроенные функции как параметры

Only for requests.
Post Reply
iwantmorespam
Posts: 3
Joined: 13.01.2013 12:14

Разрешите передавать встроенные функции как параметры

Post by iwantmorespam »

Воодушевленный функциональными возможностями ПаскальСкрипта в Стелсе, я написал себе модуль с вот такой функцией:

Code: Select all

function WaitUntil(msWorldSave, msTimeout: Integer; predicate: function():Boolean): Boolean;
var t, step: Integer;	
begin
	if CheckLag(msWorldSave) then
	begin
		t := 0;
		step := msTimeout / 10;
		Result := predicate();
		while (t < msTimeout) and (not Result) do
		begin
			Result := predicate();
			t := t + step;
			Wait(step);
		end;
	end;	
end;
Попытка использовать функцию вот так:

Code: Select all

WaitUntil(60 * 1000, 2000, @Dead);
не работает, поскольку Dead - встроенная функция Stealth API.
21:46:02:692 [Dragon World - ***]: Compiler: [Error] (_TEST.sc at 11:30): Unknown identifier 'Dead'
21:46:02:694 [Dragon World - ***]: Compiling failed

Если написать "свой Dead", все работает:

Code: Select all

function CharIsDead: Boolean;
begin
	Result := Dead;
end;

begin
	WaitUntil(60 * 1000, 2000, @CharIsDead);
end.
Отсюда делаю вывод, что встроенные функции стелс API не являются полноценными функциями ПаскальСкрипта.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Разрешите передавать встроенные функции как параметры

Post by Vizit0r »

вывод чуток неправильный - это паскальскрипт неполноценный :)

стелс 5.0 с полноценным паскалем:

1) step := msTimeout / 10; надо менять на step := msTimeout div 10;
2)

Code: Select all

Program New;
//uses UOBasic;

function WaitUntil(msWorldSave, msTimeout: Integer; predicate: function():Boolean): Boolean;
var t, step: Integer;   
begin
   if CheckLag(msWorldSave) then
   begin
      t := 0;
      step := msTimeout div 10;
      Result := predicate();
      while (t < msTimeout) and (not Result) do
      begin
         Result := predicate();
         t := t + step;
         Wait(step);
      end;
   end;   
end;

//var a: TProperty;
begin
WaitUntil(60 * 1000, 2000, @Dead);
//  a := TProperty.Create; 
 //Body of Script
end.
09:53:14:412 [Abyss_KR - Vizz test]: Compiling
09:53:14:739 [Abyss_KR - Vizz test]: Compiled succesfully
09:53:14:783 [Abyss_KR - Vizz test]: Script test11.sc stopped successfuly
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
iwantmorespam
Posts: 3
Joined: 13.01.2013 12:14

Re: Разрешите передавать встроенные функции как параметры

Post by iwantmorespam »

Ок, круто :)
Стелс 5.0 же еще не вышел? Когда планируется?

И еще я заметил, что нельзя передавать функцию глубже, если она уже пришла как параметр:

Code: Select all

function DrwWaitUntil(msWorldSave, msTimeout: Integer; predicate: function():Boolean): Boolean;
begin
   WaitUntil(MS_WORLD_SAVE, msTimeout, predicate);
end;
Это тоже будет работать?
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Разрешите передавать встроенные функции как параметры

Post by Vizit0r »

проверять не буду, но будет работать.

тестить стелс 5й можно уже сейчас, но до сих пор остается пара сложных моментов, из-за которых не идет в релиз. Например, нерабочая длл от клиента.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
BlackSpirit
Neophyte
Neophyte
Posts: 29
Joined: 20.10.2013 11:45

Re: Разрешите передавать встроенные функции как параметры

Post by BlackSpirit »

Vizit0r wrote:вывод чуток неправильный - это паскальскрипт неполноценный :)

стелс 5.0 с полноценным паскалем:

1) step := msTimeout / 10; надо менять на step := msTimeout div 10;
2)

Code: Select all

Program New;
//uses UOBasic;

function WaitUntil(msWorldSave, msTimeout: Integer; predicate: function():Boolean): Boolean;
var t, step: Integer;   
begin
   if CheckLag(msWorldSave) then
   begin
      t := 0;
      step := msTimeout div 10;
      Result := predicate();
      while (t < msTimeout) and (not Result) do
      begin
         Result := predicate();
         t := t + step;
         Wait(step);
      end;
   end;   
end;

//var a: TProperty;
begin
WaitUntil(60 * 1000, 2000, @Dead);
//  a := TProperty.Create; 
 //Body of Script
end.
09:53:14:412 [Abyss_KR - Vizz test]: Compiling
09:53:14:739 [Abyss_KR - Vizz test]: Compiled succesfully
09:53:14:783 [Abyss_KR - Vizz test]: Script test11.sc stopped successfuly
в Стелс 6.1.3 п. 2 не работает. Пишет
23:43:36:356 [Black Spirit]: Compiling
23:43:36:412 [Black Spirit]: Compiler: [Error] (C:\UO\Dragon World\Stealth\scripts\test3.sc at 23:29): Unknown identifier 'Dead'
23:43:36:418 [Black Spirit]: Compiling failed
23:43:36:423 [Black Spirit]: Script test3.sc stopped successfuly
Uus Wis
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Разрешите передавать встроенные функции как параметры

Post by Vizit0r »

ну, что я могу сделать. не работает и не работает. там внешние функции напрямую в "ядро" летят, миную обвязку, наверное поэтому.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Post Reply