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

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

Часто задаваемые вопросы
Post Reply
Acronym
Novice
Novice
Posts: 114
Joined: 10.05.2005 18:42
Location: Odessa, NDW
Contact:

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

Post 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 и если будет необходимость - менять только
его содержимое.
aka Trickster [YGG]
current version: 1.0 [RC3]
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post 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\
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Beren
Novice
Novice
Posts: 108
Joined: 08.09.2008 1:07

Post by Beren »

очень хорошо!
Сколько модулей, помню, на первом курсе написал. Жуть)
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

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

Post by Vizit0r »

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

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

пример -

Code: Select all

uses gump_auto_reply;
Скрипт полностью рабочий, по крайней мере на момент написания - июль 2011 года.
Attachments
gump_auto_reply.pas
(3.25 KiB) Downloaded 1012 times
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
gloomia
Neophyte
Neophyte
Posts: 10
Joined: 12.07.2011 7:58
Location: Киев
Contact:

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

Post by gloomia »

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

не постоянно, только один раз когда юнит подключается через uses
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

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

Post by Vizit0r »

gloomia wrote:
4) у модуля может быть свой блок begin-end, т.е. он может быть автономен и не обязательно вызвываться из основного скрипта (достаточно только подключить его к основному скрипту через uses)
Можно об этом подробнее? В смысле при подключении к основному скрипту тело модуля будет выполнятся? и если в нем вечный цикл - будет выполнятся постоянно?
если в блоке begin end. модуля будет вечный цикл - то он будет крутиться вечно, и до выполнения основного скрипта дело попросту не дойдет.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
gloomia
Neophyte
Neophyte
Posts: 10
Joined: 12.07.2011 7:58
Location: Киев
Contact:

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

Post by gloomia »

Все, понял. Спасибо за быстрый ответ.
jian
Neophyte
Neophyte
Posts: 14
Joined: 18.11.2011 7:08

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

Post by jian »

Путь до инклюдов можно переопределить? Пробовал создать ярлык "Scripts" в дир. со стелсом на нужную мне директорию со скриптами и инклюдами - не работает. Или как-то можно сделать симлинк/примонтировать директорию со скриптами в директорию со стелосом в win XP?
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

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

Post by CFA »

Инклюды ищутся в папке откуда был запущен скрипт, если там их нет, то в папке Scripts\Include в папке со стелсом.
jian
Neophyte
Neophyte
Posts: 14
Joined: 18.11.2011 7:08

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

Post by jian »

В директории со скриптами есть вложенная директория Include с инклюдами - они оттуда не подхватываются, пытается найти их в директории со стелсом.

Code: Select all

Error Include: File Not Exist
D:\home\Programs\UO_FW\Stealth\Scripts\Include\all.inc
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

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

Post by CFA »

Нет, сначала проверяется наличие инклюда непосредственно в папке со скриптом, а не в подпапке Include. А потом уже в Scripts\Include в папке со стелсом. Ярлыки не помогут. Виндовые junctions должны сработать (и возможно симлинки тоже).
jian
Neophyte
Neophyte
Posts: 14
Joined: 18.11.2011 7:08

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

Post by jian »

Симлинки на директорию (которые junction в XP) помогли. Если у кого возникнет подобный вопрос - в NTFS версий выше, чем та, что в WinXP, поддержка симлинков и хардлинков встроена. В XP хардлинки могут быть только на файлы, симлики - на директорию.
untoha
Novice
Novice
Posts: 51
Joined: 16.03.2013 17:21

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

Post 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'} ну малоли
- поиск на форуме

Может что изменилось за это время?!
Помогите плз.
спасибо создатель, я твой должник!
untoha
Novice
Novice
Posts: 51
Joined: 16.03.2013 17:21

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

Post by untoha »

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

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

пользуясь случаем хочу поблагодарить за стелс клиент и дайте кошелек или счет банковский, я люблю платить за то, что мне нравится. надеюсь деньги от ватника примете =)
спасибо создатель, я твой должник!
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

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

Post by Vizit0r »

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