Page 1 of 2

Приоритет

Posted: 22.09.2010 11:13
by Venom
Подскажите пожалуйста,
Вопрос №1
есть ли в скриптах приоритеты на выполнение процедур ?
Как пример:

Code: Select all

[size=9]program xxx;
...
procedure Heal;
begin
....
end;

procedure CheckFriend;
begin
....
end;

procedure Checkequip;
begin
....
end;

Begin
while true do
  begin
If not(isDead(self)) then Heal;
If not(isDead(self)) then CheckFriend;
If not(isDead(self)) then Checkequip;[/size]
Каким образом расставляются приоритеты ?
В порядке указанном в скрипте или существуют
какие-либо внутренние условия ?

Вопрос №2.
Можно ли каким то образом определить свой труп,
если ИД всех трупов - одинаковый ?

Вопрос №3.
По отдельности процедура работает, вставляю её в скрипт - не работает (скрипт запускается, ошибок не выдает, но действия, которые заложены в вышеуказанной процедуре - не происходят). В чем может быть проблема ?

Posted: 22.09.2010 11:54
by Fenix
1. Вызов процедур выполняет в строгом порядке. Как ты их расположил так они и выполнятся. Исключения появляются при использовании операторов циклов, ветвлений, вызовов и переходов.
2. Хз, возможно нужно проверять по имени контейнера. Кстати, ID у каждого предмета индивидуален (на то он и идентификатор), одинаковыми у трупов могут являться типы.
3. Проблем может быть уйма (иногда даже в ДНК). Ты лучше напиши код метода и код скрипта, в котором ты его используешь.

Posted: 22.09.2010 13:03
by Venom
Fenix wrote: 2. Хз, возможно нужно проверять по имени контейнера. Кстати, ID у каждого предмета индивидуален (на то он и идентификатор), одинаковыми у трупов могут являться типы.
Верно, я некорректно написал, относительно ид.
Тип у всех одинаковый.
А не подскажете, каким образом можно сравнить
свое имя и имя трупа ?
Т.е., если мое имя = труп+мое имя,
то мы его, к примеру, лутим.

Code: Select all

[size=9]begin
      If FindType($2006, ground) <> 0 then
      begin
       AddToSystemJournal('Найден труп ' + IntToStr(finditem));
         Corpse := finditem;
         UseObject(Corpse);[/size]
.....

Вот набросок, его нужно откорректировать.
Но я не как не возьму в толк, как определить имя ?
Понимаю, что для этого нужно использовать функцию "Cliloc", но так как никогда не использовал такого, то ....

Хелп плс.

Posted: 22.09.2010 13:18
by Vizit0r
начни с GetName
если не поможет - пробуй GetCliloc.

а если и это не поможет - тогда кликай по трупу и лови сообщение в журнале, SenderID которого равен ID трупа.


но начинать всегда надо с простого :)

Posted: 22.09.2010 14:45
by Venom
Vizit0r wrote:начни с GetName
если не поможет - пробуй GetCliloc.

а если и это не поможет - тогда кликай по трупу и лови сообщение в журнале, SenderID которого равен ID трупа.


но начинать всегда надо с простого :)
Что то типа такого ?

Code: Select all

procedure CheckGhost; 
var 
  Corpse: Cardinal;
  GetName: String;

begin 
  If IsDead(self) then 
   begin 
If FindType($2006,ground) <> 0 then
begin 
Corpse := GetCliloc(Findtype($2006,ground)));
if GetName(self) = Corpse then begin
..

Posted: 22.09.2010 15:06
by Vizit0r
да просто проверь сначала с выводом в сисжурнал.

AddToSysTemJournal (GetName (ID));
и т.д.

что за привычка все усложнять.
проверь сначала, потом в код пихай.

Posted: 23.09.2010 16:17
by Venom

Code: Select all

program Ghost;
var
Corpse: Cardinal;

procedure CheckGhost; 

begin
FindDistance := 1; 
If FindType($2006,ground) <> 0 then
AddToSysTemJournal ('Обнаружен: '+GetName(finditem));
Corpse := finditem;
???? =  ('Corpse of '+GetName(self)) then
begin
UOSay('БУ');
end;

BEGIN 
 while true do 
  begin 
  If not(isDead(self)) then CheckGhost;
  end; 
END.
Хелп, не допру, что нужно ставить вместо "???"
И, возможно еще наблюдаются ошибки ?

Posted: 23.09.2010 17:28
by MuDaCk
Там где "????" должно быть слово "IF"
Подозреваю что строка должна выглядить так :

Code: Select all

if GetName(finditem) =  ('Corpse of '+GetName(self)) then
только немного доработаней в плане косметики.

Posted: 24.09.2010 14:45
by Venom
MuDaCK wrote:Там где "????" должно быть слово "IF"
Подозреваю что строка должна выглядить так :

Code: Select all

if GetName(finditem) =  ('Corpse of '+GetName(self)) then
только немного доработаней в плане косметики.

Code: Select all

program Ghost;
var
Corpse: Cardinal;

procedure CheckGhost; 

begin
FindDistance := 1; 
If FindType($2006,ground) <> 0 then
begin
Corpse := finditem;
GetCliloc(finditem);
AddToSysTemJournal ('Обнаружен: '+GetName(finditem));
if GetName(finditem) = ('Corpse of '+GetName(self)) then
begin
UOSay('БУ');
end
else AddToSystemJournal('Подранок не обнаружен. Ждём...'); wait(500); exit;
end;
end;

BEGIN 
 while true do 
  begin 
  If not(isDead(self)) then CheckGhost;
  end; 
END.

15:42:31.689 [ee]: Обнаружен: NoName
15:42:31.693 [ee]: Подранок не обнаружен. Ждём...

Т.е. труп находит, но GetCliloc(finditem) - не срабатывает.

Posted: 25.09.2010 7:48
by Vizit0r
поздравляю, ты так ничего и не понял...перечитывать мое прошлое сообщение до осознания.

Posted: 27.09.2010 20:39
by MuDaCk
в твоём скрипте две строки надо объединить в одну:

Code: Select all

GetCliloc(finditem); 
AddToSysTemJournal ('Обнаружен: '+GetName(finditem));
в

Code: Select all

AddToSysTemJournal ('Обнаружен: '+GetCliloc(finditem));
Я бы сделал так и попробовал:)

Posted: 28.09.2010 9:11
by Fenix
Получения клилока не совсем стандартно, т.к. информации по нему может в данный момент не быть. Так что я обычно использую это.

Code: Select all

CurName := GetCliloc(FindItem);
while CurName = '' do CurName := GetCliloc(FindItem);
AddToSysTemJournal ('Обнаружен: ' + CurName);
Проблемы могут возникнуть, если у объекта будет пустой клилок, но для таких вещей можно использовать ограничение на кол-во циклов. Плюс на случай лагов и прочего, чтобы не нагружать проц можно поставить в цикл ожидание на несколько милисекунд.

Posted: 28.09.2010 9:17
by Vizit0r
вечный цикл без задержек = адское зло :)

Posted: 28.09.2010 9:24
by MuDaCk
Кстати, ещё немешало бы добавить ещё коечто в скрипт:

Code: Select all

BEGIN 
 while true do 
  begin 
  If not(isDead(self)) then CheckGhost; 
else
 WAIT(5000);
  end; 
END.

Posted: 28.09.2010 13:23
by Venom
Ребята, подскажи, версия стелса может влиять на процесс ?
У меня 1.2 (v.1.0.9)
Я где то читал, что функция Clilcoc работает только на 3.5.


ЗЫ.
Еще вопрос,
что значит, когда скрипт оставливается сл. образом:
14:17:03.714 [22]: Scan
14:17:03.755 [22]: Hide
14:17:03.760 [22]: Heal
14:17:03.762 [22]: CheckFriend
14:17:03.783 [22]: Loot
14:17:03.788 [22]: Succesfully executed
14:17:03.791 [22]: Script ХХХ.sc stopped successfuly

Я добавил в каждую процедуру проверку в журнал, все отстреливает, но на выходе получаю сл. картину.