Page 1 of 1

FAQ по инклюдам\uses

Posted: 04.02.2008 13:53
by Acronym
FAQ по инклюдам.
--------------------------------------------------------------------------------

Что такое includes?

Код некоторых, часто вызываемых, процедур можно вынести за пределы основного кода скрипта поместив процедуру в файл с расширением *.inc в папке Stealth\Scripts\Include
Этот файл *.inc и называется инклюдом. Возможность их использования появилась начиная с Stealth v0.85 beta.

У меня там, в папке Stealth\Scripts\Include уже есть какие то файлы *.inc, что это?

Это стандартизированные общие инклюды, поставляемые вместе со Стелсом и написаные ранее Миралексом и другими игроками.
Список подобных инклюдов, а так же других инклюдов, не входящих в стандартный пакет, но тем не менее могущих оказаться полезными можно найти здесь: http://stealth.od.ua/forum/viewtopic.php?t=152

Как оно работает?

В самом скрипте, после описания переменных пишем {$Include 'путь+имя файла'}
Имя файла определяется по следующему алгоритму:
- Если полный путь, то загружаем файл по полному пути;
- Если относительный путь, то ищем файл относительно папки, откуда запущен скрипт или (если нету) - относительно папки Stealth\Scripts\Include
Иными словами если инклюд находится в папке Include то достаточно будет только имени файла.
Все, теперь мы можем в скрипте вызывать процедуру, содержащуюся в инклюде, с необходимыми нам параметрами.

Так надо вызывать каждый инклюд?

Нет, можно вызывать сразу несколько инклюдов. Чаще всего именно так и делают.
В самом скрипте, после описания переменных и т.п. мы пишем

Code: Select all

 
{$Include 'all.inc'}

Тем самым мы инициируем возможность вызова(использования) процедур из инклюдов включенных в файле all.inc
Если открыть all.inc то можно увидеть эти инклюды:

Code: Select all

{$Include 'checksave.inc'} 
{$Include 'hungry.inc'} 
{$Include 'checktargeterror.inc'} 
{$Include 'WaitConnection.inc'} 
{$Include 'stack.inc'}


То есть мы вызываем только один {$Include 'all.inc'}, а можем использовать все инклюды содержащиеся в нем.

У меня проблема с инклюдом hungry.inc, запустил скрипт и выдает ошибку.

Инклюдов hungry.inc, отвечающих за питание чара два вида, с разными процедурами:
- Hungry(NeededLevel : Integer; Container : Cardinal);
Здесь необходимо указать минимальную степень голодности и место где искать еду(backpack, ground или какой-нибудь контейнер);
Hungry(1,ground);
Hungry(1,backpack);

- Hungry(NeededLevel : Integer);
Эта процедура более автономна, необходимо только указать минимальную степень голодности, а место где искать еду она будет искать сама, сначала на земле, а потом в паке.
Hungry(1);

В общих стандартизированных инклюдах поставляемых вместе со Стелсом в последних версиях используется вторая процедура, она появилась позднее и почти все ранние скрипты написаны с использованием первой, особенности которой указаны выше. Я бы посоветовал инклюд не менять, а изменить параметр процедуры в скрипте, приведя его в соответствие с инклюдом.

Могу ли я сделать собственный инклюд?

Да! Пишете процедуру, сохраняете ее как your_name.inc, кидаете
в папку Stealth\Scripts\Include и можете ее использовать, отдельно или пакетно, предварительно включив ее в all.inc

Если вы считаете, что написанная процедура может пригодиться остальным пользователеям, то можно ее опубликовать здесь:
http://stealth.od.ua/forum/viewtopic.php?t=152
Естественно, с описанием того что она делает и с примером использования.

Зачем нужны includes?

Ну, как минимум для удобства чтения кода скрипта.
Нет необходимости делать изменения во всех скриптах, если можно вынести процедуру в include и если будет необходимость - менять только
его содержимое.

Posted: 03.05.2011 21:34
by Vizit0r
растем, развиваемся.
инклюды уже не в моде, в моде использовать uses.

суть та же - подхват процедур из внешнего файла.

отличия:
1) чуток иной формат файла - теперь полностью паскаль-формат
2) множественного включения в скрипт одного и того же файла не будет - контроль на низком уровне паскальскриптом.
3) используется родной для паскальскрипта оператор, а не самописный инклюд-модуль.


пример работы:

основной скрипт:

Code: Select all

program test; 
uses Unit1;

BEGIN
AddToSystemJournal(MergeStrings('Hello', 'World!'));
END.
файл Unit1.pas

Code: Select all

unit Unit1;
 
interface

function MergeStrings(S1: string; S2: string): string;
 
implementation
 
function MergeStrings(S1: string; S2: string): string;
begin
Result := S1 + ' ' + S2;
end;

end.
Тонкости:
1) uses Unit1; - расширение тут НЕ пишется. может использоваться как файл без расширения, так и с расширением .pas. расширение ".sc" не использовал сознательно, потому что это полноценные паскальные файлы, а не скриптовые модули.
2) при множественном uses, например
основной скрипт:

Code: Select all

program test; 
uses Unit1,Unit2;

BEGIN
AddToSystemJournal(MergeStrings('Hello', 'World!'));
END.

Code: Select all

unit Unit1;

uses Unit2;
 
interface

function MergeStrings(S1: string; S2: string): string;
 
implementation
 
function MergeStrings(S1: string; S2: string): string;
begin
Result := S1 + ' ' + S2;
end;

end.
unit2 будет включен только один раз. для сравнения - при использовании инклюда содержимое файла вставилось бы в скрипт 2 раза и получилась бы ошибка.

3) имя файла(без расширения) и заголовок юнита - первая строка (unit Unit1;) должны совпадать .

Юниты могут лежать:
1) папка с основным скриптом
2) папка_стелса\Scripts\Uses\

Posted: 03.05.2011 23:09
by Beren
очень хорошо!
Сколько модулей, помню, на первом курсе написал. Жуть)

Re: FAQ по инклюдам\uses

Posted: 08.07.2011 1:46
by Vizit0r
вдохновленный примером alex'а (http://www.stealth.od.ua/forum/viewtopic.php?f=1&t=1768)
сделал модуль по преодолению анти-макрос-гампа на одном шарде.

все, что для работы модуля надо - это в основном скрипте включить его в блок uses. все. дальше модуль моментально сам обработает входящий гамп, выдаст сообщения в сисжурнал - пользователю делать ничего не надо.

пример -

Code: Select all

uses gump_auto_reply;
Скрипт полностью рабочий, по крайней мере на момент написания - июль 2011 года.

Re: FAQ по инклюдам\uses

Posted: 12.07.2011 8:04
by gloomia
4) у модуля может быть свой блок begin-end, т.е. он может быть автономен и не обязательно вызвываться из основного скрипта (достаточно только подключить его к основному скрипту через uses)
Можно об этом подробнее? В смысле при подключении к основному скрипту тело модуля будет выполнятся? и если в нем вечный цикл - будет выполнятся постоянно?

не постоянно, только один раз когда юнит подключается через uses

Re: FAQ по инклюдам\uses

Posted: 12.07.2011 9:56
by Vizit0r
gloomia wrote:
4) у модуля может быть свой блок begin-end, т.е. он может быть автономен и не обязательно вызвываться из основного скрипта (достаточно только подключить его к основному скрипту через uses)
Можно об этом подробнее? В смысле при подключении к основному скрипту тело модуля будет выполнятся? и если в нем вечный цикл - будет выполнятся постоянно?
если в блоке begin end. модуля будет вечный цикл - то он будет крутиться вечно, и до выполнения основного скрипта дело попросту не дойдет.

Re: FAQ по инклюдам\uses

Posted: 13.07.2011 7:57
by gloomia
Все, понял. Спасибо за быстрый ответ.

Re: FAQ по инклюдам\uses

Posted: 24.11.2011 10:49
by jian
Путь до инклюдов можно переопределить? Пробовал создать ярлык "Scripts" в дир. со стелсом на нужную мне директорию со скриптами и инклюдами - не работает. Или как-то можно сделать симлинк/примонтировать директорию со скриптами в директорию со стелосом в win XP?

Re: FAQ по инклюдам\uses

Posted: 24.11.2011 12:13
by CFA
Инклюды ищутся в папке откуда был запущен скрипт, если там их нет, то в папке Scripts\Include в папке со стелсом.

Re: FAQ по инклюдам\uses

Posted: 24.11.2011 12:58
by jian
В директории со скриптами есть вложенная директория Include с инклюдами - они оттуда не подхватываются, пытается найти их в директории со стелсом.

Code: Select all

Error Include: File Not Exist
D:\home\Programs\UO_FW\Stealth\Scripts\Include\all.inc

Re: FAQ по инклюдам\uses

Posted: 24.11.2011 13:07
by CFA
Нет, сначала проверяется наличие инклюда непосредственно в папке со скриптом, а не в подпапке Include. А потом уже в Scripts\Include в папке со стелсом. Ярлыки не помогут. Виндовые junctions должны сработать (и возможно симлинки тоже).

Re: FAQ по инклюдам\uses

Posted: 25.11.2011 15:27
by jian
Симлинки на директорию (которые junction в XP) помогли. Если у кого возникнет подобный вопрос - в NTFS версий выше, чем та, что в WinXP, поддержка симлинков и хардлинков встроена. В XP хардлинки могут быть только на файлы, симлики - на директорию.

Re: FAQ по инклюдам\uses

Posted: 19.04.2015 10:05
by untoha
Доброго времени суток!

проблема:
Include\uses file - 'file_name.inc'; - not found!
Script file_name.sc stopped successfuly

использовал стел 2-3 года назад, очень все нравилось куча функций. вернулся в уо спустя это время, стел обновился с 4блабла до 6.5.2 и старые скрипты не инклюдят ничего, хотя раньше работали как часы.

что пробовал:
- писал прямой путь
- копировал .inc фалы во все папки, малоли откуда может тянутся файл
- шаманил в настройках с Include&Uses Path
- {$Include 'all.inc'} ну малоли
- поиск на форуме

Может что изменилось за это время?!
Помогите плз.

Re: FAQ по инклюдам\uses

Posted: 19.04.2015 10:40
by untoha
интересная штука, старые иклюды были {$Include 'filename.inc';} и они раньше работали 100% у меня куча ботов шарилась по серверу.
без точки с запятой ; {$Include 'filename.inc'} теперь инклюдится нормально.

не хорошо товарищи разработчики) заставили гемороится.

пользуясь случаем хочу поблагодарить за стелс клиент и дайте кошелек или счет банковский, я люблю платить за то, что мне нравится. надеюсь деньги от ватника примете =)

Re: FAQ по инклюдам\uses

Posted: 19.04.2015 11:21
by Vizit0r
деньги не принимаем, кошельков нет, заводить лень.
ну а инклюды теперь подхватываются встроенным ПСным механизмом, я туда лезть точно не буду - работает оно всяко правильнее и надежнее, чем прежнее самописное.
А точки с запятой - то такое, ты вот первый о таком сообщил.