Весь код расположенный в библиотеке, будет перенесен в самый верх файла war3map.j, сразу после объявления глобальных переменных globals/endglobals, это даже выше Custom Script карты. Например, мы можем написать библиотеку, в которой будут необходимые нам функции, такие как вычисление координат X и Y с полярным смещением, поместить ее в триггер, там где это будет удобно нам и обращаться к ним из любого места, даже из Custom Script карты.
Объявляются библиотеки следующим образом:
library Name
<Здесь располагаются наши функции и переменные>
endlibrary
Ссылки между библиотеками
Одни библиотеки, могут ссылаться на другие библиотеки.
Предположим, что у нас есть несколько библиотек и функции внутри одной библиотеки А будут использовать функции, которые находятся внутри другой библиотеки B. Однако, как нам быть уверенными, что функции библиотеки B располагаются выше функций библиотеки A? Для этого используется ключевое слово uses
library A uses B
<Функции библиотеки А>
endlibrary
library B
<Функции библиотеки B>
endlibrary
Таким образом, независимо от расположения библиотеки A относительно библиотек B, JassHelper автоматически перенесет весь код внутри библиотеки B выше кода внутри библиотеки A.
А в случае, если библиотека должна ссылаться на несколько библиотек, их достаточно перечислить через запятую.
library A uses B, C, D, F
<Функции библиотеки А>
endlibrary
А также, кроме ключевого слова uses, можно воспользоваться словами needs или requires. На свой вкус.
Приватные конструкции
Библиотеки дают возможность объявлять приватные конструкции.
Предположим, мы написали какую-нибудь систему или способность для импорта в чужую карту. Однако, как мы можем быть уверены, что имена функций и переменных внутри библиотеки не совпадут с именами других функций или переменных используемых в карте? Вот тут нам на помощь приходят приватные конструкции, благодаря которым, имена функций и переменных не видно за пределами библиотеки, в которой используются.
Осуществляется это посредством ключевого слова private, которое нужно указывать перед объявлением функций или переменных.
Например:
library A
globals
private integer Time = 0
endglobals
private function MyPivateFunc takes nothing returns nothing
endfunction
function MyFunc takes nothing returns nothing
endfunction
endlibrary
Здесь мы написали библиотеку с именем A, которая содержит переменную целочисленного типа Time и две функции MyPivateFunc и MyFunc.
Так как переменная Time и функция MyPivateFunc отмечены ключевым словом private, к ним невозможно получить доступ откуда либо, кроме библиотеки A. А вот функция MyFunc не была объявлена приватной, то есть ее можно вызвать извне библиотеки A.
Публичные конструкции
Библиотеки дают возможность объявлять публичные конструкции.
По большому счету, это тоже самое что и приватные конструкции. Объявив переменную или функцию публичной, мы не можем обратится к ней извне библиотеки напрямую, однако можем это сделать, добавив в качестве префикса к ее имени имя библиотеки и следом символ подчеркивания.
Например:
library A
globals
private integer Time = 0
endglobals
public function MyPublicFunc takes nothing returns nothing
endfunction
function MyFunc takes nothing returns nothing
endfunction
endlibrary
Здесь переменная Time объявлена приватной и мы не можем к ней обратится никак извне библиотеки. Функция MyPublicFunc объявлена публичной, что дает нам возможность обратится к ней извне библиотеки, однако для этого нам придется добавить к ее имени префикс, состоящий из имени библиотеки и символа подчеркивания:
call A_MyPublicFunc()
Ну а функция MyFunc доступна извне библиотеки, как самая обычная функция.
Самоинициализация библиотек
Предположим, у нас есть необходимость, при инициализации карты создать какие-либо объекты, которые использует наша библиотека. Это могут быть юниты , эффекты, триггер и т.д. Однако как это, сделать не захламляя триггер инициализации карты? Очень просто! Достаточно создать внутри библиотеки функцию, которая будет производить нужные нам действия, а ее имя указать после объявления имени библиотеки, используя ключевое слово initializer.
Например:
library A initializer Init_A
function Init_A takes nothing returns nothing
call CreateUnit(Player(0), 'h000', 0.00, 0.00, 270.00)
endfunction
endlibrary
Здесь, в момент инициализации карты, будет создан юнит с рав-кодом 'h000' в центре карты, под командованием красного игрока и направлением взгляда на 270 градусов, то бишь "лицом к игроку".
Области scope
Внутри библиотек можно объявлять области scope/endscope, однако внутри библиотек нельзя объявлять другие библиотеки. Фича весьма бесполезная, на мой взгляд. Внутри областей также можно объявлять другие области.
Области объявляются словами scope/endscope, а так же могут содержать приватные конструкции.
В отличии от библиотек, области остаются на том месте, где были объявлены. Они не будут перенесены в начало war3map.j
Например:
scope A
globals
private integer Time = 0
endglobals
function MyFunc takes nothing returns nothing
endfunction
endscope
|