Jump to content
DAYZ-CODE.RU - Создай свой игровой сервер

Принудительное использование синтаксиса скрипта / Enforce Script Syntax


Vostok
 Share

Go to solution Solved by Vostok,

Recommended Posts

  • Solution

Основы

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

Пример области действия

Please Log in or Register to see this: Spoiler

Вложенная область видимости

Please Log in or Register to see this: Spoiler

Заявления о сфере применения

Please Log in or Register to see this: Spoiler


Структура программы

Принудительный скрипт состоит из классов и функций. Весь код должен быть объявлен внутри функции.

Please Log in or Register to see this: Spoiler


Переменные

Переменные определяются по типу и имени.

Please Log in or Register to see this: Spoiler


Функции

Функции являются основной функцией скрипта Enforce. Объявление функции состоит из типа возвращаемого значения, имени функции и списка параметров.

  • Функции могут быть объявлены в глобальной области видимости или внутри объявления класса
  • Параметры функции фиксированы и типизированы (не могут быть изменены во время выполнения, без переменных параметров).
  • Функции могут быть перегружены
  • Ключевое слово "out" перед объявлением параметра гарантирует, что параметр передается по ссылке (таким образом, вы можете передавать более одного значения из функции, его можно использовать только в собственных функциях)
  • Скрипт Enforce поддерживает параметр по умолчанию
     
Please Log in or Register to see this: Spoiler


Комментарии

Please Log in or Register to see this: Spoiler


Константы

Константы похожи на переменные, но доступны только для чтения. Они объявляются с помощью ключевого слова const.

Please Log in or Register to see this: Spoiler


Операторы

Приоритет оператора: Приоритет операторов аналогичен языку C, подробнее.

Символ операции
Добавить / Add  +
Вычитать / Subtract   -
Умножать  / Multiply  *
Делить  / Divide  /
По модулю / Modulo  %

Assignments

Символ операции
Присвоить значение переменной / Assign value to variable  =
Увеличить переменную на значение / Increment variable by value  +=
Уменьшить переменную на значение / Decrement variable by value  -=
Умножить переменную на значение / Multiply variable by value  *=
Разделить переменную на значение / Divide variable by value  /=
Побитово-ИЛИ на значение / Bitwise-OR by value  |=
Побитово- И на значение & / Bitwise-AND by value  &=
Сдвигаем переменную влево по значению / Left-shift variable by value  <<=
Сдвигаем переменную вправо по значению / Right-shift variable by value  >>=
Увеличиваем переменную на 1 / Increment variable by 1  ++
Уменьшаем переменную на 1 / Decrement variable by 1  --

Относительный (условный)

Символ операции
Больше значения / More than value  >
Меньше значения / Less than value  <
Больше или равно значению / More or equal to the value  >=
Меньше или равно значению / Less or equal to the value  <=
Равно / Equal  ==
Не равно / Not equal  !=

Другие

Операторы категорий
Логические / Logical  &&, ||
Побитовые / Bitwise  &, |, ~, ^
Строка / String  +
Сдвиг / Shift  <<, >>
Присваивание / Assignment  =
Индексация  / Indexing  [ ]
Отрицание  / Negation  !

Переопределение скрипта

Оператор Index
Переопределение оператора index может быть достигнуто с помощью методов Set и Get. Вы можете использовать любое количество перегрузок, при условии, что в типах нет неоднозначности.

Please Log in or Register to see this: Spoiler

Примечание: Если вы хотите присвоить предварительно обработанному вектору значение instance[index] = "1 1 1", то установщик должен принять строку в качестве параметра _value и преобразовать ее явно с помощью _value.ToVector() перед присваиванием.

Ключевые слова

Модификаторы функций/методов

 

Please Log in or Register to see this: Code


Модификаторы переменных
 

Please Log in or Register to see this: Code


Модификаторы классов

Please Log in or Register to see this: Code


Другие ключевые слова

Please Log in or Register to see this: Code


Типы

Примитивные типы

Please Log in or Register to see this: Code


Струнные

  • Строки передаются по значению, как и примитивные типы
  • Их можно объединить с помощью оператора +
  • Строки инициализируются и уничтожаются автоматически
  • Строки могут содержать стандартные escape-последовательности. Поддерживаются следующие варианты: \n \r \t \\"
     
Please Log in or Register to see this: Spoiler


Векторы

  • Векторы передаются по значению, как примитивные типы
  • Значения векторов доступны с помощью оператора [, ], как статические массивы
  • Векторы инициализируются и уничтожаются автоматически
  • Вектор может быть инициализирован тремя числовыми значениями в двойных кавычках, например "10 22 13".
     
Please Log in or Register to see this: Spoiler


Объекты

Объекты в enforce script являются ссылками и передаются по ссылке
Все функции-члены и переменные по умолчанию являются общедоступными. Используйте ключевое слово 'private', чтобы сделать их
закрытыми, ключевое слово 'autoptr' перед объявлением объектной переменной гарантирует, что компилятор автоматически уничтожит объект при завершении области видимости (например, при завершении вызова функции).

Please Log in or Register to see this: Spoiler


Пример this & super:
 

Please Log in or Register to see this: Spoiler


Перечисления

Перечислители - это набор именованных константных идентификаторов.

  • перечисления имеют тип
  • int, значение enumitem может быть присвоено в определении, в противном случае оно вычисляется автоматически (предыдущее значение элемента плюс единица)
  • , перечисление может наследоваться от другого перечисления (значение элемента продолжается от последнего значения родительского элемента).
  • имя перечисления, используемое в качестве типа, ведет себя как обычный int (при назначении не проверяется значение перечисления)
     
Please Log in or Register to see this: Spoiler


Шаблоны

Скрипт Enforce Script имеет функцию шаблонирования, аналогичную шаблонам C++, которая позволяет классам работать с универсальными типами.

  • Объявление универсального типа помещается внутри операторов <, > (например, "class Template Class<class GenericType>" ) после идентификатора имени шаблонного класса.
  • Enforce Script поддерживает любое количество универсальных типов для каждого шаблонного класса
     
Please Log in or Register to see this: Spoiler


Массивы

Статические массивы

  • Массивы индексируются с 0
  • Массивы передаются по ссылке, как объекты
  • Статические массивы инициализируются и уничтожаются автоматически
  • Размер статических массивов можно задать только во время компиляции
  • Элементы доступны с помощью оператора доступа к массиву [ ]
     
Please Log in or Register to see this: Spoiler


Динамические массивы

  • Динамические массивы поддерживают изменение размера во время выполнения путем вставки/удаления элементов массива
  • Динамические массивы предоставляются через шаблонный класс 'array'
  • Динамические массивы передаются по ссылке
  • Динамические массивы являются объектами, и поэтому их необходимо создавать и уничтожать как объекты, поэтому не забудьте использовать "autoptr" или оператор удаления!
  • Элементы доступны с помощью функции "Get" или оператора доступа к массиву [ ]
  • Для массивов примитивных типов уже определены определения типов:
Please Log in or Register to see this: Code

 

Please Log in or Register to see this: Spoiler


Автоматическое определение типа

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

Please Log in or Register to see this: Spoiler


Управляющие структуры

Управляющие структуры работают очень похоже на языки C# или C/C++.

Условные структуры
Оператор If

Please Log in or Register to see this: Spoiler


Оператор Switch

Оператор Switch поддерживает переключение с помощью чисел, констант и строк.

Please Log in or Register to see this: Spoiler


Итерационные структуры
Для
Цикл for состоит из трех частей: объявления, условия и приращения.

Please Log in or Register to see this: Spoiler


Инструкция foreach

Более простая и удобная версия for loop.

Please Log in or Register to see this: Spoiler


Пока
 

Please Log in or Register to see this: Spoiler


Особенности объектно-ориентированного программирования

  • По умолчанию все функции-члены и переменные являются общедоступными. Для управления доступом можно использовать ключевое слово "private" или "protected"
  • Функции-члены класса являются виртуальными и могут быть переопределены дочерним классом
  • Используйте ключевое слово override для переопределения методов базового класса (чтобы избежать случайного переопределения)
  • Класс может наследоваться от одного родительского класса, используя ключевое слово "extends"
  • Объекты не инициализируются и не уничтожаются автоматически, используйте "new" и "delete" (или функцию "autoptr").
  • При создании переменные класса сбрасываются до значений по умолчанию


Наследование

Please Log in or Register to see this: Spoiler

Конструктор и деструктор

Конструктор и деструктор - это специальные функции-члены

  • У каждого класса может быть один конструктор и один деструктор
  • Конструктор - это функция, вызываемая при создании объекта (с помощью 'new') и имеющая то же имя, что и класс (например, 'void className()').
  • Деструктор вызывается, когда объект должен быть уничтожен (с помощью 'delete'/'autoptr'), и имеет то же имя, что и класс, с символом тильды в начале (например, 'void ~className()')
  • Конструктор может иметь параметры инициализации, деструктор не может иметь никаких параметров
  • Как конструктор, так и деструктор не возвращают никакого значения (возвращает void)
  • Конструктор и деструктор вызываются даже при создании или уничтожении объекта из C++
  • Если конструктор не имеет никаких параметров, при использовании оператора 'new' скобки опускаются
     
Please Log in or Register to see this: Spoiler


Безопасность управляемых классов и указателей

  • Поскольку скрипт не выполняет автоматическую сборку мусора, все простые указатели считаются небезопасными
  • Все классы, унаследованные от управляемого класса, используют программные ссылки вместо простых указателей. Программная ссылка - это слабая ссылка, которая не поддерживает объект в рабочем состоянии и обнуляется при уничтожении, поэтому они никогда не становятся недействительными
  • Все объекты, доступные в игровом модуле, должны быть управляемыми, поэтому по умолчанию для них должны использоваться программные ссылки (все они наследуются от управляемого класса).
     
Please Log in or Register to see this: Spoiler


Автоматический подсчет ссылок

Enforce Script поддерживает автоматический подсчет ссылок. В целях обеспечения гибкости вы можете выбрать, следует или не следует управлять вашим классом, выбрав наследование от управляемого класса.
 

Простые классы, подобные C++, по-прежнему подходят для высокопроизводительных, но менее безопасных сценариев

  • объекты, на которые ссылаются простые указатели C
  • , не имеют автоматического управления памятью, владелец должен удалить их

Для обычных игровых скриптов/модов и т.д. существуют управляемые объекты, которые являются

  • немного медленнее (из-за косвенного доступа к объекту со слабым указателем)
  • внутренне пересчитываемые и автоматически удаляемые, когда ненужные
  • объекты, на которые ссылаются слабые указатели (указатель всегда действителен или равен нулю, никогда не указывает на удаленную память и т.д.)

Сильные и слабые ссылки

  • сильная ссылка увеличивает количество ссылок - сохраняет объект живым
  • , слабая ссылка просто указывает на объект, но не увеличивает количество ссылок
     
Please Log in or Register to see this: Spoiler

В приведенном выше коде в конце функции main объект "a" имеет нулевые строгие ссылки, поэтому удаляется, деструктор освобождает m_child, и поэтому объект "b" также имеет нулевые строгие ссылки и удаляется.

Использование ключевого слова ref
В скрипте Enforce по умолчанию все переменные являются слабыми ссылками, ключевое слово ref указывает, что переменная является сильной ссылкой. В некоторых особых случаях переменные по умолчанию являются сильными ссылками

  • локальные переменные внутри
  • функций возвращают
  • значение
  • и освобождаются после завершения их области видимости.

Пока объект хранится по крайней мере в одной строгой ссылке, он остается активным. Когда последняя строгая ссылка уничтожается или перезаписывается, объект уничтожается, а все остальные ссылки (остаются только слабые ссылки) обнуляются. Когда объект удаляется вручную с помощью команды delete (например, 'delete a;'), он удаляется немедленно, игнорируя количество ссылок, и все ссылки (слабые и сильные) устанавливаются в NULL.


Оптимальное использование ссылок в скрипте Enforce заключается в том, чтобы на каждый объект была ровно одна строгая ссылка, помещаемая в объект "владелец", который его создает. Такой способ использования обеспечивает

  • отсутствие циклических ссылок
  • на правильный порядок уничтожения объекта - объект уничтожается при уничтожении его "создателя".

Примеры:

Please Log in or Register to see this: Spoiler


Моддинг

Модифицированный класс
Модифицированный класс используется для встраивания унаследованного класса в иерархию классов без изменения других скриптов, что требуется для правильного моддинга:

  • Модифицированный класс ведет себя как класс, унаследованный от исходного класса (вы можете использовать super для доступа к исходному классу).
  • Когда объявляется модифицированный класс, его экземпляры будут создаваться вместо исходного класса повсюду в скрипте
  • Когда несколько модифицированных классов модифицируют один и тот же класс vanilla, следующий модифицированный класс будет наследовать последний модифицированный класс, что обеспечивает совместимость с модами
     
Please Log in or Register to see this: Spoiler

Измененные константы

  • Константы могут быть переопределены при компиляции последним загруженным модом (обратите внимание на порядок загрузки модов)
  • Позволяет нескольким модам изменять разные константы в одном классе
     
Please Log in or Register to see this: Spoiler


Модифицированные закрытые члены

  • Несмотря на то, что модифицированный класс ведет себя так же, как унаследованный, он все равно может обращаться к закрытым членам класса vanilla
     
Please Log in or Register to see this: Spoiler

 

  • Like 1
  • Thanks 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...