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

Приоритет

тут можно задать вопрос по скриптингу
Venom
Novice
Novice
Posts: 123
Joined: 25.08.2010 14:00

Приоритет

Post 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.
По отдельности процедура работает, вставляю её в скрипт - не работает (скрипт запускается, ошибок не выдает, но действия, которые заложены в вышеуказанной процедуре - не происходят). В чем может быть проблема ?
Fenix
Developer
Developer
Posts: 275
Joined: 24.08.2010 7:20
Location: Ставрополь
Contact:

Post by Fenix »

1. Вызов процедур выполняет в строгом порядке. Как ты их расположил так они и выполнятся. Исключения появляются при использовании операторов циклов, ветвлений, вызовов и переходов.
2. Хз, возможно нужно проверять по имени контейнера. Кстати, ID у каждого предмета индивидуален (на то он и идентификатор), одинаковыми у трупов могут являться типы.
3. Проблем может быть уйма (иногда даже в ДНК). Ты лучше напиши код метода и код скрипта, в котором ты его используешь.
Venom
Novice
Novice
Posts: 123
Joined: 25.08.2010 14:00

Post 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", но так как никогда не использовал такого, то ....

Хелп плс.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

начни с GetName
если не поможет - пробуй GetCliloc.

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


но начинать всегда надо с простого :)
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Venom
Novice
Novice
Posts: 123
Joined: 25.08.2010 14:00

Post 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
..
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

да просто проверь сначала с выводом в сисжурнал.

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

что за привычка все усложнять.
проверь сначала, потом в код пихай.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Venom
Novice
Novice
Posts: 123
Joined: 25.08.2010 14:00

Post 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.
Хелп, не допру, что нужно ставить вместо "???"
И, возможно еще наблюдаются ошибки ?
MuDaCk
Apprentice
Apprentice
Posts: 393
Joined: 10.10.2006 0:03
Contact:

Post by MuDaCk »

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

Code: Select all

if GetName(finditem) =  ('Corpse of '+GetName(self)) then
только немного доработаней в плане косметики.
My name is Игорёшка Image
Пишу скрипты за едуImage
Venom
Novice
Novice
Posts: 123
Joined: 25.08.2010 14:00

Post 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) - не срабатывает.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

поздравляю, ты так ничего и не понял...перечитывать мое прошлое сообщение до осознания.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
MuDaCk
Apprentice
Apprentice
Posts: 393
Joined: 10.10.2006 0:03
Contact:

Post by MuDaCk »

в твоём скрипте две строки надо объединить в одну:

Code: Select all

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

Code: Select all

AddToSysTemJournal ('Обнаружен: '+GetCliloc(finditem));
Я бы сделал так и попробовал:)
My name is Игорёшка Image
Пишу скрипты за едуImage
Fenix
Developer
Developer
Posts: 275
Joined: 24.08.2010 7:20
Location: Ставрополь
Contact:

Post by Fenix »

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

Code: Select all

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

Post by Vizit0r »

вечный цикл без задержек = адское зло :)
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
MuDaCk
Apprentice
Apprentice
Posts: 393
Joined: 10.10.2006 0:03
Contact:

Post by MuDaCk »

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

Code: Select all

BEGIN 
 while true do 
  begin 
  If not(isDead(self)) then CheckGhost; 
else
 WAIT(5000);
  end; 
END.
My name is Игорёшка Image
Пишу скрипты за едуImage
Venom
Novice
Novice
Posts: 123
Joined: 25.08.2010 14:00

Post 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

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