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
Я добавил в каждую процедуру проверку в журнал, все отстреливает, но на выходе получаю сл. картину.